You are on page 1of 414

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
1. Tài liệu tham khảo:
 Lê Trung Dũng, Bài giảng môn Lập trình ứng dụng
trong kỹ thuật: https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng với
C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: shorturl.at/aqS05
 63TĐH2.1: shorturl.at/aiNT2
 63KTĐ2.1: shorturl.at/dilmB
 63KTĐ1.1: shorturl.at/qTY58
 63KTĐ3.1: shorturl.at/qxOR5
 63KTĐ3.2
 63TĐH1.2
 63TĐH2.2
3. Điểm danh: shorturl.at/aiqQV
MỤC LỤC

1. Tổng quan về lập trình


2. Ngôn ngữ lập trình C/C++
3. Biểu thức
4. Kiểu dữ liệu trong C/C++
5. Biến trong C/C++
6. Sử dụng hằng số trong C/C++
7. Các phép toán trong C/C++
8. Bài tập

25/06/2023
1. TỔNG QUAN VỀ LẬP TRÌNH

1.1. Khái niệm lập trình


1.2. Các bước lập trình
1.3. Giải thuật
1.4. Lưu đồ thuật toán
1. TỔNG QUAN VỀ LẬP TRÌNH

1.1. Khái niệm lập trình


 Lập trình máy tính: kỹ thuật cài đặt một hoặc
nhiều thuật toán trừu tượng có liên quan với
nhau bằng một hoặc nhiều ngôn ngữ lập trình
để tạo ra một chương trình máy tính
1. TỔNG QUAN VỀ LẬP TRÌNH

1.2. Các bước lập trình


 Tìm hiểu mục đích, yêu cầu của bài toán
 Mô tả giải thuật và vẽ sơ đồ
 Viết chương trình
 Các lệnh sắp xếp tuần tự
 Các lệnh sắp xếp theo kiểu rẽ nhánh
 Nhập liệu và chạy thử
 Sửa chương trình và kiểm tra kết quả
 Ứng dụng và bảo trì chương trình
1. TỔNG QUAN VỀ LẬP TRÌNH

1.3. Giải thuật


 Là một dãy các chỉ dẫn rõ ràng và hữu hạn,
gồm các thao tác mà con người hay máy móc
có khả năng thực hiện nhằm đạt được mục
tiêu đề ra
1. TỔNG QUAN VỀ LẬP TRÌNH

1.3. Giải thuật


 Ví dụ: giải phương trình bậc nhất ax + b = 0
 Nhập hệ số a, b
 Nếu a = 0
 Nếu b = 0 => Vô số nghiệm
 Ngược lại => Vô nghiệm
 Nếu a <>0 => x = -b/a
1. TỔNG QUAN VỀ LẬP TRÌNH

1.3. Giải thuật


 Ký hiệu, ký tự, chuỗi, ký số
 Bộ từ khóa biểu diễn lệnh:
 Bắt đầu; kết thúc
 Nếu … thì;
 Hoặc … là … thì
 Khi;
 Trong khi … thì
1. TỔNG QUAN VỀ LẬP TRÌNH

1.4. Lưu đồ giải thuật


 Diễn tả giải thuật bằng các khối hình học
 Các ký hiệu:
 Bắt đầu hoặc kết thúc
 Nhập xuất dữ liệu
 Tính toán
 Khảo sát điều kiện
 In dữ liệu
 Đường đi của giải thuật
1. TỔNG QUAN VỀ LẬP TRÌNH
1.4. Lưu đồ giải thuật
 Ví dụ: vẽ lưu đồ giải thuật giải phương trình bậc nhất ax + b = 0
Bắt đầu

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++

2.2. Quá trình biên dịch


 Nhập mã nguồn (source code)
 Mã nguồn: tập lệnh dùng để chỉ dẫn máy tính thực hiện công việc.
 Tập tin mã nguồn: *.cpp (C++)
 Biên dịch mã nguồn (compile)
 Chương trình viết bằng ngôn ngữ C/C++ được biên dịch sang mã máy bằng một chương trình biên
dịch (compiler)
 Thực hiện chương trình
 Chương trình nguồn được biên dịch và liên kết sẽ tạo nên các tập tin thực thi
 Nếu xảy ra lỗi thì chương trình cần phải được chỉnh sửa
2. NGÔN NGỮ LẬP TRÌNH C/C++

2.2. Quá trình biên dịch


/*Chuong trinh don gian*/
#include <iostream>
using namespace std;
int main(){
cout << “Hello world”;
return 0;
}
2. NGÔN NGỮ LẬP TRÌNH C/C++

2.2. Quá trình biên dịch


 Chương trình C/C++ đơn giản
int main ():
 Là hàm mà chương trình bắt đầu thực hiện
 Không phụ thuộc vị trí của hàm
 Nội dung của main luôn được thực hiện đầu tiên
 Chương trình C/C++ bắt buộc phải có hàm main()
 Các lệnh trong thân hàm đặt trong cặp dấu {}
2. NGÔN NGỮ LẬP TRÌNH C/C++

2.2. Quá trình biên dịch


 Chương trình C/C++ đơn giản
int main ():
 cout << “Hello world”: Lệnh nằm trong thân hàm main
 cout: dòng xuất chuẩn C/C++ trong thư viện iostream.h
 getch(): dừng chờ nhập một ký tự từ bàn phím
 return 0: lệnh kết thúc hàm main, trả về giá trị 0
2. NGÔN NGỮ LẬP TRÌNH C/C++
2.3. Cấu trúc một chương trình C/C++
/*Chuong trinh don giản*/
#include <iostream>
using namespace std;
int Cong (int a, int b);
int main(){
cout << "Hello world";
int c = Cong(2,3);
cout << "c=" << c;
return 0;
}
int Cong (int a, int b){
return a+b;
}
2. NGÔN NGỮ LẬP TRÌNH C/C++

2.4. Các tập tin thư viện


 Là các tập tin chứa định nghĩa các hàm thông dụng khi lập trình C/C++
 Khai báo ở phần đầu chương trình
 #include <filename.h>
 filename là tên tập tin thư viện
 stdio.h, iostream.h
 Xuất dữ liệu: printf(), cout
 Nhập giá trị cho biến: scanf()/cin
 Nhận kí tự từ bàn phím: getc(), gets()
 Xuất kí tự ra màn hình: putc(), puts()
 conio.h: các hàm vào ra ở hệ điều hành DOS như clrscr(), getch(),…
 math.h: các hàm toán học như abs(), sqrt(), log(), log10(), sin(), pow(), exp(),…
3. BIỂU THỨC

3.1 Khái niệm về biểu thức


3.2 Thứ tự tính toán biểu thức
3.3 Chuyển kiểu dữ liệu
3.4 Ép kiểu
3. BIỂU THỨC

3.1 Khái niệm về biểu thức


 Toán hạng (operand)
 Có thể xem là một đại lượng có giá trị
 Bao gồm hằng, biến hoặc hàm
 Biểu thức (expressions)
 Sự kết hợp giữa các phép toán và các toán hạng
 Mỗi biểu thức có một giá trị. Hằng, biến và hàm cũng được
xem là biểu thức.
 Dấu ngoặc đơn () thể hiện toán tử nào được thực hiện trước
3. BIỂU THỨC

3.1 Khái niệm về biểu thức


Ví dụ:
A = (X+Y)*0.01
X, Y, 0.01 là các toán hạng
+, *: là các toán tử
3. BIỂU THỨC

3.2 Thứ tự tính toán biểu thức


Tuân theo thứ tự tính toán trong toán học
Ví dụ:
A = X*Y – Z/W + T/5
3. BIỂU THỨC
3.3 Chuyển kiểu dữ liệu
 Các giá trị hằng, biến trong cùng một biểu thức
phải được chuyển thành cùng kiểu trước khi các
phép toán được thực hiện
 Trình biên dịch tự động thực hiện chuyển kiểu của
hằng và biến đến toán hạng có kiểu lớn nhất
 Ví dụ: Z = X * Y
 int X => float
 float Y
3. BIỂU THỨC
3.3 Chuyển kiểu dữ liệu
 Ví dụ:
#include <iostream>
using namespace std;
int main(){
cout << 3*5+17/9-9%7; //ket qua 14
cout << “\n”;
cout << 3*(5+17)/9-8%7; //ket qua 6
return 0;
}
3. BIỂU THỨ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.1 Khái niệm


4.2 Kiểu dữ liệu
4.3 Định danh
4.4 Từ khóa
4. KIỂU DỮ LIỆU TRONG C/C++

4.1 Khái niệm


 Kiểu dữ liệu thể hiện và lưu trữ thông tin
 Nhiều kiểu dữ liệu: số nguyên, số thực, chuỗi…
4. KIỂU DỮ LIỆU TRONG C/C++

4.2 Kiểu dữ liệu


 Kiểu dữ liệu nguyên thủy:
 Bool
 Ký tự: char
 Số nguyên: int
 Số thực: float, double
 Vô định: void
 Tự định nghĩa: user-defined
4. KIỂU DỮ LIỆU TRONG C/C++
4.2 Kiểu dữ liệu
 Một số kiểu dữ liệu cơ bản có thể sửa đổi theo các
định dạng:
 Có dấu: signed
 Không dấu: unsigned
 Ngắn: short
 Dài: long
 Kích thước của kiểu dữ liệu có thể thay đổi tùy
theo loại máy tính và trình biên dịch.
4. KIỂU DỮ LIỆU TRONG C/C++

4.2 Kiểu dữ liệu


 Kích thước:
 1 byte: char, unsigned char, signed char
 2 byte: short int, unsigned short int, signed short
int
 4 byte: int, unsigned int, signed int, long int,
signed long int, unsigned long int, float
 8 byte: double, long double
4. KIỂU DỮ LIỆU TRONG C/C++

4.3 Định danh


 Trong C/C++, tên biến, hằng, hàm, … được gọi là
định danh.
 Có thể là 1 hoặc nhiều kí tự.
 Kí tự đầu là chữ cái hoặc “_”; kí tự tiếp theo có thể
là chữ cái, chữ số hoặc “_”
 Phân biệt kí tự Hoa và Thường
 Không trùng với từ khóa của C/C++
4. KIỂU DỮ LIỆU TRONG C/C++
4.4 Từ khóa
 Là những từ được dành riêng bởi ngôn ngữ lập trình cho những mục đích
riêng của nó
 Từ khóa đều là chữ thường.
 Ví dụ:
 auto, double, int, struct
 break, else, long, switch
 case, enum, register, typedef
 char, extern, return, union
 const, float, short, unsigned
 continue, for, signed, void
 default, goto, sizeof, volatile
 do, if, static
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.2 Khai báo biến


 Khai báo biến trong C/C++ là thông báo cho trình biên dịch
biết địa điểm và lượng bộ nhớ cần tạo để lưu trữ biến đó.
 Cách khai báo:
 kieu_gia_tri danh_sach_bien;
 kieu_gia_tri: kiểu dữ liệu hợp lệ trong C/C++ như char, int,
float, double, bool hoặc dữ liệu do người dùng tự định nghĩa.
 danh_sach_bien: chứa một hoặc nhiều định danh, phân biệt
nhau bởi dấu phẩy.
5. BIẾN TRONG C/C++

5.2 Khai báo biến


 Khai báo:
int a, b, c;
char ch1, ch2;
float x, y;
double so_thuc;
 Có thể khởi tạo giá trị ngay khi khai báo:
int i = 1, j, k = 0;
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++

6.2 Hằng kiểu số


 Ví dụ:
 3.14 => dạng thập phân
 314E-2 => dạng hàm mũ: 314x 10^(-2)
6. SỬ DỤNG HẰNG SỐ TRONG C/C++
6.3 Hằng ký tự
 Hằng kí tự mở đầu và kết thúc bởi dấu nháy đơn
 Cách thể hiện
 Kí tự: ‘X’ hoặc ‘A’
 Escape sequence: ‘\t’
 Kí tự mở rộng: ‘\u02c0’
 Một số kí tự đặc biệt:
 Bắt đầu dòng mới ‘\n’
 Tạo một tab ‘\t’
6. SỬ DỤNG HẰNG SỐ TRONG C/C++

6.4 Hằng chuỗi


 Hằng chuỗi chứa trong dấu nháy kép, “abc”
 Một chuỗi có thể chứa các kí tự
 Kí tự: ‘X’
 Escape sequence: ‘\t’
 Kí tự mở rộng: ‘\u02c0’
 Ví dụ:
 “lap trinh, ung dung”
 “lap trinh, ” “ung ” “dung”
