.c om ng co an th ng du o u cu Company LOGO CuuDuongThanCong.com https://fb.com/tailieudientucntt Các nội dung: u du o ng th an co ng c om Khái niệm hàm Khai báo hàm Đối số hàm - đối số tham trị Kết trả hàm - lệnh RETURN PROTOTYPE hàm Hàm đệ quy cu CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt KHÁI NIỆM HÀM cu u du o ng th an co ng c om Chương trình đoạn chương trình đảm nhận thực thao tác định Đối với C, chương trình dạng hàm (function), khơng có khái niệm thủ tục (procedure) CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt KHÁI NIỆM HÀM cu u du o ng th an co ng c om Hàm main() hàm đặc biệt C, hàm mà thao tác lệnh (bao gồm biểu thức tính tốn, gọi hàm, ) C thực theo trình tự hợp logic để giải toán đặt Việc sử dụng hàm làm cho chương trình trở nên dễ quản lý, dễ sửa sai Tất hàm ngang cấp Các hàm gọi lẫn nhau, dĩ nhiên hàm gọi phải khai báo trước hàm gọi CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt KHÁI NIỆM HÀM cu u du o ng th an co ng c om Các hàm chương trình nằm tập tin khác khác với tập tin (chứa hàm main()), tập tin gọi module chương trình Các module chương trình dịch riêng rẽ sau liên kết (link) lại với để tạo tập tin thực thi Cách tạo chương trình theo kiểu nhiều module C project CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt KHÁI NIỆM HÀM cu u du o ng th an co ng c om #include #include #include main () { double a, b, c, delta, n1, n2; clrscr(); printf ("Nhap he so phuong trinh bac hai; "); scanf ("%lf %lf %lf", &a, &b, &c); CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt KHÁI NIỆM HÀM cu u du o ng th an co ng c om if (a ==0)/* phuong trinh suy bien ve bac nhat */ { printf ("Phuong trinh suy bien ve bac nhat va "); if (b == 0) if (c == 0) printf ("vo so nghiem\n"); else /* c != */ printf ("vo nghiem\n"); else / * b != */ { n1 = -c/b; printf ("co nghiem: = %5.2f \n", n1); } } CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt KHÁI NIỆM HÀM cu u du o ng th an co ng c om else /* a != */ { 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); } CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt KHÁI NIỆM HÀM c om else /* delta > */ { u } getch(); cu } du o ng th an co ng n1 = (-b + sqrt(delta))/2/a; n2 = (-b - sqrt(delta))/2/a; printf ("co hai nghiem phan biet; \n"); printf ("x1 = %5.2f \n", n1); printf ( x2 = %5.2f \n", n2); } CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt KHÁI NIỆM HÀM cu u du o ng th an co ng c om #include #include #include void gptb1 (double a, double b); void gptb2 (double a, double b, double c); CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 10 KẾT QUẢ TRẢ VỀ CỦA HÀM cu u du o ng th an co ng c om void so_sanh (int a, int b) { if (a > b) printf ("So %d lon hon so %d", a, b); else if (a == b) printf ("So %d bang so %d", a, b); else /* a < b */ printf ("So %d nho hon s %d", a, b); } CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 35 KẾT QUẢ TRẢ VỀ CỦA HÀM cu u du o ng th an co ng c om Khi khai báo hàm mà ta không nêu cụ thể kiểu trả hàm, C xem hàm trả kết int so_sanh (int a, int b) { if (a > b) return 1; else if (a == b) return 0; else /* a < b */ return -1; } CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 36 KẾT QUẢ TRẢ VỀ CỦA HÀM cu u du o ng th an co ng c om Đối với hàm có kiểu trả trị khác int, khai báo cần phải trình bày đầy đủ thành phần hàm Khi gọi sử dụng hàm hàm gọi cần phải có nêu kết trả hàm gọi Kiểu khai báo kết đặt bên ngồi tất hàm để thông báo cho tất hàm trị trả nó, đặt hàm mà hàm sử dụng gọi: kiểu © TS Nguyễn Phúc Khải 37 tên_hàm(); CuuDuongThanCong.com https://fb.com/tailieudientucntt KẾT QUẢ TRẢ VỀ CỦA HÀM u du o ng th an co ng int so_sanh (); int so1, so2; clrscr(); printf ("Moi nhap hai so: "); scanf ("%d %d", &so1, &so2); so_sanh (so1, so2); getch(); } cu { c om main() CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 38 PROTOTYPE CỦA MỘT HÀM cu u du o ng th an co ng c om Như để hàm sử dụng hàm khác hàm sử dụng phải có khai báo hàm cần sử dụng Tuy nhiên khai báo hạn chế chỗ không cho phép kiểm tra số đối số thật đưa vào hàm kiểu đối số có phù hợp khơng CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 39 PROTOTYPE CỦA MỘT HÀM cu u du o ng th an co ng c om Để khắc phục lỗi trên, phát triển sau C theo ANSI, người ta đưa khái niệm prototype hàm, thật dạng khai báo hàm mở rộng hơn, có dạng tổng quát 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); CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 40 PROTOTYPE CỦA MỘT HÀM cu u du o ng th an co ng c om C cho phép khai báo prototype hàm phần khai báo đối số cần có kiểu mà khơng cần có tên đối số giả Ví dụ : int so_sanh (int, int); CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 41 PROTOTYPE CỦA MỘT HÀM cu u du o ng th an co ng c om Công dụng prototype hàm: prototype hàm việc dùng để khai báo kiểu kết trả từ hàm, dùng để kiểm tra số đối số Ví dụ: Nếu khai báo prototype int so_sanh (int a, int b); mà gọi hàm ta gửi đối số sau: so_sanh (so2); bị C phát báo lỗi CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 42 PROTOTYPE CỦA MỘT HÀM cu u du o ng th an co ng c om Chuyển kiểu đối số: hàm gọi, mà hàm có prototype, đối số gởi cho hàm chuyển kiểu bắt buộc theo kiểu đối số khai báo prototype, chuyển kiểu làm cho đối số sử dụng phù hợp với phép toán thân hàm Trường hợp mà chuyển kiểu không cho phép thực C đưa thông báo lỗi, lời cảnh báo (warning) CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 43 PROTOTYPE CỦA MỘT HÀM cu u du o ng th an co ng c om Đối với hàm chuẩn thư viện C, prototype chúng viết sẵn để file có phần mở rộng h, muốn lấy prototype vào chương trình ta cần thị bao hàm file h chứa prototype hàm cần sử dụng vào đầu chương trình lệnh tiền xử lý #include theo cú pháp sau: # include CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 44 HÀM ĐỆ QUY cu u du o ng th an co ng c om C cho phép hàm gọi đến cách trực tiếp, gián tiếp (tức gọi qua trung gian hàm khác), ta nói hàm có tính đệ quy (recursive) Một giải thuật đệ quy dẫn đến lặp lặp lại không kết thúc thao tác, thực tế, chúng cần phải kết thúc, sử dụng điều kiện kết thúc đệ quy CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 45 HÀM ĐỆ QUY cu u du o ng th an co ng c om #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; } CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 46 cu u du o ng th an co ng long factorial (long so) { if (so > 1) return (factorial(so - 1) * so); else return 1; } c om HÀM ĐỆ QUY CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 47 Bài tập co ng c om Thiết kế hàm tính biểu thức sau đây: S =(1)! + (1+2)! + + (1+ +n)! cu u du o ng th an Thiết kế hàm in hình n chuỗi số Fibonaci, với n thông số nhập từ bàn phím số từ đến 100 Viết hàm nhận số thực dương có phần lẻ in hình phần nguyên phần lẻ riêng biệt CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 48 .c om ng co an th ng du o u cu CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 49 ... b*b - 4*a*c; if (delta < 0) printf ("vo nghiem thuc\n"); else if (delta == 0) printf ("co nghiem kep x1 = x2 = %5.2f \n", -b/2/a); else /* delta > */ { x1 = (-b + sqrt(delta))/2/a; x2 = (-b - sqrt(delta))/2/a;... NIỆM HÀM c om else /* delta > */ { u } getch(); cu } du o ng th an co ng n1 = (-b + sqrt(delta))/2/a; n2 = (-b - sqrt(delta))/2/a; printf ("co hai nghiem phan biet; \n"); printf ("x1 = %5.2f... ng c om 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(); }