Th t khai báo không quan tr ng... Heap Data segment Stack.
Trang 1Tr n Ph c Tu n
tranphuoctuan.khoatoan.dhsp@gmail.com http://baigiang.tranphuoctuan.com
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.
Trang 2NH P MÔN L P TRÌNH 12/23/2009 3
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.
double Power(double x, int n)
{
double result;
for(result = 1; n; n ) result *= x;
return result;
}
{
double result;
for(result = 1; n; n ) result *= x;
return result;
}
nh n vào 2 tham s khi c g i
ki u c a giá tr tr
giá tr c tr qua l nh return
Trang 3NH P MÔN L P TRÌNH 12/23/2009 5
#include <stdio.h>
double Power(double, int);
int main()
{
double m = Power(2, 3);
printf(“3.5 ^ 4 = %lf”, Power(3.5, 4));
return 0;
}
#include <stdio.h>
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
#include <stdio.h>
int main()
{
int m = Power(2, 3);
printf(“3.5 ^ 4 = %lf”, Power(4));
return 1.0;
}
#include <stdio.h>
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
Trang 4NH P MÔN L P TRÌNH 12/23/2009 7
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.
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à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 }
header c a hàm
thân (body) hàm
Trang 5NH P MÔN L P TRÌNH 12/23/2009 9
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;
}
Bi n toàn n c 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
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)
Trang 6NH P MÔN L P TRÌNH 12/23/2009 11
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);
#include <stdio.h>
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 <stdio.h>
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”
Trang 7NH P MÔN L P TRÌNH 12/23/2009 13
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, …);
function
#include <stdio.h>
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 <stdio.h>
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
a s int, khai
vào hàm change
Trang 8NH P MÔN L P TRÌNH 12/23/2009 15
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++
#include <stdio.h>
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 <stdio.h>
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
Trang 9NH P MÔN L P TRÌNH 12/23/2009 17
#include <stdio.h>
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 <stdio.h>
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
main
function
a b c
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
Trang 10NH P MÔN L P TRÌNH 12/23/2009 19
#include <stdio.h>
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 <stdio.h>
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: x 2
main: d
?
power: p 5
power: n 2
power: result 32.0
Ph ng th c trao i d li u
32.0
thúc.
Heap
Data segment Stack
Trang 11NH P MÔN L P TRÌNH 12/23/2009 21
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
Trang 12NH P MÔN L P TRÌNH 12/23/2009 23
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
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.
Trang 13NH P MÔN L P TRÌNH 12/23/2009 25
M t ki u c u trúc c nh ngh a v i t khóa struct
{
};
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
TStudent list[100];
//khai báo các bi n
TBook book;
TStudent list[100];
Trang 14NH P MÔN L P TRÌNH 12/23/2009 27
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]);
}
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]));
}