Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 15 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
15
Dung lượng
279,56 KB
Nội dung
KỸ THUẬT LẬP TRÌNH C Chương 5: Xây dựng hàm bangtqh@hotmail.com 04/2010 Khái niệm hàm (function) • Hàm (function) dãy lệnh nhằm thực công việc đó, thường sử dụng nhiều lần • Ví dụ – Hàm tính sin, cos, tan, … toán học – Hàm tính max, min, TBC, TBN dãy số, … • Một chương trình C dãy hàm, có hàm chính, ñược đặt tên main • Trong C không chấp nhận khái niệm hàm lồng hàm bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 04/2010 Ví dụ hàm C #include #include float max2so(float a, float b); /* Nguyên mẫu hàm */ void main() /* bắt đầu hàm */ { float x, y; printf(“Nhập vào số: ”); scanf(“%f%f”, &x, &y); printf(“Giá trị lớn %f %f %f\n”, x, y, max2so(x, y)); getch(); } /* kết thúc hàm main */ /* định nghĩa hàm max2so */ float max2so(float a, float b) { float max; /* khai báo biến cục */ max = a > b ? a : b; return max; } bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 04/2010 Hàm C • Định nghĩa hàm – Cú pháp kiểu_dữ_liệu_trả_về_của_hàm TÊNHÀM ([khai_báo_các_tham_số]) { /* khai báo dùng riêng bên hàm có; */ /* lệnh bên hàm; */ [return giá_trị_trả_về;] } – Định nghĩa hàm ñặt trước sau hàm main • Nếu định nghĩa hàm đặt sau hàm main thi phải khai báo nguyên mẫu hàm (prototype) ñầu chương trình • Nên định nghĩa hàm sau hàm main khai báo nguyên mẫu hàm bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 04/2010 Hàm C • Định nghĩa hàm – Kiểu liệu trả hàm kiểu liệu tham số kiểu liệu chuẩn người lập trình định nghĩa – Tên hàm tên tham số ñặt theo quy tắc tên biến – Câu lệnh return tùy chọn • Nếu hàm không trả giá trị, không cần có lệnh return • Nếu hàm trả giá trị bắt buộc phải có lệnh return, trường hợp giá trị trả phải có kiểu với kiểu liệu trả hàm – Nếu hàm không trả giá trị khai báo kiểu trả hàm void – Nếu hàm tham số hình thức sử dụng từ khóa void, không khai báo bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 04/2010 Hàm C • Lưu ý – Không cho phép định nghĩa hàm bên hàm khác – Các tham số hình thức biến định nghĩa bên hàm (biến cục bộ) sử dụng bên hàm • Bài tập ví dụ – Viết hàm kiểm tra số thực có cạnh tam giác – Mở rộng: cạnh tam giác xác định tam giác (cân, vuông, đều) bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 04/2010 Hàm C • Lời gọi hàm – Hàm sử dụng thông qua lời gọi hàm – Cú pháp: tên_hàm ( [danh sách tham số thực] ); – Cần phân biệt • Tham số hình thức hay ñối: xuất định nghĩa hàm • Tham số thực: xuất lời gọi hàm – Ví dụ max2so(12, 341); – Lưu ý • Số tham số thực phải số tham số hình thức • Kiểu tham số thực phải phù hợp với kiểu tham số hình thức bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 04/2010 Hàm C • Ví dụ: viết hàm tính giá trị n! #include #include long giai_thua(int n); /* nguyên mẫu hàm */ void main(){ int n; long gt; printf("\nn = "); scanf("%d", &n); /* Đọc số n */ gt = giai_thua(n); /* gọi hàm tính giai thừa */ printf("\n n! = %ld\n", gt); /* In kết */ getch(); } long giai_thua(int n) { int i; long gt = 1; if (n < 0) gt = 0; else for (i=2; i y) return usc(x-y, y); else return usc(x, y-x); } Viết lại hàm usc dùng vòng lặp Hãy viết chương trình sử dụng hàm đệ quy ñể tạo dãy số Fibonacci – Dãy số Fibonacci dãy số F1, F2, F3, Fn có quy luật: Fn = Fn-1 + Fn-2 Với F1=1, F2=1 – Hàm đệ quy tìm Ước số chung lớn số x, y bangtqh@hotmail.com Vd: 1, 1, 2, 3, 5, 8, 13, 21, Viết hàm đệ quy ñảo ngược xâu ký tự s nhập từ bàn phím Kỹ thuật lập trình C - Xây dựng Hàm 28 04/2010 Hàm chuẩn C • • • • • • Là định nghĩa sẵn printf, scanf, puts, gets, … (thư viện stdio.h) clrscr, getch, getche, … (thư viện conio.h) rand, randomize, … (thư viện stdlib.h) abs, fabs, sqrt, sin, cos, tan, … ( thư viện math.h) … bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 29 04/2010 bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 30 [...]...04/2010 Do c chế biến c c bộ hay tham số hình th c bị giải phóng bộ nhớ khi hàm kết th c Chương trình trên cho kết quả không đúng ! • Hãy truyền tham số th c cho hàm là địa chỉ biến thay vì truyền giá trị biến • Sử dụng tham số là con trỏ bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 21 04/2010 #include #include void hoan_vi(int *a, int *b);... loại tham số hình th c • Tham số hình th c chỉ nhận giá trị truyền vào để hàm thao t c, trường hợp c thể gọi là tham số vào • Tham số hình th c dùng để chứa kết quả c a hàm, trường hợp này c thể gọi là tham số ra – Đối với tham số ra ta phải sử dụng kiểu con trỏ • Bài tập – Giải thích tham số c a lệnh scanf – Viết hàm giải phương trình b c hai bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 23... chương trình sử dụng hàm đệ quy ñể tạo dãy số Fibonacci – Dãy số Fibonacci là dãy số F1, F2, F3, Fn c quy luật: Fn = Fn-1 + Fn-2 Với F1=1, F2=1 – Hàm đệ quy tìm Ư c số chung lớn nhất c a 2 số x, y bangtqh@hotmail.com Vd: 1, 1, 2, 3, 5, 8, 13, 21, 3 Viết hàm đệ quy ñảo ngư c 1 xâu ký tự s bất kỳ nhập từ bàn phím Kỹ thuật lập trình C - Xây dựng Hàm 28 04/2010 Hàm chuẩn trong C • • • • • • Là c c đã đư c. .. hai c ch viết đệ quy và lặp bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 26 04/2010 Hàm đệ quy trong C • Hàm đệ quy thường phù hợp để giải quyết c c bài toán c ñ c trưng – Bài toán dễ dàng giải quyết trong một số trường hợp riêng, ñó chính là điều kiện dừng đệ quy – Trong trường hợp tổng quát, bài toán suy về c ng dạng nhưng giá trị tham số bị thay ñổi • Ví dụ: Tìm ư c số chung lớn nhất c a... Ư c số chung lớn nhất c a hai số nguyên dương đư c định nghĩa như sau • nếu x = y thì usc(x, y) = x • nếu x > y thì usc(x, y) = usc(x-y, y) • nếu x < y thì usc(x, y) = usc(x, y-x) bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 27 04/2010 int usc(int x, int y){ if (x == y) return (x); else if (x > y) return usc(x-y, y); else return usc(x, y-x); } 1 Viết lại hàm usc dùng vòng lặp 2 Hãy viết chương. .. giai_thua(n-1)); } – Sử dụng hàm đệ quy c n một bộ nhớ xếp chồng LIFO (Last In, First Out stack) để lưu trữ c c giá trị trung gian – Giải thích c chế hoạt động hàm giai_thua với lời gọi hàm giai_thua(3) bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 25 04/2010 Hàm đệ quy trong C • Điều gì xảy ra nếu c lời gọi hàm sau k = giai_thua(-1); • Kh c ph c ? • Hạn chế c a hàm đệ quy – Dùng nhiều bộ nhớ... trong C • • • • • • Là c c đã đư c định nghĩa sẵn printf, scanf, puts, gets, … (thư viện stdio.h) clrscr, getch, getche, … (thư viện conio.h) rand, randomize, … (thư viện stdlib.h) abs, fabs, sqrt, sin, cos, tan, … ( thư viện math.h) … bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 29 04/2010 bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 30 ... trình C - Xây dựng Hàm 23 04/2010 Hàm đệ quy trong C • Là hàm mà từ trong thân hàm c lời gọi tới chính hàm đó • Hàm đệ quy ñư c xây dựng dựa trên định nghĩa đệ quy trong toán h c • Ví dụ: ñịnh nghĩa giai thừa c a n (n!) n! = 1.2.3…n Ho c n! = 1 n.(n-1)! bangtqh@hotmail.com khi n = 0 khi n >= 1 Kỹ thuật lập trình C - Xây dựng Hàm 24 04/2010 Hàm đệ quy trong C – Viết hàm đệ quy tính n! long giai_thua (int... printf(" Trư c khi gọi hàm : %d %d\n", n, p); hoan_vi(&n, &p); printf(" Sau khi gọi hàm : %d %d\n", n, p); getch(); } void hoan_vi(int *a, int *b){ int t; printf(" Trư c khi hoán vị : %d %d\n", *a, *b); t=*a; *a=*b; *b=t; : %d %d\n", *a, *b); printf(" Sau khi hoán vị } bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 22 04/2010 Truyền tham số cho hàm • Khi nào thì dùng tham số là con trỏ ? – C n phân ... c c tĩnh biến toàn c c – C ng tồn suốt thời gian chương trình hoạt động • Sự kh c biến c c tĩnh biến toàn c c – Biến toàn c c ñư c sử dụng kể từ vị trí khai báo đến cuối chương trình – Biến c c. .. toàn c c bị hủy chương trình kết th c – Sau hàm kết th c hoạt động tham số hình th c biến c c bị hủy bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 10 04/2010 Biến toàn c c, biến c c •... bangtqh@hotmail.com Kỹ thuật lập trình C - Xây dựng Hàm 11 04/2010 Biến toàn c c, biến c c • Lưu ý – Biến toàn c c sử dụng khắp chương trình – Vi c thay đổi tùy tiện giá trị biến toàn c c sẽ: • Khó