Giáo trình “Kỹ thuật lập trình” gồm có 11 chương với nội dung phong phú, kiến thức nâng dần từ cơ bản đến nâng cao, nội dung giáo trình phù hợp với đào tạo trình độ cao đẳng. Trong đó: Chương 1,2,3 chủ yếu tập chung vào các kiến thức cơ bản giới thiệu về môn học và ngôn ngữ lập trình C. Chương 4 cung cấp các kiến thức về toán hạn, toán tử và biểu thức làm cơ sở cho việc học các chương tiếp theo. Chương 5 trình bày các lệnh vào ra cơ bản, đây là chương quan trọng giúp sinh viên có kiến thức cơ bản về truy xuất dữ liệu trong ngôn ngữ lập trình C. Chương 6 tập chung giới thiệu các cấu trúc điều khiển trong ngôn ngữ C như: if, switch, for, while… Chương 7,8,9 giới thiệu về con trỏ, mảng và hàm đây là các cấu trúc quan trọng giúp người lập trình tổ chức tốt chương trình khi lập trình với ngôn ngữ C. Chương 10, 11 là hai chương nói về các cấu trúc nâng cao có thể ứng dụng viết các chương trình thực tế đó là kiểu cấu trúc và tập tin.
LỜI GIỚI THIỆU Trường Cao Đẳng KTKT Kiên Giang q trình chuyển sang mơ hình đào tạo theo hệ thống tín chỉ, mơ hình đào tạo dựa nâng cao tính tự giác tìm tòi sáng tạo tự học sinh viên Chính nguồn tài liệu cung cấp cho em cần có phong phú phù hợp với tình hình đào tạo thực tế đặc biệt độ tinh cậy tài liệu mà tham khảo Giáo trình “Kỹ thuật lập trình” đời sở đáp ứng tình hình đào tạo cung cấp nguồn tài liệu cho em Giáo trình “Kỹ thuật lập trình” gồm có 11 chương với nội dung phong phú, kiến thức nâng dần từ đến nâng cao, nội dung giáo trình phù hợp với đào tạo trình độ cao đẳng Trong đó: Chương 1,2,3 chủ yếu tập chung vào kiến thức giới thiệu mơn học ngơn ngữ lập trình C Chương cung cấp kiến thức toán hạn, toán tử biểu thức làm sở cho việc học chương Chương trình bày lệnh vào bản, chương quan trọng giúp sinh viên có kiến thức truy xuất liệu ngơn ngữ lập trình C Chương tập chung giới thiệu cấu trúc điều khiển ngôn ngữ C như: if, switch, for, while… Chương 7,8,9 giới thiệu trỏ, mảng hàm cấu trúc quan trọng giúp người lập trình tổ chức tốt chương trình lập trình với ngơn ngữ C Chương 10, 11 hai chương nói cấu trúc nâng cao ứng dụng viết chương trình thực tế kiểu cấu trúc tập tin Kiên Giang, ngày 10 tháng 02 năm 2014 Tham gia biên soạn gồm: TT Họ tên Chương biên soạn Trương Thanh Tú đến 11 Ghi MỤC LỤC 1.1 Chương trình .8 Trang Bài tập cuối chương – câu hỏi thảo luận 13 CHƯƠNG 2: MƠI TRƯỜNG LẬP TRÌNH C 15 2.1.1 Gọi Turbo C 15 2.1.2 Soạn thảo chương trình 16 2.1.3 Ghi chương trình soạn thảo vào đĩa 17 2.1.4 Thực chương trình .18 2.1.5 Mở chương trình có đĩa 18 2.1.6 Thoát khỏi Turbo C 18 2.2.1 Các lệnh menu File (Alt -F) .18 2.2.2 Các lệnh menu Edit (Alt -E) .18 2.2.3 Các lệnh menu Search (Alt -S) 19 2.2.4 Các lệnh menu Run (Alt -R) .19 2.2.5 Các lệnh menu Compile (Alt C) 19 2.4 Viết chương trình đầu tay 19 2.4.1 Cấu trúc chương trình C .19 2.4.2 Các tập tin thư viện thông dụng 20 Bài tập cuối chương – câu hỏi thảo luận 21 Bài 1: Trình bày lệnh liên quan đến tập tin phần mềm Turbo C++IDE 21 Bài 2: Trình bày lệnh thao tác văn phần mềm Turbo C++IDE 21 Bài 3: Viết chương trình .21 #include .21 int main (void) .21 { printf ("\t1 In C, lowercase letters are significant.\n"); 21 printf ("\t2 main is where program execution begins.\n"); 21 printf ("\t3 Opening and closing braces enclose program statements in a routine.\n"); printf ("\t4 All program statements must be terminated by a semicolon.\n"); .21 return 0; 21 } 21 Bỏ dấu \t \n lưu chương trình lại với tên c2_b3.c chạy chương trình 21 Them dấu \t \n vào vị trí chạy chương trình quan sát kết quả, cho biết khác biệt .21 CHƯƠNG 3: CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ C 22 3.4.1 Kiểu số nguyên 23 3.4.1.1 Kiểu số nguyên byte (8 bits) 23 3.4.1.2 Kiểu số nguyên byte (16bits) 24 3.4.1.3 Kiểu số nguyên byte (32bits) 24 3.4.2 Kiểu số thực .25 3.5 Chuyển kiểu ngôn ngữ C 25 3.6 Một số quy ước 26 Bài tập cuối chương – câu hỏi thảo luận 27 CHƯƠNG 4: BIỂU THỨC 28 4.1 Biến .28 4.1.1 Biến (Variable) 28 4.1.1.1 Định nghĩa: 28 4.1.1.2 Cú pháp khai báo biến: .28 4.1.1.3 Vị trí khai báo biến C .28 4.1.2 Hằng (constant) 29 4.1.2.1 Hằng số thực 29 4.1.2.2 Hằng số nguyên 30 4.1.2.3 Hằng ký tự 31 4.1.2.4 Hằng chuỗi ký tự 31 4.2 Các toán tử (Operators) .32 Trang 4.2.1 Các toán tử số học .32 4.2.2 Các toán tử quan hệ logic .32 4.2.3 Các toán tử Bitwise 33 4.2.3 Các toán tử đặc biệt khác 34 4.2.3.1 Toán tử .34 4.2.3.2 Toán tử trỏ & * 34 4.2.3.3 Toán tử dấu phẩy , .35 4.2.3.4 Toán tử gán 35 4.3 Biểu thức (expression) 36 4.3.1 Định nghĩa 36 4.3.2 Mức ưu tiên toán tử biểu thức 36 4.3.3 Một số hàm toán học thường dùng 36 Bài tập cuối chương – câu hỏi thảo luận 37 CHƯƠNG 5: VÀO RA CƠ BẢN 38 5.1 Hàm scanf lệnh nhập giá trị từ bàn phím cho biến 38 5.1.1 Cú pháp .38 5.1.2 Hàm fflush 40 5.2 Hàm printf 41 5.2.2 Các ví dụ 42 5.3 Các hàm vào ký tự chuỗi 44 5.3.1 Hàm getchar() 44 5.3.2 Hàm putchar() 44 5.3.3 Hàm getch(); 45 5.3.4 Hàm putch() 45 5.3.5 Hàm gets() 45 5.3.6 Hàm puts() 46 Bài tập cuối chương – câu hỏi thảo luận 46 6.1 Khối lệnh 48 6.2 Cấu trúc phân nhánh 50 6.2.1 Dạng không đầy đủ 50 6.2.2 Dạng đầy đủ .51 6.3 Cấu trúc lựa chọn 55 6.4.Cấu trúc lặp 59 6.4.2 Cấu trúc while 61 6.4.3 Cấu trúc do…while 63 6.4.4 Câu lệnh break 66 6.4.5 Câu lệnh continue .66 Bài tập cuối chương – câu hỏi thảo luận 67 CHƯƠNG 7: KIỂU CON TRỎ 70 7.1 Con trỏ 70 7.2 Khai báo trỏ 70 7.3 Các thao tác trỏ 71 7.3.1 Gán địa biến cho biến trỏ .71 7.3.2 Nội dung ô nhớ trỏ tới 71 7.3.3 Cấp phát vùng nhớ cho biến trỏ 72 7.3.4 Cấp phát lại vùng nhớ cho biến trỏ .73 7.3.5 Giải phóng vùng nhớ cho biến trỏ .73 7.4 Các phép toán trỏ 73 7.4.1 Phép gán trỏ: 73 7.4.2 Cộng, trừ trỏ với số nguyên 74 CHƯƠNG 8: HÀM 75 8.1 Khái niệm hàm C 75 Trang 8.2 Xây dựng hàm .76 8.2.1 Cấu trúc hàm .76 8.2.2 Sử dụng hàm 77 8.2.3 Nguyên tắc hoạt động hàm 78 8.3 Truyền tham số cho hàm 79 8.3.1 Truyền giá trị .79 8.3.2 Truyền trỏ 80 8.3.3 Hàm không cho giá trị : .81 8.4 Hàm đệ quy .82 8.4.1 Định nghĩa 82 8.4.2 Đặc điểm cần lưu ý viết hàm đệ quy 83 Bài tập cuối chương – câu hỏi thảo luận 83 CHƯƠNG 9: MẢNG 85 9.1 Giới thiệu chung .85 9.1.1 Định nghĩa 85 9.1.2 Phân loại 85 9.1.3 Ưu nhược điểm cấu trúc mảng 85 9.2 Khai báo mảng 86 9.2.1 Khai báo trực tiếp .86 9.2.2 Khai báo khởi tạo giá trị mảng 87 9.3 Truy xuất phần tử mảng .88 9.3.1 Truy xuất phần tử mảng chiều 88 9.3.2 Truy xuất phần tử mảng chiều 90 9.4 Duyệt mảng .92 9.4.1 Duyệt mảng chiều 92 9.4.2 Duyệt mảng hai chiều .92 9.5 Mảng cấp phát động (Con trỏ) 93 9.5.1 Khai báo cấp phát mảng động chiều .93 9.5.2 Khai báo cấp phát mảng động hai chiều 96 9.6 Truyền mảng qua danh sách tham số hàm 97 9.7 Xâu ký tự (Chuỗi) .97 9.7.1 Khai báo chuỗi 98 9.7.2 Một số hàm xử lý chuỗi .99 Bài tập cuối chương – câu hỏi thảo luận 99 CHƯƠNG 10: CẤU TRÚC .103 10.1 Định nghĩa cấu trúc .103 10.2 Khai báo cấu trúc 103 10.3 Khai báo biến cấu trúc 104 10.4 Truy cập thành phần cấu trúc 105 10.5 Khởi gán giá trị cấu trúc 107 10.6 Mảng cấu trúc : .108 10.7 Con trỏ cấu trúc .109 10.7.1 Khai báo 109 10.7.2 Sử dụng trỏ kiểu cấu trúc 109 10.7.3 Truy cập thành phần cấu trúc quản lý trỏ 110 Bài tập cuối chương – câu hỏi thảo luận 111 CHƯƠNG 11: TỆP 113 11.1 Tổng quan tệp 113 11.2 Các thao tác tập tin 113 11.2.1 Khai báo biến tập tin 114 11.2.2 Mở tập tin .114 11.2.3 Đóng tập tin 115 Trang 11.2.4 Kiểm tra đến cuối tập tin hay chưa? .115 11.2.5 Di chuyển trỏ tập tin đầu tập tin - Hàm rewind() .115 11.3 Truy cập tập tin văn 115 11.3.1 Ghi liệu lên tập tin văn .115 11.3.1.1 Hàm putc() 115 11.3.1.2 Hàm fputs() 115 11.3.1.3 Hàm fprintf() 115 11.3.2 Đọc liệu từ tập tin văn 116 11.3.2.1 Hàm getc() 116 11.3.2.2 Hàm fgets() .116 11.3.2.3 Hàm fscanf() .117 11.4 Truy cập tập tin nhị phân .118 11.4.1 Ghi liệu lên tập tin nhị phân - Hàm fwrite() .118 11.4.2 Đọc liệu từ tập tin nhị phân - Hàm fread() 118 11.4.3 Di chuyển trỏ tập tin - Hàm fseek() 118 11.5 Ví dụ 119 TÀI LIỆU THAM KHẢO 122 Trang GIỚI THIỆU CHUNG VỀ MƠN HỌC/HỌC PHẦN Vị trí, ý nghĩa, vai trò môn học/học phần: Tin học ngành khoa học mũi nhọn phát triển nhanh chóng vài chục năm lại ngày mở rộng lĩnh vực nghiên cứu, ứng dụng mặt đời sống xã hội Ngơn ngữ lập trình loại công cụ giúp người thể vấn đề thực tế lên máy tính cách hữu hiệu Với phát triển tin học, ngôn ngữ lập trình dần tiến hố để đáp ứng thách thức thực tế Khoảng cuối năm 1960 đầu 1970 xuất nhu cầu cần có ngôn ngữ bậc cao để hỗ trợ cho nhà tin học việc xây dựng phần mềm hệ thống, hệ điều hành Ngôn ngữ C đời từ đó, phát triển phòng thí nghiệm Bell Đến năm 1978, giáo trình " Ngơn ngữ lập trình C " tác giả ngơn ngữ Dennish Ritchie B.W Kernighan viết, xuất phổ biến rộng rãi C ngôn ngữ lập trình vạn Ngồi việc C dùng để viết hệ điều hành UNIX, người ta nhanh chóng nhận sức mạnh C việc xử lý cho vấn đề đại tin học C không gắn với hệ điều hành hay máy nào, gọi " ngơn ngữ lập trình hệ thống" dùng cho việc viết hệ điều hành, tiện lợi cho việc viết chương trình xử lý số, xử lý văn sở liệu Và tìm hiểu giới ngôn ngữ C từ khái niệm ban đầu Trang Mục tiêu mô đun/môn học: 3.1 Thái độ: - Tự tin, thích thú ngơn ngữ lập trình - Tham gia học hỏi, thảo luận nghiên cứu tài liệu nhiều cho môn học - Ý thức tôn trọng thực qui định quyền phần mềm 3.2 Kiến thức: - Trình bày sơ đồ hoạt động vòng lặp - Mơ tả phạm vi hoạt động biến, toán tử biểu thức - Thiết kế hàm truyền tham số cho hàm - Trình bày thao tác tập tin (text, binary) 3.3 Kỹ năng: - Ứng dụng thao tác mảng chiều để giải toán Thiết kế kiểu liệu có cấu trúc để quản lý chương trình ứng dụng Nội dung mơn học/học phần Phân bổ thời lượng Lên lớp Tên chương LT Giới thiệu môn học: Mục tiêu; Tầm quan trọng; Phương pháp giảng dạy; Cách học học sinh; Tài liệu tham khảo Bài tập Thảo luận Thực hành, thực tập Tự nghiên cứu Tổng Chương 1: Các khái niệm Chương 2: Mơi trường lập trình C 1 2.5 4.5 Chương 3: Các thành phần ngôn ngữ C 1 2.5 4.5 Chương 4: Biểu thức 1 2.5 4.5 Chương 5: Vào Chương 6: Các cấu trúc điều khiển 13 10.5 25.5 Chương 7: Kiểu trỏ 4 Chương 8: Hàm 8 18 Chương 9: Mảng 8 18 Chương 10: Cấu trúc 6.5 16.5 Chương 11: Tệp 6.5 16.5 Ôn tập 4 15 60 60 135 Tổng cộng Trang CHƯƠNG 1: CÁC KHÁI NIỆM CƠ BẢN Mục tiêu: Sau học xong chương sinh viên có khả năng: - Nhận biết ngơn ngữ lập trình - Nhận biết tính động ngơn ngữ lập trình - Phân biệt loại ngơn ngữ lập trình Thuật ngữ chun mơn : Nội dung chính: 1.1 Chương trình 1.1.1 Thuật giải (Algorithm) Là dãy thao tác xác định đối tượng, cho sau thực số hữu hạn bước đạt mục tiêu Theo R.A.Kowalski chất thuật giải: Thuật giải = Logic + Điều khiển * Logic: Đây phần quan trọng, trả lời câu hỏi "Thuật giải làm gì, giải vấn đề gì?", yếu tố tốn có quan hệ với v.v… Ở bao gồm kiến thức chuyên môn mà bạn phải biết để tiến hành giải tốn Ví dụ 1: Để giải tốn tính diện tích hình cầu, mà bạn khơng nhớ cơng thức tính hình cầu bạn khơng thể viết chương trình cho máy để giải toán * Điều khiển: Thành phần trả lời câu hỏi: giải thuật phải làm nào? Chính cách thức tiến hành áp dụng thành phần logic để giải vấn đề 1.1.2 Chương trình (Program) Là tập hợp mơ tả, phát biểu, nằm hệ thống qui ước ý nghĩa thứ tự thực hiện, nhằm điều khiển máy tính làm việc Theo Niklaus Wirth thì: Chương trình = Thuật tốn + Cấu trúc liệu Các thuật tốn chương trình có cấu trúc dựa cấu trúc điều khiển bản: * Tuần tự (Sequential): Các bước thực cách xác từ xuống, bước thực lần * Chọn lọc (Selection): Chọn hay nhiều thao tác để thực * Lặp lại (Repetition): Một hay nhiều bước thực lặp lại số lần Muốn trở thành lập trình viên chun nghiệp bạn làm trình tự để có thói quen tốt thuận lợi sau nhiều mặt người làm máy tính Bạn làm theo bước sau: Tìm, xây dựng thuật giải (trên giấy) → viết chương trình máy → dịch chương trình → chạy thử chương trình 1.2 Ngơn ngữ lập trình (Programming language) Trang Ngơn ngữ lập trình hệ thống ký hiệu tuân theo qui ước ngữ pháp ngữ nghĩa, dùng để xây dựng thành chương trình cho máy tính Một chương trình viết ngơn ngữ lập trình cụ thể (ví dụ Pascal, C…) gọi chương trình nguồn, chương trình dịch làm nhiệm vụ dịch chương trình nguồn thành chương trình thực thi máy tính 1.2.1 Các bước lập trình Bước 1: Phân tích vấn đề xác định đặc điểm (xác định I-P-O) Bước 2: Lập giải pháp (đưa thuật giải) Bước 3: Cài đặt (viết chương trình) Bước 4: Chạy thử chương trình (dịch chương trình) Bước 5: Kiểm chứng hồn thiện chương trình (thử nghiệm nhiều số liệu đánh giá) 1.2.2 Kỹ thuật lập trình 1.2.2.1 I-P-O Cycle (Input-Pprocess-Output Cycle) (Quy trình nhập-xử lýxuất) Quy trình xử lý máy tính gồm I-P-O Hình 1.1 Quy trình xử lý máy tính Ví dụ 2: Xác định Input, Process, Output việc làm ly nước chanh nóng Input : ly, đường, chanh, nước nóng, muỗng Process : - cho hỗn hợp đường, chanh, nước nóng vào ly - dùng muỗng khuấy Output : ly chanh nóng sẵn sàng để dùng Ví dụ 3: Xác định Input, Process, Output chương trình tính tiền lương cơng nhân tháng 10/2002 biết lương = lương * ngày công Input : lương bản, ngày công Process : nhân lương với ngày cơng Output : lương Ví dụ 4: Xác định Input, Process, Output chương trình giải phương trình bậc ax + b = Input : hệ số a, b Process : chia – b cho a Output : nghiệm x Ví dụ 5: Xác định Input, Process, Output chương trình tìm số lớn số a b Trang Input : a, b Process : Nếu a > b Output = a lớn Ngược lại Output = b lớn 1.2.2.2 Sử dụng lưu đồ (Flowchart) Để dễ quy trình xử lý, nhà lập trình đưa dạng lưu đồ để minh họa bước trình xử lý vấn đề (bài tốn) Trang 10 char *ten; }; tinh sds[MAX] = {{60, "Dong Nai"}, {61, "Binh Duong"}, {62, "Long An"}, {63, "Tien Giang"}, {64, "Vinh Long"}, {65, "Can Tho"}}; 10.6 Mảng cấu trúc : Như đề cập chương trước, sử dụng kiểu giá trị ( ví dụ kiểu int ) ta khai báo biến mảng kiểu Ví dụ khai báo : int a,b,c[10]; cho ta hai biến nguyên a,b mảng ngun c có 10 phần tử Hồn tồn tương tự : ta sử dụng kiểu cấu trúc mô tả để khai báo cấu trúc mảng cấu trúc Cách khai báo mảng cấu trúc : struct tên_kiểu_cấu_trúc_đã_định_nghĩa tên_mảng_cấu_trúc[số phần tử mảng]; Ví dụ cấu trúc sinh viên khai báo Khi dòng khai báo: SinhVien sv1, sv2, lop1[30], lop2[40]; Sẽ cho: Hai biến sv1 sv2 Hai mảng cấu trúc lop1 có 30 phần tử, lớp có 40 phần tử Ví dụ: Nhập danh sách sinh viên In danh sách vừa nhập lên hình #include #include #include typedef struct { unsigned char Ngay; unsigned char Thang; unsigned int Nam; } NgayThang; typedef struct { char MSSV[10]; char HoTen[40]; NgayThang NgaySinh; int Phai; char DiaChi[40]; } SinhVien; /*Hàm nhập danh sách sinh viên*/ void NhapSV(SinhVien s[], int n) { int i; Trang 108 for(i=0;i: dấu - dấu >) Ngồi ra, ta sử dụng đến phép toán * để truy cập vùng liệu quản lý trỏ cấu trúc để lấy thông tin cần thiết Ví dụ: Sử dụng trỏ cấu trúc #include #include typedef struct { unsigned char Ngay; unsigned char Thang; unsigned int Nam; } NgayThang; int main() { NgayThang Ng={29,8,1986}; NgayThang *p; clrscr(); p=&Ng; printf("Truy cap binh thuong %d-%d-%d\n", Ng.Ngay,Ng.Thang,Ng.Nam); printf("Truy cap qua tro %d-%d-%d\n", p->Ngay,p->Thang,p->Nam); printf("Truy cap qua vung nho tro %d-%d-%d\n", (*p).Ngay,(*p).Thang,(*p).Nam); getch(); return 0; } Kết quả: Hình 10.5 Minh hoạ truy cập trỏ Sinh viên tự nghiên cứu Trang 110 - Áp dụng phép toán mảng sang mảng cấu trúc - Xây dựng chương trình quản lý danh bạ điện thoại Bài tập cuối chương – câu hỏi thảo luận Bài 1: Hãy định nghĩa kiểu: struct Hoso{ char HoTen[40]; float Diem; char Loai[10]; }; Viết chương trình nhập vào họ tên, điểm n học sinh Xếp loại văn hóa theo cách sau: Điểm Xếp loại 9, 10 Giỏi 7, Khá 5, Trung bình Khơng đạt In danh sách lên hình theo dạng sau: XEP LOAI VAN HOA HO VA TEN DIEM XEPLOAI Nguyen Van A Kha Ho Thi B Trung binh Dang Kim C Khong dat Bài 2: Xem phân số cấu trúc có hai trường tử số mẫu số Hãy viết chương trình thực phép tốn cộng, trừ, nhân, chia hai phân số (Các kết phải tối giản ) Bài 3: Tạo danh sách cán công nhân viên, người người xem cấu trúc bao gồm trường Ho, Ten, Luong, Tuoi, Dchi Nhập số người vào danh sách, xếp tên theo thứ tự từ điển, in danh sách xếp theo mẫu sau: DANH SACH CAN BO CONG NHAN VIEN | STT |HO VA TEN | LUONG | TUOI | DIACHI | |1 | Nguyen Van | 333.00 | 26 | Can Tho | |2 | Dang Kim B | 290.00 | 23 | Vinh Long | Bài 4: Tạo danh sách sinh viên, người người xem cấu trúc bao gồm trường: MASV, HOTEN, NGAYSINH, PHAI, TOAN, VAN, AV (Trong ngày NGAYSINH phai có ngày tháng năm) Hãy viết khai báo, hàm cần thiết để quản lý sịnh viên Các thao tác quản lý sau: Nhập sinh viên Trang 111 Nhập vào danh sách sinh viên In danh sách sinh viên vừa nhập In sinh viên Tìm sinh viên thưo MASV HOTEN Tìm sinh viên theo Phái, TOAN, VAN, AV Sắp xếp danh sách sinh viên theo MASV, HOTEN, DIEM Thêm sinh viên vào đầu danh sách Thêm sinh viên vào cuối danh sách Thêm sinh viên vào vị trí danh sách Xố sinh viên đấu danh sách Xoá sinh viên cuối danh sách Xoá sinh viên vị trí danh sách Tìm xố sinh viên theo MASV Trang 112 CHƯƠNG 11: TỆP Mục tiêu: Sau học xong chương 11, sinh viên có khả - Nhận biết đặc điểm hàm truy xuất tệp cấp cấp - Ứng dụng hàm đóng, mở, đọc ghi tệp Thuật ngữ chuyên môn Nội dung: 11.1 Tổng quan tệp Đối với kiểu liệu ta biết kiểu số, kiểu mảng, kiểu cấu trúc liệu tổ chức nhớ (RAM) máy tính nên kết thúc việc thực chương trình liệu bị mất; cần bắt buộc phải nhập lại từ bàn phím Điều vừa thời gian vừa khơng giải tốn với số liệu lớn Để giải vấn đề, người ta đưa kiểu tập tin (file) cho phép lưu trữ liệu nhớ ngồi (đĩa) Khi kết thúc chương trình liệu sử dụng nhiều lần Một đặc điểm khác kiểu tập tin kích thước lớn với số lượng phần tử không hạn chế (chỉ bị hạn chế dung lượng nhớ ngồi) Có loại liệu kiểu tập tin: o Tập tin văn (Text File): loại tập tin dùng để ghi ký tự lên đĩa, ký tự lưu trữ dạng mã Ascii Điểm đặc biệt liệu tập tin lưu trữ thành dòng, dòng kết thúc ký tự xuống dòng (new line), ký hiệu ‘\n’; ký tự kết hợp ký tự CR (Carriage Return - Về đầu dòng, mã Ascii 13) LF (Line Feed Xuống dòng, mã Ascii 10) Mỗi tập tin kết thúc ký tự EOF (End Of File) có mã Ascii 26 (xác định tổ hợp phím Ctrl + Z) Tập tin văn truy xuất theo kiểu o Tập tin định kiểu (Typed File): loại tập tin bao gồm nhiều phần tử có kiểu: char, int, long, cấu trúc… lưu trữ đĩa dạng chuỗi byte liên tục o Tập tin không định kiểu (Untyped File): loại tập tin mà liệu chúng gồm cấu trúc liệu mà người ta không quan tâm đến nội dung kiểu nó, lưu ý đến yếu tố vật lý tập tin độ lớn yếu tố tác động lên tập tin mà Biến tập tin: biến thuộc kiểu liệu tập tin dùng để đại diện cho tập tin Dữ liệu chứa tập tin truy xuất qua thao tác với thông số biến tập tin đại diện cho tập tin Con trỏ tập tin: Khi tập tin mở để làm việc, thời điểm, có vị trí tập tin mà việc đọc/ghi thơng tin xảy Người ta hình dung có trỏ đến vị trí đặt tên trỏ tập tin Sau đọc/ghi xong liệu, trỏ chuyển dịch thêm phần tử phía cuối tập tin Sau phần tử liệu cuối tập tin dấu kết thúc tập tin EOF (End Of File) 11.2 Các thao tác tập tin Muốn thao tác tập tin, ta phải làm theo bước: o Khai báo biến tập tin o Mở tập tin hàm fopen() o Thực thao tác xử lý liệu tập tin hàm đọc/ghi liệu Trang 113 o Đóng tập tin hàm fclose() Ở đây, ta thao tác với tập tin nhờ hàm định nghĩa thư viện stdio.h 11.2.1 Khai báo biến tập tin Cú pháp: FILE Các biến danh sách phải trỏ phân cách dấu phẩy(,) Ví dụ: FILE *f1,*f2; 11.2.2 Mở tập tin Cú pháp: FILE *fopen(char *Path, const char *Mode) Trong đó: - Path: chuỗi đường dẫn đến tập tin đĩa - Type: chuỗi xác định cách thức mà tập tin mở Các giá trị Mode: Bảng 11.1 Các giá trị tham số Mode - Hàm fopen trả trỏ tập tin Chương trình ta khơng thể thay đổi giá trị trỏ Nếu có lỗi xuất mở tập tin hàm trả trỏ NULL Ví dụ: Mở tập tin tên TEST.txt để ghi FILE *f; f = fopen(“TEST.txt”, “w”); if (f!=NULL) { /* Các câu lệnh để thao tác với tập tin*/ /* Đóng tập tin*/ } Trong ví dụ trên, ta có sử dụng câu lệnh kiểm tra điều kiện để xác định mở tập tin có thành công hay không? Nếu mở tập tin để ghi, tập tin tồn tập tin bị xóa tập tin tạo Nếu ta muốn ghi nối liệu, ta phải sử dụng chế độ “a” Khi mở với chế độ đọc, tập tin phải tồn rồi, không lỗi xuất Trang 114 11.2.3 Đóng tập tin Hàm fclose() dùng để đóng tập tin mở hàm fopen() Hàm ghi liệu lại vùng đệm vào tập tin đóng lại tập tin Cú pháp: int fclose(FILE *f) Trong f trỏ tập tin mở hàm fopen() Giá trị trả hàm báo việc đóng tập tin thành cơng Hàm trả EOF có xuất lỗi Ngồi ra, ta sử dụng hàm fcloseall() để đóng tất tập tin lại Cú pháp: int fcloseall() Kết trả hàm tổng số tập tin đóng lại Nếu khơng thành cơng, kết trả EOF 11.2.4 Kiểm tra đến cuối tập tin hay chưa? Cú pháp: int feof(FILE *f) Ý nghĩa: Kiểm tra xem chạm tới cuối tập tin hay chưa trả EOF cuối tập tin chạm tới, ngược lại trả 11.2.5 Di chuyển trỏ tập tin đầu tập tin - Hàm rewind() Khi ta thao tác tập tin mở, trỏ tập tin ln di chuyển phía cuối tập tin Muốn cho trỏ quay đầu tập tin mở nó, ta sử dụng hàm rewind() Cú pháp: void rewind(FILE *f) 11.3 Truy cập tập tin văn 11.3.1 Ghi liệu lên tập tin văn 11.3.1.1 Hàm putc() Hàm dùng để ghi ký tự lên tập tin văn mở để làm việc Cú pháp: int putc(int c, FILE *f) Trong đó, tham số c chứa mã Ascii ký tự Mã ghi lên tập tin liên kết với trỏ f Hàm trả EOF gặp lỗi 11.3.1.2 Hàm fputs() Hàm dùng để ghi chuỗi ký tự chứa vùng đệm lên tập tin văn Cú pháp: int puts(const char *buffer, FILE *f) Trong đó, buffer trỏ có kiểu char đến vị trí chuỗi ký tự ghi vào Hàm trả giá trị buffer chứa chuỗi rỗng trả EOF gặp lỗi 11.3.1.3 Hàm fprintf() Hàm dùng để ghi liệu có định dạng lên tập tin văn Cú pháp: fprintf(FILE *f, const char *format, varexpr) Trong đó: format: chuỗi định dạng (giống với định dạng hàm printf()), varexpr: danh sách biểu thức, biểu thức cách dấu phẩy (,) Trang 115 Bảng 11.2 Chuỗi định dạng tham số format Ví dụ: Viết chương trình ghi chuỗi ký tự lên tập tin văn D:\\Baihat.txt #include #include int main() { FILE *f; clrscr(); f=fopen("D:\\Baihat.txt","r+"); if (f!=NULL) { fputs("Em oi Ha Noi pho.\n",f); fputs("Ta em, mui hoang lan; ta em, mui hoa sua.",f); fclose(f); } getch(); return 0; } Nội dung tập tin Baihat.txt mở trình soạn thảo văn Notepad 11.3.2 Đọc liệu từ tập tin văn 11.3.2.1 Hàm getc() Hàm dùng để đọc liệu từ tập tin văn mở để làm việc Cú pháp: int getc(FILE *f) Hàm trả mã Ascii ký tự (kể EOF) tập tin liên kết với trỏ f 11.3.2.2 Hàm fgets() Cú pháp: char *fgets(char *buffer, int n, FILE *f) Trang 116 Hàm dùng để đọc chuỗi ký tự từ tập tin văn mở liên kết với trỏ f đọc đủ n ký tự gặp ký tự xuống dòng ‘\n’ (ký tự đưa vào chuỗi kết quả) hay gặp ký tự kết thúc EOF (ký tự khơng đưa vào chuỗi kết quả) Trong đó: - buffer (vùng đệm): trỏ có kiểu char đến nhớ đủ lớn chứa ký tự nhận - n: giá trị nguyên độ dài lớn chuỗi ký tự nhận - f: trỏ liên kết với tập tin - Ký tự NULL (‘\0’) tự động thêm vào cuối chuỗi kết lưu vùng đêm - Hàm trả địa vùng đệm không gặp lỗi chưa gặp ký tự kết thúc EOF Ngược lại, hàm trả giá trị NULL 11.3.2.3 Hàm fscanf() Hàm dùng để đọc liệu từ tập tin văn vào danh sách biến theo định dạng Cú pháp: fscanf(FILE *f, const char *format, varlist) Trong đó: format: chuỗi định dạng (giống hàm scanf()); varlist: danh sách biến biến cách dấu phẩy (,) Ví dụ: Viết chương trình chép tập tin D:\Baihat.txt sang tập tin D:\Baica.txt #include #include int main() { FILE *f1,*f2; clrscr(); f1=fopen("D:\\Baihat.txt","rt"); f2=fopen("D:\\Baica.txt","wt"); if (f1!=NULL && f2!=NULL) { int ch=fgetc(f1); while (! feof(f1)) { fputc(ch,f2); ch=fgetc(f1); } fcloseall(); } getch(); return 0; } Trang 117 11.4 Truy cập tập tin nhị phân 11.4.1 Ghi liệu lên tập tin nhị phân - Hàm fwrite() Cú pháp: size_t fwrite(const void *ptr, size_t size, size_t n, FILE *f) Trong đó: - ptr: trỏ đến vùng nhớ chứa thông tin cần ghi lên tập tin - n: số phần tử ghi lên tập tin - size: kích thước phần tử - f: trỏ tập tin mở - Giá trị trả hàm số phần tử ghi lên tập tin Giá trị n trừ xuất lỗi 11.4.2 Đọc liệu từ tập tin nhị phân - Hàm fread() Cú pháp: size_t fread(const void *ptr, size_t size, size_t n, FILE *f) Trong đó: - ptr: trỏ đến vùng nhớ nhận liệu từ tập tin - n: số phần tử đọc từ tập tin - size: kích thước phần tử - f: trỏ tập tin mở - Giá trị trả hàm số phần tử đọc từ tập tin Giá trị n hay nhỏ n chạm đến cuối tập tin có lỗi xuất 11.4.3 Di chuyển trỏ tập tin - Hàm fseek() Việc ghi hay đọc liệu từ tập tin làm cho trỏ tập tin dịch chuyển số byte, kích thước kiểu liệu phần tử tập tin Khi đóng tập tin mở lại nó, trỏ ln vị trí đầu tập tin Nhưng ta sử dụng kiểu mở tập tin “a” để ghi nối liệu, trỏ tập tin di chuyển đến vị trí cuối tập tin Ta điều khiển việc di chuyển trỏ tập tin đến vị trí định hàm fseek() Cú pháp: int fseek(FILE *f, long offset, int whence) Trong đó: - f: trỏ tập tin thao tác - offset: số byte cần dịch chuyển trỏ tập tin kể từ vị trí trước Phần tử vị trí - whence: vị trí bắt đầu để tính offset, ta chọn điểm xuất phát là: - Kết trả hàm việc di chuyển thành công Nếu không thành công, giá trị khác (đó mã lỗi) trả Trang 118 11.5 Ví dụ Ví dụ 1: Viết chương trình ghi lên tập tin CacSo.Dat giá trị số (thực, nguyên, nguyên dài) Sau đọc số từ tập tin vừa ghi hiển thị lên hình #include #include int main() { FILE *f; clrscr(); f=fopen("D:\\CacSo.txt","wb"); if (f!=NULL) { double d=3.14; int i=101; long l=54321; fwrite(&d,sizeof(double),1,f); fwrite(&i,sizeof(int),1,f); fwrite(&l,sizeof(long),1,f); /* Doc tu tap tin*/ rewind(f); fread(&d,sizeof(double),1,f); fread(&i,sizeof(int),1,f); fread(&l,sizeof(long),1,f); printf("Cac ket qua la: %f %d %ld",d,i,l); fclose(f); } getch(); return 0; } Ví dụ 2: Mỗi sinh viên cần quản lý thông tin: mã sinh viên họ tên Viết chương trình cho phép lựa chọn chức năng: nhập danh sách sinh viên từ bàn phím ghi lên tập tin SinhVien.dat, đọc liệu từ tập tin SinhVien.dat hiển thị danh sách lên hình, tìm kiếm họ tên sinh viên dựa vào mã sinh viên nhập từ bàn phím Ta nhận thấy phần tử tập tin SinhVien.Dat cấu trúc có trường: mã họ tên Do đó, ta cần khai báo cấu trúc sử dụng hàm đọc/ghi tập tin nhị phân với kích thước phần tử tập tin kích thước cấu trúc #include #include #include typedef struct { char Ma[10]; char HoTen[40]; } SinhVien; void WriteFile(char *FileName) { Trang 119 FILE *f; int n,i; SinhVien sv; f=fopen(FileName,"ab"); printf("Nhap bao nhieu sinh vien? ");scanf("%d",&n); fflush(stdin); for(i=1;i