Tải bản đầy đủ (.pdf) (38 trang)

■ Bài tập C or C++ phần 01 đến 08 ■ Có bài giải (từ cơ bản đến nâng cao ■ Tập 1 of 2)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (567.32 KB, 38 trang )

Bài tập C++ – Tập 1 / 2
Bài 01.01 – Xin chào
(Các lệnh printf và gets)
Bạn hãy nhập họ tên của một người và in ra màn hình câu chúc mừng người đó.
#include <stdio.h>
#include <conio.h>
int main () {
clrscr();

// xóa màn hình.
// 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ả
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;

}

Bài 02 – Các phép toán
Lệnh If (điều_kiện) => lệnh
Bạn hãy nhập vào hai số nguyên (int) và một phép toán (char) rồi in ra màn hình kết quả của phép toán.
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main(){
clrscr();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này


int a, b;
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ự

Biên soạn: Th.s Nguyễn Anh Việt

Trang 1


Bài tập C++ – Tập 1 / 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);
else if (strcmp(pheptoan,"/")==0) {
c=float (a)/b;
printf("Thuong so: %8.2f", c); // %d để in số lẻ dạng xxxxx.xx
}
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}

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.
#include <stdio.h>
#include <conio.h>
int main(){
clrscr();
int a, n, i;
long luythua;

// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
// a, n, i là các số nguyên nhỏ
// luythua chứa số nguyên lớn

printf("Nhap co so ");
scanf("%d", &a);
printf("Nhap so mu ");
scanf("%d", &n);
luythua=1;
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
return 0;
}

Bài 01.04 – Tính Giai thừa
(TD : 5! = 1 . 2 . 3 . 4 . 5 = 120)
Bạn hãy nhập vào số n (int) rồi in ra màn hình kết quả của phép toán giai thừa n!

Biên soạn: Th.s Nguyễn Anh Việt


Trang 2


Bài tập C++ – Tập 1 / 2
#include <stdio.h>
#include <conio.h>
int main(){
clrscr();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int a, n, i;
long giaithua;
printf("Nhap so can tinh giai thua ");
scanf("%d", &n);
giaithua=1;
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
return 0;
}

Bài 01.05 – Tính Tổng Sn từ 1 đến n
(TD : S5 = 1+2+ 3+ 4+ 5 = 15)
Bạn hãy nhập vào số n (int) rồi in ra màn hình kết quả của phép toán Cộng từ 1 đến n
Bài 01.06 – Tính Tổng Cn từ 1 đến n
(TD : C5 =2+ 4 = 6)
Bạn hãy nhập vào số n (Integer) rồi in ra màn hình kết quả của phép toán Cộng các số chẵn từ 1 đến n
Chú ý: a là số chẵn nếu a % 2 = 0, trong đó % là phép toán chia lấy số dư. TD: 5 % 3=2
Bài 01.07 – Tính Tổng Ln từ 1 đến n

(TD : L5 =1+ 3+5 = 9)
Bạn hãy nhập vào số n (Integer) rồi in ra màn hình kết quả của phép toán Cộng các số lẻ từ 1 đến n
Chú ý: a là số lẻ nếu a % 2 = 1

Biên soạn: Th.s Nguyễn Anh Việt

Trang 3


Bài tập C++ – Tập 1 / 2
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 đó.
(Dãy 1, 4, 7, 5, 2 => In ra 1, 24, 5040, 120, 2)
#include <stdio.h>
#include <conio.h>
long long giaithua (int k) {
long long gt, i;
gt=1;
for (i=1; i<=k; i++) gt=gt*i;
return gt;

}
int main(){
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);
scanf("%d", &a[i]);
}
printf("Day so da nhap la: \n"); // \n để lệnh in sau đó xuống dòng mới
for (i=1; i<=n; i++) {
printf("%5d ", a[i]); // In mỗi phần tử số theo dạng xxxxx
}
printf("\n");
printf("Giai thua cua day so la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", giaithua(a[i]));
}

