NMLT
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á
báo và
và g i th c hi n
Prototype c a hà
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
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
3
12/23/2009
Ví d : hàm tính xn
nh n vào 2 tham s khi
ki u c a giá tr tr
cg i
double
double Power(double
Power(double x,
x, int
int n)
n)
{{
double
double result;
result;
for(result
for(result == 1;
1; n;
n; n--)
n--)
result
result *=
*= x;
x;
return
return result;
result;
}}
giá tr
NH P MÔN L P TRÌNH
c tr
qua l nh return
12/23/2009
4
Ví d : g i th c hi n hàm Power
Ch th cho ch
ng trình bi t prototype c a hàm Power
#include
#include <stdio.h>
<stdio.h>
double
double Power(double,
Power(double, int);
int);
int
int main()
main()
{{
double
double mm == Power(2,
Power(2, 3);
3);
printf(“3.5
^
4
=
%lf”,
printf(“3.5 ^ 4 = %lf”, Power(3.5,
Power(3.5, 4));
4));
return
return 0;
0;
}}
3.5 và 4: 2 tham s th c s
NH P MÔN L P TRÌNH
12/23/2009
M t s l i th
Compiler không hi u
5
ng g p
c hàm Power
#include
#include <stdio.h>
<stdio.h>
hàm Power thi u tham s
int
int main()
main()
{{
int
int mm == Power(2,
Power(2, 3);
3);
printf(“3.5
^
4
=
printf(“3.5 ^ 4 = %lf”,
%lf”, Power(4));
Power(4));
return
return 1.0;
1.0;
}}
giá tr tr
NH P MÔN L P TRÌNH
không kh p ki u
12/23/2009
6
Prototypes
Dòng khai báo
double
Power(double, int);
c hi u là
là khai bá
báo prototype c a hà
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
Hàm: d ng t ng quát
header c a hàm
ki
tên
ki uutrtr
tênhàm(danh
hàm(danhsách
sáchtham
thamss hình
hìnhth
th c)
c)
{{
//khai
//khaibáo
báocác
cácbi
bi nncc aahàm
hàm
//các
//cácll nh
nhth
th ccthi
thi
}}
return
returngiá
giátrtr trtr
;;//hàm
//hàmvoid
voidkhông
khôngcó
cógiá
giátrtr trtr
thân (body) hàm
NH P MÔN L P TRÌNH
12/23/2009
8
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
“f” c a hàm F, không
ph i c a main
NH P MÔN L P TRÌNH
float
float g=6.5;
g=6.5;
void
main()
void main()
{{
int
int ii == 5,
5, j,
j, kk == 2;
2;
float
f
=
2.8F
;
float f = 2.8F;
dd == 3.7;
3.7;
compiler không
}}
ch p nh n “d”, “i”
void
void F(int
F(int v)
v)
{{
double
double d,
d, ee == 0.0,
0.0, f;
f;
i++;
g--;
i++; g--;
ff == 0.0;
0.0;
}}
12/23/2009
9
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
12/23/2009
10
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ù
dùng trong cá
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
11
12/23/2009
Truy n giá tr - ví d
#include
#include <stdio.h>
<stdio.h>
void
void change(int
change(int v);
v);
hàm change
không thay i
giá tr
a “var”
int
int main()
main()
{{
int
int var
var == 5;
5;
change(var);
change(var);
printf("main:
printf("main: var
var == %i\n",
%i\n", var);
var);
return
0;
return 0;
}}
change:
change: vv == 500
500
main:
void
main: var
var == 55
voidchange(int
change(int v)
v)
{{
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
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à
hàm khá
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
NH P MÔN L P TRÌNH
Truy n
outputs
12/23/2009
13
a ch - ví d
#include
#include <stdio.h>
<stdio.h>
void
void change(int
change(int *v);
*v);
v: tham s
a ch
a s int, khai
báo v i d u *
int
int main()
main()
{{
truy n a ch
a “var”
int
var
=
5;
int var = 5;
vào hàm change
change(&var);
change(&var);
printf("main:
printf("main: var
var == %i\n",
%i\n", var);
var);
return
0;
return 0;
}}
change:
change: *v
*v == 500
500
main:
void
main: var
var == 500
500
voidchange(int
change(int *v)
*v)
{{
(*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
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
12/23/2009
15
Truy n tham chi u - ví d
#include
#include <stdio.h>
<stdio.h>
void
void change(int
change(int &v);
&v);
v: tham s tham
chi u, khai báo
id u&
int
int main()
main()
{{
truy n “var” vào hàm change
int
int var
var == 5;
5;
change(var);
change(var);
printf("main:
printf("main: var
var == %i\n",
%i\n", var);
var);
return
0;
return 0;
}}
change:
change: vv == 500
500
main:
void
main: var
var == 500
500
voidchange(int
change(int &v)
&v)
{{
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
Truy n tham s - ví d
#include
#include <stdio.h>
<stdio.h>
void
function(int
void function(int a,
a, int
int *b,
*b, int
int &c);
&c);
int
main()
int main()
{{
int
int xx == 3,
3, yy == 4,
4, zz == 5;
5;
function(x,
&y,
z);
function(x, &y, z);
printf("%i
printf("%i %i
%i %i\n",
%i\n", x,
x, y,
y, z);
z);
return
0;
return 0;
}}
void
void function(int
function(int a,
a, int
int *b,
*b, int
int &c)
&c)
{{
66 10
aa *=
10 16
16
*= 2;
2;
3
10
16
(*b)
+=
a;
3 10 16
(*b) += a;
cc == aa ++ (*b);
(*b);
printf("%i
printf("%i %i
%i %i\n",
%i\n", a,
a, *b,
*b, c);
c);
}}
NH P MÔN L P TRÌNH
Ph
main
main
a b c
function
function
17
12/23/2009
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
12/23/2009
18
Ph
ng th c trao
i d li u
#include
#include <stdio.h>
<stdio.h>
double
power(int,
double power(int, int);
int);
int
int main(void)
main(void)
{{
int
xx == 2;
int
2;
double
doubled;
d;
dd == power(x,
power(x, 5);
5);
printf("%lf\n",
printf("%lf\n", d);
d);
return
return 0;
0;
}}
double
double power(int
power(int n,
n, int
int p)
p)
{{
double
doubleresult
result == n;
n;
while(--p
>
0)
while(--p > 0)
result
result *=
*= n;
n;
return
result;
return result;
}}
NH P MÔN L P TRÌNH
Bài
32.0
power: result
2
power: n
5
power: p
?
32.0
main: d
2
main: x
19
12/23/2009
c thêm: t ch c d li u
D li u trong ch ng trì
c l u tr trong cá
trình
các
bi n.
Khi hà
c g i th c hi n, cá
c
hàm
các bi n c c b s
kh i t o trên vù
ng b h y khi
vùng nh stack và
và t
hàm k t thú
thúc.
Các bi n toà
c t o trên vù
toàn c c s
vùng nh phân
o n d li u (data
c
(data segment) khi
khi ch ng trì
trình
g i th c hi n, t
ng b h y khi ch ng trì
trình k t
thú
thúc.
Có th s d ng cá
ch nh v trí
các t khó
khóa
trí c a
bi n:
auto
- stack (default)
static
- data segment
register
- thanh ghi c a CPU
D li u còn có
có th
NH P MÔN L P TRÌNH
c
Heap
Data
segment
Stack
t trong vù
vùng nh heap.
12/23/2009
20
Tóm l
c
Khai báo và g i th c hi n hàm
Khai báo prototypes
T m tá
tác d ng c a bi n
Truy n tham s cho hà
hàm
V n t ch c d li u trong ch
NH P MÔN L P TRÌNH
ng trình
12/23/2009
C u trúc - Struct
21
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
12/23/2009
23
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
12/23/2009
24
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
{
Ki uthànhph n
Ki uthànhph n
Ki uthànhph n
Ki uthànhph n
...
};
NH P MÔN L P TRÌNH
u
Tênthànhph
Tênthànhph
Tênthànhph
Tênthànhph
n;
n;
n;
n;
25
12/23/2009
C u trúc – ví d
typedef
typedef struct
struct TDate
TDate
{{
char
char day;
day;
char
char month;
month;
int
year;
int
year;
};
};
typedef
typedef struct
struct TStudent
TStudent
{{
char
ID[10];
char
ID[10];
char
firstname[10];
char
firstname[10];
char
lastname[20];
char
lastname[20];
TDate
dob;
TDate
dob;
float
float marks[10];
marks[10];
};
};
NH P MÔN L P TRÌNH
typedef
typedef struct
struct TBook
TBook
{{
char
title[80];
char
title[80];
char
author[80];
char
author[80];
float
float price;
price;
char
isbn[20];
char
isbn[20];
};
};
//khai
//khai báo
báo
TBook
TBook
TStudent
TStudent
12/23/2009
các
các bi
bi nn
book;
book;
list[100];
list[100];
26
C u trúc – 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
thông qua tên bi n, d u "." và tên thành ph n.
c truy xu t
void
void Print(TStudent
Print(TStudent m)
m)
{{
printf("Name
:: %s
printf("Name
%s %s\n",
%s\n",
m.firstname,
m.lastname);
m.firstname, m.lastname);
printf("Student
:: %s\n",
printf("Student ID
ID
%s\n", m.ID);
m.ID);
printf("Date
of
birth
:
%hi/%hi/%i",
printf("Date of birth : %hi/%hi/%i",
m.dob.day,
m.dob.day, m.dob.month,
m.dob.month, m.dob.year);
m.dob.year);
printf("Marks
:: ");
printf("Marks
");
for
(int
i=0;
i<10;
i++)
for (int i=0; i<10; i++)
printf("%.2f
printf("%.2f ",
", m.marks[i]);
m.marks[i]);
}}
NH P MÔN L P TRÌNH
12/23/2009
27
C u trúc – Truy xu t các thành ph n
void
void ReadInfo(TStudent
ReadInfo(TStudent &m)
&m)
{{
printf("Type
printf("Type student
student ID:
ID: ");
");
scanf("%s",
m.ID);
scanf("%s", m.ID);
printf("Type
printf("Type first
first name:
name: ");
");
gets(m.firstname);
gets(m.firstname);
printf("Type
printf("Type last
last name:
name: ");
");
gets(m.lastname);
gets(m.lastname);
printf("Date
printf("Date of
of birth
birth (d
(d mm y):
y): ");
");
scanf("%hi
%hi
%i",
&(m.dob.day),
scanf("%hi %hi %i", &(m.dob.day),
&(m.dob.month),
&(m.dob.month), &(m.dob.year));
&(m.dob.year));
printf("Marks
(10
floats):
");
printf("Marks (10 floats): ");
for
for (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