Bài tập

Viết lịch trình C++ để cộng hai phân số và hiển thị kết quả. Chương trình của các bạn sẽ nhắc người tiêu dùng nhập phân tiên phong hàng đầu và phân số 2. Tử số và chủng loại số được nhập một cách riêng rẽ bởi khoảng tầm trống, như bên dưới đây:

Nhap phan so 1 (tuso mauso): 1 2

Nhap phan so 1 (tuso mauso): 2 5

Ket qua: 9/10

Lời giải

Dưới đây là chương trình C++ để giải bài bác tập trên. Các bạn sẽ cần áp dụng một structure trong C++ để định nghĩa một phân số. Structure này còn có hai member là tuso và mauso.

Bạn đang xem: Bài tập struct trong c/c++ có lời giải

#include #include using namespace std; struct Phanso int tuso; int mauso; ; Phanso sum(Phanso,Phanso); int main() int tuso1,mauso1,tuso2,mauso2; cout"Nhap phan so thu nhat: tu so va mau so la: "; cin>>tuso1>>mauso1; cout"Nhap phan so thu hai : tu so va mau so la: "; cin>>tuso2>>mauso2; Phanso f1=tuso1, mauso1;/* 50% */ Phanso f2 =tuso2, mauso2;/* 2/5 */ Phanso ketqua = sum(f1, f2);//phep cong phan so coutketqua.tuso"/"ketqua.mauso; //hien thi ket qua return 0; Phanso sum(Phanso f1, Phanso f2) Phanso ketqua=(f1.tuso * f2.mauso) + (f2.tuso * f1.mauso), f1.mauso * f2.mauso; return ketqua; Chạy chương trình C++ trên vẫn cho tác dụng như hình sau:

*

2. Bài xích tập

Viết lịch trình C++ để giữ các phiên bản ghi và tiến hành các trình đối chiếu thống kê cho 1 lớp gồm trăng tròn sinh viên. Thông tin của từng sinh viên gồm id, tên, tuổi, điểm đánh giá (hai điểm bình chọn mỗi kỳ), điểm chăm cần, điểm thi giữa kỳ, điểm thi cuối kỳ, cùng tổng điểm.

Chương trình của bạn sẽ nhắc người dùng lựa chọn những hành động có thể thực hiện trên các bạn dạng ghi tự menu tất cả dạng sau:

==========================================================

MENU==========================================================

1. Them ban ghi sinh vien

2. Xoa ban ghi sinh vien

3. Cap nhat ban ghi sinh vien

4. Quan liêu sat tat ca ban ghi sinh vien

5. Tinh diem trung binh cua mot sinh vien domain authority chon

6. Hien thi sinh vien co tong diem cao nhat

7. Hien thi sinh vien teo tong diem thap nhat

8. Tim sinh vien boi ID

9. Sap xep cac ban ghi boi tong diem thi cua sinh vien

Nhap lua chon cua ban: 1

Ghi chú: toàn bộ các bản ghi được tàng trữ trong một mảng.

Lời giải

Dưới đây là chương trình C++ nhằm giải bài xích tập trên. Đây là 1 trong bài tập béo và phức tạp, vì chưng đó cửa hàng chúng tôi chia giải thuật thành các phần bé dại và giải thích chi tiết từng phần một sẽ giúp bạn dễ dàng theo dõi và hiểu nhanh hơn. Chúng ta theo dõi các bước sau:

Bước 1: Khai báo một Structure

Khai báo một Structure call là sinhvien để lưu trữ các bạn dạng ghi. Structure này có 9 thành viên, kia là:

mssv(string) để lưu trữ id của sinh viêntensv(mảng ký tự) để lưu trữ tên sinh viênsex(char) để tàng trữ giới tínhdiemkt1(float) để lưu trữ điểm soát sổ đầu tiêndiemkt2(float) để tàng trữ điểm bình chọn thứ haidiemcc(float) để tàng trữ điểm chăm cầndiemgk(float) để lưu trữ điểm thi giữa kỳdiemck(float) để tàng trữ điểm thi cuối kỳtongdiem(float) để lưu trữ tổng điểm

Dưới đấy là code cho cách 1:

typedef struct sinhvienstring mssv;char tensv<20>;char sex;float diemkt1;float diemkt2;float diemcc;float diemgk;float diemck;float tongdiem;;

Bước 2: Hiển thị menu

Định nghĩa phương thức displaymenu() để hiển thị menu. Menu dễ dàng này hỗ trợ 9 lựa chọn từ là một tới 9 để gia công việc với các bản ghi.

Dưới đấy là code cho bước 2:

//Xay dung menuvoid displaymenu()cout"=========================================== ";cout menu " ";cout===========================================" ";cout 1. Them ban ghi sinh vien" ";cout 2. Xoa ban ghi sinh vien" ";cout 3. Cap nhat ban ghi sinh vien" ";cout 4. Quan tiền sat tat ca ban ghi sinh vien" ";cout 5. Tinh diem trung binh cua mot sinh vien da chon" ";cout 6. Hien thi sinh vien co tong diem cao nhat" ";cout 7. Hien thi sinh vien teo tong diem thap nhat" "; cout 8. Tim sinh vien boi ID" "; cout 9. Sap xep cac ban ghi boi tong diem thi cua sinh vien" "; Bạn quay trở lại trang cha để mày mò tiếp những bước.

Bước 3: Thêm bạn dạng ghi new tới danh sách

Định nghĩa hàm them_banghi(struct sinhvien<> st, int& biendem) để thêm một bản ghi new vào mảng các đối tượng sinh viên. Phương thức này dìm hai tham số: tham số trước tiên là mảng các đối tượng người sử dụng sinh viên st với tham số vật dụng hai là số thành tựu trong mảng. Đầu tiên hàm này kiểm soát xem đó gồm là phiên bản ghi mới không (sử dụng hàm tìm kiếm được định nghĩa trong bước tiếp theo) trước khi cho phép phiên bản ghi đó được phụ cung ứng mảng để tránh xuất hiện thêm các bản sao. Khi item bắt đầu được nhập thì cực hiếm của vươn lên là biendem tăng lên 1, nghĩa là số bạn dạng ghi trong danh sách tăng lên.

Dưới đó là code cho cách 3:

void them_banghi(struct sinhvien st<>,int& biendem)again:cout" Nhap ID cua sinh vien: ";cin>>st.mssv;if(search(st,st.mssv,biendem)!=-1)cout"ID nay da ton tai ";goto again;cout"Nhap ten sinh vien: "; cin>>st.stname;cout"Nhap gioi tinh cua sinh vien (F hoac M):";cin>>st.sex;cout"Nhap diem kiem tra 1: ";cin>>st.diemkt1;cout"Nhap diem kiem tra 2: ";cin>>st.diemkt2;cout"Nhap diem chuyen can: ";cin>>st.diemcc;cout"Nhap diem thi giua ky: ";cin>>st.diemgk;cout"Nhap diem thi cuoi ky: ";cin>>st.diemck;st.tongdiem=st.diemkt1+st.diemkt2+st.diemcc+st.diemgk+st.diemck;++biendem;

Bước 4: tìm kiếm vị trí bản ghi

Định nghĩa hàm search(struct sinhvien st<>, strng id, int biendem) để tra cứu kiếm chỉ mục của bạn dạng ghi làm sao đó. Phuong thức này là có lợi khi bọn họ cần tìm vị trí của bạn dạng ghi vào mảng các đối tượng sinh viên. Nếu tìm thấy, cách thức trả về chỉ mục của phần tử đó, cùng nếu không tìm kiếm thấy thì trả về -1.

Dưới đấy là code cho cách 4:

int search(struct sinhvien st<>, string id,int biendem) int found =-1;for (int i = 0; i biendem && found==-1; i++)if (st.mssv == id) found=i;else found=-1 ;return found;

Bước 5: Quan sát các phiên bản ghi

Định nghĩa phương thức viewall(sinhvien st<>, int biendem) để hiển thị list các bạn dạng ghi vào tập hợp. Để hiển thị list các bạn dạng ghi, họ cần một vòng lặp WHILE để “vọc” mảng các đối tượng người tiêu dùng sinh viên này.

Dưới đó là code cho cách 5:

//ham de quan liêu sat tat ca cac ban ghivoid viewall(struct sinhvien st<>, int biendem) int i=0; coutleftsetw(5)"ID"setw(20)"TEN"setw(5)"GIOITINH" setw(5)"DKT1" setw(5)"DKT2"setw(5)"DCC"setw(5)"DGK"setw(5)"DCK" setw(5)"TONG"" "; cout"========================================== "; while(ibiendem) if(st.mssv!="") coutleftsetw(5)st.mssvsetw(20)st.tensvsetw(5) st.sex; coutsetw(5)st.diemkt1setw(5)st.diemkt2setw(5)st.diemcc setw(5)st.diemgksetw(5)st. Diemcksetw(5) st.tongdiem; cout" "; i=i+1;

Bước 6: Xóa bản ghi

Định nghĩa phương thức delete(struct sinhvien st<>, int& biendem) để xóa một bản ghi rõ ràng từ mảng các đối tượng người sử dụng sinh viên. Người dùng sẽ được kể id của sinh viên mà người ta muốn xóa. Sau đó, id này sẽ được kiểm tra lại để bảo đảm rằng sẽ không thể tồn tại trong danh sách.

Hoạt rượu cồn xóa bắt đầu bằng việc kiểm tra xem phiên bản ghi đó là bạn dạng ghi cuối cùng, ngơi nghỉ đầu hoặc trọng điểm trong dánh sách. Nếu là phiên bản ghi cuối cùng, họ xóa bản ghi đó bởi việc hỗ trợ nó cho tới phương thức clean(struct sinhvien st<>, int index). Phiên bản ghi ở đầu cuối là bản ghi có chỉ mục bằng biendem – 1. Ví như là phiên bản ghi ở đầu hoặc chính giữa danh sách, họ cần áp dụng một vòng lặp. Sau khi phần tử bị xóa, biến chuyển biendem sút 1, tức là số bộ phận trong danh sách giảm.

Dưới đây là code cho bước 6:

void xoa_banghi(struct sinhvien st<>, int& biendem) string id; int index; if (biendem > 0) cout"Nhap ID cua sinh vien:"; cin>>id; index = search(st, id,biendem); if (index!=-1) if (index == (biendem-1)) //xoa ban ghi cuoi cung clean(st, index); --biendem; cout"Ban ghi da bi xoa. "; else //xoa ban ghi dau tien hoac o giua for (int i = index; i biendem-1; i++) st = st; clean(st, biendem); --biendem ; else cout"Ban ghi khong ton tai. Kiem tra ID va thu lai. "; else cout"Khong teo ban ghi nao bi xoa "; void clean(struct sinhvien st<>,int index)st.mssv ="";strcpy(st.tensv,"");st.sex =NULL;st.diemkt1 = 0;st.diemkt2 = 0;st.diemcc = 0;st.diemgk = 0;st.diemck = 0;st.tongdiem = 0;

Bước 7: Cập nhật bản ghi

Định nghĩa phương thức update(struct sinhvien st<>, int biendem) để cập nhật một bạn dạng ghi vắt thể. Các bước cập nhật bắt đầu với vấn đề hỏi người dùng làm nhập id của phiên bản ghi yêu cầu thay đổi. Quý giá id này được kiểm tra xem nó có tồn tại xuất xắc không. Trường hợp tồn tại, việc biến hóa diễn ra sau khi hỏi người dùng nhập giá bán trị mới vào các trường yêu cầu thay đổi.

Dưới đấy là code cho cách 7:

void capnhat_banghi(struct sinhvien st<>,int biendem) string id; int column_index; cout"Nhap ID cua sinh vien: "; cin>>id; cout"Ban muon cap nhat truong nao (1-7) ?: "; cin>>column_index; int index = search(st, id,biendem); if (index != -1) if (column_index == 1) cout"Nhap ten sinh vien: "; cin>>st.tensv; else if (column_index == 2) cout"Nhap gioi tinh (F hoac M): "; cin>>st.sex; else if (column_index == 3) cout"Nhap diem kiem tra 1: "; cin>>st.diemkt1; else if (column_index == 4) cout"Nhap diem kiem tra 2: "; cin>>st.diemkt2; else if (column_index == 5) cout"Nhap diem chuyen can: "; cin>>st.diemcc; else if (column_index == 6) cout"Nhap diem thi giua ky: "; cin>>st.diemgk; else if (column_index == 7) cout"Nhap diem thi cuoi ky: "; cin>>st.diemck; else cout"Gia tri bỏ ra muc khong hop le"; st.tongdiem = st.diemkt1 + st.diemkt2 + st.diemcc + st.diemgk + st.diemck; else cout"Ban ghi khong ton tai. Kiem tra ID va thu lai.";