Biên soạn: Th.s Nguyễn Anh Việt

Trang 4


Bài tập C++ – Tập 1 / 2
getch();
return 0;


// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này

}

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 đó.
(Dãy 1, 4, 7, 5, 2 => In ra 1, 16, 49, 25, 4)
#include <stdio.h>
#include <conio.h>
long long luythua (int a, int k) {
long long lt, i;
lt=1;
for (i=1; i<=k; i++) lt=lt*a;
return lt;
}
int main(){
clrscr();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int n, i, a[10];
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++) {
printf("%5d ", luythua(a[i], 2));
}
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}

Biên soạn: Th.s Nguyễn Anh Việt

Trang 5


Bài tập C++ – Tập 1 / 2
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();
void nhandoimang () {
int i;
for (i=1; i<=n; i++) a[i]=a[i]*2;
return;
}

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 đó.
(Dãy 1, 4, 7, 5, 2 => In ra 2, 8, 14, 10, 4)
#include <stdio.h>
#include <conio.h>
int n, i, a[10];
void nhandoimang () {

int i;
for (i=1; i<=n; i++) a[i]=a[i]*2;
return;
}
int main(){
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++) {
printf("%5d ", a[i]);
}
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}


Biên soạn: Th.s Nguyễn Anh Việt

Trang 6


Bài tập C++ – Tập 1 / 2
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;
}

Biên soạn: Th.s Nguyễn Anh Việt

Trang 7


Bài tập C++ – Tập 1 / 2
Đệ 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 đó.
(Dãy 1, 4, 7, 5, 2 => In ra 1, 24, 5040, 120, 2)
#include <stdio.h>
#include <conio.h>
long long giaithua (int k) {
if (k==1) return 1;
else return giaithua(k-1)*k;
}
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("Giai thua cua day so la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", giaithua(a[i]));
}
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}

Biên soạn: Th.s Nguyễn Anh Việt

Trang 8


Bài tập C++ – Tập 1 / 2
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 đó.
(Dãy 1, 4, 7, 5, 2 => In ra 1, 16, 49, 25, 4)
#include <stdio.h>
#include <conio.h>
long long luythua (int a, int k) {
if (k==1) return a;
// a1 = a
else return luythua(a, k-1)*a;
// ak = ak-1 * a
}
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("Luy thua 2 cua day so la: \n");
for (i=1; i<=n; i++) {
printf("%5d ", luythua(a[i], 2));
}
getch();
return 0;
}

Procedure cũng tương tự như Function, có thể có đối số nhưng không có giá trị trả về. TD:
void nhanmang(int k)
void nhanmang (int k) {
int i;
for (i=1; i<=n; i++) a[i]=a[i]*k;
}

Biên soạn: Th.s Nguyễn Anh Việt

Trang 9



Bài tập C++ – Tập 1 / 2
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 đó.
(Dãy 1, 4, 7, 5, 2 => In ra 3, 12, 21, 15, 6)
#include <stdio.h>
#include <conio.h>
int n, i, a[10];
void nhanmang (int k) {
int i;
for (i=1; i<=n; i++) a[i]=a[i]*k;
}
int main(){
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++) {
printf("%5d ", a[i]);
}
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}

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)

Biên soạn: Th.s Nguyễn Anh Việt

Trang 10


Bài tập C++ – Tập 1 / 2
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ố)
(In ra 2333 2339 2393 2399 2939 3119 3137 3733 3739 3793 3797 5939 7193 7331 7333 7393)
#include <stdio.h>
#include <conio.h>
#include <math.h>
int nguyento (int k) {
if (k<2) return 0;
int i;
for (i=2; i<=int(sqrt(k)); i++) if (k%i==0) return 0;
return 1;

}
int sieunguyento (int k) {
int snt=1;
while (k>0){
if (nguyento(k)==0) return 0;
k=k/10;
}
return snt;
}
int main(){
clrscr();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int i, dem=0;
for (i=1000; i<=9999; i++)
if (sieunguyento(i)==1) {
printf("%5d", i);
dem=dem+1;
}
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;
}