7. CÁC PHÉP TOÁN TRONG C/C++

7.1 Toán tử gán


7.2 Toán tử số học
7.3 Toán tử tăng/giảm
7.4 Toán tử luận lý
7.5 Toán tử ?
7.6 Độ ưu tiên các toán tử
7. CÁC PHÉP TOÁN TRONG C/C++

7.1 Toán tử gán


 variableName = expression
 Kiểu dữ liệu của biểu thức bên phải dấu “=”
được tự động chuyển thành kiểu dữ liệu của
biến bên trái dấu “=”
 Ví dụ
tong = a + b + c;
7. CÁC PHÉP TOÁN TRONG C/C++

7.1 Toán tử gán


 Chuyển đổi không mất thông tin:
 char => int => long => float => double
 Chuyển đổi có thể mất mát thông tin:
 double => float => long => int => char
7. CÁC PHÉP TOÁN TRONG C/C++
7.1 Toán tử gán
 “=”: gán giá trị toán hạng phải cho toán hạng trái
 “+=”: cộng giá trị toán hạng trái với toán hạng phải và gán cho toán hạng
trái. Ví dụ a+=b; <=> a = a + b;
 “-=”: trừ giá trị toán hạng trái cho toán hạng phải và gán cho toán hạng
trái. Ví dụ a-=b; <=> a = a - b;
 “*=”: nhân giá trị toán hạng trái với toán hạng phải và gán cho toán hạng
trái. Ví dụ a*=b; <=> a = a * b;
 “/=”: chia toán hạng trái cho toán hạng trái cho toán hạng phải và gán cho
toán hạng trái
 “%=”: lấy phần dư của phép chia toán hạng trái cho toán hạng phải và gán
cho toán hạng trái.
7. CÁC PHÉP TOÁN TRONG C/C++

7.2 Toán tử số học


 “+”: cộng hai toán hạng
 “-”: trừ toán hạng thứ nhất cho toán hạng thứ hai
 “*”: nhân hai toán hạng
 “/”: chia toán hạng thứ nhất cho toán hạng thứ hai
 “%”: lấy phần dư của phép chia toán hạng thứ nhất cho toán
hạng thứ hai
 “++”: tăng một đơn vị. Ví dụ a++; <=> a = a + 1;
 “--”: giảm một đơn vị. Ví dụ a--; <=> a = a - 1;
7. CÁC PHÉP TOÁN TRONG C/C++

7.3 Toán tử tăng/giảm


 “++”: tăng một đơn vị
 “--”: giảm một đơn vị
 Đặt trước toán hạng: hành động tăng/giảm sẽ thực hiện trước, sau đó giá
trị mới của toán hạng sẽ tham gia.
 Đặt sau: hành động tăng/giảm sẽ thực hiện sau khi đã tính toán
 Ví dụ:
int x = 100;
n = ++x +2; //x = x + 1 = 101; n= x + 2 = 103
n = x++ +2; //n = x + 2 = 102; x = x + 1 = 101
 Thứ tự ưu tiên: ++,-- => - (số âm) => *,/,% => +,-
7. CÁC PHÉP TOÁN TRONG C/C++
7.4 Toán tử luận lý
 “==”: so sánh bằng
 “!=”: so sánh không bằng
 “<”: so sánh nhỏ hơn
 “<=”: so sánh nhỏ hơn hoặc bằng
 “>”: so sánh lớn hơn
 “>=”: so sánh lớn hơn hoặc bằng
 “!”: not
 “&&”: and
 “||”: or
7. CÁC PHÉP TOÁN TRONG C/C++

7.4 Toán tử luận lý


 Độ ưu tiên:
!
 >, >=, <, <=
 ==, !=
 &&
 ||
 Ví dụ: (10>9 && 8!=7) && (6<=5 || 5>4) <=> True
7. CÁC PHÉP TOÁN 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

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng
dụng trong kỹ thuật:
https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng
với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: shorturl.at/aqS05
 63TĐH2.1: shorturl.at/aiNT2
 63KTĐ2.1: shorturl.at/dilmB
 63KTĐ1.1: shorturl.at/qTY58
 63KTĐ3.1: shorturl.at/qxOR5
 63TĐH1.2
 63TĐH2.2
3. Điểm danh: shorturl.at/aiqQV
MỤC LỤC

1. Cấu trúc điều khiển


2. Cấu trúc lựa chọn
3. Câu lệnh goto

25/06/2023
1. CẤU TRÚC ĐIỀU KHIỂN

1.1. Khái niệm


1.2. Phân loại cấu trúc điều khiển
1.3. Lệnh và khối lệnh

25/06/2023
1. CẤU TRÚC ĐIỀU KHIỂN

1.1. Khái niệm


 Cấu trúc điều khiển được dùng để điều khiển luồng chạy của ứng
dụng
 Phân loại:
 Cấu trúc tuần tự
 Cấu trúc lựa chọn
 Cấu trúc lặp

25/06/2023
1. CẤU TRÚC ĐIỀU KHIỂN

1.2. Phân loại cấu trúc điều khiển


 Cấu trúc tuần tự (sequence)
 Thực hiện tuần tự các lệnh theo thứ tự từ trên xuống
 Cấu trúc lựa chọn (selection)
 Dựa vào kết quả của biểu thức điều kiện để thực hiện các lệnh rẽ nhánh tương ứng.
 Ví dụ: if, switch
 Cấu trúc lặp (repetition hoặc loop):
 Lặp lại 1 hoặc nhiều lệnh cho đến khi biểu thức điều kiện có giá trị sai (false).
 Ví dụ: for, while, do … while.
 Các lệnh khác chi phối cách thực hiện: continue, break, goto.

25/06/2023
1. CẤU TRÚC ĐIỀU KHIỂN

1.3. Lệnh và khối lệnh


 Lệnh (statement): một biểu thức kết thúc bởi một dấu chẩm phẩy
 Khối lệnh (block): một hoặc nhiều lệnh nằm bên trong cặp dấu {}.

25/06/2023
2. CẤU TRÚC LỰA CHỌN

2.1. Cấu trúc if


2.2. Cấu trúc if … else
2.3 Cấu trúc switch

25/06/2023
2. CẤU TRÚC LỰA CHỌN

2.1. Cấu trúc if


 Cú pháp:
 if (expression) statement;
 if (expression) { block; }
 Nếu kết quả expression là true thì statement hoặc block
được thực thi.

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

2.2. Cấu trúc if … else


 Cú pháp:
if (expression) statement1;
else statement2;
 Nếu expression là true thì statement1 (block1) được thực
thi; ngược lại thì statement2 (block2) được thực thi.

25/06/2023
2. CẤU TRÚC LỰA CHỌN

2.2 Cấu trúc if … else


 Ví dụ:
1. #include <iostream>
2. using namespace std;
3. int main(){
4. int a,b;
5. cout << "Nhap a: ";
6. cin >> a;// Nhap du lieu tu ban phim vao bien a
7. cout<< "Nhap b: ";
8. cin >> b;
9. if (a < b) cout << "So lon nhat la: " << b;
10. else cout << "So lon nhat la: " << a;
11. return 0;
12. }

25/06/2023
2. CẤU TRÚC LỰA CHỌN

2.2. Cấu trúc if … else


 Lồng nhiều cấu trúc if … else:
if (expression1) statement1;
else if (expression2) statement2;
else if (expression3) statement3;
….

25/06/2023
2. CẤU TRÚC LỰA CHỌN

2.2. Cấu trúc if … else


 Ví dụ:
1. #include <iostream>
2. using namespace std;
3. int main(){
4. int a, b, c;
5. cout<< "Nhap a: "; cin >> a;
6. cout<< "Nhap b: "; cin >> b;
7. cout<< "Nhap c: "; cin >> c;
8. if (a >= b && a >= c) cout << "So lon nhat la: " << a;
9. else if (b >= a && b >= c) cout << "So lon nhat la: " << b;
10. else cout << "So lon nhat la: " << c;
11. return 0;
12. }

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

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng
dụng trong kỹ thuật:
https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng
với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: shorturl.at/aqS05
 63TĐH2.1: shorturl.at/aiNT2
 63KTĐ2.1: shorturl.at/dilmB
 63KTĐ1.1: shorturl.at/qTY58
 63KTĐ3.1: shorturl.at/qxOR5
 63TĐH1.2
 63TĐH2.2
3. Điểm danh: https://www.shorturl.at/joDL0
MỤC LỤC

1. Vòng lặp for, while, do … while


2. Lệnh rẽ nhánh và nhảy
3. Cấu trúc vòng lặp lồng nhau

25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE

1.1. Khái niệm


1.2. Vòng lặp for
1.3. Vòng lặp while
1.4. Vòng lặp do … while
1.5. Phân biệt

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

1.2. Vòng lặp for


 Cú pháp
for (Exp1; Exp2; Exp3) {
statement1;
…}
 Giải thích:
 Exp1: biểu thức khởi tạo
 Exp2: biểu thức điều kiện
 Exp3: biểu thức điều khiển lặp

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

1.2. Vòng lặp for


 Chú ý:
 Bất cứ biểu thức nào trong Exp1, Exp2, Exp3 đều có thể rỗng
 Ví dụ: for( ; i < 10; ) {statement;}
 Nếu cả 3 biểu thức đều rỗng thì vòng lặp for sẽ là vòng lặp vô
hạn.

25/06/2023
1. VÒNG LẶP FOR, WHILE, DO … WHILE

1.3. Vòng lặp while


 Cú pháp
while (expression) {
statement1;
…}
 Giải thích:
 expression: biểu thức điều kiện
 True: các lệnh được thực thi
 False: thoát khỏi vòng lặp 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

1.5. Phân biệt


 Cả ba cấu trúc vòng lặp đều thực hiện lặp 1 hoặc nhiều lệnh
cho đến khi biểu thức điều kiện sai.
 Đặc điểm khác biệt:
 for: số lần lặp xác định từ trước
 while: số lần lặp chưa biết trước
 do … while: số lần lặp chưa biết trước và lặp ít nhất 1 lần

25/06/2023
2. LỆNH RẼ NHÁNH VÀ NHẢY

2.1 Lệnh break


2.2 Lệnh continue

25/06/2023
2. LỆNH RẼ NHÁNH VÀ NHẢY

2.1 Lệnh break


 Lệnh break dùng để thoát khỏi một cấu trúc điều khiển
mặc dù biểu thức điều kiện không sai.
 Lệnh break chỉ được thực hiện bên trong 1 cấu trúc vòng
lặp, điều khiển luồng chạy của ứng dụng tới lệnh ngay sau
cấu trúc vòng lặp.

25/06/2023
2. LỆNH RẼ NHÁNH VÀ NHẢY

2.1 Lệnh break


1. #include <iostream>
2. using namespace std;
3. int main(){
4. int n;
5. for (int i = 0; i < 10; i++){
6. cout << "Nhap so nguyen n: "; cin >> n;
7. if (n == 0) break;
8. else cout << "1/" << n << " = " << (float)1/n << "\n";
9. }
10. return 0;
11. }
25/06/2023
2. LỆNH RẼ NHÁNH VÀ NHẢY

2.2 Lệnh continue


 Lệnh continue dùng để kết thúc vòng lặp hiện tại và tiếp
tục thực hiện vòng lặp tiếp theo.
 Chỉ được dùng bên trong các cấu trúc lặp.
 Thường đi kèm với câu lệnh kiểm tra điều kiện if

25/06/2023
2. LỆNH RẼ NHÁNH VÀ NHẢY

2.2 Lệnh continue


1. #include <iostream>
2. using namespace std;
3. int main(){
4. int n;
5. for (int i = 0; i < 10; i++){
6. cout << "Nhap so nguyen n: "; cin >> n;
7. if (n == 0) continue;
8. else cout << "1/" << n << " = " << (float)1/n << "\n";
9. }
10. return 0;
11. }
25/06/2023
3. CẤU TRÚC VÒNG LẶP LỒNG NHAU

3.1 Vòng lặp for


3.2 Vòng lặp while
3.3 Vòng lặp do … while

25/06/2023
3. CẤU TRÚC VÒNG LẶP LỒNG NHAU

3.1 Vòng lặp for


Cú pháp:
for (exp1; exp2; exp3){
for (exp4; exp5; exp6){
statement1;

statementN;
}
statement;

}
25/06/2023
3. CẤU TRÚC VÒNG LẶP LỒNG NHAU

3.1 Vòng lặp for


