Tải bản đầy đủ (.doc) (13 trang)

Bài thực hành số 8: Kiểu cấu trúc doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (123.23 KB, 13 trang )

Bài thực hành số 8:
Kiểu cấu trúc
A. Mục tiêu
 Nắm vững định nghĩa kiểu cấu trúc, biến cấu trúc.
 Nắm vững một số thao tác cơ bản trên xâu ký tự cấu
trúc
 Rèn luyện cách gọi hàm, truyền tham số.
B. Ôn tập:
 Các định nghĩa kiểu cấu trúc
 Các thao tác cơ bản trên cấu trúc
 Truyền tham số
I. Kiểu cấu trúc – biến cấu trúc
1. Các định nghĩa kiểu cấu trúc
Dạng 1 Dạng 2 Dạng 3
struct KCT //Tên kiểu
{
//Các thành phần
}
struct KCT //Tên kiểu
{
//Các thành phần
}DS các biến
struct //Không có Tên kiểu
{
//Các thành phần
}DS các biến
struct NHANVIEN
{
int Ms;
char HoTen[MAX];
NTM NTNsinh;


char DiaChi[MAX];
int Sdt;
};

struct NHANVIEN
{
char HoTen[MAX];
int Namsinh;
char DiaChi[MAX];
int Sdt;
}NV;
struct
{
char HoTen[MAX];
int Namsinh;
char DiaChi[MAX];
int Sdt;
}NV;
struct NTM
{
int Ngay;
int Thang;
int Nam;
}
2. Các thao tác bên trong cấu trúc (các thành phần cấu trúc)
Như các biến thông thường.
3. Truy cập vào các thành phần của cấu trúc
Theo cú pháp:
• TenCauTruc.TenTruong
Nếu tên trường là một cấu trúc thì:

• TenCauTruc. TenCauTruc.TenTruong
Ví dụ:
• NV.HoTen //Truy cập vào trường HoTen của NV
• NV.NTNsinh.Ngay
//Truy cập vào trường Ngay của cấu trúc NTNsinh của
NV
4. Nhập dữ liệu cho biến cấu trúc NV
(Nhập từng thành phần cấu trúc)
chẳng hạn:
• cin>>NV.NTNsinh.Nam; // Nhập năm sinh của NV
• gets(NV.DiaChi); //Nhập Địa chỉ của NV
• . . .
5. Xuât dữ liệu cho biến cấu trúc NV
(Nhập từng thành phần cấu trúc)
chẳng hạn:
• cout<<NV.NTNsinh.Nam; // Xuất năm sinh của NV
• cout<<NV.DiaChi; //Xuất Địa chỉ của NV
• . . .
6. Phép gán:
Hai biến cấu trúc cùng kiểu có thể gán cho nhau
7. Khởi đầu:
Khởi đầu cho tưnừg thành phần
II. Mảng cấu trúc
Là mảng 1 chiều các cấu trúc cùng kiểu
Chẳng hạn, khai báo:
NHANVIEN Ds[MAX];
xác định mảng 1 chiều Ds có không quá MAX cấu trúc kiểu NHANVIEN
1. Nhập dữ liệu cho mảng cấu trúc
(Nhập dữ liệu cho từng cấu trúc)
Hàm nhập dữ liệu cho mảng Ds gồm n phần tử kiểu NHANVIEN

