Bài giảng C - Kiểu cấu trúc
Trang 1LẬP TRÌNH C++
§9 Kiểu cấu trúc bản ghi
Trang 2I Khai báo kiểu bản ghi
Cú pháp
struct < tên_cấu_trúc >
{
Các kiểu dữ liệu thành phần ;
};
Khai báo biến :
struct < tên_cấu_trúc > < tên_biến > ;
Ví dụ: Kiểu dữ liệu DATE gồm các thành phần:
Thứ (thu): kiểu chuỗi
Ngày (ngay): kiểu số nguyên 1 byte
Tháng (thang): kiểu số nguyên 1 byte
Năm (nam): kiểu số nguyên 2 bytes
Trang 3 Ta định nghĩa DATE như sau:
struct DATE
{
string thu;
unsigned char ngay;
unsigned char thang;
unsigned int nam;
};
DATE x ; // Khai bao bien x co kieu du lieu DATE
Hoặc : struct DATE x ;
Để truy xuất một thành phần dữ liệu :
< Tên cấu trúc >.< Biến thành phần >;
DATE x ; // khai bao bien x kieu DATE
x.ngay = 5 ; // gan ngay bang 5
Trang 4 Bài tập :
1. đọc và in ra thứ, ngày, tháng, năm
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct DATE
{
string thu;
unsigned char ngay;
unsigned char thang;
unsigned int nam;
};
struct DATE d;
Trang 5void main()
{
cout<<"Cho thu : ";
getline(cin,d.thu);
cout<<"Cho ngay : ";
cin>>d.ngay;
cout<<"Cho thang : ";
cin>>d.thang;
cout<<"Cho nam : ";
cin>>d.nam;
cout<<"Du lieu vua doc vao la : "<<endl;
cout<<"Thu : "<<d.thu<<endl;
cout<<"Ngay : "<<d.ngay<<endl;
cout<<"Thang : "<<d.thang<<endl;
cout<<"Nam : "<<d.nam<<endl;
}
* Cách 2 : dùng hàm đọc vào và in ra ngày tháng năm
Trang 62 Đọc vào và in ra thông tin của một thí sinh thi đại học gồm: SBD, hoten, gioitinh, dtoan, dly, dhoa (dùng hàm)
Ta có thể khai báo kiểu thí sinh như sau:
struct THISINH
{ string SBD;
string hoten;
string gt;
double dtoan;
double dly;
double dhoa;
};
struct THISINH ts;
Trang 7Định nghĩa kiểu dữ liệu của học sinh HOCSINH gồm:
Mã số học sinh (MSHS): kiểu chuỗi
Họ tên (hoten): kiểu chuỗi
Ngày tháng năm sinh (ngaysinh): kiểu DATE
Địa chỉ (diachi): kiểu chuỗi
Giới tính (gt): kiểu chuỗi
Điểm trung bình (diemtb): số thực
Ta định nghĩa kiểu HOCSINH có ngày sinh là kiểu DATE
như sau:
struct DATE
{
unsigned int ngay;
unsigned int thang;
unsigned int nam;
};
Trang 8struct HOCSINH
{
string MSHS;
string hoten;
struct DATE ngaysinh;
string diachi;
string gt;
double diemtb;
};
HOCSINH hs; // khai bao bien hs kieu HOCSINH
Muốn biết hs sinh vào tháng mấy ta phải truy cập như sau: (hs.ngaysinh).thang;
# Khi định nghĩa kiểu dữ liệu struct lồng nhau, ta cần lưu ý: Kiểu dữ liệu được sử dụng phải khai báo phía trên
Bài tập :
đọc vào và in ra thông tin cua một học sinh như trên bằng
2 cách : cách 1: đọc in trực tiếp; cách 2 : thông qua 2 hàm
Trang 9#include <iostream>
#include <string>
#include <conio.h>
#include <algorithm>
using namespace std;
struct DATE
{ unsigned int ngay;
unsigned int thang;
unsigned int nam;
};
struct HOCSINH
{ string MSHS;
string hoten;
struct DATE ngaysinh;
string diachi;
string gt;
double diemtb;
};
Trang 10HOCSINH hs;
void docns(DATE &d)
{
cout<<"Cho ngay : "; cin>>d.ngay;
cout<<"Cho thang : "; cin>>d.thang;
cout<<"Cho nam : "; cin>>d.nam;
}
void dochs(HOCSINH &hs)
{
cout<<"Cho MSHS : "; getline(cin,hs.MSHS);getchar();
cout<<"Cho ho ten : "; getline(cin,hs.hoten); getchar();
cout<<"Vao ngay thang nam sinh : "<<endl;
docns(hs.ngaysinh); getchar();
cout<<"Cho dia chi : "; getline(cin,hs.diachi); getchar();
cout<<"Cho gioi tinh : "; getline(cin,hs.gt); getchar();
cout<<"Cho diem trung binh : "; cin>>hs.diemtb;
Trang 11void inns(DATE d)
cout<<"thang : "<<d.thang<<endl;
cout<<"nam : "<<d.nam<<endl;
}
void inhs(HOCSINH hs)
cout<<"ho ten : "<<hs.hoten<<endl;
cout<<"ngay thang nam sinh : "<<endl;
inns(hs.ngaysinh);
cout<<"dia chi : "<<hs.diachi<<endl;
cout<<"gioi tinh : "<<hs.gt<<endl;
cout<<"diem trung binh : "<<hs.diemtb<<endl;
}
void main()
cout<<"Du lieu vua doc vao la : "<<endl; inhs(hs);
}
Trang 12III Mảng cấu trúc bản ghi
ma trận (Kiểu dữ liệu bây giờ là kiểu dữ liệu có
cấu trúc)
cập trên mảng một chiều hay ma trận Nhưng do từng phần tử có kiểu cấu trúc nên phải chỉ định rõ cần lấy thành phần nào, tức là phải truy cập đến thành phần cuối cùng có kiểu là dữ liệu cơ bản
Trang 13 Ví dụ :
struct THISINH
{ string SBD;
string hoten;
string gt;
double dtoan;
double dly;
double dhoa;
};
struct THISINH ds[100], ts, ts1, ts2;
Trong chương trinh có thể gán : ts1=ts2;
Phep so sanh : ts1!=ts2; ts1==ts2;
Bài tập :
Đọc vào một danh sách thí sinh thi đại học, sắp xếp theo thứ tự điểm giảm dần và in ra.
Trang 14IV Bài tập về nhà
trừ, nhân, chia số phức.
trù, nhân, chia, tối giản phân số.
Đơn vị tính, đơn giá, số lượng Sau đó đọc vào một danh sách hàng hóa và in ra theo thứ tự số tiền tăng dần, biết rằng số tiền = số lượng * đơn giá
Trang 15#include <conio.h>
#include <iostream>
using namespace std;
struct sophuc
{
double x,y;
};
void docsp(sophuc &u)
{
cout<<"Cho phan thuc : "; cin>>u.x;
cout<<"Cho phan ao : "; cin>>u.y;
}
sophuc cong(sophuc u, sophuc v)
{
sophuc w;
w.x=u.x+v.x;
w.y=u.y+v.y;
return w;
}
Trang 16void insp(sophuc u)
{
if (u.y>0) cout<<u.x<<"+i*"<<u.y;
else if (u.y<0) cout<<u.x<<"-i*"<<abs(u.y);
else cout<<u.x;
}
void main()
{
sophuc u,v;
cout<<"Cho so phuc thu nhat :"<<endl; docsp(u);
cout<<"Cho so phuc thu hai :"<<endl; docsp(v);
cout<<"So phuc u="; insp(u); cout<<endl;
cout<<"So phuc v="; insp(v); cout<<endl;
cout<<"Tong u+v="; insp(cong(u,v)); cout<<endl;
}