1. Dòng đầu tiên của
định nghĩa hàm gọi là gì, nó bao gồm các thông tin thế nào?
2. Hàm có thể trả về
bao nhiêu giá trị?
3. Nếu một hàm
không trả về giá trị, kiểu gì có thể dùng để khai báo hàm?
4. Sự khác nhau giữa
định nghĩa hàm và nguyên mẫu hàm?
5. Biến địa phương
là gì? điểm đặc biệt của nó?
6. Hàm main() nên đặt
ở đâu?
7. Viết một tiêu đề
hàm có tên là do_it() có 3 đối số kiểu char và trả về kiểu float.
8. Viết
một tiêu đề hàm có tên là print_a_number() có 1 đối số kiểu int và không trả về
điều gì.
9. Tìm điểm sai
trong đoạn mã sau và sửa lại cho đúng:
#include <stdio.h>
void print_msg( void );
main()
{
print_msg("This
is a message to print"); return 0;
}
void print_msg(void)
{
puts("This is a message to
print"); return 0;
}
10. Tìm điểm
sai trong định nghĩa hàm sau đây:
int twice(int y);
{
return (2 * y);
}
11. Xem chương trình
sau đây:
#include <stdio.h>
int x, y, z;
int larger_of(int, int);
main()
{
puts("Enter two different
integer values: ");
scanf("%d%d", &x, &y);
z = larger_of(x, y);
printf("\nThe
larger value is %d.", z); return 0;
}
int larger_of(int a, int b)
{
if (a > b) return a; else return b;
}
Hãy viết lại hàm larger_of() trong chương trình này
mà chỉ dùng một câu lệnh return duy nhất.
12. Viết một hàm nhận
hai đối số kiểu int và trả về giá trị tích của chúng.
13. Viết
một hàm nhận hai đối số kiểu int, hàm trả về giá trị là thương của phép chia đối
thứ nhất cho đối thứ hai nếu đối thứ hai khác không.
14. Viết
chương trình có dùng hàm tìm trung bình của 5 số thực được nhập vào từ bàn
phím.
15. Viết chương
trình có dùng một hàm đệ quy để tính lũy thừa của 3
TRẢ LỜI:
1. Dòng
đầu tiên của định nghĩa hàm là dòng tiêu đề hàm, nó chứa tên hàm, kiểu trả về của
hàm và danh sách tham số của hàm
2. Một hàm có thể
trả về hoặc một giá trị hoặc không trả về giá trị nào.
3. Hàm không trả về
gì cả nên khai báo void.
4. Một
định nghĩa hàm là một hàm hoàn chỉnh, bao gồm tiêu đề và các câu lệnh của hàm.
Định nghĩa hàm xác định nhiệm vụ của hàm khi hàm xử lý. Nguyên mẫu hàm là một
dòng đơn, đồng nhất với dòng tiêu đề nhưng kết thúc bằng dấu chấm phẩy. Nguyên
mẫu báo cho chương trình dịch tên hàm, kiểu trả về và danh sách tham số.
5. Biến
địa phương được khai báo bên trong hàm và độc lập với các biến khác trong
chương trình.
6. Hàm main() nên
là hàm đầu tiên trong danh sách các hàm của chương trình
7. float do_it(char
a, char b, char c)
8. void
print_a_number( int a_number )
9. Có hai lỗi:
- Hàm print_msg()
được khai báo void nhưng nó trả về giá trị.
- Lời gọi hàm
print_msg() có truyền tham số.
Chương trình nên sửa lại như sau:
10. Không có dấu chấm
phẩy cuối tiêu đề hàm.
11. Hàm larger_of được
sửa lại như sau:
#include <stdio.h>
void print_msg(void);
main()
{
print_msg(); return 0;
}
void print_msg(void)
{
puts("This is a message to
print");
}
12.
int product(int x, int y)
{
return (x * y);
}
13.
int divide_em(int a, int b)
{
int answer = 0; if (b == 0) answer = 0; else
answer = a / b; return answer;
}
14.
#include <stdio.h>
float v, w, x, y, z, answer;
float
average(float
a, float
b, float c,
float
d, float e;
main()
{
puts("Enter five
numbers:");
scanf("%f%f%f%f%f", &v, &w, &x, &y,
&z);
answer = average(v, w, x, y, z);
printf("The
average is %f.\n", answer);
return 0;
}
float average(float a, float b, float c, float d, float e)
{
return ((a + b + c + d + e) / 5);
}
15.
#include <stdio.h>
int three_powered(int power);
main()
{
int a = 4;
int b = 9;
printf("\n3
to the power of %d is %d",
a,three_powered(a));
printf("\n3
to the power of %d is %d\n", b,three_powered(b));
return 0;
}
int three_powered(int power)
{
if (power < 1)
return(1);
else
return(3 * three_powered(power - 1));
}
BÀI TẬP
Bài 1. Viết chương
trình có dùng hàm tìm số lớn nhất trong 3 số thực.
# include <stdio.h>
# include <conio.h>
float max3s(float, float, float);
//khai bao prototype
void main()
{
float x, y, z; int s;
printf("\n
Nhap 3 so tuy y : "; scanf("%f%f%f", &x, &y, &z);
printf("\nSo
lon nhat la :%f", max3s(x, y, z)); getch();
}
float max3s(float a, float b, float c)
{
float max; max = a > b ? a : b;
return (max > c ? max : c);
}
Bài 2. Viết chương
trình có dùng hàm kiểm tra năm nhuận.
#include <iostream>
#include <conio.h>
using namespace std;
int isLeapYear(int y)
{
return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
}
void main()
{
int n; do
{
cin >> n;
if (isLeapYear(n)) cout << n <<
" la nam
nhuan.\n"; else cout << n << " Khong phai nam nhuan.\n";
} while (n > 1);
}
Bài 3. Viết chương
trình có dùng hàm kiểm tra số nguyên tố.
#include <iostream.h>
#include <conio.h>
#include <math.h>
using namespace std;
int isPrime(int p)
{
float sqrtp = sqrt(p); if (p < 2) return 0;
if (p == 2) return 1; //2 la so nguyen to dau tien
if (p % 2 == 0) return 0; // 2 la so nguyen to chan duy
nhat
for (int d = 3; d <= sqrtp; d +=
2) if (p % d == 0) return 0;
return 1;
}
void main()
{
int n;
cout << "\n Nhap n = "; cin >> n;
for (int i = 1; i < n; i++)
if (isPrime(i)) cout << i << ' '; cout << endl;
getch();
}
Bài 3. Viết
chương trình có dùng hàm tìm số hạng thứ N của dãy số Fibonasi
được định nghĩa như sau:
f0
= f1 = 1, fn+1 = fn
+ fn-1 (n = 1,2,...)
#include <stdio.h>
#include <conio.h>
int fibo(int n)
{
int f0 = 1, f1 = 1, f2; for (int i = 2; i <= n; i++)
{
f2 = f1 + f0;
f0 = f1;
f1 = f2;
}
return f2;
}
void main()
{
int n;
printf("\nNhap
gia tri N : "); scanf("%d", &n);
printf("%d", fibo(n)); getch();
}
Bài 5. Sửa lại chương
trình ở bài 3 nhưng dùng hàm đệ quy.
#include <stdio.h> #include <conio.h>
int fibo(int n)
{
if ((n == 0) || (n == 1)) return 1;
else
return fibo(n - 1) + fibo(n - 2);
}
void main()
{
int n;
printf("\nNhap
gia tri N : "); scanf("%d", &n);
printf("%d", fibo(n));
}
Bài 6. Viết
chương trình có dùng hàm đệ quy và không đệ quy để
tính giai thừa của số nguyên n không âm.
#include <stdio.h>
#include <conio.h>
long GiaiThua(int n)
{
long s = 1, i;
if (n == 1 || n == 0) return(1);
else
{
for (i = 1; i <= n; ++i) s *= i; return(s);
}
}
long GTDequy(int n)
{
if (n == 1 || n == 0) return(1); else return(n*GTDequy(n - 1));
}
void main()
{
int n;
tt: printf("\n Cho mot so nho hon 16 n="); scanf("%d", &n);
printf("\n
Giai thua cua %d la :%20ld\n", n, GiaiThua(n)); printf("\n Giai thua de quy cua%d:%20ld\n", n, GTDequy(n)); printf(" Tiep tuc hoac stop (go 1 hoac
0):"); scanf("%d", &n);
printf("\n");
if (n == 1) goto tt;
getch();
}
Bài 7. Viết
chương trình có dùng hàm để giải phương trình bậc hai: ax2
+ bx +c = 0 (a khác 0)
#include <stdio.h>
#include <conio.h>
#include <math.h>
int ptb2(float a, float b, float c, float *x1, float *x2)
{
float delta; delta = b*b - 4 * a*c; if (delta < 0)
return -1; else
if (delta == 0.0) {
*x1 = -b / (2 * a);
return 0;
}
else
{
*x1 = (-b - sqrt(delta)) / (2 * a);
*x2 = (-b + sqrt(delta)) / (2 * a); return 1;
}
}
void main()
{
float a, b, c, x1, x2; int k;
printf("\nGiai
phuong trinh bac hai"); do
{
printf("\nNhap he so a = "); scanf("%f", &a);
} while (a == 0);
printf("\nNhap
he so b = ");
scanf("%f", &b);
printf("\nNhap
he so c = ");
scanf("%f", &c);
k = ptb2(a, b, c, &x1, &x2);
if (k == -1)
printf("\n Phuong trinh vo nghiem"); else
if (k == 0)
printf("\n Phuong trinh co nghiem kep x = %6.2f", x1); else
printf("\n
Phuong trinh co 2 nghiem phan biet %6.2f %6.2f ", x1, x2);
getch();
}
Bài
8. Viết
chương trình có dùng hàm để tính số π theo công thức sau:
#include <conio.h>
#include <stdio.h>
#include <math.h>
float pi()
{
float tong = 4.0, ps = 1.0; long i = 1, dau = -1;
do
{
ps = 4.0 / (2 * i + 1); tong = tong + dau*ps;
dau = -dau; i += 1;
} while (ps > 1E-6); return tong;
}
void main()
{
printf("\n
pi = %f ", pi()); getch();
}
Bài 9. Viết chương
trình có dùng hàm để tính căn bậc hai của một số không âm.
#include <stdio.h>
#include <conio.h>
#include <math.h>
double canhai(double a)
{
double c, xn; if (a == 0)
return 0.0; xn = a;
do
{
c = xn;
xn = (xn*xn + a) / (2 * xn);
} while (fabs((xn - c) / c) > 1e-5); return xn;
}
void main()
{
double a; int i;
tt:printf("\nNhap vao mot so a= "); scanf("%lf", &a);
if (a < 0)
{
printf("\nKhong the tinh can bac 2 cua so am\n"); printf("\nBam phim bat ky de nhap lai"); getch();
goto tt;
}
printf("\n Can
bac hai cua
a=%8.2f la :
%8.4f",
a, canhai(a));
printf("\n\n Tiep tuc nua khong ?(tiep=1,khong=0)");
scanf("%d", &i);
if (i == 1) goto tt;
}
Bài 10. Viết chương
trình có dùng hàm để tìm số nguyên tố nhỏ hơn
số nguyên N.
#include <stdio.h>
#include <math.h>
#include <conio.h>
int snt(int n)
{
for (int i = 2; i <= sqrt(n); i++) if (n%i == 0)
return 0; return 1;
}
void main()
{
int n, i;
printf("\nNhap
gia tri N : "); scanf("%d", &n);
printf("\nCac
so nguyen to nho hon %d la : \n", n); for (i = 2; i < n; i++)
if (snt(i)) printf("%d ", i);
getch();
}
Bài 11. Viết chương
trình có dùng hàm để in tam giác Pascal ra màn hình.
#include <stdio.h>
#include <conio.h>
int NhiThuc(int, int); /* nguyen mau ham */
void main()
{
int
n, m, p;
printf("\n
Chuong trinh in tam giac Pascal\n"); printf(" Cho so m = "); scanf("%d", &m);
for (n = 1; n < m + 1; n++)
{
for (p = 1; p < n + 1; p++)
{
printf("%d ", NhiThuc(n, p));
}
printf("\n");
}
getch();
}
int NhiThuc(int n, int p)
{
if (p == 1 || p == n) return(1);
else return(NhiThuc(n - 1, p - 1) + NhiThuc(n - 1, p));
}
Bài 12. Cho biết kết quả
của việc thực hiện chương trình sau:
#include <iostream.h>
#include <conio.h>
using namespace std;
void f(char *dc = "TRUNG TAM", int n = 5); void f(char *dc, int n)
{
for (int i = 0; i < n; ++i) cout << "\n" << dc;
}
void main()
{
f();
f("ABC", 3);
f("DEF");
getch();
}
Bài 13. Cho biết kết quả
của việc thực hiện chương trình sau:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <conio.h>
using namespace std;
int & max(int& a, int& b); void main()
{
int b = 10, a = 7, c = 20;
cout << "Max a,b : " << max(b, a) << endl; max(b, a)++;
cout << "Gia tri b va a :" << b << " " << a << endl; max(b, c) = 5;
cout << "Gia tri b va a va c :" << b << " " << a << " " << c << endl;
}
Bài 14. Viết
chương trình có dùng hàm giải hệ phương trình bậc nhất sau: a1x
+ b1y = c1
a2x + b2y
= c2
#include <stdio.h>
#include <conio.h>
int hptb1(float
a1, float b1, float c1, float a2, float b2, float c2, float *x, float *y);
void main()
{
float a1, a2, b1, b2, c1, c2; float x, y;
char c; do
{
printf("\n CHUONG TRINH GIAI HE PHUONG TRINH BAC NHAT (nhan
<ESC> de thoat)");
printf("\n NHAP HE
SO");
printf("\n Cua phuong trinh 1 (a1,b1,c1): ");
scanf("%f %f %f", &a1, &b1, &c1);
printf("\n Cua phuong trinh 2 (a2,b2,c2): ");
scanf("%f %f %f", &a2, &b2, &c2);
if (hptb1(a1, b1, c1, a2, b2, c2, &x,
&y) == 0) printf("\n he phuong trinh da
cho vo nghiem");
else if (hptb1(a1, b1, c1, a2, b2,
c2, &x, &y) == 1) printf("\n he phuong trinh co duy nhat nghiem :(%0.3f,
%0.3f)", x, y);
else printf("\n he phuong trinh co vo so nghiem");
c = getch();
} while (c != 27);
}
int hptb1(float a1, float b1, float c1, float a2, float b2, float c2, float *x, float *y)
{
float d, dx, dy; d = a1*b2 - a2*b1;
dx = c1*b2 - c2*b1; dy = a1*c2 - c1*a2;
if (d != 0)
{
*x = dx / d; *y = dy / d; return(1);
}
else if ((dx == 0) && (dy ==
0)) return(2);
else return(0);
}
Bài 15. Viết
chương trình giải bất phương trình bậc hai: ax2 + bx + c >
0
#include <stdio.h>
#include <conio.h>
#include <math.h>
void bptb1(float b,
float c);
void bptb2(float a,
float b, float c);
int nghiem(float a,
float b, float c, float *x, float *y);
void main()
{
float a, b, c; char ch;
do
{
printf("\n CHUONG TRINH GIAI BAT PHUONG TRINH BAC HAI (nhan
<ESC> de thoat)");
printf("\n Nhap he so (a,b,c): ");
scanf("%f %f %f", &a, &b, &c);
if (a) bptb2(a, b, c);
else bptb1(b, c);
ch = getch();
} while (ch != 27);
}
void bptb1(float b, float c)
{
if (b > 0)
printf("\n Nghiem cua bpt la x > %0.3f ", (-c / b));
else if (b < 0)
printf("\n Nghiem cua bpt la x < %0.3f ", (-c / b));
else if (c > 0)
printf("\n Bpt vo so nghiem");
else printf("\n Bpt vo nghiem");
}
void bptb2(float a, float b, float c)
{
float x, y, d;
if (a > 0)
{
if (nghiem(a, b, c, &x, &y) == 2)
printf("\n Bpt vo so nghiem");
else if (nghiem(a, b, c, &x, &y) == 0)
printf("\n Bpt vo so nghiem tru x = %0.3f", x);
else
printf("\n Bpt co nghiem : x
> %0.3f va x <%0.3f",
x, y);
}
else {
if ((nghiem(a, b, c, &x, &y) == 2) || (nghiem(a, b, c, &x, &y) == 0))
printf("\n Bpt vo nghiem");
else printf("\n Bpt co nghiem : %0.3f< x < %0.3f", x, y);
}
}
int nghiem(float a, float b, float c, float *x, float *y)
{
float d = b*b - 4 * a*c;
if (d < 0) return(2);
else if (d == 0)
{
*x = *y = -b / (2 * a);
return(0);
}
else {
*x = (-b - sqrt(d)) / (2 * a);
*y = (-b + sqrt(d)) / (2 * a);
return(1);
}
}
Bài 16. Viết
chương trình có dùng hàm đệ quy để giải bài toán
tháp Hà Nội: Có n đĩa được sắp xếp trên một cọc A có kích thước
nhỏ dần (lớn dưới nhỏ trên). Yêu cầu đặt ra là: Chuyển chồng đĩa từ cọc A sang
cọc C theo những điều kiện:
-
Mỗi
lần chỉ chuyển một đĩa.
-
Không
có tình huống đĩa lớn trên đĩa nhỏ (dù chỉ là tạm thời).
-
Được
phép sử dụng một cọc B làm cọc trung gian để đặt tạm đĩa khi chuyển
từ
cọc A sang cọc C.
#include <stdio.h>
#include <conio.h>
void dichchuyen(int n, int c1, int c2, int c3);
void main()
{
int n; char c; do
{
printf("\n CHUONG TRINH THAP HA NOI (nhan <ESC> de
thoat) ");
printf("\n Nhap so dia : "); scanf("%d", &n); dichchuyen(n, 1, 2, 3); c = getch();
} while (c != 27);
}
void dichchuyen(int n, int c1, int c2, int c3) {
if (n == 1)
printf("\n %10.0d -> %d ", c1, c2); else {
dichchuyen(n - 1, c1, c3, c2); dichchuyen(1, c1, c2, c3);
dichchuyen(n - 1, c3, c2, c1);
}
}
Bài
17. Viết
chương trình có dùng hàm đệ quy để tính xn
(theo hai cách).
/* Tinh x mu n theo 2 cach */
#include <stdio.h>
#include <conio.h>
float cach1(float x,
int n);
float cach2(float x,
int n);
void main()
{
float x; int n; char c; do
{
printf("\n CHUONG TRINH TINH X MU N (nhan <ESC> de
thoat) ");
printf("\n Nhap x :
");
scanf("%f", &x);
do
{
printf("\n Nhap n
(n>0): ");
scanf("%d", &n);
} while (n < 0);
printf("\n %0.3f mu %d
bang %0.5f (cach 1)", x, n, cach1(x, n));
printf("\n %0.3f mu %d
bang %0.5f (cach 2)", x, n, cach2(x, n));
c = getch();
} while (c != 27);
}
float cach1(float x, int n)
{
if (n == 0) return(1); return (x * cach1(x, n - 1));
}
float cach2(float x, int n)
{
if (n == 0) return(1);
if ((n % 2) == 0) return(cach2(x, n / 2)*cach2(x, n / 2));
return(x*(cach2(x, n - 1)));
}
Bài 18. Viết
chương trình có dùng hàm đệ quy tìm ước số chung lớn
nhất của hai số nguyên dương (theo hai cách).
#include <stdio.h>
#include <conio.h>
int cach1(int a, int b);
int cach2(int a, int b);
void main()
{
int a, b; char c; do
{
printf("\n CHUONG TRINH TIM UCLN CUA 2 SO A, B (nhan
<ESC> de thoat) ");
printf("\n Nhap a, b : "); scanf("%d
%d", &a, &b);
printf("\n UCLN cua %d va %d la %d (cach1)", a, b, cach1(a, b));
printf("\n UCLN cua %d va %d la %d (cach2)", a, b, cach1(a, b));
c = getch();
} while (c != 27);
}
int cach1(int a, int b)
{
if (b == 0) return(a); return(cach1(b, a%b));
}
int cach2(int a, int b)
{
if (a == b) return(a);
if (a > b) return(a - b, b);
return(a, b - a);
}
0 Comment to "[Bài tập mẫu] Hàm trong C/C++"
Post a Comment