Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 120 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
120
Dung lượng
1,1 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC LẠC HỒNG GIÁO TRÌNH NGƠN NGỮ C/C++ CHƢƠNG 1: CÁC PHẦN TỬ CƠ BẢN CỦA NGÔN NGỮ C 1.1 MỘT SỐ CHƢƠNG TRÌNH ĐẦU TIÊN BẰNG C 1.2 CÁC TỪ KHÓA 10 1.3 TÊN VÀ CÁCH ĐẶT TÊN .10 1.4 CÁCH GHI LỜI GIẢI THÍCH 11 1.5 CÂU LỆNH VÀ DẤU CHẤM CÂU 11 1.6 CẤU TRÚC CHUNG CỦA CHƢƠNG TRÌNH .11 1.7 MỘT SỐ QUI TẮC VIẾT CHƢƠNG TRÌNH 12 CHƢƠNG 2: CÁC KIỂU DỮ LIỆU CƠ SỞ 13 2.1 KHÁI NIỆM VỀ KIỂU DỮ LIỆU 13 2.2 KIỂU SỐ NGUYÊN 14 2.3 KIỂU SỐ THỰC 15 2.4 KIỂU KÍ TỰ 15 2.5 KIỂU XÂU KÍ TỰ 16 2.6 KIỂU BOOLEAN 16 2.7 BIẾN VÀ HẰNG .16 2.7.1 Biến 16 2.7.2 Khai báo biến 16 2.7.3 Hằng 17 Bài tập lớp 18 CHƢƠNG 3: 3.1 CÁC PHÉP TOÁN & HÀM CƠ BẢN 19 CÁC PHÉP TOÁN 19 3.1.1 Các phép toán số học 19 Bài tập lớp: (Sinh viên làm sửa lớp) 22 3.1.2 Các toán tử quan hệ logic 24 3.1.3 Phép toán ? 27 3.1.1 Phép toán phẩy 27 3.1.2 Phép toán Xử lý Bit: 27 3.1.3 Thứ tự ƣu tiên toán tử: 28 Bài tập lớp 29 3.2 MỘT SỐ HÀM CƠ BẢN: .31 3.2.1 Hàm đại số: 31 3.2.2 Hàm lƣợng giác: 31 3.2.3 Hàm xử lý ký tự 32 Câu hỏi trắc nghiệm .32 CHƢƠNG 4: 4.1 LỆNH NHẬP XUẤT DỮ LIỆU CƠ BẢN 34 XUẤT DỮ LIỆU RA MÀN HÌNH: 34 4.1.1 Lệnh printf 34 4.1.2 Lệnh puts : 35 4.2 XUẤT KẾT QUẢ RA MÁY IN: .35 4.3 NHẬP GIÁ TRỊ CHO BIẾN: 35 4.3.1 Toán tử gán biểu thức gán 35 4.3.2 Hàm scanf() 36 4.3.3 Hàm getchar() 37 4.3.4 Hàm getch() 37 4.3.5 Hàm gets() 37 4.4 TRÌNH BÀY MÀN HÌNH: .37 4.4.1 Lệnh gotoxy(int x, int y): 37 4.4.2 Lệnh clrscr() 37 4.4.3 Lệnh textcolor(màu chữ) 37 4.4.4 Textbackground(màu nền) 38 4.4.5 Window(int x1,int y1,int x2,int y2) 38 4.5 TẠO SỐ NGẪU NHIÊN 38 Câu hỏi trắc nghiệm .38 Bài tập lớp 39 Bài tập nhà 40 CHƢƠNG 5: 5.1 CÁC CẤU TRÚC ĐIỀU KIỆN 45 CẤU TRÚC CHỌN 45 5.1.1 Cấu trúc chọn với if: 45 5.1.2 Cấu trúc chọn với if/else: 47 5.2 CẤU TRÚC CHỌN VỚI SWITCH 49 Bài tập lớp(Sinh viên làm sửa lớp) 51 Câu hỏi trắc nghiệm .52 CHƢƠNG 6: 6.1 CẤU TRÚC LẶP .56 VÒNG LẶP XÁC ĐỊNH FOR 56 Bài tập lớp 58 6.2 VỊNG LẶP KHƠNG XÁC ĐỊNH 59 6.2.1 Vịng lặp khơng xác định While 59 6.2.2 Vịng lặp khơng xác định với điều kiện sau: while 61 Bài tập lớp 62 6.3 CÁC CÂU LỆNH RẼ NHÁNH VÔ ĐIỀU KIỆN 63 6.3.1 Lệnh break 63 6.3.2 Lệnh continue 63 6.3.3 Lệnh goto 64 Câu hỏi trắc nghiệm .65 Bài tập lớp 65 Bài tập nhà: 66 CHƢƠNG 7: CHƢƠNG TRÌNH CON – HÀM .70 7.1 TẠI SAO PHẢI DÙNG CHƢƠNG TRÌNH CON? 70 7.2 PHÂN LOẠI HÀM 71 7.3 KHAI BÁO MẪU HÀM 72 7.4 ĐỊNH NGHĨA HÀM .72 7.5 GỌI HÀM 73 7.6 THAM SỐ HÌNH THỨC – THAM SỐ THỰC SỰ 73 7.7 BIẾN TOÀN CỤC – BIẾN CỤC BỘ 73 7.7.1 Biến toàn cục 73 7.7.2 Biến cục (biến địa phƣơng) 73 7.8 KHAI BÁO HÀM VÀ CÁC VÍ DỤ: .73 Bài tập lớp 75 7.9 TRUYỀN THAM SỐ CHO HÀM 75 7.9.1 Truyền tham trị 76 7.9.2 Truyền tham chiếu 76 7.10 ĐỆ QUI: 76 Câu hỏi trắc nghiệm .78 Bài tập nhà 79 CHƢƠNG 8: CHƢƠNG 8: KIỂU MẢNG (ARRAY) .81 8.1 KHÁI NIỆM: 81 8.2 MẢNG MỘT CHIỀU: .82 8.2.1 Khai Báo Biến Mảng Chiều: 82 8.2.2 Khai Báo Kiểu Mảng: 83 8.2.3 Một Số Thao Tác Trên Mảng Chiều: 83 8.2.4 Truyền tham số Mảng chiều: 85 8.3 MẢNG HAI CHIỀU: .86 8.3.1 KHÁI NIỆM: 86 8.3.2 KHAI BÁO VÀ SỬ DỤNG MẢNG HAI CHIỀU: 87 8.3.3 THAO TÁC TRÊN MẢNG CHIỀU: 87 8.3.4 TRUYỀN THAM SỐ TRÊN MẢNG CHIỀU: 89 8.4 MẢNG NHIỀU CHIỀU: 89 8.4.1 Khái niệm: 89 8.4.2 Khai báo mảng: 89 8.4.3 Truy xuất phần tử mảng: 89 8.4.4 Thao tác mảng n chiều: 89 Câu hỏi trắc nghiệm .89 Bài tập lớp 90 Bài tập nhà 91 CHƢƠNG 9: CHUỖI KÝ TỰ 94 9.1 KHÁI NIỆM: 94 9.2 KHAI BÁO BIẾN CHUỖI: .94 9.3 KHAI BÁO KIỂU CHUỖI: .95 9.4 CÁC THAO TÁC TRÊN KIỂU CHUỖI: .95 9.4.1 Nhập chuỗi ký tự: 95 9.4.2 Xuất chuỗi: 96 9.4.3 Truy xuất đến ký tự chuỗi: biếnchuỗi[chỉsố] 96 9.5 MẢNG CÁC CHUỖI: .97 9.6 CON TRỎ VÀ CHUỖI KÝ TỰ: .98 9.6.1 Khai báo trỏ 98 9.6.2 Gán địa vùng nhớ biến chuỗi cho biến trỏ 98 9.6.3 Gán chuỗi cho biến trỏ 98 9.7 CẤP PHÁT ĐỘNG VÙNG NHỚ CHỨA DỮ LIỆU VÀ GHI ĐịA CHỈ VÀO BIẾN CON TRỎ: .98 9.8 HÀM TỰ TẠO VÀ KIỂU CHUỖI: 99 9.9 Các hàm xử lý chuỗi strong STRING.H: 99 9.9.1 Xác định chiều dài thật chuỗi: 99 9.9.2 Đổi chữ thƣờng thành chữ hoa ngƣợc lại: 100 9.9.3 Nối chuỗi: 100 9.9.4 Nối n ký tự chuỗi nguồn vào sau chuỗi đích: 101 9.9.5 Sao chép chuỗi: 102 9.9.6 Sao chép n ký tự từ chuỗi nguồn sang chuỗi đích: 103 9.9.7 So sánh chuỗi theo thứ tự từ điển: 103 9.9.8 Tìm kiếm: 105 9.9.9 Các hàm chuyển đổi kiểu stdlib.h 105 Câu hỏi trắc nghiệm 106 Bài tập lớp 107 Bài tập nhà 107 CHƢƠNG 10: KIỂU CẤU TRÚC (STRUCTURE) 109 10.1 KHÁI NIỆM: 109 10.2 ĐỊNH NGHIÃ KIỂU CẤU TRÚC MỚI: 109 10.3 KHAI BÁO BIẾN KIỂU CẤU TRÚC: 110 10.4 CÁC THAO TÁC TRÊN BIẾN MẪU TIN: 110 10.4.1 Gán biến cấu trúc có kiểu cấu trúc 110 10.4.2 Truy xuất giá trị mục liệu biến kiểu cấu trúc: 111 10.4.3 Địa biến cấu trúc mục liệu: 111 10.5 CON TRỎ CỦA KIỂU CẤU TRÚC: 111 10.5.1 Khai báo trỏ kiểu cấu trúc: 111 10.5.2 Gán địa vùng nhớ biến cấu trúc cho biến trỏ: 111 10.5.3 Truy xuất giá trị thành phần biến cấu trúc biến trỏ: 111 10.6 HÀM VÀ KIỂU CẤU TRÚC: 112 10.6.1 Đối số hàm là: 112 10.6.2 Hàm trả về: 112 10.7 MẢNG CẤU TRÚC: 113 Câu hỏi trắc nghiệm 117 Bài tập lớp 117 Bài tập nhà 117 TÀI LIỆU THAM KHẢO 120 CHƢƠNG 1: CÁC PHẦN TỬ CƠ BẢN CỦA NGÔN NGỮ C Yêu cầu: Sau học xong này, sinh viên phải hiểu vận dụng kiến thức, kĩ sau: Hiểu biết ƣu điểm ngôn ngữ C số đặc điểm Nắm vững thành phần chƣơng trình C Nắm vững qui tắc viết chƣơng trình Số tiết lên lớp: Bảng phân chia thời lƣợng: STT NỘI DUNG SỐ TIẾT Giới thiệu chƣơng trình C 1/2 Cấu trúc chƣơng trình C Một số qui tắc viết chƣơng trình 1/2 Trọng tâm giảng: Nắm vững cấu trúc chƣơng trình C 1.1 MỘT SỐ CHƢƠNG TRÌNH ĐẦU TIÊN BẰNG C Ví dụ 1: In hình dịng chữ: DAY LA CHUONG TRINH C CHAO CAC BAN /* Chƣơng trình in dòng chữ*/ #include “stdio.h” void main() /* hàm */ { #include “conio.h” printf(“DAY LA CHUONG TRINH C”); printf(“\nCHAO CAC BAN”); getch(); } Giải thích: /* */ : dịng ghi khơng đƣợc biên dịch Mỗi chương trình nên bắt đầu ghi nói rõ mục đích Chỉ thị #include : dùng nạp header file chứa hàm thƣ viện sử dụng chƣơng trình: - File stdio.h: chứa hàm nhập xuất dòng nhập xuất gián tiếp (printf ) - File conio.h: chứa hàm nhập xuất trực tiếp từ bàn phím, hình (getch) Khi sử dụng hàm chuẩn cần biết nằm tập tin header phải dùng lệnh #include để nạp tập tin vào chương trình #include : mặc định tìm thƣ mục định OptionsDirectoriesINCLUDE Directories #include “[path]filename” : mặc định tìm thƣ mục hành, khơng tìm thấy tìm thƣ mục INCLUDE Thơng báo lỗi khơng tìm thấy: Unable to open include file ‘[path]filename’ Dòng main() : bắt buộc tất chƣơng trình C Dấu () sau từ khóa main cho biết main khối chƣơng trình gọi hàm (function) Khối thân hàm đƣợc xác định cặp ký hiệu: { /* bắt đấu phần thân */ } /* kết thúc phần thân */ Một câu lệnh đƣợc viết hay nhiều dòng nhƣng phải kết thức dấu ; Ví dụ 2: Chƣơng trình tính chu vi diện tích hình trịn theo giá trị bán kính r nhập vào từ bàn phím #include “stdio.h” else #include { #define Pi cv = * PI * r; 3.14 main() dt = PI * r * r; { float r, cv, dt; /*Khai báo biến kiểu thực*/ printf(“\nKet Qua:”); printf(“\n\t Chu vi = %10.2f \n\t Dien tich = %10.2f”, cv, dt ); printf(“\nNhap ban kinh r = “); scanf(“%f”, &r); } if (r 123 long atol(const char *str): Trả số nguyên long int chuyển từ chuỗi số str Ví dụ 133: long n; n = atol(“123.56”) ; printf(“%ld”,n); > 123 double atof(const char *str): Trả số thực double chuyển từ chuỗi số str Ví dụ 134: double x; x = atof(“123.56Hello”) printf(“%lf”, x) > 123.56 Câu hỏi trắc nghiệm Câu 275 Các chuỗi đƣợc kết thúc ký tự null Câu 276 Số lƣợng ký tự nhập vào char_arr[15] _14 Câu 277 Sự thay đổi giá trị trỏ kiểu chuỗi dẫn đến liệu (Đúng / Sai) Câu 278 Ký tự _\n_ đƣợc sử dụng để sang dòng printf() Câu 279 Để sử dụng hàm strcat(), tập tin header phải đƣợc bao gồm chƣơng trình Câu 280 Hai trỏ so sánh đƣợc hai biến trỏ đến biến có kiểu khác (Đúng / Sai) Câu 281 strcmp() trả _ hai chuỗi hoàn toàn giống Câu 282 truyền Khi mảng đƣợc truyền vào hàm, có dia chi _ đƣợc Bài tập lớp Câu 283 Viết chƣơng trình để nhập vào hai chuỗi Chƣơng trình xác định liệu chuỗi thứ có xuất cuối chuỗi thứ hai không Câu 284 Nhập vào chuỗi In chuỗi theo thứ tự ngƣợc lại Câu 285 Nhập vào chuỗi ký tự Đổi chữ B đầu từ thành chữ A Ví dụ: “Ban be la tai san quy””Aan ae la tai san quy” Câu 286 Nhập vào chuỗi Cắt bỏ khoảng trắng thừa chuỗi Bài tập nhà Viết chƣơng trình thực công việc sau: Câu 287 Nhập vào chuỗi Cắt bỏ dấu cách bên trái chuỗi đó(nếu có) Ví dụ “ Câu 288 Le Van “ -> “Le Van “ Nhập vào chuỗi Cắt bỏ dấu cách bên phải chuỗi (nếu có) Câu 289 Nhập vào chuỗi Cắt bỏ dấu cách bên trái, bên phải chuỗi từ giữ lại dấu cách Câu 290 Nhập vào chuỗi Xóa bỏ n ký tự ký tự thứ i chuỗi nhập Câu 291 Nhập vào chuỗi Trích chuỗi bên trái dài n ký tự Câu 292 Nhập vào chuỗi Trích chuỗi bên phải dài n ký tự; Câu 293 Nhập vào chuỗi Trích chuỗi bắt đầu ký tự thứ i dài n ký tự Câu 294 Nhập vào chuỗi In chuỗi có ký tự đầu từ hoa từ ký tự thƣờng, đồng thời cắt bỏ dấu cách bên trái, bên phải chuỗi từ giữ lại dấu cách Câu 295 Viết chƣơng trình nhập vào chuỗi In hình từ bên trái phần cịn lại chuỗi Ví dụ: “Nguyễn Văn Minh” in thành: Nguyễn Văn Minh Câu 296 In hình từ bên phải phần lại chuỗi Ví dụ: “Nguyễn Văn Minh” in thành: Minh Nguyễn Văn Câu 297 từ Viết chƣơng trình nhập vào chuỗi, in chuỗi đảo ngƣợc theo Ví dụ : chuỗi “Nguyễn Văn Minh” đảo thành “Minh Văn Nguyễn” Câu 298 Nhập chuỗi họ tên ngƣời Hãy tách thành chuỗi : chuỗi chứa họ chữ lót, chuỗi chứa tên ngƣời Câu 299 Viết chƣơng trình nhập chuỗi ký tự kiểm tra xem chuổi có đối xứng khơng Ví dụ : Chuỗi ABCDEDCBA chuỗi đối xứng Câu 300 Nhập chuỗi họ tên ngƣời Kiểm tra xem ngƣời có phải tên An hay khơng Câu 301 Viết chƣơng trình nhập vào danh sách họ tên n ngƣời, tách tên ngƣời khỏi họ tên xếp danh sách tên theo thứ tự từ điển In danh sách họ tên sau xếp Câu 302 Nhập vào chuỗi bất kỳ, đếm số lần xuất loại ký tự Câu 303 Viết chƣơng trình nhập vào tên N sinh viên Hãy xếp tên sinh viên theo thứ tự tăng dần Câu 304 Viết chƣơng trình nhập vào tên N sinh viên Hãy xếp tên sinh viên theo thứ tự giảm dần CHƢƠNG 10: KIỂU CẤU TRÖC (STRUCTURE) Yêu cầu: Sau học xong này, sinh viên phải hiểu vận dụng kiến thức, kĩ sau: Ý nghĩa, cách khai báo cấu trúc Nhập xuất cấu trúc Một số kỹ thuật thao tác cấu trúc Truyền tham số cấu trúc cho hàm Mảng cấu trúc Số tiết lên lớp: Bảng phân chia thời lƣợng: STT NỘI DUNG SỐ TIẾT Khái niệm khai báo cấu trúc 1/2 Nhập xuất cấu trúc 1/2 Các thao tác cấu trúc Hàm cấu trúc Mảng cấu trúc Trọng tâm giảng: Các thao tác chuỗi Một số hàm xử lý chuỗi thông dụng 10.1 KHÁI NIỆM Kiểu mẫu tin kiểu liệu tự tạo mà biến thuộc kiểu gồm nhiều mục liệu, mục liệu có tên khác có kiểu khác Kiểu mẫu tin cho phép mơ tả đối tƣợng thực tế có cấu trúc phức tạp Ví dụ: Mơ tả thơng tin ngƣời gồm thông tin: Họ tên, năm sinh, nơi sinh, giới tính, địa chỉ, tình trạng gia đình.v.v ĐỊNH NGHIÃ KIỂU CẤU TRÖC MỚI 10.2 Mẫu 1: struct tên_kiểu{ kiểu tênmục1; kiểu tênmục2; }; Mẫu 2: typedef struct { kiểu tênmục1; kiểu tênmục2; } tênkiểu; Ví dụ 135: Định nghiã kiểu cấu trúc tên date struct date { char day, month; int year; }; Ví dụ 136: Định nghiã kiểu cấu trúc mô tả lý lịch nhân viên struct lylich { char ho[20]; char ten[7]; struct date ngsinh, ngayvaocoquan; float hesoluong; }; 10.3 KHAI BÁO BIẾN KIỂU CẤU TRÖC Mẫu 1: struct tênkiểucấutrúc tênbiến ={giá trị mục 1, giá trị mục 2, }; Ví dụ 137: struct date ngay={12,5,1999}; struct lylich nv ={“Le Anh”,”Tuan”,{12,3,1960},{16,4,1990},2.05}; Chú ý: * Nếu định nghĩa kiểu theo mẫu khơng cần dùng từ khóa struct Mẫu 2: Khai báo biến định nghiã kiểu cấu trúc struct [tên_kiểu] { kiểu tênmục1; kiểu tênmục2; } danhsáchbiến; 10.4 CÁC THAO TÁC TRÊN BIẾN MẪU TIN 10.4.1 Gán biến cấu trúc có kiểu cấu trúc nv1 = nv2; 10.4.2 Truy xuất giá trị mục liệu biến kiểu cấu trúc Sử dụng phép tốn dấu chấm: Ví dụ 138: tênbiến.tênmục printf(“\nHo ten nhan vien: %s %s”,nv.ho,nv->ten); printf(“\nNgay sinh: %d/%d/%d”,nv.ngsinh.day,nv.ngsinh.month,nv.ngsinh.year); 10.4.3 Địa biến cấu trúc mục liệu Lấy địa biến cấu trúc: &tênbiến Lấy địa mục liệu: &tênbiến.tênmục scanf(“%f”,&nv.hesoluong); scanf(“%d/%d/%d”, &nv.ngsinh.day,&nv.ngsinh.month,&nv.ngsinh.year); Ví dụ 139: Tính toạ độ trung điểm đoạn thẳng AB typedef struct{ float x,y;}Diem; Diem A,B,M; main() { printf("\nNhap toa diem A: "); scanf("%f%*c%f",&A.x,&A.y); printf("\nNhap toa diem B: "); scanf("%f%*c%f",&B.x,&B.y); M.x = (A.x + B.x)/2; M.y = (A.y + B.y)/2; printf("\nToa diem M la (%.2f,%.2f)",M.x,M.y); getch(); } 10.5 CON TRỎ CỦA KIỂU CẤU TRÖC 10.5.1 Khai báo trỏ kiểu cấu trúc struct tênkiểucấutrúc *têncontrỏ; Ví dụ 140: struct lylich *p; 10.5.2 Gán địa vùng nhớ biến cấu trúc cho biến trỏ têncontro = &tênbiếncấutrúc; 10.5.3 Truy xuất giá trị thành phần biến cấu trúc biến trỏ (*p).tênmuc hay p ->tênmục Chú ý: Phép toán (->) hay (.) có độ ƣu tiên cao tƣơng đƣơng với dấu () [ ] 10.6 HÀM VÀ KIỂU CẤU TRƯC 10.6.1 Đối số hàm Một biến cấu trúc: Khi tham số thực tƣơng ứng tên biến cấu trúc Một trỏ cấu trúc: Khi tham số thực tƣơng ứng địa biến cấu trúc 10.6.2 Hàm trả Giá trị kiểu cấu trúc: Con trỏ kiểu cấu trúc Ví dụ 141: Viết chƣơng trình tính tổng phân số typedef struct{ int tu, mau } PhanSo; void nhap_phan_so(PhanSo *); void toigianps(PhanSo *); PhanSo Tong(PhanSo , PhanSo); int ucln(int , int ); main() { PhanSo a, b, c; NhapPhanSo( &a ); NhapPhanSo( &b ); c = Tong(a,b); toigianps(&c); printf(“\nSau giản ƣớc: %d/%d”,c.tu, c.mau); } /*=========================*/ void NhapPhanSo(PhanSo *a) { PhanSo x; do{ printf("\nNhap phan so (x/y) : "); scanf("%d %*c %d", &x.tu, &x.mau); fflush(stdin); if ( x.mau == 0) printf("\nMau so bang 0"); } while (x.mau != 0); *a = x; if (a->tu * a->mau >= 0) else a->tu = abs(a->tu); a->tu = -abs(a->tu); a->mau = abs(a->mau); } /* -*/ void toigianps(PhanSo *a) { long int usc; usc = ucln(a->tu,a->mau); a->tu = a->tu/usc; a->mau = a->mau/usc; } /* -*/ int ucln(int a, int b) { int m,n,r; m = abs(a); n = abs(b); while (n != 0) { r = m%n; m = n; n = r; } return m; } /* */ Phanso Tong(Phanso a, Phanso b) { Phanso c; c.tu = a.tu*b.mau + b.tu*a.mau; c.mau = a.mau*b.mau; return c; } 10.7 MẢNG CẤU TRÚC Dùng quản lý danh sách đối tƣợng thuộc kiểu cấu trúc Tênkiểucấutrúc mảng[MAX]; Ví dụ 142: lylich nv[100]; nv[i] biến cấu trúc thuộc kiểu lylich Ví dụ 143: #include #include Nhập in danh sách thí sinh theo thứ tự tên họ #include #include typedef struct{ unsigned char ngay, thang; int nam; typedef struct { } date; int sbd; char ho[25],ten[7]; date ngsinh; float toan,ly,hoa; float DTB; }hoso; hoso thisinh[100]; int n; void NhapHoso(hoso ts[],int *n) { int i=0; hoso hs; printf("\nNhap Ho so thi sinh \"Ho bang rong de ket thuc\""); { hs.sbd = i+1; printf("\nNhap ho so cho thi sinh: %3d",hs.sbd); printf("\nHo : "); gets(hs.ho); if (hs.ho[0]=='\0') break; printf("Ten: "); gets(hs.ten); printf("Ngay sinh: "); scanf("%d/%d/%d%*c", &hs.ngsinh.nam); &hs.ngsinh.ngay, printf("Diem Toan: "); scanf("%f%*c",&hs.toan); printf("Diem Ly: "); scanf("%f%*c",&hs.ly); printf("Diem Hoa: "); scanf("%f%*c",&hs.hoa); hs.DTB = (hs.toan+hs.ly+hs.hoa)/3; ts[i] = hs; i++; &hs.ngsinh.thang, }while (iten,((hoso*)q)->ten); if (kq == 0) return strcmp(((hoso*)p)->ho,((hoso*)q)->ho); return kq; } void InKQ(hoso ts[], int n) { int i; qsort(ts,n,sizeof(ts[0]),sosanh); printf("\n%-4s %-25s %-10s %-4s %-4s %-4s %-5s","SBD", "Ho Ten", "Ngay sinh","Toan","Ly","Hoa","Phong"); for (i=0;i