intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Giáo trình Lập trình cơ bản: Phần 2

Chia sẻ: Lê Na | Ngày: | Loại File: PDF | Số trang:53

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

Phần 2 Giáo trình Lập trình cơ bản do Trường Cao đẳng nghề Yên Bái biên soạn gồm nội dung chương 4 trở đi. Giáo trình được biên soạn phục vụ cho học sinh sinh viên trong các khóa đào tạo trình độ cao đẳng nghề, trung cấp nghề Công nghệ thông tin, trong các cơ sở sản xuất làm tài liệu học tập và nghiên cứu. Đồng thời các nhà quản lý và người sử dụng nhân lực trong các cơ sở sản xuất có thể sử dụng giáo trình làm tài liệu tham khảo.

Chủ đề:
Lưu

Nội dung Text: Giáo trình Lập trình cơ bản: Phần 2

  1. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái CHƯƠNG 4: HÀM 1. Khái niệm hàm 1.1Khái niệm và phân loại Một chương trình viết trong ngôn ngữ C là một dãy các hàm, trong đó có một hàm chính(hàm main). Hàm chia các bài toán lớn thành các công việc nhỏ, có thể có những đoạn chương trình viết lặp đi lặp lại nhiều lần, để tránh rườm rà và mất thời gian khi viết chương trình; người ta thường phân chia chương trình thành nhiều module, mỗi module giải quyết một công việc vào đó. Thứ tự các hàm trong chương trình là bất kỳ, song chương trình bao giờ cũng đi thực hiện từ main(). Trong C, chương trình con được gọi là hàm. Hàm trong C có thể trả về kết quả thông quan tên hàm hay có thể không trả về kết quả. Hàm có hai loại: Hàm chuẩn và hàm tự định nghĩa. Trong chương này ta chú trọng đến cách định nghĩa hàm và cách sử dụng các hàm đó. Hàm thư viện Hàm thư viện là những hàm đã được định nghĩa sẵn trong một thư viện nào đó, muốn sử dụng các hàm thư viện thì phải khai báo thư viện trước khi sử dụng bằng lệnh #inlcude Hàm người dùng Hàm người dùng là những hàm do người lập trình tự tạo ra nhằm đáp ứng nhu cầu xử lý của mình. Một hàm khi được định nghĩa thì có thể sử dụng bất cứ đâu trong chương trình. Trong C, một chương trình bắt đầu thực thi bằng hàm main. Chương trình con được dùng để tôí ưu hóa việc tổ chức chương trình, chia một chương trình lớn thành nhiều công việc độc lập nhỏ. Dùng chương trình con thực hiện các công việc nhỏ, tạo thành mô-đun. Khi đó nhiệm vụ chương trình chính chỉ là cung cấp dữ liệu đầu vào cho các mô-đun để hoàn thành công việc của mình. Một chương trình viết theo cách này gọi là chương trình cấu trúc. Có thể minh họa chương trình con như hình sau : Chương trình con thực hiện công việc A Dữ liệu đưa vào để thực Dữ liệu kết quả hiện công việc A của công việc A 52
  2. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái Hình 4.1.1 : Hình ảnh minh họa nhiệm vụ của chương trình con Để nhận các dữ liệu đưa vào cho chương trình con và nếu có thể chứa dữ liệu kết quả ra chúng ta phải sử dụng tham số (parameters) của chương trình con. Tham số tồn tại dưới hai hình thức đó là tham số thực và tham số hình thức. Tham số hình thức là tham số để khai báo và xây dựng trương trình con, còn tham số thực để xác định dữ liệu đưa vào khi gọi chương trình con. Trong một số ngôn ngữ lập trình cung cấp hai loại chương trình con riêng biệt đó là hàm(function) và thủ tục (procedures) nhưng trong C chỉ cung cấp một loại đó là hàm Để tạo một hàm chúng ta cần xác định - Hàm tạo ra sẽ thực hiện công việc gì ? - Sau khi thưc hiện song có cần trả về một dữ liệu hay nhiều dữ liệu không ? - Để thực hiện được công việc đó ta cần những dữ liệu nào ? 1.2 Quy tắc hoạt động của hàm Khi gặp một lời gọi hàm, thì hàm sẽ được thực hiện theo trình tự sau:  Cấp phát bộ nhớ cho các đối và các biến cục bộ.  Gán giá trị của các tham số thực cho các đối tượng tương ứng.  Thực hiện các câu lệnh trong thân hàm.  Khi gặp câu lệnh return hoặc dấu } cuối cùng của thân hàm thì máy sẽ xóa các đối, các biến cục bộ và thoát khỏi hàm. Chú ý:  Số tham số thực sự phải bằng số tham số hình thức (đối của hàm) và kiểu của tham số thực phải cùng kiểu với tham số hình thức tương ứng.  Nếu trở về từ một câu lệnh return có chứa biểu thức thì giá trị của biểu thức được gán cho hàm. Giá trị của hàm sẽ được sử dụng trong biểu thức chứa nó. 2. Xây dựng hàm 2.1 Định nghĩa hàm  Khai báo hàm Khai báo hàm được thực hiện ở phần đầu chương trình, khai báo để chỉ cho máy biết các thông tin về hàm bao gồm : kiểu dữ liệu trả về có hay không, tên hàm, các tham số bao gồm kiểu và tên của từng tham số. Cú pháp khai báo như sau : 53
  3. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1, kiểu2 tham_số2 ..... ) ; Trong đó : - Tên kiểu trả về : là một tên kiểu dữ liệu quy định kết quả trả về là khiểu gì. - Tên hàm : Tự đặt theo quy định đặt tên của ngôn ngữ C. - Kiểu1 tham_số1 : xác định tên của tham số thứ nhất và kiểu của tham số đó,... Nếu có nhiều tham số, mỗi tham số phân cách nhau bởi dấu phẩy (,) Ví dụ: int sum(int a , int b) ; float max(float x, float y); Nếu trong hàm không có dữ liệu trả về thì viết kiểu trả về là void nếu không có tham số thì bỏ trống và phải có cặp dấu đóng mở ngoăc () sau tên hàm. Ví dụ: void hien();  Xây dựng hàm Sau khi khai báo xong hàm chúng ta có thể viết lệnh thực hiện công việc đặt ra cho chương trình con. Cú pháp: Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1,kiểu2 tham_số2 ..... ) { Các câu lệnh thực hiện công việc đặt ra cho hàm. } Khi cần kết thúc thực hiện hàm và trả về dữ liệu nào đây, chúng ta viết lệnh return vào vị trí cần thiết nhất trong hàm. Cú pháp: return giá-trị-dữ-liệu-trả-về; Ví dụ: int sum(int a, int b) { return a+b; } Hoặc 54
  4. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái float max(float x, float y) { if(x>y) return x; else return y; } Đối với hàm có kiểu void có thể không cần lệnh return Ví dụ: void hien() { printf(“ho va ten: Nguyen Van Nam”); printf(“Ngay sinh :12\08\2014”); printf(“que quan : Yen Bai”); } Chú ý: Thông thường với những chương trình đơn giản có ít chương trình con thì người ta viết lệnh cho hàm ngay tại nơi khai báo. 2.2 Sử dụng hàm Một hàm khi định nghĩa thì chúng vẫn chưa được thực thi trừ khi ta có một lời gọi đến hàm đó. Khi thực hiện chương trình máy sẽ thực hiện các lệnh trong chương trình chính(hàm main), do đó để yêu cầu máy thực hiện công việc của chương trình con ta phải viết lệnh gọi chương trình con với cú pháp sau. Cú pháp: ([Danh sách các tham số]) Lời gọi này có thể là một câu lệnh độc lập hoặc đặt trong biểu thức, nếu đặt trong biểu thức thì hàm đó phải có giá trị trả về để thực hiện tính toán biểu thức đó. Ví dụ: printf(“Tong hai so 5 va 6 la: %d”,tong(5,6)); Hoặc: float x ; 55
  5. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái x = max(a,b) ; Hoăc: hien(); Chú ý: Thông thường lời gọi hàm được viết trong chương trình chính, tuy nhiên có thể viết trong chương trình con khác. Các chương trình con có thể gọi lẫn nhau. 3. Các tham số của hàm 3.1 Phân biệt các loại tham số Trong lập trình, tham số là biến được thu nhận bởi một chương trình con. Tại thời gian chạy, chương trình con sử dụng các giá trị được gán cho các tham số để thay đổi cách ứng xử của mình. Hầu hết các ngôn ngữ lập trình có thể định nghĩa các chương trình con không có tham số hoặc chấp nhận một vài tham số. Tham số hình thức: Là biến được liệt kê trong danh sách tham số (thường nằm tại phần đầu của định nghĩa chương trình con). Tham số thực sự : Là giá trị cụ thể của biến đó tại thời gian chạy. Để phân biệt rõ hai khái niệm trên, xét ví dụ dưới đây: int sum(int gt1, int gt2) { return (gt1+gt2); } Hàm sum nhận hai tham số hình thức: gt1và gt2. Nó lấy tổng của các giá trị được truyền vào các tham số này và trả về kết quả cho nơi gọi hàm (bằng cách sử dụng một kỹ thuật được cung cấp tự động bởi trình biên dịch C). Mã gọi hàm sum có thể trông như dưới đây: int a=40; int b=2; int c = sum(a,b); Các biến a và b được khởi tạo với các giá trị 40 và 2. Các biến này không phải tham số hình thức hay tham số thực sự. Tại thời gian chạy, giá trị đã được gán cho các biến này được truyền vào cho hàm sum . Trong hàm sum, các tham số hình thức gt1 và gt2 được tính giá trị và lần lượt cho kết quả là hai tham số thực 56
  6. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái sự 40 và 2. Giá trị của các tham số thực sự được cộng lại, kết quả được trả về cho nơi gọi hàm - nơi nó được gán cho biến c Tham số hình thức thường được gọi tắt là tham số. Tham số thực sự còn được gọi là tham số thực, tham đối hoặc đối số. 3.2 Cách truyền tham số Có hai cách để truyền tham số cho hàm: Truyền theo tham trị và truyền theo tham chiếu. Truyền bằng tham trị Trong cơ chế truyền tham số bằng giá trị (gọi là truyền tham trị), khi chương trình con được chạy, một bản sao của tham số thực sự được gán cho tham số hình thức (sao chép giá trị). Nghĩa là mọi sửa đổi của chương trình con đối với tham số hình thức không gây ảnh hưởng tới biến được truyền vào chương trình con theo kiểu truyền tham trị. Các tham số được truyền bằng giá trị được gọi là tham trị. Do chỉ có giá trị được truyền vào chương trình con, tham số thực sự không nhất thiết phải là một biến thông thường mà có thể là hằng giá trị, hằng biến, biểu thức trả về giá trị... Truyền bằng biến Trong cơ chế truyền tham số bằng biến (gọi là truyền tham biến), khi chương trình con được chạy, tham số hình thức trở thành một tham chiếu tham số thực sự. Nghĩa là mọi sửa đổi của chương trình con đối với tham số hình thức sẽ có tác dụng với tham số thực sự. Đây được gọi là hiệu ứng phụ của chương trình con. Các tham số được truyền bằng biến được gọi là tham biến. Ngược lại với cơ chế truyền bằng giá trị, cơ chế truyền bằng biến đòi hỏi tham số thực sự phải là một biến. Các đối số mặc định Một số ngôn ngữ lập trình cho phép một đối số mặc định (default argument) được cho trước một cách tường mình hay ngầm định trong phần khai báo của một chương trình con. Điều này cho phép nơi gọi bỏ qua đối số này khi gọi chương trình con đó. Nếu đối số mặc định được cho một cách tường mình, thì giá trị đó được sử dụng mỗi khi nó không được cung cấp bởi nơi gọi. Nếu đối số mặc định là ngầm định (mà đôi khi được khai báo bởi từ khóa như là "Optional" (không bắt buộc)) thì ngôn ngữ sẽ cung ứng một giá trị "ban đầu" thông dụng (như là null, tập rỗng, giá trị 0, xâu kí tự rỗng,...) nếu giá trị (của tham số) không được nơi gọi cung cấp. Chiều dài biến đổi được của danh sách tham số 57
  7. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái Một số ngôn ngữ cho phép các chương trình con được định nghĩa với số các đối số thay đổi được. Đối với các ngôn ngữ như vậy, các chương trình con phải duyệt qua danh mục của các đối số Các tham số danh định Một số ngôn ngữ lập trình cho phép các chương trình con có các tham số danh định (named parameter). Điều này cho phép mã nơi gọi chương trình con có tính tự mô tả (self-documenting) cao hơn. Nó cũng cung cấp cho nơi gọi khả năng uyển chuyển cao hơn, thường cho phép thay đổi thứ tự của các đối số hay bỏ qua một số đối số nếu cần thiết. 3.3. Biến toàn cục và biến cục bộ Biến toàn cục là biến nhớ được khai báo ở ngoài mọi hàm(thường được khai báo ở trên cùng sau khai báo thư viện), có tác dụng đến toàn bộ chương trình cả chương trình chính và chương trình con. Biến cục bộ là biến nhớ được khai báo bên trong một chương trình con, chỉ có tác dụng ở trong chương trình con đó. Bên ngoài chương trình con đó thì biến đó không được sử dụng nữa. Ví du: #include #include int a,b; int sum() { int c = a + b; return c; } int tich() { int c ; c =a*b; return c; } void main() { clrscr(); 58
  8. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái printf(“nhap vao so a = ”); scanf(“%d”,&a); printf(“nhap vao so b = ”);scanf(“%d”,&b); printf(“\n tong hai so: %d”,sum()); printf(“\n tich hai so la: %d”,tich()); getch(); } Trong ví dụ trên hai biến a và b là biến toàn cục được sử dụng trong cả 3 hàm sum, max và main. Trong hàm sum và max đều có biến cục bộ là c nhưng biến c trong hàm sum sẽ độc lập và riêng biệt so với c trong hàm max. 4. Hàm đệ quy 4.1 Khái niệm đệ quy Một hàm được gọi là đệ quy nếu bên trong thân hàm có lệnh gọi đến chính nó Ví dụ: Người ta định nghĩa giai thừa của một số nguyên dương n như sau: N!= 1*2*3*….*(n-1)*n=(n-1)! *n (với 0!=1) Như vậy, để tính n! ta thấy nếu n=0 thì n!=1 ngược lại thì n!=n*(n-1)! Với định nghĩa trên thì hàm đệ quy tính n! được viết: #include #include /*hàm tính n! bằng đệ quy*/ long giaithua_ dequy(int n) { if(n==0) Return 1; else return n*giaithua_dequy(n-1); } 4.2 Các bài toán dùng đệ quy Phương pháp đệ quy thường dùng phổ biến trong ứng dụng mà cách giải quyết có thể được thể hiện bằng việc áp dụng liên tiếp cùng giải pháp cho những tập hợp con của bài toán. Phương pháp đệ quy không phải bao giờ cũng là giải pháp hữu hiệu nhất. Giải pháp vòng lặp có hiệu quả về mặt thời gian và vùng nhớ. Còn với đệ quy mỗi lần 59
  9. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái gọi đệ quy máy phải dành một số vùng nhớ để trữ các trị, thông số và biến cục bộ. Do đó, đệ quy tốn nhiều vùng nhớ, thời gian truyền đối mục, thiết lập vùng nhớ trung gian và trả kết quả…Nhưng sử dụng phương pháp đệ quy trông chương trình đẹp mắt hơn vòng lặp và tính thuyết phục của nó. Điều cốt lõi khi thiết đặt chương trình phải làm thế nào hàm đệ quy có thể chấm dứt thông qua điều kiện cơ bản Chính vì vậy, trong lập trình người ta cố tránh sử dụng thủ tục đệ quy nếu thấy không cần thiết. 4.3 Cách xây dựng hàm đệ quy  Hàm đệ quy phải có 2 phần : + Phần dừng hay phải có trường hợp nguyên tố.Trong ví dụ ở trên thì trường hợp n=0 là trường hợp nguyên tố. + Phần đệ quy : Là phần có gọi lại hàm được định nghĩa. Trong ví dụ trên thì phần đệ quy là n>0 thì n !=n*(n-1) !  Sử dụng hàm đề quy trong chương trình sẽ làm chương trình dễ đọc, dễ hiểu và vấn đề được nêu bật rõ ràng hơn.Tuy nhiên trong đa số trường hợp thì hàm đệ quy tốn bộ nhớ nhiều hơn và tốc độ thực hiện chương trình chậm hơn không đệ quy.  Tùy từng bài cụ thể mà người lập trình quyết định nên dùng đệ quy hay không(có trường hợp không dùng đệ quy thì không giải quyết được bài toán). 4.4 Các ví dụ về hàm đệ quy  Ví dụ 1: Tính n! N!= 1*2*3*…*(n-2)*(n-1)*n với n>=1 và 0!=1 long giaithua(int n) { if(n==0) Return 1; else return n*giaithua(n-1); } Giải thích hoạt động của hàm đệ quy giaithua Ví dụ giá trị truyền vào hàm giaithua qua biến n = 5  Thứ tự gọi thực hiện hàm giai thừa 60
  10. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái giaithua(n) return(n * giaithua(n-1)) 5 5*giaithua(4) = 5 *? 4 4*giaithua(3) = 4 *? 3 3*giaithua(2) =3 *? 2 2*giaithua(1) = 2*? 1 1*giaithua(0) = 1 *? Khi tham số n =0 thì return về giá trị (giá trị 1 kiểu long). Lúc này các giá trị? Bắt đầu định trị theo thứ tự ngược lại Giaithua(in) Return(in * giaithua(in-1)) 1 1*giaithua(0) = 1 *1 = 1 2 2*giaithua(1) = 2 *1=2 3 3*giaithua(2) =3 *2=6 4 4*giaithua(3) = 4*6=24 5 5*giaithua(4) = 5 *24=120 Kết quả sau cùng 5!= 120 Minh họa bằng hình ảnh. 61
  11. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái Hình 4.4.4: Hình ảnh minh họa tính 5! bằng giải thuật đệ quy  Ví dụ 2: dãy số Fibonaci 0,1,1,2,3,5,8,13,21,34….. Bắt đầu bằng 0 và 1, các số tiếp theo bằng tổng hai số đi trước Dãy số fibonaci được khai báo đề quy như sau: fibonaci(0)=0 fibonaci(1)=1 fibonaci(n)= fibonaci(n-1) + fibonaci(n-2) /* tinh so fibonaci thu n*/ # include # include void main(void) { long n; long fibonaci(long); printf(“nhap vao so n:”); scanf(%ld”,&n); print(“fibonaci(%ld)=%ld\n”,n,fibonaci(n)); getch(); } long fibonaci(long in) { if (n==0|| n==1) Return n; else return fibonaci(n -1 )+ fibonaci(n – 2); } Ket qua in ra man hinh 62
  12. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái Nhap vao so n:10 Fibonaci(10)=55 Ví dụ 3 : Tìm UCLN của 2 số a, b. Bài toán có thể được định nghĩa dưới dạng đệ qui như sau: − nếu a = b thì UCLN = a − nếu a > b thì UCLN(a, b) = UCLN(a-b, b) − nếu a < b thì UCLN(a, b) = UCLN(a, b-a) Từ đó ta có chương trình đệ qui để tính UCLN của a và b như sau. int UCLN(int a, int b) // qui uoc a, b > 0 { if (a < b) UCLN(a, b-a); if (a == b) return a; if (a > b) UCLN(a-b, b); } BÀI TẬP VẬN DỤNG Bài tập 1: Viết chương trình con tìm Max, Min 3 sô nguyên, chương trình chính nhập vào 3 số nguyên, hiện số lớn nhất và nhỏ nhất ra màn hình. #include #include int max(int a,int b,int c) { int max=a; if(max
  13. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái if(min>b)min=b; if(min>c)min=c; return min; } void main() { int a,b,c; clrscr(); printf("\nnhap vao 3 so nguyen:"); printf("\nso thu nhat: ");scanf("%d",&a); printf("\nso thu hai: ");scanf("%d",&b); printf("\nso thu ba : ");scanf("%d",&c); printf("\n so lon nhat la: %d",max(a,b,c)); printf("\n so nho nhat la: %d",min(a,b,c)); getch() ; } Bài tập 2: Viết chương trình kiểm tra một số nguyên có phải là số nguyên tố hay không. #include #include #include int SNT(int n) { int i,kt=1; for(i=2; i
  14. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái } } return kt; } void main() { int n; printf("Nhap So Can Kiem Tra: "); scanf("%d", &n); int kq; kq = SNT(n); if(kq==1) printf("So: %d là so nguyen to.", n); else printf("So: %d khong là so nguyen to.", n); printf("\n"); } Bài tập 3 Viết chương trình đếm số chữ số của một số nào đó, Ví dụ: 21432 trả về: 5 vì có 5 chữ số. //dem so chu so cua n vd: 12342 -> tra ve: 5 int Dem(int n) { int dem=0; while(n != 0) { n=n/10; dem ++; } return dem; } void main() { int n; printf("Nhap n: "); scanf("%d", &n); int dem = Dem(n); printf(".:|Chu so cua so n la: %d", dem); 65
  15. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái printf("\n"); } Bài tập 4 Viết chương trình đảo ngược của 1 số: ví dụ nhập 123 -> trả về 321. int DaoSo(int n) { int kq=0; while(n!=0) { kq=kq*10 + n%10; n=n/10; } return kq; } void main() { int n; printf("Nhap n: "); scanf("%d", &n); printf("\nSo Dao Nguoc La: %d", DaoSo(n)); } 66
  16. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái Chương 5: MẢNG 1. Khái niệm mảng Mảng là cấu trúc dữ liệu cho phép quản lý một danh sách hữu hạn các dữ liệu cùng kiểu. Ví dụ: Để chứa 5 dữ liệu số nguyên sau 10, 12, 25, 30, 40 Chúng ta có thể sử dụng 5 biến nhớ khác nhau a = 10, b = 12, c = 25, d = 30, e = 40 Tuy nhiên nếu số lượng dữ liệu tăng thì cách này không phù hợp, và chúng ta sẽ sử dụng cấu trúc mảng, minh hoạ như sau: 10 12 25 30 40 .... Các dữ liệu trong mảng phải cùng kiểu (số nguyên, số thực, ký tự ... ). Mảng để chứa dữ liệu như trên là mảng 1 chiều, chúng ta có thể sử dụng mảng 2 chiều hoặc mảng nhiều chiều. Ví dụ về mảng 2 chiều: 10 2 5 .... 45 23 56 .... 8 5 20 .... .... .... .... .... Mảng hai chiều là một bảng các dữ liệu được xếp theo hàng và cột, mỗi dữ liệu sẽ chứa trong ô được xác định bằng cách chỉ ra ở hàng nào và cột nào. 2. Khai báo mảng  Mảng một chiều Mảng một chiều giống như một vector. Mỗi phần tử của mảng một chiều có giá trị không phải là một mảng khác.  Khai báo với số phần tử xác định Cú pháp: Trong đó: + Tên_mảng: Đây là tên mảng đạt theo đúng quy tắc đặt tên của danh biểu. Tên này cũng mang ý nghĩa là tên biến mảng. + Số_phần_tử : Là một hằng số nguyên, cho biết số lượng phàn tử tối đa trong mảng là bao nhiêu (hay nói khác đi kích thước của mảng là gì). 67
  17. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái + Kiểu : Mỗi phần tử của mảng có dữ liệu thuộc kiểu gì. Ở đây, ta khai báo một biến mảng gồm có Số_phần_tử phần tử, phần tử thứ nhất là tên_mảng [0], phần tử cuối cùng là tên_mảng[Số_phần_tử -1] VD: int a[10]; /*Khai báo biến mảng tên a, phần tử thứ nhất là a[0], phần tử cuối cùng là a[9].*/ Ta có thể coi mảng a là một dãy liên tiếp các phần tử trong bộ nhớ như sau: Vị trí 0 1 2 3 4 5 6 7 8 9 Tên phần a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] tử  Khai báo với số phần tử không xác định (khai báo không tường minh) Cú pháp: Khi khai báo, không cho biết rõ số phần tử của mảng, kiểu khai báo này thường được áp dụng trong các trường hợp: vừa khai báo vừa gán giá trị, khai báo mảng là tham số hình thức của hàm.  Vừa khai báo vừa gán giá trị Cú pháp: [] = {Các giá trị cách nhau bởi dấu phẩy} Nếu vừa khai báo vừa gán giá trị thì mặc nhiên C sẽ hiểu số phần tử của mảng là số giá trị mà chúng ta gán cho mảng trong cặp dấu {}. Ví dụ: int S[] = {3,5,6};  Mảng nhiều chiều Mảng nhiều chiều là mảng có từ hai chiều trở lên. Điều đó có nghĩa là mỗi phần tử của mảng là một mảng khác. Người ta thường sử dụng mảng nhiều chiều để lưu các ma trận, các tọa độ 2 chiều, 3 chiều…. Phần dưới đây là các vấn đề liên quan đến mảng 2 chiều; các mang 3, 4… chiều thì tương tự (chỉ cần tổng quát hóa lên). 68
  18. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái  Khai báo mảng hai chiều tường minh Cú pháp: VD: Người ta cần lưu trữ thông tin của một ma trận gồm các số thực. Lúc này ta có thể khai báo một mảng 2 chiều như sau: float m[8][9]; /*Khai báo mảng hai chiều có 8*9 phần tử là số thực*/ Trong trường hợp này, ta đã khai báo cho một ma trận có tối đa là 8 dòng, mỗi dòng có tối đa là 9 cột. 0 1 2 3 4 5 6 7 8 0 m[0][0] m[0][1] m[0][2] m[0][3] m[0][4] m[0][5] m[0][6] m[0][7] m[0][8] 1 m[1][0] m[1][1] m[1][2] m[1][3] m[1][4] m[1][5] m[1][6] m[1][7] m[1][8] 2 m[2][0] m[2][1] m[2][2] m[2][3] m[2][4] m[2][5] m[2][6] m[2][7] m[2][8] 3 m[3][0] m[3][1] m[3][2] m[3][3] m[3][4] m[3][5] m[3][6] m[3][7] m[3][8] 4 m[4][0] m[4][1] m[4][2] m[4][3] m[4][4] m[4][5] m[4][6] m[4][7] m[4][8] 5 m[5][0] m[5][1] m[5][2] m[5][3] m[5][4] m[5][5] m[5][6] m[5][7] m[5][8] 6 m[6][0] m[6][1] m[6][2] m[6][3] m[6][4] m[6][5] m[6][6] m[6][7] m[6][8] 7 m[7][0] m[7][1] m[7][2] m[7][3] m[7][4] m[7][5] m[7][6] m[7][7] m[7][8]  Khai báo mảng 2 chiều không tường minh Để khai báo mảng 2 chiều không tường minh, ta vẫn phải chỉ ra số phần tử của chiều thứ hai (chiều cuối cùng). Cú pháp: Cách khai báo này cũng được áp dụng trong trường hợp vừa khai báo, vừa gán trị hay đặt mảng 2 chiều là tham số hình thức của hàm. 69
  19. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái 3. Truy xuất mảng 3.1 Truy xuất mảng 1 chiều Đối với mảng một chiều các phần tử chứa dữ liệu được sắp xếp liên tục trong bộ nhớ máy, và mỗi phần tử sẽ có một chỉ số (là số thứ tự) của phần tử đó trong mảng. Phần tử đầu tiên có chỉ số là 0, tiếp theo là 1 và tiếp tục cho đến hết, vậy sẽ dừng lại ở chỉ số bằng số lượng phần tử -1. Minh hoạ bằng hình sau: 10 25 15 30 ..... 0 1 2 3 .... Kích thước của mảng (tính bằng byte) sẽ là: số lượng phần tử của mảng nhân với kích thước của kiểu dữ liệu của mảng đó. Ví dụ: int a[20]; Thì mảng sẽ chiếm kích thước bộ nhớ là: 20 x 2 = 40 byte Để truy nhập đến các phần tử ta sử dụng tên và các chỉ số của phần tử đó theo cú pháp sau: Tên_mảng[chỉ_số_phần_tử_cần_truy_nhập]; Ví dụ: a[0]=10; Truy xuất đến phần tử đầu tiên của mảng a rồi gán giá trị cho phần tử đó bằng 10. 3.2 Truy xuất mảng 2 chiều Để truy nhập đến các phần tử của mảng hai chiều ta sử dụng tên mảng và chỉ số hàng và chỉ số cột theo cú pháp sau: Tên_mảng_hai_chiều[chỉ_số_hàng] [chỉ_số_cột]; Ví dụ: a[1][2] = 5; Chú ý: Số lượng dữ liệu lưu trong mảng có thể ít hơn số lượng phần tử đã khai báo, nhưng không vượt quá số lượng phần tử đã khai báo đó. Thông thường sử dụng 70
  20. Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái mảng sẽ có một số nguyên n để lưu số lượng dữ liệu được lưu trong mảng tương ứng. Danh sách các dữ liệu lưu trong mảng phải liên tục nhau để quản lý và sử lý dễ dàng. 71
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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