1. Trang chủ
  2. » Tất cả

Chuong 9

49 0 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Company LOGO Các nội dung:       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 © TS Nguyễn Phúc Khải KHÁI NIỆM HÀM  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) © TS Nguyễn Phúc Khải KHÁI NIỆM HÀM  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 © TS Nguyễn Phúc Khải KHÁI NIỆM HÀM  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 © TS Nguyễn Phúc Khải KHÁI NIỆM HÀM #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); © TS Nguyễn Phúc Khải KHÁI NIỆM HÀM 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); } } © TS Nguyễn Phúc Khải KHÁI NIỆM HÀM 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); } © TS Nguyễn Phúc Khải KHÁI NIỆM HÀM else /* delta > */ { 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); } } getch(); } © TS Nguyễn Phúc Khải 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 KẾT QUẢ TRẢ VỀ CỦA HÀM 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); } © TS Nguyễn Phúc Khải 35 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ả 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; } © TS Nguyễn Phúc Khải 36 KẾT QUẢ TRẢ VỀ CỦA HÀM  Đố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(); 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 PROTOTYPE CỦA MỘT HÀM  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 © TS Nguyễn Phúc Khải 39 PROTOTYPE CỦA MỘT HÀM  Để 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); © TS Nguyễn Phúc Khải 40 PROTOTYPE CỦA MỘT HÀM  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); © TS Nguyễn Phúc Khải 41 PROTOTYPE CỦA MỘT HÀM  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, cịn 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 © TS Nguyễn Phúc Khải 42 PROTOTYPE CỦA MỘT HÀM  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) © TS Nguyễn Phúc Khải 43 PROTOTYPE CỦA MỘT HÀM  Đố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 © TS Nguyễn Phúc Khải 44 HÀM ĐỆ QUY  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 © TS Nguyễn Phúc Khải 45 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 HÀM ĐỆ QUY long factorial (long so) { if (so > 1) return (factorial(so - 1) * so); else return 1; } © TS Nguyễn Phúc Khải 47 Bài tập  Thiết kế hàm tính biểu thức sau đây: S =(1)! + (1+2)! + + (1+ +n)!  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 © TS Nguyễn Phúc Khải 48 © TS Nguyễn Phúc Khải 49

Ngày đăng: 04/04/2023, 09:59

w