[Ngôn ngữ lập trình C++ ] Hướng dẫn giải các bài tập cơ bản
Bài tập lập trình C++ có lời giải
LAB 1. ĐỆ QUY
Một hàm được gọi là đệ quy khi bên trong hàm có hàm gọi lại chính nó hoặc có biểu thức đệ quy.
1. Tìm các số Fibonaci. Biết dãy số Fibonaci {1,1, 2, 3, 5, 8, 13, 21,...} được xây dựng như sau: U0=1, U1=1,Uk=Uk-1+Uk-2 với mọi k=2,3,4,…
a. Viết chương trình xuất ra màn hình số Fibonaci ở vị trí thứ n (không sử dụng để quy).
b. Viết chương trình xuất ra màn hình số Fibonaci ở vị trí thứ n (sử dụng để quy).
c. Viết chương trình nhập vào số nguyên n và xuất ra n số fibonaci đầu tiên.
-
void Fibona_KoDeQuy() { int vitri, u0 = 1, u1 = 1, uk; printf("\nNhap vi tri so Fibona ma ban muon tim: "); scanf("%d", &vitri); for (int i = 1; i < vitri; i++) { uk = u0 + u1; u0 = u1; u1 = uk; } printf("Tai vi tri thu k = %d\nCo so Fibona tuong ung la: %d ", vitri, uk); }
-
int Fibona_DeQuy(int vitri){ if (vitri == 0) return 1; if (vitri == 1) return 1; return Fibona_DeQuy(vitri - 1) + Fibona_DeQuy(vitri - 2); } void main(){ //Fibona_KoDeQuy(); int vitri, Fibona; printf("\nNhap vi tri so Fibona ma ban muon tim: "); scanf("%d", &vitri); for (int i = 0; i <= vitri; i++) Fibona = Fibona_DeQuy(i); printf("Tai vi tri thu k = %d\nCo so Fibona tuong ung la: %d ", vitri, Fibona); _getch(); }
-
int Fibona_DeQuy(int vitri){ if (vitri == 0) return 1; if (vitri == 1) return 1; return Fibona_DeQuy(vitri - 1) + Fibona_DeQuy(vitri - 2); } void main(){ //Fibona_KoDeQuy(); int sophantu; printf("\nNhap so phan tu: "); scanf("%d", &sophantu); printf("Co so Fibona tuong ung la: \n"); for (int i = 0; i <= sophantu; i++) printf("%d ", Fibona_DeQuy(i)); _getch(); }
2. Viết chương trình sử dụng đệ quy để tính giai thừa của một số nguyên dương a. Biết:
$$a!=\begin{Bmatrix} 1, & a=0\\ a*(a-1)!, & a>0 \end{Bmatrix}$$
-
int Giaithua(int a){ if (a == 0) return 1; else return (a *Giaithua(a - 1)); }
-
3. Viết chương trình thực hiện công việc sau:
Nhập vào hai số nguyên n và k. Tính tổ hợp chập k của n theo công thức sau:
$$C(n,k)= \frac{n!}{(k!*(n-k)!)}$$
-
int Tinh_ToHop(int n, int k){ int c; int x = Giaithua(n); int y = Giaithua(k); int z = Giaithua(n - k); c = x / (y*z); return c; }
-
4. Viết chương trình tính tổng các số chẵn từ 1 đến n.
-
int tong_chan(int n){ if (n == 0) return 0; else{ if (n % 2 == 0) return tong_chan(n - 2) + n; else return tong_chan(n - 1); } }
-
5. Viết chương trình xuất giá trị của phần tử thứ n có hạng đầu là a và công sai là r.
Cấp số cộng là một dãy số (hữu hạn hay vô hạn). Trong đó , kể từ số hạng thứ hai , mỗi số hạng đều là tổng của số hạng đứng ngay trước nó với một số không đổi gọi là công sai. Gọi r là công sai , ta có: $$U_{n} = U_{1} + (n - 1) * r$$
-
int CapSoCong(int n, int a, int r){ if (n == 1) return a; return (r + CapSoCong(n - 1, a, r)); } void main(){ int n, a, r, giatri; printf("Nhap so hang dau a= "); scanf("%d", &a); printf("Nhap cong sai r= "); scanf("%d", &r); printf("Nhap vi tri phan tu thu n= "); scanf("%d", &n); for (int i = 1; i <= n; i++) giatri = CapSoCong(i, a, r); printf("\nGia tri cua phan tu thu %d la: %d", n, giatri); _getch(); }
-
LAB 2: MẢNG VÀ CON TRỎ
Mảng là một tập hợp tuần tự các phần tử của cùng một kiểu dữ liệu và các phần tử được lưu trữ trong một dãy ô nhớ liền nhau.
Trong lập trình C, mảng và con trỏ luôn có mối quan hệ liên kết với nhau. Tuy nhiên, giữa chúng vẫn có sự khác biệt. Cụ thể, một biến con trỏ có các địa chỉ cũng như giá trị khác nhau, trong khi mảng là cố định.
Mảng nhiều chiều:
Nhập 2 số nguyên dương m, n. Viết chương trình tính tổng và tích các số trong mảng số thực a[m][n].
-
void NhapMang(int a[10][10], int sodong, int socot){ int tam; for (int i = 0; i < sodong; i++) for (int j = 0; j< socot; j++) { printf("Nhap phan tu cho a[%d][%d] = ", i,j); scanf("%d", &tam); a[i][j] = tam; } } void XuatMang(int a[10][10], int sodong, int soccot){ for (int i = 0; i < sodong; i++) { for (int j = 0; j < soccot; j++) printf("%3d", a[i][j]); printf("\n"); } } void TongMang(int a[10][10], int sodong, int socot){ int tong = 0; for (int i = 0; i < sodong; i++) for (int j = 0; j < socot;j++) tong += a[i][j]; printf("Tong cac phan tu co trong mang la: %d", tong); } void TichMang(int a[10][10], int sodong, int socot){ int tich = 1; for (int i = 0; i < sodong; i++) for (int j = 0; j < socot; j++) tich *=a[i][j]; printf("\nTich cac phan tu co trong mang la: %d", tich); }
-
Con trỏ:
1. Viết chương trình thực hiện các công việc sau:
a. Đếm số nguyên âm trong 1 chuỗi nhập từ bàn phím.
b. Đảo chuỗi kí tự vừa nhập.
-
// Câu a void Dem_NguyenAm(char *chuoi){ int dem =0; int dodai = strlen(chuoi); //hàm trả về độ dài của chuỗi for (int i = 0; i < dodai; i++) { if (chuoi[i] == 'a' || chuoi[i] == 'o' || chuoi[i] == 'u' || chuoi[i] == 'e' || chuoi[i] == 'i') dem++; } printf("Chuoi co so nguyen am la: %d", dem); } // Câu b void Dao_Chuoi (char *chuoi) { int dodai, i, j; char s; dodai = strlen(chuoi) - 1; for (i = 0, j = strlen(chuoi) - 1; i < j; i++, j--) { s = chuoi[i]; chuoi[i] = chuoi[j]; chuoi[j] = s; } } void main(){ char s[30]; printf("Nhap vao chuoi ky tu: "); fflush(stdin); gets(s); Dem_NguyenAm(s); Dao_Chuoi(s); printf("\n%s", s); _getch(); }
-
2. Viết chương trình nhập xuất mảng có n phần tử và in ra tổng các số chia hết cho 5 trong mảng.
-
void NhapMang(int *a, int n){ for (int i = 0; i < n; i++) { printf("Nhap a[%d]: ", (i + 1)); scanf("%d", &a[i]); } } void XuatMang(int *a, int n){ printf("Mang vua nhap la: \n"); for (int i = 0; i < n; i++) printf("%4d",a[i]); } void Tong_ChiaHet5(int *a, int n){ int tong = 0; for (int i = 0; i < n; i++) { if (a[i]%5 == 0) tong += a[i]; } printf("\nTong cac so chia het cho 5 la: %d", tong); } void main(){ int *a, n = 1; a = (int*)malloc(n * sizeof(int)); // hoặc a = new int[n]; printf("Nhap so phan tu: "); scanf("%d", &n); NhapMang(a, n); XuatMang(a, n); Tong_ChiaHet5(a, n); _getch(); }
Nhận xét