1. #include <iostream>
2. using namespace std;
3. int main(){
4. for (int i = 0; i < 3; i++){
5. for (int j = 0; j < 3; j++){
6. cout << "Hello in for i = " << i << " and j = " << j << "\n";
7. }
8. cout << "Hi for i = " << i << "\n";
9. }
10. return 0;
11. }
25/06/2023
3. CẤU TRÚC VÒNG LẶP LỒNG NHAU

3.2 Vòng lặp while


Cú pháp:
while (exp1){
while (exp2){
statement1;

statementN;
}
statement;

}
25/06/2023
3. CẤU TRÚC VÒNG LẶP LỒNG NHAU

3.2 Vòng lặp while


1. #include <iostream>
2. using namespace std;
3. int main(){
4. int i = 0;
5. while (i < 3){
6. int j = 0;
7. while (j < 3){
8. cout << "Hello in for i = " << i << " and j = " << j << "\n";
9. j++;
10. }
11. cout << "Hi for i = " << i << "\n";
12. i++;
13. }
14. return 0;
15. }

25/06/2023
3. CẤU TRÚC VÒNG LẶP LỒNG NHAU

3.3 Vòng lặp do … while


Cú pháp:
do {
do{
statement1;

statementN;
}
while{exp2};
statement;
}
while (exp1);
25/06/2023
3. CẤU TRÚC VÒNG LẶP LỒNG NHAU

3.3 Vòng lặp do … while


1. #include <iostream>
2. using namespace std;
3. int main(){
4. int i = 0;
5. do{
6. int j = 0;
7. do{
8. cout << "Hello in for i = " << i << " and j = " << j << "\n";
9. j++;
10. }
11. while (j < 3);
12. cout << "Hi for i = " << i << "\n";
13. i++;
14. }
15. while (i < 3);
16. return 0;
17. }

25/06/2023
4. BÀI TẬP

4.1. Viết chương trình nhập số nguyên n và kiểm tra xem số


đó có phải số nguyên tố hay không?
4.2. Viết chương trình nhập số nguyên n và in ra các ước số
của số n.
4.3. Viết chương trình nhập số nguyên m và n. Tìm ước số
chung lớn nhất của m và n.
4.4. Viết chương trình nhập số nguyên m và n. Tìm bội số
chung nhỏ nhất của m và n.
4.5. Tìm các cặp nghiệm nguyên của phương trình:
2*X + 3*Y = 100
4. BÀI TẬP
4.6. Nhập số nguyên n và in ra các hình:
**** **** *
**** *** **
**** ** ***
**** * ****
4.7. Viết chương trình giải bài toán
Vừa gà vừa chó
Có 36 con
Bó lại cho tròn
100 chân chẵn
Hỏi có mấy gà, mấy chó?
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

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng
dụng trong kỹ thuật:
https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng
với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: shorturl.at/aqS05
 63TĐH2.1: shorturl.at/aiNT2
 63KTĐ2.1: shorturl.at/dilmB
 63KTĐ1.1: shorturl.at/qTY58
 63KTĐ3.1: shorturl.at/qxOR5
 63TĐH1.2
 63TĐH2.2
3. Điểm danh: https://www.shorturl.at/joDL0
MỤC LỤC

1. Xây dựng và sử dụng hàm


2. Tham số của hàm
3. Khai báo hàm
4. return và exit

25/06/2023
1. XÂY DỰNG VÀ SỬ DỤNG HÀM

1.1. Khái niệm


1.2. Phân loại hàm
1.3. Dạng tổng quát của hàm
1.4. Sử dụng hàm

25/06/2023
1. XÂY DỰNG VÀ SỬ DỤNG HÀM

1.1. Khái niệm


 Hàm là một khối lệnh thực hiện một công việc hoàn chỉnh, được
đặt tên và thực thi nhiều lần, gọi từ nhiều vị trí của chương trình
 Hàm con (function), hay còn gọi là chương trình con (subroutine),
 Hàm có thể được gọi từ chương trình chính (hàm main), hoặc từ 1
hàm khác,
 Hàm có giá trị trả về hoặc không. Nếu hàm không có giá trị trả về,
gọi là thủ tục (procedure).
25/06/2023
1. XÂY DỰNG VÀ SỬ DỤNG HÀM

1.2. Phân loại hàm


 Hàm thư viện: là những hàm đã được xây dựng sẵn. Muốn sử dụng
