intTypePromotion=1
ADSENSE

Bài giảng Tin học đại cương Phần 2: Bài 4 - Nguyễn Hữu Nam Dương

Chia sẻ: Codon_03 Codon_03 | Ngày: | Loại File: PDF | Số trang:25

54
lượt xem
1
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Đến với "Bài giảng Tin học đại cương Phần 2: Bài 4 - Con trỏ và mảng" các bạn sẽ được tìm hiểu các vấn đề tổng quan về con trỏ; mảng; sử dụng con trỏ làm việc với mảng.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Tin học đại cương Phần 2: Bài 4 - Nguyễn Hữu Nam Dương

  1. VIỆN CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG SOICT TIN HỌC ĐẠI CƯƠNG PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C BÀI 4: CON TRỎ VÀ MẢNG 1 BÀI 4: CON TRỎ VÀ MẢNG 4.1. Con trỏ và địa chỉ  4.1.1. Tổng quan về con trỏ 4.2. Mảng  4.2.1. Khái niệm mảng  4.2.2. Khai báo và sử dụng mảng  4.2.3. Các thao tác cơ bản làm việc trên mảng 4.3. Sử dụng con trỏ làm việc với mảng 2 1
  2. 4.1.1. Tổng quan về con trỏ a. Địa chỉ và giá trị của một biến  Bộ nhớ như một dãy các byte nhớ.  Các byte nhớ được xác định một cách duy nhất qua một địa chỉ. chỉ.  Biến được lưu trong bộ nhớ.  Khi khai báo một biến Chương trình dịch sẽ cấp phát cho biến đó một số ô nhớ liên tiếp đủ để chứa nội dung của biến. Ví dụ một biến số nguyên (int) được cấp phát 2 byte. Địa chỉ của một biến chính là địa chỉ của byte đầu tiên trong số đó. 3 4.1.1. Tổng quan về con trỏ a. Địa chỉ và giá trị của một biến (tiếp)  Một biến luôn có hai đặc tính: Địa chỉ của biến. Giá trị của biến.  Ví dụ: int i, j; i = 3; Biến Địa chỉ Giá trị j = i + 1; i FFEC 3 j FFEE 4 4 2
  3. 4.1.1. Tổng quan về con trỏ b. Khái niệm và khai báo con trỏ  Con trỏ là một biến mà giá trị của nó là địa chỉ của một vùng nhớ.  Khai báo con trỏ: Cú pháp khai báo một con trỏ như sau: Kieu_du_lieu *ten_bien_con_tro;  Ví dụ Biến Địa chỉ Giá trị int i = 3; i FFEC 3 int *p; p = &i; p FFEE FFEC  Một con trỏ chỉ có thể trỏ tới một đối tượng cùng kiểu. 5 BÀI 4: CON TRỎ VÀ MẢNG 4.1. Con trỏ và địa chỉ  4.1.1. Tổng quan về con trỏ 4.2. Mảng  4.2.1. Khái niệm mảng  4.2.2. Khai báo và sử dụng mảng  4.2.3. Các thao tác cơ bản làm việc trên mảng 4.3. Sử dụng con trỏ làm việc với mảng 6 3
  4. 4.2.1. Khái niệm mảng Mảng là một tập hợp hữu hạn c[0] -45 các phần tử có cùng kiểu dữ c[1] 6 liệu được lưu trữ liên tiếp nhau c[2] 0 c[3] 72 trong bộ nhớ. nhớ. c[4] 1543 Các phần tử trong mảng có cùng c[5] -89 c[6] 0 tên (và cũng là tên mảng) nhưng c[7] 62 phân biệt với nhau ở chỉ số cho c[8] -3 c[9] 1 biết vị trí của chúng trong mảng . c[10] 6453 c[11] 78 7 4.2.2. Khai báo và sử dụng mảng a. Khai báo: Cú pháp:  Kieu_du_lieu ten_mang[kich_thuoc_mang]; n phần tử của mảng c: c[0] -45 c[ 0 ], c[ 1 ],...,c[ n – 1 ] c[1] 6 Ví dụ: Câu lệnh: c[2] 0 c[3] 72 char c[12]; c[4] 1543 Khai báo một mảng: c[5] -89 c[6] 0 Tên là c, có 12 phần tử, c[7] 62 c[8] -3 Các phần tử thuộc kiểu char c[9] 1 c[10] 6453 c[11] 78 8 4
  5. 4.2.2. Khai báo và sử dụng mảng a. Khai báo (tiếp tiếp): ): Mảng Hai chiều chiều::  Mỗi phần tử của mảng cũng là một mảng khác  Cú pháp khai báo mảng 2 chiều chiều:: Kiểu_dữ_liệu tên_mảng[[số_hàng tên_mảng số_hàng][ số_cột]; ][số_cột ];  Ví dụ dụ:: int a[6][5]; Mảng nhiều chiều chiều::  Vd:: int b[3][4][5]; Vd 9 4.2.2. Khai báo và sử dụng mảng b. Sử dụng mảng:  Truy cập vào 1 phần tử của mảng thông qua tên mảng và chỉ số của phần tử đó.  Cú pháp: ten_mang[ ten_mang [chi_so_cua_phan_tu chi_so_cua_phan_tu] ]  Ví dụ 1: int mang_nguyen[3]; mang_nguyen[0]: Phần tử thứ 1. mang_nguyen[0]: mang_nguyen[1]: mang_nguyen[1] : Phần tử thứ 2. mang_nguyen[2]: mang_nguyen[2] : Phần tử thứ 3. 10 5
  6. 4.2.2. Khai báo và sử dụng mảng b. Sử dụng mảng (tiếp):  Ví dụ 2: int a[6][5]; a[0] là phần tử đầu tiên của mảng, mảng, là 1 mảng  Phần tử đầu tiên của mảng a[0] là a[0][0],… … a[2][3] sẽ là phần tử thứ 4 của phần tử mảng một chiều thứ 3 của a.  a[i][j] sẽ là phần tử thứ j+1 của a[i] a[i],, mà phần tử a[i] lại là mảng thứ i+1 của a. 11 Sử dụng mảng 2 1 2 5 9 chiều: Ví dụ: int mang[n][m]; Muốn truy cập tới 2 22 55 56 phẩn tử hàng thứ i+1, cột thứ j+1 ta dùng cú pháp sau: 4 212 23 34 mang[i][j]; 12 6
  7. 4.2.3. Các thao tác cơ bản làm việc trên mảng a. Nhập dữ liệu cho mảng: Nhập dữ liệu cho từng phần tử của mảng Ví dụ: int b[10]; int i; for(i = 0; i < 10; i++) { printf(“\ printf(“ \n Nhap gia tri cho b[%d]”, i); scanf(“%d”,&b[i]); } 13 4.2.3. Các thao tác cơ bản làm việc trên mảng a. Nhập dữ liệu cho mảng (tiếp): Trường hợp không biết mảng sẽ có bao nhiêu phần tử mà chỉ biết số phần tử tối đa có thể có của mảng. Ví dụ: int a[100];//Khai bao mang, so phan tu toi da la 100 int n; // Bien luu giu so phan tu thuc su cua mang int i; printf(“\ printf(“\n Cho biet so phan tu cua mang: “); scanf(“%d”,&n); for(i = 0; i < n; i++) { printf("\ printf("\n a[%d] = ", i); scanf("%d",&a[i]); } 14 7
  8. 4.2.3. Các thao tác cơ bản làm việc trên mảng a. Nhập dữ liệu cho mảng (tiếp): Mảng có thể được khởi tạo giá trị ngay khi khai báo int a[4] = {4, 9, 22, 16}; float b[3] = {40.5, 20.1, 100}; char c[5] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’};  Câu lệnh thứ nhất có tác dụng tương đương với 4 lệnh gán: a[0] = 4; a[1] = 9; a[2] = 22; a[3] = 16; 15 b. Xuất dữ liệu chứa trong mảng: #include #include #define KT 6 void main() { int a[KT]; int i, k; //Nhap // Nhap gia tri cho cac phan tu mang a tu ban phim for(i for( i = 0; i < KT; i++) { printf(“ printf (“\ \n a[%d] = “, i); scanf(“%d”, scanf (“%d”, &a[i &a[i]); } printf(" printf ("\\nBat dau hien thi gia tri cac phan tu tu\\n"); printf(“ printf (“\\n a[3] = %d”, a[3]); //Hien // Hien thi gia tri tat ca cac phan tu //Moi // Moi phan tu tren 1 dong for(i = 0; i < KT; i++) printf(“\ printf(“ \n%d”, a[i]); 16 8
  9. b. Xuất dữ liệu chứa trong mảng: printf(“\n”); // Xuong dong moi printf(“\ // Hien thi gia tri cua tat ca cac phan tu mang a // tren 1 dong, cac phan tu cach nhau 1 dau tab for(i = 0; i < KT; i++) printf(“%d\ printf(“%d \t“, a[i]); // Hien thi k phan tu tren mot dong printf(“\ printf(“ \n Cho biet gia tri cua k = “); scanf(“%d”,&k); for(i = 0; i < KT; i++) { printf(“%d “, a[i]); if((i+1)%k == 0)//xuong dong khi da hien thi k ptu printf(“\ printf(“ \n”); } } 17 Kết quả: 18 9
  10. c. Tìm các phần tử có giá trị lớn nhất, nhỏ nhất #define KT 100 int a[KT]; max = a[0]; Dùng vòng lặp for so sánh max với phần tử có chỉ số từ 1, 2,…, n- n-1 của mảng a. 19 c. Tìm các phần tử có giá trị lớn nhất, nhỏ nhất int a[100]; int i, n; int max; printf("\ printf(" \n Cho biet so phan tu cua mang: "); scanf("%d",&n); for(i = 0; i < n; i++) { printf("\ printf(" \n a[%d] = ",i); scanf("%d",&a[i]); } 20 10
  11. max = a[0]; //Lan luot so sanh voi cac phan //tu con lai trong mang for(i = 1; i < n; i++) if(max < a[i]) max = a[i]; printf("\ printf(" \n Phan tu lon nhat trong mang la: %d", max); 21 4.2.3. Các thao tác cơ bản làm việc trên mảng Tìm kiếm trên mảng Sắp xếp mảng 22 11
  12. Tìm kiếm trên mảng Bài toán:  Viết chương trình yêu cầu người dùng nhập vào 10 số thực  Cho phép người dùng nhập vào 1 giá trị k (để tìm kiếm) 23 Tìm kiếm trên mảng (tiếp) Yêu cầu:  Hiển thị dãy số người dùng vừa nhập.  Hiển thị lên màn hình: Số luợng phần tử (trong dãy vừa nhập) có giá trị bằng k. Vd: có 3 phần tử có giá trị bằng k thì hiện lên: Trong dãy vừa nhập có 3 số có giá trị bằng k) 24 12
  13. Tìm kiếm trên mảng (tiếp) Cấu trúc dữ liệu:  Dùng mảng để lưu trữ dãy số do người dùng nhập vào. Giải thuật:  Duyệt lần lượt các phần tử của mảng và đếm xem có bao nhiêu phần tử có giá trị bằng k. 25 Tìm kiếm trên mảng (tiếp) Các biến chính cần dùng:  Mảng để lưu trữ 10 phần tử: m  Biến để lưu số lượng phần tử bằng k: dem 26 13
  14. Tìm kiếm trên mảng (tiếp) #include #include float m[10]; float k; int i, dem; 27 void main () { clrscr(); //nhap du lieu for(i=0;i
  15. printf("\nHay nhap vao printf("\ mot so de tim kiem:"); scanf("%f", &k); // Đếm số phần tử có giá trị bằng k dem=0; for (i=0;i
  16. 31 Tìm kiếm trên mảng (tiếp) Mở rộng:  Cho phép người dùng nhập vào số lượng phần tử của mảng.  Tìm kiếm số lượng các số thỏa mãn tính chất nào đó: vd: chẵn, lẻ, chia hết cho 5, nguyên tố…  Tìm kiếm kết hợp với thao tác trên các giá trị tìm được: tính tổng các số âm, các số nguyên tố,… 32 16
  17. Bài toán sắp xếp Bài toán: Viết chương trình cho phép nhập vào n số kiểu int. (n do người dùng nhập vào, tối đa là 100, chưa cần kiểm tra đầu vào n) 1)Hiển thị dãy người dùng đã nhập ra màn hình 2) Sắp xếp dãy số đó theo thứ tự không giảm 3)Hiển thị dãy đã sắp xếp ra màn hình. 33 Bài toán sắp xếp (tiếp) Cấu trúc dữ liệu: Dùng mảng để lưu trữ dãy số: m Giải thuật: Selection Sort (Sắp xếp kiểu lựa chọn):  n là số phần tử của dãy  Thực hiện n- n-1 bước: 34 17
  18. Bài toán sắp xếp (tiếp) Giải thuật (tiếp):  Bước 1: Tìm phần tử nhỏ nhất trong n phần tử và đặt vào vị trí của phần tử đầu tiên  Bước 2: Tìm phần tử nhỏ thứ 2 trong n phần tử và đặt vào vị trí của phần tử thứ 2 ~ tìm phần tử nhỏ nhất trong n-1 phần tử còn lại và đặt vào vị trí của phần tử thứ 2. 35 Bài toán sắp xếp (tiếp) Giải thuật (tiếp):  Bước 3: tìm phần tử nhỏ nhất trong n-2 phần tử còn lại và đặt vào vị trí của phần tử thứ 3. …..  Bước n-n-1: tìm phần tử nhỏ nhất trong 2 phần tử còn lại và đặt vào vị trí thứ n- n-1. 36 18
  19. Bài toán sắp xếp (tiếp) Các biến và kỹ thuật sử dụng:  Mảng, các biến để thực hiện vòng lặp  Sử dụng bài toán tìm phần tử nhỏ nhất và lưu chỉ số của phần tử đó: chiso  Thực hiện đưa một phần tử chiso về vị trí x sử dụng thuật toán đổi chỗ. 37 Mã chương trình Bài toán sắp xếp #include #include int m[100]; int n,i,j, chiso; void main () { clrscr(); printf("Cho biet so phan tu cua mang:"); scanf("%d",&n); 38 19
  20. //Nhập dữ liệu cho dãy for(i=0;i
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2