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
Bài tập C++ – Tập / Biến có cấu trúc - Struct TD: Mỗi điểm hình học chiều có toạ độ (x, y) Khai báo biến C hay C++ sau: struct Diem{ int x, y; }; Bài tập 09.01 – Tìm độ dài đoạn thẳng AB: Độ dài đoạn thẳng AB với điểm A có toạ độ xA, yA điểm B có toạ độ xB, yB tính sau: ̅̅̅̅ 𝐴𝐵 = √(𝑥𝐴 − 𝑥𝐵 )2 + (𝑦𝐴 − 𝑦𝐵 )2 #include #include struct Diem{ int x, y; }; int main() { float dodai; struct Diem A; struct Diem B; printf("Ban hay nhap toa cua diem thu nhat "); scanf("%d %d", &A.x, &A.y); printf("Ban hay nhap toa 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 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 đoạn thẳng AB: Toạ độ trung điểm I đoạn thẳng AB xI, yI tính sau: xI = (𝑥𝐴 +𝑥𝐵 ) yI = (𝑦𝐴 +𝑦𝐵 ) Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập C++ – Tập / #include #include struct Diem{ float x, y; }; // tọa độ 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 cua diem thu nhat "); scanf("%f %f", &A.x, &A.y); printf("Ban hay nhap toa 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 học sinh * In danh sách học sinh có Điểm TB >= * In danh sách học sinh có Điểm TB < (tự làm bài) * In danh sách học sinh có điểm TB cao * In danh sách học sinh có điểm TB thấp (tự làm bài) #include #include #include 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 Bài tập C++ – Tập / void Nhap_DS() { printf("Danh sach co bao nhieu hoc sinh "); scanf("%d", &n); for (i=0; i=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 sau: TD: Đổi số 137 => Đem chia kết phép chia lấy ngược số dư 137 68 34 17 2 1 Kết 137 10 = 10001001 #include #include int main() { int n, k; char CNP[21]; strcpy(CNP, ""); printf("Hay nhap so can doi tu he 10 sang he "); scanf("%d", &n); k = n; while (k>0) { if (k % == 0) strcat(CNP, "0"); else strcat(CNP, "1"); k = k / 2; } strrev(CNP); // Đảo ngược chuổi printf("So %d he 10 doi sang he la %s", n, CNP); Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập C++ – Tập / 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 sau: TD: Đổi số 249 => Đem chia cho 16 đến kết phép chia lấy ngược số dư Chú ý số dư từ 10 đến 15 chuyển đổi thành A đến F 249 9 16 15 15 F 16 Kết 249 10 = F9 16 #include #include 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 he 10 doi sang he 16 la %s", n, CTLP); Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập C++ – Tập / return 0; } Bài tập 10.03 – Đổi số thập phân thành số theo hệ m (m từ đến 16): #include #include 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 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 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 Bài tập C++ – Tập / Để đổi số nhị phân thành số thập phân ta thực sau: TD: Đổi số 10001001 Tính luỹ thừa = 27 128 26 64 25 32 Nhân tương ứng với giá trị luỹ thừa Cộng giá trị lại 128 0 24 16 23 8 128 + + = 137 22 21 20 1 0 Kết 10001001 = 137 10 #include #include int main() { int So, i; long LT, STP=0; char CNP[21]; printf("Hay nhap chuoi can doi tu he 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 he doi sang he 10 la %d", CNP, STP); return 0; } Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập C++ – Tập / 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 sau: Tính luỹ thừa 16 = Các giá trị A, B, …, F => 10, 11, … , 15 Nhân tương ứng với giá trị luỹ thừa Cộng giá trị lại 16 16 16 F 15 240 240 + = 249 Kết F9 16 = 249 10 #include 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 ký tự 'x'/ nhiều "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 Bài tập C++ – Tập / if (err==0) printf("Chuoi %s he 16 doi sang he 10 la %d", CTLP, STP); else printf("Chuoi %s khong la chuoi he 16 (0 va A F)", CTLP); return 0; } Bài tập 11.03 – Đổi chuổi số theo hệ m (m từ đến 16) thành số thập phân: #include 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 Bài tập C++ – Tập / if (err==0) printf("Chuoi %s he %d doi sang he 10 la %d", CTLP, m, STP); else printf("Chuoi %s khong la chuoi he %d", CTLP, m); return 0; } Các 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 bó Hỏi số trâu số cỏ ? int main() { int dung, nam, gia; for (dung=1; dung