Tin học đại cương - Hàm, cấu trúc

pdf 14 trang vanle 4210
Bạn đang xem tài liệu "Tin học đại cương - Hàm, cấu trúc", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdftin_hoc_dai_cuong_ham_cau_truc.pdf

Nội dung text: Tin học đại cương - Hàm, cấu trúc

  1. NMLTNMLT HHÀÀM,M, CCҨҨUU TRTRÚÚCC Trҫn Phѭӟc Tuҩn tranphuoctuan.khoatoan.dhsp@gmail.com HHààmm FunctionFunction „ 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 12/23/2009 2
  2. MMӝӝtt ssӕӕ nguyênnguyên ttҳҳcc „ 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 12/23/2009 3 VVíí ddөө:: hhààmm ttíínhnh xxn kiӇu cӫa giá trӏ trҧ YӅ nhұn vào 2 tham sӕ khi ÿѭӧc gӑi doubledouble Power(doublePower(double x, x, int int n) n) {{ doubledouble result; result; for(resultfor(result == 1;1; n; n; n ) n ) resultresult *=*= x;x; returnreturn result;result; }} giá trӏ ÿѭӧc trҧ YӅ qua lӋnh return NHҰP MÔN LҰP TRÌNH 12/23/2009 4
  3. VVíí ddөө:: ggӑӑii ththӵӵcc hihiӋӋnn hhààmm PowerPower ChӍ thӏ cho chѭѫng trình biӃt prototype cӫa hàm Power #include#include doubledouble Power(double, Power(double, int);int); intint main()main() {{ doubledouble mm == Power(2,Power(2, 3);3); printf(“3.5printf(“3.5 ^^ 44 == %lf”,%lf”, Power(3.5,Power(3.5, 4));4)); returnreturn 0;0; }} 3.5 và 4: 2 tham sӕ thӵc sӵ NHҰP MÔN LҰP TRÌNH 12/23/2009 5 MMӝӝtt ssӕӕ llӛӛii ththѭѭӡӡngng ggһһpp Compiler không hiӇu ÿѭӧc hàm Power #include#include hàm Power thiӃu tham sӕ intint main()main() {{ intint mm == Power(2,Power(2, 3);3); printf(“3.5printf(“3.5 ^^ 44 == %lf”,%lf”, Power(4));Power(4)); returnreturn 1.0;1.0; }} giá trӏ trҧ YӅ không khӟp kiӇu NHҰP MÔN LҰP TRÌNH 12/23/2009 6
  4. PrototypesPrototypes „ 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 12/23/2009 7 HHààm:m: ddҥҥngng ttәәngng ququáátt header cӫa hàm kikiӇӇuu tr trҧҧ YӅ YӅ têntên hàm( hàm(danhdanh sáchsách thamtham ssӕӕhìnhhình ththӭӭcc)) {{ //khai//khai báobáo cáccác bibi͇͇nn ccͯͯaa hàmhàm //các//các ll͏͏nhnh thth͹͹cc thithi returnreturngiá giá tr trӏӏtrtrҧҧ YӅ YӅ;;//hàm//hàm void void không không có có giá giá tr tr͓͓trtr̫̫ Y͉ Y͉ }} thân (body) hàm NHҰP MÔN LҰP TRÌNH 12/23/2009 8
  5. TTҫҫmm ttáácc ddөөngng ccӫӫaa bibiӃӃnn „ BiӃn toàn cөc: floatfloat g=6.5;g=6.5; Không thuӝc khӕi void main() nào, có tác dөng void main() nào, có tác dөng {{ trong toàn chѭѫng intint ii == 5,5, j,j, kk == 2;2; trình kӇ tӯ khi khai floatfloat f f == 2.8F2.8F;; d = 3.7; báo d = 3.7; compiler không }} „ BiӃn cөc bӝ: khai chҩp nhұn “d”, “i” voidvoid F(int F(int v) v) báo trong mӝt khӕi, {{ chӍ có tác dөng doubledouble d, d, ee == 0.0,0.0, f;f; trong khӕi này i++;i++; g ;g ; ff == 0.0;0.0; “f” cӫa hàm F, không }} phҧi cӫa main NHҰP MÔN LҰP TRÌNH 12/23/2009 9 TruyTruyӅӅnn thamtham ssӕӕ chocho hhààmm 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 12/23/2009 10
  6. TruyTruyӅӅnn gigiáá trtrӏӏ „ 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 12/23/2009 11 TruyTruyӅӅnn gigiáá trtrӏӏ vvíí ddөө #include#include voidvoid change(int change(int v); v); hàm change không thay ÿәi intint main() main() giá trӏ Fӫa “var” {{ intint varvar = = 5;5; change(var);change(var); printf("main:printf("main: var var = = %i\n",%i\n", var); var); returnreturn 0;0; }} change:change: vv == 500500 voidvoid change(int change(int v) v) main:main: var var = = 55 {{ vv *=*= 100;100; printf("change:printf("change: vv == %i\n",%i\n", v);v); }} NHҰP MÔN LҰP TRÌNH 12/23/2009 12
  7. TruyTruyӅӅnn ÿÿӏӏaa chchӍӍ „ 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, ); inputs function outputs NHҰP MÔN LҰP TRÌNH 12/23/2009 13 TruyTruyӅӅnn ÿÿӏӏaa chchӍӍ vvíí ddөө #include#include v: tham sӕ ÿӏa chӍ voidvoid change(int change(int *v); *v); Fӫa sӕ int, khai báo vӟi dҩu * intint main() main() {{ truyӅn ÿӏa chӍ Fӫa “var” intint varvar = = 5;5; vào hàm change change(&var);change(&var); printf("main:printf("main: var var = = %i\n",%i\n", var); var); returnreturn 0;0; }} change:change: *v*v = = 500500 voidvoid change(int change(int *v) *v) main:main: var var = = 500500 {{ (*v)(*v) *= *= 100;100; printf("change:printf("change: *v*v = = %i\n",%i\n", (*v));(*v)); }} NHҰP MÔN LҰP TRÌNH 12/23/2009 14
  8. TruyTruyӅӅnn thamtham chichiӃӃuu „ 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 12/23/2009 15 TruyTruyӅӅnn thamtham chichiӃӃuu vvíí ddөө #include#include v: tham sӕ tham voidvoid change(int change(int &v); &v); chiӃu, khai báo Yӟi dҩu & intint main() main() {{ truyӅn “var” vào hàm change intint varvar = = 5;5; change(var);change(var); printf("main:printf("main: var var = = %i\n",%i\n", var); var); returnreturn 0;0; }} change:change: vv == 500500 voidvoid change(int change(int &v) &v) main:main: var var = = 500500 {{ vv *= *= 100;100; printf("change:printf("change: vv == %i\n",%i\n", v);v); }} NHҰP MÔN LҰP TRÌNH 12/23/2009 16
  9. TruyTruyӅӅnn thamtham ssӕӕ vvíí ddөө #include#include voidvoid function(int function(int a,a, intint *b,*b, intint &c); &c); intint main() main() { { mainmain intint x=x=3,3, yy == 4,4, zz == 5;5; function(x,function(x, &y,&y, z);z); printf("%i %i %i\n", x, y, z); printf("%i %i %i\n", x, y, z); a b c returnreturn 0;0; }} voidvoid function(int function(int a,a, intint *b,*b, intint &c)&c) {{ functionfunction aa *= *= 2;2; 66 1010 1616 (*b)(*b) +=+= a;a; 33 1010 1616 cc == aa ++ (*b);(*b); printf("%iprintf("%i %i%i %i\n",%i\n", a,a, *b,*b, c);c); }} NHҰP MÔN LҰP TRÌNH 12/23/2009 17 PhPhѭѫѭѫngng ththӭӭcc traotrao ÿÿәәii ddӳӳ liliӋӋuu „ C dùng 1 stack ÿӇ Oѭ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 n Hàm gӑi (O) cҩt các tham sӕ vào stack. o Gӑi thӵc hiӋn hàm ÿѭӧc gӑi (F). p F nhұn lҩy các tham sӕ tӯ stack q F tҥo các biӃn cөc bӝ ӭng vӟi các tham sӕ trên stack r 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 s O nhұn lҩy các giá trӏ mӟi cӫa tham sӕ cNJng nhѭ giá trӏ trҧ vӅ NHҰP MÔN LҰP TRÌNH 12/23/2009 18
  10. PhPhѭѫѭѫngng ththӭӭcc traotrao ÿÿәәii ddӳӳ liliӋӋuu #include#include doubledouble power(int, power(int, int); int); intint main(void) main(void) {{ intint xx == 2;2; doubledouble d; d; dd == power(x,power(x, 5);5); printf("%lf\n", d); printf("%lf\n", d); 32.0 power: result returnreturn 0;0; }} 2 power: n double power(int n, int p) double power(int n, int p) 5 power: p {{ doubledouble result result == n;n; 32.0? main: d while( pwhile( p >> 0)0) 2 main: x resultresult *=*= n;n; returnreturn result;result; }} NHҰP MÔN LҰP TRÌNH 12/23/2009 19 Bàii ÿÿӑӑc thêm: tt͝ chͱͱcc ddͷ 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 Heap khӣi tҥo trên vùng nhӟ stack và tӵ ÿӝng bӏ hӫy khi hàm kӃt thúc. Data „ 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 segment gӑi thӵc hiӋn, tӵ ÿӝng bӏ hӫy khi chѭѫng trình kӃt Stack 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. NHҰP MÔN LҰP TRÌNH 12/23/2009 20
  11. TTóómm llѭѭӧӧcc „ 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 NHҰP MÔN LҰP TRÌNH 12/23/2009 21 CCҩҩuu trtrúúcc StructStruct
  12. KiKiӇӇuu ccҩҩuu trtrúúcc „ 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 12/23/2009 23 KhKhááii niniӋӋmm „ 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 12/23/2009 24
  13. CCҩҩuu trtrúúcc –– 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 12/23/2009 25 CCҩҩuu trtrúúcc –– ví dө typedeftypedef structstruct TDate TDate typedeftypedef structstruct TBook TBook {{ {{ charchar day;day; charchar title[80];title[80]; charchar month;month; charchar author[80];author[80]; intint year;year; floatfloat price;price; };}; charchar isbn[20];isbn[20]; };}; typedeftypedef structstruct TStudent TStudent {{ charchar ID[10];ID[10]; //khai//khai báobáo cáccác bibi͆͆nn charchar firstname[10];firstname[10]; TBookTBook book;book; charchar lastname[20];lastname[20]; TStudentTStudent list[100];list[100]; TDateTDate dob;dob; floatfloat marks[10];marks[10]; };}; NHҰP MÔN LҰP TRÌNH 12/23/2009 26
  14. CCҩҩuu trtrúúcc –– Truy xuҩt cáác thành phҫҫn „ 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. voidvoid Print(TStudentPrint(TStudent m)m) {{ printf("Nameprintf("Name :: %s %s %s\n",%s\n", m.firstname,m.firstname, m.lastname);m.lastname); printf("Studentprintf("Student IDID :: %s\n", %s\n", m.ID);m.ID); printf("Dateprintf("Date ofof birthbirth : : %hi/%hi/%i", %hi/%hi/%i", m.dob.day,m.dob.day, m.dob.month,m.dob.month, m.dob.year);m.dob.year); printf("Marksprintf("Marks :: ");"); forfor (int(int i=0;i=0; i<10;i<10; i++)i++) printf("%.2fprintf("%.2f ",", m.marks[i]);m.marks[i]); }} NHҰP MÔN LҰP TRÌNH 12/23/2009 27 CCҩҩuu trtrúúcc –– Truy xuҩt cáác thành phҫҫn voidvoid ReadInfo(TStudentReadInfo(TStudent &m)&m) {{ printf("Typeprintf("Type studentstudent ID:ID: ");"); scanf("%s",scanf("%s", m.ID);m.ID); printf("Typeprintf("Type firstfirst name:name: "); "); gets(m.firstname);gets(m.firstname); printf("Typeprintf("Type lastlast name:name: ");"); gets(m.lastname);gets(m.lastname); printf("Dateprintf("Date ofof birthbirth (d(d mm y):y): ");"); scanf("%hiscanf("%hi %hi%hi %i",%i", &(m.dob.day),&(m.dob.day), &(m.dob.month),&(m.dob.month), &(m.dob.year));&(m.dob.year)); printf("Marksprintf("Marks (10(10 floats):floats): ");"); forfor (int(int i=0;i=0; i<10;i<10; i++)i++) scanf("%f",scanf("%f", &(m.marks[i]));&(m.marks[i])); }} NHҰP MÔN LҰP TRÌNH 12/23/2009 28