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 # include int main() { int a[5], i; for(i=0;i<5;i++) { printf(“%6d”,a[i]); getch(); return 0; }

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 # include int main() { int a[50], i, n, sum = 0; printf("Nhap vao gia tri n: "); scanf("%d", &n); for(i = 0; i < n; i++) { printf("Nhap vao phan tu thu %d: ", i + 1); scanf("%d", &a[i]); sum = sum + a[i]; } printf("Trung binh cong: %.2f\n", (float) sum/n); getch(); return 0; }

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