các hàm thư viện phải khai báo thư viện chứa nó trong phần khai
báo (#include ten_thu_vien.h): iostream, conio.h, stdio.h, math.h
 Hàm do người dùng định nghĩa.

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

1.4. Sử dụng hàm


 Một hàm đã định nghĩa nhưng chúng vẫn chưa được thực
thi.
 Hàm chỉ được thực thi khi có lời gọi tới hàm đó.
 Cú pháp gọi hàm:
 tenBien = tenHam (danhSachCacThamSo);// hàm có giá trị trả về
 tenHam (danhSachCacThamSo);// hàm không có giá trị trả về

25/06/2023
1. XÂY DỰNG VÀ SỬ DỤNG HÀM

1.4. Sử dụng hàm


 Ví dụ:

25/06/2023
2. THAM SỐ CỦA HÀM

2.1 Cách truyền tham số


2.2 Truyền tham trị
2.3 Truyền tham chiếu
2.4 Giá trị mặc định cho tham số

25/06/2023
2. THAM SỐ CỦA HÀM

2.1 Cách truyền tham số


Với các hàm có tham số hình thức, khi thực hiện phải được
truyền giá trị cho các tham số này.
Có 02 cách truyền tham số:
+ Truyền tham trị: tham số hình thức thay đổi thì tham số
thực vẫn không thay đổi.
+ Truyền tham chiếu: tham số hình thức thay đổi thì tham số
thực cũng thay đổi theo.
25/06/2023
2. THAM SỐ CỦA HÀM

2.2 Truyền tham trị


 Truyền giá trị của biến.
 Khi hàm được gọi, tự động tạo ra một địa chỉ ô nhớ mới
để lưu trữ giá trị. Do đó giá trị của ô nhớ chỉ thay đổi bên
trong hàm. Giá trị của biến không thay đổi bên ngoài 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

2.3 Truyền tham chiếu


 Truyền địa chỉ của biến.
 Khi hàm được gọi, giá trị của biến bên trong hàm thay đổi
thì giá trị của biến bên ngoài cũng thay đổi theo.

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

2.4 Giá trị mặc định cho tham số


 Khi định nghĩa một hàm, có thể xác định một giá trị mặc định cho các
tham số cuối cùng. Giá trị này sẽ được dùng nếu tham số tương ứng là
bỏ trống.
 Ví dụ:
int tong2so(int a = 0, int b = 0);// đúng
int tong2so(int a, int b = 0);// đúng
int tong2so(int a = 0, int b); // sai về cú pháp
 Nếu một giá trị cho tham số không được truyền thì giá trị mặc định sẽ được sử
dụng.
 Nếu một giá trị đã được xác định thì giá trị mặc định sẽ bị bỏ qua.
25/06/2023
2. THAM SỐ CỦA HÀM
2.4 Giá trị mặc định cho tham số
 Ví dụ:
1. #include <iostream>
2. using namespace std;
3. int tong2so(int a, int b=8){
4. return a + b;
5. }
6. int main(){
7. int a=5,b=25;
8. cout << "Tong hai so a va b la: " << tong2so(a) << "\n";
9. return 0;
10. }
25/06/2023
3. KHAI BÁO HÀM

3.1 Khai báo hàm


3.2 Định nghĩa hàm
3.3 Minh họa khai báo 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

3.1 Khai báo hàm


 Khi khai báo hàm thì tên các tham số không quan trọng.
 Ví dụ:
int tong2so (int , int );// truyền tham trị
int daoGiaTri2so (int &, int &); // & địa chỉ của biến – truyền
tham chiếu

25/06/2023
3. KHAI BÁO HÀM

3.2 Định nghĩa hàm


 Phải khai báo hàm trước khi gọi hàm đó.
 Nếu đã khai báo hàm thì có thể định nghĩa hàm ở bất kì
đâu trong chương trình.

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

5.1. Sử dụng hàm để viết chương trình nhập vào số


nguyên n và liệt kê các số hoàn hảo nhỏ hơn n?
Số hoàn hảo: N = tổng các ước số của N.
5.2. Sử dụng hàm để viết chương trình nhập vào số
nguyên n:
+ In ra tất cả các số nguyên tố từ 2 đến n
+ Tính tổng các số nguyên tố từ 2 đến n
5. BÀI TẬP

5.3. Sử dụng hàm, viết chương trình nhập vào 2 số nguyên m


và n. Tìm bội số chung nhỏ nhất của hai số đó.
Hàm 1: Tìm ước số chung lớn nhất của 2 số
Hàm 2: Tìm bội số chung nhỏ nhất của 2 số
5.4. Viết chương trình cho phép người dùng nhập liên tiếp
các số nguyên dương n. Nếu không thỏa mãn thì chương
trình kết thúc. Khi chương trình kết thúc thì in ra tổng các số
chính phương mà người dùng đã nhập.
Số chính phương: là số có giá trị bằng bình phương của 1 số
khác.
LẬP TRÌNH ỨNG DỤNG TRONG KỸ THUẬT
TS. LÊ TRUNG DŨNG
BỘ MÔN KỸ THUẬT ROBOT VÀ ĐIỀU KHIỂN ĐIỀU KHIỂN THÔNG MINH
ĐẠI HỌC THỦY LỢI
GIỚI THIỆU CHUNG

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng
dụng trong kỹ thuật:
https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng
với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: shorturl.at/aqS05
 63TĐH2.1: shorturl.at/aiNT2
 63KTĐ2.1: shorturl.at/dilmB
 63KTĐ1.1: shorturl.at/qTY58
 63KTĐ3.1: shorturl.at/qxOR5
 63TĐH1.2
 63TĐH2.2
3. Điểm danh: https://www.shorturl.at/joDL0
MỤC LỤC

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

1.1. Hàm đệ quy trong C++


1.2. Phân loại đệ quy
 Đệ quy tuyến tính
 Đệ quy nhị phân
 Đệ quy phi tuyến
 Đệ quy tương hỗ

25/06/2023
1. ĐỆ QUY

1.1. Hàm đệ quy trong C++


Là hàm gọi chính nó, nghĩa là trong thân hàm có câu lệnh gọi
đến chính tên hàm hiện tại và truyền đúng tham số mà hàm đã
khai báo.
Ví dụ:
int hamDeQuy(){
hamDeQuy();
}

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

1.1. Hàm đệ quy trong C++


Ví dụ: n! = n*(n-1)!
int giaiThua(int n){
if (n==1) return 1;// dieu kien dung
else return (n * giaiThua(n-1));
}

25/06/2023
1. ĐỆ QUY

1.2. Phân loại đệ quy


 Đệ quy tuyến tính
 Đệ quy nhị phân
 Đệ quy phi tuyến
 Đệ quy tương hỗ

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

1.4. Đệ quy nhị phân


Ví dụ: Tính số hạng thứ n của dãy Fibonaci:
 f(1) = f(0) = 1;
 f(n) = f(n-1) + f(n-2)
long Fibonaci (long n){
if (n == 0 || n==1) return 1;
else return (Fibonaci(n-1) + Fibonaci(n-2));
}
25/06/2023
1. ĐỆ QUY
1.5. Đệ quy phi tuyến
Lời gọi hàm được đặt bên trong vòng lặp:
Cú pháp:
kieu tenHam(thamSo){
if (dieuKienDung) {

return giaTri;
}
else {
for (int i=1; i <=n; i++){

tenHam(thamSo);

}
}
}
25/06/2023
1. ĐỆ QUY
1.5. Đệ quy phi tuyến
Ví dụ: tính số hạng thứ n của dãy Xn:
 X(0) = 1;
 X(n) = n2X(0) + (n-1)2X(1) + … + 12X(n-1); n>=0;
long Xn(long n){
if (n==0) return 1;
else{
long s = 0;
for(int i=1; i<=n; i++){
s = s + i*i*Xn(n-i);
}
return s;
}
}
25/06/2023
1. ĐỆ QUY
1.6. Đệ quy tương hỗ
Trong thân hàm sẽ gọi hàm khác, và hàm đó lại gọi lại hàm gọi. Hay còn gọi là đệ quy
gián tiếp.
Cú pháp:
kieu ham1(thamSo){

ham2(thamSo);
}
kieu ham2(thamSo){

ham1(thamSo)
}
25/06/2023
1. ĐỆ QUY
1.6. Đệ quy tương hỗ
Ví dụ: tính số hạng thứ n của hai dãy Xn và Yn:
 X(0) = Y(0) = 1;
 X(n) = X(n-1) + Y(n-1);
 Y(n) = n2X(n-1) + Y(n-1);
long tinhXn(long n){
if (n==0) return 1;
else return (tinhXn(n-1) + tinhYn(n-1));
}
long tinhYn(long n){
if (n == 0) return 1;
else return (n2tinhXn(n-1) + tinhYn(n-1));
}
25/06/2023
2. MẢNG

2.1. Khái niệm


2.2. Khai báo mảng
2.3 Duyệt mảng

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

2.3. Duyệt mảng


Duyệt mảng thông qua vòng lặp để xử lý từng phần tử trong mảng:
Ví dụ:
int n = 10;
int a[n];
for(int i=0; i<n; i++){
a[i] = bieuThucTinhToan;
}

25/06/2023
3. MẢNG NHIỀU CHIỀU

3.1 Khái niệm


3.2 Khai báo mảng nhiều chiều

25/06/2023
3. MẢNG NHIỀU CHIỀU

3.1 Khái niệm


Mảng nhiều chiều là một mảng mà các phần tử của nó được
xác định bằng nhiều chỉ số.

25/06/2023
3. MẢNG NHIỀU CHIỀU

3.2 Khai báo mảng nhiều chiều


Khai báo mảng hai chiều
kieu tenMang[hang][cot]
Ví dụ:
int a[3][2];

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

4.1 Khái niệm


4.2 Khai báo chuỗi
4.3 Nhập chuỗi
4.4 Xuất chuỗi
4.5 Một số hàm thao tác trên chuỗi

25/06/2023
4. CHUỖI

4.1 Khái niệm


 Là một mảng các ký tự kết thúc bằng ký tự NULL (‘\0’).
 Ký tự NULL được tự động thêm ở phần cuối của chuỗi.
 Mỗi ký tự trong chuỗi được định nghĩa theo định dạng
bảng mã ASCII{value11,value12,…,value1n}

25/06/2023
4. CHUỖI

4.2 Khai báo chuỗi


 Cách 1:
 char tenChuoi[chieuDaiToiDa];
 Ví dụ: char str[25];
 Mảng ký tự có tên là str và có thể nhập 24 ký tự.
 Ký tự thứ 25 là NULL

25/06/2023
4. CHUỖI

4.2 Khai báo chuỗi


 Cách 2:
 char *tenChuoi;
 Ví dụ: char *str;
 Trước khi sử dụng str, phải dùng từ khóa new để cấp phát
vùng nhớ:
 Ví dụ: str = new char[101]; // cấp phát 101 ký tự

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

4.3 Nhập chuỗi


 Lưu ý: nếu dùng hàm cin thì nên dùng cin.getline() vì cin
tự động ngắt chuỗi khi gặp ký tự khoảng trắng.
 Ví dụ:
char *str;
str = new char[40];
cin.getline(str,40);

25/06/2023
4. CHUỖI

4.4 Xuất chuỗi


 Để xuất chuỗi ra màn hình, nên dùng hàm puts() trong thư
viện stdio.h
 Ví dụ: puts(chuoi1);
 Nếu dùng hàm cout thì có thể dùng cú pháp: cout << s;

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

5.1 Khái niệm


5.2 Con trỏ đến chuỗi

25/06/2023
5. MẢNG CHUỖI

5.1 Khái niệm


Là một mảng ký tự hai chiều.
 Số hàng = số chuỗi.
 Số cột = chiều dài lớn nhất của một chuỗi.
Ví dụ: char str[3][10]

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

9. Viết chương trình nhập vào một chuỗi:

 Đếm số khoảng trắng có trong chuỗi

 Loại bỏ khoảng trắng dư thừa.

10. Viết chương trình nhập vào một chuỗi:

 Đếm số ký tự thường trong chuỗi

 Đếm số ký tự hoa trong chuỗi

 Đếm số ký tự không phải là chữ cái trong chuỗi

11. Viết chương trình nhập vào một chuỗi:

 Xóa các khoảng trắng thừa trong chuỗi

 Đếm số từ trong chuỗi

 Xóa chuỗi từ vị trí i tới j

12. Viết chương trình nhập vào hai chuỗi:

 Kiểm tra xem chuỗi thứ hai có nằm trong chuỗi thứ nhất hay không

 Ghep chuỗi thứ hai nằm cuối chuỗi thứ nhất.


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

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng
dụng trong kỹ thuật:
https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng
với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: shorturl.at/aqS05
 63TĐH2.1: shorturl.at/aiNT2
 63KTĐ2.1: shorturl.at/dilmB
 63KTĐ1.1: shorturl.at/qTY58
 63KTĐ3.1: shorturl.at/qxOR5
 63TĐH1.2
 63TĐH2.2
3. Điểm danh: https://www.shorturl.at/joDL0
MỤC LỤC

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Ỏ

1.1. Địa chỉ của biến


1.2. Khái niệm con trỏ
1.3. Khai báo con trỏ
1.4. Toán tử con trỏ

25/06/2023
1. CON TRỎ

1.1. Địa chỉ của biến


Thông tin của một biến bao gồm:
 Tên biến
 Kiểu dữ liệu của biến
 Giá trị của biến
Mỗi biến sẽ được lưu trữ tại một vị trí xác định, địa chỉ của
biến sẽ là địa chỉ byte đầu tiên của dữ liệu của biến.

25/06/2023
1. CON TRỎ

1.1. Địa chỉ của biến


Địa chỉ của biến luôn là một số nguyên viết theo hệ thập lục
phân.
Ví dụ:
 float x = 2.5;
 cout << “Dia chi cua bien x = ” << &x << “\n”;

25/06/2023
1. CON TRỎ

1.2. Khái niệm con trỏ


Con trỏ là một biến chứa một địa chỉ trên bộ nhớ.
Nếu một biến chứa địa chỉ của một biến khác, biến thứ nhất
được gọi là trỏ tới biến thứ hai.

25/06/2023
1. CON TRỎ

1.3. Khai báo con trỏ


Cú pháp:
type *pointerVariable
type: kiểu dữ liệu của biến mà con trỏ trỏ tới.
Ví dụ:
int *a;

25/06/2023
1. CON TRỎ

1.4. Toán tử con trỏ


Toán tử &: là toán tử trả về địa chỉ bộ nhớ của toán hạng
Toán tử &: dùng để gán địa chỉ của biến cho biến con trỏ
Cú pháp:
ten_bien_con_tro = & ten_bien
Ví dụ:
int a = 50, b;
int *c;
b = a; //b = a = 50
c = &a; // c = địa chỉ của a

25/06/2023
1. CON TRỎ

1.4. Toán tử con trỏ


Toán tử *: là toán tử trả về giá trị tại địa chỉ con trỏ trỏ đến
Cú pháp:
* ten_bien_con_tro
Ví dụ:
d = *c; //d = a; do c = &a

25/06/2023
2. CÁC THAO TÁC TRÊN CON TRỎ

2.1. Lệnh gán con trỏ


2.2 Phép toán số học trên con trỏ
2.3 Ví dụ minh họa

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Ỏ

2.2. Phép toán trên con trỏ


Chỉ có hai phép toán được sử dụng trên con trỏ là + và -
Khi cộng hoặc trừ 1 con trỏ với một số nguyên n, kết quả là
một con trỏ.
Con trỏ này chỉ đến vùng nhớ cách vùng nhớ của con trỏ cũ
một số nguyên lần kích thước của kiểu dữ liệu của nó.

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ụ
int *a; // int: 4 byte
short *b; // short 2 byte
a = a + 1;// con trỏ a sẽ di chuyển về phía tăng địa chỉ lên 4 byte
b = b + 1;// con trỏ b sẽ di chuyển về phía tăng địa chỉ lên 2 byte
Lưu ý: toán tử ++ hoặc -- sẽ có quyền ưu tiên cao hơn toán tử *
Ví dụ:
*p++ <=> *(p++): tăng địa chỉ ô nhớ chứ không phải tăng giá trị 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

3.1 Cấp phát bộ nhớ động


3.2 Cấp phát bộ nhớ động trong C
3.3 Cấp phát bộ nhớ động trong C++
3.4 Con trỏ void
3.5 Con trỏ NULL

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

3.2 Cấp phát bộ nhớ động trong C


Bộ nhớ trong C/C++:
 Stack: tất cả các biến được khai báo bên trong hàm sẽ
nhận bộ nhớ từ stack trong C/C++
 Heap: Được sử dụng để cấp phát bộ nhớ động khi chương
trình đang chạy.
Hàm malloc() và free() dùng để cấp phát và thu hồi bộ nhớ,
thư viện stdlib.h
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG

3.2 Cấp phát bộ nhớ động trong C


 Hàm malloc(): cấp phát bộ nhớ động
 Prototype của hàm:
 void *malloc(length)
 length: số byte muốn cấp phát
 Trả về con trỏ có kiểu void, do đó có thể gán cho con trỏ kiểu bất
kì.
 Sau khi cấp phát thành công, hàm malloc() trả về địa chỉ của byte
đầu tiên của vùng nhớ được cấp phát từ heap.
 Nếu không thành công, hàm malloc() trả về giá trị NULL (không có
đủ vùng nhớ rỗi theo yêu cầu).
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG

3.2 Cấp phát bộ nhớ động trong C


 Ví dụ:
int *p;
p = (int *) malloc(1000); cấp phát 1000 bytes
Do hàm malloc() trả về con trỏ kiểu void, nên phải ép kiểu
sang con trỏ int cho phù hợp với biến p.

25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG

3.2 Cấp phát bộ nhớ động trong C


Có thể dùng thêm toán tử sizeof để xác định chính xác số
phần tử
Ví dụ:
int *p;
p = (int *) malloc (250*sizeof(int));

25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG

3.2 Cấp phát bộ nhớ động trong C


Kích thước của heap không xác định nên khi cấp phát bộ nhớ phải kiểm
tra giá trị trả về của hàm malloc() để biết có cấp phát bộ nhớ thành
công hay không.
Ví dụ:
p = (int *) malloc(100);
if (p == NULL) {
cout << “Khong du bo nho”;
exit(1);
}
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG

3.2 Cấp phát bộ nhớ động trong C


Hàm free(): Trả về vùng nhớ được cấp phát bởi hàm malloc()
Cú pháp
void free(void *p);
p là con trỏ đến vùng nhớ đã được cấp phát trước đó bởi
hàm malloc().

25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG

3.3 Cấp phát bộ nhớ động trong C++


C++ cung cấp hai toán tử cấp phát bộ nhớ động là new và delete.
 Toán tử new cấp phát bộ nhớ và trả về một con trỏ đến byte đầu tiên của
vùng nhớ được cấp phát
 Toán tử delete thu hồi vùng nhớ được cấp phát trước đó bởi toán tử new.
Cú pháp:
p = new type;
delete p;
p là một biến con trỏ nhận địa chỉ của vùng nhớ được cấp phát đủ lớn để
chứa 1 đối tượng có kiểu là type
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG
3.3 Cấp phát bộ nhớ động trong C++
1. #include <iostream.h>

2. int main(){

3. int *p = new int;


4. if (p == NULL) { cout << "Loi cap phat bo nho";
5. exit(0);}
6. *p = 100;
7. cout << "Tai o nho "<<p<<" la gia tri "<<*p<<endl;
8. if (p!=NULL){ delete p;
9. p = NULL;}
10. return 0;
11.}
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG

3.4 Con trỏ void


Con trỏ void là một loại con trỏ đặc biệt mà có thể trỏ đến bất
kì kiểu dữ liệu nào
Cú pháp
void *pointerVariable;
Ví dụ:
void *p;
p = &a;// p trỏ đến biến nguyên a;
p = &f;// p trỏ đến biến thực f
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG

3.4 Con trỏ void


1. int a = 10;
2. float f = 11.6;
3. void *pV;
4. pV = &f;
5. cout << "float pV = " << *((float *)pV)<<"\n";
6. pV = &a;
7. cout << "int pV = " << *((int *)pV)<<"\n";
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG

3.4 Con trỏ void


Cũng có thể ép kiểu con trỏ về đúng kiểu tương ứng khi dùng
trong các biểu thức.
Ví dụ:
 Nếu p đang trỏ đến biến nguyên a, để tăng giá trị của biến a
lên 10 ta phải dùng lệnh:
 *(int *)p + 10;
 Nếu p đang trỏ đến biến thực f, để tăng giá trị của biến lên 10,
ta phải dùng lệnh:
 *(float *)p + 10
25/06/2023
3. CẤP PHÁT BỘ NHỚ ĐỘNG
3.5 Con trỏ NULL
Một con trỏ không trỏ đến một địa chỉ bộ nhớ hợp lệ thì được gán giá trị NULL
NULL được định nghĩa trong <cstdlib>
Ví dụ:
#include <iostream.h>
int main(){
int *p;
p = (int *) malloc(100);
if (p == NULL) {
cout << “Khong du bo nho”;
exit(1);
}
else
cout << “Gia tri con tro p tro den la: ” << *p;
}

25/06/2023
4. CON TRỎ VÀ MẢNG

4.1 Con trỏ và mảng


4.2 Mảng con trỏ
4.3 Ví dụ

25/06/2023
4. CON TRỎ VÀ MẢNG

4.1 Con trỏ và mảng


Giữa mảng và con trỏ có một mối liên hệ:
 Phần tử của mảng được xác định bằng chỉ số trong mảng.
Cũng có thể được xác định qua biến con trỏ.
 Tên của một mảng tương đương với địa chỉ phần tử đầu
tiên của nó. Tương tự một con trỏ tương đương với địa chỉ
của phần tử đầu tiên mà con trỏ trỏ tới.
25/06/2023
4. CON TRỎ VÀ MẢNG

4.1 Con trỏ và mảng


Ví dụ:
char ch[10], *p;
p = ch; //p được gán địa chỉ của phần tử đầu tiên của
mảng ch.
Phần tử thứ 3 trong mảng ch:
 ch[2]
 *(p+2)
25/06/2023
4. CON TRỎ VÀ MẢNG

4.1 Con trỏ và mảng


Truy cập các phần tử mảng bằng con trỏ:
Kiểu mảng Kiểu con trỏ
&<tên mảng>[0] <tên con trỏ>
&<tên mảng>[vị trí] <tên con trỏ> + <vị trí>
<tên mảng>[vị trí] *(<tên con trỏ> + <vị trí>)

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

4.2 Nhập xuất mảng bằng con trỏ


1. int main(){
2. int a[10], *p;
3. p = a;
4. for (int i = 0; i < 10; i++)
5. cout << "Nhap phan tu "<<i<<" : "; cin >> *(p+i);// a[i]
6. for (int i = 0; i < 10; i++)
7. cout << "Xuat phan tu thu "<<i<<" : " << *(p+i) << "\n";
8. return 0;
9. }

25/06/2023
4. CON TRỎ VÀ MẢNG

4.3 Mảng con trỏ


Mỗi biến con trỏ là một biến đơn.
Có thể tạo mảng của các con trỏ với mỗi phần tử của mảng là
một con trỏ.
Cú pháp:
type *pointerArray[elements];
- type: kiểu dữ liệu mà các con trỏ phần tử trỏ tới
- pointerArray: tên mảng con trỏ
- elements: số phần tử của mảng con trỏ.
25/06/2023
4. CON TRỎ VÀ MẢNG

4.3 Mảng con trỏ


Ví dụ:
 int main(){
 int *p[5]; // mang con tro
 int a = 6;
 p[0] = &a; // con tro thu nhat tro vao a
 p[2] = p[0];// con tro thu 3 tro vao a
 int b;
25/06/2023
4. CON TRỎ VÀ MẢNG
 b = *p[0]; // sao chep gia tri vao b = 6
 cout << "Gia tri cua b la: " << b << "\n";

*p[2] = 10; // thay doi gia tri cua a
 int c;
 c = *p[0]; // sao chep gia tri vao c = 10
 cout << "Gia tri cua a la: " << a << "\n";
 cout << "Gia tri cua c la: " << c << "\n";
 return 0;
 }
25/06/2023
5. BÀI TẬP

Dùng con trỏ để thực hiện các bài tập sau.


5.1 Viết chương trình nhập vào một mảng a có n phần tử.
Hãy liệt kê các phần tử xuất hiện nhiều nhất trong mảng.
Nếu mảng có các phần tử phân biệt nhau thì thông báo
“không có phần tử nào xuất hiện nhiều nhất”.
5.2 Viết chương trình nhập vào một mảng a có n phần tử.
Hãy tìm phần tử lẻ nhỏ nhất và phần tử chẵn lớn nhất. Nếu
mảng không có phần tử thỏa mãn điều kiện trên thì thông
báo: “không có phần tử” đó.
25/06/2023
5. BÀI TẬP

Dùng con trỏ để thực hiện các bài tập sau.


5.3 Viết chương trình nhập vào một mảng a có n phần tử. Hãy
sắp xếp mảng theo thứ tự lẻ tăng dần và chẵn giảm dần.
5.4 Viết chương trình nhập vào một ma trận vuông a có n x n
phần tử giá trị số thực:
 Tìm phần tử lớn nhất của ma trận
 Kiểm tra ma trận có đối xứng qua đường chéo chính hay
không
25/06/2023
5. BÀI TẬP

Dùng con trỏ để thực hiện các bài tập sau.


5.5 Viết chương trình nhập vào một ma trận vuông a có n x
n phần tử giá trị số thực:
 In ra ma trận chuyển vị của ma trận a

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

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng dụng
trong kỹ thuật: https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức, Nguyễn
Thanh Thủy. Lập trình hướng đối tượng với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: T2-1,2,3
 63TĐH2.1: T2-4,5,6
 63KTĐ2.1: T2-7,8,9
 63KTĐ1.1: T2-10,11,12
 63KTĐ3.1: T3-1,2,3
 63TĐH1.2
 63TĐH2.2
3. Điểm danh: https://www.shorturl.at/joDL0
MỤC LỤC

1. Kiểu dữ liệu có cấu trúc


2. Mảng cấu trúc
3. Cấu trúc lồng nhau
4. Bài tập

25/06/2023
1. KIỂU DỮ LIỆU CÓ CẤU TRÚC

1.1. Khái niệm


1.2. Khai báo
1.3. Sử dụng typedef
1.4. Thao tác trên kiểu dữ liệu có cấu trúc
1.5 Ví dụ minh họa

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

1.4. Thao tác trên kiểu cấu trúc


• Truy cập biến cấu trúc:
• Dùng toán tử “.” để truy cập các thành viên của một biến cấu
trúc.
• Cú pháp:
• varNames.memberName
• Ví dụ: strcpy(kh1.hoVaTen, “Nguyen Van A”);

25/06/2023
1. KIỂU DỮ LIỆU CÓ CẤU TRÚC

1.4. Thao tác trên kiểu cấu trúc


• Lệnh gán cấu trúc:
• Dùng để gán nội dung trong 1 biến cấu trúc cho một biến cấu trúc
khác có cùng kiểu.
• Ví dụ:
kh2 = kh1;
kh2.namSinh = kh1.namSinh;

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

2.1. Mảng cấu trúc


2.2 Tham số kiểu cấu trúc
2.3 Con trỏ đến cấu trúc

25/06/2023
2. MẢNG CẤU TRÚC

2.1. Mảng cấu trúc


Mảng cấu trúc là một mảng mà mỗi phần tử là một biến kiểu cấu
trúc.
Ví dụ:
struct danhSach{
char hoVaTen[100];
float toan, ly, hoa;
};
danhSach bangDiem[50];// mảng 50 phần tử kiểu danhSach
25/06/2023
2. MẢNG CẤU TRÚC

2.1. Mảng cấu trúc


Sử dụng vòng lặp for để truy cập đến từng phần tử của mảng.
Ví dụ:
for (int i = 0; i < n; i ++){
cout << “Ho va ten sinh vien: ”; gets(bangDiem[i].hoVaTen);
cout << “Diem toan: ”; cin >> bangDiem[i].toan;
cout << “Diem ly: ”; cin >> bangDiem[i].ly;
cout << “Diem hoa: ”; cin >> bangDiem[i].hoa;
}
25/06/2023
2. MẢNG CẤU TRÚC

2.2. Tham số kiểu cấu trúc


+ Truyền thành viên của biến cấu trúc
+ Truyền toàn bộ biến cấu trúc.
+ Có 2 cách truyền:
- Truyền tham trị
- Truyền tham chiếu

25/06/2023
2. MẢNG CẤU TRÚC

2.2. Tham số kiểu cấu trúc


Ví dụ

25/06/2023
2. MẢNG CẤU TRÚC

2.3. Con trỏ đến cấu trúc


+ Một biến con trỏ có thể trỏ đến một biến kiểu cấu trúc
Cú pháp:
structName *structurePointers;
Ví dụ:
struct diem{
float x; float y;
}
diem *p;

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

2.3. Con trỏ đến cấu trúc


Để truy cập đến thành viên của một cấu trúc:
+ Nếu dùng biến cấu trúc thì dùng toán tử “.”
+ Nếu dùng biến con trỏ thì dùng toán tử “->”

25/06/2023
3. CẤU TRÚC LỒNG NHAU

3.1. Khái niệm


3.2. Khai báo
3.3. Thao tác trên 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

3.3. Thao tác trên cấu trúc lồng nhau


khachHang kh1,kh2;
strcpy(kh1.hoVaTen, “Le Thi”);
kh1.ngaySinh.date = 1;
kh2.ngaySinh.year = kh1.ngaySinh.year;

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

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng
dụng trong kỹ thuật:
https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng
với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: T2-1,2,3
 63TĐH2.1: T2-4,5,6
 63KTĐ2.1: T2-7,8,9
 63KTĐ1.1: T2-10,11,12
 63KTĐ3.1: T3-1,2,3
 63TĐH1.2
 63TĐH2.2
3. Điểm danh: https://www.shorturl.at/joDL0
MỤC LỤC

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

1.1. Khái niệm


1.2. Tập tin nhị phân
1.3. Tập tin văn bản
1.4. Xử lý tập tin với fstream

25/06/2023
1. XỬ LÝ TẬP TIN

1.1. Khái niệm


Các loại tập tin:
- Tập tin nhị phân (binary file): dữ liệu ghi trên tập tin theo
các byte nhị phân như trong bộ nhớ.
- Tập tin văn bản (text file): tập tin có cấu trúc như các tập
tin văn bản chuẩn trong Dos, hay tập tin văn bản trong
chương trình soạn thảo notepad của Windows.

25/06/2023
1. XỬ LÝ TẬP TIN

1.2. Tập tin nhị phân (binary file):


- là tập tin trên máy tính, có thể lưu bất kì dạng dữ liệu nào và được
mã hóa dưới dạng nhị phân để lưu trữ.
- các tập tin nhị phân thường gặp trong hệ điều hành Windows có
dạng execute file (*.exe)
- gồm một chuỗi các byte
- có thể chứa phần header, gồm các thông tin quy định cấu trúc dữ liệu
trong tập tin nhị phân đó
- tập tin nhị phân có thể lưu trữ được nhiều dạng dữ liệu như tập tin
văn bản, tập tin nhạc, tập tin hình ảnh,…
25/06/2023
1. XỬ LÝ TẬP TIN

1.3. Tập tin văn bản (text file):


- tập tin lưu trữ dữ liệu dưới dạng kí tự
- tập tin văn bản có cấu trúc gồm nhiều bản ghi (record).
Mỗi bản ghi trong tập tin văn bản được kết thúc bằng kí
tự xuống dòng (newline character – kí tự “\n” trong bảng
mã ASCII).

25/06/2023
1. XỬ LÝ TẬP TIN

1.4. Xử lý tập tin với fstream:


- Quá trình xử lý tập tin bao gồm:
- Mở tập tin
- Đọc tập tin
- Ghi dữ liệu vào tập tin
- Đóng tập tin.
- Thư viện fstream:
- ifstream: đọc tập tin
- ofstream: ghi tập tin
- fstream: đọc và ghi tập tin (thường sử dụng)

25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN

2.1. Mở và đóng tập tin


2.2. Đọc và ghi file nhị phân
2.3. Đọc và ghi file văn bản
2.4. Một số hàm định vị trong file

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

2.1. Mở và đóng tập tin


Đóng file:
- f.close();
- Lưu trữ, bảo toàn dữ liệu đang tiến hành, tránh một số lỗi
không đáng có khi thao tác với file

25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN

2.2. Đọc và ghi file nhị phân


- Nếu mở file mà không ghi rõ chế độ mở file, trình biên dịch sẽ
tự động ở chế độ mở file văn bản (text).
- Muốn mở ở chế độ binary thì cần ghi rõ chế độ ios::binary.
- Nếu mở ở chế độ binary thì phải đọc file theo định dạng
binary.
- Sử dụng hàm write và read để đọc và ghi file dưới dạng binary.

25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN

2.2. Đọc và ghi file nhị phân


- Đọc dữ liệu từ file:
- file.read(address, size):
- address: kiểu dữ liệu char*, là địa chỉ mà dữ liệu sẽ lưu vào sau khi đọc.
- size: kiểu dữ liệu int, số lượng byte mà bộ nhớ đọc vào từ file.
- Ghi dữ liệu vào file:
- file.write(address, size);
- address: Kiểu dữ liệu char*, là địa chỉ vùng nhớ dữ liệu được lưu vào file
- size: kiểu dữ liệu int, số lượng byte vùng nhớ dùng để ghi.

25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN

2.2. Đọc và ghi file nhị phân


1. int main(){
2. fstream file;
3. char a[25] = {'4','2','3','5’}; char b[2];
4. file.open("fileName.dat", ios::out | ios::binary);
5. cout << "Ghi vao file\n";
6. file.write(a,sizeof(a)); file.close();
7.
file.open("fileName.dat", ios::in | ios::binary);
8. cout << "Doc du lieu vao bo nho\n";
9. file.read(b,2); cout << b[0] <<" "; cout << b[1];
10. file.close();
11. return 0;
12. }

25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN

2.2. Đọc và ghi file nhị phân


- Nếu muốn ghi các kiểu khác vào file nhị phân:
reinterpret_cast<dataType>(value)
- dataType: kiểu dữ liệu muốn ghi
- value: giá trị muốn ép
Ví dụ:
int x=1;
file.write(reinterpret_cast<char *>(&x), sizeof(x));

25/06/2023
2. CÁC HÀM XỬ LÝ TRÊN TẬP TIN

2.2. Đọc và ghi file nhị phân


1. int main(){
2. fstream file;
3. int a[5] = {1, 2, 3, 4, 5};
4. file.open("fileName.dat", ios::out | ios::binary);
5. cout << "Ghi vao file\n";
6. file.write(reinterpret_cast<char *>(a),sizeof(a));
7. file.close();
8. file.open("fileName.dat", ios::in | ios::binary);
9. int b[5];
10. cout << "Doc du lieu vao bo nho\n";
11. file.read(reinterpret_cast<char *>(b),sizeof(b));
12. for (int i = 0; i < 5; i++){ cout << b[i] << " "; }
13. file.close();
14. return 0;
15. }

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


Đọc dữ liệu từ file:
- fileName >> data
- fileName: tên file
- data: tên biến lưu trữ dữ liệu: int, float, long, char…
- Nếu dữ liệu và biến có kiểu dữ liệu khác nhau:
- Biến dữ liệu kiểu số không đọc vào kiểu kí tự
- Biến dữ liệu kiểu số được tự động chuyển qua lại giữa các kiểu như float
sang int hoặc ngược lại.

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


Ghi dữ liệu vào file:
- fileName << data
- fileName: tên file
- data: tên biến dữ liệu cần ghi vào file. Các kiểu khác nhau: int, float,
long…
- Thư viện fstream hỗ trợ ghi dữ liệu char, int, long. Tuy nhiên không hỗ
trợ ghi dữ liệu có cấu trúc (struct)
- Cũng có thể dùng hàm get và getline để lấy thông tin từ file.

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


Kiểm tra kết thúc file:
fileName.eof(): kiểm tra xem đã kết thúc file chưa.
Ví dụ:

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

2.4. Hàm định vị file


Ví dụ:
- fileName.seekg(0): đến đầu file (vị trí 0).
- fileName.seekg(n): đến byte thứ n kể từ vị trí 0.
- fileName.seekg(n, ios::cur): tiến n byte từ vị trí hiện tại.
- fileName.seekg(n, ios::end): lùi n byte kể từ cuối file.
- fileName.seekg(0, ios::end): đến cuối file.
- fileName.tellg(): lấy vị trí đọc hiện tại.

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

3.1 Viết chương trình đọc file maTran.txt có nội dung:


3
1 2 3
4 5 6
7 8 9
Trong đó 3 là kích thước ma trận
+ Xuất nội dung ma trận ra màn hình
+ Sắp xếp ma trận theo thứ tự ngược lại: giảm dần
+ Ghi ma trận vào file maTranMoi.txt

25/06/2023
3. BÀI TẬP

3.2 Viết chương trình đọc file văn bản


- Yêu cầu nhập một chuỗi tìm kiếm cho đến khi nhập kí tự 0
là kết thúc
- Tìm trong chuỗi vừa nhập có trong file vừa đọc hay không
(vanBan.txt)
- Nếu có thì xuất kết quả.
- Nếu không có thì lưu chuỗi nhập vào file mới (vanbanMoi.txt)

25/06/2023
3. BÀI TẬP

3.3 Viết chương trình quản lý thuê phòng


Yêu cầu:
- Nhập khách thuê
- Số ngày thuê:
- Thuê 6 ngày trở lên thì được giảm giá 10%
- Loại phòng cho thuê:
- Loại 1: 300 000 vnđ/ngày
- Loại 2: 200.000 vnđ/ngày
- Loại 3: 100 000 vnđ/ngày
- Xuất danh sách khách đã thuê và số tiền thanh toán
- Lưu tất cả dữ liệu vào file.

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

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng
dụng trong kỹ thuật:
https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng
với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: T2-1,2,3
 63TĐH2.1: T2-4,5,6
 63KTĐ2.1: T2-7,8,9
 63KTĐ1.1: T2-10,11,12
 63KTĐ3.1: T3-1,2,3
 63TĐH1.2: T5-1,2,3
 63TĐH2.2: T5-4,5,6
3. Điểm danh: https://www.shorturl.at/joDL0
MỤC LỤC

1. Cải tiến giải thuật


2. Tinh chỉnh mã nguồn

25/06/2023
1. CẢI TIẾN GIẢI THUẬT

1. Thêm thành viên trong cấu trúc


2. Khởi tạo dữ liệu
3. Đơn giản hóa
4. Kỹ thuật ngừng giải thuật
5. Tránh dùng đệ quy
6. Loại bỏ kiểm tra giá trị

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

 Khởi tạo dữ liệu từ trước để giảm thiểu tính toán


 Ví dụ: định nghĩa trước một số giá trị của hàm giai thừa
int giaiThua(int n){
a[6] = {1,1,2,6,24,120};
if (n < 6) return a[n];
else return n * giaiThua(n-1);
}

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

 Khi cần thiết có thể ngừng giải thuật


 Ví dụ: tìm x có xuất hiện trong mảng không?
int search (int x, int a[], int n){
for (int i = 0; i < n; i++){
if (x == a[i]) return i;
}
return -1;
}

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Ị

 Loại bỏ việc kiểm tra 0 (false)


if (x==1) -> if (x)
if (x==0) -> if (!x)
if (pointer != NULL) -> if (pointer)
if (ch == ‘\0’) -> if (!ch)

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

 Gom các vòng lặp


 Ví dụ 3:
for (int i = 0; i < n; i++) a[i] = 0;
for (int i = 0; i < n; i++) b[i] = 0;

for (int i = 0; i < n; i++) {


a[i] = b[i] = 0;
}

25/06/2023
2.2. BIỂU THỨC ĐIỀU KIỆN

 Ưu tiên các trường hợp thường xuyên xảy ra


 Ví dụ 1:
if (key > a) {…} // thường xảy ra
else if (key < a) {…}
else {…}
 Ưu tiên giải quyết các tình huống đơn giản
 Ví dụ 2:
if (x!=0 && f(x) !=0) {…}

25/06/2023
2.3. BIỂU THỨC

 Đơn giản các biểu thức tính toán


 (a&&b)||(a&&c) -> a&&(b||c)
 (a||b)&&(a||c) -> a||(b&&c)
 Cải tiến tính toán các biến logic
 Ví dụ:
if (x>y) flag = 1;
else flag = 0;

flag = x > y;

25/06/2023
2.3. BIỂU THỨC

 Sử dụng toán tử bit để tính toán nhanh hơn:


 x + x -> x << 1 (dịch bit đi 1 vị trí sang trái)

25/06/2023
2.4. HÀM

 Tránh việc ép kiểu không cần thiết của các tham số


 Tránh truyền tham trị là cấu trúc cho các hàm vì cần sao
chép cấu trúc. Thay vào đó nên dùng con trỏ của cấu trúc

25/06/2023
2.4. HÀM

 Ví dụ:
struct Node{
int data, index;
}
void visit (Node p){
printf(“%d\n”, p.data);
}

void visit (Node* p){


printf(“%d\n”, p->data);
}

25/06/2023
2.4. HÀM

 Đổi sang #define để giảm chi phí gọi và trả về từ hàm


int max (int a, int b){
return a>b ? a: b;
}
#define max(a,b) ((a) > (b)) ? (a) : (b);

25/06/2023
3. BÀI TẬP

1. Viết chương trình trò chơi dò mìn:


 Gợi ý:
 Khởi tạo bãi mìn là một ma trận
 Khởi tạo số lượng mìn có trên ma trận
 Vẽ bãi mìn ra màn hình
 Tại mỗi vị trí, đếm số mìn xung quanh
 Cập nhật bãi mìn khi người dùng mở một ô nào đó.
 Nếu người dùng mở một trái mìn thì chương trình kết thúc.

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

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng
dụng trong kỹ thuật:
https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng
với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: T2-1,2,3
 63TĐH2.1: T2-4,5,6
 63KTĐ2.1: T2-7,8,9
 63KTĐ1.1: T2-10,11,12
 63KTĐ3.1: T3-1,2,3
 63TĐH1.2: T5-1,2,3
 63TĐH2.2: T5-4,5,6
3. Điểm danh: https://www.shorturl.at/joDL0
MỤC LỤC

1. Lập trình hướng đối tượng


2. Một số mở rộng của C++
3. Lớp và đối tượng trong C++

25/06/2023
1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

1.1. Khái niệm về lập trình hướng đối tượng


1.2. Đặc tính
1.3. Một số khái niệm
1.4. Ưu điểm

25/06/2023
1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

1.1. Khái niệm


Lập trình hướng đối tượng đặt trọng tâm vào đối tượng. Dữ
liệu được gắn chặt với các hàm thành các vùng riêng mà chỉ
có hàm đó tác động lên và cấm các hàm bên ngoài truy
nhập tới một cách tùy tiện.

25/06/2023
1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

1.2. Đặc tính:


+ Tập trung vào dữ liệu thay cho các hàm
+ Chương trình được chia thành các đối tượng.
+ Các cấu trúc dữ liệu được thiết kế sao cho đặc tả được đối tượng.
+ Các hàm thao tác trên các vùng dữ liệu của đối tượng được gắn với cấu trúc dữ liệu
đó.
+ Dữ liệu được đóng gói lại, được che giấu và không cho phép các hàm ngoại lai truy
cập tự do.
+ Các đối tượng tác động và trao đổi thông tin với nhau qua các hàm.
+ Có thể dễ dàng bổ sung dữ liệu và các hàm mới vào đối tượng nào đó khi cần thiết.
+ Chương trình được thiết kế theo cách tiếp cận từ dưới lên (bottom-up).

25/06/2023
1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

1.3. Một số khái niệm


Đối tượng (object): là sự kết hợp giữa dữ liệu và thủ tục thao tác trên
dữ liệu đó.
Lớp (class): là một tập các đối tượng có cấu trúc dữ liệu và các phương
thức giống nhau.
Tính kế thừa (inheritance): cho phép định nghĩa một lớp mới trên cơ sở
các lớp đã tồn tại, có thể bổ sung các phương thức và các thành phần
dữ liệu mới.
Tính đa hình (polymorphism): là một khái niệm quan trọng trong lập
trình hướng đối tượng. Sẽ được giải thích ở phần sau.

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++

2.1. Hàm inline


2.2. Tham chiếu
2.3. Hàm chồng

25/06/2023
2. MỘT SỐ MỞ RỘNG CỦA C++

2.1. Hàm inline


Được định nghĩa và sử dụng giống như hàm bình thường. Chỉ khác ở phần mô tả có từ khóa inline:
Ví dụ:
inline double norme(double vecto[3]);
inline double norme(double vecto[3]){
double s =0;
for (int i = 0; i < 3; i++){
s+=vecto[i]*vecto[i];
}
return (sqrt(s));
}

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++

2.2. Tham chiếu


+ Tham chiếu tới một biến
Ví dụ:
int n;
int &p = n; // vùng nhớ cấp phát cho n
Rất giống con trỏ. Tuy nhiên tham chiếu chỉ dùng để gán với
một biến. Con trỏ có thể tham chiếu đến nhiều biến khác nhau.

25/06/2023
2. MỞ RỘNG CỦA C++

2.2. Tham chiếu


+ Truyền tham số cho hàm bằng tham chiếu
+ Giá trị trả về của hàm là tham chiếu:
Ví dụ: https://onlinegdb.com/S4OsY4HPd

25/06/2023
2. MỞ RỘNG CỦA C++

2.3. Hàm chồng (Overloading functions)


C++ cho phép sử dụng một tên cho nhiều hàm khác nhau.
Ví dụ: https://onlinegdb.com/WmSOMgKeu

25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++

3.1. Lớp (Class)


3.2. Biến và mảng đối tượng
3.3. Con trỏ đối tượng
3.4. Con trỏ this
3.5. Hàm bạn
3.6. Toán tử

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++

3.1 Lớp (Class)


private: chỉ sử dụng bên trong lớp. Các hàm không phải
phương thức của lớp không được sử dụng các thành phần
private.
public: các thành phần này được sử dụng cả ở bên trong và
bên ngoài lớp

25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++

3.1 Lớp (Class)


Ví dụ: https://onlinegdb.com/JZYsHLPkp

25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++

3.2 Biến, mảng đối tượng


Khi một lớp được định nghĩa, không có bộ nhớ nào được
cấp phát. Để sử dụng các biến và các hàm trong lớp, cần
phải tạo các đối tượng.
Cú pháp
sinhVien sv[50];

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++

3.3 Con trỏ đối tượng


Sử dụng thuộc tính:
 Sử dụng toán tử -> hoặc . để truy cập tới thuộc tính của
đối tượng.
Ví dụ:
sv1->maSinhVien;
s1.diemToan;

25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++

3.4 Con trỏ this


Con trỏ this tham chiếu đến đối tượng đang gọi hàm thành
phần.
Ví dụ:
this->maSinhVien;

25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++

3.5 Hàm bạn


Hàm bạn (friend) của một lớp là hàm có thể truy cập vào các
thành viên của lớp.
Một hàm bạn có thể là bạn của nhiều lớp khác nhau.

25/06/2023
3. LỚP VÀ ĐỐI TƯỢNG TRONG C++

3.5 Hàm bạn


Ví dụ: https://onlinegdb.com/cmOzEmpIY

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

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng
dụng trong kỹ thuật:
https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng
với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: T2-1,2,3
 63TĐH2.1: T2-4,5,6
 63KTĐ2.1: T2-7,8,9
 63KTĐ1.1: T2-10,11,12
 63KTĐ3.1: T3-1,2,3
 63TĐH1.2: T5-1,2,3
 63TĐH2.2: T5-4,5,6
3. Điểm danh: https://www.shorturl.at/joDL0
MỤC LỤC

1. Hàm tạo, hàm hủy và các vấn đề khác


2. Dẫn xuất và thừa kế

25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC

1.1. Hàm tạo (Constructor)


 là một phương thức đặc biệt của lớp, dùng để tạo dựng
một đối tượng mới.
 Đặc điểm:
 Trùng tên của lớp.
 Không khai báo kiểu cho hàm tạo.
 Không có kết quả trả về.
 Có thể có nhiều hàm tạo (khác tham số vào)

25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC

1.1. Hàm tạo


Ví dụ: https://onlinegdb.com/Q63qso1hm

25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC

1.2. Hàm copy constructor


Tạo ra đối tượng mới dựa trên thông số của đối tượng đã
có.
Ví dụ: https://onlinegdb.com/QRzbZp_b4

25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC

1.3. Hàm hủy


 Là một hàm thành viên của lớp có chức năng ngược với
hàm tạo. Dùng để giải phóng bộ nhớ trước khi đối tượng
được hủy bỏ.
 Đặc điểm:
 Không có giá trị trả về.
 Tên: ~ và tên lớp.
 Không có tham số vào.

25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC

1.3. Hàm hủy


 Hàm hủy mặc định:
 Nếu không định nghĩa thì hàm hủy mặc định được phát sinh.
 Các hành động thường thấy trong hàm hủy:
 Các toán tử và các hàm giải phóng bộ nhớ như delete, free…
 Giải phóng các biến cục bộ khi thoát khỏi hàm
 Ví dụ: https://onlinegdb.com/EX4x1uRFn

25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC

1.4. Thành phần tĩnh (static)


 Thành phần dữ liệu chung cho cả lớp, không phải của
riêng một đối tượng nào
 Các cách viết tương đương:
 ten_lop::bien
 ten_doi_tuong.bien
 Ví dụ: https://onlinegdb.com/prgmtY_zTC

25/06/2023
1. HÀM TẠO, HÀM HỦY VÀ CÁC VẤN ĐỀ KHÁC

1.5. Lớp bạn


 Các lớp bạn đều có thể truy cập đến các thành phần riêng
của lớp bạn.
 Ví dụ: https://onlinegdb.com/hapUFTUXV

25/06/2023
2. DẪN XUẤT VÀ THỪA KẾ

2.1. Khái niệm


 Một lớp được xây dựng thừa kế một lớp khác gọi là dẫn xuất.
Lớp dùng để xây dựng lớp dẫn xuất gọi là lớp cơ sở.
 Bất kì lớp nào cũng có thể là lớp cơ sở.
 Một lớp có thể là cơ sở cho nhiều lớp dẫn xuất khác nhau.
 Một lớp là dẫn xuất vẫn có thể là lớp cơ sở để xây dựng lớp dẫn
xuất khác.
 Một lớp có thể dẫn xuất từ nhiều lớp cơ sở.

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Ế

2.3. Ví dụ: https://onlinegdb.com/N11_V1hOMW

25/06/2023
2. DẪN XUẤT VÀ THỪA KẾ

2.4. Sửa đổi, bổ sung, nâng cấp chương trình


 Khi đã có một chương trình hoạt động tốt.
 Cần phải bổ sung một số tính năng:
 Giải pháp 1: Sửa chữa các lớp và đối tượng trong chương trình
 Giải pháp 2: Xây dựng một lớp dẫn xuất để thực hiện các tính năng
bổ sung.

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

1. Tài liệu tham khảo:


 Lê Trung Dũng, Bài giảng môn Lập trình ứng
dụng trong kỹ thuật:
https://www.shorturl.at/iGIPZ
 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++.
 Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức,
Nguyễn Thanh Thủy. Lập trình hướng đối tượng
với C++.
GIỚI THIỆU CHUNG
2. Lớp học:
 63TĐH1.1: T2-1,2,3
 63TĐH2.1: T2-4,5,6
 63KTĐ2.1: T2-7,8,9
 63KTĐ1.1: T2-10,11,12
 63KTĐ3.1: T3-1,2,3
 63TĐH1.2: T5-1,2,3
 63TĐH2.2: T5-4,5,6
3. Điểm danh: https://www.shorturl.at/joDL0
MỤC LỤC

1. Tính đa hình (polymorphism)


2. Khuôn hình

25/06/2023
1. TÍNH ĐA HÌNH

1.1 Phương thức tĩnh


1.2 Hàm ảo
1.3 Lớp cơ sở trừu tượng
1.4 Sử dụng tương ứng bội và phương thức ảo

25/06/2023
1. TÍNH ĐA HÌNH

1.1. Phương thức tĩnh


Quy tắc sử dụng
 Lời gọi hàm từ một đối tượng của lớp nào thì phương
thức lớp đó sẽ được gọi.
 Nếu lời gọi hàm xuất phát từ một con trỏ kiểu lớp nào thì
phương thức của lớp đó sẽ được gọi, bất kể con trỏ chứa
địa chỉ của đối tượng nào

25/06/2023
1. TÍNH ĐA HÌNH

1.1. Phương thức tĩnh


Ví dụ: https://onlinegdb.com/TSuLWFdOx

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

1.4. Sử dụng tương ứng bội và phương thức ảo


 Xây dựng lớp cơ sở trừu tượng bao gồm các thuộc tính chung
nhất. Đưa vào các phương thức ảo để xây dựng các nhóm
phương thức ảo cho các lớp dẫn xuất sau này.
 Xây dựng các lớp dẫn xuất bắt đầu từ lớp cơ sở trừu tượng.
 Xây dựng các phương thức ảo trong các lớp dẫn xuất
 Xây dựng các lớp quản lý các đối tượng. Dữ liệu của lớp này là
một dãy con trỏ của lớp cơ sở trừu tượng ban đầu.

25/06/2023
1. TÍNH ĐA HÌNH

1.4. Sử dụng tương ứng bội và phương thức ảo


Ví dụ: https://onlinegdb.com/24Px0CYXP

25/06/2023
2. KHUÔN HÌNH

2.1 Khuôn hình hàm


2.2 Khuôn hình lớp

25/06/2023
2. KHUÔN HÌNH

2.1 Khuôn hình hàm


Vấn đề: Hàm chồng cho phép định nghĩa một tên hàm duy
nhất cho nhiều hàm cùng thực hiện một nhiệm vụ với nhiều
kiểu dữ liệu. Tuy nhiên, sẽ điều này dẫn đến việc thực hiện
định nghĩa nhiều hàm chỉ dành cho một mục đích.
Khuôn hình hàm cho phép viết định nghĩa hàm một lần, sau
đó chương trình biên dịch sẽ làm cho hàm thích ứng với các
kiểu dữ liệu khác nhau.

25/06/2023
2. KHUÔN HÌNH

2.1 Khuôn hình hàm


Cú pháp:
template<class A> A minValues(A &a, A &b){
return (a<b?a:b);
}
template<class B> void swapValues(B &a, B &b){
B c = a; a = b; b = c;
}
Ví dụ: https://onlinegdb.com/K6jgv3Eyj

25/06/2023
2. KHUÔN HÌNH

2.2 Khuôn hình lớp


Tương tự như khuôn hình hàm, khuôn hình lớp cho phép
định nghĩa một lần rồi sau đó áp dụng cho các kiểu dữ liệu
khác nhau.
Ví dụ: https://onlinegdb.com/gqVNdAfOh

25/06/2023
3. BÀI TẬP

1. Sử dụng khái niệm hàm ảo để phát triển ví dụ https://onlinegdb.com/UDTsC939-o


để có thể hiển thị thêm trường “Quê quán”
2. Sử dụng khái niệm phương thức bội để phát triển ví dụ:
https://onlinegdb.com/24Px0CYXP để có thể có thêm lớp sinhVienNgoaiNgu và
quản lý diemNgoaiNgu
3. Sử dụng khuôn hình hàm để viết chương trình tính toán:
a) Tính giá trị lớn nhất giữa 2 số.
b) Tính giá trị trị tuyệt đối của 1 số.
4. Sử dụng khuôn hình lớp để viết chương trình nhập tọa độ 1 điểm và hiển thị tọa độ điểm
đó ra màn hình.
5. Sử dụng khuôn hình lớp để viết chương trình nhập tọa độ 2 điểm và hiển thị độ dài đoạn
thẳng giữa hai điểm.

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;

