Buổi 4: Cấu trúc dữ liệu
Giảng viên: TS. Lê Hoàng Sơn
lehoangson@hus.edu.vn
1
Lập trình tính toán khoa học kỹ thuật
Nội dung chính
Mảng
1
Con trỏ
2
Bài tập
3
2/18 Lê Hoàng Sơn
1. Mảng
Mảng được hiểu là một tập hợp các giá trị có cùng kiểu dữ liệu nằm
Kiểu dữ liệu của các phần tử trong mảng Tên mảng Số chiều và kích thước của mỗi chiều
liên tiếp nhau trong bộ nhớ máy tính Ví dụ int A[10]; mảng một chiều, 10 phần tử nguyên float B[2] [3]; mảng hai chiều, kích thước 2 x 3
Phần tử: A[0] (nội dung) và &A[0] (địa chỉ) B[0][0] &B[0][0] Phần tử mảng bắt đầu từ 0, kết thúc bằng chỉ số mảng trừ 1;
3/18 Lê Hoàng Sơn
Ví dụ: Nhập dữ liệu cho mảng 1 chiều
Khai báo mảng 5 phần tử, phải là số cố định
Nhập từng phần tử mảng từ bàn phím
printf(“Phan tu thu %d= ”,i); scanf(“%d”, &a[i]); } for(i=0;i<5;i++)
In mảng ra
# include
4/18 Lê Hoàng Sơn
Ví dụ: Trung bình cộng n số nguyên
Mảng 50 phần tử
Vừa nhập từng phần tử mảng vừa tính tổng
Tính Trung bình
# include
5/18 Lê Hoàng Sơn
Nội dung chính
Mảng
1
Con trỏ
2
Bài tập
3
6/18 Lê Hoàng Sơn
2. Con trỏ
Con trỏ là một biến dùng để chứa địa chỉ. Mỗi loại địa chỉ thì có loại con trỏ tương ứng. Trước khi sử dụng biến con trỏ ta phải khai báo trước khi sử dụng
Ví dụ int *x; biến con trỏ kiểu nguyên float *y; biến con trỏ kiểu thực
px=&x; pz=&z;
Được sử dụng để lưu địa chỉ của biến float x=5 , z=20, *px, *pz; Khi đó:
*px==5; *pz ==20
7/18 Lê Hoàng Sơn
Con trỏ với mảng
Các phần tử của mảng một chiều có thể được xác định thông qua
con trỏ
Ví dụ: float a[10]; Khi đó: địa chỉ của phần tử mảng &a[i] tương đương con trỏ (a + i) Nội dung của phần tử mảng a[i] tương đương *(a + i)
Trong mảng nhiều chiều, để chuyển từ mảng sang con trỏ và
ngược lại ta quy về mảng một chiều
Ví dụ: int b[m][n]; Khi đó phần tử b[i][j] tương đương b[i*n + j]
Lý do chuyển đổi: int a[50]; int *a; a = (int *) calloc(100,sizeof(int));
8/18 Lê Hoàng Sơn
Khai báo mảng động qua con trỏ
Thư viện
b[i] = (float *) calloc(n, sizeof(float));
Mảng một chiều
Ví dụ: float * a; int n;
printf("Nhap vao gia tri n: ");
scanf("%d", &n);
a = (float *) calloc(n, sizeof(float));
Mảng nhiều chiều
Ví dụ: float ** b; int m, n;
printf("Nhap vao gia tri m, n: ");
scanf("%d%d", &m,&n);
b = (float **) calloc(m, sizeof(float *));
for(i=0;i
9/18 Lê Hoàng Sơn
Ví dụ: Tính tổng n số thực
Khai báo con trỏ
Cấp phát n ô nhớ cho a
printf(“\n a[%d]= ”,i);
Nhập mảng và tính tổng
printf(“\n Tong =%8.2f”,s);
# include
# include
# include
int main() {
float *a, s = 0 ; int i, n;
printf("Nhap vao gia tri n: ");
scanf("%d", &n);
a = (float *) calloc(n, sizeof(float));
for(i=0; i
10/18 Lê Hoàng Sơn
Ví dụ: Tìm số lớn nhất trong ma trận (1)
Khai báo con trỏ
a[i] = (int *) calloc(n, sizeof(int));
Cấp phát m x n ô nhớ
printf("\n a[%d, %d]= ",i,j);
Nhập mảng và tìm max
if (max <= a[i][j]) max = a[i][j];
printf("\n Max =%d",max);
# include
# include
# include
int main() {
int **a, m, n, max = 0 ; int i, j;
printf("Nhap vao gia tri m, n: ");
scanf("%d%d", &m,&n);
a = (int **) calloc(m, sizeof(int *));
for(i=0;i
11/18 Lê Hoàng Sơn
Ví dụ: Tìm số lớn nhất trong ma trận (2)
Khai báo con trỏ
Cấp phát m x n ô nhớ
Nhập mảng và tìm max
if (max <= a[i*n+j]) max = a[i*n+j];
printf("\n Max =%d",max);
# include
# include
# include
int main() {
int *a, m, n, max = 0 ; int i, j;
printf("Nhap vao gia tri m, n: ");
scanf("%d%d", &m,&n);
a = (int *) calloc(m*n, sizeof(int));
for(i=0;i
12/18 Lê Hoàng Sơn
Tóm tắt bài học
Mảng một chiều và nhiều chiều
Con trỏ
Các phép toán
Quan hệ với mảng
Khai báo mảng động qua con trỏ
13/18 Lê Hoàng Sơn
Câu hỏi thảo luận
14/18 Lê Hoàng Sơn
Nội dung chính
Mảng
1
Con trỏ
2
Bài tập
3
15/18 Lê Hoàng Sơn
Bài tập
1. Nhập vào hai ma trận A, B kích thước 2 x 3. Tính
và cho hiển thị A+B.
2. Nhập vào một dãy n phần tử. In ra dãy số ngược
lại với dãy nhập vào
3. Nhập vào một ma trận nguyên kích thước m x n.
Hãy tìm phần tử lớn thứ nhì trong ma trận trên.
4. Nhập vào một ma trận nguyên kích thước m x n.
In ra các số lẻ trong ma trận đó.
5. Nhập vào một mảng n phần tử. Sắp xếp lại mảng
theo thứ tự tăng dần và in ra màn hình.
16/18 Lê Hoàng Sơn
Bài tập
6. Nhập vào ma trận A kích thước m x n và ma trận
B kích thước n x p. Tính và hiển thị tích hai ma
trận.
7. Số đối xứng là số có dạng: abccba. Hãy nhập vào
một dãy gồm n số. Kiểm tra xem dãy này có phải
là dãy đối xứng không?
8. Tìm ước chung lớn nhất của hai số a và b.
9. Nhập và kiểm tra xem số n có phải là số nguyên tố
hay không?
10. Nhập vào một dãy n phần tử và một số m bất kỳ.
Hãy đếm số lần xuất hiện của số m trong dãy trên.
17/18 Lê Hoàng Sơn
Lê Hoàng Sơn
C l i c k t o e d i t c o m p a n y s l o g a n .
Lập trình tính toán khoa học kỹ thuật
9/18 Lê Hoàng Sơn
Ví dụ: Tính tổng n số thực
Khai báo con trỏ
Cấp phát n ô nhớ cho a
printf(“\n a[%d]= ”,i);
Nhập mảng và tính tổng
printf(“\n Tong =%8.2f”,s);
# include
# include
# include
int main() {
float *a, s = 0 ; int i, n;
printf("Nhap vao gia tri n: ");
scanf("%d", &n);
a = (float *) calloc(n, sizeof(float));
for(i=0; i
10/18 Lê Hoàng Sơn
Ví dụ: Tìm số lớn nhất trong ma trận (1)
Khai báo con trỏ
a[i] = (int *) calloc(n, sizeof(int));
Cấp phát m x n ô nhớ
printf("\n a[%d, %d]= ",i,j);
Nhập mảng và tìm max
if (max <= a[i][j]) max = a[i][j];
printf("\n Max =%d",max);
# include
# include
# include
int main() {
int **a, m, n, max = 0 ; int i, j;
printf("Nhap vao gia tri m, n: ");
scanf("%d%d", &m,&n);
a = (int **) calloc(m, sizeof(int *));
for(i=0;i
11/18 Lê Hoàng Sơn
Ví dụ: Tìm số lớn nhất trong ma trận (2)
Khai báo con trỏ
Cấp phát m x n ô nhớ
Nhập mảng và tìm max
if (max <= a[i*n+j]) max = a[i*n+j];
printf("\n Max =%d",max);
# include
# include
# include
int main() {
int *a, m, n, max = 0 ; int i, j;
printf("Nhap vao gia tri m, n: ");
scanf("%d%d", &m,&n);
a = (int *) calloc(m*n, sizeof(int));
for(i=0;i
12/18 Lê Hoàng Sơn
Tóm tắt bài học
Mảng một chiều và nhiều chiều
Con trỏ
Các phép toán
Quan hệ với mảng
Khai báo mảng động qua con trỏ
13/18 Lê Hoàng Sơn
Câu hỏi thảo luận
14/18 Lê Hoàng Sơn
Nội dung chính
Mảng
1
Con trỏ
2
Bài tập
3
15/18 Lê Hoàng Sơn
Bài tập
1. Nhập vào hai ma trận A, B kích thước 2 x 3. Tính
và cho hiển thị A+B.
2. Nhập vào một dãy n phần tử. In ra dãy số ngược
lại với dãy nhập vào
3. Nhập vào một ma trận nguyên kích thước m x n.
Hãy tìm phần tử lớn thứ nhì trong ma trận trên.
4. Nhập vào một ma trận nguyên kích thước m x n.
In ra các số lẻ trong ma trận đó.
5. Nhập vào một mảng n phần tử. Sắp xếp lại mảng
theo thứ tự tăng dần và in ra màn hình.
16/18 Lê Hoàng Sơn
Bài tập
6. Nhập vào ma trận A kích thước m x n và ma trận
B kích thước n x p. Tính và hiển thị tích hai ma
trận.
7. Số đối xứng là số có dạng: abccba. Hãy nhập vào
một dãy gồm n số. Kiểm tra xem dãy này có phải
là dãy đối xứng không?
8. Tìm ước chung lớn nhất của hai số a và b.
9. Nhập và kiểm tra xem số n có phải là số nguyên tố
hay không?
10. Nhập vào một dãy n phần tử và một số m bất kỳ.
Hãy đếm số lần xuất hiện của số m trong dãy trên.
17/18 Lê Hoàng Sơn
Lê Hoàng Sơn
C l i c k t o e d i t c o m p a n y s l o g a n .
Lập trình tính toán khoa học kỹ thuật
10/18 Lê Hoàng Sơn
Ví dụ: Tìm số lớn nhất trong ma trận (1)
Khai báo con trỏ
a[i] = (int *) calloc(n, sizeof(int));
Cấp phát m x n ô nhớ
printf("\n a[%d, %d]= ",i,j);
Nhập mảng và tìm max
if (max <= a[i][j]) max = a[i][j];
printf("\n Max =%d",max);
# include
# include
# include
int main() {
int **a, m, n, max = 0 ; int i, j;
printf("Nhap vao gia tri m, n: ");
scanf("%d%d", &m,&n);
a = (int **) calloc(m, sizeof(int *));
for(i=0;i
11/18 Lê Hoàng Sơn
Ví dụ: Tìm số lớn nhất trong ma trận (2)
Khai báo con trỏ
Cấp phát m x n ô nhớ
Nhập mảng và tìm max
if (max <= a[i*n+j]) max = a[i*n+j];
printf("\n Max =%d",max);
# include
# include
# include
int main() {
int *a, m, n, max = 0 ; int i, j;
printf("Nhap vao gia tri m, n: ");
scanf("%d%d", &m,&n);
a = (int *) calloc(m*n, sizeof(int));
for(i=0;i
12/18 Lê Hoàng Sơn
Tóm tắt bài học
Mảng một chiều và nhiều chiều
Con trỏ
Các phép toán
Quan hệ với mảng
Khai báo mảng động qua con trỏ
13/18 Lê Hoàng Sơn
Câu hỏi thảo luận
14/18 Lê Hoàng Sơn
Nội dung chính
Mảng
1
Con trỏ
2
Bài tập
3
15/18 Lê Hoàng Sơn
Bài tập
1. Nhập vào hai ma trận A, B kích thước 2 x 3. Tính
và cho hiển thị A+B.
2. Nhập vào một dãy n phần tử. In ra dãy số ngược
lại với dãy nhập vào
3. Nhập vào một ma trận nguyên kích thước m x n.
Hãy tìm phần tử lớn thứ nhì trong ma trận trên.
4. Nhập vào một ma trận nguyên kích thước m x n.
In ra các số lẻ trong ma trận đó.
5. Nhập vào một mảng n phần tử. Sắp xếp lại mảng
theo thứ tự tăng dần và in ra màn hình.
16/18 Lê Hoàng Sơn
Bài tập
6. Nhập vào ma trận A kích thước m x n và ma trận
B kích thước n x p. Tính và hiển thị tích hai ma
trận.
7. Số đối xứng là số có dạng: abccba. Hãy nhập vào
một dãy gồm n số. Kiểm tra xem dãy này có phải
là dãy đối xứng không?
8. Tìm ước chung lớn nhất của hai số a và b.
9. Nhập và kiểm tra xem số n có phải là số nguyên tố
hay không?
10. Nhập vào một dãy n phần tử và một số m bất kỳ.
Hãy đếm số lần xuất hiện của số m trong dãy trên.
17/18 Lê Hoàng Sơn
Lê Hoàng Sơn
C l i c k t o e d i t c o m p a n y s l o g a n .
Lập trình tính toán khoa học kỹ thuật
11/18 Lê Hoàng Sơn
Ví dụ: Tìm số lớn nhất trong ma trận (2)
Khai báo con trỏ
Cấp phát m x n ô nhớ
Nhập mảng và tìm max
if (max <= a[i*n+j]) max = a[i*n+j];
printf("\n Max =%d",max);
# include 12/18 Lê Hoàng Sơn 13/18 Lê Hoàng Sơn 14/18 Lê Hoàng Sơn 1 2 3 15/18 Lê Hoàng Sơn 1. Nhập vào hai ma trận A, B kích thước 2 x 3. Tính 2. Nhập vào một dãy n phần tử. In ra dãy số ngược lại với dãy nhập vào 3. Nhập vào một ma trận nguyên kích thước m x n. 4. Nhập vào một ma trận nguyên kích thước m x n. In ra các số lẻ trong ma trận đó. 5. Nhập vào một mảng n phần tử. Sắp xếp lại mảng 16/18 Lê Hoàng Sơn 6. Nhập vào ma trận A kích thước m x n và ma trận
B kích thước n x p. Tính và hiển thị tích hai ma
trận. 7. Số đối xứng là số có dạng: abccba. Hãy nhập vào
một dãy gồm n số. Kiểm tra xem dãy này có phải
là dãy đối xứng không? 8. Tìm ước chung lớn nhất của hai số a và b.
9. Nhập và kiểm tra xem số n có phải là số nguyên tố hay không? Hãy đếm số lần xuất hiện của số m trong dãy trên. 17/18 Lê Hoàng Sơn Lê Hoàng SơnTóm tắt bài học
Mảng một chiều và nhiều chiều
Con trỏ
Các phép toán
Quan hệ với mảng
Khai báo mảng động qua con trỏ
Câu hỏi thảo luận
Nội dung chính
Mảng
Con trỏ
Bài tập
Bài tập
và cho hiển thị A+B.
Hãy tìm phần tử lớn thứ nhì trong ma trận trên.
theo thứ tự tăng dần và in ra màn hình.
Bài tập
10. Nhập vào một dãy n phần tử và một số m bất kỳ.
C l i c k t o e d i t c o m p a n y s l o g a n .
Lập trình tính toán khoa học kỹ thuật