Bài giảng Tin học đại cương - Phần 3, Chương 6: Cấu trúc

pptx 58 trang haiha333 07/01/2022 2460
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tin học đại cương - Phần 3, Chương 6: Cấu trúc", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptxbai_giang_tin_hoc_dai_cuong_phan_3_chuong_6_cau_truc.pptx

Nội dung text: Bài giảng Tin học đại cương - Phần 3, Chương 6: Cấu trúc

  1. Phần 3: Lập trình C Nội dung chính • Chương 1: Tổng quan về ngôn ngữ C • Chương 2: Kiểu dữ liệu và biểu thức trong C • Chương 3: Vào ra dữ liệu • Chương 4: Cấu trúc điều khiển • Chương 5: Mảng, con trỏ và xâu ký tự • Chương 6: Cấu trúc • Chương 7: Hàm • Chương 8: Tệp dữ liệu 01-Jan-16 346
  2. Chương 6: Cấu trúc Nội dung chính 1. Khái niệm cấu trúc • Khái niệm 2. Khai báo cấu trúc • Khái báo kiểu cấu trúc • Khai báo biến cấu trúc • Định nghĩa kiểu dữ liệu với typedef 3. Xử lý dữ liệu cấu trúc • Truy nhập các trường dữ liệu • Phép gán giữa các biến cấu trúc 4. Một số ví dụ 01-Jan-16 347
  3. Chương 6: Cấu trúc 6.1 Khái niệm cấu trúc Ví dụ → Bài toán quản lý thí sinh thi đại học Để quản lý cần lưu trữ các thông tin • Số báo danh: Số nguyên không dấu • Họ tên sinh viên: Chuỗi ký tự không quá 30 • Khối thi: Ký tự (A,B,C ) • Tổng điểm 3 môn thi: kiểu thực Do vậy với mỗi sinh viên cần các biến unsigned SBD; char Ten[30]; char KhoiThi; float KetQua; 01-Jan-16 348
  4. Chương 6: Cấu trúc 6.1 Khái niệm cấu trúc Ví dụ → Bài toán quản lý thí sinh thi đại học (tiếp) Để quản lý danh sách (dưới 1000) thí sinh dự thi, cần nhiều mảng rời rạc #define MAX 1000 unsigned DS_SBD[MAX]; char DS_Ten[MAX][30]; char DS_KhoiThi[MAX]; float DS_KetQua[MAX]; 01-Jan-16 349
  5. Chương 6: Cấu trúc 6.1 Khái niệm cấu trúc Ví dụ → Bài toán quản lý thí sinh thi đại học (tiếp) DS_SBD 123 456 789 DS_Ten Mảng ký tự Nguyễn Nguyễn TrầnAn VănAn Hoàng Nghĩa DS_KhoiThi A D A DS_KetQua 24.5 28.5 22.0 Biến điều khiển TS: Ti S: iT+S1:i+2 dùng duyệt mảng 01-Jan-16 350
  6. Chương 6: Cấu trúc 6.1 Khái niệm cấu trúc Ví dụ → Vấn đề & giải pháp Dùng nhiều mảng - Khó quản lý, dễ nhầm lẫn - Không thể hiện cấu trúc thông tin dành cho từng thí sinh Cấu trúc thông tin Mảng các cấu dành cho một thí sinh trúc thông tin dành cho thí sinh THÔNGTHÔNG TIN TIN THÍ THÍSINHSINH Số báo danh: 123 Số báo danh: THÔNGHọ TINvà TênTHÍ: SINHNguyễn Văn An. THÔNGHọ TINvà TênTHÍ:SINH . Số báo danh: Số báo danhKhốiKhối: thithi: : A . . Họ và Tên: Họ và TênKết: Kếtquảquả: : 24.5 KhốiKhốithi thi: : . . Kết quả: Kết quả: . . Mỗi phần tử của mảng 01-Jan-16 là một cấu trúc thông351tin
  7. Chương 6: Cấu trúc 6.1 Khái niệm cấu trúc Khái niệm • Cấu trúc là kiểu dữ liệu phức hợp, do người dụng tự định nghĩa – Kiểu cấu trúc bao gồm nhiều thành phần có thể thuộc các kiểu dữ liệu khác nhau – Các thành phần: gọi là trường dữ liệu (field) – Các thành phần, không được truy nhập theo chỉ số (như mảng) mà theo tên của trường. Có thể coi một biến cấu trúc là một tập hợp của một hay nhiều biến rời rạc, thường có kiểu khác nhau thành một biến có một tên duy nhất để dễ dàng quản lý và sử dụng 01-Jan-16 352
  8. Chương 6: Cấu trúc 6.1 Khái niệm cấu trúc Khái niệm → Ví dụ • Kết quả học tập của sinh viên – TenSV: Chuỗi ký tự – MaSV: Chuỗi số/ số nguyên – Điem: Số thực • Điểm trong mặt phẳng – Tên điểm: Ký tự (A, B, C ) – Hoành độ: Số thực – Tung độ: Số thực 01-Jan-16 353
  9. Chương 6: Cấu trúc Nội dung chính 1. Khái niệm cấu trúc • Khái niệm 2. Khai báo cấu trúc • Khái báo kiểu cấu trúc • Khai báo biến cấu trúc • Định nghĩa kiểu dữ liệu với typedef 3. Xử lý dữ liệu cấu trúc • Truy nhập các trường dữ liệu • Phép gán giữa các biến cấu trúc 4. Một số ví dụ 01-Jan-16 354
  10. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Khai báo kiểu cấu trúc struct Tên_kiểu_cấu_ trúc { }; • struct: từ khóa, cho phép người dùng khai báo kiểu dữ liệu mới: kiểu cấu trúc • Tên_kiểu_cấu_truc: Tên của kiểu cấu trúc do người dùng tự định nghĩa – Tuân theo nguyên tắc đặt tên đối tượng trong C • Khai báo các trường dữ liệu: Danh sách các khai báo thành phần (trường:field) của cấu trúc – Giống khai báo biến – Các trường có thể có kiểu bất kỳ 01-Jan-16 355
  11. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Khai báo kiểu cấu trúc → Ví dụ Thẻ sinh viên struct SinhVien{ Số hiệu: (Chuỗi ký tự) char SHSV[10]; Tên sinh viên: (Chuỗi ký tự) char Ten[30]; Năm sinh: (Số nguyên) int NS; Khóa: (Số nguyên) . int Khoa; Lớp: :.(Chuỗi ký tự). char Lop [10]; }; Point2D struct Point{ Hoành độ (x) (Số thực) float x, y; Tung độ (y) (Số thực) }; 01-Jan-16 356
  12. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Khai báo biến cấu trúc • Khai báo kiểu cấu trúc nhằm tạo định nghĩa toàn thể cho các cấu trúc sẽ được dùng sau này – Không cung cấp không gian nhớ cho kiểu • Khai báo biến cấu trúc nhằm yêu cầu chương trình tạo vùng nhớ để lưu trữ các dữ liệu cho biến cấu trúc – Chứa dữ liệu của các trường của cấu trúc 01-Jan-16 357
  13. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Khai báo biến cấu trúc → Cú pháp Tồn tại định nghĩa kiểu cấu trúc struct Kiểu_cấu_ trúc Tên_biến; Khai báo trực tiếp struct { }Tên_biến; Kết hợp với khai báo kiểu struct Kiểu_cấu_ trúc { }Tên_biến; 01-Jan-16 358
  14. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Khai báo biến cấu trúc → Ví dụ Tồn tại định nghĩa kiểu cấu trúc struct SinhVien SV1, SV2, Thu khoa; Khai báo trực tiếp struct { float x, y; //Tọa độ trên mặt phẳng }A, B; //Khai báo 2 điểm A, B Kết hợp với khai báo kiểu struct Point_3D{ float x, y, z;// Tọa độ không gian }A, B; 01-Jan-16 359
  15. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Khai báo biến cấu trúc →Chú ý Các cấu trúc có thể được khai báo lồng nhau struct diem_thi { float dToan, dLy, dHoa; } struct thi_sinh{ char SBD[10]; char ho_va_ten[30]; struct diem_thi ket_qua; } thi_sinh_1, thi_sinh_2; 01-Jan-16 360
  16. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Khai báo biến cấu trúc →Chú ý Có thể khai báo trực tiếp các trường dữ liệu của một cấu trúc bên trong cấu trúc khác struct thi_sinh{ char SBD[10]; char ho_va_ten[30]; struct{ float dToan, dLy, dHoa; } ket_qua; } thi_sinh_1, thi_sinh_2; 01-Jan-16 361
  17. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Khai báo biến cấu trúc →Chú ý Có thể gán giá trị khởi đầu cho một biến cấu trúc, theo nguyên tắc như kiểu mảng Ví dụ: struct SinhVien{ struct Date{ char Ten[20]; int day; struct Date{ int month; int day; int year; int month; }; int year; struct SinhVien{ } NS; char Ten[30]; } SV = {“Tran Anh", 20,12,1990 }; struct Date NS; } SV = {“Tran Anh", 20, 12, 1990 }; 01-Jan-16 362
  18. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Định nghĩa kiểu dữ liệu với typedef typedef ; Mục đích • Đặt tên mới đồng nghĩa với tên của một kiểu dữ liệu đã được định nghĩa – Thường được sử dụng cho kiểu cấu trúc • Giúp cho khai báo trở nên quen thuộc và ít bị sai hơn Ví dụ typedef char Str80[80] ; typedef long mask; Str80 str="Bonjour tout le monde !"; mask a, b; 01-Jan-16 363
  19. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Định nghĩa kiểu dữ liệu với typedef Thường được kết hợp với kiểu cấu trúc để khai báo một bí danh cho một cấu trúc – Giúp khai báo trở nên quen thuộc và ít bị sai hơn typedef struct { //Định nghĩa một cấu trúc char SHSV[10]; char Ten[30]; int NS; int Khoa; char Lop [10]; } SinhVien; //Đặt tên cho cấu trúc là SinhVien SinhVien SV; //Tạo một biến cấu trúc 01-Jan-16 364
  20. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Định nghĩa kiểu dữ liệu với typedef →Chú ý Cho phép đặt tên mới trùng với tên cũ Ví dụ typedef struct { struct point_3D{ float x, y, z; float x, y, z; }point_3D; point_3D M; } point_3D N; struct point_3D M; typedef struct point_3D point_3D; point_3D N; 01-Jan-16 365
  21. Chương 6: Cấu trúc 6.2 Khai báo cấu trúc Định nghĩa kiểu dữ liệu với typedef →Chú ý typedef struct point_2D { float x, y; }point_2D, diem_2_chieu, ten_bat_ki; point_2D X; diem_2_chieu Y; ten_bat_ki Z; Chú ý: point_2D, diem_2_chieu, ten_bat_ki là các tên cấu trúc, không phải tên biến 01-Jan-16 366
  22. Chương 6: Cấu trúc Nội dung chính 1. Khái niệm cấu trúc • Khái niệm 2. Khai báo cấu trúc • Khái báo kiểu cấu trúc • Khai báo biến cấu trúc • Định nghĩa kiểu dữ liệu với typedef 3. Xử lý dữ liệu cấu trúc • Truy nhập các trường dữ liệu • Phép gán giữa các biến cấu trúc 4. Một số ví dụ 01-Jan-16 367
  23. Chương 6: Cấu trúc 6.3 Xử lý dữ liệu cấu trúc Truy cập các trường dữ liệu • Cú pháp tên_biến_cấu_trúc.tên_trường • Lưu ý – Dấu “.” là toán tử truy cập vào trường dữ liệu trong cấu trúc – Nếu trường dữ liệu là một cấu trúc => sử dụng tiếp dấu “.” để truy cập vào thành phần mức sâu hơn 01-Jan-16 368
  24. Chương 6: Cấu trúc 6.3 Xử lý dữ liệu cấu trúc Ví dụ #include void main(){ struct{ char Ten[20]; struct Date{ int day; int month; int year; } NS; } SV = {"Tran Anh", 20,12, 1990 }; printf(" Sinh vien %s (%d/%d/%d)", SV.Ten,SV.NS.day,SV.NS.month,SV.NS.year); } 01-Jan-16 369
  25. Chương 6: Cấu trúc 6.3 Xử lý dữ liệu cấu trúc Ví dụ Bài toán: Xây dựng một cấu trúc biểu diễn điểm trong không gian 2 chiều. – Nhập giá trị cho một biến kiểu cấu trúc này – Hiển thị giá trị các trường dữ liệu của biến này ra màn hình. Thực hiện: – Cấu trúc gồm: tên điểm, tọa độ x, tọa độ y – Nhập, hiển thị từng trường của biến cấu trúc như các biến dữ liệu khác 01-Jan-16 370
  26. Chương 6: Cấu trúc 6.3 Xử lý dữ liệu cấu trúc Ví dụ #include #include typedef struct{ char ten[5]; int x,y; }toado; void main(){ toado t; printf("Nhap thong tin toa do\n"); printf("Ten diem: ");gets(t.ten); printf("Toa do x: ");scanf("%d",&t.x); printf("Toa do y: ");scanf("%d",&t.y); printf("Gia tri cac truong\n"); printf("%-5s%3d%3d\n",t.ten,t.x,t.y); getch(); 0}1-Jan-16 371
  27. Chương 6: Cấu trúc 6.3 Xử lý dữ liệu cấu trúc Phép gán giữa các biến cấu trúc • C cho phép gán hai biến cấu trúc cùng kiểu: Biến_cấu_trúc_1 = biến_cấu_trúc_2 • Ví dụ – Xây dựng cấu trúc gồm họ tên và điểm TĐC của sinh viên – Khai báo 3 biến cấu trúc: a, b, c – Nhập giá trị cho biến a. – Gán biến a cho biến b – gán từng trường của a cho c. – So sánh a, b và c ? 01-Jan-16 372
  28. Chương 6: Cấu trúc 6.3 Xử lý dữ liệu cấu trúc Ví dụ #include typedef struct{ char hoten[20]; int diem; }sinhvien; void main(){ sinhvien a,b,c; printf("Nhap thong tin sinh vien\n"); printf("Ho ten: ");gets(a.hoten); printf("Diem:");scanf("%d",&a.diem); 01-Jan-16 373
  29. Chương 6: Cấu trúc 6.3 Xử lý dữ liệu cấu trúc Ví dụ b=a; //Gán biến cấu trúc strcpy(c.hoten,a.hoten); //Gán từng trường c.diem=a.diem; printf(“Bien a: "); printf("%-20s%3d\n",a.hoten,a.diem); printf(“Bien b: "); printf("%-20s%3d\n",b.hoten,b.diem); printf(“Bien c: "); printf("%-20s%3d\n",c.hoten,c.diem); } 01-Jan-16 374
  30. Chương 6: Cấu trúc 6.3 Xử lý dữ liệu cấu trúc Ví dụ →Kết quả 01-Jan-16 375
  31. Chương 6: Cấu trúc Nội dung chính 1. Khái niệm cấu trúc • Khái niệm 2. Khai báo cấu trúc • Khái báo kiểu cấu trúc • Khai báo biến cấu trúc • Định nghĩa kiểu dữ liệu với typedef 3. Xử lý dữ liệu cấu trúc • Truy nhập các trường dữ liệu • Phép gán giữa các biến cấu trúc 4. Một số ví dụ 01-Jan-16 376
  32. Chương 6: Cấu trúc 6.4 Một số ví dụ Một số ví dụ 1. Nhập vào 2 số phức và đưa ra tổng và tích của chúng 2. Nhập vào một danh sách (<100) sinh viên gồm họ tên, năm sinh. Kết thúc nhập khi gặp SV có tên là rỗng • Đưa danh sách vừa nhập ra màn hình. • Đưa ra màn hình sinh viên lớn tuổi nhất 3. Nhập danh sách có N (N < 100, nhập từ bàn phím) thí sinh gồm họ tên, số báo danh, khoa dự thi và điểm thi • Đưa ra DSSV đã sắp xếp theo kết quả thi • Đưa ra danh sách sinh viên dự thi khoa CNTT có điểm thi từ 22.5 trở lên • Nhập vào một số báo danh và in ra họ tên, điểm thi và khoa đăng ký của thí sinh nếu tìm thấy. Nếu không tìm thấy thí sinh thì đưa ra thông báo « không tìm thấy » 01-Jan-16 377
  33. Ví dụ 1 #include typedef struct {float re, im;} Complex; void main(){ Complex R, R1, R2; printf("Phan thuc & phan ao cho so thu nhat :"); scanf("%f%f",&R1.re,&R1.im); printf("Phan thuc & phan ao cho so thu hai :"); scanf("%f%f",&R2.re,&R2.im); R.re = R1.re+R2.re; R.im = R1.im+R2.im; //phép cộng số ảo printf("(%.1f+%.1fi)+(%.1f+%.1fi)=(%.1f+%.1fi)\n", R1.re,R1.im,R2.re,R2.im,R.re,R.im); R.re = R1.re*R2.re - R1.im*R2.im; //nhân số ảo R.im = R1.re*R2.im + R1.im*R2.re; printf("(%.1f+%.1fi)*(%.1f+%.1fi)=(%.1f+%.1fi)\n", R1.re,R1.im,R2.re,R2.im,R.re,R.im); } 01-Jan-16 378
  34. Ví dụ 2 1. #include for(ni ==00;;i printf("Nhap du lieu cho sinh vien %d: \n", in++11));; 3. typedef struct{ printf("Ho ten : "); fflush(stdin); gets(SV.[Tne].nT)e;n); 4. char Ten[30]; if (strlen(SV.[Tne].nT)e=n=)0=)=b0r)ebarke;ak; 5. int NS; printf("Nam sinh :");scanf("%d", &SV.[Nn]S.N);S); 6. }SinhVien; } DS[n] = SV; n = n + 1; 7. void main(){ } 8. SinhVien DS[100], SV; 9. int n=0,i; 10. do{ 11. fflush(stdin); 12. printf("Nhap du lieu cho sinh vien %d: \n", n+1); 13. printf("Ho ten : "); gets(SV.Ten); 14. if (strlen(SV.Ten) >0) { 15. printf("Nam sinh :");scanf("%d", &SV.NS); 16. DS[n] = SV; n = n + 1; 17. } 18. } while (strlen(SV.Ten) > 0); 01-Jan-16 379
  35. Ví dụ 2 19. //In danh sach sinh vien 20. printf("\n\n"); 21.printf(" HO & TEN NAM SINH\n"); 22. for(i=0; i < n;i++) 23. printf("%-3d%-30s %6d\n",i+1,DS[i].Ten,DS[i].NS); 24. printf("\n\n"); 25. //Tim sinh vien lon tuoi nhat 26. SV = DS[0]; 27. for(i=0; i < n;i++) 28. if(DS[i].NS < SV.NS) 29. SV = DS[i]; 30. printf("Sinh vien: %s sinh nam: %d lon tuoi nhat",SV.Ten,SV.NS); 31. }//main 01-Jan-16 380
  36. Ví dụ 2→Kết quả thực hiện 01-Jan-16 381
  37. Ví dụ 3 (1/5): Khai báo cần thiết 1. #include 2. #include 3. typedef struct{ 4. int SBD; 5. char Ten[30]; 6. char Khoa[10]; 7. float Diem; 8. }ThiSinh; 9. void main(){ 10. ThiSinh DS[100], SV; 11. int N, i, j, d=0, SBD; 12. char Ch; //Sử dụng trong thực hiện tìm kiếm nhiều lần 01-Jan-16 382
  38. Ví dụ 3 (2/5): Nhập dữ liệu từ bàn phím 13. printf("Nhap so thi sinh : "); scanf("%d",&N); 14. for ( i=0; i < N; i++ ){ 15. printf("Nhap du lieu cho thi sinh %d: \n", i+1); 16. printf("So bao danh : "); scanf("%d",&DS[i].SBD); 17. printf("Ho ten : "); 18. fflush(stdin); gets(DS[i].Ten); 19. printf("Khoa dang ky : "); 20. fflush(stdin); gets(DS[i].Khoa); 21. printf("Ket qua thi : ");scanf("%f", &DS[i].Diem); 22. printf("\n"); C scanf: floating point format not linked 23. }//for 24. printf("\n\nNhan phim bat ky de xem ket qua thi "); 25. fflush(stdin); getch(); 01-Jan-16 383
  39. Ví dụ 3 (3/5): Danh sách sắp xếp theo điểm thi 26. for(i=0; i DS[j].Diem) { 29. SV=DS[i]; 30. DS[i]=DS[j]; 31. DS[j]=SV; 32. } 33. printf("\n\n KET QUA THI \n\n"); 34. for(i=0; i < N; i ++) 35. printf("%-3d BKA- %-6d %-24s %-6s %-6.1f\n", ++d, DS[i].SBD, DS[i].Ten, DS[i].Khoa, DS[i].Diem); 36. printf("\n\nNhan phim bat ky de xem DSSV khoa CNTT"); 37. fflush(stdin); getch(); 01-Jan-16 384
  40. Ví dụ 3 (4/5): Danh sách trúng tuyển khoa CNTT //Dua ra danh sach du thi khoa CNTT 38. d = 0; 39. printf("\n\nDanh sach thi sinh trung tuyen khoa CNTT\n\n"); 40. for(i=0; i =22.5) 42. printf("%-3d BKA%-6d %-24s %-f\n", ++d,DS[i].SBD,DS[i].Ten,DS[i].Diem); 43. printf("\n\nNhan phim bat ky de bat dau tim kiem theo so bao danh"); 44. fflush(stdin); getch(); 01-Jan-16 385
  41. Ví dụ 3 (5/5): Tìm kiếm sinh viên 45. do{ 46.printf("\nNhap so bao danh can tim : "); scanf("%d",&SBD); 47. for(i=0; i < N; i++) 48. if(DS[i].SBD == SBD){ 49.printf("So bao danh : %d \n",SBD); 50. 51. printf("Ho ten : %s \n",DS[i].Ten); 52. printf("Khoa du thi : %s \n", DS[i].Khoa); 53. printf("So bao danh : %.1f \n",DS[i].Diem); 54. } break; 55. if (i == N) 56. printf("So bao danh %d khong ton tai\n",SBD); 57. printf("\nCo tiep tuc tim kiem nua khong (C/K) :"); 58. }while(toupper(getche())!='K'); 59. }//main 01-Jan-16 386
  42. Ví dụ 3→Kết quả thực hiện 01-Jan-16 387
  43. Ví dụ 3→Kết quả thực hiện 01-Jan-16 388
  44. Ví dụ 3→Kết quả thực hiện 01-Jan-16 389
  45. Chương 6: Cấu trúc 6.4 Một số ví dụ Bài tập 1. Lập trình đọc vào một danh sách không quá 100 sinh viên gồm: Họ tên, năm sinh 1. Đưa ra DS những sinh viên sinh năm 1990 2. Nhập tên sinh viên, cho biết năm sinh nếu tìm thấy 3. Đưa ra DSSV đã sắp xếp theo thứ tự ABC của họ và tên 2. Lập trình đọc vào DS thí sinh gồm Họ tên, điểm thi 3 môn Toán, Lý,Hóa, kết thúc nhập khi gặp sinh viên có tên rỗng 1. Đọc tiếp vào một điểm chuẩn; đưa ra danh sách thí sinh trúng tuyển (không có điểm liệt - 0) 2. Đưa ra thí sinh có kết quả thi cao nhất 3. Tìm điểm chuẩn, nếu chỉ lấy K SV, K nhập vào. Nếu có nhiều người bằng điểm nhau; loại cả 01-Jan-16 390
  46. Bài tập 1 1. #include 2. #include 3. typedef struct{ 4. char Ten[30]; 5. int NS; 6. }SinhVien; 7. void main(){ 8. SinhVien DS[100], SV; 9. int N, i, j, d=0; 10. char ten[30]; 11.printf("Nhap so sinh vien : "); scanf("%d",&N); 12. for ( i=0; i < N; i++ ){ 13. printf("Nhap du lieu cho sinh vien %d: \n", i+1); 14. printf("Ho ten : "); fflush(stdin);gets(DS[i].Ten); 15. printf("Nam sinh : ");scanf("%d", &DS[i].NS); 16. } 01-Jan-16 391
  47. Bài tập 1 (tiếp) 17. printf("\n\nSINH VIEN SINH NAM 1990\n\n"); 18. for(i = 0; i < N; i ++) 19. if(DS[i].NS ==1990) 20. printf("%s\n",DS[i].Ten); 21. printf("\n\nTim SV : "); fflush(stdin); gets(Ten); 22. for(int i=0;i <N; i++) 23. if(strcmp(Ten,DS[i].Ten)==0){ 24.printf("Sinh vien: %s\nSinh nam %d\n", DS[i].Ten,DS[i].NS); 25. 26. } d = d + 1; 27. if(d==0) Tìm kiếm chỉ theo tên ? strcmp(Ten,strrchr(DS[i].Ten,32)+1)) 28. printf("Khong co sinh vien: %s trong danh sach\n",Ten); 01-Jan-16 392
  48. Bài tập 1 (tiếp) 29. for(i = 0; i 0){ 32. SV= DS[i]; 33. DS[i]=DS[j]; 34. DS[j] = SV; 35. } 36. 37. printf("\n\n DANH SACH SAP XEP\n\n"); 38. for(i = 0; i < N; i ++) 39. printf("%d %-20s %d \n",i+1, DS[i].Ten, DS[i].NS); 40. }//main 01-Jan-16 393
  49. Chương 6: Cấu trúc 6.3 Xử lý dư liệu cấu trúc Bài tập 1 → Kết quả thực hiện 01-Jan-16 394
  50. Bài tập 2 (1/5) #include #include typedef struct{ char Ten[30]; struct{ int T, L, H, S; //S = T+L+H } DT; }SinhVien; void main(){ SinhVien DS[100], TK, SV; int N,i,j,K; float C; 01-Jan-16 395
  51. Bài tập 2 (2/5) N = 0; //N chứa số sinh viên đã nhập do{ printf("\nNhap DL cho sv thu %d\n",N+1); printf("Ten SV : "); fflush(stdin); gets(DS[N].Ten); if(strlen(DS[N].Ten)==0) //Độ dài bằng 0 xâu rỗng break; else{ printf(« Nhập điểm thi T L H cua SV %s : ",DS[N].Ten); scanf("%d%d%d",&DS[N].DT.T,&DS[N].DT.L,&DS[N].DT.H); DS[N].DT.S = DS[N].DT.T + DS[N].DT.L + DS[N].DT.H; N++; } }while(1); 01-Jan-16 396
  52. Bài tập 2 (3/5) //In ra danh sách vừa nhập printf("\n\n DANH SACH SINH VIEN\n\n"); printf(" Ten SV Toan Ly Hoa Tong \n"); for(i = 0; i = C)&&(DS[i].DT.T*DS[i].DT.L*DS[i].DT.H>0)) printf("%s\n",DS[i].Ten); 01-Jan-16 397
  53. Bài tập 2 (4/5) //Tìm điểm của thủ khoa, bỏ qua tường hợp điểm liệt TK = DS[0]; for(i = 1; i TK.DT.S) TK = DS[i]; //Đưa ra danh sách thí sinh có điểm bằng điểm cao nhât for(i = 0; i < N; i ++) if(DS[i].DT.S == TK.DT.S) printf("\n\n THU KHOA: %s \n\n",TK.Ten); 01-Jan-16 398
  54. Bài tập 2 (5/5) printf("\nSo nguoi trung tuyen:"); scanf("%d",&K); for(i = 0; i 0)&&(DS[K-1].DT.S==DS[K].DT.S))K ; if(K>0){ printf("Diem Chuan La : %4d",DS[K-1].DT.S); printf("\n\n Danh Sach sinh vien trung tuyen \n"); for(i=0; i < K; i++) printf("%s\n",DS[i].Ten); } }/0/1m-Jaan-i1n6 399
  55. Chương 6: Cấu trúc Bài tập Bài tập 1 Lập trình thực hiện các công việc sau ▪ Đọc vào từ bàn phím một danh sách thuốc gồm ▪ Tên thuốc (chuỗi không quá 20 ký tự) ▪ Năm hết hạn ▪ Số lượng còn ▪ Đơn giá Kết thúc nhập khi gặp thuốc có tên » » ▪ Đưa danh sách thuốc ra màn hình ▪ Đưa ra danh sách các thuốc đã hết hạn ▪ Xóa khỏi danh sách những thuốc đã hết hạn. Đưa danh sách mới ra màn hình ▪ Tính tổng giá trị các thuốc đã hết hạn ▪ Đưa ra DS thuốc được sắp xếp theo năm hết hạn 01-Jan-16 400
  56. Chương 6: Cấu trúc Bài tập Bài tập 2 Cho một danh sách thành tích thi đấu bóng đá của 32 đội tuyển bao gồm: Tên đội bóng, số bàn thắng, số bàn thua, số thẻ đỏ, số thẻ vàng Viết chương trình thực hiện • Nhập dữ liệu vào từ bàn phím • Nhập vào tên đội bóng, • Đưa ra thành thích của đội này • Nếu không tồn tại, thông báo: không tìm thấy • Tính và đưa ra màn hình số điểm của các đội nếu • Mỗi bàn thắng được tính 10 điểm • Mỗi bàn thua bị phạt 5 điểm, mỗi thẻ vàng trừ 2 điểm, thẻ đỏ trừ 5 điểm 01-Jan-16 401
  57. Chương 6: Cấu trúc Câu hỏi 1. Kết quả đưa ra màn hình #include a 12 Mai typedef struct { b 12 Nam int SHSV; c 13 Nam char Ten[25]; d 13 Minh }SV; e 14 Minh void main(){ SV DS[] = { {12, "Mai"}, {13, "Nam"}, {14, "Minh"}}; printf("%d ", DS[1].SHSV); printf("%s\n", (*(DS+2)).Ten); } 01-Jan-16 402
  58. Chương 6: Cấu trúc Câu hỏi 2. Chỉ ra câu trả lời đúng Chỉ ra khai báo hợp lệ cho biến SV có kiểu cấu trúc chỉ gồm 2 trường: Tên có kiểu xâu ký tự và NS có kiểu số nguyên a struct SinhVien{ b struct { char Ten[20]; char Ten[20]; unsigned NS; unsigned NS; }; } SinhVien; SinhVien SV; struct SinhVien SV; c struct { d typedef struct { unsigned NS; unsigned NS; char Ten[20]; char Ten[20]; } SV; } SV; e Không có câu trả lời nào đúng 01-Jan-16 403