void Nhap ( NHANVIEN Ds[MAX], int n)
{
int i;
for( i = 0; i < n; i++)
{
cout<<”\nNhap du lieu cho nguoi thu “<<i+1;
cout<<”\nMa so: “;
cin>>Ds[i].Ms;
cout<<”\nHo ten: “;
gets(Ds[i].HoTen);
cout<<”\nNgay sinh: “;
cin>>Ds[i].NTNsinh.Ngay;
cout<<”\nThang sinh: “;
cin>>Ds[i].NTNsinh.Thang;
cout<<”\nNam sinh: “;
cin>>Ds[i].NTNsinh.Nam;
cout<<”\nDia chi: “;
gets(Ds[i].DiaChi);
cout<<”\nSo dien thoai: “;
cin>>Ds[i].Sdt;
}
}
2. Xuất dữ liệu cho mảng cấu trúc
(Xuat dữ liệu cho từng cấu trúc)
Hàm Xuất dữ liệu cho mảng DS gồm n phần tử kiểu NHANVIEN
void Xuat ( NHANVIEN Ds[MAX], int n)
{
int i;
for( i = 0; i < n; i++)
{

//Xuất thông tin nhân viên i
cout<<'\n';
cout <<setiosflags(ios::left)
<<setw(10)<< Ds[i].Ms;
<<setw(20)<<Ds[i].HoTen
<<setw(2)<<DS[i].NTNsinh.Ngay <<’-‘
<<setw(2)<< DS[i].NTNsinh.Ngay <<’-‘
<<setw(6)<< DS[i].NTNsinh.Nam
<<setw(20)<< Ds[i].DiaChi
<<setw(10)<< Ds[i].Sdt ;
}
}
Ghi chú:
Hàm này xuất thông tin của mỗi nhân viên trên một hàng theo định dạng sau
(chèn tập tin thư viện <iomanip>) :
• Hoten: trong 20 cột (canh trái)
• Ngay thang nam sinh : 12 cột
• DiaChi: 20 cột (canh trái)
• Sdt: 10 cột (canh trái)
III. Truyền tham số
Đối của hàm Truyền tham số
Biến cấu trúc Giá trị cấu trúc
Tên mảng cấu trúc Tên mảng cấu trúc cùng kiểu, cùng kích thước
C. Luyện tập:
Ví dụ 1:
Để quản lý nhân viên ta xây dựng cấu trúc gồm:
• Mã nhân viên,
• Họ nhân viên,
• Tên nhân viên,
• Địa chỉ,

• Điện thoại,
• Mức lương,
• Phòng làm việc.
Viết chương trình tổ chức menu thực hiện các chức năng sau:
• Xem danh sách nhân viên.
• Xem danh sách nhân viên thuộc một phòng.
• Sắp xếp danh sách nhân viên theo thứ tự giảm dần của mức lương.
Thực hiện:
Bước 1: Tạo Project với tên “Lab8_Vd1”.
Bước 2: Tạo tập tin chương trình vd1.cpp
Bước 3: Trong tập tin vd1.cpp, soạn code theo cấu trúc:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <iomanip>
#include <string.h>
#define MAX 100
using namespace std;
//Dinh nghia kieu du lieu
struct NHANVIEN
{
char MaNV[10];
char HoNV[15];
char TenNV[10];
unsigned int Tuoi;
char Dc[10];
int Sdt;
double Luong;
char Phong[20];
};

