Bài tập C++: Bài tập Struct trong C++

Bài tập

Viết chương trình C++ để cộng hai phân số và hiển thị kết quả. Chương trình của bạn sẽ nhắc người dùng nhập phân số 1 và phân số 2. Tử số và mẫu số được nhập một cách riêng rẽ bởi khoảng trống, như 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 tập trên. Bạn sẽ cần sử dụng một structure trong C++ để định nghĩa một phân số. Structure này có hai thành viên là tuso và mauso.

#include<iostream> 
#include<conio.h> 
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};/* 1/2 */ 
     Phanso f2 ={tuso2, mauso2};/* 2/5 */ 
     Phanso ketqua = sum(f1, f2);//phep cong phan so 
     cout<<ketqua.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 sẽ cho kết quả như hình sau:

Bài tập về Structure trong C++

2. Bài tập

Viết chương trình C++ để giữ các bản ghi và thực hiện các trình phân tích thống kê cho một lớp gồm 20 sinh viên. Thông tin của mỗi sinh viên gồm id, tên, tuổi, điểm kiểm tra (hai điểm kiểm tra mỗi kỳ), điểm chuyên cần, điểm thi giữa kỳ, điểm thi cuối kỳ, và tổng điểm.

Chương trình của bạn sẽ nhắc người dùng lựa chọn các hành động có thể thực hiện trên các bản ghi từ menu 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 sat tat ca ban ghi sinh vien

5. Tinh diem trung binh cua mot sinh vien da chon

6. Hien thi sinh vien co tong diem cao nhat

7. Hien thi sinh vien co 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ú: Tất cả các bản ghi được lưu trữ trong một mảng.

Lời giải

Dưới đây là chương trình C++ để giải bài tập trên. Đây là một bài tập lớn và phức tạp, do đó chúng tôi chia lời giải thành các phần nhỏ và giải thích chi tiết từng phần một để giúp bạn dễ dàng theo dõi và hiểu nhanh hơn. Bạn theo dõi các bước sau:

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

Khai báo một Structure gọi là sinhvien để lưu trữ các bản ghi. Structure này gồm 9 thành viên, đó là:

  • mssv(string) để lưu trữ id của sinh viên
  • tensv(mảng ký tự) để lưu trữ tên sinh viên
  • sex(char) để lưu trữ giới tính
  • diemkt1(float) để lưu trữ điểm kiểm tra đầu tiên
  • diemkt2(float) để lưu trữ điểm kiểm tra thứ hai
  • diemcc(float) để lưu trữ điểm chuyên cần
  • diemgk(float) để lưu trữ điểm thi giữa kỳ
  • diemck(float) để lưu trữ điểm thi cuối kỳ
  • tongdiem(float) để lưu trữ tổng điểm

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

