Nội dung
Đặ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
Đoạn lệnh trùng lặp
Các đoạn lệnh có tính nguyên tố
              
                                            
                                
            
 
            
                 36 trang
36 trang | 
Chia sẻ: phuongt97 | Lượt xem: 693 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng Nhập môn lập trình - Chương 5: Hàm-Chương trình con - Ngô Hữu Dũng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nhập môn lập trình
Hàm – Chương trình con
TS. Ngô Hữu Dũng
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH
Nội dung
Nhập môn lập trình - Hàm
Main()
Function1()
Function2()
Function3()
Function4()
FUNCTION
Input
Output
2
Đặ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.
Nhập môn lập trình - Hàm
Chương trình
chính
Nhập
a, b, c > 0
Tính
S = a! + b! + c!
Xuất
kết quả S
Nhập
a > 0
Nhập
b > 0
Nhập
c > 0
Tính
s1=a!
Tính
s2=b!
Tính
s3=c!
3
Đoạn lệnh trùng lặp
 3 đoạn lệnh nhập a, b, c > 0
Nhập môn lập trình - Hàm
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
Các đoạn lệnh có tính nguyên tố
 3 đoạn lệnh tính s1 = a!, s2 = b!, s3 = c!
Nhập môn lập trình - Hàm
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
Tổng quát hoá 
 Giải pháp => Tổng quát hoá các đoạn lệnh trùng lặp và có 
tính nguyên tố thành đoạn lệnh tổng quát 
 Đoạn lệnh nhập tổng quát
 Đoạn lệnh tính giai thừa tổng quát
Nhập môn lập trình - Hàm
1. // Nhập số nguyên dương
2. do {
3. printf("Nhap mot so nguyen duong: ");
4. scanf("%d", &n);
5. } while (n <= 0);
1. // Tính s = n! = 1 * 2 *  * n
2. s = 1;
3. for (i = 2; i <= n ; i++)
4. s = s * i;
6
Chương trình con
Nhập môn lập trình - Hàm
 Cài đặt hàm nhập số nguyên dương và hàm tính giai thừa
1. void nhap(int &n)
2. {
3. do {
4. printf("Nhap mot so nguyen duong: ");
5. scanf("%d", &n);
6. } while(n <= 0);
7. }
8. int giaiThua(int n)
9. {
10. int s = 1;
11. for (i = 2; i <= n ; i++)
12. s = s * i;
13. return s;
14.}
7
Sử dụng hàm
Nhập môn lập trình - Hàm
 Sử dụng các hàm trong chương trình chính:
1. int main()
2. {
3. int a, b, c, s1, s2, s3, s;
4. nhap(a);
5. nhap(b);
6. nhap(c);
7. s1 = giaiThua(a);
8. s2 = giaiThua(b);
9. s3 = giaiThua(c);
10. s = s1 + s2 + s3;
11. // s = giaiThua(a)+giaiThua(b)+giaiThua(c);
12. printf("Tong: %d\n", s);
13. return 0;
14.}
8
Cấu trúc
Nhập môn lập trình - Hàm
 Cấu trúc chương trình
 Khai báo nguyên mẫu hàm
 prototype
 Chương trình chính
 Định nghĩa các hàm
1. #include 
2. void nhap(int &);
3. int giaiThua(int);
4. int main()
5. {
6. // Nội dung
7. }
8. void nhap(int &n)
9. {
10. // Nội dung
11.}
12.int giaiThua(int n)
13.{
14. // Nội dung
15.}
9
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 đề chuyên 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:
 Tái sử dụng.
 Sửa lỗi và cải tiến.
Nhập môn lập trình - Hàm10
Hàm
 Cú pháp
 Trong đó
 : kiểu bất kỳ của C (char, int, long, float,). Nếu không
trả về thì là void.
 : Như quy tắc đặt tên biến.
 : tham số hình thức đầu vào giống khai báo biến, 
cách nhau bằng dấu ,
 : trả về cho hàm qua lệnh return.
