Professional Documents
Culture Documents
HÀM
THỰC HÀNH CƠ SỞ LẬP TRÌNH
TUẦN 13 - THÁNG 5 NĂM 2023
GIỚI THIỆU
Hàm trong C dùng để tổ chức và sắp xếp hiệu quả
các đoạn code trong chương trình.
Ta có thể tách riêng các hàm thành các file mã nguồn
riêng hoặc viết trực tiếp hàm trong mã nguồn chính.
NỘI DUNG
CƠ CHẾ TRUYỀN
01 HÀM TRONG C 02 THAM SỐ 03 MỘT SỐ VÍ DỤ
- Hàm là gì? - Biến địa phương - swap(x;y)
- Khai báo hàm trong C - Biến toàn cục
- Lệnh return - Tham trị & Tham chiếu
- Hàm trả về
- Hàm không trả về
01
HÀM TRONG C
[return type] [name] ([arguments]){
…
return [value];
}
HÀM LÀ GÌ?
- Hàm là một đoạn chương trình có
tên, đầu vào và đầu ra.
- Hàm có chức năng giải quyết một
số vấn đề chuyên biệt cho chương
trình chính.
- Có thể gọi hàm để sử dụng nhiều
lần với nhiều đầu vào khác nhau.
- Các hàm có chức năng chuyên biệt
hỗ trợ cấu trúc gọn gàng cho
chương trình chính, dễ sử dụng và
dễ sửa lỗi.
KHAI BÁO HÀM TRONG C
[kiểu trả về] [tên hàm] ([các tham số đầu vào])
{
[thân hàm]
}
● [kiểu trả về] : kiểu dữ liệu bất kỳ của C như int, float, double, char, long, …
Kiểu trả về có thể là con trỏ (trả về một địa chỉ của biến ở hàm main hoặc
hàm con đang gọi)
● [tên hàm]: đặt theo quy tắc camelCase.
● [các tham số đầu vào]: tham số hình thức đầu vào giống khai báo biến, có
quy định thứ tự, cách nhau bằng dấu phẩy (,)
KHAI BÁO HÀM TRONG C
[kiểu trả về] [tên hàm] ([các tham số đầu vào])
{
[thân hàm]
}
Ta có thể return:
return;
return(hằng);
return(biến);
return(biểu thức);
return(câu lệnh đánh giá);
Hàm trả về trong C
Hàm trả về có chức năng thực hiện nhiều bước tính toán, sau đó gán giá trị cần
tìm cho biến hàm rồi kết thúc bằng lệnh return.
Khai báo hàm trả về kiểu nguyên, tên primeTest có 01 tham số hình thức
int primeTest(int number){
kiểu nguyên là number.
if(number%i == 0) Nếu number chia hết cho i nghĩa là number không phải là số nguyên tố.
return 0; Trả về giá trị 0 cho primeTest (0 có nghĩa là không) rồi dừng hàm.
Nếu hàm không bị dừng ở trên thì number là số nguyên tố (không chia
return 1; hết cho số nào ngoài 1 và chính nó), trả về giá trị 1 cho primeTest và kết
thúc hàm.
}
Hàm không trả về trong C
Nếu hàm không cần trả về giá trị gì (hàm thực hiện biến đổi) thì ta dùng kiểu
void. Hàm không trả về vẫn có thể có tham số hình thức.
Ví dụ: Hàm nhập mảng.
Khai báo hàm nhập mảng tên inputArray có hai tham số hình thức là con trỏ
void inputArray(int *array, int *n){ mảng *array và con trỏ số lượng phần tử mảng *n.
Khi ta gọi hàm, ta sẽ truyền địa chỉ của mảng và biến số lượng để biến đổi.
scanf(“%d”,array+i);
hàm main. }
void main(){
float x[1000];
Biến toàn cục: printf(“Nhap so chieu n = ”);
- Khai báo/ định nghĩa bên ngoài các khối scanf(“%d”,&n);
for (int i = 0; i<n; i++){
lệnh, kể cả hàm main. printf(“Nhap x(%d) = ”,i);
- Dùng toán tử ‘::’ nếu có biến cục bộ trùng scanf(“%f”,x+i);
}
tên. chuan = chuanMax(x,n);
printf(“||x|| = %f”,chuan);
}
CƠ CHẾ TRUYỀN THAM SỐ
Cú pháp gọi hàm là [tên hàm] ([các tham số]); #include <stdio.h>
float chuan;
1. Khi ta gọi hàm và truyền tham số vào, các giá int n;
trị sẽ ngay lập tức được gán cho các tham số float chuanMax(float x[], int n) {
int max = *x;
hình thức bên trong hàm. for (int i = 0; i < n; i++)
2. Khi gặp lệnh return hoặc khi hết hàm, các if (max < *(x+i))
max = *(x+i);
tham số hình thức và các biến cục bộ biến return max;
- Gán giá trị của biến truyền vào cho - Gán địa chỉ của biến truyền vào cho
tham số hình thức (copy). tham số hình thức (con trỏ).
- Mọi thay đổi liên quan đến tham số - Mọi thay đổi liên quan đến tham số
hình thức không ảnh hưởng lên biến hình thức đều ảnh hưởng lên biến
truyền vào. truyền vào.
Tham trị Tham chiếu (con trỏ) Tham chiếu (truyền địa chỉ)
Code các chương trình dưới đây theo thứ tự từ 1, sửa lỗi lần lượt
theo hình 2, 3, 4 vào IDE rồi debug để kiểm tra có điều gì bất thường
không? So sánh sự khác nhau giữa các hình.
Hàm dùng
return
Dòng Mô tả
viết hàm tính nghiệm phương
trình bậc hai một ẩn 1 …
ax2 + bx + c = 0 2 int EqualDeg2(double a, double b, double c, double& x1, double&
x2){
3 int nSolution; x1 = x2 = 0;
4 if(a==0) nSolution = EqualDeg1(b, c, x1);
5 else{
6 double delta = b*b – 4*a*c, two_a = 2*a;
7 if(delta < 0) nSolution = NoSolution;
8 else if(delta == 0) { x1 = x2 = -b/two_a; nSolution = 1;}
9 else{
10 double sqrtDelta = sqrt(delta);
10 }
11 i++;
12 }
13 return Prime;}
Viết hàm liệt kê các số nguyên tố
nhỏ hơn n
Dòng Mô tả
1 void PrimeListing(long n){
2 for(long i = 2; i <= n; i++){
3 if(isPrime(i)) printf(“%ld\n”, i);
4 }}
Viết hàm in ra số nguyên tố thứ n
Dòng Mô tả
1 void GetPrime(long n){
2 long p = 2, c = 1, nextNum = 3;
3 while(c < n){
4 if(isPrime(nextNum)){p = nextNum; c++; }
5 nextNum+=2;
6 }}
Dòn Mô tả
g
viết hàm xét phương trình
ax4+bx2+c = 0 1 …
2 int EqualQuartic(double a, double b, double c, double& x1, double& x2,
double& x3, double& x4){
Đặt y = x2 ⇒ ay2 + by + c = 0 (2) 3 int nSolution, nSol1, nSol2; double y1, y2; x1 = x2 = x3 = x4 = 0;
Nếu (2) vô nghiệm thì (1) vô 4 nSol1 = EqualDeg2(a, b, c, y1, y2);
nghiệm
Nếu (2) có 1 nghiệm y = y1 = x2 ⇔ 5 switch(nSol1){
x2 – y1 = 0 (3): 6 case NoSolution: case Undetermined: nSolution = nSol1; break;
Giải (3) tìm x1 & x2
7 case 1: nSolution = EqualDeg2(1, 0, -y1, x1, x2); break;
Nếu (2) có 2 nghiệm
y = y1 = x2 ⇔ x2 – y1 = 0 (4): Giải (4) tìm x 8 case 2: nSol2 = EqualDeg2(1, 0, -y1, x1, x2);
y = y2 = x2 ⇔ x2 – y2 = 0 (5): Giải (5) tìm x
9 switch(nSol2){
10 case NoSolution: nSolution = EqualDeg2(1, 0, -y2, x1, x2); break;
•Lưu ý: không cần kiểm tra
điều kiện y ≥ 0 vì việc đó sẽ 11 case 1: nSolution = 1 + EqualDeg2(1, 0, -y2, x2, x3); break;
do EqualDeg2 xử lý 12 case 2: nSolution = 2 + EqualDeg2(1, 0, -y2, x3, x4); break;
13 }} return nSolution; }
viết hàm giải gần đúng Dòng Mô tả
phương trình f(x)=0
1 double f(double x){
2 return pow(x, 9) + x + 1;//f(x)=x9+x+1
3 }
4 void Solve(int& x){//Tìm x để f(x) = 0
5 const double epsilon = 0.000000001;
6 double left = -1, right = 0; // a=-1, b=0