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

■ Bài tập C or C++ phần 09 đến 16 ■ Có bài giải (từ cơ bản đến nâng cao ■ Tập 2 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 (912.19 KB, 39 trang )

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

Biến có cấu trúc - Struct
TD: Mỗi điểm trong hình học 2 chiều có toạ độ (x, y)
Khai báo biến trong C hay C++ như sau:
struct Diem{
int x, y;
};

Bài tập 09.01 – Tìm độ dài của một đoạn thẳng AB:
Độ dài của đoạn thẳng AB với điểm A có toạ độ xA, yA và điểm B có toạ độ xB, yB được tính như sau:
̅̅̅̅
𝐴𝐵 = √(𝑥𝐴 − 𝑥𝐵 )2 + (𝑦𝐴 − 𝑦𝐵 )2
#include <stdio.h>
#include <stdlib.h>
struct Diem{
int x, y;
};
int main()
{
float dodai;
struct Diem A;
struct Diem B;
printf("Ban hay nhap toa do cua diem thu nhat ");
scanf("%d %d", &A.x, &A.y);
printf("Ban hay nhap toa do cua diem thu hai ");
scanf("%d %d", &B.x, &B.y);
dodai = sqrt(pow(A.x - B.x,2) + pow(A.y - B.y,2));
// sqrt = Căn bậc 2
pow(a, n) = an
printf("Do dai doan thang AB la %6.2f", dodai);


return 0;
}

Bài tập 09.02 – Tìm toạ độ trung điểm của một đoạn thẳng AB:
Toạ độ trung điểm I của đoạn thẳng AB là xI, yI được tính như sau:
xI =

(𝑥𝐴 +𝑥𝐵 )
2



yI =

(𝑦𝐴 +𝑦𝐵 )
2

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

Trang 1


Bài tập C++ – Tập 2 / 2
#include <stdio.h>
#include <stdlib.h>
struct Diem{
float x, y;
};

// tọa độ là số thực có dấu phẩy


int main()
{
float dodai;
struct Diem A;
struct Diem B;
struct Diem TrungDiem;
printf("Ban hay nhap toa do cua diem thu nhat ");
scanf("%f %f", &A.x, &A.y);
printf("Ban hay nhap toa do cua diem thu hai ");
scanf("%f %f", &B.x, &B.y);
TrungDiem.x = (A.x + B.x)/2;
TrungDiem.y = (A.y + B.y)/2;
printf("Trung diem cua doan thang AB co toa la (%.2f, %.2f)",
TrungDiem.x, TrungDiem.y);
return 0;
}

Bài tập 09.03 – Danh sách học sinh:
Nhập vào danh sách học sinh gồm có Họ, Tên, Điểm TB.
* Sắp thứ tự danh sách theo điểm TB của học sinh
* In ra danh sách các học sinh có Điểm TB >= 5
* In ra danh sách các học sinh có Điểm TB < 5 (tự làm bài)
* In ra danh sách các học sinh có điểm TB cao nhất
* In ra danh sách các học sinh có điểm TB thấp nhất (tự làm bài)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n, i, j, t1;
char t2[31];

struct HocSinh {
char Ho[31], Ten[11];
float DiemTB;
};
struct HocSinh HS[10];

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

Trang 2


Bài tập C++ – Tập 2 / 2
void Nhap_DS() {
printf("Danh sach co bao nhieu hoc sinh ");
scanf("%d", &n);
for (i=0; iprintf("Hoc sinh thu %d\n", i);
fflush(stdin); // Không có lệnh này thì nhập rất lộn xộn
printf("Ho : ");
gets(HS[i].Ho);
printf("Ten : ");
gets(HS[i].Ten);
printf("Diem TB: ");
scanf("%f", &HS[i].DiemTB);
printf("\n");
}
}
void In_DS(int k, char tb[51]) {
printf("DS Hoc sinh %s\n", tb);
for (i=0; i

if (HS[i].DiemTB>=k) {
printf("%s ", HS[i].Ho);
printf("%s ", HS[i].Ten);
printf("%.2f", HS[i].DiemTB);
printf("\n");
}
}
void Sap_TT () { // Sắp thứ tự điểm tăng dần
for (i=0; i< n-1; i++)
for (j=i+1; jif (HS[i].DiemTB > HS[j].DiemTB) {
strcpy(t2, HS[i].Ho);
// Hoán chuyển Họ
strcpy(HS[i].Ho, HS[j].Ho);
strcpy(HS[j].Ho, t2);
strcpy(t2, HS[i].Ten);
strcpy(HS[i].Ten, HS[j].Ten);
strcpy(HS[j].Ten, t2);

// Hoán chuyển Tên

t1 = HS[i].DiemTB;
HS[i].DiemTB = HS[j].DiemTB;
HS[j].DiemTB = t1;

// Hoán chuyển Điểm TB

}
}
float Diem_TB_Max() {

float DiemMax=HS[0].DiemTB;
for (i=0; i< n-1; i++)
if (DiemMaxreturn DiemMax;
}
int main()

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

Trang 3


Bài tập C++ – Tập 2 / 2
{
Nhap_DS();
In_DS(0, "");
Sap_TT();
In_DS(0,"da sap thu tu tang");
// In DS điểm TB >=0 (toàn bộ)
In_DS(5, "co diem TB >=5");
// In DS điểm TB >=5
In_DS(Diem_TB_Max(), "co diem TB cao nhat");
// In DS điểm TB >=Max (có điểm max)
return 0;
}

Bài tập 10.01 – Đổi số thập phân thành số nhị phân:
Để đổi số thập phân thành số nhị phân ta thực hiện như sau:
TD: Đổi số 137 => Đem chia cho 2 đến khi kết quả phép chia bằng 0 rồi lấy ngược các số dư
137

1

2
68
0

2
34
0

2
17
1

2
8
0

2
4
0

2
2
0

2
1
1


2
0

Kết quả là 137 10 = 10001001 2
#include <stdio.h>
#include <string.h>
int main()
{
int n, k;
char CNP[21]; strcpy(CNP, "");
printf("Hay nhap so can doi tu he 10 sang he 2 ");
scanf("%d", &n);
k = n;
while (k>0) {
if (k % 2 == 0) strcat(CNP, "0");
else strcat(CNP, "1");
k = k / 2;
}
strrev(CNP);
// Đảo ngược chuổi
printf("So %d trong he 10 doi sang he 2 la %s", n, CNP);

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

Trang 4


Bài tập C++ – Tập 2 / 2
return 0;
}


Bài tập 10.02 – Đổi số thập phân thành số thập lục phân (hệ 16):
Để đổi số thập phân thành số hệ 16 ta thực hiện như sau:
TD: Đổi số 249 => Đem chia cho 16 đến khi kết quả phép chia bằng 0 rồi lấy ngược các số dư.
Chú ý các số dư từ 10 đến 15 được chuyển đổi thành A đến F
249
9
9

16
15
15
F

16
0

Kết quả là 249 10 = F9 16
#include <stdio.h>
#include <string.h>
int main()
{
long n, k;
char CTLP[21]; strcpy(CTLP, "");
printf("Hay nhap so can doi tu he 10 sang he 16 ");
scanf("%d", &n);
k = n;
while (k>0) {
switch (k%16) {
case 0: strcat(CTLP, "0"); break;

case 1: strcat(CTLP, "1"); break;
case 2: strcat(CTLP, "2"); break;
case 3: strcat(CTLP, "3"); break;
case 4: strcat(CTLP, "4"); break;
case 5: strcat(CTLP, "5"); break;
case 6: strcat(CTLP, "6"); break;
case 7: strcat(CTLP, "7"); break;
case 8: strcat(CTLP, "8"); break;
case 9: strcat(CTLP, "9"); break;
case 10: strcat(CTLP, "A"); break;
case 11: strcat(CTLP, "B"); break;
case 12: strcat(CTLP, "C"); break;
case 13: strcat(CTLP, "D"); break;
case 14: strcat(CTLP, "E"); break;
case 15: strcat(CTLP, "F"); break;
}
k = k / 16;
}
strrev(CTLP);
// Đảo ngược chuổi
printf("So %d trong he 10 doi sang he 16 la %s", n, CTLP);

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

Trang 5


Bài tập C++ – Tập 2 / 2
return 0;
}


Bài tập 10.03 – Đổi số thập phân thành số theo hệ m (m từ 2 đến 16):
#include <stdio.h>
#include <string.h>
int main()
{
long n, m, k;
char Cxx[21]; strcpy(Cxx, "");
printf("Hay
scanf("%d",
printf("Hay
scanf("%d",

nhap so can doi tu he 10 sang he m ");
&n);
nhap he can doi (tu 2 den 16) ");
&m);

k = n;
while (k>0) {
switch (k%m) {
case 0: strcat(Cxx, "0"); break;
case 1: strcat(Cxx, "1"); break;
case 2: strcat(Cxx, "2"); break;
case 3: strcat(Cxx, "3"); break;
case 4: strcat(Cxx, "4"); break;
case 5: strcat(Cxx, "5"); break;
case 6: strcat(Cxx, "6"); break;
case 7: strcat(Cxx, "7"); break;
case 8: strcat(Cxx, "8"); break;

case 9: strcat(Cxx, "9"); break;
case 10: strcat(Cxx, "A"); break;
case 11: strcat(Cxx, "B"); break;
case 12: strcat(Cxx, "C"); break;
case 13: strcat(Cxx, "D"); break;
case 14: strcat(Cxx, "E"); break;
case 15: strcat(Cxx, "F"); break;
}
k = k / m;
}
strrev(Cxx);
printf("So %d trong he 10 doi sang he %d la %s", n, m, Cxx);
return 0;
}

Bài tập 11.01 – Đổi số nhị phân thành số thập phân:
Biên soạn: Th.s Nguyễn Anh Việt

Trang 6


Bài tập C++ – Tập 2 / 2
Để đổi số nhị phân thành số thập phân ta thực hiện như sau:
TD: Đổi số 10001001
Tính các luỹ thừa của 2
=

27
128
1


26
64
0

25
32
0

Nhân tương ứng với các giá trị luỹ thừa
Cộng các giá trị lại

128

0

0

24
16
0

23
8
1

0
8
128 + 8 + 1 = 137


22
4
0

21
2
0

20
1
1

0

0

1

Kết quả là 10001001 2 = 137 10
#include <stdio.h>
#include <string.h>
int main()
{
int So, i;
long LT, STP=0;
char CNP[21];
printf("Hay nhap chuoi can doi tu he 2 sang he 10 ");
gets(CNP);
LT = 1;
for (i=strlen(CNP)-1; i>=0; i--) {

if (CNP[i]=='0')
So =0;
else
So = 1;
STP += So * LT;
LT = LT * 2;
}
printf("Chuoi %s trong he 2 doi sang he 10 la %d", CNP, STP);
return 0;
}

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

Trang 7


Bài tập C++ – Tập 2 / 2
Bài tập 11.02 – Đổi số thập lục phân (hệ 16) thành số thập phân:
Để đổi số thập phân thành số hệ 16 ta thực hiện như sau:
Tính các luỹ thừa của 16
=
Các giá trị A, B, …, F => 10, 11, … , 15
Nhân tương ứng với các giá trị luỹ thừa
Cộng các giá trị lại

16 1
16 0
16
1
F

9
15
9
240
9
240 + 9 = 249

Kết quả là F9 16 = 249 10
#include <stdio.h>
int main()
{
int So, i, err=0;
long LT, STP=0;
char CTLP[21];
printf("Hay nhap chuoi can doi tu he 16 sang he 10 ");
gets(CTLP);
LT = 1;
for (i=strlen(CTLP)-1; i>=0; i--) {
switch (CTLP[i]) {
case '0': So=0; break; // Chuổi chứa 1 ký tự 'x'/ nhiều hơn 1 "x.."
case '1': So=1; break;
case '2': So=2; break;
case '3': So=3; break;
case '4': So=4; break;
case '5': So=5; break;
case '6': So=6; break;
case '7': So=7; break;
case '8': So=8; break;
case '9': So=9; break;
case 'A': So=10; break;

case 'B': So=11; break;
case 'C': So=12; break;
case 'D': So=13; break;
case 'E': So=14; break;
case 'F': So=15; break;
default: err=1;
}
STP += So * LT;
LT = LT * 16;
}

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

Trang 8


Bài tập C++ – Tập 2 / 2
if (err==0)
printf("Chuoi %s trong he 16 doi sang he 10 la %d", CTLP, STP);
else
printf("Chuoi %s khong la chuoi trong he 16 (0..9 va A..F)", CTLP);
return 0;
}

Bài tập 11.03 – Đổi chuổi số theo hệ m (m từ 2 đến 16) thành số thập phân:
#include <stdio.h>
int main()
{
int So, i, err=0, m;
long LT, STP=0;

char CTLP[21];
printf("Hay nhap chuoi can doi tu he m sang he 10 ");
gets(CTLP);
printf("Hay nhap he m (2 den 16) ");
scanf("%d", &m);
LT = 1;
for (i=strlen(CTLP)-1; i>=0; i--) {
So=-1;
switch (CTLP[i]) {
case '0': So=0; break;
case '1': So=1; break;
case '2': So=2; break;
case '3': So=3; break;
case '4': So=4; break;
case '5': So=5; break;
case '6': So=6; break;
case '7': So=7; break;
case '8': So=8; break;
case '9': So=9; break;
case 'A': So=10; break;
case 'B': So=11; break;
case 'C': So=12; break;
case 'D': So=13; break;
case 'E': So=14; break;
case 'F': So=15; break;
}
if (So==-1) err=1;
STP += So * LT;
LT = LT * m;
}


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

Trang 9


Bài tập C++ – Tập 2 / 2
if (err==0)
printf("Chuoi %s trong he %d doi sang he 10 la %d", CTLP, m, STP);
else
printf("Chuoi %s khong la chuoi trong he %d", CTLP, m);
return 0;
}

Các bài toán cổ
Bài 12.01.
Trăm trâu trăm cỏ
Trâu đứng ăn năm
Trâu nằm ăn ba
Lụ khụ trâu già
Ba con một bó
Hỏi số trâu và số cỏ ?
int main()
{
int dung, nam, gia;
for (dung=1; dung<=20; dung++)
for (nam=1; nam<=33; nam++)
for (gia=1; gia<=100; gia++)
if (dung*5+nam*3+ (float) gia/3==100 && dung+nam+gia==100)
printf("So trau dung %d, nam %d, gia %d\n", dung, nam, gia);

return 0;
}

Bài 12.02.
Em đi chợ phiên
Anh gửi trăm tiền
Mua cam cùng quýt
Với lại thanh yên
Không ít thì nhiều
Mua lấy một trăm
Cam ba đồng một
Quýt một đồng năm
Thanh yên tươi tốt
Năm đồng một trái
Hỏi mỗi thứ mua được mấy trái ?

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

Trang 10


Bài tập C++ – Tập 2 / 2
int main()
{
int cam, quit, thanhyen;
for (cam=1; cam<=32; cam++)
for (quit=1; quit<=98; quit++)
for (thanhyen=1; thanhyen<=18; thanhyen++)
if (cam*3+(float)quit/5+thanhyen*5==100 && cam+quit+thanhyen==100)
printf("So cam %d, quit %d, thanh yen %d\n",cam,quit,thanhyen);

return 0;
}

Các bài ôn tập – Phần 2
13.01. Nhập số n, tìm số nguyên tố lớn nhất <= n. TD: n = 10, số nguyên tố lớn nhất <= 10 là 7
#include <stdio.h>
int nguyento(int k) {
if (k<2) return 0;
int i;
for (i=2; i<=sqrt(k); i++)
if (k%i==0) return 0;
return 1;
}
int main()
{
int n, t;
printf("Ban hay nhap so n ");
scanf("%d", &n);
t=n;
while (t>=0) {
if (nguyento(t)) break;
t-=1;
}
if (t>=2) printf("\nSo nguyen to lon nhat <= %d la %d ", n, t);
else printf("Khong co so nguyen to <= %d", n);
return 0;
}

13.02. Nhập số n, tìm số nguyên tố nhỏ nhất >= n. TD: n = 10, số nguyên tố nhỏ nhất >= 10 là 11
13.03. Nhập số n và số k, tìm k số nguyên tố lớn nhất <= n. TD:

* n = 23 và k = 5, 5 số nguyên tố lớn nhất <= 23 là 11, 13, 17, 19 và 23
* n = 10 và k = 5, chỉ có 4 số nguyên tố lớn nhất <= 10 là 2, 3, 5 và 7

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

Trang 11


Bài tập C++ – Tập 2 / 2
#include <stdio.h>
int nguyento(int x) {
if (x<2) return 0;
int i;
for (i=2; i<=sqrt(x); i++)
if (x%i==0) return 0;
return 1;
}
int main()
{
int n, k, t, dem=0;
char kq[51], buffer[20], *temp;
strcpy(kq, "");
printf("Ban hay nhap so n ");
scanf("%d", &n);
printf("Ban can tim bao nhieu so nguyen to <= n ");
scanf("%d", &k);
t=n;
while (t>=0) {
if (nguyento(t)) {
dem++;

temp=itoa(t, buffer, 10);
if (dem>1) strcat(kq, ", ");
strcat(kq, temp);
}
if (dem==k) break;
t-=1;
}
if (dem==0) printf("Khong co so nguyen to <= %d", n);
else if (dem==k) printf("\nCo %d so nguyen to lon nhat <= %d la %s ",
dem, n, kq);
else if (demdem, n, kq);
return 0;
}

13.04. Nhập số n và số k, tìm k số nguyên tố nhỏ nhất >= n. TD: n = 10 và k = 3, 3 số nguyên tố nhỏ
nhất >= 10 là 11, 13 và 17
13.05. Nhập số dòng/ cột n của ma trận vuông. Điền các số theo chiều kim đồng hồ vào ma trận.
TD: n = 4:
1
2
3
12 13 14
11 16 15
10
9
8

4
5

6
7

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

Trang 12


Bài tập C++ – Tập 2 / 2
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, j, dong, dongcu, cot, cotcu, a[20][20];
char *huong; // Có 4 hướng: phải, xuống, trái, lên
for (i=1; i<=n; i++) // Điền số 0 vào ma trận
for (j=1; j<=n; j++)
a[i][j]=0;
printf("Nhap so dong/ cot cua ma tran xoan oc ");
scanf("%d", &n);
huong="p";
dong=1;
cot=1;

// Xuất phát hướng phải từ ô a[1][1]

for (i=1; i<=n*n; i++) {
a[dong][cot]=i; dongcu=dong; cotcu=cot;
if (huong=="p") { // Hướng phải, cột tăng (1, 2,... )
cot++;

if (cot==n+1 || a[dong][cot]>0) { // đến cột cuối hoặc đã điền
huong="x";
dong=dongcu;
cot=cotcu;
}
}
if (huong=="x") { // Hướng xuống, dòng tăng (1, 2,... )
dong++;
if (dong==n+1 || a[dong][cot]>0) {// đến dòng cuối hoặc đã điền
huong="t";
dong=dongcu;
cot=cotcu;
}
}
if (huong=="t") { // Hướng trái, cột giảm (..., 3, 2, 1)
cot--;
if (cot==0 || a[dong][cot]>0) { // đến cột đấu hoặc đã điền
huong="l";
dong=dongcu;
cot=cotcu;
}
}

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

Trang 13


Bài tập C++ – Tập 2 / 2
if (huong=="l") { // Hướng lên, dòng giảm (..., 3, 2, 1)

dong--;
if (dong==0 || a[dong][cot]>0) { // đến dòng đầu hoặc đã điền
huong="p";
dong=dongcu;
cot=cotcu;
cot++;
}
}
}
for (i=1; i<=n; i++) { // In ma trận xoắn ốc
for (j=1; j<=n; j++) printf("%4d", a[i][j]);
printf("\n");
}
return 0;
}

13.06. Nhập số dòng/ cột n của ma trận vuông. Điền các số nguyên tố theo chiều kim đồng hồ vào ma
trận. TD: n = 4:
2
3
5
7
37 41 43 11
31 53 47 13
29 23 19 17

Bài này làm tương tự bài trên (13.05), chỉ cần thêm function int nguyentothuk(int k) trả về số nguyên
tố thứ k. TD: nguyento(1)=2, nguyento(2)=3, … và thay lệnh a[dong][cot]=i thành
a[dong][cot]=nguyentothuk(i) là xong. Function nguyentothuk như sau:
int nguyento(int x) {

if (x<2) return 0;
int i;
for (i=2; i<=sqrt(x); i++)
if (x%i==0) return 0;
return 1;
}
int nguyentothuk(int k) {
int dem=0, i=2, nt;
while (demif (nguyento(i)==1) {
dem++;
nt=i;
}
i++;
}
return nt;
}

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

Trang 14


Bài tập C++ – Tập 2 / 2
13.07. Nhập ma trận vuông, tìm các số nguyên tố trong nửa ma trận trên và tính tổng của chúng.
TD: n = 4
2
3
1
4

7
5
6
8
11
9 10
12
13 14 15 16

Các số nguyên tố trong nửa ma trận trên là : 2, 3, 7, 11 có tổng là 23
13.08. Nhập vào độ dài của 3 cạnh. Nếu chúng tạo thành một tam giác thì tính diện tích tam giác đó.
Ngược lại thì thông báo chúng không tạo thành một tam giác. TD:
* Nhập 3, 4, 5 => Diện tích của tam giác là 6
* Nhập 3, 4, 7 => 3 cạnh trên không tạo thành một tam giác.
#include <stdio.h>
#include <stdlib.h>
float dientich(int a, int b, int c) {
float nua_cv=(float)(a+b+c)/2;
float dientich;
dientich=sqrt(nua_cv*(nua_cv-a)*(nua_cv-b)*(nua_cv-c));
return dientich;
}
int main()
{
int a, b, c;
printf("Nhap so canh thu 1 cua tam giac ");
scanf("%d", &a);
printf("Nhap so canh thu 2 cua tam giac ");
scanf("%d", &b);
printf("Nhap so canh thu 3 cua tam giac ");

scanf("%d", &c);
if (aprintf("Dien tich tam giac %.4f", dientich(a, b, c));
}
else
printf("Ba canh %d, %d, %d khong tao thanh tam giac", a, b, c);
return 0;
}

13.09. Nhập vào độ dài của 3 cạnh. Nếu chúng tạo thành một tam giác xem có tính chất gì không (cân,
vuông, đều). Ngược lại thì thông báo chúng không tạo thành một tam giác. TD:
* Nhập 3, 4, 5 => Tam giác vuông
* Nhập 3, 4, 7 => 3 cạnh trên không tạo thành một tam giác.
* Nhập 4, 4, 5 => Tam giác cân
* Nhập 4, 4, 4 => Tam giác đều
* Nhập 3, 4, 6 => Tam giác thường
Biên soạn: Th.s Nguyễn Anh Việt

Trang 15


Bài tập C++ – Tập 2 / 2
float dientich(int a, int b, int c) {
float nua_cv=(float)(a+b+c)/2;
float dientich;
dientich=sqrt(nua_cv*(nua_cv-a)*(nua_cv-b)*(nua_cv-c));
return dientich;
}
int main()
{

int a, b, c;
printf("Nhap so canh thu 1 cua tam giac ");
scanf("%d", &a);
printf("Nhap so canh thu 2 cua tam giac ");
scanf("%d", &b);
printf("Nhap so canh thu 3 cua tam giac ");
scanf("%d", &c);
if (aif (a==b&&b==c) printf("Tam giac deu");
else if
(pow(a,2)==pow(b,2)+pow(c,2)&&b==c||pow(b,2)==pow(a,2)+pow(c,2)&&a==c||pow
(c,2)==pow(a,2)+pow(b,2)&&a==b)
printf("Tam giac vuong can");
else if
(pow(a,2)==pow(b,2)+pow(c,2)||pow(b,2)==pow(a,2)+pow(c,2)||pow(c,2)==pow(a
,2)+pow(b,2))
printf("Tam giac vuong");
else if (a==b||b==c||a==c) printf("Tam giac can");
else printf("Tam giac thuong");
printf("\nDien tich tam giac %.4f", dientich(a, b, c));
}
else
printf("Ba canh %d, %d, %d khong tao thanh tam giac", a, b, c);
return 0;
}

13.10. Nhập vào toạ độ của 3 điểm và xét xem chúng có tạo thành một tam giác hay không, nếu có thì
tính diện tích của tam giác đó. TD:
* (-2, 1), (0, 5), (4, 3) => Diện tích là 10
* (3, 1), (0, 1), (0, 4) => Diện tích là 4,5

#include <stdio.h>
#include <stdlib.h>
struct diem {
int x, y;
};

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

Trang 16


Bài tập C++ – Tập 2 / 2
float dodai(struct diem diem1, struct diem diem2) {
return sqrt(pow(diem2.x-diem1.x,2)+pow(diem2.y-diem1.y,2));
}
float dientich(float a, float b, float c) {
float nua_cv=(float)(a+b+c)/2;
float dientich;
dientich=sqrt(nua_cv*(nua_cv-a)*(nua_cv-b)*(nua_cv-c));
return dientich;
}
int main()
{
struct diem a, b, c;
printf("Nhap vao toa
scanf("%d %d", &a.x,
printf("Nhap vao toa
scanf("%d %d", &b.x,
printf("Nhap vao toa
scanf("%d %d", &c.x,


do diem thu nhat ");
&a.y);
do diem thu hai ");
&b.y);
do diem thu ba ");
&c.y);

float x=dodai(a,b), y=dodai(b,c), z=dodai(a,c);
if (xprintf("Ba diem tao thanh tam giac co dien tich la %.3f",
dientich(x,y,z));
else
printf("Ba diem khong tao thanh tam giac");
return 0;
}

13.11. Nhập vào toạ độ của 3 điểm và xét xem chúng có tạo thành một tam giác hay không, nếu có thì
xem tam giác đó có tích chất gì không (cân, đều, vuông cân). TD:
* (-2, 1), (0, 5), (4, 3) => Tam giác vuông cân
* (3, 1), (0, 1), (0, 4) => Tam giác vuông

Các bài ôn tập – Phần 3
14.01. Cho ma trận nguyên Anxn . Hãy xây dựng ma trận B từ ma trận A bằng cách loại bỏ đường chéo
chính.
TD :
1 2 3
23
4 5 6 -> 4 6
7 8 9

78
#include <stdio.h>
#include <stdlib.h>

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

Trang 17


Bài tập C++ – Tập 2 / 2
int main()
{
int n, i, j, a[10][10];
printf("Nhap so dong/ cot cua ma tran vuong ");
scanf("%d", &n);
for (i=0; ifor (j=0; jprintf("Nhap phan tu thu %d%d ",i+1 , j+1);
scanf("%d", &a[i][j]);
}
printf("\nMa tran da nhap:\n");
for (i=0; ifor (j=0; jprintf("\n");
}
for (i=0; i// Xóa đường chéo chính/ dời phần tử j+1 về j
for (j=i; ja[i][j]=a[i][j+1];
printf("\nMa tran da xoa duong cheo chinh:\n");

for (i=0; ifor (j=0; jprintf("\n");
}
return 0;
}

14.02. Nhập mảng từ file MT1.txt và in ra màn hình
MT01.txt
3
123
456
789
Cần tạo file MT1.txt chứa nội dung như trên (3

1 2 3….) và đặt vào cùng thư mục với file .c

#include <stdio.h>
#include <stdlib.h>
int n, i, j, a[20][20];

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

Trang 18


Bài tập C++ – Tập 2 / 2
void docfile() {
FILE* fi = fopen("MT01.txt", "rt");
// Tên file chứa ma trận; rt = read + text

if(fi==NULL) {
printf("File khong ton tai\n");
return;
}
// Đọc dữ liệu
fscanf(fi, "%d", &n); // Đọc số hàng/ cột từ file
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
fscanf(fi,"%d", &a[i][j]);
printf("\n");
}
// Đóng file
fclose (fi);
}
void inmatran() {
int i, j;
printf("Ma tran doc tu file\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) printf("%4d", a[i][j]);
printf("\n");
}
}
int main()
{
docfile();
inmatran();
return 0;
}

14.03. Nhập vào ma trận vuông và tìm số lớn nhất, số nhò nhất của ma trận

MT02.txt
3
987
654
321

MT02KQ.txt
9
1

#include <stdio.h>
#include <limits.h>
int n, i, j, a[20][20];
void docfile() {

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

Trang 19


Bài tập C++ – Tập 2 / 2
FILE* fi=fopen("MT02.txt", "rt"); // Tên file matran.txt; rt=read+text
if(fi==NULL) {
printf("File khong ton tai\n");
return;
}
fscanf(fi, "%d", &n); // Đọc số hàng/ cột từ file
// Đọc dữ liệu
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)

fscanf(fi,"%d", &a[i][j]);
printf("\n");
}
fclose (fi); // Đóng file
}
void inmatran() {
int i, j;
printf("Ma tran doc tu file\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) printf("%4d", a[i][j]);
printf("\n");
}
}
void timmaxmin() {
int i, j, max=INT_MIN, min=INT_MAX;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) {
if (maxif (min>a[i][j]) min=a[i][j];
}
printf("So lon nhat cua ma tran la %d, nho nhat la %d", max, min);
xuatfile(max, min);
}
void xuatfile(int max, int min) {
FILE* fo = fopen("MT02KQ.txt", "wt"); // wt=write+text(dạng văn bản)
// Ghi dữ liệu ra file
fprintf(fo, "%d\n%d", max, min);
fclose(fo); // Đóng file
}
int main()

{
docfile();
inmatran();
timmaxmin();
return 0;
}

14.04. Nhập vào ma trận vuông (n>=3), xoá dòng 2 của ma trận
Biên soạn: Th.s Nguyễn Anh Việt

Trang 20


Bài tập C++ – Tập 2 / 2
MT03.txt
3
987
654
321

MT03KQ.txt
987
321

#include <stdio.h>
int n, i, j, a[20][20];
void docfile() {
FILE* fi = fopen("MT03.txt", "rt"); // Tên file matran.txt; rt = read +
text
if(fi==NULL) {

printf("File khong ton tai\n");
return;
}
// Đọc dữ liệu
fscanf(fi, "%d", &n); // Đọc số hàng/ cột từ file
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
fscanf(fi,"%d", &a[i][j]);
printf("\n");
}
// Đóng file
fclose (fi);
}
void inmatran(int sd, int sc) {
int i, j;
printf("Ma tran doc tu file\n");
for (i = 0; i < sd; i++) {
for (j = 0; j < sc; j++)
printf("%4d", a[i][j]);
printf("\n");
}
}
void xoadong2() {
for (i = 1; i < n; i++)
for (j = 0; j < n; j++)
a[i][j]=a[i+1][j];
}
void xuatfile() {

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


Trang 21


Bài tập C++ – Tập 2 / 2
FILE* fo = fopen("MT03KQ.txt", "wt"); // wt = write + text (dạng văn
bản)
for (i = 0; i < n-1; i++) {
for (j = 0; j < n; j++) fprintf(fo, "%4d", a[i][j]);
fprintf(fo, "\n");
}
fclose(fo);
}
int main()
{
docfile();
inmatran(n, n);
xoadong2();
inmatran(n-1, n);
xuatfile();
return 0;
}

14.05. Nhập vào ma trận vuông (n>=3), xoá cột 1 của ma trận
MT04.txt
3
123
456
789


MT04KQ.txt
23
56
89

14.06. Nhập vào ma trận vuông (n>=3) và số k (k<=n), xoá cột k của ma trận
MT05.txt
3
2
123
456
789

MT05KQ.txt
13
46
79

#include <stdio.h>
int n, k, i, j, a[20][20];
void docfile() {
FILE* fi = fopen("MT05.txt", "rt"); // Tên file MT5.txt; rt = read+text
if(fi==NULL) {
printf("File khong ton tai\n");
return;
}
// Đọc dữ liệu
fscanf(fi, "%d", &n); // Đọc số hàng/ cột từ file
fscanf(fi, "%d", &k); // Đọc cột định xóa từ file
for (i = 0; i < n; i++) {


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

Trang 22


Bài tập C++ – Tập 2 / 2
for (j = 0; j < n; j++)
fscanf(fi,"%d", &a[i][j]);
printf("\n");
}
// Đóng file
fclose (fi);
}
void inmatran(int
int i, j;
printf("Ma tran
for (i = 0; i <
for (j = 0; j
printf("\n");
}
}

sd, int sc) {
doc tu file\n");
sd; i++) {
< sc; j++) printf("%4d", a[i][j]);

void xoacotk(int k) {
for (j = k-1; j < n; j++)

for (i = 0; i < n; i++) a[i][j]=a[i][j+1];
}
void xuatfile() {
FILE* fo = fopen("MT05KQ.txt", "wt"); // wt=write + text (dạng văn bản)
for (i = 0; i < n; i++) {
for (j = 0; j < n-1; j++) fprintf(fo, "%4d", a[i][j]);
fprintf(fo, "\n");
}
fclose(fo);
}
int main()
{
docfile();
inmatran(n, n);
xoacotk(k);
inmatran(n, n-1);
xuatfile();
return 0;
}

Các bài ôn tập – Phần 4
15.01. Viết chương trình thao tác trên ma trận vuông với các yêu cầu:
a. Nhập xuất ma trận vuông.
b. Tính tổng các phần tử trên đường chéo chính.
c. Kiểm tra tính đối xứng của ma trận vuông qua đường chéo chính.
TD :
Biên soạn: Th.s Nguyễn Anh Việt

Trang 23



Bài tập C++ – Tập 2 / 2
MT06.txt
3
123
247
379

MT06KQ.txt
14
Ma tran doi
xung

MT06.txt
3
123
248
379

MT06KQ.txt
14
Ma tran
khong doi
xung

#include <stdio.h>
int n, i, j, tong_dcc, a[20][20];
void docfile() {
FILE* fi = fopen("MT06.txt", "rt"); // Tên file MT01.txt; rt=read+text
if(fi==NULL) {

printf("File khong ton tai\n");
return;
}
// Đọc dữ liệu
fscanf(fi, "%d", &n); // Đọc số hàng/ cột từ file
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
fscanf(fi,"%d", &a[i][j]);
printf("\n");
}
fclose (fi); // Đóng file
}
void inmatran(int
int i, j;
printf("Ma tran
for (i = 0; i <
for (j = 0; j
printf("\n");
}
}

sd, int sc) {
doc tu file\n");
sd; i++) {
< sc; j++) printf("%4d", a[i][j]);

int tongdcc() {
tong_dcc=0;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) if (i==j) tong_dcc+=a[i][j];

return tong_dcc;
}
void xuatfile() {
FILE* fo = fopen("MT06KQ.txt", "wt"); // wt=write+text (dạng văn bản)

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

Trang 24


Bài tập C++ – Tập 2 / 2
fprintf(fo, "%d\n", tongdcc());
if (doixung()==1) fprintf(fo, "Ma tran doi xung");
else fprintf(fo, "Ma tran khong doi xung");
fclose(fo);
}
int doixung() {
int dx=1;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i!=j && a[i][j]!=a[j][i]) dx=0;
return dx;
}
int main()
{
docfile();
inmatran(n, n);
xuatfile();
return 0;
}


15.02. Ma trận xoắn ốc được tạo thành bằng cách điền số 1 vào hàng 1 cột 1, sau đó điền số tăng dần
theo chiều kim đồng hồ
1
16
15
14
13

2
17
24
23
12

3
18
25
22
11

4
19
20
21
10

5
6
7

8
9

Hãy viết chương trình cho biết giá trị tại ô (x, y) của 1 ma trận xoáy ốc vuông kích thước n x n
MT07.txt MT07KQ.txt
5
18
2
15
23
31
#include <stdio.h>
#include <stdlib.h>
int n, k, i, j, dong, dongcu, cot, cotcu, a[20][20], dongtv[30],
cottv[30];
char *huong;
void docfile() {
FILE* fi = fopen("MT07.txt", "rt"); // File MT07.txt; rt = read + text

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

Trang 25


×