Xem mẫu

  1. TIN HỌC ĐẠI CƯƠNG Ngôn ngữ lập trình: C Lý thuyết: 6 buổi Thực hành: 8 buổi GVHD: Dương Khai Phong Email: khaiphong@gmail.com
  2. 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
  3. 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.
  4. 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.
  5. 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
  6. 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:  Cách 2: dùng hàm #include “stdio.h” #include “stdio.h” #include “conio.h” #include “conio.h” int binhphuong(int i); void main() void main() { { int a,kq; int a,binhphuong; printf (“Nhap a = ”); printf (“Nhap a = ”); scanf(“%d”,&a); kq=binhphuong(a); scanf(“%d”,&a); printf (“Binh phuong của %d là binhphuong=a*a; %d”,a,kq); printf (“Binh phuong của } %d là %d”,a,binhphuong); int binhphuong(int i) } { int kq; kq=i*i; return kq; }
  7. 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 “,”
  8. 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ó;] }
  9. 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” int tinhP(int dai,int rong) #include “conio.h” { int tinhP(int dai,int rong); int P; int tinhS(int dai,int rong); P=(dai+rong)*2; void main() return P; { int dai,rong; } printf (“Nhap dai,rong: ”); int tinhS(int dai,int rong) scanf(“%d %d”,&dai,&rong); { printf (“Chu vi hcn là %d”,tinhP(dai,rong)); int S; printf (“Dien tich hcn là %d”,tinhS(dai,rong)); S=dai*rong; } return S; // Định nghĩa các hàm }
  10. 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” void giaiPTB1(int a,int b) #include “conio.h” { void giaiPTB1(int a,int b); float x; void main() if (a==0) { int a,b; if (b==0) printf (“Nhap a,b: ”); printf (“pt VSN”); scanf(“%d %d”,&a,&b); else giaiPTB1(a,b); printf (“pt VN”); } else // Định nghĩa hàm giaiPTB1 { x=(float)-b/a; printf (“pt co nghiem x=%.2f”,x); } }
  11. 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” void giaiPTB1(int a,int b) { #include “conio.h” // xem lại vi dụ 2 void giaiPTB1(int a,int b); } void giaiPTB2(int a,int bint c); void giaiPTB2(int a,int b,int c) void main() { { int a,b,c; if (a==0) // ptb1: bx+c=0 printf (“Nhap a,b,c: ”); giaiPTB1(b,c); scanf(“%d %d %d”,&a,&b,&c); else giaiPTB2(a,b,c); { } float delta,x1,x2; // Định nghĩa các hàm delta=b*b-4*a*c; if (delta0) … } }
  12. 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: Tạo 3 vùng nhớ chứa số nguyên: … 0fx.. a = rác (-859…) 5 6 void main() 1fx.. b = rác (-859…) 65 { int a,b,tam; 2fx.. tam = rác (…) 5 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); } Nhap a,b: 5 6 Truoc khi hvi a=5 b=6 Sau khi hvi a=6 b=5
  13. 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 main() void hoanvi(int a,int b); { int a,b,tam; void main() printf (“Nhap a,b: ”); { int a,b; scanf(“%d %d”,&a,&b); printf (“Nhap a,b: ”); // Xuat a,b scanf(“%d %d”,&a,&b); tam=a; printf (“Truoc khi hoan vi a=%d b=%d”,a,b); a=b; hoanvi(a,b); b=tam; printf (“Sau khi hoan vi a=%d b=%d”,a,b); // Xuat a,b da hoan vi } } void hoanvi(int a,int b) { int tam; tam=a; a=b; b=tam; }
  14. 3. PHÂN LOẠI HÀM TRONG C * Cách thực thi chương trình: Tạo 2 vùng nhớ chứa số nguyên: … 0fx.. a= giá tri rác (-859…) void hoanvi(int a,int b); void main() 1fx.. b= giá tri rác (-859…) { int a,b; printf (“Nhap a,b: ”); 0fx.. a= 5 Không scanf(“%d %d”,&a,&b); printf (“Truoc a=%d b=%d”,a,b); 1fx.. b= 6 đổi hoanvi(a,b); printf (“Sau a=%d b=%d”,a,b); Tạo 2 vùng nhớ phụ khác: } 2ffx. a'= 5 (lấy giá trị từ a) void hoanvi(int a,int b) { int tam; 3ffx. b'= 6 (lấy giá trị từ b) tam=a; Thực hiện các lệnh để hoán vị: a=b; Sau khi kết thúc hàm b=tam; hoanvi 2 vùng nhớ phụ 2ffx. a'= 6 (hoán vị a=b) } được giải phóng 3ffx. b'= 5 (hoán vị b=tam)
  15. 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ớ … Tạo 2 vùng nhớ chứa số nguyên: void hoanvi(int &a,int &b); void main() 0fx.. a = rác (-859…) 5 6 { int a,b; printf (“Nhap a,b: ”); 1fx.. b = rác (-859…) 65 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) Tạo 1 vùng nhớ: { int tam; 1fx.. tam = rác (-859…) 5 tam=a; a=b; b=tam; }
  16. 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.
  17. 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); …
  18. 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); …
  19. 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ớ.
  20. 3. PHÂN LOẠI HÀM TRONG C * Ví dụ: cách sử dụng biến con trỏ: Tạo vùng nhớ chứa số … nguyên a: void main() 0fx.. a = 57 { 1fx.. p NULL 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); } Truoc a=5 Sau a=7
nguon tai.lieu . vn