printf("Tong binh phuong cac so le la: %d", s);

getch();

//Bai2 Tìm max của 3 số a,b,c nhập từ bàn phím

#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;

printf("gia tri lon nhat la: %d",max);

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

printf("Nhap a,b = ");

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;

printf("Uoc chung lon nhat la %d",a);

printf("\nBoi chung nho nhat la %d",(x*y)/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;

printf("Nhap mot so nguyen duong \n");

scanf("%d", &x);

for(i=1;i<x;i++)

if(x%i== 0)

s=s+i;

if(s==x)

printf("%d la so hoan hao",x);

else
{

printf("%d khong phai la so hoan hao",x);

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)

printf("%d la so chinh phuong",x);

}
else

printf("%d khong phai la so chinh phuong",x);

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

Viết chương trình tính:

S = 1+ x + 2x2 + 3x3 + ... + n xn

Với x là số thực, n là số nguyên được nhập từ bàn phím.

#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);

printf(" Gia tri tinh duoc la:%0.2f ", s);

getch();

Bài 9

Viết chương trình tính giá trị của biểu thức sau:

S(n) = 1 + 3 + 5 + … +(2n+1), với n bất kỳ nhập từ bàn phím.

#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;

printf("Gia tri bieu thuc la: %d ", s);

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:

S = 2 x2 y + 1 -|x-1| nếu x > y

= 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);
}

printf ("\n gia tri tinh duoc la %f",s);

getch();

BÀI TẬP PHẦN MẢNG 1 CHIỀU bài 11 đến bài 16

Bài 11

Nhập vào 1 dãy số nguyên. Hiển thị dãy số đó ra màn hình.

#include<stdio.h>

#include<conio.h>

main()

int a[50];

int i,n;

printf("Nhap so phan tu mang: ");

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

printf("\nMang vua nhap la:");

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;

printf("Nhap so luong phan tu:");

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

printf("\nCac so nguyen to co trong mang va vi tri cac so do trong mang la:");

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)

printf("\nso nguyen to %d vi tri %d trong mang ", a[i], i );

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

Tính tổng và trung bình cộng các số có trong dãy.

#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("\nSo lon nhat =%d",max);

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);

//sap xep day so theo thu tu tang 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;

printf("\nday so sau khi sap xep la:");

for(i=0;i<n;i++)

printf("%6d",a[i]);

//Tinh tong va trung binh cong cac so trong day

for(i=0;i<n;i++)

s=s+a[i];

printf("\nTong cac so trong day la: %d",s);

printf("\nTrung binh cong cac so trong day la: %f", (float)s/n);

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

Đưa ra màn hình các số chẵn và vị trí số chẵn đó trong dãy

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()

int a[30],i,j, n,tg,v,x;

printf("Nhap vao so phan tu: ");

scanf("%d", &n);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

//hien thi ra man hinh day so vua nhap

printf("day so vua nhap la:");

for(i=0;i<n;i++)

printf("%5d",a[i]);
}

//dua ra man hinh cac so chan va vi tri trong day

printf("\nCac so chan trong day va vi tri cac so do trong day la:");

for(i=0;i<n;i++)

if(a[i]%2==0)

printf("\nso %d dung thu %d trong day", a[i], i+1);

// 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;

printf("\nDay so sau khi sap xep la:");

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)

printf("\nNhap gia tri can chen X:");

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;

printf("\n Day so sau khi chen la:");

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.

Xóa tất cả các số âm có trong dãy.

#include<stdio.h>

#include<conio.h>

main()

int i, j, n,a[50],s=0;

printf("Nhap vao so phan tu ");

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];

printf("Tong cac so duong trong day la:%d",s );

// Xoa tat ca cac so am trong day

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;

printf("\n Day so sau khi xoa la:");

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;

printf("Nhap vao so phan tu: ");

scanf("%d", &n);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

// in ra man hinh trung binh cong cac so chia het cho 3

