Hàm và cách tổ chức
chương trình C
GV. Nguyễn Minh Huy
Nhập mơn lập trình - GV. Nguyễn Minh Huy
1
Nội dung
Khái niệm hàm
hàm..
Truyền tham số và tầm vực
vực..
Tổ chức chương trình C.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
2
Nội dung
Khái niệm hàm.
hàm.
Truyền tham số và tầm vực
vực..
Tổ chức chương trình C.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
3
Khái niệm hàm
Xét chương trình sau:
sau:
Nhập vào 3 số nguyên a, b, c >= 0.
Tính và xuất S = a! + b! + c!.
Hãy chỉ ra những phần trùng lắp của chương trình
trình..
Điểm yếu của chương trình trùng lắp:
lắp:
Tốn thời gian,
gian, cơng sức
sức..
Khi có thay đổi sửa nhiều chỗ
chỗ..
Viết 1 lần,
lần, tái sử dụng lại nhiều lần.
lần.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
4
Khái niệm hàm
Phương pháp đặt hàm
hàm::
- B1: S1 = 1.
- B2: Nếu a > 0
S1 = S1 * a.
a = a – 1.
Quay lại B2.
- B3: S2 = 1.
- B4: Nếu b > 0
S2 = S2 * b.
b = b – 1.
Quay lại B4.
- B5: S3 = 1.
- B6: Nếu c > 0
S3 = S3 * c.
c = c – 1.
Quay lại B6.
- B7: S = S1 + S2 + S3.
S3.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
- B0: Đặt F(x) như sau
sau::
- B0.1: Đặt T = 1.
- B0.2: Nếu x > 0
T = T * x.
x = x – 1.
Quay lại B0.2.
- B1: S1 = F(a)
F(a)..
- B2: S2 = F(b)
F(b)..
- B3: S3 = F(c)
F(c)..
- B4: S = S1 + S2 + S3.
5
Khái niệm hàm
Phương pháp đặt hàm
hàm::
Đặt F(x)
đúng
a>0
sai
S1 = F(a)
S1 = S1 * a
a=a-1
đúng
x>0
đúng
b>0
sai
S2 = S2 * b
b=b-1
sai
T=T*x
x=x-1
S2 = F(b)
S3 = F(c)
S = S1 + S2 + S3
đúng
c>0
sai
S3 = S3 * c
c=c-1
S = S1 + S2 + S3
Nhập mơn lập trình - GV. Nguyễn Minh Huy
6
Khái niệm hàm
Hàm trong ngôn ngữ C:
Một khối lệnh được đặt tên.
tên.
Có thể gọi từ bất kỳ đâu trong chương trình
trình..
Có thể gọi nhiều lần với tham số khác nhau
nhau..
Cấu trúc của hàm
hàm::
Phần khai báo
báo::
Tên hàm
hàm..
Tham số đầu vào
vào..
Kết quả đầu ra.
ra.
Định danh hàm
hàm..
Đầu vào
Tên hàm
Đầu ra
Thân hàm
Phần cài đặt
đặt:: thân hàm
hàm..
Nhập môn lập trình - GV. Nguyễn Minh Huy
7
Khái niệm hàm
Các bước sử dụng hàm trong C:
Khai báo hàm (prototype):
<Kiểu trả về>
về> <Tên hàm>(
hàm>( <Khai báo tham số>
số> );
<Kiểu trả về>:
về>: int,
int, float, char, j, void (không trả về).
về).
float tinhDTB
tinhDTB(( float van, float toan );
Cài đặt hàm
hàm::
<Kiểu trả về>
về> <Tên hàm>(
hàm>( <Khai báo tham số>
số> )
{
[Các câu lệnh
lệnh]]
[return <giá trị trả về>
về>;]
}
Gọi thực hiện hàm
hàm::
<Tên hàm>(
hàm>( <Các tham số>
số> );
float dtb = tinhDTB
tinhDTB(7,
(7, 8.5);
Nhập mơn lập trình - GV. Nguyễn Minh Huy
8
Khái niệm hàm
Các bước sử dụng hàm trong C:
#include
<stdio.h>
>
// Khai báo hàm
hàm..
long tinhGT
tinhGT((int n);
void main()
{
/* Viết khai báo biến
biến..
Viết lệnh nhập a, b, c. */
// Cài đặt hàm
hàm..
long tinhGT
tinhGT((int n)
{
long s = 1;
for ( ; n > 0; n-n--))
s = s * n;
return s;
}
// Gọi thực hiện hàm
hàm..
S1 = tinhGT
tinhGT(a);
(a);
S2 = tinhGT
tinhGT(b);
(b);
S3 = tinhGT
tinhGT(c);
(c);
S = S1 + S2 + S3;
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
9
Nội dung
Khái niệm hàm
hàm..
Truyền tham số và tầm vực
vực..
Tổ chức chương trình C.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
10
Truyền tham số và tầm vực
Cách truyền tham số vào hàm
hàm::
Truyền tham trị (pass by value):
Truyền giá trị vào hàm
hàm..
Hàm chỉ nhận bản sao của tham số.
số.
Tham số KHÔNG bị thay đổi sau khi truyền
truyền..
Tham số:
số: biến
biến,, hằng
hằng,, biểu thức
thức..
float tinhDTB
tinhDTB(( float van, float toan )
{
van = van * 2;
toan = toan * 3;
return (van + toan)
toan) / 5;
}
void main
main()
()
{
float van, toan,
toan, dtb;
dtb;
dtb = tinhDTB
tinhDTB(( van,
van, toan );
dtb = tinhDTB
tinhDTB(( 6
6,, 8.5 );
);
dtb = tinhDTB
tinhDTB(( van + 1, toan );
// Biến van, toan khơng thay đổi
đổi..
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
11
Truyền tham số và tầm vực
Cách truyền tham số vào hàm
hàm::
Truyền tham chiếu (pass by reference) (C++):
Còn gọi là truyền tham biến
biến..
Hàm nhận bản gốc của tham số.
số.
Tham số có thể BỊ thay đổi sau khi truyền
truyền..
Tham số chỉ có thể là biến
biến..
Khai báo tham số:
số: &<tên tham số>.
số>.
float tinhDTB
tinhDTB(( float &van
&van,, float toan )
{
van = van * 2;
toan = toan * 3;
return (van + toan)
toan) / 5;
}
void main
main()
()
{
float van, toan,
toan, dtb;
dtb;
dtb = tinhDTB
tinhDTB(( van,
van, toan );
// Biến van bị thay đổi
đổi..
dtb = tinhDTB
tinhDTB(( 6
6,, 8.5 );
);
//
//Sai
Sai
dtb = tinhDTB
tinhDTB(van
(van + 1, toan)
toan); //
//Sai
Sai
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
12
Truyền tham số và tầm vực
Cách truyền tham số vào hàm
hàm::
Ghi chú
chú::
Dùng truyền tham chiếu để trả về giá trị.
trị.
Hàm có nhiều giá trị trả về.
về.
void nhapDiem
nhapDiem(( float &diem1
&diem1,, float &diem2 )
{
printf(“
printf
(“Nhap
Nhap diem van = “);
scanf(“%d”,
scanf
(“%d”, &
&diem1
diem1);
);
printf(“
printf
(“Nhap
Nhap diem toan = “);
scanf(“%d”,
scanf
(“%d”, &
&diem2
diem2);
);
}
void tinhDTB
tinhDTB(( float van, float toan,
toan, float &dtb )
{
van = van * 2;
toan = toan * 3;
dtb = (van + toan)
toan) / 5;
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
void main
main()
()
{
int van, toan;
toan;
float dtb;
dtb;
// van, toan thay đổi
nhapDiem(van,
nhapDiem
(van, toan);
toan);
// dtb thay đổi
tinhDTB(van,
tinhDTB
(van, toan,
toan, dtb
dtb);
);
}
13
Truyền tham số và tầm vực
Tầm vực:
vực:
Phạm vi hoạt động của biến và hàm
hàm..
Phân loại
loại::
Toàn cục
cục:: hoạt động trên tồn chương trình
trình..
Cục bộ:
bộ: hoạt động trong một khối lệnh
lệnh..
Hàm phạm vi toàn cục
cục..
Biến
Biến::
Biến toàn cục
cục:: khai báo ngoài hàm (kể cả hàm main).
Hoạt động trên toàn chương trình
trình..
Biến cục bộ:
bộ: khai báo trong thân hàm hoặc khối lệnh
lệnh..
Hoạt động trong thân hàm hoặc khối lệnh
lệnh..
Nhập mơn lập trình - GV. Nguyễn Minh Huy
14
Truyền tham số và tầm vực
Tầm vực:
vực:
float S;
int tinh();
void main()
{
int a = S + tinh();
while (a > 0)
{
int b = S + tinh();
}
}
int hamXYZ()
{
int y = S * 2;
}
Nhập môn lập trình - GV. Nguyễn Minh Huy
// Khai báo biến toàn cục.
// Khai báo hàm.
// Biến cục bộ hàm main.
// Biến cục bộ vòng lặp.
// Biến cục bộ hàm tinh.
15
Nội dung
Khái niệm hàm
hàm..
Truyền tham số và tầm vực
vực..
Tổ chức chương trình C.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
16
Tổ chức chương trình C
Một quyển sách được tổ chức thế nào
nào?
?
Không thể viết tất cả trên một trang giấy
giấy!!
!!
Chia làm nhiều chương
chương..
Có mục lục ở đầu.
đầu.
Nội dung các chương ở sau.
sau.
Nhập mơn lập trình - GV. Nguyễn Minh Huy
17
Tổ chức chương trình C
Cách tổ chức chương trình C:
Tổ chức giống một quyển sách
sách..
Các chương ~ các file mã nguồn
nguồn..
Mục lục ~ hàm main.
Làm sao kết nối các file mã nguồn
nguồn?
?
// File main.cpp
void main()
{
nhap();
tinhToan1();
tinhToan2();
xuat();
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
// File nhapxuat.cpp
void nhap()
{
}
// File xuly.cpp
int tinhToan1()
{
}
void xuat()
{
}
int tinhToan2()
{
}
18
Tổ chức chương trình C
Header file:
Kết nối các file mã nguồn trong chương trình
trình..
Làm mã nguồn trên các file hiểu lẫn nhau
nhau..
Có đi file .h
.h..
Cách sử dụng
dụng::
Tạo file .h cho file mã nguồn .cpp.
cpp.
File .h chỉ chứa khai báo hàm và biến
biến..
File .cpp chỉ chứa cài đặt hàm
hàm..
Để A.cpp hiểu mã nguồn của B.cpp
Trong A.cpp dùng #include “<Đường dẫn B.h
B.h>
>”
Nhập mơn lập trình - GV. Nguyễn Minh Huy
19
Tổ chức chương trình C
Header file:
// File main.cpp
#include “nhapxuat.h”
#include “xuly.h”
// File nhapxuat.h
// Khai báo hàm
void nhap();
void xuat();
// File xuly.h
// Khai báo hàm
int tinhToan1();
int tinhToan2();
void main()
{
nhap();
tinhToan1();
tinhToan2();
xuat();
}
// File nhapxuat.cpp
void nhap()
{
}
// File xuly.cpp
int tinhToan1()
{
}
void xuat()
{
}
int tinhToan2()
{
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
20