You are on page 1of 8

STRUCT-DỮ LIỆU CẤU TRÚC

Phần 1. Struct
Ví dụ 1. Khai báo một cấu trúc mô tả một điểm trên tọa độ xOy. Sau đó viết hàm thực hiện
các chức năng sau:
 Nhập, xuất điểm.
 Tính khoảng cách giữa 2 điểm.
 Tìm trung điểm của đoạn AB (bài tập về nhà)
 Kiểm tra điểm có nằm trên trục tung/trục hoành (bài tập về nhà)
 Tìm điểm đối xứng của 1 điểm qua trục tung/trục hoành (bài tập về nhà)
#include<stdio.h>
#include<conio.h>
#include<math.h>
struct Diem
{
float X;
float Y;
};
void NhapDiem(Diem &);
void XuatDiem(Diem);
float TinhKhoangCachGiua2Diem(Diem, Diem);
void main()
{
Diem A, B;
printf("\nDiem A: ");
NhapDiem(A);
XuatDiem(A);
printf("\nDiem B: ");
NhapDiem(B);
XuatDiem(B);
float khoangcach = TinhKhoangCachGiua2Diem(A, B);
printf("\nKhoang cach giua 2 Diem A, B = %.2f", khoangcach);
getch();
}
//Nhập tọa độ điểm
void NhapDiem(Diem &a)
{
printf("\nNhap hoanh do: ");
scanf("%f", &a.X);
printf("\nNhap tung do: ");
scanf("%f", &a.Y);
}
//Xuất tọa độ điểm theo định dạng (x, y)
1
void XuatDiem(Diem a)
{
printf("(%.2f, %.2f)", a.X, a.Y);
}
// Tính khoảng cách giữa 2 điểm trong không gian
float TinhKhoangCachGiua2Diem(Diem a, Diem b)
{
return sqrt(pow((b.X - a.X), 2) + pow((b.Y - a.Y), 2) );
}

Kết quả chương trình

Ví dụ 2. Khai báo cấu trúc PhanSo cần thiết lưu trữ thông tin phân số, sau đó viết hàm thực
hiện các chức năng:
 Nhập phân số.
 Xuất phân số.
 Kiểm tra phân số mẫu phải khác 0.
 Tối giản phân số.
 Tính tổng của hai phân số.(Bài tập về nhà)
 Tính hiệu của hai phân số.(Bài tập về nhà)
 Tính tích của hai phân số.(Bài tập về nhà)
 Tính thươngcủa hai phân số.(Bài tập về nhà)
#include<stdio.h>
#include<conio.h>
#include<math.h>
//Khai báo struct phân số
struct phanso
{
int tu;
int mau;
};
void nhapphanso(phanso &ps);
void xuatphanso(phanso ps);
int ULCN(int a, int b);
void toigian(phanso &ps);
phanso tongps(phanso x,phanso y);

//Hàm main
void main()
{
2
phanso x,y;
printf("\nNhap phan so thu nhat ");
nhapphanso(x);
xuatphanso(x);
printf("\nNhap phan so thu 2");
nhapphanso(y);
xuatphanso(y);
toigian(x);
toigian(y);
printf("\nPhan so thu nhat sau khi toi gian la: ");
xuatphanso(x);
printf("\nPhan so thu hai sau khi toi gian la: ");
xuatphanso(y);
phanso tong= tongps(x,y);
printf("\n Tong 2 phan so la: ");
xuatphanso(tong);
getch();

}
//Viết hàm nhập
void nhapphanso(phanso &ps)
{
printf("\nNhap vao tu so: ");
scanf("%d",&ps.tu);
do
{
printf("\nNhap vao mau so: ");
scanf("%d",&ps.mau);
if(ps.mau==0)
printf("\nMau phai khac khong\nVui long kiem tra lai");
}while(ps.mau==0);
}
//Viết hàm xuất
void xuatphanso(phanso ps)
{
printf("Phan so: %d / %d",ps.tu,ps.mau);
}
//Viết hàm tìm ước chung lớn nhất
int UCLN(int a, int b)
{
a=abs(a);
b=abs(b);
while(a!=b)
{
if(a>b)
a=a-b;
else
b=b-a;
}
return a;
}
//Viết hàm tối giản phân số
void toigian(phanso &ps)
{
3
int c=UCLN(ps.tu,ps.mau);
ps.tu=ps.tu/c;
ps.mau=ps.mau/c;
}
//Viết hàm tính tổng 2 phân số
phanso tongps(phanso a,phanso b)
{ Kết quả của tổng 2 phân số là 1 phân số nên kiểu
phanso tong; trả về của hàm này là phanso
tong.tu=a.tu*b.mau+b.tu*a.mau;
tong.mau=a.mau*b.mau;
toigian(tong);
return tong;
}

Kết quả chương trình

PHẦN 2. MẢNG CẤU TRÚC

Ví dụ 3. Bài toán đặt ra: Một sinh viên có các thông tin bao gồm: Tên sinh viên, mã số sinh
viên, năm sinh, điểm trung bình và số ngày nghỉ. Nhà trường cần nhập thông tin của tất cả các
sinh viên đang theo học tại trường và lập ra danh sách các học sinh có thành tích tốt trong học
tập ( điểm trung bình lớn hơn 7.0) để khen thưởng và danh sách các học sinh có số ngày nghỉ
lớn hơn 3 để ra nhắc nhở sinh viên đó.
Giải quyết bài toán: Do trong ngôn ngữ C/C++ không có kiểu dữ liệu SinhVien nên chúng ta cần tạo
ra một Struct chứa tất cả các kiểu dữ liệu thõa mãn đề bài. Ngoài ra để xử lí được yêu cầu của bài
toán chúng ta cần phải tại thêm một mảng 1 chiều cho kiểu dữ liệu SinhVien.
Mảng a Sinh Sinh Sinh Sinh Sinh Sinh Sinh Sinh Sinh
viên viên viên viên viên viên viên viên viên
0 1 2 3 n-1

 Khai báo Struct SinhVien cho chương trình


 Viết hàm nhập thông tin cho 1 sinh viên
 Viết hàm xuất thông tin cho 1 sinh viên
 Viết hàm nhập mảng sinh viên (gồm n sinh viên)
 Viết hàm xuất mảng sinh viên(xuất danh sách sinh viên)

