1. Trang chủ
  2. » Giáo án - Bài giảng

■ 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)

39 373 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 39
Dung lượng 912,19 KB

Nội dung

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 1

Biê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 2

Biê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 3

Biê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 4

Biê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 5

Biê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 6

Biê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 7

Biê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 8

Biê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 9

Biê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 10

Biê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 11

Biê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 12

Biê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 13

Biê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 14

Biê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 15

Biê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 16

Biê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 17

Biê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 18

Biê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 19

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

Trang 20

Biê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 21

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

Trang 22

Biê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 23

Biê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 24

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

Trang 25

Biê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 26

Biê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 27

Biê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

Ngày đăng: 02/10/2017, 23:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w