//Khai bao nguyen mau ham
//Nhap,xuat
void Nhap ( NHANVIEN Ds[MAX], int n);
void Xuat ( NHANVIEN Ds[MAX], int n);
//Chuc nang
void DSPhong ( NHANVIEN Ds[MAX], int n, char Phong[20]);
void DSLuong_Tang ( NHANVIEN Ds[MAX], int n);
//To chuc menu
void XL_Menu(NHANVIEN Ds[MAX], int n, int Chon);
int ChonMenu();
void Menu();
void main()
{
NHANVIEN Ds[MAX];
int n, Chon;
cout<<"\nNhap n = ";
cin>>n;
Nhap (Ds,n);
do
{
Chon = ChonMenu();
XL_Menu(Ds,n,Chon);
}
while(1);
}
void Menu()
{
cout<<"\n BANG MENU ";
cout<<"\n1. Xem danh sach";
cout<<"\n2. Xem danh sach theo phong";

cout<<"\n3. Danh sach tang theo luong";
cout<<"\n5. Thoat khoi chuong trinh!!!";
}
int ChonMenu()
{
int Chon;
for(;;)
{
Menu();
cout<<"\nNhap Chon tu 1 -> 5: ";
cin>>Chon;
if (1 <= Chon && Chon <= 5)
break;
}
return Chon;
}
void XL_Menu(NHANVIEN Ds[MAX], int n, int Chon)
{
char Phong[20];
switch(Chon)
{
case 1:
cout<<"\n1. Xem danh sach";
cout<<"\nDanh sach nhan vien:\n";
Xuat(Ds, n);
cout<<'\n';
_getch();
break;
case 2:
cout<<"\n2. Xem danh sach theo phong";

cout<<"\nDanh sach nhan vien:\n";
Xuat(Ds, n);
_flushall();
cout<<"\nXem phong nao : ";
gets(Phong);
cout<<"\nDanh sach nhan vien phong "<<Phong<<" :\n";
DSPhong ( Ds, n,Phong);
cout<<'\n';
_getch();
break;
case 3:
cout<<"\n3. Danh sach tang theo luong";
cout<<"\nDanh sach nhan vien:\n";
Xuat(Ds, n);
_flushall();
DSLuong_Tang (Ds,n);
cout<<"\nDanh sach nhan vien tang theo luong:\n";
Xuat(Ds, n);
cout<<'\n';
_getch();
break;
case 5:
cout<<"\n5. Thoat khoi CT!\n";
exit(1);
}
}
void Nhap ( NHANVIEN Ds[MAX], int n)
{
int i;
for( i = 0; i < n; i++)

{
_flushall();
cout<<"\nNhap thong tin nguoi thu "<< i+1;
cout<<"\nMa nhan vien: ";
gets(Ds[i].MaNV);
_flushall();
cout<<"\nHo nhan vien: ";
gets(Ds[i].HoNV);
_flushall();
cout<<"\nTen nhan vien: ";
gets(Ds[i].TenNV);
cout<<"\nTuoi: ";
cin>>Ds[i].Tuoi;
_flushall();
cout<<"\nDia chi: ";
gets(Ds[i].Dc);
cout<<"\nSo dien thoai: ";
cin>>Ds[i].Sdt;
cout<<"\nLuong: ";
cin>>Ds[i].Luong;
_flushall();
cout<<"\nPhong: ";
gets(Ds[i].Phong);
}
}
void Xuat ( NHANVIEN Ds[MAX], int n)
{
int i;
for( i = 0; i < n; i++)
{

cout<<'\n';
cout<<setiosflags(ios::left)
<<setw(10)<< Ds[i].MaNV
<<setw(15)<<Ds[i].HoNV
<<setw(10)<<Ds[i].TenNV
<<setw(4)<<Ds[i].Tuoi
<<setw(10)<< Ds[i].Dc
<<setw(10)<< Ds[i].Sdt
<<setw(10)<< Ds[i].Luong
<<setw(10)<< Ds[i].Phong ;
}
}
//Xem danh sach cua mot phong
void DSPhong ( NHANVIEN Ds[MAX], int n, char Phong[20])
{
int i;
for( i = 0; i < n; i++)
{
if(stricmp(Phong, Ds[i].Phong)==0)
{
cout<<'\n';
cout<<setiosflags(ios::left)
<<setw(10)<< Ds[i].MaNV
<<setw(15)<<Ds[i].HoNV
<<setw(10)<<Ds[i].TenNV
<<setw(4)<<Ds[i].Tuoi
<<setw(10)<< Ds[i].Dc
<<setw(10)<< Ds[i].Sdt
<<setw(10)<< Ds[i].Luong;
}

}
}
// hàm: stricmp(Chuoi1, Chuoi2) == 0 nếu 2 xâu ký tự Chuỗi 1 và Chuỗi 2 trùng nhau
//Sap danh sach tang dan theo luong
void DSLuong_Tang ( NHANVIEN Ds[MAX], int n)
{
int i, j;
NHANVIEN Tam;
for( i = 0; i < n-1; i++)
for(j=i+1; j < n; j++)
if(Ds[i].Luong > Ds[j].Luong)
{
Tam = Ds[i];
Ds[i] = Ds[j];
Ds[j] = Tam;
}
}
Ví dụ 2:
Như ví dụ 1, nhưng yêu cầu khởi tạo danh sách nhân viên Ds (không nhập từ
bàn phím theo hàm nhập) và thêm chức năng sau:
• Sửa đổi thông tin một nhân viên khi biết mã nhân viên
Thực hiện:
Bước 1: Tạo Project với tên “Lab8_Vd2”.
Bước 2: Tạo tập tin chương trình vd2.cpp
Bước 3: Trong tập tin vd2.cpp, soạn code theo cấu trúc:
// (Như ví dụ 1)
//. . .
//Thêm hàm sửa thông tin
void SuaTT(NHANVIEN Ds[MAX], int n, char MaNV[10]);
void main()

