Chương 4: Hàm và cấu trúc chương trình

1. Chương trình và hàm trong C. 2. Cách viết một hàm. 3. Phân loại hàm trong C. a) Hàm với đối số là tham trị. b) Hàm với đối số là tham biến.

pdf22 trang | Chia sẻ: lylyngoc | Lượt xem: 1961 | Lượt tải: 4download
Bạn đang xem trước 20 trang tài liệu Chương 4: Hàm và cấu trúc chương trình, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
TIN HỌC ĐẠI CƯƠNG Lý thuyết: 6 buổi Thực hành: 8 buổi GVHD: Dương Khai Phong Email: khaiphong@gmail.com Ngôn ngữ lập trình: C NỘI DUNG CÁC BUỔI HỌC 1. Tổng quan về C (chương 1,2) 2. Các cấu trúc điều khiển trong C (chương 3) 3. Hàm và cấu trúc chương trình (chương 4) 4. Mảng, chuỗi và con trỏ (chương 5) 5. Kiểu cấu trúc, đệ qui, tập tin (chương 6,7,8) 6. Ôn tập CHƯƠNG 4: HÀM VÀ CẤU TRÚC CHƯƠNG TRÌNH 1. Chương trình và hàm trong C. 2. Cách viết một hàm. 3. Phân loại hàm trong C. a) Hàm với đối số là tham trị. b) Hàm với đối số là tham biến. 1. CHƯƠNG TRÌNH VÀ HÀM TRONG C a. Chương trình là gì?  Chương trình là một tập hợp gồm một hay nhiều hàm. Trong đó bắt buộc phải có hàm main().  Một chương trình bắt đầu thực hiện từ câu lệnh đầu tiên của hàm main() cho đến khi gặp dấu ngoặc } cuối cùng của hàm này. b. Hàm là gì?  Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một công việc nhất định, rổi trả về một giá trị cho chương trình gọi nó.  Lưu ý: - Hàm là một đơn vị độc lập của chương trình. - Không cho phép xây dựng một hàm bên trong một hàm. 1. CHƯƠNG TRÌNH VÀ HÀM TRONG C * Cấu trúc của một chương trình: 1. 2. 3. 4. 5.  Lưu ý: việc truyền dữ liệu từ hàm này sang hàm khác được thực hiện theo một trong 2 cách:  Sử dụng đối số của hàm  Sử dụng biến toàn cục 1. CHƯƠNG TRÌNH VÀ HÀM TRONG C * Ví dụ: viết CT tính bình phương của một số nguyên a  Cách 1: #include “stdio.h” #include “conio.h” void main() { int a,binhphuong; printf (“Nhap a = ”); scanf(“%d”,&a); binhphuong=a*a; printf (“Binh phuong của %d là %d”,a,binhphuong); }  Cách 2: dùng hàm #include “stdio.h” #include “conio.h” int binhphuong(int i); void main() { int a,kq; printf (“Nhap a = ”); scanf(“%d”,&a); kq=binhphuong(a); printf (“Binh phuong của %d là %d”,a,kq); } int binhphuong(int i) { int kq; kq=i*i; return kq; } 2. CÁCH VIẾT MỘT HÀM * Cú pháp khai báo chung: ([Danh sách các tham số nếu có]); Trong đó: • : int,float,char,... Nếu hàm không có kiểu dữ liệu trả về thì ta dùng kiểu void. Ví dụ: int binhphuong(int a), void xuat() • : cần đặt tên sao cho gợi nhớ chức n8ang của hàm. • [Danh sách các tham số nếu có]: tùy theo chức năng của hàm mà danh sách này có hay không có tham số, các tham số cách nhau bởi dấu phẩy “,” 2. CÁCH VIẾT MỘT HÀM * Cú pháp định nghĩa chung: thường được định nghĩa bên dưới hàm main() ([Danh sách các tham số nếu có]) { [return giá_tri_nếu có;] } 2. CÁC VÍ DỤ CÁCH VIẾT HÀM * Ví dụ 1: viết chương trình tính S,P hình chữ nhật bằng cách dùng hàm. #include “stdio.h” #include “conio.h” int tinhP(int dai,int rong); int tinhS(int dai,int rong); void main() { int dai,rong; printf (“Nhap dai,rong: ”); scanf(“%d %d”,&dai,&rong); printf (“Chu vi hcn là %d”,tinhP(dai,rong)); printf (“Dien tich hcn là %d”,tinhS(dai,rong)); } // Định nghĩa các hàm int tinhP(int dai,int rong) { int P; P=(dai+rong)*2; return P; } int tinhS(int dai,int rong) { int S; S=dai*rong; return S; } 2. CÁC VÍ DỤ CÁCH VIẾT HÀM * Ví dụ 2: viết chương trình giải ptb1 ax+b=0 dùng hàm. #include “stdio.h” #include “conio.h” void giaiPTB1(int a,int b); void main() { int a,b; printf (“Nhap a,b: ”); scanf(“%d %d”,&a,&b); giaiPTB1(a,b); } // Định nghĩa hàm giaiPTB1 void giaiPTB1(int a,int b) { float x; if (a==0) if (b==0) printf (“pt VSN”); else printf (“pt VN”); else { x=(float)-b/a; printf (“pt co nghiem x=%.2f”,x); } } 2. CÁC VÍ DỤ CÁCH VIẾT HÀM * Ví dụ 3: viết chương trình giải ptb2 ax^2+bx+c=0 dùng hàm. #include “stdio.h” #include “conio.h” void giaiPTB1(int a,int b); void giaiPTB2(int a,int bint c); void main() { int a,b,c; printf (“Nhap a,b,c: ”); scanf(“%d %d %d”,&a,&b,&c); giaiPTB2(a,b,c); } // Định nghĩa các hàm void giaiPTB1(int a,int b) { // xem lại vi dụ 2 } void giaiPTB2(int a,int b,int c) { if (a==0) // ptb1: bx+c=0 giaiPTB1(b,c); else { float delta,x1,x2; delta=b*b-4*a*c; if (delta<0) … if (delta==0) … if (delta>0) … } } 3. PHÂN LOẠI HÀM TRONG C * Xét ví dụ: viết CT hoán vị giá trị cho 2 số nguyên a,b như sau: … void main() { int a,b,tam; printf (“Nhap a,b: ”); scanf(“%d %d”,&a,&b); printf (“Truoc khi hvi a=%d b=%d”,a,b); tam=a; a=b; b=tam; printf (“Sau khi hvi a=%d b=%d”,a,b); } Tạo 3 vùng nhớ chứa số nguyên: a =0fx.. rác (-859…) b =1fx.. rác (-859…) tam =2fx.. rác (…) 5 6 5 6 5 Nhap a,b: Truoc khi hvi a=5 b=6 Sau khi hvi a=6 b=5 5 6 3. PHÂN LOẠI HÀM TRONG C * Xét ví dụ: viết CT hoán vị giá trị cho 2 số nguyên a,b bằng cách dùng hàm như sau: … void hoanvi(int a,int b); void main() { int a,b; printf (“Nhap a,b: ”); scanf(“%d %d”,&a,&b); printf (“Truoc khi hoan vi a=%d b=%d”,a,b); hoanvi(a,b); printf (“Sau khi hoan vi a=%d b=%d”,a,b); } void hoanvi(int a,int b) { int tam; tam=a; a=b; b=tam; } … void main() { int a,b,tam; printf (“Nhap a,b: ”); scanf(“%d %d”,&a,&b); // Xuat a,b tam=a; a=b; b=tam; // Xuat a,b da hoan vi } 3. PHÂN LOẠI HÀM TRONG C * Cách thực thi chương trình: … void hoanvi(int a,int b); void main() { int a,b; printf (“Nhap a,b: ”); scanf(“%d %d”,&a,&b); printf (“Truoc a=%d b=%d”,a,b); hoanvi(a,b); printf (“Sau a=%d b=%d”,a,b); } void hoanvi(int a,int b) { int tam; tam=a; a=b; b=tam; } Tạo 2 vùng nhớ chứa số nguyên: a= giá tri rác (-859…)0fx.. b= giá tri rác (-859…)1fx.. a= 50fx.. b= 61fx.. a'= 5 (lấy giá trị từ a)2ffx. b'= 6 (lấy giá trị từ b)3ffx. a'= 6 (hoán vị a=b)2ffx. b'= 5 (hoán vị b=tam)3ffx. Tạo 2 vùng nhớ phụ khác: Sau khi kết thúc hàm hoanvi 2 vùng nhớ phụ được giải phóng Thực hiện các lệnh để hoán vị: Không đổi 3. PHÂN LOẠI HÀM TRONG C * Cách khắc phục: truy cập trực tiếp đến địa chỉ vùng nhớ … void hoanvi(int &a,int &b); void main() { int a,b; printf (“Nhap a,b: ”); scanf(“%d %d”,&a,&b); printf (“Truoc a=%d b=%d”,a,b); hoanvi(a,b); printf (“Sau a=%d b=%d”,a,b); } void hoanvi(int &a,int &b) { int tam; tam=a; a=b; b=tam; } Tạo 2 vùng nhớ chứa số nguyên: Tạo 1 vùng nhớ: a =0fx.. rác (-859…) b =1fx.. rác (-859…) 5 6 6 5 tam =1fx.. rác (-859…)5 3. PHÂN LOẠI HÀM TRONG C * Nhận xét: từ ví dụ trên, ta phân loại hàm trong C theo 2 dạng cơ bản sau: a/ Hàm với đối số là tham trị (tham số vào/trang 98) b/ Hàm với đối số là tham biến (tham số ra/trang 98)  Lưu ý:  Ta có thể xây dựng hàm vừa có tham trị vừa có tham biến.  Tham số khi khai báo hàm gọi chung là tham số hình thức. Tham số khi gọi hàm trong CT gọi là tham số thực. 3. PHÂN LOẠI HÀM TRONG C a/ Hàm với đối số là tham trị:  Định nghĩa: là hàm không làm thay đổi giá trị của các tham số truyền vào khi hàm kết thúc.  Khai báo: ([DS_các tham_số])  Ví dụ: float tinhDTB(float van,float toan); float rutcan_bac_hai(float so); … 3. PHÂN LOẠI HÀM TRONG C b/ Hàm với đối số là tham biến:  Định nghĩa: là hàm làm thay đổi giá trị của các tham số truyền vào khi hàm kết thúc.  Khai báo cơ bản: ([&DS_các tham_số])  Ví dụ: void tinhDTB(float van,float toan, float &DTB); float rutcan_bac_hai(float so, float &kq); … 3. PHÂN LOẠI HÀM TRONG C * Các vấn đề liên quan đến biến: (xem trang 100) a/ Địa chỉ của biến: là địa chỉ vùng nhớ của máy tính khi ta khai báo biến (qui ước: đó là số thứ tự của byte đầu tiên trong một dãy các byte liên tiếp) => Cú pháp để lấy địa chỉ của biến: & b/ Biến con trỏ: là một loại biến dùng để lưu địa chỉ của biến. (phụ thuộc vào kiểu dữ liệu của biến) => Cú pháp khai báo biến con trỏ: *; => Qui tắc sử dụng: biến con trỏ bắt buộc phải sử dụng kết hợp với địa chỉ của vùng nhớ. 3. PHÂN LOẠI HÀM TRONG C * Ví dụ: cách sử dụng biến con trỏ: … void main() { int a=5; printf(“Truoc a=%d”,a); int *p; // khai báo con trỏ p=&a; // gán vào địa chỉ biến a *p=7; // Thay đổi giá trị biến a printf(“Sau: a=%d”,a); } Tạo vùng nhớ chứa số nguyên a: a =0fx.. 57 Truoc a=5 Sau a=7 1fx.. p NULL 3. PHÂN LOẠI HÀM TRONG C * Các vấn đề liên quan đến biến: (xem trang 115,117) c/ Biến cục bộ (biến nội): là các biến khai báo bên trong thân của một hàm  Thời gian tồn tại: từ lúc hàm bắt đầu cho đến khi hàm đó kết thúc (như vậy các biến khai báo trong hàm main() tồn tại cho đến khi kết thúc chương trình)  Phạm vi sử dụng: chỉ sử dụng bên trong hàm mà nó được khai báo d/ Biến toàn cục (biến ngoại): là các biến được khai báo bên ngoài các hàm Thời gian tồn tại: tồn tại trong suốt chương trình  Phạm vi sử dụng: từ vị trí nó được khai báo cho đến cuối chương trình. 3. PHÂN LOẠI HÀM TRONG C * Bảng tóm tắt về cách dùng hàm: Hàm Tham số hình thức trong khai báo hàm Tham số thực trong hàm main Đối số là tham trị int binhphuong(int a) int a,kq; kq=binhphuong(a); Đối số là tham biến (thay đổi giá trị của tham số truyền vào) Khai báo dạng địa chỉ của biến void hoanvi(int &a,int &b) int a=5,b=6; hoanvi(a,b); Khai báo dạng biến con trỏ void hoanvi(int *a,int *b) int a=5,b=6; hoanvi(&a,&b);