Biên soạn: Th.s Nguyễn Anh Việt

Trang 11


Bài tập C++ – Tập 1 / 2

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 ");
scanf("%d", &n);
for (i=0; i<=n-1; i++) { // Phần tử đầu tiên là a[0] nên cuối là a[n-1]
printf("Nhap so phan tu thu %d ", i);
scanf("%d", &a[i]);
}
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
return 0;
}

Bài 04.02 – Max : Số lớn nhất của dãy số
(Dãy 1, 4, 7, 5, 2 có Số lớn nhất là 7, nằm ở vị trí 3)
Bạn hãy nhập một dãy số nguyên và tìm Số lớn nhất cùng với vị trí của nó trong dãy đó.

#include <stdio.h>
#include <conio.h>
#include <limits.h> // Khai báo sử dụng INT_MIN là số nguyên nhỏ nhất
int main(){
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);

Biên soạn: Th.s Nguyễn Anh Việt

Trang 12


Bài tập C++ – Tập 1 / 2
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("%5d ", a[i]);
printf("\n");
// Tìm số lớn nhất và vị trí}
for (i=0; i<=n-1; i++)
if (max

max=a[i];
vitri=i+1;
}
// In số lớn nhất và vị trí
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ố
(Dãy 1, 4, 7, 5, 2 có Số chẵn lớn nhất là 4, nằm ở vị trí 2)
Bạn hãy nhập một dãy số nguyên và tìm Số chẵn lớn nhất cùng với vị trí của nó trong dãy đó.
#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 n, i, max=INT_MIN, a[10], vitri=0;
int co_sochan=0;
printf("Nhap so phan tu cua day so ");
scanf("%d", &n);

Biên soạn: Th.s Nguyễn Anh Việt

Trang 13



Bài tập C++ – Tập 1 / 2
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++)
printf("%5d ", a[i]);
printf("\n");
// Nếu không có số chẵn nào
if (co_sochan==0) {
printf("Day so da nhap khong co so chan nao");
getch();
return 0;
}
// Tìm số chẵn lớn nhất
for (i=0; i<=n-1; i++)
if (maxmax=a[i];
vitri=i+1;
}
printf("So chan 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.05 – Max lẻ: Số lẻ lớn nhất của dãy số
(Dãy 1, 4, 7, 5, 2 có Số lẻ lớn nhất là 7, nằm ở vị trí 3)
Bạn hãy nhập một dãy số nguyên và tìm Số lẻ lớn nhất cùng với vị trí của nó trong dãy đó.
Bài 04.06 – Tổng các số chẵn
(Dãy 1, 4, 7, 5, 2 có tổng các số chẵn là 6)
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)
Biên soạn: Th.s Nguyễn Anh Việt

Trang 14


Bài tập C++ – Tập 1 / 2
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)
sqrt là hàm lấy căn bậc 2, TD: Sqrt(4) = 2
pow là hàm lũy thừa, TD: pow(2,4) = 24 = 16
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(){
clrscr();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int n, i, a[10];
int co_scp=0; // Biến để biết có số chính phương trong dãy số hay không
printf("Nhap so phan tu cua day so ");
scanf("%d", &n);
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++)
printf("%5d ", a[i]);
printf("\n");
// Nếu không có số chính phương nào
if (co_scp==0) {
printf("Khong co so chinh phuong nao trong day so");
getch();
return 0; // thoát chương trình
}
// 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
return 0;
}

Bài 04.08 – Tìm các số chính phương chẵn
(Dãy 1, 4, 7, 16, 9 có các số chính phương chẵn là 4, 16)
Bạn hãy nhập một dãy số nguyên và in ra các số chính phương chẵn trong dãy đó.
Biên soạn: Th.s Nguyễn Anh Việt

Trang 15



Bài tập C++ – Tập 1 / 2
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 ");
scanf("%d", &sd);
printf("Nhap so cot cua mang 2 chieu ");
scanf("%d", &sc);
for (i=0; i<=sd-1; i++)
for (j=0; j<=sc-1; j++) {
printf("Nhap phan tu dong %d cot %d ", i+1, j+1);
scanf("%d", &a[i][j]);
}
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
return 0;
}

Bài 05.02 – Max : Số lớn nhất của mảng
(Mảng 1 4 7
5 2 9
8 1 3
có Số lớn nhất là 9, nằm ở vị trí dòng 2 cột 3)
Biên soạn: Th.s Nguyễn Anh Việt

Trang 16


Bài tập C++ – Tập 1 / 2
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 ");
scanf("%d", &sd);

printf("Nhap so cot cua mang 2 chieu ");
scanf("%d", &sc);
for (i=0; i<=sd-1; i++)
for (j=0; j<=sc-1; j++) {
printf("Nhap phan tu dong %d cot %d ", i+1, j+1);
scanf("%d", &a[i][j]);
}
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++)
if (so_lnso_ln=a[i][j];
vitri_dong=i+1;
vitri_cot=j+1;
}
printf("So lon nhat cua mang 2 chieu la %d tren dong %d, cot %d", so_ln,
vitri_dong, vitri_cot);
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}

Bài 05.03 – Max : Số lớn nhất trong mỗi dòng của mảng
(Mảng 1 4 7
5 2 9
8 1 3

có các Số lớn nhất dòng 7, 9 và 8)
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ó trên mỗi dòng trong mảng
đó.
Biên soạn: Th.s Nguyễn Anh Việt
Trang 17


Bài tập C++ – Tập 1 / 2
#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 ");
scanf("%d", &sd);
printf("Nhap so cot cua mang 2 chieu ");
scanf("%d", &sc);
//Nhập mảng 2 chiều
for (i=0; i<=sd-1; i++)
for (j=0; j<=sc-1; j++) {
printf("Nhap phan tu dong %d cot %d ", i+1, j+1);
scanf("%d", &a[i][j]);
}
//In ra mảng 2 chiều
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");

}
//Tìm Số lớn nhất từng dòng của mảng
for (i=0; i<=sd-1; i++) {
so_ln=INT_MIN;
for (j=0; j<=sc-1; j++)
if (so_lnso_ln=a[i][j];
vitri_cot=j+1;
}
printf("So lon nhat cua dong %d la %d tren cot %d\n", i+1, so_ln,
vitri_cot);
}
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}

Bài 05.04 – Đường chéo chính của Ma trận vuông
(Mảng 1 4 7
5 2 9
8 1 3
có các số trên đường chéo chính là 1, 2 và 3)
Biên soạn: Th.s Nguyễn Anh Việt

Trang 18


Bài tập C++ – Tập 1 / 2
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.
#include <stdio.h>

#include <conio.h>
int main(){
clrscr();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int i, j, a[10][10], sdc;
// Nhập ma trận vuông
printf("Nhap so dong/ cot cua ma tran vuong ");
scanf("%d", &sdc);
for (i=0; i<=sdc-1; i++)
for (j=0; j<=sdc-1; j++) {
printf("Nhap phan tu dong %d cot %d ", i+1, j+1);
scanf("%d", &a[i][j]);
}
// In ma trận vuông
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
printf("\n");
}
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này

return 0;
}

