Bài giảng Nhập môn lập trình: Hàm, cấu trúc - Trần Phước Tuấn
Hàm - Function
Một số nguyên tắc
Cách khai báo và gọi thực hiện
Prototype của hàm
Truyền tham số cho hàm
Biến toàn cục, biến cục bộ, biến static, biến thanh ghi,
Cách thức C thực hiện các lời gọi hàm – stack.
Bạn đang xem tài liệu "Bài giảng Nhập môn lập trình: Hàm, cấu trúc - Trần Phước Tuấn", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Nhập môn lập trình: Hàm, cấu trúc - Trần Phước Tuấn
NMLT HÀM, C?U TRÚC Tr?n Ph??c Tu?n tranphuoctuan.khoatoan.dhsp@gmail.com NH?P MÔN L?P TRÌNH 212/23/2009 Hàm - Function ? M?t s? nguyên t?c ? Cách khai báo và g?i th?c hi?n ? Prototype c?a hàm ? Truy?n tham s? cho hàm ? Bi?n toàn c?c, bi?n c?c b?, bi?n static, bi?n thanh ghi, ? Cách th?c C th?c hi?n các l?i g?i hàm – stack. NH?P MÔN L?P TRÌNH 312/23/2009 M?t s? nguyên t?c ? Các hàm trong NNLT C ??u ngang c?p v?i nhau: ? Hàm không ???c khai báo l?ng nhau. ? Th? t? khai báo không quan tr?ng. ? Hàm có th? nh?n và x? lý nhi?u tham s? ho?c không có tham s? nào ? Hàm có th? tr? v? m?t giá tr? ho?c không. ? Bi?n khai báo trong hàm F ch? có giá tr? trong F, không s? d?ng ???c bi?n này trong các hàm khác ???c. NH?P MÔN L?P TRÌNH 412/23/2009 Ví d?: hàm tính xn double Power(double x, int n) { double result; for(result = 1; n; n--) result *= x; return result; } double Power(double x, int n) { double result; for(result = 1; n; n--) result *= x; return result; } nh?n vào 2 tham s? khi ???c g?iki?u c?a giá tr? tr? ?? giá tr? ???c tr? ?? qua l?nh return NH?P MÔN L?P TRÌNH 512/23/2009 Ví d?: g?i th?c hi?n hàm Power #include double Power(double, int); int main() { double m = Power(2, 3); printf(“3.5 ^ 4 = %lf”, Power(3.5, 4)); return 0; } #include double Power(double, int); int main() { double m = Power(2, 3); printf(“3.5 ^ 4 = %lf”, Power(3.5, 4)); return 0; } Ch? th? cho ch??ng trình bi?t prototype c?a hàm Power 3.5 và 4: 2 tham s? th?c s? NH?P MÔN L?P TRÌNH 612/23/2009 M?t s? l?i th??ng g?p #include int main() { int m = Power(2, 3); printf(“3.5 ^ 4 = %lf”, Power(4)); return 1.0; } #include int main() { int m = Power(2, 3); printf(“3.5 ^ 4 = %lf”, Power(4)); return 1.0; } Compiler không hi?u ???c hàm Power giá tr? tr? ?? không kh?p ki?u hàm Power thi?u tham s? NH?P MÔN L?P TRÌNH 712/23/2009 Prototypes ? Dòng khai báo double Power(double, int); ???c hi?u là khai báo prototype c?a hàm Power ? ???c dùng khi ch??ng trình s? d?ng m?t hàm tr??c khi khai báo. ? Khai báo prototype thông báo cho trình biên d?ch bi?t ki?u c?a giá tr? tr? v? và mô t? chi ti?t v? các tham s? c?a hàm. ? Các hàm th? vi?n chu?n ???c khai báo prototype trong các t?p tin header (stdio.h, conio.h, ). ? Các hàm do l?p trình viên t? xây d?ng ph?i t? khai báo prototype. NH?P MÔN L?P TRÌNH 812/23/2009 Hàm: d?ng t?ng quát ki?u tr? ?? tên hàm(danh sách tham s? hình th?c) { //khai báo các bi?n c?a hàm //các l?nh th?c thi return giá tr? tr? ??; //hàm void không có giá tr? tr? ?? } ki?u tr? ?? tên hà (danh sách tha s? hình th?c) { //khai báo các bi?n c?a hàm //các l?nh th?c thi return giá tr? tr? ??; //hàm void không có giá tr? tr? ?? } header c?a hàm thân (body) hàm NH?P MÔN L?P TRÌNH 912/23/2009 float g=6.5; void main() { int i = 5, j, k = 2; float f = 2.8F; d = 3.7; } void F(int v) { double d, e = 0.0, f; i++; g--; f = 0.0; } float g=6.5; void main() { int i = 5, j, k = 2; float f = 2.8F; d = 3.7; } void F(int v) { double d, e = 0.0, f; i++; g--; f = 0.0; } T?m tác d?ng c?a bi?n ? Bi?n toàn c?c: Không thu?c kh?i nào, có tác d?ng trong toàn ch??ng trình k? t? khi khai báo ? Bi?n c?c b?: khai báo trong m?t kh?i, ch? có tác d?ng trong kh?i này compiler không ch?p nh?n “d”, “i” “f” c?a hàm F, không ph?i c?a main NH?P MÔN L?P TRÌNH 1012/23/2009 Truy?n tham s? cho hàm C h? tr? 2 cách truy?n tham s?: ? Truy?n tham s? b?i giá tr? (truy?n giá tr? - call by value) ? Truy?n tham s? b?i ??a ch? (truy?n ??a ch? - call by address) M? r?ng v?i C++ ? Truy?n tham chi?u (call by reference) NH?P MÔN L?P TRÌNH 1112/23/2009 Truy?n giá tr? ? Hàm s? x? lý trên b?n sao c?a tham s? ? Hàm không th? thay ??i giá tr? c?a tham s? ???c. ? ???c dùng trong các tr??ng h?p c?n chuy?n d? li?u vào bên trong hàm ?? x? lý, tính toán ? Các ví d? trên ??u dùng ki?u truy?n tham s? b?i giá tr? ? Ví d? hàm có s?n c?a C truy?n giá tr?: ? float sqrt(float); ? double pow(double, double); NH?P MÔN L?P TRÌNH 1212/23/2009 Truy?n giá tr? - ví d? #include void change(int v); int main() { int var = 5; change(var); printf("main: var = %i\n", var); return 0; } void change(int v) { v *= 100; printf("change: v = %i\n", v); } #include void change(int v); int main() { int var = 5; change(var); printf("main: var = %i\n", var); return 0; } void change(int v) { v *= 100; printf("change: v = %i\n", v); } change: v = 500 main: var = 5 change: v = 500 main: var = 5 hàm change không thay ??i giá tr? ??a “var” NH?P MÔN L?P TRÌNH 1312/23/2009 Truy?n ??a ch? ? Hàm s? x? lý trên chính tham s? nh? vào ??a ch? c?a chúng ? Hàm có th? thay ??i giá tr? c?a tham s?. ? ???c dùng trong các tr??ng h?p c?n chuy?n d? li?u là k?t qu? x? lý ???c bên trong hàm ra “ngoài” cho các hàm khác s? d?ng. Ví d? hàm có s?n c?a C truy?n ??a ch?: int scanf(const char *format, adr1, adr2, ); functioninputs outputs NH?P MÔN L?P TRÌNH 1412/23/2009 Truy?n ??a ch? - ví d? #include void change(int *v); int main() { int var = 5; change(&var); printf("main: var = %i\n", var); return 0; } void change(int *v) { (*v) *= 100; printf("change: *v = %i\n", (*v)); } #include void change(int *v); int main() { int var = 5; change(&var); printf("main: var = %i\n", var); return 0; } void change(int *v) { (*v) *= 100; printf("change: *v = %i\n", (*v)); } change: *v = 500 main: var = 500 change: *v = 500 main: var = 500 v: tham s? ??a ch? ??a s? int, khai báo v?i d?u * truy?n ??a ch? ??a “var” vào hàm change NH?P MÔN L?P TRÌNH 1512/23/2009 Truy?n tham chi?u ? Hàm s? x? lý trên b?n sao tham s? và c?p nh?t l?i b?n chính ngay tr??c khi hàm k?t thúc. ? Hàm có th? thay ??i giá tr? c?a tham s?. ? ???c dùng trong các tr??ng h?p c?n chuy?n d? li?u là k?t qu? x? lý ???c bên trong hàm ra “ngoài” cho các hàm khác s? d?ng. ? Ch? áp d?ng ???c v?i các trình biên d?ch C++ NH?P MÔN L?P TRÌNH 1612/23/2009 Truy?n tham chi?u - ví d? #include void change(int &v); int main() { int var = 5; change(var); printf("main: var = %i\n", var); return 0; } void change(int &v) { v *= 100; printf("change: v = %i\n", v); } #include void change(int &v); int main() { int var = 5; change(var); printf("main: var = %i\n", var); return 0; } void change(int &v) { v *= 100; printf("change: v = %i\n", v); } change: v = 500 main: var = 500 change: v = 500 main: var = 500 v: tham s? tham chi?u, khai báo ??i d?u & truy?n “var” vào hàm change NH?P MÔN L?P TRÌNH 1712/23/2009 Truy?n tham s? - ví d? #include void function(int a, int *b, int &c); int main() { int x = 3, y = 4, z = 5; function(x, &y, z); printf("%i %i %i\n", x, y, z); return 0; } void function(int a, int *b, int &c) { a *= 2; (*b) += a; c = a + (*b); printf("%i %i %i\n", a, *b, c); } #include void function(int a, int *b, int &c); int main() { int x = 3, y = 4, z = 5; function(x, &y, z); printf("%i %i %i\n", x, y, z); return 0; } void function(int a, int *b, int &c) { a *= 2; (*b) += a; c = a + (*b); printf("%i %i %i\n", a, *b, c); } 6 10 16 3 10 16 6 10 16 3 10 16 mainmain functionfunction a b c NH?P MÔN L?P TRÌNH 1812/23/2009 Ph??ng th?c trao ??i d? li?u ? C dùng 1 stack ?? ??u tr? các bi?n c?c b? và các chuy?n các tham s? cho hàm v?i m?i l?n g?i hàm th?c hi?n ? Hàm g?i (O) c?t các tham s? vào stack. ? G?i th?c hi?n hàm ???c g?i (F). ? F nh?n l?y các tham s? t? stack ? F t?o các bi?n c?c b? ?ng v?i các tham s? trên stack ? Khi k?t thúc, F c?p nh?t giá tr? các tham s? (ref) và tr? ?i?u khi?n cho O ? O nh?n l?y các giá tr? m?i c?a tham s? c?ng nh? giá tr? tr? v? NH?P MÔN L?P TRÌNH 1912/23/2009 #include double power(int, int); int main(void) { int x = 2; double d; d = power(x, 5); printf("%lf\n", d); return 0; } double power(int n, int p) { double result = n; while(--p > 0) result *= n; return result; } #include double power(int, int); int main(void) { int x = 2; double d; d = power(x, 5); printf("%lf\n", d); return 0; } double power(int n, int p) { double result = n; while(--p > 0) result *= n; return result; } main: x2 main: d? power: p5 power: n2 power: result32.0 Ph??ng th?c trao ??i d? li?u 32.0 NH?P MÔN L?P TRÌNH 2012/23/2009 Bài ??c thêm: t? ch?c d? li?u ? D? li?u trong ch??ng trình ???c l?u tr? trong các bi?n. ? Khi hàm ???c g?i th?c hi?n, các bi?n c?c b? s? ???c kh?i t?o trên vùng nh? stack và t? ??ng b? h?y khi hàm k?t thúc. ? Các bi?n toàn c?c s? ???c t?o trên vùng nh? phân ?o?n d? li?u (data segment) khi ch??ng trình ???c g?i th?c hi?n, t? ??ng b? h?y khi ch??ng trình k?t thúc. ? Có th? s? d?ng các t? khóa ?? ch? ??nh v? trí c?a bi?n: auto - stack (default) static - data segment register - thanh ghi c?a CPU ? D? li?u còn có th? ???c ??t trong vùng nh? heap. Heap Data segment Stack NH?P MÔN L?P TRÌNH 2112/23/2009 Tóm l??c ? Khai báo và g?i th?c hi?n hàm ? Khai báo prototypes ? T?m tác d?ng c?a bi?n ? Truy?n tham s? cho hàm ? V?n ?? t? ch?c d? li?u trong ch??ng trình C?u trúc - Struct NH?P MÔN L?P TRÌNH 2312/23/2009 Ki?u c?u trúc ? Khái ni?m ? Khai báo ? Truy xu?t các thành ph?n ? C?u trúc & m?ng ? Con tr? ??n c?u trúc NH?P MÔN L?P TRÌNH 2412/23/2009 Khái ni?m ? C?u trúc là ki?u d? li?u g?m m?t nhóm các thành ph?n có ki?u không gi?ng nhau, m?i thành ph?n ???c xác ??nh b?ng m?t tên riêng bi?t. ? Ki?u c?a m?i thành ph?n trong c?u trúclà m?t ki?u ?ã ???c ??nh ngh?a tr??c, k? c? m?ng và các c?u trúc khác. NH?P MÔN L?P TRÌNH 2512/23/2009 C?u trúc – Khai báo trong C M?t ki?u c?u trúc ???c ??nh ngh?a v?i t? khóa struct. typedef struct Tênki?u { Ki?uthànhph?n Tênthànhph?n; Ki?uthànhph?n Tênthànhph?n; Ki?uthànhph?n Tênthànhph?n; Ki?uthànhph?n Tênthànhph?n; ... }; NH?P MÔN L?P TRÌNH 2612/23/2009 C?u trúc – ví d? typedef struct TBook { char title[80]; char author[80]; float price; char isbn[20]; }; typedef struct TBook { char title[80]; char author[80]; float price; char isbn[20]; }; typedef struct TDate { char day; char month; int year; }; typedef struct TDate { char day; char month; int year; }; typedef struct TStudent { char ID[10]; char firstname[10]; char lastname[20]; TDate dob; float marks[10]; }; typedef struct TStudent { char ID[10]; char firstname[10]; char lastname[20]; TDate dob; float marks[10]; }; //khai báo các bi?n TBook book; TStudent list[100]; //khai báo các bi?n TBook book; TStudent list[100]; NH?P MÔN L?P TRÌNH 2712/23/2009 ? Các thành ph?n c?a m?t bi?n ki?u c?u trúc ???c truy xu?t thông qua tên bi?n, d?u "." và tên thành ph?n. void Print(TStudent m) { printf("Name : %s %s\n", m.firstname, m.lastname); printf("Student ID : %s\n", m.ID); printf("Date of birth : %hi/%hi/%i", m.dob.day, m.dob.month, m.dob.year); printf("Marks : "); for (int i=0; i<10; i++) printf("%.2f ", m.marks[i]); } void Print(TStudent m) { printf("Name : %s %s\n", m.firstname, m.lastname); printf("Student ID : %s\n", m.ID); printf("Date of birth : %hi/%hi/%i", m.dob.day, m.dob.month, m.dob.year); printf("Marks : "); for (int i=0; i<10; i++) printf("%.2f ", m.marks[i]); } C?u trúc – Truy xu?t các thành ph?n NH?P MÔN L?P TRÌNH 2812/23/2009 void ReadInfo(TStudent &m) { printf("Type student ID: "); scanf("%s", m.ID); printf("Type first name: "); gets(m.firstname); printf("Type last name: "); gets(m.lastname); printf("Date of birth (d m y): "); scanf("%hi %hi %i", &(m.dob.day), &(m.dob.month), &(m.dob.year)); printf("Marks (10 floats): "); for (int i=0; i<10; i++) scanf("%f", &(m.marks[i])); } void ReadInfo(TStudent &m) { printf("Type student ID: "); scanf("%s", m.ID); printf("Type first name: "); gets(m.firstname); printf("Type last name: "); gets(m.lastname); printf("Date of birth (d m y): "); scanf("%hi %hi %i", &(m.dob.day), &(m.dob.month), &(m.dob.year)); printf("Marks (10 floats): "); for (int i=0; i<10; i++) scanf("%f", &(m.marks[i])); } C?u trúc – Truy xu?t các thành ph?n
File đính kèm:
- bai_giang_nhap_mon_lap_trinh_ham_cau_truc_tran_phuoc_tuan.pdf