CHƯƠNG 6: HÀM (FUNCTION) | BÀI GIẢNG NHẬP MÔN LẬP TRÌNH

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. Bài giảng giúp bạn tham khảo, củng cố kiến thức và ôn tập đạt kết quả cao.

Trường Đại hc Khoa hc T nhiên
Khoa Công ngh thông tin
B môn Tin hc cơ s
1
Đng Bình Phương
dbphuong@fit.hcmuns.edu.vn
NHP MÔN LP TRÌNH
HÀM (FUNCTI ON)
VC
VC
&
&
BB
BB
22
Ni dung
NMLT - Hàm (Function)
Khái nim và pháp
1
Tm vc
2
Tham s li gi hàm
3
Đệ quy
4
VC
VC
&
&
BB
BB
33
Đặt vn đề
Viết chương trình tính S = a! + b! + c! vi a, b, c
3 s nguyên dương nhp t bàn phím.
NMLT - Hàm (Function)
Chương trình
chính
Chương trình
chính
Nhp
a, b, c > 0
Nhp
a, b, c > 0
Tính
S = a! + b! + c!
Tính
S = a! + b! + c!
Xut
kết qu S
Xut
kết qu S
Nhp
a > 0
Nhp
a > 0
Nhp
b > 0
Nhp
b > 0
Nhp
c > 0
Nhp
c > 0
Tính
s1=a!
Tính
s1=a!
Tính
s2=b!
Tính
s2=b!
Tính
s3=c!
Tính
s3=c!
VC
VC
&
&
BB
BB
44
Đặt vn đề
3 đon lnh nhp a, b, c > 0
NMLT - Hàm (Function)
do {
printf(“Nhap mot so nguyen duong: ”);
scanf(“%d”, &
a);
} while (
a <= 0);
do {
printf(“Nhap mot so nguyen duong: ”);
scanf(“%d”, &
b);
} while (
b <= 0);
do {
printf(“Nhap mot so nguyen duong: ”);
scanf(“%d”, &c);
} while (
c <= 0);
VC
VC
&
&
BB
BB
55
Đặt vn đề
3 đon lnh tính s1 = a!, s2 = b!, s3 = c!
NMLT - Hàm (Function)
{ Tính s1 = a! = 1 * 2 * … * a }
s1 = 1;
for (i = 2; i <=
a ; i++)
s1 = s1 * i;
{ Tính s2 = b! = 1 * 2 * … * b }
s2 = 1;
for (i = 2; i <=
b ; i++)
s2 = s2 * i;
{ Tính s3 = c! = 1 * 2 * … * c }
s3 = 1;
for (i = 2; i <=
c ; i++)
s3 = s3 * i;
VC
VC
&
&
BB
BB
66
Đặt vn đề
Gii pháp => Viết 1 ln và s dng nhiu ln
Đon lnh nhp tng quát, vi n = a, b, c
Đon lnh tính giai tha tng quát, n = a, b, c
NMLT - Hàm (Function)
do {
printf(“Nhap mot so nguyen duong: ”);
scanf(“%d”, &n);
} while (
n <= 0);
{ Tính s = n! = 1 * 2 * … * n }
s = 1;
for (i = 2; i <=
n ; i++)
s = s * i;
VC
VC
&
&
BB
BB
77
Hàm
Khái nim
Mt đon chương trình có tên, đầu vào và
đầu ra.
chc năng gii quyết mt s vn đề
chuyên bit cho chương trình chính.
Được gi nhiu ln vi các tham s khác
nhau.
Được s dng khi có nhu cu:
Tái s dng.
Sa li và ci tiến.
NMLT - Hàm (Function)
VC
VC
&
&
BB
BB
88
Hàm
pháp
Trong đó
<kiu tr v> : kiu bt k ca C (char, int, long,
float,…). Nếu không tr v thì void.
<tên hàm>: theo quy tc đặt tên định danh.
<danh sách tham s> :
tham s hình thc đầu vào
ging khai báo biến, cách nhau bng du ,
<giá tr> : tr v cho hàm qua lnh return.
NMLT - Hàm (Function)
<kiu tr v> <tên hàm>([danh sách tham s])
{
<các câu lnh>
[return <giá tr>;]
}
VC
VC
&
&
BB
BB
99
Các bước viết hàm
Cn xác định các thông tin sau đây:
Tên hàm.
Hàm s thc hin công vic gì.
Các đầu vào (nếu có).
Đầu ra (nếu có).
NMLT - Hàm (Function)
Tên hàm
Tên hàm
Đầu vào 1
Đầu vào 2
Đầu vào n
Đầu ra (nếu có)
Các công vic
s thc hin
VC
VC
&
&
BB
BB
1010
Hàm
d 1
Tên hàm: XuatTong
Công vic: tính và xut tng 2 s nguyên
Đầu vào: hai s nguyên x và y
Đầu ra: không có
NMLT - Hàm (Function)
void XuatTong(int x, int y)
{
int s;
s = x + y;
printf(“%d cong %d bang %d”, x, y, s);
}
VC
VC
&
&
BB
BB
1111
Hàm
d 2
Tên hàm: TinhTong
Công vic: tính và tr v tng 2 s nguyên
Đầu vào: hai s nguyên x và y
Đầu ra: mt s nguyên có giá tr x + y
NMLT - Hàm (Function)
int TinhTong(int x, int y)
{
int s;
s = x + y;
return s;
}
VC
VC
&
&
BB
BB
1212
Chương trình con - Function
d 3
Tên hàm: NhapXuatTong
Công vic: nhp và xut tng 2 s nguyên
Đầu vào: không có
Đầu ra: không có
NMLT - Hàm (Function)
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);
}
VC
VC
&
&
BB
BB
1313
Tm vc
Khái nim
phm vi hiu qu ca biến và hàm.
Biến:
Toàn cc: khai báo trong ngoài tt c các hàm (k
c hàm main) và tác dng lên toàn b chương
trình.
Cc b: khai báo trong hàm hoc khi { } và ch
tác dng trong bn thân hàm hoc khi đó (k c
khi con nó). Biến cc b s b xóa khi b nh khi
kết thúc khi khai báo nó.
NMLT - Hàm (Function)
VC
VC
&
&
BB
BB
1414
Tm vc
NMLT - Hàm (Function)
int a;
int Ham1()
{
int a1;
}
int Ham2()
{
int a2;
{
int a21;
}
}
void main()
{
int a3;
}
VC
VC
&
&
BB
BB
1515
Mt s lưu ý
Thông thường người ta thường đặt phn tiêu đề
hàm/nguyên mu hàm (
prototype) trên hàm
main và phn định nghĩa hàm dưới hàm main.
NMLT - Hàm (Function)
void XuatTong(int x, int y); // prototype
void main()
{
}
void XuatTong(int x, int y)
{
printf(“%d cong %d bang %d”, x, y, x + y);
}
VC
VC
&
&
BB
BB
1616
Các cách truyn đối s
Truyn Giá tr (Call by Value)
Truyn đối s cho hàm dng giá tr.
th truyn hng, biến, biu thc nhưng
hàm ch s nhn giá tr.
Được s dng khi không có nhu cu thay đổi
giá tr ca tham s
sau khi thc hin hàm.
NMLT - Hàm (Function)
void TruyenGiaTri(int x)
{
x++;
}
VC
VC
&
&
BB
BB
1717
Các cách truyn đối s
Truyn Địa ch (Call by Address)
Truyn đối s cho hàm dng địa ch (con
tr).
Không được truyn giá tr cho tham s này.
Được s dng khi có nhu cu thay đổi giá tr
ca tham s
sau khi thc hin hàm.
NMLT - Hàm (Function)
void TruyenDiaChi(int *x)
{
*x++;
}
VC
VC
&
&
BB
BB
1818
Các cách truyn đối s
Truyn Tham chiếu (Call by Reference) (C++)
Truyn đối s cho hàm dng địa ch (con
tr). Được bt đầu bng
& trong khai báo.
Không được truyn giá tr cho tham s này.
Được s dng khi nhu cu thay đổi giá tr
ca tham s
sau khi thc hin hàm.
NMLT - Hàm (Function)
void TruyenThamChieu(int &x)
{
x++;
}
VC
VC
&
&
BB
BB
1919
Lưu ý khi truyn đối s
Lưu ý
Trong mt hàm, các tham s th truyn
theo nhiu cách.
NMLT - Hàm (Function)
void HonHop(int x, int &y)
{
x++;
y++;
}
VC
VC
&
&
BB
BB
2020
Lưu ý khi truyn đối s
Lưu ý
S dng tham chiếu là mt cách để tr v giá
tr cho chương trình
.
NMLT - Hàm (Function)
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;
}
VC
VC
&
&
BB
BB
2121
Li gi hàm
Cách thc hin
Gi tên ca hàm đồng thi truyn các đối s
(hng, biến, biu thc) cho các tham s theo
đúng th tựđã được khai báo trong hàm.
Các biến hoc tr này cách nhau bng du ,
Các đối s này được được đặt trong cp du
ngoc đơn
( )
<tên hàm> (<đối s 1>, , <đối s n>);
NMLT - Hàm (Function)
VC
VC
&
&
BB
BB
2222
Li gi hàm
d
NMLT - Hàm (Function)
VC
VC
&
&
BB
BB
2323
Li gi chương trình con
d
NMLT - Hàm (Function)
VC
VC
&
&
BB
BB
2424
Đệ quy
Khái nim
Mt chương trình con có th gi mt chương
trình con khác.
Nếu gi chính nó thì được gi là sựđquy.
S ln gi này phi có gii hn (đim dng)
d
Tính S(n) = n! = 1*2*…*(n-1)*n
Ta thy S(n) = S(n-1)*n
Vy 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
NMLT - Hàm (Function)
VC
VC
&
&
BB
BB
2525
Đệ quy
d
NMLT - Hàm (Function)
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;
}
VC
VC
&
&
BB
BB
2626
Bài tp thc hành
5. Bài 4, 5, 6, 7, 8 trang 140-141 chương 8 (Câu
lnh điu kin và r nhánh)
a. Viết hàm đổi mt ký t hoa sang ký t thường.
b. Viết th tc gii phương trình bc nht.
c. Viết th tc gii phương trình bc hai.
d. Viết hàm tr v giá tr nh nht ca 4 s
nguyên.
e. Viết th tc hoán v hai s nguyên.
f. Viết th tc sp xếp 4 s
nguyên tăng dn.
NMLT - Hàm (Function)
VC
VC
&
&
BB
BB
2727
Bài tp thc hành
6. Bài tp 3 trang 155 chương 9 (Câu lnh lp). Hàm
nhn vào mt s nguyên dương n và thc hin:
a. Tr v sốđo ca sốđó.
b. phi là sốđi xng (Tr v True/False)
c. phi là s chính phương.
d. phi là s nguyên t.
e. Tng các ch s l.
f. Tng các ch s nguyên t.
g. Tng các ch s chính phương.
NMLT - Hàm (Function)
VC
VC
&
&
BB
BB
2828
Bài tp thc hành
7. Bài tp 4 trang 156 chương 9 (Câu lnh lp). Hàm
nhn vào mt s nguyên dương n và thc hin:
a. S = 1 + 2 + … + n
b. S = 1
2
+ 2
2
+ … + n
2
c. S = 1 + 1/2 + … + 1/n
d. S = 1 * 2 * … * n
e. S = 1! + 2! + … + n!
8. Hàm tr v USCLN ca 2 s nguyên.
9. In ra n phn t ca dãy Fibonacy.
NMLT - Hàm (Function)
| 1/7

