Giáo trình Lập trình bằng ngôn ngữ C - Chương 7: Cấu trúc (Struct) - Ngô Văn Linh
Thông tin về một học sinh lưu trong một cấu trúc gồm các
trường: Mã số (8 ký tự), Họ tên (không quá 30 ký tự),
Điểm toán (số thực). Hãy viết một chương trình hoàn
chỉnh thực hiện các công việc sau:
a) Nhập vào danh sách học sinh của một lớp (biết rằng lớp
này có không quá 30 học sinh). Quá trình nhập kết thúc
khi đã nhập đủ 30 học sinh hoặc khi nhập Mã số là xâu
"$$$".
b) Sắp xếp danh sách học sinh theo thứ tự giảm dần của
Điểm toán và hiển thị danh sách này ra màn hình
28 trang |
Chia sẻ: huongthu9 | Lượt xem: 483 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Lập trình bằng ngôn ngữ C - Chương 7: Cấu trúc (Struct) - Ngô Văn Linh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1Chương 7
Cấu trúc (struct)
Ngo Van Linh
Bộ môn Hệ thống thông tin
Viện Công nghệ thông tin và Truyền thông
Đại học Bách Khoa Hà Nội
2Nội dung
7.1. Khái niệm cấu trúc
7.2. Khai báo và sử dụng cấu trúc
7.3. Xử lí dữ liệu cấu trúc
7.4. Mảng cấu trúc
7.5. Bài tập
37.1. Khái niệm cấu trúc
Kiểu dữ liệu cấu trúc (struct) là kiểu dữ
liệu phức hợp bao gồm nhiều thành phần,
mỗi thành phần có thể thuộc những kiểu dữ
liệu khác nhau.
Các thành phần dữ liệu trong cấu trúc được
gọi là các trường dữ liệu (field).
47.1. Khái niệm cấu trúc (tiếp)
Ví dụ: Cấu trúc mô tả sinh viên:
Cần lưu giữ các thông tin liên quan đến sinh
viên như họ tên, tuổi, kết quả học tập
Mỗi thông tin thành phần lại có kiểu dữ liệu
khác nhau như họ tên có kiểu dữ liệu là xâu kí
tự, tuổi có kiểu dữ liệu là số nguyên, kết quả
học tập có kiểu dữ liệu là số thực.
5Nội dung
7.1. Khái niệm cấu trúc
7.2. Khai báo và sử dụng cấu trúc
7.3. Xử lí dữ liệu cấu trúc
7.4. Mảng cấu trúc
7.5. Bài tập
67.2. Khai báo kiểu dữ liệu cấu trúc
Cú pháp:
struct ten_cau_truc
{
;
};
Ví dụ:
struct sinh_vien
{
char ma_so_sinh_vien[10];
char ho_va_ten[30];
float diem_TinDC;
};
77.2.2. Khai báo biến cấu trúc
Cú pháp:
struct ten_cau_truc ten_bien_cau_truc;
Ví dụ:
struct sinh_vien a, b, c;
87.2.3. Khai báo kết hợp
Có thể kết hợp vừa khai báo kiểu dữ liệu cấu trúc
vừa khai báo biến cấu trúc:
struct [ten_cau_truc]
{
//khai_bao_cac_truong;
} ten_bien_cau_truc;
Ví dụ:
struct thi_sinh
{
char SBD[10]; // so bao danh
char ho_va_ten[30];
struct diem_thi ket_qua;
} thi_sinh_1, thi_sinh_2;
97.2.4. Định nghĩa kiểu dữ liệu cấu trúc với typedef
Đặt tên mới cho kiểu dữ liệu cấu trúc cú
pháp:
typedef struct tên_cũ ten_moi;
Hoặc ta có thể đặt lại tên cho cấu trúc ngay
khi khai báo bằng cú pháp
typedef struct [tên_cũ]
{
//khai_bao_cac_truong;
}danh_sach_cac_tên_mới;
10
7.2.4. Định nghĩa kiểu dữ liệu cấu trúc với
typedef (tiếp)
Lưu ý: Được phép đặt tên_mới trùng với
tên_cũ.
Ví dụ:
struct point_3D
{
float x, y, z;
} P;
struct point_3D M;
typedef struct point_3D p_3D;
p_3D N;
11
Nội dung
7.1. Khái niệm cấu trúc
7.2. Khai báo và sử dụng cấu trúc
7.3. Xử lí dữ liệu cấu trúc
7.4. Mảng cấu trúc
7.5. Bài tập
12
7.3. Xử lý dữ liệu cấu trúc
Truy nhập các trường dữ liệu của cấu trúc
Phép gán giữa các biến cấu trúc
Con trỏ cấu trúc
13
7.3.1. Truy nhập các trường dữ liệu
của cấu trúc
Cú pháp:
ten_bien_cau_truc.ten_truong
Ví dụ:
struct point_2D
{
char ten_diem;
float x, y;
} p;
Truy cập tên của 1 điểm: p.ten_diem
14
7.3.2. Phép gán giữa các biến cấu trúc
Giả sử ta có 2 biến cấu trúc là a và b có
cùng kiểu dữ liệu là một cấu trúc
nào đó.
Phép gán cấu trúc có cú pháp tương tự như
phép gán thông thường:
bien_cau_truc_1 = bien_cau_truc_2;
15
7.3.3. Con trỏ cấu trúc
Cú pháp:
struct ten_cau_truc *ten_bien_con_tro_ctruc;
Có 2 cách truy nhập vào trường dữ liệu của
cấu trúc từ biến con trỏ cấu trúc là
(*ten_bien_con_tro_ctruc).ten_truong_du_lieu
Hoặc:
ten_bien_con_tro_ctruc->ten_truong_du_lieu
16
Nội dung
7.1. Khái niệm cấu trúc
7.2. Khai báo và sử dụng cấu trúc
7.3. Xử lí dữ liệu cấu trúc
7.4. Mảng cấu trúc
7.5. Bài tập
17
7.4. Mảng cấu trúc
Cú pháp:
struct ten_cau_truc ten_mang_ctruc[so_ptu];
Ví dụ:
struct sinh_vien
{
char ho_ten[20];
float diem_thi;
};
struct sinh_vien lop_Tin5[80];
18
Ví dụ
#include
#include
#include
void main()
{
struct sinh_vien
{
char ma_sv[10];
char ho_ten[20];
float diem_thi;
};
struct sinh_vien sv[3];
int i;
clrscr();
19
Ví dụ (tiếp)
for(i=0;i<3;i++)
{
char str[20];
float diem;
printf(“\nNhap thong tin cho sinh vien %d”,i+1);
printf(“\nMa so sinh vien:”);
fflush(stdin); gets(str);
strcpy(sv[i].ma_sv,str);
printf(“\n Ho va ten: “);
fflush(stdin); gets(str);
strcpy(sv[i].ho_ten,str);
printf(“\n Diem thi: “);
scanf(“%f”,&diem);
sv[i].diem_thi = diem;
}
20
Ví dụ (tiếp)
printf(“\n Thong tin ve cac sinh
vien”);
for(i=0;i<3;i++)
{
printf(“\n Sinh vien thu %d ”,i+1);
printf(“%-10s %-20s %-3.1f”,
sv[i].ma_sv, sv[i].ho_ten,
sv[i].diem_thi);
}
getch();
}
21
Ví dụ - Kết quả
Nhap thong tin cho sinh vien thu 1
Ma so sinh vien: SV0032
Ho va ten: Nguyen Thanh Binh
Diem thi: 8.5
Nhap thong tin cho sinh vien thu 2
Ma so sinh vien: SV0002
Ho va ten: Pham Hong Phuc
Diem thi: 9
Nhap thong tin cho sinh vien thu 3
Ma so sinh vien: SV0046
Ho va ten: Le Minh Hoa
Diem thi: 10
Thong tin ve cac sinh vien
Sinh vien thu 1: SV0032 Nguyen Thanh Binh 8.5
Sinh vien thu 2: SV0002 Pham Hong Phuc 9.0
Sinh vien thu 3: SV0046 Le Minh Hoa 10.0
22
Bài tập
Viết 1 chương trình thực hiện những công việc sau:
Yêu cầu người dùng nhập vào một số nguyên dương n
với 5 n 20 (có kiểm tra tính hợp lệ của giá trị được
nhập vào, nếu giá trị n nhập vào không thỏa mãn điều
kiện thì yêu cầu nhập lại)
Yêu cầu người dùng nhập vào thông tin của n sinh viên
gồm những mục sau
Họ và tên: có kiểu dữ liệu là xâu kí tự gồm không quá 30 kí tự
Lớp: xâu kí tự có độ dài không quá 5 kí tự
Điểm thi Tin đại cương: là một số nguyên có giá trị từ 0 đến 10
Đưa ra màn hình danh sách các sinh viên cùng thông
tin của họ mà người dùng vừa nhập vào.
23
Bài tập
Yêu cầu người dùng nhập vào từ bàn phím một
số thực. Đưa ra màn hình danh sách các sinh
viên có điểm thi Tin đại cương nhỏ hơn giá trị số
thực vừa nhập vào.
Đưa ra màn hình danh sách sinh viên được sắp
xếp theo chiều giảm dần của điểm thi Tin đại
cương.
Đưa ra màn hình danh sách sinh viên với họ và
tên được sắp xếp theo chiều của bảng chữ cái.
Bài tập có lời giải
Thông tin về một học sinh lưu trong một cấu trúc gồm các
trường: Mã số (8 ký tự), Họ tên (không quá 30 ký tự),
Điểm toán (số thực). Hãy viết một chương trình hoàn
chỉnh thực hiện các công việc sau:
a) Nhập vào danh sách học sinh của một lớp (biết rằng lớp
này có không quá 30 học sinh). Quá trình nhập kết thúc
khi đã nhập đủ 30 học sinh hoặc khi nhập Mã số là xâu
"$$$".
b) Sắp xếp danh sách học sinh theo thứ tự giảm dần của
Điểm toán và hiển thị danh sách này ra màn hình.
24
Lời giải
25
#include
#include
#include
typedef struct{
char maso[8];
char hoten[30];
float diemtoan;
}HOCSINH;
HOCSINH ds[30], tg;
int main(int argc, char *argv[])
{
int i,j,n = 0;
float diemtoan;
char maso[8];
char hoten[30];
26
for(i=0;i<30;i++){
printf("\nNhap ma so SV thu %d: ",i+1);fflush(stdin);scanf("%s",maso);
/*Neu nhap ma so la xau "$$$" thi dung viec nhap*/
if(strcmp(maso,"$$$")==0)break;
n++;
strcpy(ds[i].maso,maso);
printf("\nNhap ho ten: ");fflush(stdin);gets(hoten);
strcpy(ds[i].hoten,hoten);
printf("\nNhap diem toan: ");scanf("%f",&diemtoan);
ds[i].diemtoan = diemtoan;
}
/*Sap xep danh sach hoc sinh theo thu tu khong tang cua diem toan*/
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(ds[i].diemtoan < ds[j].diemtoan){
tg = ds[i];
ds[i] = ds[j];
ds[j] = tg;
}
27
/*Hien thi danh sach ra man hinh*/
printf("\n DANH SACH HOC SINH SAU KHI SAP XEP THEO DIEM TOAN");
printf("\n+--------+------------------------------+---------+");
printf("\n| Ma so | Ho ten |Diem toan|");
printf("\n+--------+------------------------------+---------+");
for(i=0;i<n;i++)
printf("\n|%8s|%30s|%9.1f|",ds[i].maso,ds[i].hoten,ds[i].diemtoan);
printf("\n+--------+------------------------------+---------+\n");
system("PAUSE");
return 0;
}
28
Hỏi - đáp
Các file đính kèm theo tài liệu này:
- giao_trinh_lap_trinh_bang_ngon_ngu_c_chuong_7_cau_truc_struc.pdf