typedef struct sinhvien
{

string 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 đơn giản này cung cấp 9 lựa chọn từ 1 tới 9 để làm việc với các bản ghi.

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

//Xay dung menu
void displaymenu(){
cout<<"===========================================<<"\n";
cout<<" MENU "<<"\n";
cout<<"==========================================="<<"\n";
cout<<" 1. Them ban ghi sinh vien"<<"\n";
cout<<" 2. Xoa ban ghi sinh vien"<<"\n";
cout<<" 3. Cap nhat ban ghi sinh vien"<<"\n";
cout<<" 4. Quan sat tat ca ban ghi sinh vien"<<"\n";
cout<<" 5. Tinh diem trung binh cua mot sinh vien da chon"<<"\n";
cout<<" 6. Hien thi sinh vien co tong diem cao nhat"<<"\n";
cout<<" 7. Hien thi sinh vien co tong diem thap nhat"<<"\n"; 
cout<<" 8. Tim sinh vien boi ID"<<"\n"; 
cout<<" 9. Sap xep cac ban ghi boi tong diem thi cua sinh vien"<<"\n"; 
}

Bạn trở lại trang cha để tìm hiểu tiếp các bước.

Bước 3: Thêm bản ghi mới tới danh sách

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

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

void them_banghi(struct sinhvien st[],int& biendem){

again:
cout<<"\nNhap ID cua sinh vien: ";
cin>>st[biendem].mssv;
if(search(st,st[biendem].mssv,biendem)!=-1){
cout<<"ID nay da ton tai\n";goto again;
}

cout<<"Nhap ten sinh vien: "; 
cin>>st[biendem].stname;
cout<<"Nhap gioi tinh cua sinh vien (F hoac M):";cin>>st[biendem].sex;
cout<<"Nhap diem kiem tra 1: ";cin>>st[biendem].diemkt1;
cout<<"Nhap diem kiem tra 2: ";cin>>st[biendem].diemkt2;
cout<<"Nhap diem chuyen can: ";cin>>st[biendem].diemcc;
cout<<"Nhap diem thi giua ky: ";cin>>st[biendem].diemgk;
cout<<"Nhap diem thi cuoi ky: ";cin>>st[biendem].diemck;
st[biendem].tongdiem=st[biendem].diemkt1+st[biendem].diemkt2+st[biendem].diemcc+st[biendem].diemgk+st[biendem].diemck;

++biendem;


}

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

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

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

int search(struct sinhvien st[], string id,int biendem){ 

int found =-1;
for (int i = 0; i < biendem && found==-1; i++)
{

if (st[i].mssv == id) found=i;

else found=-1 ;
}

return found; 

}

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

Định nghĩa phương thức viewall(sinhvien st[], int biendem) để hiển thị danh sách các bản ghi trong tập hợp. Để hiển thị danh sách các bản ghi, chúng ta cần một vòng lặp WHILE để “vọc” mảng các đối tượng sinh viên này.

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

//ham de quan sat tat ca cac ban ghi
void viewall(struct sinhvien st[], int biendem){
   int i=0;
  cout<<left<<setw(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"<<"\n";
   cout<<"==========================================\n";
  while(i<=biendem){
     if(st[i].mssv!=""){
        cout<<left<<setw(5)<<st[i].mssv<<setw(20)<<st[i].tensv<<setw(5)
       <<st[i].sex;
       cout<<setw(5)<<st[i].diemkt1<<setw(5)<<st[i].diemkt2<<setw(5)<<st[i].diemcc
      <<setw(5)<<st[i].diemgk<<setw(5)<<st[i]. diemck<<setw(5)
      <<st[i].tongdiem;

      cout<<"\n";}
      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 cụ thể từ mảng các đối tượng sinh viên. Người dùng sẽ được nhắc id của sinh viên mà họ muốn xóa. Sau đó, id này sẽ được kiểm tra lại để đảm bảo rằng sẽ không còn tồn tại trong danh sách.

Hoạt động xóa bắt đầu bằng việc kiểm tra xem bản ghi đó là bản ghi cuối cùng, ở đầu hoặc ở giữa trong dánh sách. Nếu là bản ghi cuối cùng, chúng ta xóa bản ghi đó bằng việc cung cấp nó tới phương thức clean(struct sinhvien st[], int index). Bản ghi cuối cùng là bản ghi có chỉ mục bằng biendem – 1. Nếu là bản ghi ở đầu hoặc ở giữa danh sách, chúng ta cần sử dụng một vòng lặp. Sau khi phần tử bị xóa, biến biendem giảm 1, tức là số phần tử 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.\n";
       }

  else //xoa ban ghi dau tien hoac o giua
    {
      for (int i = index; i < biendem-1; i++)
        {
          st[i] = st[i + 1];
          clean(st, biendem);
          --biendem ;
         }

    }

  }
else cout<<"Ban ghi khong ton tai. Kiem tra ID va thu lai.\n";

 }
else cout<<"Khong co ban ghi nao bi xoa\n";
} 
void clean(struct sinhvien st[],int index)
{
st[index].mssv ="";
strcpy(st[index].tensv,"");
st[index].sex =NULL;
st[index].diemkt1 = 0;
st[index].diemkt2 = 0;
st[index].diemcc = 0;
st[index].diemgk = 0;
st[index].diemck = 0;
st[index].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 ghi cụ thể. Tiến trình cập nhật bắt đầu với việc hỏi người dùng để nhập id của bản ghi cần thay đổi. Giá trị id này được kiểm tra xem nó có tồn tại hay không. Nếu tồn tại, việc thay đổi diễn ra sau khi hỏi người dùng nhập giá trị mới vào các trường cần thay đổi.

Dưới đây là code cho bước 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[index].tensv;
     }

  else if (column_index == 2)
   {
    cout<<"Nhap gioi tinh (F hoac M): ";
    cin>>st[index].sex;
    }
  else if (column_index == 3)
   {
   cout<<"Nhap diem kiem tra 1: ";
   cin>>st[index].diemkt1;
  }
  else if (column_index == 4)
  {
   cout<<"Nhap diem kiem tra 2: ";
   cin>>st[index].diemkt2;
 }
  else if (column_index == 5)
   {
     cout<<"Nhap diem chuyen can: ";
     cin>>st[index].diemcc;
     }
  else if (column_index == 6)
   {
    cout<<"Nhap diem thi giua ky: ";
    cin>>st[index].diemgk;
}
  else if (column_index == 7)
   {
    cout<<"Nhap diem thi cuoi ky: ";
    cin>>st[index].diemck;
   }
  else cout<<"Gia tri chi muc khong hop le";

  st[index].tongdiem = st[index].diemkt1 + st[index].diemkt2 + st[index].diemcc + st[index].diemgk + st[index].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 trung bình của sinh viên đã chọn. Phương thức này cũng hỏi người dùng nhập id của sinh viên cần tính. ID này được kiểm tra xem có tồn tại hay không. Điểm trung bình được tính đơn giản bằng việc cộng các điểm và sau đó chia cho 5.

