Tải bản đầy đủ (.pdf) (34 trang)

Slide 1 Kỹ thuật lập trình

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (362.84 KB, 34 trang )

Ch

Tr n Quang
© 2016

ng 08
HÀM

Ch

ng 08: Hàm

K thu t l p trình
1


Hàm là gì?




Hàm là m t đ n v x lý, m t chu i các l nh có
liên quan, đ c th c hi n cùng nhau đ hoàn
thành m t cơng vi c nào đó
Ví d trong th vi n <math.h> ta có




Tr n Quang
© 2016



Hàm sin(x)
 Là chu i l nh đ
tính giá tr sin c a m t góc x đ c
truy n vào, góc x có đ n v tính là radian; hàm sin(x)
tr v m t s th c
Hàm sqrt(x)
 Là chu i l nh đ
tính c n b c 2 c a đ i l ng x đ c
truy n vào, đ i l ng x có đ n v tính là m t s th c
(float hay double); hàm sqrt tr v m t s th c
Ch

ng 08: Hàm

K thu t l p trình
2


Hàm là gì?


Hàm là m t đ n v tính tốn




Nh n giá tr đ u vào
Tính tốn
Tr v giá tr


Các giá tr đ u vào

Tr n Quang
© 2016

Chu i l nh c a hàm

Ch

ng 08: Hàm

Các giá tr đ u ra

K thu t l p trình
3


L i ích c a hàm


Tránh l p l i mã ngu n





Ti t ki m th i gian phát tri n
Thay đ i đo n mã ngu n trong hàm nhanh và d
dàng, ch t i m t n i


S d ng l i m t đ n v tính tốn mà khơng ph i
vi t l i



Tr n Quang
© 2016

Ti t ki m th i gian phát tri n
Có th chia s đ n v tính tốn khơng ch cho m t
d án mà cho nhi u d án

Ch

ng 08: Hàm

K thu t l p trình
4


Hàm main
Giá tr tr v : ki u s ốguyêố int
Tên hàm: “main”. M t ch

ốg trìốh ph i và ch có 01 hàm main duy ốh t

int main(){
// Các l nh x
return 0;

}

l

c a hàm main

Tr v giá tr cho bêố g i hàỐ Ốaiố
Giá tr tr v c a main:
• Ph i ỏà ki u int
• Có th ỏà Ố t troốg 2 h ốg s
• EXIT_SUCCESS (ho c 0): ố u ch ốg trìốh k t thềc thàốh cẾốg
• EXIT_FAILURE (ho c 1): ố u ch ốg trìốh k t thềc v i ỏ i ốào đó
Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình
5


Hàm th vi n


Dùng ch th #include < … > đ thơng báo v i b
biên d ch là có s d ng th vi n





Ví d : #include <math.h>

Khi g i m t hàm ch c n bi t




Tr n Quang
© 2016

Tên hàm + cơng d ng c a hàm
Các giá tr c n cung c p cho hàm
Giá tr tr v c a hàm

Ch

ng 08: Hàm

K thu t l p trình
6


T ch c ch

ng trình C


Module

#<Ti n x ĺ>



Khai b́o / đ nh ngh a
H̀m 1

H̀m 2



H̀m 3

Tr n Quang
© 2016

Ch

Ti n x ĺ:
 #include
 #define
Khai báo / đ nh ngh a:
 H ng
 Bi n
 Hàm/bi n extern
 Mô t
hàm
Các hàm:
 main đ
c ch y đ u tiên


nh ngh a ngang c p,
không l ng nhau.

c g i m i ch y.

ng 08: Hàm

K thu t l p trình
7


T ch c ch

ng trình C

Project bao g m nhi u module
Module
#<Ti n x ĺ>
Khai b́o / đ nh ngh a

H̀m 1

H̀m 2

H̀m 3

Module
#<Ti n x ĺ>
Khai b́o / đ nh ngh a


H̀m 1

H̀m 2
Module

H̀m 3

#<Ti n x ĺ>
Khai b́o / đ nh ngh a

H̀m 1

H̀m 2

H̀m 3
Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình
8


Khai báo hàm







Ph ố ỐẾ t hàỐ (header)

