Bài 10. Dữ liệu có cấu trúc (STRUCT)

1. Khái niệm về dữ liệu cấu trúc (struct)

Một cấu trúc dữ liệu là một tập hợp của những kiểu dữ liệu khác nhau được gộp lại với một cái tên duy nhất.    

Ví dụ: Nếu coi sinh viên là một biến thì biến sinh viên chứa nhiều kiểu dữ liệu khác nhau như:

    - Họ tên: char

    - Tuổi: int

    - Địa chỉ: char

    - Điểm thi: float,...

Như vậy, sinh viên có thể coi như một biến cấu trúc.


2. Khai báo struct

// Định nghĩa cấu trúc

struct <Tên cấu trúc> {  
     Các trường (các biến thành phần);
     ...
   };

// Khai báo biến cấu trúc

<Tên cấu trúc> <các biến cấu trúc>,...;

Ví dụ:

// Định nghĩa cấu trúc SV
   struct SV{
     char hoTen[30];
     char diaChi[50];
     int tuoi;
     float diem; 
   };

// Khai báo các biến VS
SV a,b; //a,b là biến cấu trúc SV
SV dhTin[4]; //dhTin là biến mảng cấu trúc SV

3. Sử dụng struct

- Mỗi trường trong cấu trúc như một biến thông thường.

- Khi sử dụng các trường ta dùng toán tử "."

Ví dụ:

// sử dụng biến điểm của sinh viên a

a.diem;


Ví dụ 1:

+ Yêu cầu: Viết chương trình thực hiện

  - Nhập vào tạo độ 3 điểm A,B,C trong không gian.

  - Tính độ dài 3 đoạn thẳng AB,AC,BC.

  - Kiểm tra xem A,B,C có thẳng hàng không?

+ Code:

#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;

int main() {
  // truc TaoDo
   struct ToaDo{
     float x, y, z;
   };
  // khai bao bien ToaDo
   ToaDo A, B, C;
   // Nhap toa do 3 diem
   cout<<"\n Nhap toa do 3 diem: ";
   cout<<"\n A: ";
   cin>>A.x>>A.y>>A.z;
   cout<<"\n B: ";
   cin>>B.x>>B.y>>B.z;
   cout<<"\n C: ";
   cin>>C.x>>C.y>>C.z;       
  // Tinh do dai doan thang
   float d1; // AB
   float d2; // AC
   float d3; // BC
   d1=sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)+(A.z-B.z)*(A.z-B.z));
   d2=sqrt((A.x-C.x)*(A.x-C.x)+(A.y-C.y)*(A.y-C.y)+(A.z-C.z)*(A.z-C.z));
   d3=sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)+(C.z-B.z)*(C.z-B.z));

  // In do dai 3 doan thang
  cout<<"\n Do dai 3 doan thang: \n";
  cout<<"\n AB : "<<d1;
  cout<<"\n AC : "<<d2;
  cout<<"\n BC : "<<d3;

  // Kiem tra tinh thang hang
   if(d1+d2==d3||d1+d3==d2||d2+d3==d1)  
      cout<<"\n 3 diem A,B,C thang hang";
   else  
       cout<<"\n 3 diem A,B,C khong thang hang";      

return 0;
}

Ví dụ 2:

+ Yêu cầu: Viết các hàm thực hiện

  - Nhập thông tin SV gồm: họ tên, địa chỉ, tuổi, điểm toán, lý, hóa.

  - Tính điểm tổng kết.

  - In thông tin sinh viên.

+ Code:

/* Chương trình này sử dụng hàm (phần hàm sẽ được trình bày ở bài sau) */

#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<string.h>

using namespace std;

// Dinh nghia cau truc SV
struct SV{
char ht[30],dc[50];
int tuoi;
float dT,dL, dH;
};

// Khai bao bien cau truc
SV a;

// Ham nhap thong tin
void NhapTT(){
  // xu ly bo dem cho viec nhap mot xau
  fflush(stdin);
  cout<<"\n Nhap Sinh vien: ";
  cout<<"\n - Ho ten: ";
  gets(a.ht); // nhap mot xau
  cout<<"\n - Dia chi: ";
  gets(a.dc);
  cout<<"\n - Tuoi: ";
  cin>>a.tuoi;
  cout<<"\n - Diem toan: ";
  cin>>a.dT;
  cout<<"\n - Diem ly: ";
  cin>>a.dL;
  cout<<"\n - Diem hoa: "; cin>>a.dH;
}

// Ham Tinh diem
float TinhDiem(){
return (a.dT+a.dL+a.dH)/3;
}

