TRƯỜNG ĐẠI HỌC CƠNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH
Ngơn ngữ lập trình C
Hàm – Chương trình con
Nội dung
Main()
Function1()
Input
Function2()
Function3()
FUNCTION
Function4()
2
Output
Ngơn ngữ lập trình C - Hàm
Đặt vấn đề
Viết chương trình tính S = a! + b! + c! với a, b, c là 3 số
nguyên dương nhập từ bàn phím.
Chương trình
chính
Nhập
a, b, c > 0
Nhập
a>0
3
Nhập
b>0
Tính
S = a! + b! + c!
Nhập
c>0
Tính
s1=a!
Tính
s2=b!
Tính
s3=c!
Ngơn ngữ lập trình C - Hàm
Xuất
kết quả S
Đặt vấn đề
3 đoạn lệnh nhập a, b, c > 0
1. do {
2.
printf(“Nhap mot so nguyen duong: ”);
3.
scanf(“%d”, &a);
4. } while (a <= 0);
5. do {
6.
printf(“Nhap mot so nguyen duong: ”);
7.
scanf(“%d”, &b);
8. } while (b <= 0);
9. do {
10.
printf(“Nhap mot so nguyen duong: ”);
11.
scanf(“%d”, &c);
12.} while (c <= 0);
4
Ngôn ngữ lập trình C - Hàm
Đặt vấn đề
3 đoạn lệnh tính s1 = a!, s2 = b!, s3 = c!
1. // Tính s1 = a! = 1 * 2 * … * a
2. s1 = 1;
3. for (i = 2; i <= a ; i++)
4.
s1 = s1 * i;
5. // Tính s2 = b! = 1 * 2 * … * b
6. s2 = 1;
7. for (i = 2; i <= b ; i++)
8.
s2 = s2 * i;
9. // Tính s3 = c! = 1 * 2 * … * c
10.s3 = 1;
11.for (i = 2; i <= c ; i++)
12.
s3 = s3 * i;
5
Ngôn ngữ lập trình C - Hàm
Đặt vấn đề
Giải pháp => Viết 1 lần và sử dụng nhiều lần
Đoạn lệnh nhập tổng quát, với n = a, b, c
1. do {
2.
printf(“Nhap mot so nguyen duong: ”);
3.
scanf(“%d”, &n);
4. } while (n <= 0);
Đoạn lệnh tính giai thừa tổng quát, n = a, b, c
1. { Tính s = n! = 1 * 2 * … * n }
2. s = 1;
3. for (i = 2; i <= n ; i++)
4.
s = s * i;
6
Ngơn ngữ lập trình C - Hàm
Hàm
Khái niệm
Một đoạn chương trình có tên, đầu vào và đầu ra.
Có chức năng giải quyết một số vấn đề chun biệt cho chương
trình chính.
Được gọi nhiều lần với các tham số khác nhau.
Được sử dụng khi có nhu cầu:
7
Tái sử dụng.
Sửa lỗi và cải tiến.
Ngơn ngữ lập trình C - Hàm
Hàm
Cú pháp
<kiểu trả về> <tên hàm>([danh sách tham số])
{
<các câu lệnh>
[return <giá trị>;]
}
Trong đó
8
<kiểu trả về> : kiểu bất kỳ của C (char, int, long, float,…). Nếu khơng
trả về thì là void.
<tên hàm>: theo quy tắc đặt tên định danh.
<danh sách tham số> : tham số hình thức đầu vào giống khai báo biến,
cách nhau bằng dấu ,
<giá trị> : trả về cho hàm qua lệnh return.
Ngơn ngữ lập trình C - Hàm
Kiểu trả về của hàm
Hàm có thể trả về một
giá trị
int
float
char
…
1.
2.
3.
4.
5.
void: Không trả về giá trị 6.
7.
8.
Khi kết thúc, hàm sẽ
mang một giá trị trừ
trường hợp hàm mang
kiểu void.
9.
10.
11.
12.
9
int cong(int x, int y)
{
return x + y;
}
float nhan(int x, int y)
{
return x * y;
}
void in(char line[])
{
printf("%s",line);
}
Ngơn ngữ lập trình C - Hàm
Tên hàm và tham số
Tên hàm do người lập
trình đặt
Tương tự đặt tên biến
int cong(int x, int y)
{
return x + y;
}
1.
2.
3.
4.
Tham số (đối số)
Một, nhiều hoặc khơng
có tham số
Mỗi tham số đều có kiểu
dữ liệu
Các tham số có thể được
dùng như một biến cục
bộ trong hàm.
float nhan(int x, int y)
{
return x * y;
}
5.
6.
7.
8.
9.
10.
11.
12.
10
void in(char line[])
{
printf("%s",line);
}
Ngơn ngữ lập trình C - Hàm
Giá trị trả về
Hàm return
Trả về giá trị cho hàm
Kết thúc hàm
1.
2.
3.
4.
Cú pháp: return <biểu thức>;
5.
int cong(int x, int y)
{
return x + y;
}
Kiểu dữ liệu của <biểu thức>
phải trùng với kiểu trả về của
hàm.
6.
Hàm void khơng có giá trị trả
về
9.
11
Khơng dùng lệnh return (Ví dụ
3)
7.
8.
10.
11.
12.
float nhan(int x, int y)
{
return x * y;
}
void in(char line[])
{
printf("%s",line);
}
Ngơn ngữ lập trình C - Hàm
Khai báo prototype
1.
1.
2.
3.
int cong(int, int);
float nhan(int, int);
void in(char);
2.
3.
4.
5.
Prototype: Khai báo các hàm 6.
7.
dùng trong chương trình
Kiểu trả về
Tên hàm
Danh sách tham số (nếu có)
Dấu chấm phẩy ;
Đầu chương trình hoặc trong
file header (*.h)
12
8.
9.
10.
11.
12.
int cong(int x, int y)
{
return x + y;
}
float nhan(int x, int y)
{
return x * y;
}
void in(char line[])
{
printf("%s",line);
}
Ngôn ngữ lập trình C - Hàm
Gọi hàm
Lệnh gọi hàm
1.
2.
Tên hàm
Danh sách tham số (nếu có) 3.
Theo thứ tự
Cùng kiểu dữ liệu
4.
5.
6.
Hàm có thể trả về một giá
trị có kiểu của kiểu trả về
của hàm.
7.
8.
9.
10.
11.
12.
13.
13
#include <stdio.h>
int cong(int, int);
void main()
{
int a = 5, b, c;
b = cong(a, 3);
c = b + cong(a,b);
printf("Tong: %d", c);
}
int cong(int x, int y)
{
return x + y;
}
Ngơn ngữ lập trình C - Hàm
Các bước viết hàm
Cần xác định các thông tin sau đây:
Tên hàm.
Hàm sẽ thực hiện cơng việc gì.
Các đầu vào (nếu có).
Đầu ra (nếu có).
Đầu vào 1
Tên hàm
Đầu vào 2
Đầu vào n
14
Đầu ra (nếu có)
Các cơng việc
sẽ thực hiện
Ngơn ngữ lập trình C - Hàm
Hàm
Ví dụ 1
Tên hàm: XuatTong
Cơng việc: tính và xuất tổng 2 số nguyên
Đầu vào: hai số nguyên x và y
Đầu ra: khơng có
1. void XuatTong(int x, int y)
2. {
3.
int s;
4.
s = x + y;
5.
printf(“%d cong %d bang %d”, x, y, s);
6. }
15
Ngơn ngữ lập trình C - Hàm
Hàm
Ví dụ 2
Tên hàm: TinhTong
Cơng việc: tính và trả về tổng 2 số nguyên
Đầu vào: hai số nguyên x và y
Đầu ra: một số nguyên có giá trị x + y
int TinhTong(int x, int y)
{
int s;
s = x + y;
return s;
}
16
Ngơn ngữ lập trình C - Hàm
Chương trình con - Function
Ví dụ 3
Tên hàm: NhapXuatTong
Cơng việc: nhập và xuất tổng 2 số ngun
Đầu vào: khơng có
Đầu ra: khơng có
void NhapXuatTong()
{
int x, y;
printf(“Nhap 2 so nguyen: ”);
scanf(“%d%d”, &x, &y);
printf(“%d cong %d bang %d”, x, y, x + y);
}
17
Ngơn ngữ lập trình C - Hàm
Một số lưu ý
Thông thường người ta thường đặt phần tiêu đề
hàm/nguyên mẫu hàm (prototype) trên hàm main và phần
định nghĩa hàm dưới hàm main.
1. void XuatTong(int x, int y);
// prototype
2. void main()
3. {
4.
…
5. }
6. void XuatTong(int x, int y)
7. {
8.
printf(“%d cong %d bang %d”, x, y, x + y);
9. }
18
Ngơn ngữ lập trình C - Hàm
Các cách truyền đối số
Truyền Giá trị (Call by Value)
Truyền đối số cho hàm ở dạng giá trị.
Có thể truyền hằng, biến, biểu thức nhưng hàm chỉ sẽ nhận giá
trị.
Được sử dụng khi khơng có nhu cầu thay đổi giá trị của tham
số sau khi thực hiện hàm.
void TruyenGiaTri(int x)
{
…
x++;
}
19
Ngôn ngữ lập trình C - Hàm
Các cách truyền đối số
Truyền Địa chỉ (Call by Address)
Truyền đối số cho hàm ở dạng địa chỉ (con trỏ).
Không được truyền giá trị cho tham số này.
Được sử dụng khi có nhu cầu thay đổi giá trị của tham số sau
khi thực hiện hàm.
void TruyenDiaChi(int *x)
{
…
*x++;
}
20
Ngơn ngữ lập trình C - Hàm
Các cách truyền đối số
Truyền Tham chiếu (Call by Reference) (C++)
Truyền đối số cho hàm ở dạng địa chỉ (con trỏ). Được bắt đầu
bằng & trong khai báo.
Không được truyền giá trị cho tham số này.
Được sử dụng khi có nhu cầu thay đổi giá trị của tham số sau
khi thực hiện hàm.
void TruyenThamChieu(int &x)
{
…
x++;
}
21
Ngơn ngữ lập trình C - Hàm
Lưu ý khi truyền đối số
Lưu ý
Trong một hàm, các tham số có thể truyền theo nhiều cách.
void HonHop(int x, int &y)
{
…
x++;
y++;
}
22
Ngơn ngữ lập trình C - Hàm
Lưu ý khi truyền đối số
Lưu ý
Sử dụng tham chiếu là một cách để trả về giá trị cho chương
trình.
int TinhTong(int x, int y)
{
return x + y;
}
void TinhTong(int x, int y, int &tong)
{
tong = x + y;
}
void TinhTongHieu(int x, int y, int &tong, int &hieu)
{
tong = x + y; hieu = x – y;
}
23
Ngơn ngữ lập trình C - Hàm
Lời gọi hàm
Cách thực hiện
Gọi tên của hàm đồng thời truyền các đối số (hằng, biến, biểu
thức) cho các tham số theo đúng thứ tự đã được khai báo trong
hàm.
Các biến hoặc trị này cách nhau bằng dấu ,
Các đối số này được được đặt trong cặp dấu ngoặc đơn ( )
<tên hàm> (<đối số 1>,… , <đối số n>);
24
Ngôn ngữ lập trình C - Hàm
Lời gọi hàm
Ví dụ
{ Các hàm được khai báo ở đây }
void main()
{
int n = 9;
XuatTong(1, 2);
XuatTong(1, n);
TinhTong(1, 2);
int tong = TinhTong(1, 2);
TruyenGiaTri(1);
TruyenGiaTri(n);
TruyenDiaChi(1);
TruyenDiaChi(&n);
TruyenThamChieu(1);
TruyenThamChieu(n);
}
25
Ngơn ngữ lập trình C - Hàm