Nhập môn lập trình - Hàm
 ([danh sách tham số])
{
[return ;]
}
11
Khai báo prototype
Nhập môn lập trình - Hàm
 Prototype: Khai báo các hàm
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)
1. int cong(int x, int y)
2. {
3. return x + y;
4. }
5. float nhan(int x, int y)
6. {
7. return x * y;
8. }
9. void in(float x)
10. {
11. printf("%.2f", x);
12. }
1. int cong(int, int);
2. float nhan(int, int);
3. void in(char[]);
12
Kiểu trả về của hàm
Nhập môn lập trình - Hàm
 Hàm có thể trả về một
giá trị
 int
 float
 char
 
 void: Không trả về giá trị
 Khi kết thúc, hàm sẽ 
mang một giá trị, trừ 
trường hợp hàm mang 
kiểu void.
1. int cong(int x, int y)
2. {
3. return x + y;
4. }
5. float nhan(int x, int y)
6. {
7. return x * y;
8. }
9. void in(float x)
10. {
11. printf("%.2f", x);
12. }
13
Tên hàm và tham số
Nhập môn lập trình - Hàm
 Tên hàm do người lập
trình đặt
 Tương tự đặt tên biến
 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.
1. int cong(int x, int y)
2. {
3. return x + y;
4. }
5. float nhan(int x, int y)
6. {
7. return x * y;
8. }
9. void in(float x)
10. {
11. printf("%.2f", x);
12. }
14
Giá trị trả về
Nhập môn lập trình - Hàm
 Hàm return 
 Trả về giá trị cho hàm
 Kết thúc hàm
 Cú pháp: return ;
 Kiểu dữ liệu của 
phải trùng với kiểu trả về của
hàm.
 Hàm void không có giá trị trả
về
 Không dùng lệnh return (Ví dụ
3)
1. int cong(int x, int y)
2. {
3. return x + y;
4. }
5. float nhan(int x, int y)
6. {
7. return x * y;
8. }
9. void in(float x)
10. {
11. printf("%.2f", x);
12. }
15
Gọi hàm
Nhập môn lập trình - Hàm
 Lệnh gọi hàm
 Tên hàm
 Danh sách tham số (nếu có)
 Theo thứ tự
 Cùng kiểu dữ liệu
 Hàm có thể trả về một giá