// Ham In thong tin
void InTT(){
// tim xep loai
char xepLoai[10];
float dtk=TinhDiem();
// Xep loai sinh vien
if (dtk<5)
   strcpy(xepLoai,"Truot"); // copy xau
else
   if (dtk<6) 
     strcpy(xepLoai,"TB");
     else  
       if (dtk<7)    
         strcpy(xepLoai,"TBK");
     else
       if (dtk<8)    
         strcpy(xepLoai,"Kha");  
       else    
         if (dtk<9)      
           strcpy(xepLoai,"Gioi");    
         else if (dtk<=10)      
           strcpy(xepLoai,"XS");  
       else    
         strcpy(xepLoai,"");
// in thong tin sinh vien
cout<<"\n In sinh vien: ";
cout<<"\n - Ho ten: "<<a.ht;
cout<<"\n - Dia chi: "<<a.dc;
cout<<"\n - Tuoi: "<<a.tuoi;
cout<<"\n - Diem tong ket: "<<dtk;
cout<<"\n - Xep loai: "<<xepLoai;
}

// Ham main
int main(){
  NhapTT();
  InTT();
  getch() ;

return 0;
}

Ví dụ 3:

+ Yêu cầu: Viết chương trình thực hiện

1. Nhập vào thông tin của một nhân viên IT:

  - Ho ten

  - Tuoi

  - Vi tri lam viec

  - He so luong

  - So nam cong tac

2. In thông tin của nhân viên vừa nhập.

3. Tính lương cho nhân viên:

  luong = he so luong * luong co ban + phu cap.

Trong đó: 

  - Phụ cấp = 1.2 lương cơ bản nếu số năm công tác > 3,

  - Ngược lại phụ cấp băng 1 lương cơ bản.

4. Tính thuế thu nhập mà nhân viên phải trả.

Nếu lương > 5.000.000 thì thuế = 10% lương, ngược lại thuế = 0.

+ Code:

/* Lưu ý:

  Chương trình được viết bằng ngôn ngữ C

  Các bạn hoàn toàn có thể chuyển đổi sang C++

  Đổi printf -> cout; scanf -> cin.

*/

#include<stdio.h>
#include<conio.h>
#include<string.h>

// khai bao hang LCB
#define LCB 1050000

using namespace std;

// Dinh nghia struc NV
struct NV{
  char hoTen[30], viTriLV[30];
  int tuoi, soNamCT;
  float heSoLuong;
};

// khai bao bien
NV t;

// Nhap thong tin nhan vien
void NhapTT(){
printf("\n Nhap nhan vien: \n");
printf("\n Ho ten: ");
fflush(stdin);
gets(t.hoTen);
printf("\n Vi tri lam viec: ");
fflush(stdin);
gets(t.viTriLV);
do{
   printf("\n Tuoi nhan vien: ");
   scanf("%d",&t.tuoi);
   if (t.tuoi<18||t.tuoi>65)
       printf("\n Tuoi khong hop le, nhap lai tuoi");
  } while(t.tuoi<18||t.tuoi>65);
do{
   printf("\n So nam cong tac: ");
   scanf("%d",&t.soNamCT);
   if (t.soNamCT<0|| t.soNamCT>t.tuoi-18)
       printf("\n So nam cong tac khong hop le, nhap lai nam cong tac");
  } while (t.soNamCT<0|| t.soNamCT>t.tuoi-18);
do{
   printf("\n He so luong: ");
   scanf("%f",&t.heSoLuong);
   if (t.heSoLuong<=0||t.heSoLuong>15)
       printf("\n He so luong khong hop le, nhap lai he so luong.");
  } while (t.heSoLuong<=0||t.heSoLuong>15);
}

// In thong tin nhan vien
void InTT(){
   printf("\n IN THONG TIN NHAN VIEN: \n");
   printf("\n - Ho ten: %s",t.hoTen);
   printf("\n - Vi tri lam viec: %s",t.viTriLV);
   printf("\n - Tuoi: %d",t.tuoi);
   printf("\n - So nam cong tac: %d",t.soNamCT);
   printf("\n - He so luong: %f",t.heSoLuong);
}

// Tinh luong
float TinhLuong(){
   float phuCap;
   if(t.soNamCT>=3)
     phuCap=1.2*LCB;
   else
     phuCap=LCB;
   return (t.heSoLuong*LCB+phuCap);
}

// Tinh thue thu nhap
float ThueTN(){
   float thue=0;
   if (TinhLuong()>=5000000)
     thue=0.1*TinhLuong();
   return thue;
}

// ham main
int main(){
   NhapTT();
   InTT();
   printf("\n Luong nhan vien: %f",TinhLuong() );
   printf("\n Thue thu nhap: %f",ThueTN() );
     getch();

return 0;
}