Cú pháp :
[extern|static] [ret_type] name ([arglist])
{
[statements]*
[return expr;]
Ph ố thâố hàỐ (body)
[statements]*
[return expr;]
}
extern (khai báo): hàm đã đ c đ nh ngh a trong
module khác.
static (đ nh ngh a): hàm ch đ c g i c c b trong
module ch a hàm này

Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình
9



Khai báo hàm






return expr; k t th́c hàm và tr v giá tr expr. Giá
tr expr s đ c g i v n i g i hàm đ s d ng.
arglist: là danh sách các tham s hình th c (hàm
có th khơng có tham s ), m i tham s đ c cách
nhau b i d u ph y (,) và đ c mô t theo ć pháp
nh sau :
type parameter_name [=defaultvalue]
defaultvalue là giá tr gán m c đ nh cho tham s
n u không cung c p lúc g i hàm

Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình
10


L i g i hàm

Cú pháp:
Tên_hàm (<danh sách tham s th c>);
Ví d :
#include <math.h>
int main() {
printf("%-10s = %5.2f\n", "sqrt(25.0)", sqrt(25.0));
printf("%-10s = %5.2f\n", "sin(90.0)",
sin(90.0f*(3.14159/180.0)));
// ....
}
Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình
11


S d ng hàm t t o
#include <stdio.h>
#include <stdlib.h>
int add(int a, int b) {
int c;
c = a + b;
return c;
}
int main(){

printf("10 + 15 = %d", add(10, 15));
system("pause");
return 0;
}
Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình
12


Nguyên t c th c thi khi g i hàm
Khi g i hàm thì b th c thi s làm các công vi c:
 L u v t: l nh k ti p c a l nh g i hàm
 Copy các thông s cho hàm đ
cg i
 Làm các công vi c h th ng khác
 Chuy n đi u khi n th c thi cho hàm đ
c g i đ nó
th c thi t l nh đ u tiên trong hàm đ c g i
 Khi hàm đ
c g i th c hi n l nh return.
 Gi i phóng t t c các bi n c c b c a nó
 Tr
đi u khi n v l nh theo sau l nh g i hàm
 Hàm g i gi i phóng các thơng s đã truy n và th c thi

l nh k ti p theo l nh g i hàm
Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình
13


T ch c mã ngu n
#include <stdio.h>
#include <stdlib.h>

Tách r i ph ố ỐẾ t
c a hàỐ và đ t tr c
hàm “main” (tr c khi
s d ốg)

int add(int a, int b);
int main(){
printf("10 + 15 = %d", add(10, 15));
system("pause");
return EXIT_SUCCESS;
}
int add(int a, int b){
int c;
c = a + b;

return c;
}
Tr n Quang
© 2016

Cài đ t các ỏ ốh cho
hàm

Ch

ng 08: Hàm

K thu t l p trình
14


T ch c mã ngu n
a ph n mô t vào m t t p tin riêng





G i là t p tin mơ t (header): *.h
Có th s d ng l i nhi u t p tin khác trong d án


S d ng ch th #if !defined(.)
endif đ
tránh l i “đ nh ngh a l p l i” (redefinition)


a ph n hi n th c vào m t t p tin riêng





G i là t p tin hi n th c (implementation): *.c; *.cpp
Có th s d ng l i nhi u t p tin khác trong d án

a ph n hi n th c vào m t t p tin riêng





Tr n Quang
© 2016

Khai báo có s d ng đ n các hàm
G i hàm
Ch

ng 08: Hàm

*.h nói trên
K thu t l p trình
15



T ch c mã ngu n

T p tiố ch a ph ố ỐẾ t cho hàỐ, ki u
d ỏi u, v.v. các ph ố ỐẾ t ốói chuốg
T p tiố ch a ph ố cài đ t hàm
T p tiố ch a hàỐ main.
s d ốg
các hàm troốg th vi ố t t o đ t
#include ”my_math.h” troốg Ốã ốgu ố

Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình
16


T ch c mã ngu n
T p tin: ”my_math.h”
#if !defined(MY_MATH_HEADER)
#define MY_MATH_HEADER
int add(int a, int b);
#endif

Ph ố ỐẾ t cho
hàm add