Dưới đây là code cho bước 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[index].tongdiem = st[index].diemkt1 + st[index].diemkt2 + st[index].diemcc + st[index].diemgk + st[index].diemck;
   avg = st[index].tongdiem /5;
  }

cout<<"Diem trung binh la "<<avg;
}

Bước 9: Tìm điểm thi lớn nhất, nhỏ 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 có điểm thi lớn nhất và nhỏ nhất. Để tìm tổng điểm lớn nhất và nhỏ nhất, chúng ta cần so sánh tổng điểm của các 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[j+1].tongdiem) {
    max = st[j+1].tongdiem;
    index = j+1;

  }


}

 else if (biendem == 1)
 {
   index = 0;
   max = st[0].tongdiem;
 }


 else cout<<"Khong tim thay ban ghi nao!\n";

 if (index != -1) cout<<"Sinh vien co ID la "<<st[index].mssv<<" dat tong diem cao nhat la "<<max<<endl;


 }

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[j+1].tongdiem)
    {
      min = st[j+1].tongdiem;
      index = j+1;

    }


  }

  else if (biendem == 1)
  {
    index = 0;
    min = st[0].tongdiem;
   }
  else cout<<"Khong tim thay ban ghi nao!\n";

  if (index != -1) cout<<"Sinh vien voi ID la "<<st[index].mssv<<" co tong diem thap nhat la "<<min<<endl;



}

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

Định nghĩa hàm find(struct sinhvien st[], int biendem) để tìm bản ghi trong danh sách. Hàm này hỏi người dùng nhập id của sinh viên. Sau đó, kiểm tra id này xem có tồn tại hay không. Nếu tìm thấy bản ghi, thông tin liên quan tới sinh viên đó sẽ được hiển thị. Nếu không tìm thấy, hàm này sẽ thông báo “The record doesn’t exist.”

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 da tim thay
    cout<<left<<setw(5)<<st[index].mssv<<setw(20)<<st[index].tensv<<setw(5)<<st[index].sex;
    cout<<setw(5)<<st[index].diemkt1<<setw(5)<<st[index].diemkt2<<setw(5)<<st[index].diemcc
<<setw(5)<<st[index].diemgk<<setw(5)<<st[index].diemck<<setw(5)
<<st[index].tongdiem;
   cout<<"\n"; 

}
  else cout<<"Ban ghi khong ton tai.";

 }

Bạn trở lại trang cha để tìm hiểu tiếp các bước.

Bước 11: Sắp xếp các bản ghi

Định nghĩa hàm để sắp xếp các bản ghi theo thứ tự tổng điểm thi tăng dần. Chúng ta sử dụng thuật toán sắp xếp nổi bọt (bubble sort).

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[j].tongdiem < dataset[j - 1].tongdiem )
       {
         sinhvien temp = dataset[j];
         dataset[j] = dataset[j - 1];
         dataset[j - 1] = temp;
       }

}

Bước 12: Kết hợp code của các bước trên

Sau khi đã theo dõi các bước từ 1 tới 11, đến giờ bạn đã hiểu lời giải cũng như đã khá thành thục với Structure và các khái niệm có liên quan trong bài như vòng lặp, lệnh IF-ELSE, định nghĩa hàm, phương thức, cách sử dụng mảng, … Bây giờ, kết hợp các bước trên để có lời giải hoàn chỉnh.

