Professional Documents
Culture Documents
Lập Trình Ứng Dụng
Lập Trình Ứng Dụng
25/06/2023
1. TỔNG QUAN VỀ LẬP TRÌNH
Nhập a, b
Đúng Sai
a=0
Sai
b=0 Vô nghiệm x = -b/a
Đúng
Vô số nghiệm Nghiệm x
Kết thúc
2. NGÔN NGỮ LẬP TRÌNH C/C++
2.1. Lịch sử
2.2. Biên dịch
2.3. Cấu trúc chương trình C/C++
2.4. Tập tin thư viện
2. NGÔN NGỮ LẬP TRÌNH C/C++
2.1. Lịch sử
C được tạo ra bởi Dennis Ritchie ở Bell Telephone Laboratories vào năm
1972
Năm 1983, C được chuẩn hóa thành ANSI Standard C, American National
Standards Institute - ANSI
C++ được xây dựng trên nền tảng ANSI Standard C
C++ là ngôn ngữ lập trình hướng đối tượng, bao hàm cả ngôn ngữ C
2. NGÔN NGỮ LẬP TRÌNH C/C++
3.4 Ép kiểu
Dùng để ép kiểu của một biểu thức thành một
kiểu theo ý muốn
(type)expression hoặc type(expression)
Ví dụ: int y = 11;
x = (double)y/2;
x = y/(float)2;
x = (float)y/(float)2
3. BIỂU THỨC
3.4 Ép kiểu
Ví dụ:
float x;
x = 23/5; kết quả x = 4
x = (float)23/5;
x = 23/(float)5;
x = (float)23/(float)5;
x = float(23)/float(5);
4. KIỂU DỮ LIỆU TRONG C/C++
4.4 Từ khóa
Ví dụ: trích xuất các kiểu dữ liệu
#include <stdio.h>
int main() {
int a = 16;
printf("Size of variable a : %d\n",sizeof(a));
printf("Size of int data type : %d\n",sizeof(int));
printf("Size of char data type : %d\n",sizeof(char));
printf("Size of float data type : %d\n",sizeof(float));
printf("Size of double data type : %d\n",sizeof(double));
return 0;
}
5. BIẾN TRONG C/C++
5.1 Biến
5.2 Khai báo biến
5.3 Phạm vi
5.4 Hằng số
5. BIẾN TRONG C/C++
5.1 Biến
Biến là định danh của một vùng trong bộ nhớ
dung để lưu giữ một giá trị nào đó, có thể thay đổi
bởi chương trình
Mỗi biến trong C/C++ có một kiểu cụ thể, kích cỡ
và cách bố trí bộ nhớ của biến
Tất cả biến phải được khai báo trước khi sử dụng
5. BIẾN TRONG C/C++
5.3 Phạm vi
Biến cục bộ (local variables)
Khai báo bên trong một hàm
Chỉ được tham chiếu bởi lệnh trong khối có khai báo biến
Chỉ tồn tại trong khi khối đó đang thực thi và bị hủy khi khối đó thực thi xong
Ví dụ:
int functionABC() {
int a = 16;
a = a + 2;
return a;
}
5. BIẾN TRONG C/C++
5.3 Phạm vi
Tham số hình thức (formal parameters)
Nếu một hàm có nhận các đối số truyền vào hàm thì nó phải khai báo
các biến để nhận giá trị của các đối số khi hàm được gọi
Các biến này là tham số hình thức, được sử dụng như các biến cục bộ
Ví dụ:
int functionABC(int a, int b) {
int c = a + b*2;
return c;
}
5. BIẾN TRONG C/C++
5.3 Phạm vi
Biến toàn cục
Biến toàn cục có phạm vi trong toàn bộ chương trình
Tất cả các lệnh đều có thể tham chiếu đến biến toàn cục
Được khai báo bên ngoài tất cả các hàm
Ví dụ:
#include <iostream>
int a = 5, b = 10;
int functionABC(int a, int b) {
int c = a + b*2;
return c;
}
5. BIẾN TRONG C/C++
5.4 Hằng số
Biến không thay đổi trong chương trình
Ví dụ:
#include <iostream>
int R = 5;
const float pi = 3.14;
float functionABC(int R) {
float c = pi*R^2;
return c;
}
6. SỬ DỤNG HẰNG SỐ TRONG C/C++
6.1 Hằng
6.2 Hằng kiểu số
6.3 Hằng kiểu chuỗi
6.4 Define và Const
6. SỬ DỤNG HẰNG SỐ TRONG C/C++
6.1 Hằng
Hằng là giá trị cố định, không thay đổi, còn gọi
là literals.
Có thể là bất kì kiểu dữ liệu cơ bản nào.
6. SỬ DỤNG HẰNG SỐ TRONG C/C++
6.2 Hằng kiểu số
Số nguyên:
Có thể định nghĩa theo hệ thập phân (decimal), hệ bát phân
(octal-tiền tố 0), hệ thập lục phân (hexa- tiền tố 0x hoặc 0X).
Hậu tố U-unsigned, L-long
Ví dụ:
212: decimal -> 0-9
215u: decimal unsigned
047: octal <=> 100 111 -> 0-7
0xEF: hexa <=> 1110 1111 -> 0-9,A,B,C,D,E,F
6. SỬ DỤNG HẰNG SỐ TRONG C/C++
6.2 Hằng kiểu số
Số thực:
Phần nguyên
Dấu chấm thập phân
Phần lẻ
Phần mũ
Theo số thập phân:
Dấu chấm thập phân
Phần nguyên
Phần lẻ
Theo hàm mũ:
Phần nguyên
Dấu thập phân
Phần lẻ
Kí tự E hoặc e
6. SỬ DỤNG HẰNG SỐ TRONG C/C++
7.5 Toán tử ?
Là toán tử ba toán hạng
Dạng tổng quát:
Exp1 ? Exp2 : Exp3
Ý nghĩa:
Nếu Exp1 đúng thì Exp2 được tính toán và giá trị được gán cho
kết quả của biểu thức
Nếu Exp1 sai thì Exp3 được tính toán và giá trị được gán cho
kết quả của biểu thức.
Ví dụ: a = 2 > 5 ? 20 : 50; //a = 50
7. CÁC PHÉP TOÁN TRONG C/C++
7.6 Độ ưu tiên các toán tử
https://en.cppreference.com/w/cpp/language/o
perator_precedence
8. BÀI TẬP
8.1 Cài đặt phần mềm biên dịch C/C++
Bộ công cụ biên dịch C/C++ online:
https://www.onlinegdb.com/online_c++_compiler
C-Free: https://c-free.informer.com/download/
Khắc phục lỗi: https://www.youtube.com/watch?v=rdjIpPxLFIQ
Visual Studio Code - Code Editing. Redefined:
Cài đặt g++ theo hướng dẫn: https://www3.cs.stonybrook.edu/~alee/g++/g++.html
Hướng Dẫn Sử Dụng Visual Studio Code Lập Trình C/C++ - YouTube
C_Cpp_Runner: C Compiler Path: C:\mingw\bin\
Path trong System environment: \mingw\bin
Microsoft Visual Studio: https://visualstudio.microsoft.com/
8.2 Bài tập thực hành:
1. Viết chương trình hiển thị dòng chữ: “Hello world”
2. Viết chương tình tính toán: cạnh huyền của tam giác ABC vuông tại A với AB = 6cm và AC = 8cm.
3. Viết chương trình nhập số nguyên n và số thực x và tính giá trị của biểu thức: y = (x^3 + x^2 – 2*x + 1)^n.
4. Viết chương trình in ra bảng cửu chương của n với 0 < n < 10 nhập từ bàn phím.
5. Viết chương trình kiểm tra xem một số a có chia hết cho số b hay không? Với a và b được nhập từ bàn phím. Dùng toán tử “?” để giải
quyết bài toán.
LẬP TRÌNH ỨNG DỤNG TRONG KỸ THUẬT
TS. LÊ TRUNG DŨNG
BỘ MÔN KỸ THUẬT ROBOT VÀ HỆ THỐNG THÔNG MINH
ĐẠI HỌC THỦY LỢI
GIỚI THIỆU CHUNG
25/06/2023
1. CẤU TRÚC ĐIỀU KHIỂN
25/06/2023
1. CẤU TRÚC ĐIỀU KHIỂN
25/06/2023
1. CẤU TRÚC ĐIỀU KHIỂN
25/06/2023
1. CẤU TRÚC ĐIỀU KHIỂN
25/06/2023
2. CẤU TRÚC LỰA CHỌN
25/06/2023
2. CẤU TRÚC LỰA CHỌN
25/06/2023
2. CẤU TRÚC LỰA CHỌN
2.1. Cấu trúc if
Ví dụ:
1. #include <iostream>
2. using namespace std;
3. int main(){
4. int a,b,max;
5. cout << "Nhap a: ";
6. cin >> a;
7. cout<< "Nhap b: ";
8. cin >> b;
9. max = a;
10. if (a < b) max = b;// Neu a < b thi thuc hien gan max = b
11. cout << "So lon nhat la: " << max;
12. return 0;
13. }
25/06/2023
2. CẤU TRÚC LỰA CHỌN
25/06/2023
2. CẤU TRÚC LỰA CHỌN
25/06/2023
2. CẤU TRÚC LỰA CHỌN
25/06/2023
2. CẤU TRÚC LỰA CHỌN
25/06/2023
2. CẤU TRÚC LỰA CHỌN
2.3. Cấu trúc switch … case
Cấu trúc lựa chọn có nhiều nhánh, được sử dụng khi có nhiều lựa chọn
Cú pháp:
switch (expression){
case value1: statement1; break;
case value2: statement2; break;
…
case valueN: statementN; break;
default: statement; break;
}
25/06/2023
2. CẤU TRÚC LỰA CHỌN
2.3. Cấu trúc switch … case
Biểu thức (expression): phải có kết quả là giá trị nguyên
Mặc định (default): là thành phần không bắt buộc
Các giá trị sau case phải là hằng.
Khi biểu thức (expression) không thỏa mãn điều kiện nào thì chương
trình sẽ nhảy tới câu lệnh có nhãn default, nếu không có default thì
sẽ thoát khỏi switch.
Khi gặp câu lệnh break thì chương trình sẽ thoát khỏi switch
25/06/2023
2. CẤU TRÚC LỰA CHỌN
2.3. Cấu trúc switch … case
Ví dụ:
1. #include <iostream>
2. using namespace std;
3. int main(){
4. int n;
5. cout << "Nhap so nguyen:";
6. cin >> n;
7. switch (n){
8. case 1: cout << " So mot\n"; break;
9. case 2: cout << " So hai\n"; break;
10. case 3: cout << " So ba\n"; break;
11. case 4: cout << " So bon\n"; break;
12. default: cout << "So lon hon 4 hoac nho hon 1\n"; break;
13. }
14. return 0;
15. }
25/06/2023
3. CÂU LỆNH GOTO
Dùng để điều khiển tới một câu lệnh nào đó được chỉ định bởi nhãn.
Cú pháp:
1. goto label;
…
label: statement;
2. label: statement;
…
goto label;
25/06/2023
3. CÂU LỆNH GOTO
Ví dụ:
1. #include <iostream>
2. using namespace std;
3. int main(){
4. int n;
5. cout << "Nhap so nguyen: ";
6. cin >> n;
7. if (n == 0) goto saysomething;// saysomething is a label
8. else {
9. cout << "1/n= " << (float)1/n;
10. goto endOfProgram;
11. }
12. saysomething: cout << "n khong duoc phep bang 0";
13. endOfProgram:
14. return 0;
15. }
25/06/2023
4. BÀI TẬP
4.1 Bộ công cụ biên dịch C/C++ online:
https://www.onlinegdb.com/online_c++_compiler
4.2 Bài tập
1. Viết chương trình giải phương trình bậc hai:
a*x2 + b*x + c = 0
2. Viết chương trình nhập vào chiều dài 3 cạnh của tam giác. Kiểm tra xem độ
dài 3 cạnh tam giác vừa nhập tạo thành tam giác gì?
3. Viết chương trình xuất ra số ngày trong tháng.
4. Nhập vào số nguyên có 3 chữ số. Kiểm tra số đó có đúng là số có 3 chữ số
hay không. In ra cách đọc 3 chữ số đó.
5. Viết chương trình nhập vào một năm và tìm cách đọc năm đó theo can chi
(ví dụ Nhâm dần)
LẬP TRÌNH ỨNG DỤNG TRONG KỸ THUẬT
TS. LÊ TRUNG DŨNG
BỘ MÔN KỸ THUẬT ROBOT VÀ HỆ THỐNG THÔNG MINH
ĐẠI HỌC THỦY LỢI
GIỚI THIỆU CHUNG
25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE
25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE
1.1 Khái niệm
Cấu trúc lặp: lặp lại 1 hoặc nhiều lệnh cho đến khi biểu thức
điều kiện sai.
for
while
do … while
Ngoài việc thực thi luồng chạy của chương trình theo vòng
lặp, luồng chạy của chương trình cũng phụ thuộc vào các lệnh
nhảy như continue, break, goto.
25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE
25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE
1.2. Vòng lặp for
1. #include <iostream>
2. using namespace std;
3. int main() {
4. int n, sum = 0;
5. cout<<"Nhap so nguyen: ";
6. cin >> n;
7. for (int i = 0; i < n; i++){ // SUM = 1 + 2 + … + n
8. sum += i + 1; // sum = sum + (i+1);
9. }
10. cout << "Tong tu 1 den "<< n << " la: " << sum;
11. return 0;
12. }
25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE
25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE
25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE
1.3. Vòng lặp while
Ví dụ:
1. #include <iostream>
2. using namespace std;
3. int main()
4. { int i = 0, n, sum = 0;
5. cout<<"Nhap so nguyen: "; cin >> n;
6. while (i<n){
7. sum += i + 1;// sum = sum + i + 1
8. i++;
9. }
10. cout << "Tong tu 1 den "<< n << " la: " << sum;
11. return 0;
12. }
25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE
1.4. Vòng lặp do … while
Cú pháp
do {
statement1;
…}
while (expression)
Giải thích:
Các lệnh được thực thi
expression: biểu thức điều kiện
True: các lệnh tiếp tục được thực thi
False: thoát khỏi vòng lặp do … while
25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE
1.4. Vòng lặp do … while
Ví dụ
1. #include <iostream>
2. using namespace std;
3. int main()
4. { int i = 0, n, sum = 0;
5. cout<<"Nhap so nguyen: ";
6. cin >> n;
7. do {
8. sum += i + 1;
9. i++;
10. }
11. while (i<n);
12. cout << "Tong tu 1 den "<< n << " la: " << sum;
13. return 0;
14. }
25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE
25/06/2023
2. LỆNH RẼ NHÁNH VÀ NHẢY
25/06/2023
2. LỆNH RẼ NHÁNH VÀ NHẢY
25/06/2023
2. LỆNH RẼ NHÁNH VÀ NHẢY
25/06/2023
2. LỆNH RẼ NHÁNH VÀ NHẢY
25/06/2023
3. CẤU TRÚC VÒNG LẶP LỒNG NHAU
25/06/2023
3. CẤU TRÚC VÒNG LẶP LỒNG NHAU
25/06/2023
4. BÀI TẬP
25/06/2023
1. XÂY DỰNG VÀ SỬ DỤNG HÀM
25/06/2023
1. XÂY DỰNG VÀ SỬ DỤNG HÀM
25/06/2023
1. XÂY DỰNG VÀ SỬ DỤNG HÀM
1.3. Dạng tổng quát của hàm
Hàm do người dùng định nghĩa.
returnType functionName (parameterList){
// body
}
1. Kiểu dữ liệu trả về
1. bool, char, int, float, double,…: phải có câu lệnh return
2. void: Không cần return
2. Tên hàm
1. Phân biệt chữ hoa và thường
2. Không có khoảng trắng
3. Danh sách tham số
1. Tham số hình thức: kiểu dữ liệu + tên tham số
2. Ngăn cách bởi dấu phẩy
25/06/2023
1. XÂY DỰNG VÀ SỬ DỤNG HÀM
1.3. Dạng tổng quát của hàm
1. #include <iostream>
2. using namespace std;
3. const float pi = 3.14;
4. int R = 0;
5. float tinhChuViDuongTron(int R);
6. int main(){
7. cout<<"Nhap ban kinh duong tron: ";
8. cin >> R;
9. cout<<"Chu vi duong tron la:=" << tinhChuViDuongTron(R) << "\n";
10. return 0;
11. }
12. float tinhChuViDuongTron(int r){
13. float chuVi = 2*r*pi;
14. return chuVi;
15. }
25/06/2023
1. XÂY DỰNG VÀ SỬ DỤNG HÀM
25/06/2023
1. XÂY DỰNG VÀ SỬ DỤNG HÀM
25/06/2023
2. THAM SỐ CỦA HÀM
25/06/2023
2. THAM SỐ CỦA HÀM
25/06/2023
2. THAM SỐ CỦA HÀM
2.2 Truyền tham trị
Ví dụ:
#include <iostream>
using namespace std;
void change (int x){
x = x + 2;
}
int main(){
int y = 10;
cout << "Truoc khi goi ham: y = " << y <<endl;
change(y);
cout << "Sau khi goi ham: y = " << y <<endl;
return 0;
}
25/06/2023
2. THAM SỐ CỦA HÀM
25/06/2023
2. THAM SỐ CỦA HÀM
2.3 Truyền tham chiếu
#include <iostream>
using namespace std;
void change (int &x){
x = x + 2;
}
int main(){
int y = 10;
cout << "Truoc khi goi ham: y = " << y <<endl;
change(y);
cout << "Sau khi goi ham: y = " << y <<endl;
return 0;
}
25/06/2023
2. THAM SỐ CỦA HÀM
25/06/2023
3. KHAI BÁO HÀM
3.1 Khai báo hàm
Cách thông báo cho trình biên dịch biết về tên hàm và cách gọi hàm.
Phần thân hàm có thể định nghĩa một cách rời rạc.
Cú pháp:
returnType functionName (parameterList);
Ví dụ:
int tong2so(int a, int b);
int tong2so(int , int );
int daoGiaTri2so(int &a, int &b); // & địa chỉ của biến – truyền tham chiếu
int daoGiaTri2so(int &, int &);
25/06/2023
3. KHAI BÁO HÀM
25/06/2023
3. KHAI BÁO HÀM
25/06/2023
3. KHAI BÁO HÀM
3.3 Minh họa khai báo hàm
#include <iostream>
using namespace std;
int tong2so (int a, int b); // Khai báo hàm
int main(){
cout<<"tong 2 so 9 va 1 la " << tong2so(9,1);
return 0;
}
int tong2so(int a, int b){ // định nghĩa hàm
return a + b;
}
25/06/2023
3. KHAI BÁO HÀM
3.3 Minh họa khai báo hàm
#include <iostream>
using namespace std;
int tong2so (int , int );// khai báo hàm
int main(){
cout<<"tong 2 so 9 va 1 la " << tong2so(9,1);
return 0;
}
int tong2so(int a, int b){// định nghĩa hàm
return a + b;
}
25/06/2023
4. RETURN VÀ EXIT
4.1 return
4.2 exit
25/06/2023
4. RETURN VÀ EXIT
4.1 return
Lệnh return dùng để truyền dữ liệu cho nơi gọi hàm.
Hàm có giá trị trả về buộc phải có lệnh return.
Nếu hàm không có giá trị trả về, có thể hoặc không có
lệnh return.
25/06/2023
4. RETURN VÀ EXIT
4.1 return
Hàm có giá trị trả về:
Sau lệnh return là một biểu thức.
Khi thực thi câu lệnh return, chương trình thoát khỏi hàm và trả lại giá trị
biểu thức sau lệnh return.
Kiểu của biểu thức chính là kiểu trả về của hàm
Lệnh return có thể ở vị trí bất kì trong thân hàm
Có thể có nhiều câu lệnh return bên trong thân hàm.
25/06/2023
4. RETURN VÀ EXIT
4.2 exit
Dùng để thoát khỏi chương trình
Khi gọi hàm này, chương trình kết thúc ngay lập tức.
Cú pháp:
exit (int return_code)
Trong đó return_code thường có giá trị 0. Nếu là giá trị khác
không, thường là các giá trị để xác định một vài loại lỗi nào
đó.
25/06/2023
4. RETURN VÀ EXIT
4.2 exit
Ví dụ:
#include <iostream>
using namespace std;
int main(){
int n;
start: // label
cout << "Nhap so nguyen: ";
cin >> n;
if (n == 0) exit (0);
else {
cout << "1/" << n << " = " << (float)1/n << "\n";
goto start;
}
return 0;
}
25/06/2023
5. BÀI TẬP
1. Đệ quy
2. Mảng
3. Mảng nhiều chiều
4. Chuỗi
5. Mảng các chuỗi
25/06/2023
1. ĐỆ QUY
25/06/2023
1. ĐỆ QUY
25/06/2023
1. ĐỆ QUY
1.1. Hàm đệ quy trong C++
Ví dụ: n! = n*(n-1)*(n-2)*…*1
int giaiThua(int n){
int giaithua = 1;
for (int i = 1; i <=n; i++) giaithua = giaithua * i;
return giaithua;
}
25/06/2023
1. ĐỆ QUY
25/06/2023
1. ĐỆ QUY
25/06/2023
1. ĐỆ QUY
1.3. Đệ quy tuyến tính
Trong thân hàm có duy nhất một lời gọi hàm:
Cú pháp:
kieu tenHam(thamSo){
if (dieuKienDung) {
…
return giaTri;
}
else {
…
tenHam(thamSo)}
}
25/06/2023
1. ĐỆ QUY
1.3. Đệ quy tuyến tính
Ví dụ: S(n) = 0 + 1 + 2 + 3 + … + n = n + S(n-1)
S(0) = 0 => điều kiện dừng
S(n) = n + S(n-1)
int tong(int n){
if (n == 0) return 0;
else return (n + tong(n-1));
}
25/06/2023
1. ĐỆ QUY
1.4. Đệ quy nhị phân
Trong thân hàm có hai lời gọi hàm
Cú pháp:
kieu tenHam(thamSo){
if (dieuKienDung) {
…
return giaTri;
}
else {
…
tenHam(thamSo);
…
tenHam(thamSo);
…
}
}
25/06/2023
1. ĐỆ QUY
25/06/2023
2. MẢNG
2.1. Khái niệm
Mảng là một tập hợp nhiều phần tử có cùng kiểu giá trị và
chung một tên. Mỗi phần tử của mảng biểu diễn 1 giá trị.
Ví dụ: A = {1,2,3};
A[0] = 1;
A[1] = 2;
A[2] = 3;
25/06/2023
2. MẢNG
2.2. Khai báo mảng
kieu tenMang[soLuongPhanTu].
Ví dụ:
int A[10];
float B[20];
kieu tenMang[]
Ví dụ:
int C[];
float D[];
25/06/2023
2. MẢNG
25/06/2023
3. MẢNG NHIỀU CHIỀU
25/06/2023
3. MẢNG NHIỀU CHIỀU
25/06/2023
3. MẢNG NHIỀU CHIỀU
25/06/2023
3. MẢNG NHIỀU CHIỀU
3.2 Khai báo mảng nhiều chiều
Khởi tạo mảng hai chiều: khai báo + gán giá trị cho mảng
kieu tenMang[][N] = {
{value11,value12,…,value1N},
{value21,value22,…,value2N},
…
{valueM1,value12,…,valueMN}
};
Số phần tử trong mỗi hàng chính là số cột: N
Số hàng của phần khai báo để trống: M
Số hàng chính là số hàng trong phần khởi tạo. Mỗi hàng phân cách nhau bằng dấu phẩy.
25/06/2023
3. MẢNG NHIỀU CHIỀU
3.2 Khai báo mảng nhiều chiều
Ví dụ:
void main(){
int maTran1[2][3] = {1,2,3,4,5,6};// không khuyến khích
int maTran2[2][3] = {{1,2,3},{4,5,6}};
for (int i = 0; i<2; i++){
for (int j = 0; j<3;j++){
cout << maTran1[i][ j];
}
cout << “\n”;
}
}
25/06/2023
4. CHUỖI
25/06/2023
4. CHUỖI
25/06/2023
4. CHUỖI
25/06/2023
4. CHUỖI
25/06/2023
4. CHUỖI
4.3 Nhập chuỗi
Để nhập dữ liệu cho biến chuỗi, dùng hàm gets() trong thư viện
stdio.h
Ví dụ:
char s[10];
gets(s);
Giải thích:
Đọc các ký tự từ bàn phím vào trong mảng trỏ tới biến s cho tới khi
nhấn phím Enter.
Kí tự NULL được tự động thêm vào ở ký tự cuối cùng trong mảng.
25/06/2023
4. CHUỖI
25/06/2023
4. CHUỖI
25/06/2023
4. CHUỖI
4.4 Xuất chuỗi
Ví dụ:
void main(){
char chuoi1[25];
char *chuoi2;
chuoi2 = new char[50];
cout << "\nNhap chuoi 1: ";
gets(chuoi1);// stdio.h
cout << "\nHien thi chuoi 1: ";
puts(chuoi1);//stdio.h
cout << "\nNhap chuoi 2: ";
cin.getline(chuoi2,50);// iostream
cout << "\nHien thi chuoi 2: ";
cout << chuoi2;//iostream
return 0
}
25/06/2023
4. CHUỖI
4.5 Một số hàm thao tác trên chuỗi
Thư viện <cctype>
Sao chép n ký tự từ nguồn sang đích:<cstring>
strncpy(dich,nguon,soKyTu);
Nối chuỗi 2 vào cuối chuỗi 1: strcat(s1,s2);
Nối n ký tự của chuỗi 2 vào cuối chuỗi 1: strncat(s1,s2,n);
Tính độ dài của chuỗi: strlen(str);
Chuyển 1 ký tự thường thành hoa: toupper(ch);
Chuyển 1 ký tự hoa thành thường: tolower(ch);
25/06/2023
4. CHUỖI
4.5 Một số hàm thao tác trên chuỗi
So sánh 2 chuỗi theo nguyên tắc thứ tự từ điển.
strcmp(str1,str2): Có phân biệt chữ hoa và chữ thường.
strncmp(str1,str2,n): so sánh n ký tự đầu tiên
stricmp(str1,str2): không phân biệt chữ hoa, chữ thường.
strnicmp(str1,str2,n): so sánh n ký tự đầu tiên không phân biệt chữ hoa,
chữ thường.
Giá trị trả về:
0: bằng nhau
+ integer : s1 > s2
- integer: s1 < s2.
25/06/2023
5. MẢNG CHUỖI
25/06/2023
5. MẢNG CHUỖI
25/06/2023
5. MẢNG CÁC CHUỖI
5.2 Con trỏ đến các chuỗi
Ngoài cách dùng mảng ký tự hai chiều để lưu trữ mảng
chuỗi, có thể dùng mảng của các con trỏ.
Mỗi con trỏ sẽ chứa địa chỉ của chuỗi.
Ví dụ:
char *str [10]
char *listArray[] = {“Java”, “C/C++”, “Assembly”}
25/06/2023
5. MẢNG CHUỖI
5.2 Con trỏ đến các chuỗi
Ví dụ:
void main(){
char *str[5];
for (int i=0;i<5;i++) str[i] = new char[20];
for (int i=0;i<5;i++){
cout << “Input string ”<<i<<“:”;
gets(str[i]);
}
for (int i=0;i<5;i++){
cout << str[i]<<“\n”;
}
}
25/06/2023
6. BÀI TẬP
1. Viết chương trình nhập và xuất một mảng a với n phần tử là số nguyên.
Tính trung bình cộng các số dương và trung bình cộng các số âm trong mảng.
Nếu mảng không có số âm hoặc không có số dương thì thông báo ra màn hình.
2. Viết chương trình nhập và xuất hai mảng a và b với n phần tử là số nguyên
Gộp hai mảng a, b xen kẽ nhau thành mảng c và xuất mảng c ra màn hình
3. Viết chương trình nhập và xuất mảng a với n phần tử là số nguyên
Nếu mảng a có các phần tử trùng nhau thì xóa bớt, chỉ để lại một phần tử (đảm bảo các phần tử chỉ xuất hiện đúng 1 lần)
4. Viết chương trình nhập và xuất mảng a với n phần tử là số nguyên:
Xuất phần tử có giá trị gần với trung bình công của tất cả các phần tử trong mảng nhất.
5. Viết chương trình nhập vào một ma trận vuông NxN với các phần tử của ma trận được tạo ngẫu nhiên:
Xuất ma trận theo thứ tự tăng dần từ trái sang phải và từ trên xuống dưới.
6. Viết chương trình nhập vào một ma trận vuông NxN với các phần tử của ma trận được tạo ngẫu nhiên:
Tính tổng các phần tử dương trong ma trận
Tìm ra hàng có các phần tử đều là số âm.
7. Viết chương trình nhập vào một ma trận vuông NxN với các phần tử của ma trận được tạo ngẫu nhiên:
Xuất ra giá trị của phần tử có giá trị lớn nhất
In ra hàng và cột chứa phần tử có giá trị lớn nhất.
6. BÀI TẬP
8. Viết chương trình nhập vào một ma trận vuông NxN với các phần tử của ma trận được tạo ngẫu nhiên:
Xuất ra các phần tử A[i][ j], sao cho A[i][ j] là phần tử lớn nhất trong dòng i và nhỏ nhất trên cột j
Kiểm tra xem chuỗi thứ hai có nằm trong chuỗi thứ nhất hay không
1. Con trỏ
2. Thao tác trên con trỏ
3. Cấp phát bộ nhớ động
4. Con trỏ và mảng
5. Bài tập
25/06/2023
1. CON TRỎ
25/06/2023
1. CON TRỎ
25/06/2023
1. CON TRỎ
25/06/2023
1. CON TRỎ
25/06/2023
1. CON TRỎ
25/06/2023
1. CON TRỎ
25/06/2023
1. CON TRỎ
25/06/2023
2. CÁC THAO TÁC TRÊN CON TRỎ
25/06/2023
2. CÁC THAO TÁC TRÊN CON TRỎ
2.1. Lệnh gán con trỏ
Có thể dùng phép gán để gán giá trị của một con trỏ cho một
con trỏ khác có cùng kiểu:
Ví dụ:
int x = 10;
int *p1, *p2;
p1 = &x;
p2 = p1;// Cả hai p1 và p2 đều trỏ đến biến x
25/06/2023
2. CÁC THAO TÁC TRÊN CON TRỎ
25/06/2023
2. CÁC THAO TÁC TRÊN CON TRỎ
25/06/2023
2. CÁC THAO TÁC TRÊN CON TRỎ
2.2. Phép toán trên con trỏ
Ví dụ
#include <iostream.h>
#include <conio.h>
void main(){
int a = 30, b = 10, *pa, *pb, temp;
pa = &a; pb = &b;
temp = *pa;// temp = a = 30
*pa = *pb;// a = *pa = *pb = b = 10
*pb = temp; // b = *pb = 30
cout << “a:= ” << a << endl; // a =10
cout << “b:= ” << b << endl; // b =30
}
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG
3.1 Cấp phát bộ nhớ động
Kích thước bộ nhớ của biến, mảng và chuỗi không thể thay
đổi khi chương trình đang chạy.
Giải pháp bộ nhớ động: cấp phát bộ nhớ cần thiết khi
chương trình đang chạy.
Hai giải pháp:
C
C++
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG
2. int main(){
25/06/2023
4. CON TRỎ VÀ MẢNG
25/06/2023
4. CON TRỎ VÀ MẢNG
25/06/2023
4. CON TRỎ VÀ MẢNG
4.1 Con trỏ và mảng
Ví dụ:
1. int main(){
2. int numbers[5], *p;
3. p = numbers; *p = 1; // phan tu dau tien numbers[0]
4. p++; *p = 2; // phan tu thu hai numbers[1]
5. p = &numbers[2]; *p = 3; // phan tu thu ba numbers[2]
6. p = numbers + 3; *p = 4; // phan tu thu tu numbers[3]
7. p = numbers; *(p+4) = 5; // phan tu thu nam numbers[4]
8. for (int i = 0; i < 5; i++)
9. cout << numbers[i] << ", ";
10. return 0;
11. }
25/06/2023
4. CON TRỎ VÀ MẢNG
25/06/2023
4. CON TRỎ VÀ MẢNG
25/06/2023
LẬP TRÌNH ỨNG DỤNG TRONG KỸ THUẬT
TS. LÊ TRUNG DŨNG
BỘ MÔN KỸ THUẬT ROBOT VÀ HỆ THỐNG THÔNG MINH
ĐẠI HỌC THỦY LỢI
GIỚI THIỆU CHUNG
25/06/2023
1. KIỂU DỮ LIỆU CÓ CẤU TRÚC
25/06/2023
1. KIỂU DỮ LIỆU CÓ CẤU TRÚC
1.1. Khái niệm
Là một tập các biến được tham chiếu thông qua một tên
chung. Những biến tạo nên cấu trúc được gọi là các thành
viên (members).
So với mảng, các phần tử có cùng kiểu dữ liệu thì các phần
tử của kiểu cấu trúc có thể có kiểu dữ liệu khác nhau.
25/06/2023
1. KIỂU DỮ LIỆU CÓ CẤU TRÚC
1.2. Khai báo
struct structureName{
Trong đó
type1 member1;
structureName: tên của cấu trúc
type2 member2;
type: kiểu dữ liệu của thành viên
…
member1, …, memberN: tên các thành
typeN memberN; viên của cấu trúc
}; var1, var2, …, varM: tên các biến cấu trúc
struct structureName var1, var2, phân cách nhau bởi dấu phẩy
…, varM;
25/06/2023
1. KIỂU DỮ LIỆU CÓ CẤU TRÚC
1.2. Khai báo
Ví dụ:
struct khachHang{
char maKhachHang[100];
char hoVaTen[100];
int namSinh;
char diaChi[100];
}
struct khachHang kh1, kh2;
25/06/2023
1. KIỂU DỮ LIỆU CÓ CẤU TRÚC
1.3. Sử dụng typedef
Từ khóa typedef dùng để định nghĩa một tên mới cho một
kiểu dữ liệu đã có
Cú pháp:
typedef existingType newType;
existingType: kiểu dữ liệu đã tồn tại
newType: tên mới của kiểu dữ liệu
25/06/2023
1. KIỂU DỮ LIỆU CÓ CẤU TRÚC
25/06/2023
1. KIỂU DỮ LIỆU CÓ CẤU TRÚC
25/06/2023
1. KIỂU DỮ LIỆU CÓ CẤU TRÚC
1.5. Ví dụ
• Viết chương trình tính tọa độ trung điểm của A và B nhập
từ bàn phím
25/06/2023
2. MẢNG CẤU TRÚC
25/06/2023
2. MẢNG CẤU TRÚC
25/06/2023
2. MẢNG CẤU TRÚC
25/06/2023
2. MẢNG CẤU TRÚC
25/06/2023
2. MẢNG CẤU TRÚC
2.3. Con trỏ đến cấu trúc
Sử dụng toán tử “->” để tham chiếu đến từng thành viên của một cấu trúc được trỏ đến bởi con trỏ.
Ví dụ:
struct diem{
float x; float y;
}
diem *p, a;
p = &a;
p->x = 100;
p->y = 200;
cout << a.x;
cout << a.y;
25/06/2023
2. MẢNG CẤU TRÚC
25/06/2023
3. CẤU TRÚC LỒNG NHAU
25/06/2023
3. CẤU TRÚC LỒNG NHAU
3.1. Khái niệm
Cấu trúc lồng nhau là kiểu khai báo một cấu trúc con nằm trong một cấu trúc khác.
struct dateBirth{
int date;
int month;
int year;
};
struct khachHang{
char maKhachHang[100];
char hoVaTen[100];
char diaChi[100];
dateBirth ngaySinh;
};
25/06/2023
3. CẤU TRÚC LỒNG NHAU
3.2. Khai báo
Ví dụ:
struct khachHang{
char maKhachHang[100];
char hoVaTen[100];
char diaChi[100];
struct dateBirth{
int date;
int month;
int year;
};
dateBirth ngaySinh;
};
25/06/2023
3. CẤU TRÚC LỒNG NHAU
25/06/2023
3. CẤU TRÚC LỒNG NHAU
3.4. Ví dụ
25/06/2023
4. BÀI TẬP
4.1 Định nghĩa một cấu trúc dữ liệu sinh viên bao gồm:
• Mã số sinh viên: chuỗi kí tự
• Họ và tên sinh viên: chuỗi kí tự
• Địa chỉ: chuỗi kí tự
• Điểm toán, lý, hóa: số thực
Yêu cầu:
• Viết chương trình cho phép nhập thông tin danh sách sinh viên và xuất ra
màn hình danh sách này.
• Xuất điểm trung bình mỗi sinh viên với điểm trung bình = (toán + lý +
hóa)/3
25/06/2023
4. BÀI TẬP
4.2 Định nghĩa một cấu trúc dữ liệu nhân viên bao gồm:
• Mã số nhân viên: chuỗi kí tự
• Họ và tên nhân viên: chuỗi kí tự
• Địa chỉ: chuỗi kí tự
• Quản lý: bool (1: quản lý; 0: nhân viên)
Yêu cầu:
• Viết chương trình cho phép nhập thông tin danh sách nhân viên và xuất ra
màn hình danh sách này.
• Nếu là cán bộ quản lý thì xuất ra “Quản lý”, ngược lại xuất ra “Nhân viên”
• Xóa những nhân viên không là phải là cán bộ quản lý.
25/06/2023
4. BÀI TẬP
4.3 Định nghĩa một cấu trúc dữ liệu học sinh bao gồm:
• Họ và tên học sinh: chuỗi kí tự
• Điểm trung bình: float
• Thứ hạng: int
Yêu cầu:
• Viết chương trình cho phép nhập thông tin danh sách học sinh và
xuất ra màn hình danh sách này.
• Xếp hạng học sinh theo điểm trung bình.
25/06/2023
LẬP TRÌNH ỨNG DỤNG TRONG KỸ THUẬT
TS. LÊ TRUNG DŨNG
BỘ MÔN KỸ THUẬT TỰ ĐỘNG HÓA VÀ ĐIỀU KHIỂN
ĐẠI HỌC THỦY LỢI
GIỚI THIỆU CHUNG
2. Các hàm
1. Xử lý tập
xử lý trên tập 3. Bài tập
tin
tin
25/06/2023
1. XỬ LÝ TẬP TIN
25/06/2023
1. XỬ LÝ TẬP TIN
25/06/2023
1. XỬ LÝ TẬP TIN
25/06/2023
1. XỬ LÝ TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
2.1. Mở và đóng tập tin
Mở file:
- Hàm open:
- fstream nameFile;
- nameFile.open(filePath, mod);
- Mod:
- ios::in: mở file để đọc
- ios::out: mở file có sẵn để ghi
- ios::binary: mở file ở chế độ nhị phân
- ios::ate: mở file và đặt con trỏ ở cuối file
- ios::app: mở file và ghi dữ liệu vào cuối file. Nếu file không tồn tại thì tạo file mới
- ios::trunc: mở file, xóa bỏ nội dung trong file vừa mở.
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
2.1. Mở và đóng tập tin
Ví dụ:
1. fstream nameFile1;
2. nameFile1.open("fileName.dat", ios::in | ios::binary);
3. bool flag1 = nameFile1.fail();
4. if(flag1 == true)
5. cout << "File khong ton tai " << endl;
6. else
7. cout << "Mo file thanh cong" << endl;
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
2.3. Đọc và ghi file văn bản
1. int main(){
2. fstream fileName("fileName.txt", ios::in);
3. char a[100];
4. int i=0;
5. while(!fileName.eof()){
6. cout << i++ << endl;
7. fileName >> a;
8. cout << a << " ";
9. }
10. /*
11. while(!fileName.eof()){
12. cout << i++ << endl;
13. fileName.getline(a,100);
14. cout << a << endl;
15. }
16. */
17. fileName.close();
18. return 0;
19. }
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
2.4. Hàm định vị trong file
Các hàm đặt vị trí con trỏ:
- seekg (đặt vị trí đọc cho lớp istream)
- seekp (đặt vị trí ghi cho ostream)
Cột mốc:
- ios::beg – đầu file
- ios::cur – vị trí hiện tại
- ios::end – cuối file
Các hàm lấy vị trí hiện tại của con trỏ:
- tellg và tellp.
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN
2.4. Hàm định vị file
1. int main(){
2. fstream fileName("fileName.txt", ios::in);
3. char a[100];
4. //fileName.seekg(2);// chu cai n
5. while(!fileName.eof()){
6. //fileName.seekg(2,ios::cur);
7. fileName >> a;
8. cout << "Gia tri: " << a;
9. cout << endl;
10. cout << "Vi tri " << fileName.tellg();
11. cout << endl;
12. }
13. fileName.close();
14. return 0;
15. }
25/06/2023
3. BÀI TẬP
25/06/2023
3. BÀI TẬP
25/06/2023
3. BÀI TẬP
25/06/2023
LẬP TRÌNH ỨNG DỤNG TRONG KỸ THUẬT
TS. LÊ TRUNG DŨNG
BỘ MÔN KỸ THUẬT TỰ ĐỘNG HÓA VÀ ĐIỀU KHIỂN
ĐẠI HỌC THỦY LỢI
GIỚI THIỆU CHUNG
25/06/2023
1. CẢI TIẾN GIẢI THUẬT
25/06/2023
1.1. THÊM THÀNH VIÊN TRONG CẤU TRÚC
Để hạn chế việc tính toán nhiều lần mỗi khi cần truy xuất đến biến
cấu trúc, nên thêm thành viên trong cấu trúc.
Ví dụ:
type def struct diem{
int x, y;
}
typedef struct doanThang{
diem x, y;
}
25/06/2023
1.1. THÊM THÀNH VIÊN TRONG CẤU TRÚC
Để hạn chế việc tính toán độ dài của đoạn thẳng nhiều lần, bổ sung thành viên là độ
dài vào cấu trúc doanThang
Ví dụ:
type def struct diem{
int x, y;
}
typedef struct doanThang{
diem x, y;
float doDai;
}
25/06/2023
1.2. KHỞI TẠO DỮ LIỆU
25/06/2023
1.3. ĐƠN GIẢN HÓA
Phép tính căn bậc hai phức tạp hơn phép tính nhân.
Ví dụ:
Kiểm tra 1 điểm (x,y) có nằm trong vòng tròn bán kính R, tâm
(x0, y0) hay không?
d là khoảng cách từ (x, y) tới tâm (x0, y0)
Cần so sánh d = sqrt((x-x0)2 + (y-y0)2) với R
Thay vì dùng hàm sqrt thì thuật toán so sánh:
(x-x0)2 + (y-y0)2 với R2
25/06/2023
1.4. KỸ THUẬT NGỪNG GIẢI THUẬT
25/06/2023
1.5. TRÁNH DÙNG ĐỆ QUY
Sử dụng giải thuật đệ quy làm tăng chi phí gọi và trả về từ hàm
Tốn thêm nhiều bộ nhớ
25/06/2023
1.6. LOẠI BỎ KIỂM TRA GIÁ TRỊ
25/06/2023
2. TINH CHỈNH MÃ NGUỒN
1. Vòng lặp
2. Biểu thức điều kiện
3. Biểu thức
4. Hàm
25/06/2023
2.1. VÒNG LẶP
Xử lý tính toán ngoài vòng lặp
Ví dụ 1:
for (int i = 0; i < n*n; i ++){
x += i + a*b;
}
int N = n*n;
int AB = a*b;
for (int i = 0; i < N; i ++){
x += i + AB;
}
25/06/2023
2.1. VÒNG LẶP
Ví dụ 2:
while (bieuThucDieuKien){
X = a*b;
cacPhepTinhKhongThayDoiX;
}
if (bieuThucDieuKien){
X = a*b;
while (bieuThucDieuKien){
cacPhepTinhKhongThayDoiX;
}
}
25/06/2023
2.1. VÒNG LẶP
25/06/2023
2.2. BIỂU THỨC ĐIỀU KIỆN
25/06/2023
2.3. BIỂU THỨC
flag = x > y;
25/06/2023
2.3. BIỂU THỨC
25/06/2023
2.4. HÀM
25/06/2023
2.4. HÀM
Ví dụ:
struct Node{
int data, index;
}
void visit (Node p){
printf(“%d\n”, p.data);
}
25/06/2023
2.4. HÀM
25/06/2023
3. BÀI TẬP
25/06/2023
LẬP TRÌNH ỨNG DỤNG TRONG KỸ THUẬT
TS. LÊ TRUNG DŨNG
BỘ MÔN KỸ THUẬT TỰ ĐỘNG HÓA VÀ ĐIỀU KHIỂN
ĐẠI HỌC THỦY LỢI
GIỚI THIỆU CHUNG
25/06/2023
1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
25/06/2023
1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
25/06/2023
1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
25/06/2023
1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
25/06/2023
1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
1.4 Ưu điểm:
+ Tính kế thừa: có thể mở rộng khả năng sử dụng của các lớp đã xây dựng mà không cần phải viết lại.
+ Chương trình được xây dựng từ những đối tượng trao đổi với nhau nên việc thiết kế và lập trình sẽ được
thực hiện theo quy trình nhất định.
+ Nguyên lý đóng gói giúp chương trình an toàn không bị thay đổi bởi những đoạn chương trình khác.
+ Có thể xây dựng được ánh xạ các đối tượng của bài toán vào đối tượng chương trình
+ Cách tiếp cận thiết kế đặt trọng tâm vào dữ liệu, giúp xây dựng được mô hình chi tiết và dễ dàng cài đặt
hơn.
+ Dễ mở rộng, nâng cấp thành hệ thống lớn.
+ Việc trao đổi thông tin giữa các đối tượng làm cho việc mô tả giao diện với các hệ thống bên ngoài trở
nên đơn giản hơn.
+ Có thể quản lý được độ phức tạp của sản phẩm phần mềm.
25/06/2023
2. MỘT SỐ MỞ RỘNG CỦA C++
25/06/2023
2. MỘT SỐ MỞ RỘNG CỦA C++
25/06/2023
2. MỞ RỘNG CỦA C++
2.1. Hàm inline
Đặc điểm:
+ Khi biên dịch, chương trình sẽ ghép trực tiếp các chỉ thị tương
ứng của hàm vào chương trình tại lời gọi hàm inline.
+ Tiết kiệm chi phí gọi hàm và trả về -> tiết kiệm thời gian
+ Tăng kích thước của chương trình.
+ Từ khóa inline chỉ là một yêu cầu. Trong ngữ cảnh không thể
thực hiện được thì hàm sẽ được biên dịch như hàm bình
thường. (Ví dụ, có các cấu trúc lặp).
25/06/2023
2. MỞ RỘNG CỦA C++
25/06/2023
2. MỞ RỘNG CỦA C++
25/06/2023
2. MỞ RỘNG CỦA C++
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
3.1 Lớp (Class)
Về cơ bản, lớp là một cấu trúc với các hàm thành viên và dữ liệu thành viên.
Cú pháp
class sinhVien{
public: // thuoc tinh cua lop (public/private/protected)
char[100] hoVaTen;
int namSinh;
int maSinhVien;
void thongTin(){
cout << hoVaTen << “\t” << maSinhVien<< “\t” << namSinh;
}
}
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
3.3 Con trỏ đối tượng
Con trỏ đối tượng dùng để chứa địa chỉ của biến, mảng đối tượng.
Cú pháp:
tenLop *tenConTro;
Ví dụ:
sinhVien *sv1, *sv2, *sv3;
sinhVien s1, s2;
sinhVien arrSv[10];
sv1 = &s1; //con trỏ sv1 trỏ tới địa chỉ của s1
sv2 = arrSv; //con trỏ sv2 trỏ tới đầu mảng arrSv
sv3 = new sinhVien;// khởi tạo một đối tượng và chứa địa chỉ vào sv3
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
3.6 Toán tử
Được xây dựng như các phương thức thông thường, được
ghép với từ khóa operator với một phép toán:
operator+
operator<<
operator>>
25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++
3.6 Toán tử
Ví dụ: https://onlinegdb.com/293dYxRiX
25/06/2023
4. BÀI TẬP
4.1. Viết định nghĩa một lớp tên là Point dùng để lưu tọa độ
điểm trên mặt phẳng. Trong đó có các khai báo về các hàm
thành viên:
1. Một hàm dùng để lưu giá trị của điểm khi đối tượng của lớp
được tạo.
2. Một hàm dùng để di chuyển điểm dọc theo tọa độ vecto
được nhập vào
3. Một hàm dùng để xoay điểm quanh gốc tọa độ một góc
bằng 90 độ theo chiều kim đồng hồ.
25/06/2023
LẬP TRÌNH ỨNG DỤNG TRONG KỸ THUẬT
TS. LÊ TRUNG DŨNG
BỘ MÔN KỸ THUẬT TỰ ĐỘNG HÓA VÀ ĐIỀU KHIỂN
ĐẠI HỌC THỦY LỢI
GIỚI THIỆU CHUNG
25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC
25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC
25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC
25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC
25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC
25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC
25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC
25/06/2023
2. DẪN XUẤT VÀ THỪA KẾ
25/06/2023
2. DẪN XUẤT VÀ THỪA KẾ
2.2. Tính thừa kế:
Một lớp dẫn xuất, được thừa kế tất cả các thành phần của lớp cơ sở có liên
quan.
Cú pháp:
class C : public A, public B{
private:
// khai báo các thuộc tính và phương thức
public:
// khai báo các thuộc tính và phương thức
}
25/06/2023
2. DẪN XUẤT VÀ THỪA KẾ
25/06/2023
2. DẪN XUẤT VÀ THỪA KẾ
25/06/2023
4. BÀI TẬP
4.1. Viết định nghĩa một lớp tên là Point dùng để lưu tọa độ
điểm trên mặt phẳng. Trong đó có các khai báo về các hàm
thành viên:
1. Một hàm dùng để lưu giá trị của điểm khi đối tượng của lớp
được tạo.
2. Một hàm dùng để di chuyển điểm dọc theo tọa độ vecto
được nhập vào
3. Một hàm dùng để xoay điểm quanh gốc tọa độ một góc
bằng 90 độ theo chiều kim đồng hồ.
25/06/2023
LẬP TRÌNH ỨNG DỤNG TRONG KỸ THUẬT
TS. LÊ TRUNG DŨNG
BỘ MÔN KỸ THUẬT TỰ ĐỘNG HÓA VÀ ĐIỀU KHIỂN
ĐẠI HỌC THỦY LỢI
GIỚI THIỆU CHUNG
25/06/2023
1. TÍNH ĐA HÌNH
25/06/2023
1. TÍNH ĐA HÌNH
25/06/2023
1. TÍNH ĐA HÌNH
25/06/2023
1. TÍNH ĐA HÌNH
1.2. Hàm ảo
Quy tắc sử dụng hàm ảo:
Được gọi từ con trỏ mà chưa rõ phương thức nào sẽ được
gọi.
Phụ thuộc vào đối tượng mà con trỏ đang trỏ tới.
25/06/2023
1. TÍNH ĐA HÌNH
1.2. Hàm ảo
Ví dụ: Ví dụ: https://onlinegdb.com/UDTsC939-o
25/06/2023
1. TÍNH ĐA HÌNH
1.3. Lớp cơ sở trừu tượng
Là một lớp được định nghĩa chỉ được dùng làm lớp cơ sở cho
các lớp khác.
Thường được dùng để chứa các phương thức ảo thuần túy.
Bất kì lớp nào dẫn xuất từ một lớp cơ sở trừu tượng phải định
nghĩa lại tất cả các phương thức ảo mà nó thừa hưởng.
Không có đối tượng nào được tạo ra vì nó chỉ dùng để định
nghĩa một số khái niệm tổng quát chung cho các lớp khác.
Ví dụ: class sinhVien, sinhVienTDH, sinhVienRobot,…
25/06/2023
1. TÍNH ĐA HÌNH
25/06/2023
1. TÍNH ĐA HÌNH
25/06/2023
2. KHUÔN HÌNH
25/06/2023
2. KHUÔN HÌNH
25/06/2023
2. KHUÔN HÌNH
25/06/2023
2. KHUÔN HÌNH
25/06/2023
3. BÀI TẬP
25/06/2023
//Bài 1 Tính tổng bình phương các số lẻ từ 1 đến n
#include<stdio.h>
#include<conio.h>
main()
int i,s=0,n;
printf("Nhap n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
if(i%2!=0)
s=s+i*i;
getch();
#include<stdio.h>
#include<conio.h>
main()
{
int a,b,c,max;
printf("Nhap a=");
scanf("%d",&a);
printf("Nhap b=");
scanf("%d",&b);
printf("Nhap c=");
scanf("%d",&c);
max=a;
if(b>max)
max=b;
if(c>max)
max=c;
getch();
Bài 3
Nhập một số nguyên từ bàn phím, kiểm tra xem đó là số chẵn hay lẻ
#include<stdio.h>
#include<conio.h>
main()
int x;
printf("Nhap x:");
scanf("%d",&x);
if(x%2==0)
printf("%d la so chan",x);
else
printf("%d la so le",x);
getch();
Bai 4
Tìm ước số chung lớn nhất và bội số chung nhỏ nhất của 2 số nguyên nhập từ bàn phím
#include<stdio.h>
#include<conio.h>
#include<conio.h>
main()
{
int x,y,a,b;
do
scanf("%d%d",&a,&b);
while(a<=0 || b<=0);
x=a;
y=b;
while(a!=b)
if(a>b)
a-=b;
else
b-=a;
getch();
}
Bài 5
Nhập một số nguyên từ bàn phím. Kiểm tra một số có phải là số hoàn hảo?
#include<stdio.h>
#include<conio.h>
#include<math.h>
main()
int x;
int s=0,i;
scanf("%d", &x);
for(i=1;i<x;i++)
if(x%i== 0)
s=s+i;
if(s==x)
else
{
getch();
Bài 6
Nhập một số nguyên từ bàn phím. Kiểm tra một số có phải là số chính phương không?
#include<stdio.h>
#include<conio.h>
#include<math.h>
main()
int x,y;
printf("Nhap x=");
scanf("%d",&x);
y=sqrt(x);
if(x==y*y)
}
else
getch();
Bài 7
Viết chương trình in ra các số nguyên tố trong phạm vi từ 1 đến n, với n nguyên nhập từ bàn phím.
#include<stdio.h>
#include<conio.h>
main()
int n,i,j,dem;
printf("Nhap n=");
scanf("%d",&n);
for(i=2;i<=n;i++)
dem=0;
for(j=2;j<=i/2;j++)
if(i%j==0)
dem++;
}
if(dem==0)
printf("%5d",i);
getch();
Bài 8
#include<stdio.h>
#include<conio.h>
#include<math.h>
main()
int n,i;
float x,s=1;
printf("Nhap x,n:");
scanf("%f %d",&x,&n);
for(i=1;i<=n;i++)
{
s=s+i*pow(x,i);
getch();
Bài 9
Viết chương trình tính giá trị của biểu thức sau:
#include<stdio.h>
#include<conio.h>
main()
int i,n,s=0;
printf("Nhap n=");
scanf("%d",&n);
for(i=1;i<=2*n+1;i=i+2)
s=s+i;
getch();
}
Bài 10
Viết chương trình nhập x, y từ bàn phím, tính giá trị của biểu thức sau:
= 5 x – 3 y3 x nếu x<=y
#include<stdio.h>
#include<conio.h>
#include<math.h>
main()
float x,y,s=0;
printf("Nhap x=");
scanf("%f",&x);
printf("\nNhap y=");
scanf("%f",&y) ;
if(x>y)
s=2*x*x*y +1-fabs(x-1) ;
else
s=5*x - 3*x*pow(y,3);
}
getch();
Bài 11
#include<stdio.h>
#include<conio.h>
main()
int a[50];
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
printf("%5d",a[i]);
getch();
Bài 12
Nhập 1 dãy số nguyên đưa ra màn hình các số nguyên tố có trong mảng, vị trí các số đó trong mảng.
#include<stdio.h>
#include<conio.h>
main()
int a[50];
int i,n,j,kt;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
kt=0;
for(j=2;j<=a[i]/2;j++)
{
if(a[i]%j==0)
kt=1;
if(kt==0)
getch();
Bài 13
Nhập 1 dãy số nguyên không quá 50 phần tử, in ra màn hình dãy số đã nhập
Đưa ra màn hình số lớn nhất có trong dãy và vị trí của nó trong dãy.
Sắp xếp dãy số theo giá trị các phần tử tăng dần
#include<stdio.h>
#include<conio.h>
main()
int a[50];
int i,n,tg,max,j,s=0;
printf("nhap vao so phan tu: ");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d", &a[i]);
max=a[0];
for(i=1;i<n;i++)
if(a[i]>max)
max =a[i];
printf("\nvi tri cua gia tri lon nhat trong day la: ");
for(i=0;i<n;i++)
if (a[i]==max)
printf("%6d", i+1);
for(i=0;i<n-1;i++)
for(j=i+1; j<n; j++)
if(a[i]>a[j])
tg=a[i];
a[i]=a[j];
a[j]=tg;
for(i=0;i<n;i++)
printf("%6d",a[i]);
for(i=0;i<n;i++)
s=s+a[i];
getch();
Bài 14
Nhập 1 dãy n số nguyên (0<n<30), in ra màn hình dãy số đã nhập
Sắp xếp dãy số theo giá trị các phần tử giảm dần.
Chèn số X vào dãy sao cho sau khi chèn gái trị các phần tử vẫn giảm dần(x nhập từ bàn phím.
#include<stdio.h>
#include<conio.h>
main()
scanf("%d", &n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
printf("%5d",a[i]);
}
for(i=0;i<n;i++)
if(a[i]%2==0)
// sap xep day so theo gia tri cac phan tu giam dan
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]<a[j])
tg=a[i];
a[i]=a[j];
a[j]=tg;
for(i=0;i<n;i++)
printf("%5d",a[i]);
}
//chen so x vao day sao cho sau khi chen gia tri cac phan tu van tang dan (x nhap tu ban phim)
scanf("%d", &x);
v=0;
i=0;
while(a[i]>x)
i++;
v=i;
for(i=n-1;i>=v;i--)
a[i+1]=a[i];
a[v]=x;
for(i=0;i<n+1;i++)
printf("%5d", a[i]);
getch();
Bài 15
Nhập 1 dãy số thực không quá 50 phần tử, đưa ra màn hình tổng các số dương trong dãy.
#include<stdio.h>
#include<conio.h>
main()
int i, j, n,a[50],s=0;
scanf("%d", &n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
if(a[i]>0)
s=s+a[i];
for(i=0;i<n;i++)
{
if(a[i]<0)
for(j=i;j<n-1;j++)
a[j]=a[j+1];
n=n-1;
for(i=0;i<n;i++)
printf("%5d", a[i]);
getch();
Bài 16
Nhập 1 dãy số nguyên không quá 50 phần tử, đưa ra màn hình trung bình cộng các số chia hết cho 3 có
trong dãy. Chèn số X vào vị trí thứ k trong dãy(x,k nhập từ bàn phím)
#include<stdio.h>
#include<conio.h>
main()
{
int a[50];
int i,n,t=0,k,x,d=0;
scanf("%d", &n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
if(a[i]%3==0)
t=t+a[i];
d=d+1;
if(d==0)
else
}
// chen so x vao vi tri thu k trong day
scanf("%d%d", &x,&k);
for(i=n-1;i>=k;i--)
a[i+1]=a[i];
a[k]=x;
for(i=0;i<n+1;i++)
printf("%5d", a[i]);
getch();
Bài 17
#include<stdio.h>
#include<conio.h>
main()
int a[50][50];
int i,j,m,n;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
printf("%d ",a[i][j]);
printf("\n");
Bài 18
Nhập vào một ma trận n x m, in ra ma trận vừa nhập dưới dạng bảng
Hiển thị và tính tổng các phần tử trên hàng chẵn của ma trận
#include<stdio.h>
#include<conio.h>
main()
int a[50][50];
int i,j,m,n;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
for(j=0;j<m;j++)
printf("%d ",a[i][j]);
printf("\n");
float s=0;
for(i=0;i<n;i=i+2)
for(j=0;j<m;j++)
s=s+a[i][j];
int max;
max=a[0][0];
for(i=1;i<n;i++)
if(a[i][0]>max)
{
max=a[i][0];
getch();
Bài 19
#include<stdio.h>
#include<conio.h>
main()
int a[10][10],b[10][10],c[10][10];
int i,j,m,n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
}
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&b[i][j]);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
c[i][j]=a[i][j]+b[i][j];
for(i=0;i<m;j++)
for(j=0;j<n;j++)
printf("%5d",c[i][j]);
printf("\n");
getch();
}
Bài 20
Nhập ma trận n x n số nguyên. Tìm phần tử lớn nhất trên đường chéo chính.
Kiểm tra ma trận vừa nhập xem có phải là ma trận đơn vị không
#include<stdio.h>
#include<conio.h>
main()
int a[10][10];
printf("Nhap n= ");
scanf("%d", &n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
max=a[0][0];
for(i=0;i<n;i++)
if(a[i][i]>max)
max=a[i][i];
printf("\ngia tri lon nhat tren duong cheo chinh la %d", max);
int kt=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(((i==j)&&(a[i][j]!=1))||((i!=j)&&(a[i][j]!=0)))
kt=1;
if(kt==0)
else
{
getch();
Bài 21
Nhập vào một ma trận n x m, in ra ma trận vừa nhập dưới dạng bảng
Sắp xếp hàng 2 theo chiều giá trị các phần tử giảm dần.
Tìm giá trị nhỏ nhất chia hết cho 3 có trong mảng
#include<stdio.h>
#include<conio.h>
main()
int a[50][50];
int m,n,i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
printf("%d ",a[i][j]);
printf("\n");
int tg,k;
for(j=0;j<m-1;j++)
for(k=j+1;k<m;k++)
if(a[1][j]<a[1][k])
{
tg=a[1][j];
a[1][j]=a[1][k];
a[1][j]=tg;
for(j=0;j<m;j++)
printf("%5d",a[1][j]);
int s=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
s=s+a[i][j];
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
if(a[i][j]%3==0)
min=a[i][j];
kt=1;
break;
if(kt==1)
for(i=0;i<n;i++)
if((a[i][j]%3==0)&&(a[i][j]<min))
min=a[i][j];
printf("\nso nho nhat trong cac so chia het cho 3 co trong day la %d", min);
}
else
printf(" trong mang vua nhap khong co so chia het cho 3");
getch();
}
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <bits/stdc++.h>
/*
int x,y;
cin >> x;
y = sqrt(x);
if(x == y*y){
}else {
} }*/
/*int main(){
cout << n << "x" << i << "=" << n * i << endl;
}
} */
/*int main(){
int tong = 0;
while(n != 0){
tong += n % 10;
n /= 10;
}*/
/*
if(n<2)
return 0;
if(n % i == 0){
return 0;
}
return 1;
int main(){
if(nt(n)){
}else{
} */
/*
if(b == 0)
return a;
return (a*b)/gcd(a,b);
int main(){
int a,b;
return 0;
}*/
/*int main(){
int a[n];
max = a[i];
}*/
/*int main(){
int a[n];
sum += a[i];
} */
/*int main(){
int a,b;
float x;
if(a == 0){
if(b == 0){
} else{
}}
x = -b / (float)a;
cout << x;
}*/
/*int main(){
int n;
cin >> n;
float s = 0;
int i = 1;
i++;
}cout << s;
} */
/*int main(){
int a,b,c;
cin >> a >> b >> c;
float x , x1 , x2;
float delta;
if(a,b,c != 0){
x1 = x2 = -b/ (2.0*a);
cout << x2 ;
}else{
if(b == 0){
x = -c / a;
x1 = sqrt(x);
x2 = -sqrt(x);
cout << x2 ;
}else if(x == 0){
x1 = x2 = 0;
}else {
if(c == 0){
x1 = 0;
x2 = -b / a;
} */
/*
int sum = 0;
if(n % i == 0){
sum += i;
return n == sum;
}
int main(){
int n;
cin >> n;
if(perfect(i) == 1){
cout << i;
return 0;
}*/
/*
if(n % i ==0)
return 0;
return 1;
if(nt(i) == 1){
Tong1 += i;
} return Tong1;
int main(){
int n;
cin >> n;
if(nt(i) == 1){
return 0;
}*/
/*int main(){
int n,m;
return 0;
}*/
// Mang 2 chieu
/*int main(){
int n,m;
char c[100][100];
}
for(int i = 0; i < n; i++){
}*/
// Con tro
/*int main(){
int a = 1000;
int *ptr;
ptr = &a;
(*ptr)++;
cout << a ;
return 0;
}*/
struct sv{
double gpa;
};
int main(){
sv ds[n];
getline(cin, ds[i].ten);
sort(ds, ds+n);
for(sv x : ds){
cout << x.msv << " " << x.ten << " " << x.gpa << endl;