N U nh trong quá trình biên d ch, đ n th i đi m hi n t i,
ch a th y tên (MY_MATH_HEADER) xu t hi n thì đ nh ngh a
tên m i (MY_MATH_HEADER) và th c hi n biên d ch cho c
đo n mã ngu n n m trong ph n t ng ng kh i #if
NG
C L I thì khơng c n đ nh ngh a tên m i và không c n
biên d ch đo n mã ngu n t ng ng kh i if
Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình
17


T ch c mã ngu n
T p tin: ”my_math.cpp”

#include "my_math.h"
int add(int a, int b) {
int c;
c = a + b;
return c;
}

Tr n Quang

© 2016

Ch

ng 08: Hàm

K thu t l p trình
18


T ch c mã ngu n

T p tin program.cpp
#include <stdio.h>
#include <stdlib.h>
#include "my_math.h"
int main() {
printf("10 + 15 = %d", add(10, 15));
system("pause");
return EXIT_SUCCESS;
}

Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình

19


Tham s và đ i s
int main(){
printf("10 + 15 = %d", add(10, 15));
system("pause");
return EXIT_SUCCESS;
}

10: ỏà đ i s c a tham s a
15: ỏà đ i s c a tham s b

Tr n Quang
© 2016

int add(int a, int b) {
int c;
c = a + b;
return c;
}

Ch

ng 08: Hàm

K thu t l p trình
20



Truy n tham s
Trong C/C++, có các cách truy n tham s cho hàm:
 Truy n tr d
i d ng m t bi u th c.





(ki u tên)
(bi u th c)

Truy n đ a ch b ng bi n con tr (ki u*).





Tham s hình th c
Tham s th c
Tham s hình th c
Tham s th c

(ki u* tên)
(&tên)

Truy n đ a ch b ng bi n tham kh o (ki u&)




Tr n Quang
© 2016

Tham s hình th c
Tham s th c

(ki u& tên)
(tên)
Ch

ng 08: Hàm

K thu t l p trình
21


Các ki u truy n tham s


Truy n b ng tr




c s d ng khi KHÔNG CHO PHÉP hàm đ
g i thay đ i giá tr đ i s

c

Truy n b ng đ a ch





Tr n Quang
© 2016

c s khi MU N CHO PHÉP hàm đ c g i thay
đ i giá tr đ i s
Ho c khi không mu n b th c thi t n nhi u th i gian
cho vi c chu n b tham s c a hàm đ c g i (ngh a
là COPY giá tr c a đ i s vào thông s ), nh truy n
m t m ng nhi u ph n t vào hàm đ c g i

Ch

ng 08: Hàm

K thu t l p trình
22


Cách nh n bi t ki u truy n tham s
D u sao (*) ch ra thẾốg s ốào s đ

c truy ố b ốg đ a ch

void swap(int a, int b){
}
a và b s


đ

c truy ố b ốg tr

void swap(int *a, int *b){
}

a và b s
Tr n Quang
© 2016

đ

c truy ố b ốg đ a ch

Ch

ng 08: Hàm

K thu t l p trình
23


Truy n tham s b ng tr
void swap (int a, int b) {
int t = a; a = b; b = t;
}
int main() {
int x = 10, y = 100;

printf ("Truoc khi goi ham swap(x,y)\n");
printf ("x = %3d; y = %3d\n", x, y);
swap (x, y);
printf("Sau khi goi ham swap(x,y)\n");
printf("x = %3d; y = %3d\n", x, y);
// …
}
Tr n Quang
© 2016

Ch

ng 08: Hàm

Giá tr khẾốg đ i

K thu t l p trình
24


Truy n tham s b ng đ a ch
#include <stdio.h>
#include <stdlib.h>

a và b s

đ

c truy ố b ốg b ốg đ a ch


void swap(int *a, int *b){
}
int main(){
int x = 10, y = 100;
i s : CH S TH LÀ BI N

swap(&x, &y);
swap(10, 100);
swap(x + 10, y*2);

i s : KHÔNG TH LÀ h ốg s
i s : KHÔNG TH LÀ bi u th c

return EXIT_SUCCESS;
}
Tr n Quang
© 2016

Ch

ng 08: Hàm

K thu t l p trình
25


×