Bài 05.05 – Đường chéo phụ của Ma trận vuông
(Mảng 1 4 7
5 2 9
8 1 3
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ụ.

Biên soạn: Th.s Nguyễn Anh Việt

Trang 19


Bài tập C++ – Tập 1 / 2
#include <stdio.h>
#include <conio.h>
int main(){
clrscr();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
int i, j, a[10][10], sdc;
// Nhập ma trận vuông
printf("Nhap so dong/ cot cua ma tran vuong ");
scanf("%d", &sdc);
for (i=0; i<=sdc-1; i++)
for (j=0; j<=sdc-1; j++) {
printf("Nhap phan tu dong %d cot %d ", i+1, j+1);
scanf("%d", &a[i][j]);
}

// In ma trận vuông
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
printf("\n");
}
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}

Bài 05.06 – Số lớn nhất trên đường chéo phụ của ma trận vuông
(Mảng 1 4 7
5 2 9
8 1 3
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ụ.

Biên soạn: Th.s Nguyễn Anh Việt

Trang 20



Bài tập C++ – Tập 1 / 2
Bài 05.07 – Số nhỏ nhất trên đường chéo chính của ma trận vuông
(Mảng 2 4 7
5 1 9
8 1 3
có số nhỏ nhất trên đường chéo chính là 1)
Bạn hãy nhập một ma trận vuông và tìm số nhỏ nhất trên đường chéo chính.
Bài 05.08 – Tìm Số lớn nhất trên mỗi dòng của ma trận vuông và đổi vị trí ra đầu dòng
(Mảng 2 4 7
7 4 2
5 1 9
=> 9 1 5
8 1 3
8 1 3
)
Bạn hãy nhập một ma trận vuông và đổi các số lớn nhất ra đầu dò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 i, j, a[10][10], sdc, so_ln, vitri_cot, t;
// Nhập ma trận vuông
printf("Nhap so dong/ cot cua ma tran vuong ");
scanf("%d", &sdc);
for (i=0; i<=sdc-1; i++)
for (j=0; j<=sdc-1; j++) {

printf("Nhap phan tu dong %d cot %d ", i+1, j+1);
scanf("%d", &a[i][j]);
}
// In ma trận vuông
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");
}

Biên soạn: Th.s Nguyễn Anh Việt

Trang 21


Bài tập C++ – Tập 1 / 2
// Tìm số lớn nhất mỗi dòng, đổi ra vị trí đầu dòng
for (i=0; i<=sdc-1; i++) {
so_ln=INT_MIN;
for (j=0; j<=sdc-1; j++)
if (so_lnso_ln=a[i][j];
vitri_cot=j+1;
}
printf("So lon nhat cua dong %d la %d tren cot %d\n", i+1, so_ln,
vitri_cot);
if (vitri_cot!=1) {
t=a[i][0];
a[i][0]=a[i][vitri_cot-1];
a[i][vitri_cot-1]=t;

}
}
// In ma trận vuông đã thay đổi
printf("Ma tran vuong da doi so lon nhat dong ra dau dong: \n");
for (i=0; i<=sdc-1; i++) {
for (j=0; j<=sdc-1; j++) printf("%5d ", a[i][j]);
printf("\n");
}
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}

Biên soạn: Th.s Nguyễn Anh Việt

Trang 22


Bài tập C++ – Tập 1 / 2
Bài 06.01 – String (Chuổi)
char *ch hay ch[n]: là mảng ngầm chứa các ký tự, TD: ch=’abc’ thì ch[0]=’a’, ch[1]=’b’, ch[2]=’c’
Bạn hãy nhập một chuổi và in ra chuổi đảo ngược của chuổi đó. TD: 'abcd' => 'dcba'
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main(){
int i;
char chuoi[30];
// Nhập chuổi
printf("Ban hay nhap chuoi can dao nguoc ");

scanf("%s", chuoi);
// In chuổi đảo ngược
for (i=strlen(chuoi)-1; i>=0; i--)
printf("%c", chuoi[i]);
getch();
return 0;

// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này

}

