Thursday, August 20, 2015

[Bài tập mẫu] Hàm trong C/C++



CÂU HỎI

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);
}

Cám ơn bạn đã đọc bài viết này. Hãy chia sẻ bài viết và bình luận ý kiến của bạn ở bên dưới.

Share this

Chào mừng bạn đến với SimpleCodeCJava Blog - Mục đích của chúng tôi khi thành lập blog này là muốn chia sẻ những kiến thức và kinh nghiệm lập trình mà chúng tôi đã học được với mong muốn giúp đỡ mọi người, giúp bạn rút ngắn được thời gian tìm hiểu cũng như việc giải quyết những vấn đề trong lập trình C và Java.

0 Comment to "[Bài tập mẫu] Hàm trong C/C++"