Bài giảng Tin học đại cương - Hàm
60. Viết hàm tính n!
61. Viết hàm tính tổng S = 1+2+ .+n.
62. Viết hàm tìm số lớn nhất trong 2 số nguyên
63. Viết hàm trả về giá trị nhỏ nhất của 4 số nguyên.
64. Viết hàm giải phương trình bậc nhất.
53 trang |
Chia sẻ: maiphuongtl | Lượt xem: 2443 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Bài giảng Tin học đại cương - Hàm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nội dung
Khái niệm hàm1
Cách xây dựng hàm2
Cách thức gọi hàm3
Nguyên tắc hoạt động hàm4
Đệ quy5
Đặ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
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!
Đặt vấn đề
3 đoạn lệnh nhập a, b, c > 0
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);
Đặt vấn đề
3 đoạn lệnh tính s1 = a!, s2 = b!, s3 = c!
{ 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;
Đặ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
Đoạn lệnh tính giai thừa tổng quát, n = a, b, c
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;
Khái niệ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 đề
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.
Tên hàm ([
][,][…])
{
[Khai báo biến cục bộ và các câu lệnh thực hiện
hàm]
[return [];]
}
Cú pháp
Khái niệm Hàm
Kiểu dữ liệu của hàm: Là kiểu dữ liệu của kết
quả trả về, có thể là: int, byte, char, float, void…
Tham số: là dữ liệu đầu vào của hàm.
Kiểu tham số: Là kiểu dữ liệu của tham số.
Sử dụng câu lệnh return để trả về kết quả cho
hàm (nếu hàm có trả về giá trị)
Khái niệm Hàm
Cách xây dựng mộ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ó).
Thuật toán
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 việc
sẽ thực hiện
Ví dụ 1: Viết hàm tính tổng 2 số nguyên a,b
Tên hàm: TinhTong
Công việc: tính tổng 2 số nguyên
Đầu vào: hai số nguyên a và b
Đầu ra: tổng của 2 số (int)
Thuật toán:
• Tổng=a+b
Cách xây dựng một hàm
Ví dụ 1: Viết hàm tính tổng 2 số nguyên a,b
int TinhTong(int a, int b)
{
int kq;
kq= a+b;
return kq;
}
Tên hàm
Danh sách tham số hình
thức
Trả về kết quả cho hàm
Kiểu của kết quả trả về
Cách xây dựng một hàm
Ví dụ 2. Viết hàm tìm giá trị lớn nhất của 2 số
nguyên a,b
Tên hàm: TimGTLN
Công việc: tìm giá trị lớn nhất của 2 số nguyên a,b
Đầu vào: hai số nguyên a và b
Đầu ra: giá trị lớn nhất của 2 số a,b (kiểu trả về:
int)
Cách xây dựng một hàm
int TimGTLN(int a,int b)
{
int max;
if(a>=b) max=a;
else max=b;
return max;
}
Cách xây dựng một hàm
Thuật toán:
Nếu a> b thì max là a, ngược lại thì max là b.
Ví dụ 3. Viết hàm xuất n chữ hello
Tên hàm: Xuatloichao
Công việc: Xuất n chữ Hello
Đầu vào: số nguyên dương n (int)
Đầu ra: Không có giá trị trả về ( kiểu dữ liệu
của hàm là void)
Cách xây dựng một hàm
Thuật toán
Dùng vòng lặp for để xuất n câu Hello
void Xuatloichao(int n)
{
for(int i=1;i<=n;i++)
printf("Hello\n");
}
Cách xây dựng một hàm
Cách thức gọi hàm
Gọi tên của hàm đồng thời truyền các tham số
thực (hằng, biến, biểu thức) cho các tham số
hình thức 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 tham số này được được đặt trong cặp dấu
ngoặc đơn ( )
(,… , )
Cú pháp
Ví dụ 4: Định nghĩa hàm tính hiệu 2 số nguyên
int Tinhhieu (int a, int b)
{
return a-b;
}
Khi có nhu cầu tính hiệu 2 số nguyên m,n (m-n)
thì gọi hàm như sau:
int kq= Tinhhieu(m,n);
a,b là tham số hình thức
m,n là tham số thực
Cách thức gọi hàm
- Kiểu dữ liệu của các tham số thực phải cùng
kiểu với các tham số hình thức.
- Số lượng và thứ tự của các tham số thực
phải giống như của các tham số hình thức.
Cách thức gọi hàm
int Tinhhieu (int a, int b)
{
return a-b;
}
int kq= Tinhhieu(n,m);
Để tính hiệu n-m. Gọi hàm Tinhhieu:
Ví dụ 5: Ta có định nghĩa hàm tính lũy thừa xy
long luythua(int x, int y)
{
long kq=1;
for(int i = 1; i <= y; i++)
kq=kq*x;
return kq;
}
Cần tính tổng: ab + ba (với a,b là số nguyên)
long kq= luythua(a,b)+luythua(b,a);
Cách thức gọi hàm
Ví dụ 6: Định nghĩa hàm xuất n dòng chữ Hello
void Xuat_Hello(int n)
{
for (int i=1;i<=n;i++)
printf("Hello\n");
}
Cần xuất 100 dòng chữ hello
Xuat_Hello(100);
Cách thức gọi hàm
− Các tham số sẽ được gán giá trị thực tương
ứng (TH. Hàm có tham số)
− Thực hiện các câu lệnh trong thân hàm
− Khi gặp lệnh return hoặc dấu } cuối cùng trong
thân hàm thoát khỏi hàm để trở về chương
trình gọi nó và thực hiện tiếp tục những câu lệnh
của chương trình này.
Nguyên tắc hoạt động của hàm
Nguyên tắc hoạt động của hàm
//Phần định nghĩa hàm
void Xuat_loichao()
{
printf("\nXin chao\n");
}
void Xuat_sao()
{
printf("****************");
}
Nguyên tắc hoạt động của hàm
#include "stdio.h"
#include "conio.h"
void Xuat_loichao();
void Xuat_sao();
void main()
{
int n;
Xuat_sao();
Xuat_loichao();
Xuat_sao();
}
Các cách truyền tham số
Truyền tham số bằng
tham trị
Truyền tham số bằng
tham biến
−Đượ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.
Ví dụ
−Hàm tính diện tích hình chữ
nhật (chiều dài, chiều rộng là
tham số)
−Hàm tính tổng 2 số nguyên
a,b (với a,b là tham số)
−Hàm tính tiền lương (với
ngày công,đơn giá là tham
số)
− Đượ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.
Ví dụ
−Hàm hoán vị 2 số a,b (với a,b
là tham số)
−Hàm nhập số nguyên dương
n (với n là tham số)
Truyền tham số bằng tham 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.
− 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ị.
Ví dụ 7
float DT_HCN(float a,float b)
{
return a*b;
}
Các cách truyền tham số
Truyền tham số bằng tham biến
− Đượ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.
−Truyền đối số cho hàm ở dạng địa chỉ. Được bắt
đầu bằng & trong khai báo.
− Không được truyền giá trị cho tham số này.
Ví dụ 8
void HoanVi (int &a,int &b)
{
int tam;
tam=a;a=b ;b=tam;
}
Các cách truyền tham số
Các cách truyền tham số
Ví dụ 9
void Thamtri(int x, int y)
{
x++;
y++;
}
void main()
{
int a=5, b=5;
Thamtri(a,b);
printf("a=%d,b=%d",a,b);
}
Các cách truyền tham số
void Thambien(int &x, int &y)
{
x++;
y++;
}
void main()
{
int a=5,b=5;
Thambien(a,b);
printf("a=%d,b=%d",a,b);
}
Ví dụ 10
Lưu ý
Các cách truyền tham số
void Hoanvi(int &a,int &b);
void main()
{
Hoanvi(2,3);
int x=2,y=3;
Hoanvi(x,y);
}
void Hoanvi(int &a,int &b)
{
int tam=a;
a=b;
b=tam;
}
Nguyên mẫu (Prototype) của hàm
Nguyên mẫu của hàm là dòng khai báo cho chương
trình dịch biết các thông tin về hàm bao gồm: tên
hàm, kiểu hàm và kiểu các tham số (đầu vào) của
hàm.
Cú pháp
([ ][,][…]);
Nguyên mẫu (Prototype) của hàm
Ví dụ 11
Khai báo prototype của hàm TimMax, có hai
tham số kiểu int, kết quả trả về kiểu int
int TimMax(int , int );
hoặc viết:
int TimMax(int a, int b);
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.
#include "stdio.h"
void XuatTong(int x, int y); // prototype
void main()
{
int a,b;
a=2;b=4;
XuatTong(a,b);
}
// Định nghĩa hàm
void XuatTong(int x, int y)
{
printf(“%d cong %d bang %d”, x, y, x + y);
}
Nguyên mẫu (Prototype) của hàm
Phạm vi của biến
− Biến toàn cục (global): là biến 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
− Biến cục bộ (Local): Là biến khai báo bên
trong một hàm. Biến này chỉ tồn tại khi hàm đang
được thực thi. Vùng nhớ của biến cục bộ sẽ bị
thu hồi khi hàm thực hiện xong
Ví dụ 12. Cho sơ đồ khai báo biến như sau:
a: biến toàn cục
a1,a2,a3,a21:biến cục bộ
Phạm vi của biến
// khai bao prototype
void TTT();
void MMM();
int a=8;
void main()
{
TTT();
printf("Gia tri a la:%d",a);
MMM();
printf("\nGia tri a la:%d",a);
}
void TTT()
{
int a=5;
a--;
}
void MMM()
{
a--;
}
Ví dụ 13
Biến cục bộ
Phạm vi của biến
Biến toàn cục
−Một thuật toán được gọi là đệ quy nếu nó giải
bài toán bằng cách rút gọn liên tiếp bài toán ban
đầu tới bài toán giống như vậy nhưng có dữ liệu
đầu vào nhỏ hơn.
−Một hàm được gọi là có tính đệ qui nếu trong
thân của hàm đó có lệnh gọi lại chính nó một các
tường minh hay tiềm ẩn.
Đệ Quy
Một thuật toán đệ quy gồm hai phần
+ Phần dừng: là phần khởi đầu tính toán hoặc
điểm kết thúc của thuật toán, không chứa
phần đang được định nghĩa.
+ Phần đệ qui: là phần có chứa khái niệm
đang được định nghĩa.
Đệ Quy
Đệ Quy
Ví dụ 14. Tính 4! như sau:
1! = 1
n! = n*(n-1) !
Ví dụ 15: Tính n!
Điều kiện dừng: n=1
Gọi đệ qui: Giaithua=n*Giaithua(n-1)
float giai_thua(int n)
{
if (n==0)
return 1;
return n*giai_thua(n -1);
}
Đệ Quy
CÂU HỎI TRẮC NGHIỆM
Câu 33. Cho biết kết quả xuất trên màn hình
int Tinh (int x, int y)
{
int kq = 1;
for (int i=x;i<y;i++)
kq =kq * i;
return kq;
}
void main()
{
int a = 2 ;
int b = 4;
int kq=1;
kq = Tinh(a,b);
printf("%d",kq);
}
a. 1 b. 6 c. 14 d. 15
Câu 34. Cho biết kết quả xuất trên màn hình
void ham (int a, int b, int kq)
{
kq = a - b;
}
void main()
{
int a = 2 ;
int b = 1000;
int kq =1;
ham(a, b, kq);
printf("%d",kq);
}
a. 13 b.1 c. 42 d.14
CÂU HỎI TRẮC NGHIỆM…
CÂU HỎI TRẮC NGHIỆM…
Câu 35. Cho biết kết quả xuất trên màn hình:
int TTT (int &a, int b)
{
int kq =0;
a--;
for (int i=1; i <= b; i++)
kq = kq*a;
return kq;
}
void main()
{
int a = 4; int b = 4;
int kq = TTT(a, b);
printf("%d,%d",a,kq);
}
a. 2,3 b. 3,0 c. 5,7 d. 13
CÂU HỎI TRẮC NGHIỆM…
Câu 36. Cho biết kết quả xuất trên màn hình:
int tinhtich (int n)
{ int kq =1;
for (int i=1; i <= n; i++){
kq = kq*i;
if(kq>10) return kq;
} return kq;
}
void main()
{
int a = 5;
int kq = tinhtich(a);
printf("%d”,kq);
}
a. 6 b. 24 c. 124 d. 120
CÂU HỎI TRẮC NGHIỆM…
Câu 37. Cho biết kết quả xuất trên màn hình:
int TT(int n)
{ int s =0;
for (int i=1; i <= n; i++){
for(int j=1;j<=n;j++){
s+=i*j;
if(j==4) break;
} if(i==3) break;
} return s;
}
void main()
{
int n = 5;
int kq = TT(n);
printf("%d”,kq);
}
a. 0 b. 60 c. 14 d. 120
CÂU HỎI TRẮC NGHIỆM…
Câu 38. Cho biết kết quả xuất trên màn hình:
int MM (int n)
{
if((n==0)||(n==1)) return 1;
else return MM(n-2) + 2*MM (n-1);
}
void main()
{
int a = 4;
int kq = MM(a);
printf("%d",kq);
getch();
}
a. 5 b. 10 c. 17 d. 13
CÂU HỎI TRẮC NGHIỆM…
Câu 39. Cho biết kết quả xuất trên màn hình:
void ham(int a,int b, int &kq)
{
kq=--a-b++;
}
void main()
{
int a=2;
int b=10;
int kq=1;
ham(a,b,kq);
printf(“%d”,kq);
}
a. -8 b. -10 c. -9 d. -11
CÂU HỎI TRẮC NGHIỆM…
Câu 40. Cho biết kết quả xuất trên màn hình:
void Tinh(int a,int &b)
{
if(a>0)
b+=5;
}
void main()
{
int a=103;int b=1;
Tinh(a,b);
printf(“%d”,b);
getch();
}
a. 4 b. 6 c. 8 d. 10
CÂU HỎI TRẮC NGHIỆM…
Câu 41. Cho biết kết quả xuất trên màn hình:
int b=10;
void ham(int a,int b, int kq)
{
b=0;
kq=--a+b++;
}
void main()
{
int a=2;int kq=1;
ham(a,b,kq);
printf(“%d”,b);
}
a. 8 b. 10 c. 9 d. 11
CÂU HỎI TRẮC NGHIỆM…
Câu 42. Cho biết kết quả xuất trên màn hình:
void MMM(int n)
{ int kq=1;
for(int i=1;i<=n;i++){
kq=kq*I;
if(kq<5) continue;
} return kq;
}
void main()
{
int a=4;
int kq=MMM(a);
printf(“%d”,kq);
}
a. 1 b. 6 c. 24 d. 26
CÂU HỎI TRẮC NGHIỆM…
Câu 43. Cho biết kết quả xuất trên màn hình:
int Tinh(int a,int &b)
{ a--;
b+=5;
return a*b;
}
void main()
{
int a=3;int b=1;int kq=1;
kq=Tinh(a,b);
printf(“%d,%d”,b,kq);
}
a. 3, 7 b. 6,12 c. 5,9 d. Thông báo lỗi
BÀI TẬP
60. Viết hàm tính n!
61. Viết hàm tính tổng S = 1+2+….+n.
62. Viết hàm tìm số lớn nhất trong 2 số nguyên
63. Viết hàm trả về giá trị nhỏ nhất của 4 số nguyên.
64. Viết hàm giải phương trình bậc nhất.
Company Logo
Các file đính kèm theo tài liệu này:
- thdc_ham_7375.pdf