#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <string.h>
using namespace std;

//khai bao sinhvien structure
typedef struct sinhvien
{

string mssv;
char tensv[20];
char sex;
float diemkt1;
float diemkt2;
float diemcc;
float diemgk;
float diemck;
float tongdiem;
int soItem;
};
//cac nguyen mau ham (function prototype)
int search(struct sinhvien st[],string id, int biendem);
void clean(struct sinhvien st[],int deleteitem);

//ham de hien thi menu tuy chon
void displaymenu(){
cout<<"=========================================="<<"\n";
cout<<" MENU "<<"\n";
cout<<"=========================================="<<"\n";
cout<<" 1. Them ban ghi sinh vien"<<"\n";
cout<<" 2. Xoa ban ghi sinh vien"<<"\n";
cout<<" 3. Cap nhat ban ghi sinh vien"<<"\n";
cout<<" 4. Quan sat tat ca ban ghi sinh vien"<<"\n";
cout<<" 5. Tinh diem trung binh cua sinh vien da chon"<<"\n";
cout<<" 6. Hien thi sinh vien co tong diem cao nhat"<<"\n";
cout<<" 7. Hien thi sinh vien co tong diem thap nhat"<<"\n"; 
cout<<" 8. Tim sinh vien boi ID"<<"\n"; 
cout<<" 9. Sap xep cac ban ghi boi tong diem"<<"\n"; 
}
//ham de them cac ban ghi
void them_banghi(struct sinhvien st[],int& biendem){

again:
cout<<"\nNhap ID cua sinh vien: ";
cin>>st[biendem].mssv;
if(search(st,st[biendem].mssv,biendem)!=-1){
cout<<"ID nay da ton tai\n";goto again;
}

cout<<"Nhap ten sinh vien: "; 
cin>>st[biendem].tensv;
cout<<"Nhap gioi tinh cua sinh vien (F hoac M): ";cin>>st[biendem].sex;
cout<<"Nhap diem kiem tra 1: ";cin>>st[biendem].diemkt1;
cout<<"Nhap diem kiem tra 2: ";cin>>st[biendem].diemkt2;
cout<<"Nhap diem chuyen can: ";cin>>st[biendem].diemcc;
cout<<"Nhap diem giua ky: ";cin>>st[biendem].diemgk;
cout<<"Nhap diem cuoi ky: ";cin>>st[biendem].diemck;
st[biendem].tongdiem=st[biendem].diemkt1+st[biendem].diemkt2+st[biendem].diemcc+st[biendem].diemgk+st[biendem].diemck;

++biendem;


}

//ham de tim vi tri ban ghi
int search(struct sinhvien st[], string id,int biendem){
int found =-1;
for (int i = 0; i < biendem && found==-1; i++)
{

if (st[i].mssv == id) found=i;

else found=-1 ;
}

return found;
}



//ham de quan sat tat ca ban ghi
void viewall(struct sinhvien st[], int biendem){
int i=0;
cout<<left<<setw(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"<<"\n";
cout<<"==============================================\n";
while(i<=biendem){
if(st[i].mssv!=""){
cout<<left<<setw(5)<<st[i].mssv<<setw(20)<<st[i].tensv<<setw(5)
<<st[i].sex;
cout<<setw(5)<<st[i].diemkt1<<setw(5)<<st[i].diemkt2<<setw(5)<<st[i].diemcc
<<setw(5)<<st[i].diemgk<<setw(5)<<st[i]. diemck<<setw(5)
<<st[i].tongdiem;

cout<<"\n";}
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 cung
{

clean(st, index);
--biendem;

cout<<"Ban ghi da duoc xoa.\n";
}
else //xoa ban ghi dau tien hoac o giua
{
for (int i = index; i < biendem-1; i++)
{
st[i] = st[i + 1];
clean(st, biendem);
--biendem ;
}

}

}
else cout<<"Ban ghi khong ton tai. Kiem tra ID va thu lai.\n";


}
else cout<<"Khong co ban ghi nao duoc xoa\n";
}

//ham de xoa sach ban ghi da bi xoa
void clean(struct sinhvien st[],int index)
{
st[index].mssv ="";
strcpy(st[index].tensv,"");
st[index].sex =NULL;
st[index].diemkt1 = 0;
st[index].diemkt2 = 0;
st[index].diemcc = 0;
st[index].diemgk = 0;
st[index].diemck = 0;
st[index].tongdiem = 0;

}