Bước 8: Tính điểm trung bình

Định nghĩa phương thức average(sinhvien<> st, int biendem) để tính điểm mức độ vừa phải của sinh viên vẫn chọn. Thủ tục này cũng hỏi người dùng nhập id của sinh viên buộc phải tính. ID này được soát sổ xem tất cả tồn tại giỏi không. Điểm vừa phải được tính dễ dàng bằng câu hỏi cộng những điểm và sau đó chia cho 5.

Dưới đấy là code cho cách 8:

void average(struct sinhvien st<>, int biendem) string id; float avg=0; cout"Nhap ID cua sinh vien:"; cin>>id; int index = search(st, id,biendem); if (index != -1 && biendem>0) st.tongdiem = st.diemkt1 + st.diemkt2 + st.diemcc + st.diemgk + st.diemck; avg = st.tongdiem /5; cout"Diem trung binh la "avg;

Bước 9: kiếm tìm điểm thi lớn nhất, bé dại nhất

Định nghĩa phương thức showmax(struct sinhvien st<>, int biendem) và phương thức showmin(struct sinhvien st<>, int biendem) để hiển thị sinh viên gồm điểm thi lớn nhất và nhỏ tuổi nhất. Để tìm tổng điểm lớn nhất và nhỏ tuổi nhất, họ cần đối chiếu tổng điểm của những sinh viên.

Dưới đây là code cho bước 9:

void showmax(struct sinhvien st<>, int biendem) float max = st<0>.tongdiem; int index=0; if (biendem >= 2) for (int j = 0; j biendem-1; ++j) if (max st.tongdiem) max = st.tongdiem; index = j+1; else if (biendem == 1) index = 0; max = st<0>.tongdiem; else cout"Khong tim chũm ban ghi nao! "; if (index != -1) cout"Sinh vien co ID la "st.mssv" dat tong diem cao nhat la "maxendl; void showmin(struct sinhvien st<>, int biendem) float min = st<0>.tongdiem; int index = 0; if (biendem >= 2) for (int j = 0; j biendem-1; ++j) if (min > st.tongdiem) min = st.tongdiem; index = j+1; else if (biendem == 1) index = 0; min = st<0>.tongdiem; else cout"Khong tim chũm ban ghi nao! "; if (index != -1) cout"Sinh vien voi ID la "st.mssv" co tong diem thap nhat la "minendl;

Bước 10: Tìm bản ghi vào danh sách

Dưới đây là code cho bước 10:

void find(struct sinhvien st<>, int biendem) string id; cout"Nhap ID cua sinh vien: "; cin>>id; int index=search(st,id,biendem); if (index != -1) //Hien thi ban ghi domain authority tim cố kỉnh coutleftsetw(5)st.mssvsetw(20)st.tensvsetw(5)st.sex; coutsetw(5)st.diemkt1setw(5)st.diemkt2setw(5)st.diemccsetw(5)st.diemgksetw(5)st.diemcksetw(5)st.tongdiem; cout" "; else cout"Ban ghi khong ton tai."; Bạn quay trở về trang thân phụ để tò mò tiếp các bước.

Bước 11: thu xếp các bạn dạng ghi

Định nghĩa hàm để bố trí các phiên bản ghi theo máy tự tổng điểm thi tăng dần. Bọn họ sử dụng thuật toán bố trí nổi bong bóng (bubble sort).

Xem thêm: Mã Ngành Đại Học Kinh Tế Quốc Dân Năm 2021, Trường Đại Học Kinh Tế Quốc Dân

Dưới đây là code cho bước 11:

void bubblesort(struct sinhvien dataset<>, int n) int i, j; for (i = 0; i n; i++) for (j = n - 1; j > i; j--) if (dataset.tongdiem dataset.tongdiem ) sinhvien temp = dataset; dataset = dataset; dataset = temp;

