2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
2.6. Sắp xếp
Minh họa thuật toán
i=1
i=2
j=2
i=3
j=3
i=4
j=4
i=5
j=5
i=6
j=6
i=7
j=7
2 8 5 1 6 4 12
24
24
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
HoanVi(a[i], a[j]);
int tam = a;
a = b;
b = tam;
for(int j = i+1; j < n; j ++)
if (a[i] > a[j]) for (int i = 0; i < n-1; i ++)
Mẫu phương thức sắp thứ tự tăng:
void SapTang(int a[], int n){
}
void HoanVi(int &a, int &b){
}
25
25
3. MẢNG 2 CHIỀU
3.1 Giới thiệu
Mảng hai chiều thực chất là mảng một chiều trong đó
mỗi phần tử của mảng là một mảng một chiều, và
được truy xuất bởi hai chỉ số dòng và cột.
Từ khái niệm trên ta có thể đưa ra một khái niệm về
mảng nhiều chiều như sau: mảng có từ hai chiều
trở lên gọi là mảng nhiều chiều.
26
3. MẢNG 2 CHIỀU
3.2. Khai báo
Cách 1:
int A[5][10]; // Khai báo mảng int gồm 5 dòng, 10 cột
float b[7][8]; // Khai báo mảng float gồm 7 dòng, 8 cột
// Khai báo mảng động 2 chiều kiểu int
27
< Kiểu dữ liệu > < Tên mảng > [< Số dòng][];
Ví dụ:
Cách 2 :
< Kiểu dữ liệu > **;
Ví dụ : int **A ;
float **B ; // Khai báo mảng động 2 chiều kiểu float
3. MẢNG 2 CHIỀU
3.3. Truy xuất
Để truy xuất các thành phần của mảng hai chiều ta
phải dựa vào chỉ số dòng và chỉ số cột.
Với các khai báo như trên ta có:
Ví dụ: int A[3][4] = { {2,3,9,4} , {5,6,7,6} , {2,9,4,7} };
A[0][0] = 2; A[0][1] = 3;
A[1][1] = 6; A[1][3] = 6;
28
3. MẢNG 2 CHIỀU
3.4. Các thao tác
Nhập/ xuất
Tìm kiếm
Đếm
Tính tổng/ trung bình
Sắp xếp dòng/ cột
Xóa dòng/ cột
Chèn thêm dòng/ cột
29
3. MẢNG 2 CHIỀU
3.4. Ma trận vuông
Số dòng = Số cột
Đường chéo chính của ma trận vuông:
chỉ số dòng = chỉ số cột
Đường chéo phụ của ma trận vuông:
chỉ số cột + chỉ số dòng = kích thước - 1
Chéo chính
30
Chéo phụ
4. CHUỖI KÝ TỰ
4.1. Giới thiệu
Chuỗi ký tự là một dãy các phần tử, mỗi phần tử có kiểu
ký tự.
Khai báo cách 1:
char < Tên chuỗi > [ < Số ký tự tối đa của chuỗi > ] ;
Ví dụ: char chuoi[25];
Khai báo 1 mảng kiểu ký tự tên là chuoi có 25 phần tử
(lưu được 24 ký tự, ký tự 25 là ký tự kết thúc chuỗi „\0‟ )
Khai báo cách 2:
char *chuoi;
Ví dụ :
Chuỗi ký tự không giới hạn chiều dài
31
char *< Tên chuỗi >;
4. CHUỖI KÝ TỰ
4.2. Nhập
cin.getline(chuoi, số ký tự tối đa);
32
Ví dụ:
char *str;
str = new char [30];
cin.getline(str, 30);
4. CHUỖI KÝ TỰ
4.3. Các hàm thư viện –
Tính độ dài của chuỗi s
Sao chép nội dung chuỗi nguồn vào chuỗi đích
strcpy(char đích[], char nguồn[]);
Chép n ký tự từ chuỗi nguồn sang chuỗi đích. Nếu
chiều dài nguồn < n thì hàm sẽ điền khoảng trắng
cho đủ n ký tự vào đích
int strlen(char s[]);
33
strncpy(char đích[], char nguồn[], int n);
4. CHUỖI KÝ TỰ
Nối chuỗi s2 vài chuỗi s1
Nối n ký tự đầu tiên của chuỗi s2 vào chuỗi s1
strcat(char s1[],char s2[]);
So sánh 2 chuỗi s1 và s2 theo nguyên tắc thứ tự.
strncat(char s1[],char s2[],int n);
Phân biệt chữ hoa và thường. Trả về:
0: nếu s1 bằng s2.
>0: nếu s1 lớn hơn s2.
int strcmp(char s1[],char s2[]);
34
<0: nếu s1 nhỏ hơn s2.
4. CHUỖI KÝ TỰ
So sánh n ký tự đầu tiên của s1 và s2, giá trị trả về
tương tự hàm strcmp()
So sánh chuỗi s1 và s2 nhưng không phân biệt hoa
int strncmp(char s1[],char s2[], int n);
thường, giá trị trả về tương tự hàm strcmp()
So sánh n ký tự đầu tiên của s1 và s2 nhưng không
phân biệt hoa thường, giá trị trả về tương tự hàm
strcmp()
int strnicmp(char s1[],char s2[], int n);
35
int stricmp(char s1[],char s2[]);
4. CHUỖI KÝ TỰ
Tìm sự xuất hiện đầu tiên của ký tư c trong chuỗi s.
Trả về:
NULL: nếu không có
char *strchr(char s[], char c);
Tìm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi
Địa chỉ c: nếu tìm thấy
s1. Trả về:
NULL: nếu không có
char *strstr(char s1[], char s2[]);
36
Ngược lại: Địa chỉ bắt đầu chuỗi s2 trong s1
4. CHUỖI KÝ TỰ
Tách chuỗi: Nếu s2 có xuất hiện trong s1: Tách chuỗi s1
thành hai chuỗi: Chuỗi đầu là những ký tự cho đến khi
gặp chuỗi s2 đầu tiên, chuỗi sau là những ký tự còn lại
của s1 sau khi đã bỏ đi chuỗi s2 xuất hiện trong s1.
Nếu s2 không xuất hiện trong s1 thì kết quả chuỗi tách
vẫn là s1.
37
char *strtok(char s1[], char s2[]);
5. KIỂU CÓ CẤU TRÚC
5.1. Giới thiệu
38
Cấu trúc thực chất là một kiểu dữ liệu do người dùng
định nghĩa bằng cách sử dụng các kiểu dữ liệu cơ sở
thành một kiểu dữ liệu phức hợp nhiều thành phần
5. KIỂU CÓ CẤU TRÚC
5.2. Khai báo
Cú pháp 1:
39
struct SinhVien
{
char MSSV[6] ;
char HoTenSV[30];
bool Phai ;
float Toan, Ly, Hoa;
};
struct SinhVien SV; struct
{
;
;
……..
;
};
struct
5. KIỂU CÓ CẤU TRÚC
5.2. Khai báo
Cú pháp 2:
typedef struct
{
char MSSV[6] ;
char HoTenSV[30];
bool Phai ;
float Toan, Ly, Hoa;
}Sinhvien;
SinhVien SV;
40
typedef struct
{
;
;
……..
;
} ;
5. KIỂU CÓ CẤU TRÚC
5.3. Khởi tạo cấu trúc
Việc khởi tạo cấu trúc có thể được thực hiện trong
lúc khai báo biến cấu trúc.
Các trường của cấu trúc được khởi tạo được đặt
giữa 2 dấu { và }, chúng được phân cách nhau bởi
dấu phẩy (,).
41
struct SinhVien SV={„sv01‟,‟nguyen thi lan‟,0,6.0,7.5,8.0};
5. KIỂU CÓ CẤU TRÚC
5.4. Truy xuất từng trường trong biến cấu trúc
Cú pháp:
s = SV.HoTenSV; //nguyen thi lan
42
. ;
5. KIỂU CÓ CẤU TRÚC
5.5. Mảng cấu trúc
Cách khai báo tương tự như mảng một chiều hay
ma trận (Kiểu dữ liệu nhưng kiểu dữ liệu của mỗi
phần tử là kiểu dữ liệu có cấu trúc).
Cách truy cập phần tử trong mảng cũng như truy
cập trên mảng một chiều hay ma trận. Nhưng do
từng phần tử có kiểu cấu trúc nên phải chỉ định rõ
cần lấy thành phần nào.
43
5. KIỂU CÓ CẤU TRÚC
44
struct PhanSo
{
int tu, mau;
};
struc PhanSo ps;
void main()
{
int n; //Kích thước của mảng
PhanSo a[100]; //Mảng các phân số
//Các lệnh
}
5. KIỂU CÓ CẤU TRÚC
Do kiểu dữ liệu có cấu trúc thường chứa rất
nhiều thành phần nên khi viết chương trình loại
này ta cần lưu ý:
Xây dựng hàm xử lý cho một kiểu cấu trúc.
45
Muốn xử lý cho mảng cấu trúc, ta gọi lại hàm xử
lý cho một kiểu cấu trúc đã được xây dựng bằng
cách dùng vòng lặp.
5. KIỂU CÓ CẤU TRÚC
char Hoten[40];
float Diem;
char Loai[10];
Bài tập 1. Định nghĩa kiểu:
struct Hoso{
}
Điểm 7,8 Khá
Viết chương trình nhập thôn tin của n học sinh (Họ
tên, điểm), xếp loại như sau:
Điểm 9,10 Giỏi
Điểm 5,6 Trung bình Điểm <5 Không đạt
In DS như sau:
Họ tên
Nguyen Thi Lan
Tran Van Diep
Diem
8
4
Xep loai
Khá
Khong dat
46
XEP LOAI VAN HOA
5. KIỂU CÓ CẤU TRÚC
Rút gọn phân số.
Tính tổng, hiệu, tích, thương hai phân số (kết quả
Bài tập 2. Viết chương trình khai báo kiểu dữ liệu để
biểu diễn một phân số. Hãy viết hàm thực hiện những
công việc sau:
So sánh hai phân số.
47
phải tối giản)
6. KIỂU TẬP TIN - FILE
6.1. Giới Thiệu
Tập tin văn bản: tập tin dùng để ghi các ký tự lên đĩa
Tập tin nhị phân: tập tin dùng để ghi các cấu trúc
dạng nhị phân (được mã hoá).
48
theo các dòng.
6. KIỂU TẬP TIN - FILE
6.2. Thao tác với tập tin
Bước 1: Mở tập tin để đọc/ ghi.
Bước 2: Các xứ lý trên tập tin.
Bước 3: Đóng tập tin.
49
6. KIỂU TẬP TIN - FILE
6.3. Lớp fstream -
fstream::Operator >>
fstream::open()
Mở file
Đọc file
Ghi dữ liệu vào file
Đóng file
fstream::Operator <<
50
fstream::close()
6. KIỂU TẬP TIN - FILE
Tạo tập tin văn bản
void main()
{
fstream file(“d:\\file_text.txt”, ios::out);
file<<“Write to file";
file.close();
51
}
6. KIỂU TẬP TIN - FILE
Đọc toàn bộ tập tin văn bản
void main()
{
char str[2000];
fstream file(“d:\\file_text.txt”, ios::in);
while(file >> str)
cout << str ;
file.close();
}
52
6. KIỂU TẬP TIN - FILE
Đọc từng dòng tập tin văn bản
void main()
{
char str[2000];
fstream file(“d:\\file_text”, ios::in);
while(!file.eof())
{
file.getline(str,2000);
cout <
53
The End.
54