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

pdf28 trang | Chia sẻ: huongthu9 | Lượt xem: 384 | Lượt tải: 0download
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:

  • pdfgiao_trinh_lap_trinh_bang_ngon_ngu_c_chuong_7_cau_truc_struc.pdf