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.

pdf 14 trang phuongnguyen 8460
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

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:

  • pdfbai_giang_nhap_mon_lap_trinh_ham_cau_truc_tran_phuoc_tuan.pdf