//ham de cap nhat ban ghi
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[index].tensv;
}

else if (column_index == 2)
{
cout<<"Nhap gioi tinh sinh vien (F hoac M): ";
cin>>st[index].sex;
}
else if (column_index == 3)
{
cout<<"Nhap diem kiem tra 1: ";
cin>>st[index].diemkt1;
}
else if (column_index == 4)
{
cout<<"Nhap diem kiem tra 2: ";
cin>>st[index].diemkt2;
}
else if (column_index == 5)
{
cout<<"Nhap diem chuyen can: ";
cin>>st[index].diemcc;
}
else if (column_index == 6)
{
cout<<"Nhap diem thi giua ky: ";
cin>>st[index].diemgk;
}
else if (column_index == 7)
{
cout<<"Nhap diem thi cuoi ky: ";
cin>>st[index].diemck;
}
else cout<<"Gia tri chi muc khong hop le";

st[index].tongdiem = st[index].diemkt1 + st[index].diemkt2 + st[index].diemcc
+ st[index].diemgk + st[index].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[j+1].tongdiem) {
max = st[j+1].tongdiem;
index = j+1;

}


}

else if (biendem == 1)
{
index = 0;
max = st[0].tongdiem;
}


else cout<<"Khong tim thay ban ghi nao!\n";

if (index != -1) cout<<"Sinh vien co ID la "<<st[index].mssv
<<" dat tong diem cao nhat la "<<max<<endl;


}

//ham de hien thi tong diem nho nhat
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[j+1].tongdiem)
{
min = st[j+1].tongdiem;
index = j+1;

}

}

else if (biendem == 1)
{
index = 0;
min = st[0].tongdiem;
}
else cout<<"Khong tim thay ban ghi nao!\n";

if (index != -1) cout<<"Sinh vien co ID la "<<st[index].mssv
<<" co tong diem thap nhat la "<<min<<endl;

}

//ham de tim ban ghi
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 da tim thay
cout<<left<<setw(5)<<st[index].mssv<<setw(20)<<st[index].tensv<<setw(5)<<st[index].sex;
cout<<setw(5)<<st[index].diemkt1<<setw(5)<<st[index].diemkt2<<setw(5)
<<st[index].diemcc
<<setw(5)<<st[index].diemgk<<setw(5)<<st[index].diemck<<setw(5)
<<st[index].tongdiem;
cout<<"\n"; 

}
else cout<<"Ban ghi khong ton tai.";

}


//ham de sap xep cac ban ghi theo tong diem
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[j].tongdiem < dataset[j - 1].tongdiem )
{
sinhvien temp = dataset[j];
dataset[j] = dataset[j - 1];
dataset[j - 1] = temp;
}

}

//ham de tinh diem trung binh cua mot sinh vien
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[index].tongdiem = st[index].diemkt1 + st[index].diemkt2 + st[index].diemcc
+ st[index].diemgk + st[index].diemck;
avg = st[index].tongdiem /5;
}

cout<<"Diem trung binh la "<<avg;
}

//ham main 

int main(int argc, char *argv[])
{


sinhvien st[80];
int biendem=0;

//hien thi menu
displaymenu();
int luachon;
char confirm;
do
{
cout<<"\nNhap lua chon cua ban (1-9): ";
cin>>luachon;

switch(luachon){
case 1:them_banghi(st, biendem);break;
case 2:xoa_banghi(st, biendem);break;
case 3:capnhat_banghi(st, biendem);break;
case 4:viewall(st, biendem);break;
case 5:average(st, biendem);break;
case 6:showmax(st, biendem);break;
case 7:showmin(st, biendem);break;
case 8:find(st, biendem);break;
case 9:bubblesort(st,biendem);break;
default:cout<<"Khong hop le";

}

cout<<"Nhan y hoac Y de tiep tuc: ";
cin>>confirm;
}while(confirm=='y'||confirm=='Y');

return 0;
}

Chạy chương trình C++ trên sẽ cho kết quả như hình sau:

Đầu tiên, bạn lựa chọn 1 để cập nhật bản ghi, hình minh họa là:

Bài tập về Quản lý sinh viên trong C++

Sau đó, với các lựa chọn tiếp theo sẽ là:

Bài tập về Quản lý sinh viên trong C++