Bài 06.02 – Đếm số từ của Chuổi
(Chuổi Nguyen Van An có 3 từ)
Bạn hãy nhập một Chuổi và đếm số từ trong chuổi đó.
#include <stdio.h>
#include <conio.h>
#include <string.h>
// Đếm số từ trong chuổi = Số ký tự trống '_' + 1
int demsotu(char *a)
{
int i, dem=0;
int n = strlen(a);
for (i = 0; i < n-1; i++) {
if (a[i]==32) // 32 là mã của ký tự trống _
dem++;
}
return dem+1;
}
int main () {
clrscr();

// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
char chuoi[255];
printf("Nhap chuoi can dem so tu: ");
gets(chuoi);

Biên soạn: Th.s Nguyễn Anh Việt

Trang 23


Bài tập C++ – Tập 1 / 2
printf("Do dai chuoi %d", strlen(chuoi));
printf("\n");
printf("Chuoi co %d tu", demsotu(chuoi));
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}

Nhưng nếu nhập vào các chuổi sai như _Nguyen_Van_An, Nguyen_Van_An_ hay Nguyen_ _Van_An
thì chương trình sẽ chạy sai. Chương trình đúng xử lý được các trường hợp nhập sai như trên là:
Var
#include <stdio.h>
#include <conio.h>
#include <string.h>
// Đếm số từ trong chuổi = Số ký tự trống '_' + 1
int demsotu(char *a)
{
int i=0, dem=0;
int n = strlen(a);

while (a[i]==32) i++;
// Tìm vị trí của chữ đầu tiên
for (i = i; i < n-1; i++) {
if (a[i]==32 && a[i+1]!=32) // Đếm các khoảng trắng _x thay vì __
dem++;
}
return dem+1;
}
int main () {
clrscr();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
char chuoi[255];
printf("Nhap chuoi can dem so tu: ");
gets(chuoi);
printf("Do dai chuoi %d", strlen(chuoi));
printf("\n");
printf("Chuoi co %d tu", demsotu(chuoi));
getch();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
return 0;
}

Bài 06.03 – Chuổi đối xứng
(Các chuổi abccba hay abcba đều là chuổi đối xứng)
Bạn hãy nhập một chuổi và kiềm tra xem chuổi đó có đối xứng hay không.
TD: abcba => Chuoi doi xung, abcbd => Chuoi khong doi xung
Biên soạn: Th.s Nguyễn Anh Việt

Trang 24



Bài tập C++ – Tập 1 / 2
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main () {
clrscr();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
char chuoi[255];
int n, i;
printf("Nhap chuoi can kiem tra doi xung: ");
gets(chuoi);
n=strlen(chuoi);
// Xác định chuổi đối xứng hay không
int doixung=1;
for (i=0; iif (chuoi[i]!=chuoi[n-1-i]) doixung=0;
if (doixung==1)
printf("Chuoi %s doi xung", chuoi);
else
printf("Chuoi %s khong doi xung", chuoi);
getch();
return 0;

// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này

}

Bài 06.04 – Chuổi chữ thường abc thành chuổi chữ in hoa ABC
Víết chương trình nhập một chuổi chữ thường, in thành chuổi chữ in hoa.

Chú ý:
* Cách 1:
- Dùng hàm strupr để trả về ký tự in hoa ‘A’, ‘B’, …, ‘Z’
- Thứ tự của ký tự ‘a’ = 97, ‘b’ = 98, …, ‘z’=122
* Cách 2: Trừ cho 32 để biến thành chữ in hoa (97 – 32 = 65 => A, 98 – 32 = 66 => B, …)
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main () {
clrscr();
// Nếu dùng CodeBlock hay Dev-C thì bỏ lệnh này
char chuoi[255];
int n, i;
printf("Nhap chuoi can doi thanh chu in hoa: ");
gets(chuoi);
// Cach 1: Dung ham
printf("Ket qua chuoi doi thanh chu in hoa \n%s\n", strupr(chuoi));

Biên soạn: Th.s Nguyễn Anh Việt

Trang 25


×