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

Bài giảng nhập môn lập trình hàm, cấu trúc trần phước tuấn

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 (271.98 KB, 14 trang )

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



×