Bước 12: phối hợp code của quá trình trên

Sau khi đang theo dõi quá trình từ 1 tới 11, đến giờ bạn đã gọi lời giải cũng tương tự đã khá thành thục cùng với Structure và các khái niệm có liên quan trong bài bác như vòng lặp, lệnh IF-ELSE, có mang hàm, phương thức, cách thực hiện mảng, … Bây giờ, kết hợp công việc trên để có lời giải hoàn chỉnh.

#include #include #include #include using namespace std;//khai bao sinhvien structuretypedef struct sinhvienstring mssv;char tensv<20>;char sex;float diemkt1;float diemkt2;float diemcc;float diemgk;float diemck;float tongdiem;int soItem;;//cac nguyen mau mê say (function prototype)int search(struct sinhvien st<>,string id, int biendem);void clean(struct sinhvien st<>,int deleteitem);//ham de hien thi menu mặc dù chonvoid displaymenu()cout"=========================================="" ";cout" thực đơn "" ";cout"=========================================="" ";cout" 1. Them ban ghi sinh vien"" ";cout" 2. Xoa ban ghi sinh vien"" ";cout" 3. Cap nhat ban ghi sinh vien"" ";cout" 4. Quan sat tat ca ban ghi sinh vien"" ";cout" 5. Tinh diem trung binh cua sinh vien da chon"" ";cout" 6. Hien thi sinh vien co tong diem cao nhat"" ";cout" 7. Hien thi sinh vien teo tong diem thap nhat"" "; cout" 8. Tim sinh vien boi ID"" "; cout" 9. Sap xep cac ban ghi boi tong diem"" "; //ham de them cac ban ghivoid them_banghi(struct sinhvien st<>,int& biendem)again:cout" Nhap ID cua sinh vien: ";cin>>st.mssv;if(search(st,st.mssv,biendem)!=-1)cout"ID nay domain authority ton tai ";goto again;cout"Nhap ten sinh vien: "; cin>>st.tensv;cout"Nhap gioi tinh cua sinh vien (F hoac M): ";cin>>st.sex;cout"Nhap diem kiem tra 1: ";cin>>st.diemkt1;cout"Nhap diem kiem tra 2: ";cin>>st.diemkt2;cout"Nhap diem chuyen can: ";cin>>st.diemcc;cout"Nhap diem giua ky: ";cin>>st.diemgk;cout"Nhap diem cuoi ky: ";cin>>st.diemck;st.tongdiem=st.diemkt1+st.diemkt2+st.diemcc+st.diemgk+st.diemck;++biendem;//ham de tim vi tri ban ghiint search(struct sinhvien st<>, string id,int biendem)int found =-1;for (int i = 0; i biendem && found==-1; i++)if (st.mssv == id) found=i;else found=-1 ;return found;//ham de quan liêu sat tat ca ban ghivoid viewall(struct sinhvien st<>, int biendem)int i=0;coutleftsetw(5)"ID"setw(20)"TEN"setw(5)"GIOI TINH"setw(5)"DKT1"setw(5)"DKT2"setw(5)"DCC"setw(5)"DGK"setw(5)"DCK"setw(5)"TONG"" ";cout"============================================== ";while(ibiendem)if(st.mssv!="")coutleftsetw(5)st.mssvsetw(20)st.tensvsetw(5)st.sex;coutsetw(5)st.diemkt1setw(5)st.diemkt2setw(5)st.diemccsetw(5)st.diemgksetw(5)st. Diemcksetw(5)st.tongdiem;cout" ";i=i+1;//ham de xoa ban ghi void xoa_banghi(struct sinhvien st<>, int& biendem)string id;int index;if (biendem > 0)cout"Nhap ID cua sinh vien: ";cin>>id;index = search(st, id,biendem); if ((index!=-1) && (biendem != 0))if (index == (biendem-1)) //Xoa ban ghi cuoi cungclean(st, index);--biendem;cout"Ban ghi da duoc xoa. ";else //xoa ban ghi dau tien hoac o giuafor (int i = index; i biendem-1; i++)st = st;clean(st, biendem);--biendem ;else cout"Ban ghi khong ton tai. Kiem tra ID va thu lai. ";else cout"Khong teo ban ghi nao duoc xoa ";//ham de xoa sach ban ghi da bi xoavoid clean(struct sinhvien st<>,int index)st.mssv ="";strcpy(st.tensv,"");st.sex =NULL;st.diemkt1 = 0;st.diemkt2 = 0;st.diemcc = 0;st.diemgk = 0;st.diemck = 0;st.tongdiem = 0;//ham de cap nhat ban ghivoid capnhat_banghi(struct sinhvien st<>,int biendem)string id;int column_index;cout"Nhap ID cua sinh vien: ";cin>>id;cout"Ban muon cap nhat truong nao (1-7) ?: ";cin>>column_index;int index = search(st, id,biendem);if (index != -1)if (column_index == 1)cout"Nhap ten sinh vien: ";cin>>st.tensv;else if (column_index == 2)cout"Nhap gioi tinh sinh vien (F hoac M): ";cin>>st.sex;else if (column_index == 3)cout"Nhap diem kiem tra 1: ";cin>>st.diemkt1;else if (column_index == 4)cout"Nhap diem kiem tra 2: ";cin>>st.diemkt2;else if (column_index == 5)cout"Nhap diem chuyen can: ";cin>>st.diemcc;else if (column_index == 6)cout"Nhap diem thi giua ky: ";cin>>st.diemgk;else if (column_index == 7)cout"Nhap diem thi cuoi ky: ";cin>>st.diemck;else cout"Gia tri bỏ ra muc khong hop le";st.tongdiem = st.diemkt1 + st.diemkt2 + st.diemcc+ st.diemgk + st.diemck;else cout"Ban ghi khong ton tai. Kiem tra ID va thu lai.";//Ham de hien thi tong diem lon nhat void showmax(struct sinhvien st<>, int biendem)float max = st<0>.tongdiem;int index=0;if (biendem >= 2)for (int j = 0; j biendem-1; ++j)if (max st.tongdiem) max = st.tongdiem;index = j+1;else if (biendem == 1)index = 0;max = st<0>.tongdiem;else cout"Khong tim gắng ban ghi nao! ";if (index != -1) cout"Sinh vien co ID la "st.mssv" dat tong diem cao nhat la "maxendl;//ham de hien thi tong diem nho nhatvoid showmin(struct sinhvien st<>, int biendem)float min = st<0>.tongdiem;int index = 0;if (biendem >= 2)for (int j = 0; j biendem-1; ++j)if (min > st.tongdiem)min = st.tongdiem;index = j+1;else if (biendem == 1)index = 0;min = st<0>.tongdiem;else cout"Khong tim thay ban ghi nao! ";if (index != -1) cout"Sinh vien co ID la "st.mssv" teo tong diem thap nhat la "minendl;//ham de tim ban ghivoid find(struct sinhvien st<>, int biendem)string id;cout"Nhap ID cua sinh vien: ";cin>>id;int index=search(st,id,biendem);if (index != -1) //hien thi ban ghi da tim thaycoutleftsetw(5)st.mssvsetw(20)st.tensvsetw(5)st.sex;coutsetw(5)st.diemkt1setw(5)st.diemkt2setw(5)st.diemccsetw(5)st.diemgksetw(5)st.diemcksetw(5)st.tongdiem;cout" "; else cout"Ban ghi khong ton tai.";//ham de sap xep cac ban ghi theo tong diemvoid bubblesort(struct sinhvien dataset<>, int n)int i, j;for (i = 0; i n; i++)for (j = n - 1; j > i; j--)if (dataset.tongdiem dataset.tongdiem )sinhvien temp = dataset;dataset = dataset;dataset = temp;//ham de tinh diem trung binh cua mot sinh vienvoid average(struct sinhvien st<>, int biendem)string id;float avg=0;cout"Nhap ID cua sinh vien: ";cin>>id;int index = search(st, id,biendem);if (index != -1 && biendem>0)st.tongdiem = st.diemkt1 + st.diemkt2 + st.diemcc+ st.diemgk + st.diemck;avg = st.tongdiem /5;cout"Diem trung binh la "avg;//ham main int main(int argc, char *argv<>)confirm=="Y");return 0;Chạy lịch trình C++ trên sẽ cho công dụng như hình sau: