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 |
Chia sẻ: phuongt97 | Lượt xem: 517 | 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