Preview text:

Trường Đại học Khoa học Tự nhiên & & Khoa Công nghệ thông tin V V C C Nội dung Bộ môn Tin học cơ sở B B B B
NHẬP MÔN LẬP TRÌNH Đặng Bình Phương dbphuong@fit.hcmuns.edu.vn 1
Khái niệm và cú pháp HÀM ( FUNCTI ON) 2 Tầm vực 3
Tham số và lời gọi hàm 4 Đệ quy 1 2 NMLT - Hàm (Function) & & & & V V C C Đặt vấn đề V V C C Đặt vấn đề B B B B B B B B
Viết chương trình tính S = a! + b! + c! với a, b, c
3 đoạn lệnh nhập a, b, c > 0
là 3 số nguyên dương nhập từ bàn phím. do {
printf(“Nhap mot so nguyen duong: ”); Chươ h ng n g t r t ì r n ì h n
scanf(“%d”, &a); chính } while (a <= 0); do { Nhập ậ Tí T n í h n Xu X ất ấ
printf(“Nhap mot so nguyen duong: ”); a, a , b , b , c c > > 0 S S = = a ! a ! + + b ! b ! + + c ! c kết ế tq u q ả u S
scanf(“%d”, &b); } while (b <= 0); do { Nhập ậ Nhập ậ Nhập ậ Tí T n í h n Tí T n í h n Tí T n í h n
printf(“Nhap mot so nguyen duong: ”); a a > > 0 b b > > 0 c c > > 0 s1 s = 1 a = ! a s2 s = 2 b = ! b s3 s = 3 c = ! c
scanf(“%d”, &c); } while (c <= 0); 3 4 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C Đặt vấn đề V V C C Đặt vấn đề B B B B B B B B
3 đoạn lệnh tính s1 = a!, s2 = b!, s3 = c!
Giải pháp => Viết 1 lần và sử dụng nhiều lần
{ Tính s1 = a! = 1 * 2 * … * a }
Đoạn lệnh nhập tổng quát, với n = a, b, c s1 = 1;
for (i = 2; i <= a ; i++)
do { s1 = s1 * i;
printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &n);
{ Tính s2 = b! = 1 * 2 * … * b } } while (n <= 0); s2 = 1;
for (i = 2; i <= b ; i++)
Đoạn lệnh tính giai thừa tổng quát, n = a, b, c s2 = s2 * i;
{ Tính s = n! = 1 * 2 * … * n }
{ Tính s3 = c! = 1 * 2 * … * c } s = 1; s3 = 1;
for (i = 2; i <= n ; i++)
for (i = 2; i <= c ; i++) s = s * i; s3 = s3 * i; 5 6 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C Hàm V V C C Hàm B B B B B B B B Khái niệm Cú pháp
Một đoạn chương trình có tên, đầu vào và
([danh sách tham số]) đầ { u ra.
Có chức năng giải quyết một số vấn đề [return ;] }
chuyên biệt cho chương trình chính. Trong đó
Được gọi nhiều lần với các tham số khác
• : kiểu bất kỳ của C (char, int, long, nhau.
float,…). Nếu không trả về thì là void.
Được sử dụng khi có nhu cầu:
• : theo quy tắc đặt tên định danh. • Tái sử dụng.
• : tham số hình thức đầu vào
• Sửa lỗi và cải tiến.
giống khai báo biến, cách nhau bằng dấu ,
• : trả về cho hàm qua lệnh return. 7 8 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C Các bước viết hàm V V C C Hàm B B B B B B B B
Cần xác định các thông tin sau đây: Ví dụ 1 Tên hàm. Tên hàm: XuatTong
Hàm sẽ thực hiện công việc gì.
Công việc: tính và xuất tổng 2 số nguyên Các đầu vào (nếu có).
Đầu vào: hai số nguyên x và y Đầu ra (nếu có). Đầu ra: không có
void XuatTong(int x, int y) Đầu vào 1 { Tê T n ê n h à h m à Đầ int s; u vào 2 Đầu ra (nếu có) s = x + y; Đầ Các công việc u vào n
printf(“%d cong %d bang %d”, x, y, s); sẽ thực hiện } 9 10 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C Hàm V V C C Chương trình con - Function B B B B B B B B Ví dụ 2 Ví dụ 3 Tên hàm: TinhTong Tên hàm: NhapXuatTong
Công việc: tính và trả về tổng 2 số nguyên
Công việc: nhập và xuất tổng 2 số nguyên
Đầu vào: hai số nguyên x và y Đầu vào: không có
Đầu ra: một số nguyên có giá trị x + y Đầu ra: không có
int TinhTong(int x, int y) void NhapXuatTong() { { int s; int x, y; s = x + y;
printf(“Nhap 2 so nguyen: ”); return s;
scanf(“%d%d”, &x, &y); }
printf(“%d cong %d bang %d”, x, y, x + y); } 11 12 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C Tầm vực V V C C Tầm vực B B B B B B B B int a; Khái niệm int Ham1() {
Là phạm vi hiệu quả của biến và hàm. int a1; } Biến:
• Toàn cục: khai báo trong ngoài tất cả các hàm (kể int Ham2() {
cả hàm main) và có tác dụng lên toàn bộ chương int a2; trình. { int a21;
• 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 void main()
kết thúc khối khai báo nó. { int a3; } 13 14 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C Một số lưu ý V V C C
Các cách truyền đối số B B B B B B B B
Thông thường người ta thường đặt phần tiêu đề
Truyền Giá trị (Call by Value)
hàm/nguyên mẫu hàm (prototype) trên hàm
Truyền đối số cho hàm ở dạng giá trị.
main và phần định nghĩa hàm dưới hàm main.
Có thể truyền hằng, biến, biểu thức nhưng
void XuatTong(int x, int y); // prototype
hàm chỉ sẽ nhận giá trị. void main()
Đượ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) {
void XuatTong(int x, int y) { x++;
printf(“%d cong %d bang %d”, x, y, x + y); } } 15 16 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C
Các cách truyền đối số V V C C
Các cách truyền đối số B B B B B B B B
Truyền Địa chỉ (Call by Address)
Truyền Tham chiếu (Call by Reference) (C++)
Truyền đối số cho hàm ở dạng địa chỉ (con
Truyền đối số cho hàm ở dạng địa chỉ (con trỏ).
trỏ). Được bắt đầu bằng & trong khai báo.
Không được truyền giá trị cho tham số này.
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 sử dụng khi có nhu cầu thay đổi giá trị
của tham số sau khi thực hiện hàm.
của tham số sau khi thực hiện hàm.
void TruyenDiaChi(int *x)
void TruyenThamChieu(int &x) { { *x++; x++; } } 17 18 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C
Lưu ý khi truyền đối số V V C C
Lưu ý khi truyền đối số B B B B B B B B Lưu ý Lưu ý
Trong một hàm, các tham số có thể truyền
Sử dụng tham chiếu là một cách để trả về giá theo nhiều cách. trị cho chương trình.
void HonHop(int x, int &y)
int TinhTong(int x, int y) { { return x + y; 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; 19 20 NMLT - Hàm (Function) NMLT - Hàm (Function) } & & & & V V C C Lời gọi hàm V V C C Lời gọi hàm B B B B B B B B Cách thực hiện Ví dụ
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 ( )
(<đối số 1>,… , <đối số n>); 21 22 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C
Lời gọi chương trình con V V C C Đệ quy B B B B B B B B Ví dụ 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 23 24 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C Đệ quy V V C C Bài tập thực hành B B B B B B B B Ví dụ
5. Bài 4, 5, 6, 7, 8 trang 140-141 chương 8 (Câu int GiaiThua(int n)
lệnh điều kiện và rẽ nhánh) { if (n == 0)
a. Viết hàm đổi một ký tự hoa sang ký tự thường. return 1;
b. Viết thủ tục giải phương trình bậc nhất. else
return GiaiThua(n – 1) * n;
c. Viết thủ tục giải phương trình bậc hai. } int GiaiThua(int n)
d. Viết hàm trả về giá trị nhỏ nhất của 4 số { nguyên. if (n > 0)
return GiaiThua(n – 1) * n;
e. Viết thủ tục hoán vị hai số nguyên. else
f. Viết thủ tục sắp xếp 4 số nguyên tăng dần. return 1; } 25 26 NMLT - Hàm (Function) NMLT - Hàm (Function) & & & & V V C C Bài tập thực hành V V C C Bài tập thực hành B B B B B B B B
6. Bài tập 3 trang 155 chương 9 (Câu lệnh lặp). Hàm
7. Bài tập 4 trang 156 chương 9 (Câu lệnh lặp). Hàm
nhận vào một số nguyên dương n và thực hiện:
nhận vào một số nguyên dương n và thực hiện:
a. Trả về số đảo của số đó. a. S = 1 + 2 + … + n
b. Có phải là số đối xứng (Trả về True/False) b. S = 12 + 22 + … + n2
c. Có phải là số chính phương. c. S = 1 + 1/2 + … + 1/n
d. Có phải là số nguyên tố. d. S = 1 * 2 * … * n
e. Tổng các chữ số lẻ. e. S = 1! + 2! + … + n!
f. Tổng các chữ số nguyên tố.
8. Hàm trả về USCLN của 2 số nguyên.
g. Tổng các chữ số chính phương.
9. In ra n phần tử của dãy Fibonacy. 27 28 NMLT - Hàm (Function) NMLT - Hàm (Function)