Phần 09 ■ Biến có cấu trúcPhần 10 ■ BT nâng cao phần 3Phần 11 ■ BT nâng cao phần 4Phần 12 ■ BT ôn tập phần 1Phần 13 ■ BT ôn tập phần 2Phần 14 ■ BT ôn tập phần 3Phần 15 ■ BT ôn tập phần 4Phần 16 ■ BT ôn tập phần 5
Trang 1Biên soạn: Th.s Nguyễn Anh Việt Trang 1
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: 𝐴𝐵
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 và yI = (𝑦𝐴+𝑦𝐵)
2
Trang 2Biên soạn: Th.s Nguyễn Anh Việt Trang 2
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)
Trang 3Biên soạn: Th.s Nguyễn Anh Việt Trang 3
void Nhap_DS() {
printf("Danh sach co bao nhieu hoc sinh ");
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("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<n; i++)
void Sap_TT () { // Sắp thứ tự điểm tăng dần
for (i=0; i< n-1; i++)
for (j=i+1; j<n; j++)
if (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); // Hoán chuyển Tên
strcpy(HS[i].Ten, HS[j].Ten);
float DiemMax=HS[0].DiemTB;
for (i=0; i< n-1; i++)
if (DiemMax<HS[i].DiemTB) DiemMax=HS[i].DiemTB;
return DiemMax;
}
int main()
Trang 4Biên soạn: Th.s Nguyễn Anh Việt Trang 4
{
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ư
strrev(CNP); // Đảo ngược chuổi
printf("So %d trong he 10 doi sang he 2 la %s", n, CNP);
Trang 5Biên soạn: Th.s Nguyễn Anh Việt Trang 5
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
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);
Trang 6Biên soạn: Th.s Nguyễn Anh Việt Trang 6
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;
Trang 7Biên soạn: Th.s Nguyễn Anh Việt Trang 7
Để đổi số nhị phân thành số thập phân ta thực hiện như sau:
Trang 8Biên soạn: Th.s Nguyễn Anh Việt Trang 8
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 16 1 16 0
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;
Trang 9Biên soạn: Th.s Nguyễn Anh Việt Trang 9
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;
Trang 10Biên soạn: Th.s Nguyễn Anh Việt Trang 10
Trăm trâu trăm cỏ
Trâu đứng ăn năm
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 ?
Trang 11Biên soạn: Th.s Nguyễn Anh Việt Trang 11
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;
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.0 2 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
Trang 12Biên soạn: Th.s Nguyễn Anh Việt Trang 12
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 ",
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
Trang 13Biên soạn: Th.s Nguyễn Anh Việt Trang 13
#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 (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, )
Trang 14Biên soạn: Th.s Nguyễn Anh Việt Trang 14
if (huong=="l") { // Hướng lên, dòng giảm ( , 3, 2, 1)
for (i=1; i<=n; i++) { // In ma trận xoắn ốc
for (j=1; j<=n; j++) printf("%4d", a[i][j]);
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
int nguyento(int x) {
int nguyentothuk(int k) {
int dem=0, i=2, nt;
Trang 15Biên soạn: Th.s Nguyễn Anh Việt Trang 15
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
Các số nguyên tố trong nửa ma trận trên là : 2 , , 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;
if (a<b+c && b<a+c && c<a+b) {
printf("Dien tich tam giac %.4f", dientich(a, b, c));
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
Trang 16Biên soạn: Th.s Nguyễn Anh Việt Trang 16
float dientich(int a, int b, int c) {
if (a<b+c && b<a+c && c<a+b) { // Tạo thành tam giác
if (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));
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:
Trang 17Biên soạn: Th.s Nguyễn Anh Việt Trang 17
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;
printf("Nhap vao toa do diem thu nhat ");
scanf("%d %d", &a.x, &a.y);
printf("Nhap vao toa do diem thu hai ");
scanf("%d %d", &b.x, &b.y);
printf("Nhap vao toa do diem thu ba ");
scanf("%d %d", &c.x, &c.y);
float x=dodai(a,b), y=dodai(b,c), z=dodai(a,c);
if (x<y+z && y<x+z && z<x+y)
printf("Ba diem tao thanh tam giac co dien tich la %.3f",
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
Trang 18Biên soạn: Th.s Nguyễn Anh Việt Trang 18
printf("\nMa tran da nhap:\n");
for (i=0; i<n; i++) {
for (j=0; j<n; j++) printf("%4d", a[i][j]);
printf("\nMa tran da xoa duong cheo chinh:\n");
for (i=0; i<n; i++) {
for (j=0; j<n-1; j++) printf("%4d", a[i][j]); // Còn n-1 cột
Trang 19Biên soạn: Th.s Nguyễn Anh Việt Trang 19
Trang 20Biên soạn: Th.s Nguyễn Anh Việt Trang 20
FILE* fi=fopen("MT02.txt", "rt"); // Tên file matran.txt; rt=read+text if(fi==NULL) {
printf("File khong ton tai\n");
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);
Trang 21Biên soạn: Th.s Nguyễn Anh Việt Trang 21
Trang 22Biên soạn: Th.s Nguyễn Anh Việt Trang 22
FILE* fo = fopen("MT03KQ.txt", "wt"); // wt = write + text (dạng văn
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++) {
Trang 23Biên soạn: Th.s Nguyễn Anh Việt Trang 23
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 :
Trang 24Biên soạn: Th.s Nguyễn Anh Việt Trang 24
Trang 25Biên soạn: Th.s Nguyễn Anh Việt Trang 25
fprintf(fo, "%d\n", tongdcc());
if (doixung()==1) fprintf(fo, "Ma tran doi xung");
else fprintf(fo, "Ma tran khong doi xung");
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ồ
Trang 26Biên soạn: Th.s Nguyễn Anh Việt Trang 26
if(fi==NULL) {
printf("File khong ton tai\n");
return;
}
fscanf(fi, "%d", &n); // Đọc số hàng/ cột từ file
fscanf(fi, "%d", &k); // Đọc số truy vấn từ file
for (i = 0; i < k; i++)
fscanf(fi,"%d %d", &dongtv[i], &cottv[i]);
fclose (fi); // Đóng file
for (i=1; i<=n*n; i++) {
a[dong][cot]=i; dongcu=dong; cotcu=cot;
Trang 27Biên soạn: Th.s Nguyễn Anh Việt Trang 27
for (i=1; i<=n; i++) {
for (j=1; j<=n; j++) printf("%4d", a[i][j]);
Chú ý khi xuất file dùng điều kiện
if ((i+1+j+1)%3 == 0) fprintf("%4d", a[i][j]);
15.04 Cho ma trận thực m x n , viết chương trình tính tổng bình phương của các phần tử nằm trên cột
có giá trị chẵn và trên hàng có giá trị lẻ
MT09.txt MT09KQ.tzt