{
int Chon;
//Khoi dau danh sach nhan vien
NHANVIEN Ds[MAX]= {
{"TV0001", "Tran ", "Ngoc Hoa",32,"Da Lat",910345321,3.5,"Tai vu"},
{"TV0002", "Truong Ve", "Kien",38,"Da Lat",911345189,4.0,"Tai vu"},
{"TC0002", "Ly Nhuoc ", "Dong",24,"Bao Loc",900100040,2.0,"To chuc"},
{"TC0005", "Nguyen ", "Thi",33,"Bao Loc",911675341,3.0,"To chuc"},
{"TC0008", "Vu ", "Thuy",58,"Da Lat",901605308,4.0,"To chuc"},
{"DT0003", "Duong ", "Tu Quynh",30,"Sai gon",900786453,3.0,"Dao tao"},
// . . .
{"DT0005", "Trinh Y ", "Kien",30,"Hong Kong",901,6.0,"Dao tao"}
};
int n = 7;
do
{
Chon = ChonMenu();
XL_Menu( Ds, n, Chon);
}
while(1);
}
//Hàm menu thêm : cout<<"\n4. Sua thong tin";
void XL_Menu(NHANVIEN Ds[MAX], int n, int Chon)
{
char MaNV[10];
char Phong[20];
switch(Chon)
{
//Case 1: như vd1
//Case 2:

//Case 3:
case 4:
cout<<"\n4. Sua thong tin";
cout<<"\nDanh sach nhan vien:\n";
_flushall();
Xuat(Ds, n);
cout<<"\nNhap Ma nhan vien : ";
_flushall();
gets(MaNV);
SuaTT(Ds,n,MaNV);
cout<<"\nDanh sach nhan vien da sua:\n";
Xuat(Ds, n);
cout<<'\n';
break;
case 5:
cout<<"\n5. Thoat khoi CT!\n";
exit(1);
}
}
//void Xuat ( NHANVIEN Ds[MAX], int n)
//void DSPhong ( NHANVIEN Ds[MAX], int n, char Phong[20])
//void DSLuong_Tang ( NHANVIEN Ds[MAX], int n)
//Sua thong tin mot nhan vien khi biet ma so
void SuaTT(NHANVIEN Ds[MAX], int n, char MaNV[10])
{
int i;
char Kt;
char HoNV[15];
char TenNV[10];
unsigned int Tuoi;

char Dc[10];
int Sdt;
double Luong;
char Phong[20];
for( i = 0; i < n-1; i++)
if(stricmp(Ds[i].MaNV, MaNV)==0)
{
_flushall();
cout<<"\nSua ho khong ?";
cout<<"\nKt = ";
Kt = _getch();
if(Kt != 'K' && Kt != 'k')
{
_flushall();
cout<<"\nNhap ho NV: ";
gets(HoNV);
strcpy(Ds[i].HoNV, HoNV);
}
cout<<"\nSua ten khong ?";
cout<<"\nKt = ";
Kt = _getch();
if(Kt != 'K' && Kt != 'k')
{
_flushall();
cout<<"\nNhap Ten NV: ";
gets(TenNV);
strcpy(Ds[i].TenNV, TenNV);
}
_flushall();
cout<<"\nSua tuoi khong ?";

cout<<"\nKt = ";
Kt = _getch();
if(Kt != 'K' && Kt != 'k')
{
cout<<"\nNhap tuoi NV: ";
cin>>Tuoi;
Ds[i].Tuoi = Tuoi;
}
_flushall();
cout<<"\nSua Dia chi khong ?";
cout<<"\nKt = ";
Kt = _getch();
if(Kt != 'K' && Kt != 'k')
{
_flushall();
cout<<"\nNhap dia chi NV: ";
gets(Dc);
strcpy(Ds[i].Dc, Dc);
}
cout<<"\nSua So dien thoai khong ?";
_flushall();
cout<<"\nKt = ";
Kt = _getch();
if(Kt != 'K' && Kt != 'k')
{
cout<<"\nNhap so dien thoai NV: ";
cin>>Sdt;
Ds[i].Sdt = Sdt;
}
cout<<"\nSua tien luong khong ?";

cout<<"\nKt = ";
Kt = _getch();
if(Kt != 'K' && Kt != 'k')
{
cout<<"\nNhap luong NV: ";
cin>>Luong;
Ds[i].Luong = Luong;
}
cout<<"\nSua ten phong khong ?";
cout<<"\nKt = ";
Kt = _getch();
if(Kt != 'K' && Kt != 'k')
{
_flushall();
cout<<"\nNhap phong: ";
gets(Phong);
strcpy(Ds[i].Phong, Phong);
}
}
}
// hàm strcpy(Chuoi1, Chuoi2) : copy Chuỗi 2 vào Chuỗi 1
D. Bài tập
Bài 1:
Học sinh được quản lý theo các thông tin sau:
 mã số học sinh,
 Họ,
 Tên,
 tuổi,
 điểm trung bình.