for(i=0;i<n;i++)

if(a[i]%3==0)

t=t+a[i];

d=d+1;

if(d==0)

printf("khong co so chia het cho 3 trong day");

else

printf("TBC so chia het cho 3 trong day la %f", (float)t/d);

}
// chen so x vao vi tri thu k trong day

printf("\nNhap gia tri va vi tri can chen x,k= ");

scanf("%d%d", &x,&k);

for(i=n-1;i>=k;i--)

a[i+1]=a[i];

a[k]=x;

printf("\n Day so sau khi chen la:");

for(i=0;i<n+1;i++)

printf("%5d", a[i]);

getch();

BÀI TẬP MẢNG MA TRẬN ( MẢNG 2 CHIỀU ) bài 17 đến 21

Bài 17

Nhập vào ma trận nxm.

Hiển thị ra ma trận vừa nhập

#include<stdio.h>

#include<conio.h>
main()

int a[50][50];

int i,j,m,n;

printf("nhap so hang n="); scanf("%d",&n);

printf("nhap so cot m="); scanf("%d",&m);

printf("nhap vao ma tran:\n");

for(i=0;i<n;i++)

for(j=0;j<m;j++)

scanf("%d",&a[i][j]);

printf("ma tran vua nhap la:\n");

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

Tim giá trị lớn nhất trên cột 1của ma trận

#include<stdio.h>

#include<conio.h>

main()

int a[50][50];

int i,j,m,n;

printf("nhap so hang n="); scanf("%d",&n);

printf("nhap so cot m="); scanf("%d",&m);

printf("nhap vao ma tran:\n");

for(i=0;i<n;i++)

for(j=0;j<m;j++)

scanf("%d",&a[i][j]);

//hien thi ma tran vua nhap duoi dang bang

printf("ma tran vua nhap la:\n");


for(i=0;i<n;i++)

for(j=0;j<m;j++)

printf("%d ",a[i][j]);

printf("\n");

// tinh tong pt tren hang chan cua mang

float s=0;

for(i=0;i<n;i=i+2)

for(j=0;j<m;j++)

s=s+a[i][j];

printf("\nTong pt tren hang chan cua mang la: %5f",s);

// tim max tren cot 1 cua mang

int max;

max=a[0][0];

for(i=1;i<n;i++)

if(a[i][0]>max)

{
max=a[i][0];

printf("\nGia tri max tren cot 1 cua mang la %5d",max);

getch();

Bài 19

Nhập 2 ma trận m x n số nguyên. Tính tổng 2 ma trận

#include<stdio.h>

#include<conio.h>

main()

int a[10][10],b[10][10],c[10][10];

int i,j,m,n;

printf("nhap so hang m="); scanf("%d",&m);

printf("nhap so cot n="); scanf("%d",&n);

printf("nhap vao ma tran:\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];

printf("\nMa tran sau cong:\n");

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];

int i,j,n, max;

printf("Nhap n= ");

scanf("%d", &n);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);

//tim phan tu lon nhat tren duong cheo chinh

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);

// kiem tra ma tran vua nhap co phai ma tran don vi

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)

printf("\nla ma tran don vi");

else
{

printf("\nkhong phai la ma tran don vi");

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.

Đưa ra màn hình tổng các phần tử trong ma trận

Tim giá trị lớn nhất trong mảng.

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;

printf("nhap so hang n="); scanf("%d",&n);

printf("nhap so cot m="); scanf("%d",&m);


printf("nhap vao ma tran:\n");

for(i=0;i<n;i++)

for(j=0;j<m;j++)

scanf("%d",&a[i][j]);

// in ra ma tran vua nhap duoi dang bang

printf("ma tran vua nhap la:\n");

for(i=0;i<n;i++)

for(j=0;j<m;j++)

printf("%d ",a[i][j]);

printf("\n");

//sap xep hang 2 trong mang theo chieu giam dan

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;

printf("\nma tran vua sap xep hang 2 la\n");

for(j=0;j<m;j++)

printf("%5d",a[1][j]);

// Dua ra man hinh tong cac phan tu ma tran

int s=0;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

s=s+a[i][j];

printf("\ntong cac phan tu la: %d",s);

// gia tri nho nhat chia het cho 3 trong mang

int min, kt=0;

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++)

for(j=0; j<m; j++)

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>

using namespace std;

// Kiem tra 1 so co phai la so chinh phuong ko

// So chinh phuong la y = x^2

/*

int x,y;

cin >> x;

y = sqrt(x);

if(x == y*y){

cout << x << " la so chinh phuong";

}else {

cout << x << " khong la so chinh phuong";

} }*/

// Bang cuu chuong

/*int main(){

int n; cin >> n;

for(int i = 1; i <= 10; i++){

cout << n << "x" << i << "=" << n * i << endl;

}
} */

//Tinh tong cac chu so

/*int main(){

int n; cin >> n;

int tong = 0;

while(n != 0){

tong += n % 10;

n /= 10;

cout << tong;

}*/

// Kiem tra so nguyen to

/*

int nt(int n){

if(n<2)

return 0;

for(int i =2; i <= sqrt(n); i ++){

if(n % i == 0){

return 0;

}
return 1;

int main(){

int n; cin >> n;

if(nt(n)){

cout << "Yes";

}else{

cout << "No";

} */

// Tim UCLN va BCNN

/*

int gcd(int a, int b){

if(b == 0)

return a;

return gcd(b, a % b);

int lcm(int a, int b){

return (a*b)/gcd(a,b);

int main(){

int a,b;

cin >> a >> b;

cout << gcd(a,b) << endl;


cout << lcm(a,b) << endl;

return 0;

}*/

// Tim phan tu lon nhat cua mang

/*int main(){

int n; cin >> n;

int a[n];

for(int i = 0; i < n; i++){

cin >> a[i];

int max = a[0];

for(int i = 1; i > n ; i++){

if(a[i] > max){

max = a[i];

cout << max;

}*/

// Tim phan tu nho nhat cung tuong tu

// Tim tong cac chu so chan trong mang

/*int main(){

int n; cin >> n;


int sum = 0;

int a[n];

for(int i = 0; i < n; i++){

cin >> a[i];

if(a[i] % 2 == 0){// Tim tong so le bang cach doi == thanh !=

sum += a[i];

cout << sum;

} */

// Giai phuong trinh ax + b = 0

/*int main(){

int a,b;

float x;

cin >> a >> b;

if(a == 0){

if(b == 0){

cout << " Vo so nghiem";

} else{

cout << " Vo nghiem";

}}

else if(a != 0){

x = -b / (float)a;
cout << x;

}*/

// S = -3/2 + 0 + ... + n^2 - 4 / n + 1

/*int main(){

int n;

cin >> n;

float s = 0;

int i = 1;

while(i <= n){

s += (pow(i,2.0) - 4.0) / (i + 1.0);

i++;

}cout << s;

} */

// Giai phuong trinh ax^2 + bx + c = 0

/*int main(){

int a,b,c;
cin >> a >> b >> c;

float x , x1 , x2;

float delta;

if(a,b,c != 0){

delta = pow(b,2.0) - (4*a*c);

if(delta < 0){

cout << " Pt vo nghiem";

}else if(delta == 0){

x1 = x2 = -b/ (2.0*a);

cout << x1 << endl;

cout << x2 ;

}else{

x1 = (-b + sqrt(delta)) / (2.0*a);

x2 = (-b - sqrt(delta)) / (2.0*a);

cout << x1 << endl;

cout << x2;

if(b == 0){

x = -c / a;

if(x > 0){

x1 = sqrt(x);

x2 = -sqrt(x);

cout << x1 << endl;

cout << x2 ;
}else if(x == 0){

x1 = x2 = 0;

cout << x1 << endl;

cout << x2;

}else {

cout << " Pt vo nghiem";

if(c == 0){

x1 = 0;

x2 = -b / a;

cout << x1 << endl;

cout << x2;

} */

/*

// Ham kiem tra so hoan hao

bool perfect(int n){

int sum = 0;

for(int i = 1; i < n; i++){

if(n % i == 0){

sum += i;

return n == sum;
}

// Ham in ra so hoan hao nho hon n

int main(){

int n;

cin >> n;

for(int i = 1; i < n; i++){

if(perfect(i) == 1){

cout << i;

return 0;

}*/

/*

// Ham kiem tra so nguyen to

bool nt(int n){

for(int i = 2; i <= sqrt(n); i++){

if(n % i ==0)

return 0;

return 1;

// Ham tong cac so nguyen to

int Tong1(int n){


int Tong1 = 0;

for(int i = 2; i <= sqrt(n); i++){

if(nt(i) == 1){

Tong1 += i;

} return Tong1;

// Ham in ra so nguyen to tu 2 den n

int main(){

int n;

cin >> n;

for(int i = 2; i <= sqrt(n); i++){

if(nt(i) == 1){

cout << i << endl;

int sum = Tong1(n);

cout << sum;

return 0;

}*/

/*int main(){

int n,m;

cin >> n >> m;


int a[100][100];

for(int i = 0 ; i < n; i++){

for(int j = 0 ; i < m; j++){

cin >> a[i][j];

for(int i = 0; i < n; i++){

for(int j = 0; j < m ; j++){

cout << a[i][j] ;

cout << endl;

return 0;

}*/

// Mang 2 chieu

/*int main(){

int n,m;

cin >> n >> m;

char c[100][100];

for( int i = 0; i < n; i++){

for(int j = 0; j < m; j++){

cin >> c[i][j];

}
for(int i = 0; i < n; i++){

for(int j = 0; j < m; j++){

cout << c[i][j];

}cout << endl;

}*/

// Con tro

/*int main(){

int a = 1000;

int *ptr;

ptr = &a;

cout << ptr << endl;

cout << &a << endl;

(*ptr)++;

cout << a ;

return 0;

}*/

// Sap xep sinh vien theo diem gpa tang dan

struct sv{

string msv, ten;

double gpa;

bool operator < (const sv other){

return gpa < other.gpa;


}

};

int main(){

int n; cin >> n;

sv ds[n];

for( int i = 1; i< n ; i++){

cin >> ds[i].msv; cin.ignore();

getline(cin, ds[i].ten);

cin >> ds[i].gpa;

sort(ds, ds+n);

for(sv x : ds){

cout << x.msv << " " << x.ten << " " << x.gpa << endl;

You might also like