trị có kiểu của kiểu trả về
của hàm.
1. #include 
2. int cong(int, int);
3. float nhan(int, int);
4. void in(float);
5. void main()
6. {
7. int a = 5, b;
8. float c;
9. b = cong(a, 3);
10. c = nhan(b, 5.4);
11. in(c);
12. }
13. // Định nghĩa các hàm
16
Tham số - Truyền Giá trị (Call by Value)
Nhập môn lập trình - Hàm
// Truyền giá trị của tham số x cho hàm (tham trị)
// Hàm sử dụng giá trị nhận được để xử lý
void truyenGiaTri(int x)
{
x++;
}
/* Khi gọi hàm, có thể dùng hằng, biến hoặc biểu 
thức để truyền giá trị */
truyenGiaTri(5);
truyenGiaTri(a);
truyenGiaTri(a+b*5);
truyenGiaTri();
truyenGiaTri(5, 7);
17
Tham số - Truyền tham chiếu (Call by Reference)
Nhập môn lập trình - Hàm
/*- Truyền địa chỉ của biến cho hàm (tham biến)
- Hàm sử dụng biến nhận được để xử lý
- Giá trị của biến có thể thay đổi sau khi thực 
hiện hàm 
- C++ */
void truyenThamChieu(int &x)
{
x++;
}
// Khi gọi hàm, chỉ được dùng biến để truyền tham số
truyenThamChieu(a);
truyenThamChieu(b);
truyenThamChieu(5);
18
Tham số - Truyền địa chỉ (Call by Address)
Nhập môn lập trình - Hàm
/* - Truyền địa chỉ của biến cho hàm (tham biến)
- Hàm sử dụng biến nhận được để xử lý
- Giá trị của biến có thể thay đổi sau khi thực 
hiện hàm
- Thao tác kiểu con trỏ */
void truyenDiaChi(int *x)
{
*x++;
}
/* Khi gọi hàm, chỉ được dùng địa chỉ của biến để 
truyền tham số */
truyenDiaChi(&a);
truyenDiaChi(&b);
truyenDiaChi(a);
truyenDiaChi(5);
19
Nhiều loại tham số
Nhập môn lập trình - Hàm
/* Các tham số có thể được truyền theo nhiều cách */
void honHop(int x, int &y, int *z)
{
x++;
y++;
*z++;
}
/* Khi gọi hàm cần truyền phù hợp với tham số tương 
ứng */
honHop(5, a, &b);
hopHop(a + b, b, &a);
hopHop(a, a + b, &a);
hopHop(5, a, b);
20
Các cách nhận giá trị tính toán từ hàm
Nhập môn lập trình - Hàm
// Nhận giá trị trả về
int tinhTong(int x, int y)
{
return x + y;
}
// Nhận tham chiếu
void tinhTong(int x, int y, int &tong)
{
tong = x + y;
}
// Nhận tham biến hoặc tham chiếu
void tinhTongHieu(int x, int y, int &tong, int *hieu)
{
tong = x + y; *hieu = x – y;
}
21
Xây dựng hàm
 Đầu vào - Input?
 Đầu ra - Output?
 Kiểu trả về? 
 Tham số?
 Nguyên mẫu hàm?
 Định nghĩa hàm?
 Sử dụng hàm?
Nhập môn lập trình - Hàm
f(x)Input Output
22
Hàm không trả về
 Ví dụ 1 – Xuất tổng
 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ó
Nhập môn lập trình - Hàm
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. }
23
Hàm trả về
 Ví dụ 2 – Tính tổng
 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
Nhập môn lập trình - Hàm
int tinhTong(int x, int y)
{
int s;
s = x + y;
return s;
}
24
Chương trình con - Function
 Ví dụ 3 – Nhập và xuất tổng
 Tên hàm: nhapXuatTong
 Công việc: nhập và xuất tổng 2 số nguyên
 Đầu vào: không có
 Đầu ra: không có
Nhập môn lập trình - Hàm
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);
}
25
Tầm vực
 Khái niệm
 Là phạm vi hiệu quả của biến và hàm.
 Biến:
 Toàn cục: khai báo trong ngoài tất cả các hàm (kể
cả hàm main) và có tác dụng lên toàn bộ chương
trình.
 Cục bộ: khai báo trong hàm hoặc khối { } và chỉ
có tác dụng trong bản thân hàm hoặc khối đó (kể
cả khối con nó). Biến cục bộ sẽ bị xóa khỏi bộ nhớ
khi kết thúc khối khai báo nó.
Nhập môn lập trình - Hàm26
Tầm vực
Nhập môn lập trình - Hàm
int a;
int Ham1()
{
int a1;
}
int Ham2()
{
int a2;
{
int a21;
}
}
void main()
{
int a3;
}
27
Ví dụ phạm vi của biến (1)
1. #include 
2. void half(float);
3. float b = 9; // Biến toàn cục
4. void main()
5. {
6. float a = 15; // Biến cục bộ
7. half(a); // Gọi hàm half
8. printf("a = %f, b = %f\n", a, b);
9. }
10. void half(float a)
11. {
12. a = a / 2; // Biến cục bộ trong hàm half
13. b = b / 2; // Biến toàn cục
14. printf("a = %f, b = %f\n", a, b);
15. }
Nhập môn lập trình - Hàm28
Ví dụ phạm vi của biến (2)
1. #include 
2. void double(float);
3. float x = 5, y = 6; // Biến toàn cục
4. void main()
5. {
6. float y = 7; // Biến cục bộ
7. double(x); // Gọi hàm double
8. printf("x = %f, y = %f\n", x, y);
9. }
10. void double(float x)
11. {
12. x = x * 2; // Biến cục bộ
13. y = y * 2; // Biến toàn cục
14. printf("x = %f, y = %f\n", x, y);
15. }
Nhập môn lập trình - Hàm29
Ví dụ phạm vi của biến (3)
1. #include 
2. void main()
3. {
4. int x = 5; // Phạm vi hàm main
5. if (x)
6. {
7. int x = 10; // Phạm vi lệnh if
8. x++;
9. printf("x = %d\n",x);
10. }
11. x++;
12. printf("x = %d\n",x);
13. }
Nhập môn lập trình - Hàm30
Bài tập vận dụng
Nhập môn lập trình - Hàm
 Viết các hàm sau