Chương trình tổ chức menu thực hiện các chức năng sau:

• Nhập vào danh sách lớp
• In ra danh sách lớp theo thứ tự giảm dần theo điểm trung bình. (theo thứ tự tự
điển).
• Tìm và in thông tin sinh viên theo tên ( tên sinh viên được nhập vào  thực
hiện tìm theo tên đã nhập).
• In ra danh sách học sinh phải thi lại và tổng số học sinh thi lại. Biết rằng phải
thi lại nếu điểm trung bình nhỏ hơn 5 và lớn hơn hoặc bằng 3.
• In ra danh sách học sinh có điểm trung bình >=8 và <=9.
• Thực hiện xếp loại học sinh. Biết rằng:
 9<=điểm trung bình <=10: xuất sắc
 8<=điểm trung bình <9: giỏi
 7<=điểm trung bình <8: khá
 6.5<=điểm trung bình <7: trung bình khá
 5<=điểm trung bình <6.5: trung bình
 3<=điểm trung bình <5: yếu
 0<=điểm trung bình <3: kém
Bài 2:
Viết chương trình quản lý các khách hàng thuê bao điện thoại, trong đó sử dụng cấu
trúc gồm
 Mã khách hàng,
 Họ tên,
 Địa chỉ,
 Số điện thoại.
Yêu cầu chương trình thực hiện các chức năng sau:
• Tìm kiếm số điện thoại khi biết họ tên
• Tìm kiếm họ tên khi biết số điện thoại
• Tìm kiếm địa chỉ khi biết số điện thoại
Bài 3
Viết chương trình thực hiện các phép toán cộng, trừ, nhân, chia các số hữu tỷ.

×