Bài tập lập trình C ■ C++ từ cơ bản đến nâng cao ■ 01 Phần cơ bản ■ 02 Hàm và thủ tục (Function và Procedure) ■ 03 Hàm và thủ tục đệ quy ■ 04 Mảng 1 chiều ■ 05 Mảng 2 chiều ■ 06 Chuổi (String) ■ 07 Bài tập nâng cao phần 1 ■ 08 Bài tập nâng cao phần 2
Trang 1Biên soạn: Th.s Nguyễn Anh Việt Trang 1
Bài 01.01 – Xin chào
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
char HoTen[30] ; // Có thể khai báo char *hoten thay vì char hoten[30]
printf("Nhap Ho va Ten: ");
gets(HoTen);
printf("Xin chuc mung ban %s", HoTen);
getch(); // Tạm dừng chương trình để xem kết quả
float c; // c là số thực có dấu phẩy
char pheptoan[ 2 ]; // char [ n ] chỉ chứa n-1 ký tự và ký tự kết thúc \0 printf("Nhap so thu nhat ");
scanf("%d", &a); // %d để nhập số nguyên
printf("Nhap so thu hai ");
scanf("%d", &b);
printf("Nhap phep toan (+ hay – hay * hay /) ");
scanf("%s", pheptoan); // %s để nhập ký tự
Trang 2Biên soạn: Th.s Nguyễn Anh Việt Trang 2
if ( strcmp(pheptoan,"+")==0 ) printf("Tong so: %d", a+b) ;
else if ( strcmp(pheptoan,"+")==0 ) printf("Hieu so: %d", a-b) ;
else if ( strcmp(pheptoan,"*")==0 ) printf("Tich so: %d", a*b) ;
Bài 01.03 – Tính Luỹ thừa
Vòng lệnh For ( tên_biến = 1 ; tên_biến <=n ; tên_biến++ ) => lệnh
Bạn hãy nhập vào cơ số a và số mũ n (int) rồi in ra màn hình kết quả của phép toán an
for (i=1; i<=n; i++) luythua=luythua*a;
printf(" %d luy thua %d bang %ld", a , n, luythua); // %ld để in số lớn getch(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
Trang 3Biên soạn: Th.s Nguyễn Anh Việt Trang 3
for (i=1; i<=n; i++) giaithua=giaithua*i;
printf("%d giai thua bang %ld ", n, giaithua );
getch(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
Trang 4Biên soạn: Th.s Nguyễn Anh Việt Trang 4
Function là hàm do người lập trình tự tạo để thực hiện một chức năng nào đó, TD:
long long giaithua(int k) {}
là hàm dùng để tính giai thừa của một số k và trả về giá trị giai thừa của k
long long giaithua (int k) { // Giá trị trả về là số nguyên lớn long long long long gt, i; // long long để khai báo số nguyên lớn
gt=1;
for (i=1; i<=k; i++) gt=gt*i;
return gt; // Trả về giá trị gt tính được
}
Bài 02.01 – In ra giá trị giai thừa của mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và tính giai thừa của từng số trong dãy đó
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int n, i, a[ 10 ] ; // Sử dụng tối đa 10 số trong dãy
printf("Nhap so phan tu cua day so ");
scanf("%d", &n);
for (i=1; i<=n; i++) {
printf("Nhap so phan tu thu %d ", i);
printf("Giai thua cua day so la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", giaithua ( a[i] ));
}
Trang 5Biên soạn: Th.s Nguyễn Anh Việt Trang 5
getch(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}
Bài 02.02 – In ra giá trị luỹ thừa 2 của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và tính luỹ thừa 2 của từng số trong dãy đó
for (i=1; i<=n; i++) {
printf("Nhap so phan tu thu %d ", i);
scanf("%d", &a[i]);
}
printf("Day so da nhap la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", a[i]);
}
printf("\n");
printf("Luy thua 2 cua day so la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", luythua (a[i], 2 ));
}
getch(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}
Trang 6Biên soạn: Th.s Nguyễn Anh Việt Trang 6
Procedure (void) cũng tương tự như Function, có thể có đối số, nhưng không giá trị trả về TD: void nhandoimang() ;
Bài 02.03 – In ra giá trị nhân đôi của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và nhân đôi từng số trong dãy đó
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
printf("Nhap so phan tu cua day so ");
scanf("%d", &n);
for (i=1; i<=n; i++) {
printf("Nhap so phan tu thu %d ", i);
scanf("%d", &a[i]);
}
printf("Day so da nhap la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", a[i]);
}
printf("\n");
nhandoimang () ; // Chú ý nếu không có () thì mảng không được nhân đôi
printf("Mang da nhan voi 2: \n");
for (i=1; i<=n; i++) {
Trang 7Biên soạn: Th.s Nguyễn Anh Việt Trang 7
Bài 02.04 – In ra giá trị nhân 4 của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và nhân 4 từng số trong dãy đó Chỉ được sử dụng void nhandoimang như trong Bài 02.03 và không sửa lệnh a[i]=a[i]*2 => a[i]=a[i]*4 trong void này
(Dãy 1, 4, 7, 5, 2 => In ra 4, 16, 28, 20, 8)
Bài 02.05 – In ra số nguyên tố trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và in ra các số nguyên tố trong dãy đó Số nguyên tố là các số chỉ chia hết cho 1 và chính nó như 2, 3, 5, 7, 11, 13, …
(Dãy 1, 4, 7, 5, 23 => In ra 7, 5, 23)
#include <stdio.h>
#include <conio.h>
#include <math.h> // Dùng để tính sqrt (căn số bậc 2)
int nguyento (int k) {
if (k<2) return 0 ; // Các số nhỏ hơn 2 không phải số nguyên tố
int i;
for (i=2; i<=int(sqrt(k)); i++) if (k%i==0) return 0 ; // Thử chia k cho
// 2 đến căn của k nếu chia hết thì không là nguyên tố
return 1 ; // không chia hết số nào thì là nguyên tố
}
int main(){
int n, i, a[10];
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
printf("Nhap so phan tu cua day so ");
scanf("%d", &n);
for (i=1; i<=n; i++) {
printf("Nhap so phan tu thu %d ", i);
scanf("%d", &a[i]);
}
printf("Day so da nhap la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", a[i]);
}
printf("\n");
printf("Cac so nguyen to trong day: \n");
for (i=1; i<=n; i++) {
if ( nguyento (a[i])== 1 ) printf("%5d ", a[i]);
}
getch(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}
Trang 8Biên soạn: Th.s Nguyễn Anh Việt Trang 8
Đệ quy là các Function hay Procedure gọi lại chính nó trong bản thân của hàm hay thủ tục, TD: long long giaithua (int k ) là hàm đệ quy dùng để tính giai thừa của một số k và trả về giá trị giai thừa của k
long long giaithua (int k) {
if (k==1) return 1;
else return giaithua(k-1)*k; // Gọi lại chính hàm giaithua
}
Bài 03.01 – In ra giá trị giai thừa của mảng 1 chiều bằng đệ quy
Bạn hãy nhập một dãy số nguyên và tính giai thừa của từng số trong dãy đó
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
printf("Nhap so phan tu cua day so ");
scanf("%d", &n);
for (i=1; i<=n; i++) {
printf("Nhap so phan tu thu %d ", i);
scanf("%d", &a[i]);
}
printf("Day so da nhap la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", a[i]);
}
printf("\n");
printf("Giai thua cua day so la: \n");
for (i=1; i<=n; i++) {
Trang 9Biên soạn: Th.s Nguyễn Anh Việt Trang 9
Bài 03.02 – In ra giá trị luỹ thừa 2 của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và tính luỹ thừa 2 bằng đệ quy của từng số trong dãy đó
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
printf("Nhap so phan tu cua day so ");
scanf("%d", &n);
for (i=1; i<=n; i++) {
printf("Nhap so phan tu thu %d ", i);
scanf("%d", &a[i]);
}
printf("Day so da nhap la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", a[i]);
}
printf("\n");
printf("Luy thua 2 cua day so la: \n");
for (i=1; i<=n; i++) {
Trang 10Biên soạn: Th.s Nguyễn Anh Việt Trang 10
Bài 03.03 – In ra giá trị nhân 3 của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và nhân đôi từng số trong dãy đó
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
printf("Nhap so phan tu cua day so ");
scanf("%d", &n);
for (i=1; i<=n; i++) {
printf("Nhap so phan tu thu %d ", i);
scanf("%d", &a[i]);
}
printf("Day so da nhap la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", a[i]);
}
printf("\n");
nhanmang (3);
printf("Day so da nhan voi 3 la: \n");
for (i=1; i<=n; i++) {
Bài 03.04 – In ra giá trị nhân 7 của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và nhân 7 từng số trong dãy đó
(Dãy 1, 4, 7, 5, 2 => In ra 7, 28, 49, 35, 14)
Trang 11Biên soạn: Th.s Nguyễn Anh Việt Trang 11
Bài 03.05 – In ra số siêu nguyên tố có 4 chữ số
Bạn hãy tìm các số siêu nguyên tố có 4 chữ số Số siêu nguyên tố là các số nguyên tố và khi bỏ đi các chữ số bên phải thì nó cũng là số nguyên tố như 3137 (3137, 313, 31, 3 đều là số nguyên tố)
if (dem==0) printf("Khong co so sieu nguyen to nao");
getch(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}
Trang 12Biên soạn: Th.s Nguyễn Anh Việt Trang 12
Bài 04.01 – Mảng 1 chiều
(Mảng int a [10] là dãy chứa 10 số nguyên từ a[0] đến a[9] )
Bạn hãy nhập một dãy số nguyên và tính Tổng các số trong dãy đó
#include <stdio.h>
#include <conio.h>
int main(){
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int n, i, tong=0 , a[10]; // Nếu không gán tong=0 sẽ tính tổng sai
printf("Nhap so phan tu cua day so ");
printf("Day so da nhap la: \n");
for (i=0; i<=n-1; i++)
printf("%5d ", a[i]);
printf("\n");
for (i=0; i<=n-1; i++)
tong=tong+a[i];
printf("Tong cua day so la: %d", tong);
getch(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int n, i, max=INT_MIN, a[10], vitri=0;
// Tìm số max, cho max=số nhỏ nhất
// Nhập dãy số
printf("Nhap so phan tu cua day so ");
scanf("%d", &n);
Trang 13Biên soạn: Th.s Nguyễn Anh Việt Trang 13
for (i=0; i<=n-1; i++) {
printf("Nhap so phan tu thu %d ", i);
scanf("%d", &a[i]);
}
// In dãy số đã nhập
printf("Day so da nhap la: \n");
for (i=0; i<=n-1; i++)
printf("So lon nhat cua day so la: %d, tai vi tri %d", max, vitri);
getch(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}
Bài 04.03 – Min : Số nhỏ nhất của dãy số
(Dãy 1, 4, 7, 5, 2 có Số nhỏ nhất là 1 , nằm ở vị trí 1 )
Bạn hãy nhập một dãy số nguyên và tìm Số nhỏ nhất cùng với vị trí của nó trong dãy đó
Bài 04.04 – Max chẵn: Số chẵn lớn nhất của dãy số
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int n, i, max=INT_MIN, a[10], vitri=0;
int co_sochan=0;
printf("Nhap so phan tu cua day so ");
scanf("%d", &n);
Trang 14Biên soạn: Th.s Nguyễn Anh Việt Trang 14
for (i=0; i<=n-1; i++) {
printf("Nhap so phan tu thu %d ", i);
scanf("%d", &a[i]);
if (a[i]%2==0) co_sochan=1; // Tìm xem có số chẵn nào không
}
printf("Day so da nhap la: \n");
for (i=0; i<=n-1; i++)
for (i=0; i<=n-1; i++)
if (max<a[i] && a[i]%2==0) {
Bạn hãy nhập một dãy số nguyên và tìm Tổng các số chẵn trong dãy đó
Bài 04.07 – Tìm các số chính phương (là bình phương của một số)
(Dãy 1, 4, 7, 5, 9 có các số chính phương là 1, 4, 9 )
Trang 15Biên soạn: Th.s Nguyễn Anh Việt Trang 15
Bạn hãy nhập một dãy số nguyên và in ra các số chính phương trong dãy đó
Chú ý: Số k là số chính phương khi a[i]==pow(sqrt(a[i]),2)
for (i=0; i<=n-1; i++) {
printf("Nhap so phan tu thu %d ", i);
scanf("%d", &a[i]);
if (a[i]==pow(sqrt(a[i]),2)) co_scp=1 ;
}
printf("Day so da nhap la: \n");
for (i=0; i<=n-1; i++)
// In ra các số chính phương trong dãy số
printf("Cac so chinh phuong cua day so la:\n");
for (i=0; i<=n-1; i++)
if (a[i]==pow(sqrt(a[i]),2)) printf("%5d", a[i]);
getch(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
Trang 16Biên soạn: Th.s Nguyễn Anh Việt Trang 16
Bài 05.01 – Mảng 2 chiều
(Mảng 2 chiều int a[10][10] là mảng chứa tối đa 10 dòng, mỗi dòng có tối đa 10 số nguyên từ a[0,0] đến a[9,9] )
a[0,0] a[0,1] a[0,2] … a[0,9]
a[1,0] a[1,1] a[1,2] … a[1,9]
a[2,0] a[2,1] a[2,2] … a[2,9]
………
a[9,0] a[9,1] a[9,2] … a[9,9]
Bạn hãy nhập một mảng số nguyên 2 chiều và tính Tổng các số trong mảng đó
#include <stdio.h>
#include <conio.h>
int main(){
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int m, n, i, j, a[10][10], sd, sc, tong=0;
printf("Nhap so dong cua mang 2 chieu ");
printf("Mang 2 chieu da nhap la: \n");
for (i=0; i<=sd-1; i++) {
for (j=0; j<=sc-1; j++) printf("%5d ", a[i][j]);
printf("\n");
}
for (i=0; i<=sd-1; i++)
for (j=0; j<=sc-1; j++) tong =tong+a[i][j];
printf("Tong cac so cua mang 2 chieu la: %d", tong );
getch(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
Trang 17Biên soạn: Th.s Nguyễn Anh Việt Trang 17
Bạn hãy nhập một mảng số nguyên và tìm Số lớn nhất cùng với vị trí của nó trong mảng đó
#include <stdio.h>
#include <conio.h>
#include <limits.h>
int main(){
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int m, n, i, j, a[10][10], sd, sc, so_ln=INT_MIN, vitri_dong , vitri_cot ; printf("Nhap so dong cua mang 2 chieu ");
printf("Mang 2 chieu da nhap la: \n");
for (i=0; i<=sd-1; i++) {
for (j=0; j<=sc-1; j++) printf("%5d ", a[i][j]);
Trang 18Biên soạn: Th.s Nguyễn Anh Việt Trang 18
#include <stdio.h>
#include <conio.h>
#include <limits.h>
int main(){
clrscr(); // Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int m, n, i, j, a[10][10], sd, sc, so_ln, vitri_cot;
printf("Nhap so dong cua mang 2 chieu ");
printf("Mang 2 chieu da nhap la: \n");
for (i=0; i<=sd-1; i++) {
for (j=0; j<=sc-1; j++) printf("%5d ", a[i][j]);
Trang 19Biên soạn: Th.s Nguyễn Anh Việt Trang 19
Bạn hãy nhập một ma trận vuông và tìm các số trên đường chéo chính
printf("Ma tran vuong da nhap la: \n");
for (i=0; i<=sdc-1; i++) {
for (j=0; j<=sdc-1; j++) printf("%5d ", a[i][j]);
printf("\n");
}
// In đường chéo chính của ma trận vuông
printf("Duong cheo chinh cua ma tran vuong la: \n");
for (i=0; i<=sdc-1; i++) {
for (j=0; j<=sdc-1; j++)
if (i==j) printf("%5d ", a[i][j]);
else printf(" "); // 6 khoảng trắng
có các số trên đường chéo phụ là 7, 2 và 8 )
Bạn hãy nhập một ma trận vuông và tìm các số trên đường chéo phụ
Trang 20Biên soạn: Th.s Nguyễn Anh Việt Trang 20
printf("Ma tran vuong da nhap la: \n");
for (i=0; i<=sdc-1; i++) {
for (j=0; j<=sdc-1; j++) printf("%5d ", a[i][j]);
printf("\n");
}
// In đường chéo phụ của ma trận vuông
printf("Duong cheo phu cua ma tran vuong la: \n");
for (i=0; i<=sdc-1; i++) {
for (j=0; j<=sdc-1; j++)
if (i+j==sdc-1) printf("%5d ", a[i][j]);
else printf(" "); // 6 khoảng trắng
có số lớn nhất trên đường chéo phụ là 8 )
Bạn hãy nhập một ma trận vuông và tìm số lớn nhất trên đường chéo phụ