1. Hàm nhập một số nguyên dương
2. Hàm nhập một số nguyên dương nhỏ hơn 100
3. Hàm nhập một số nguyên có giá trị từ a đến b
4. Hàm tính trung bình cộng của hai số thực
5. Hàm tính giai thừa của số nguyên dương n
6. Hàm tính diện tích của tam giác, biết ba cạnh
7. Hàm kiểm tra ba số có phải là ba cạnh của tam giác
8. Hàm kiểm tra số nguyên tố
9. Hàm xuất ra màn hình các số từ 1 đến n
10. Hàm xuất ra màn hình các số nguyên tố nhỏ hơn n
31
Đệ quy
 Khái niệm
 Một chương trình con có thể gọi một chương trình con khác.
 Nếu gọi chính nó thì được gọi là sự đệ quy.
 Số lần gọi này phải có giới hạn (điểm dừng)
 Ví dụ
 Tính S(n) = n! = 1*2**(n-1)*n
 Ta thấy S(n) = S(n-1)*n
 Vậy thay vì tính S(n) ta sẽ đi tính S(n-1)
 Tương tự tính S(n-2), , S(2), S(1), S(0) = 1
Nhập môn lập trình - Hàm32
Đệ quy
 Ví dụ
Nhập môn lập trình - Hàm
int GiaiThua(int n)
{
if (n == 0)
return 1;
else
return GiaiThua(n – 1) * n;
}
int GiaiThua(int n)
{
if (n > 0)
return GiaiThua(n – 1) * n;
else
return 1;
}
33
Bài tập 5.1
Viết các hàm sau
a. Viết hàm đổi một ký tự hoa sang ký tự thường.
b. Viết thủ tục giải phương trình bậc nhất.
c. Viết thủ tục giải phương trình bậc hai.
d. Viết hàm trả về giá trị nhỏ nhất của 4 số nguyên. 
e. Viết thủ tục hoán vị hai số nguyên.
f. Viết thủ tục sắp xếp 4 số nguyên tăng dần.
Nhập môn lập trình - Hàm34
Bài tập 5.2
Viết các hàm nhận vào một số nguyên dương và:
a. Trả về số đảo của số đó.
b. Có phải là số đối xứng (Trả về True/False)
c. Có phải là số chính phương.
d. Có phải là số nguyên tố.
e. Tổng các chữ số lẻ. 
f. Tổng các chữ số nguyên tố.
g. Tổng các chữ số chính phương.
Nhập môn lập trình - Hàm35
Bài tập 5.3
Viết hàm nhận vào một số nguyên dương n và thực hiện:
a. S = 1 + 2 +  + n
b. S = 12 + 22 +  + n2
c. S = 1 + 1/2 +  + 1/n
d. S = 1 * 2 *  * n
e. S = 1! + 2! +  + n!
Nhập môn lập trình - Hàm36
            Các file đính kèm theo tài liệu này:
 bai_giang_nhap_mon_lap_trinh_chuong_5_ham_chuong_trinh_con_n.pdf bai_giang_nhap_mon_lap_trinh_chuong_5_ham_chuong_trinh_con_n.pdf