4
 Viết hàm xuất ra danh sách sinh viên có thành tích tốt trong học tập ( điểm trung bình lớn hơn
7.0) để khen thưởng
 Viết hàm xuất ra danh sách các học sinh có số ngày nghỉ lớn hơn 3 để ra nhắc nhở sinh viên đó.
#include<stdio.h>
#include<conio.h>

struct SinhVien
{
char ten[20];
char ma[10];
int namsinh;
float dtb;
int songaynghi;
};
void NhapSV(SinhVien &a);
void XuatSV(SinhVien a);
void NhapMang(SinhVien a[], int &n);
void XuatMang(SinhVien a[], int n);
void SVTot(SinhVien a[], int n);
void SVNhacNho(SinhVien a[], int n);
void main()
{
SinhVien A[100];
int N;
NhapMang(A, N);
XuatMang(A, N);
SVTot(A,N);
SVNhacNho(A,N);
getch();
} Tại sao dùng lệnh
fflush, các em coi phần
sau ở cuối file này cô
void NhapSV(SinhVien &a) có ghi chú
{
printf("Ten:");
fflush(stdin);
gets(a.ten);
printf("Ma so:");
fflush(stdin);
gets(a.ma);
printf("Nam sinh :");
scanf("%d", &a.namsinh);
printf("Diem Trung Binh:");
scanf("%f", &a.dtb);
printf("So ngay nghi: ");
scanf("%d", &a.songaynghi);
}
void XuatSV(SinhVien a)
{
printf("\n\tTen: %s",a.ten);
printf("\n\tMa: %s",a.ma);
printf("\n\tNam Sinh: %d",a.namsinh);
printf("\n\tSo Ngay Nghi: %d",a.songaynghi);
5
printf("\n\tSo Diem TB: %f",a.dtb);
}

void NhapMang(SinhVien a[], int &n)


{
do{
printf("Cho biet so Sinh vien: ");
scanf("%d", &n);
} while (n <= 0);
for (int i = 0; i < n; i++)
{
printf("\nNhap thong tin sinh vien thu %d\n",i+1);
NhapSV(a[i]);
}
a[i] là 1 sinh viên
}
void XuatMang(SinhVien a[], int n)
{
printf("\nDanh sach lop hoc:");
for (int i = 0; i < n; i++)
XuatSV(a[i]);
}
void SVTot(SinhVien a[], int n)
{
printf("\nDanh sach cac sinh vien lam bai tot\n");
for (int i = 0; i < n; i++)
{
if (a[i].dtb >= 7.0)
XuatSV(a[i]);
}
}
void SVNhacNho(SinhVien a[], int n)
{
printf("\nDanh sach cac sinh vien bi NHAC NHO\n");
for (int i = 0; i < n; i++)
{
if (a[i].songaynghi >= 3)
XuatSV(a[i]);
}
}

6
BÀI TẬP VỀ NHÀ
Câu 1. Viết tiếp các hàm cô chưa viết trên ví dụ 1/ trang 1
Câu 2. Viết tiếp các hàm cô chưa viết trên ví dụ 2/ trang 2
Câu 3. Khai báo cấu trúc HinhChuNhat cần thiết lưu trữ thông tin hình chữ nhật, sau đó thực
hiện các chức năng: (Lưu ý: Viết chương trình dạng hàm).
Yêu cầu:

7
1.Nhập thông tin cho kiểu dữ liệu HinhChuNhat.
2.Xuất thông tin cho kiểu dữ liệu HinhChuNhat.
3.Tính chu vi hình chữ nhật
4.Tính diện tích hình chữ nhật
Câu 4. Khai báo cấu trúc SinhVien cần thiết lưu trữ thông tin sinh viên (tên-kiểu chuổi, tuổi,
điểm của sinh viên), sau đó thực hiện các chức năng: (Lưu ý: Viết chương trình dạng hàm).
Yêu cầu:
1.Nhập thông tin cho kiểu dữ liệu SinhVien.
Bài này ko dùng
2.Xuất thông tin cho kiểu dữ liệu SinhVien mảng sinh vien
3.So sánh tuổi của 2 sinh viên
Chỉ khai báo 2 biến
4.Kiểm tra xem 2 sinh viên có trùng tên hay không
sinh viên

Câu 5. Làm tiếp ví dụ 3/trang 4:


1. Tính tổng ngày vắng của tất cả sinh viên trong danh sách
2. Tính trung bình điểm của tất cả sinh viên trong danh sách
3. Tìm mã số của sinh viên có điểm cao nhất danh sách
4. Xuất danh sách sinh viên có điểm nằm trong đoạn [7-9]
5. Xuất 5 sinh viên có điểm cao nhất danh sách

Chúc các em làm tốt. Cố gắng sẽ thành công☺

Phụ lục: Cách dùng hàm fflush(stdin), các em kham khảo:


http://laptrinhc.edu.vn/bai-28-cach-dung-ham-fflushstdin.html

You might also like