Bài giảng Hệ thống máy tính và ngôn ngữ lập trình - Chương Hàm - Nguyễn Phúc Khải

Khái niệm hàm
 Khai báo hàm
 Đối số của hàm - đối số là tham trị
 Kết quả trả về của hàm - lệnh RETURN
 PROTOTYPE của một hàm
 Hàm đệ quy 
pdf 49 trang xuanthi 29/12/2022 2500
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ thống máy tính và ngôn ngữ lập trình - Chương Hàm - Nguyễn Phúc Khải", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfbai_giang_he_thong_may_tinh_va_ngon_ngu_lap_trinh_chuong_ham.pdf

Nội dung text: Bài giảng Hệ thống máy tính và ngôn ngữ lập trình - Chương Hàm - Nguyễn Phúc Khải

  1. Các nội dung: . Khái niệm hàm . Khai báo hàm . Đối số của hàm - đối số là tham trị . Kết quả trả về của hàm - lệnh RETURN . PROTOTYPE của một hàm . Hàm đệ quy © TS. Nguyễn Phúc Khải 2
  2. KHÁI NIỆM HÀM . Hàm main() là hàm đặc biệt của C, nó là một hàm mà trong đó các thao tác lệnh (bao gồm các biểu thức tính toán, gọi hàm, ) được C thực hiện theo một trình tự hợp logic để giải quyết bài toán được đặt ra. . Việc sử dụng hàm sẽ làm cho chương trình trở nên rất dễ quản lý, dễ sửa sai. . Tất cả các hàm đều ngang cấp nhau. Các hàm đều có thể gọi lẫn nhau, dĩ nhiên hàm được gọi phải được khai báo trước hàm gọi. © TS. Nguyễn Phúc Khải 4
  3. KHÁI NIỆM HÀM #include #include #include main () { double a, b, c, delta, n1, n2; clrscr(); printf ("Nhap 3 he so phuong trinh bac hai; "); scanf ("%lf %lf %lf", &a, &b, &c); © TS. Nguyễn Phúc Khải 6
  4. KHÁI NIỆM HÀM else /* a != 0 */ { printf ("Phuong trinh bac hai va "); delta = b*b - 4*a*c; if (delta < 0) printf ("vo nghiem thuc\n"); else if (delta == 0) { n1 = n2 = -b/2/a; printf ("co nghiem kep x1=x2 = %5.2f \n" ,n1); } © TS. Nguyễn Phúc Khải 8
  5. KHÁI NIỆM HÀM #include #include #include void gptb1 (double a, double b); void gptb2 (double a, double b, double c); © TS. Nguyễn Phúc Khải 10
  6. KHÁI NIỆM HÀM void gptb2 (double a,double b,double c) { double delta, x1, x2; printf ("Phuong trinh bac hai va "); delta = b*b - 4*a*c; if (delta 0 */ { x1 = (-b + sqrt(delta))/2/a; x2 = (-b - sqrt(delta))/2/a; printf ("co hai nghiem phan biet: \n"); printf ("x1 = %5.2f \n ", x1); printf ("x2 = %5.2f \n" , x2); } } © TS. Nguyễn Phúc Khải 12
  7. KHAI BÁO HÀM . Khai báo một hàm là chỉ ra rõ rằng trả về kiểu gì, đối số đưa vào cho hàm có bao nhiêu đối số, mỗi đối số có kiểu như thế nào và các lệnh bên trong thân hàm xác định thao tác của hàm. . Có hai loại hàm: hàm trong thư viện và hàm do lập trình viên tự định nghĩa. © TS. Nguyễn Phúc Khải 14
  8. KHAI BÁO HÀM . Nếu các hàm sử dụng là do lập trình viên tự định nghĩa thì việc khai báo hàm bao gồm hai việc: khai báo prototype của hàm đầu chương trình và định nghĩa các lệnh bên trong thân hàm (hay thường được gọi tắt là định nghĩa hàm). © TS. Nguyễn Phúc Khải 16
  9. KHAI BÁO HÀM int so_sanh (int a, int b) { int ket_qua; if (a >b) ket_qua = 1: else if (a == b) ket_qua = 0; else if (a < b) ket_qua = -1; return ket_qua; } © TS. Nguyễn Phúc Khải 18
  10. KHAI BÁO HÀM switch (ket_qua) { case -1: printf ("So %d nho hon so %d \n" , a, b); break; case 0: printf ("So %d bang so %d \n", a, b); break; case 1: printf ("So %d lon hon so %d \n" , a, b); break; } getch(); } © TS. Nguyễn Phúc Khải 20
  11. ĐỐI SỐ CỦA HÀM - ĐỐI SỐ LÀ THAM TRỊ . Khi gọi hàm thì đối số thật cần gởi cho hàm chỉ được gởi dưới dạng tham số trị, có nghĩa là các biến, trị hoặc biểu thức được gởi đến cho một hàm, qua đối số của nó, sẽ được lấy trị để tính toán trong thân hàm. . Có thể nói trị của biến thật bên ngoài khi gọi hàm đã được chép sang đối số giả, ta có thể xem như là biến cục bộ của hàm, và mọi việc tính toán chỉ được thực hiện trên biến cục bộ này mà thôi. © TS. Nguyễn Phúc Khải 22
  12. ĐỐI SỐ CỦA HÀM - ĐỐI SỐ LÀ THAM TRỊ #include #include double luy_thua(double x, int n); main() { int n; double x, xn; clrscr(); printf ("Moi nhap so tinh luy thua: "); scant ("%lf", &x); printf ("Moi nhap so luy thua: "); scanf ("%d", &n); xn =luy_thua (x, n); © TS. Nguyễn Phúc Khải 24
  13. ĐỐI SỐ CỦA HÀM - ĐỐI SỐ LÀ THAM TRỊ . Ta có thể gọi hàm luy_thua() và truyền cho hàm này một biểu thức: xn = luy_thua( 3*a + x , 5); . Tuy nhiên, cách truyền tham số như trên không thể thay đổi trị của biến, mà điều này đôi khi lại cần thiết. © TS. Nguyễn Phúc Khải 26
  14. ĐỐI SỐ CỦA HÀM - ĐỐI SỐ LÀ THAM TRỊ void nhap_tri (int a, int b) { printf ("Moi nhap hai so: "); scanf ("%d %d", &a, &b); } © TS. Nguyễn Phúc Khải 28
  15. KẾT QUẢ TRẢ VỀ CỦA HÀM . Trong chương trình, ta cũng biết lệnh return dùng để thực hiện việc trả trị của hàm về cho nơi gọi nó, dù trị này có được sử dụng hay không tùy nơi gọi. © TS. Nguyễn Phúc Khải 30
  16. KẾT QUẢ TRẢ VỀ CỦA HÀM main() { int so1, so2; clrscr(); printf("Moi nhap hai so: "); scanf ("%d %d", &so1, &so2); so_sanh (so1, so2); getch(); } © TS. Nguyễn Phúc Khải 32
  17. KẾT QUẢ TRẢ VỀ CỦA HÀM switch (kq) { case -1: printf (", nen tri tuyet doi hieu hai so la: %d\n,so2-so1"); break; case 0: case 1: printf (", tri tuyet doi hieu hai so la %d\n , so1-so2"); break; } getch(); } © TS. Nguyễn Phúc Khải 34
  18. KẾT QUẢ TRẢ VỀ CỦA HÀM . Khi khai báo hàm mà ta không nêu cụ thể kiểu trả về của hàm, C mặc nhiên xem như hàm trả về kết quả là int. so_sanh (int a, int b) { if (a > b) return 1; else if (a == b) return 0; else /* a < b */ return -1; } © TS. Nguyễn Phúc Khải 36
  19. KẾT QUẢ TRẢ VỀ CỦA HÀM main() { int so_sanh (); int so1, so2; clrscr(); printf ("Moi nhap hai so: "); scanf ("%d %d", &so1, &so2); so_sanh (so1, so2); getch(); } © TS. Nguyễn Phúc Khải 38
  20. PROTOTYPE CỦA MỘT HÀM . Để khắc phục những lỗi trên, trong những phát triển sau này của C theo ANSI, người ta đưa ra khái niệm prototype của một hàm, đây thật sự là một dạng khai báo hàm mở rộng hơn, có dạng tổng quát như sau: kiểu tên_hàm (danh_sách_khai_báo_đối_số); . Ví dụ : int so_sanh (int a, int b); . void gptb1 (double a, double b, doubbe c); . char kiem_tra (double n); © TS. Nguyễn Phúc Khải 40
  21. PROTOTYPE CỦA MỘT HÀM . Công dụng của prototype của hàm: prototype của một hàm ngoài việc dùng để khai báo kiểu của kết quả trả về từ một hàm, nó còn được dùng để kiểm tra số đối số. . Ví dụ: Nếu đã khai báo prototype int so_sanh (int a, int b); . mà khi gọi hàm ta chỉ gửi một đối số như sau: so_sanh (so2); . thì sẽ bị C phát hiện và báo lỗi © TS. Nguyễn Phúc Khải 42
  22. PROTOTYPE CỦA MỘT HÀM . Đối với các hàm chuẩn trong thư viện C, prototype của chúng đã được viết sẵn và để trong các file có phần mở rộng là .h, muốn lấy các prototype này vào chương trình ta cần ra chỉ thị bao hàm file .h chứa prototype của các hàm cần sử dụng vào đầu chương trình bằng lệnh tiền xử lý #include theo cú pháp sau: # include © TS. Nguyễn Phúc Khải 44
  23. HÀM ĐỆ QUY #include #include long factorial (long so); int main() { long so, kq = 0; clrscr(); printf ("Moi nhap mot so khac 0: "); scanf ("%ld", &so); kq = factorial (so); printf ("Ket qua %ld! la %ld \n", so, kq); getch(); return 0; } © TS. Nguyễn Phúc Khải 46
  24. Bài tập . Thiết kế hàm tính các biểu thức sau đây: S =(1)! + (1+2)! + + (1+ +n)! . Thiết kế hàm in ra màn hình n chuỗi số Fibonaci, với n thông số nhập từ bàn phím trong số từ 1 đến 100. . Viết một hàm nhận một số thực dương có phần lẻ và in ra màn hình phần nguyên và phần lẻ riêng biệt. © TS. Nguyễn Phúc Khải 48