Giáo trình Kỹ thuật lập trình được biên soạn thông tin đến các bạn những kiến thức cơ bản về ngôn ngữ lập trình; một số cấu trúc dữ liệu cơ bản; hàm và cấu trúc chương trình; kỹ thật lập trình cấu trúc; cơ bản về thuật toán; một số cấu trúc phức hợp; thao tác với tệp dữ liệu.
MỤC LỤC Chương CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH 1.1 MỘT SỐ KHÁI NIỆM 1.1.1 Bộ chữ viết 1.1.2 Từ khóa 1.1.3 Tên gọi 1.1.4 Câu lệnh 1.1.5 Chú thích 1.2 CÁC KIỂU DỮ LIỆU CƠ BẢN 1.2.1 Dữ liệu kiểu liệu 1.2.2 Kiểu ký tự 1.2.3 Kiểu số nguyên 10 1.2.4 Kiểu số thực 10 1.3 BIẾN, HẰNG VÀ BIỂU THỨC 10 1.3.1 Biến 10 1.3.2 Hằng 12 1.3.3 Biểu thức 14 1.4 CẤU TRÚC MỘT CHƯƠNG TRÌNH ĐƠN GIẢN 18 1.4.1 Cấu trúc chung 18 1.4.2 Nhập/Xuất liệu 20 1.4.3 Ví dụ 24 1.5 ĐIỀU KHIỂN TRÌNH TỰ THỰC HIỆN CÁC LỆNH 25 1.5.1 Tuần tự 25 1.5.2 Điều khiển chọn 26 1.5.3 Điều khiển lặp 34 1.6 BÀI TẬP 43 Chương 46 MỘT SỐ CẤU TRÚC DỮ LIỆU CƠ BẢN 46 2.1 MẢNG 46 2.1.1 Mảng chiều 46 2.1.2 Mảng nhiều chiều 50 2.1.3 Một số ví dụ 54 2.2 XÂU KÝ TỰ 63 2.2.1 Khai báo nhập xuất liệu 63 2.2.2 Các hàm xử lý liệu xâu 65 2.2.3 Một số ví dụ 70 2.3 CON TRỎ 74 2.3.1 Khái báo, truy xuất trỏ 74 2.3.2 Con trỏ mảng 75 2.3.3 Cấp phát nhớ 76 2.3.4 Ví dụ 78 2.4 BẢN GHI 80 2.4.1 Khai báo, truy xuất liệu 80 2.4.2 Ví dụ 83 2.5 BÀI TẬP 84 Chương 87 HÀM VÀ CẤU TRÚC CHƯƠNG TRÌNH 87 3.1 TỔ CHỨC CHƯƠNG TRÌNH 87 3.1.1 Ví dụ 87 3.1.2 Cấu trúc chương trình 88 3.1.3 Hàm xây dựng sẵn 93 3.2 HÀM 93 3.2.1 Khai báo định nghĩa hàm 93 3.2.2 Lời gọi sử dụng hàm 96 3.2.3 Hàm với đối mặc định 97 3.2.4 Khai báo hàm trùng tên 98 3.2.5 Biến, đối tham chiếu 100 3.2.6 Cách truyền tham số 101 3.2.7 Hàm mảng 105 3.3 CON TRỎ HÀM 115 3.3.1 Khai báo 115 3.3.2 Sử dụng trỏ hàm 115 3.3.3 Mảng trỏ hàm 117 3.4 HÀM ĐỆ QUY 118 3.4.1 Khái niệm 118 3.4.2 Lớp toán giải đệ qui 119 3.4.3 Các ví dụ 120 3.5 BÀI TẬP 122 Chương 126 KỸ THUẬT LẬP TRÌNH CẤU TRÚC 126 4.1 NGUYÊN TẮC ÍT NHẤT 127 4.2 TÍNH ĐỊA PHƯƠNG 130 4.3 TÍNH NHẤT QUÁN 131 4.4 NGUYÊN TẮC AN TOÀN 132 4.5 PHƯƠNG PHÁP TOP-DOWN 134 4.6 KỸ THUẬT BOTTOM-UP 139 4.7 BÀI TẬP 143 Chương 146 CƠ BẢN VỀ THUẬT TOÁN 146 5.1 MỘT SỐ VẤN ĐỀ CƠ SỞ 146 5.1.1 Thuật toán 146 5.1.2 Biểu diễn thuật toán 149 5.1.3 Các bước giải tốn máy tính 152 5.2 MỘT SỐ THUẬT TOÁN SẮP XẾP CƠ BẢN 153 5.2.1 Sắp xếp chọn 153 5.2.2 Sắp xếp bọt 154 5.2.3 Sắp xếp chèn 157 5.3 THUẬT TỐN TÌM KIẾM 158 5.4 GIẢI THUẬT ĐỆ QUY 161 5.5 KỸ THUẬT QUAY LUI 166 5.6 BÀI TẬP 178 Chương 180 MỘT SỐ CẤU TRÚC PHỨC HỢP 180 6.1 BẢN GHI TỰ TRỎ 180 6.2 DỮ LIỆU KIỂU DANH SÁCH ĐỘNG 181 6.2.1 Danh sách kiểu LIFO 182 6.2.2 Danh sách kiểu FIFO 186 6.2.3 Danh sách phi tuyến 191 6.3 BÀI TẬP 195 Chương 196 THAO TÁC VỚI TỆP DỮ LIỆU 196 7.1 MỘT SỐ KHÁI NIỆM 196 7.1.1 Thư mục 196 7.1.2 Tệp tin 197 7.1.3 Dữ liệu dạng tệp tin 197 7.2 CÁC THAO TÁC VỚI TỆP TIN 198 7.2.1 Khai báo biến tệp tin 198 7.2.2 Mở tệp tin 198 7.2.3 Đóng tập tin 199 7.2.4 Kiểm tra xem đến cuối tệp tin 200 7.2.5 Di chuyển trỏ tệp tin đầu 200 7.2.6 Lấy vị trí trỏ 200 7.3 TRUY CẬP TỆP TIN VĂN BẢN 200 7.3.1 Ghi liệu lên tập tin văn 200 7.3.2 Đọc liệu từ tập tin văn 202 7.3.3 Ví dụ 203 7.4 TRUY CẬP TỆP TIN NHỊ PHÂN 204 7.4.1 Ghi liệu lên tập tin nhị phân 204 7.4.2 Đọc liệu từ tập tin nhị phân 204 7.4.3 Ví dụ 205 7.5 BÀI TẬP 208 Chương CƠ BẢN VỀ NGƠN NGỮ LẬP TRÌNH 1.1 MỘT SỐ KHÁI NIỆM 1.1.1 Bộ chữ viết Cũng ngôn ngữ giao tiếp thơng thường, ngơn ngữ lập trình xây dựng ký tự sau tập hợp từ vựng với quy tắc cho phép ghép từ thành câu để diễn tả việc, hành động yêu cầu Nói cách khác, sử dụng ngơn ngữ lập trình phải tn thủ cú pháp ngơn ngữ lập trình Ngơn ngữ lập trình C (gọi tắt C) sử dụng ký tự bao gồm: - Các chữ Latin: A, B, C, , Z a, b, c, , z; - Các chữ số thập phân: 0,1,2,3, ,9; - Các kí hiệu toán học: +,-, *, /, =, , %, ^; - Các ký hiệu đặc biệt: : , ; " ' _ @ # $ ! ^ [ ] { } ( ) ; - Kí tự gạch nối _ (chú ý phân biệt với dấu trừ -); - Dấu cách (khoảng trống - space) để phân biệt từ Lưu ý C dạng viết thường hoa chữ hiểu hai chữ khác 1.1.2 Từ khóa Trong ngơn ngữ lập trình người ta quy định số từ dùng vào mục đích định đó, từ gọi từ khóa (keyword) Mỗi từ khóa có ý nghĩa xác định thường khơng cho phép dùng vào mục đích khác Về từ khóa ngơn ngữ lập trình khác khác Trong nhiều ngơn ngữ lập trình, ví dụ C, Pascal, từ khóa từ qui định trước hình thức mang ý nghĩa xác định không dùng với mục đích khác Trong số ngơn ngữ, ví dụ PostScript, khái niệm từ khóa mở rộng sơ với ngôn ngữ thường dùng C, cho phép người sử dụng định nghĩa lại từ khóa với mục đích khác Hoặc số ngơn ngữ, ví dụ Common Lisp, từ khóa hiểu dạng viết tắt ký hiệu định danh, không giống ký hiệu thường để biểu diễn cho biến hàm, từ khóa tự trích dẫn (self-quoting) đánh giá; từ khóa thường sử dụng để gán nhãn tham số cho hàm, để biểu diễn giá trị tượng trưng khác Trong giới hạn tài liệu sử dụng định nghĩa sau từ khóa Từ khóa từ qui định trước hình thức, mang ý nghĩa xác định người sử dụng không dùng từ khóa cho mục đích khác Dưới số từ khóa thường dùng C, chi tiết cách dùng ý nghĩa từ khóa trình bày nội dung sau break, case, char, continue, default, do, double, else, externe, float, for, goto, if, int, long, register, return, short, sizeof, static, struct, switch, typedef, unsigned, while Một đặc trưng C từ khố ln ln viết chữ thường 1.1.3 Tên gọi Trong chương trình, để phân biệt đối tượng (biến, hằng, hàm v.v.), ngơn ngữ lập trình cho phép người lập trình đặt tên cho đối tượng cần sử dụng thông qua cách thức khai báo Hầu hết thành phần viết chương trình thuộc hai dạng: 1) thành phần xây dựng sẵn ngôn ngữ (và cơng cụ lập trình) từ khóa, tên hàm chuẩn 2) thành phần người lập trình tạo ra, thành phần là biến, hằng, hàm Để mô tả thành phần người lập trình tạo việc cần làm đặt tên cho đối tượng Trong C (và hầu hết với ngơn ngữ lập trình) việc đặt tên phải tuân theo số qui tắc sau: - Không chứa khoảng trống (space) tên; - Khơng trùng với từ khóa; - Bắt đầu chữ dấu gạch dưới; - Độ dài tối đa tên giới hạn (tùy thuộc vào ngơn ngữ biên dịch); Ví dụ số tình đặt tên sau: - Các tên gọi sau đúng: i, i1, j, tinhoc, tin_hoc, luu_luong; - Các tên gọi sau sai: 1i, tin hoc, luu-luong-nuoc; - Các tên gọi sau khác nhau: ha_noi, Ha_noi, HA_Noi, HA_NOI; Chú ý: Trong C người lập trình phép đặt tên trùng với tên số đối tượng có thư viện chuẩn đó, nhiên ý nghĩa tên chuẩn khơng cịn giá trị phạm vi 1.1.4 Câu lệnh Câu lệnh đơn vị ngôn ngữ lập trình Trong trường hợp đặc biệt, trở thành đơn vị thao tác máy tính điện tử hay gọi thị Trong C, câu lệnh ngăn cách với dấu chấm phẩy (;) Có thể phân câu lệnh thành hai loại: lệnh đơn lệnh điều khiển Lệnh đơn thao tác nhằm thực công việc đó, ví dụ như: lệnh gán, câu lệnh nhập/xuất liệu Sau ví dụ ba lệnh đơn C: delta = b*b - 4*a*c; printf("Hello World!"); scanf("%d %d",&a,&b); Lệnh điều khiển lệnh dùng để điều khiển trình tự thực thao tác chương trình Lệnh điều khiển thường bao gồm: điều khiển chọn để rẽ hai nhiều nhánh, điều khiển lặp - để thực lặp lặp lại theo điều kiện Ví dụ, sau lệnh điều khiển chọn, lệnh if, C: if (delta0 */ { x1= (-b+sqrt(delta))/(2*a); x2= (-b-sqrt(delta))/(2*a); } Chú ý: - Chú thích dùng cặp ký tự /* … */ không phép sử dụng lồng nhau; - Nên viết thích để khơng thời gian đọc lại chương trình cần thiết Các thích bỏ qua biên dịch; 1.2 CÁC KIỂU DỮ LIỆU CƠ BẢN 1.2.1 Dữ liệu kiểu liệu Máy tính ngày cho phép làm việc với hầu hết tất loại liệu mà người phải xử lý hàng ngày, ví dụ số loại liệu kể đến như: số thực, số nguyên, ký tự, xâu ký tự, logic, ngày tháng Ngôn ngữ lập trình thường cho phép làm việc với số (hoặc tất cả) loại liệu kể trên; loại liệu thể từ khóa mơ tả kiểu liệu (data type) đó, kiểu liệu gọi kiểu liệu hay nguyên thủy ngôn ngữ Bảng 1-1 Các kiểu C Miền giá trị Kiểu Tên kiểu Số Từ Đến liệu (từ khóa) byte Ký tự char -128 128 unsigned 255 char Số int -32767 32768 unsigned int 65535 nguyên short -32767 32768 long -215 215-1 Số thực float ±10-37 ±1038 -307 double ±10 ±10+308 Trong C, kiểu liệu bao gồm: kiểu ký tự, kiểu số nguyên, kiểu số thực; nội dung kiểu liệu thể Bảng 1-1 Trong ngôn ngữ lập trình, kiểu liệu quan tâm khía cạnh: tên gọi - để sử dụng khai báo; số byte nhớ cần dùng cho biến để sử dụng hợp lý nhớ máy tính; miền giá trị - để xem xét phù hợp miền giá trị với đối tượng mà mơ tả; phép tốn (operator) thực kiểu liệu Ngồi kiểu liệu hầu hết ngơn ngữ định nghĩa sẵn cho phép người lập trình tự định nghĩa kiểu liệu phức tạp từ kiểu bản; kiểu gọi chung kiểu liệu có cấu trúc Các kiểu liệu có cấu trúc trình bày phần sau tài liệu 1.2.2 Kiểu ký tự Bảng mã ASCII bảng quy ước mã cho chữ La tinh, ký tự, kí hiệu thường dùng khác Ký tự, kí hiệu, qui ước, chữ bảng mã ASCII gọi chung ký tự (Character) Người ta đưa bảng mã ASCII để thống cách mã hóa ký tự sử dụng máy tính, mô tả tên bảng mã, ASCII - American Standard Code for Information Interchange, hiểu mã tiêu chuẩn dùng việc trao đổi thông tin Mỹ Bảng mã ASCII chuẩn có 128 ký tự bao gồm ký tự điều khiển (không hiển thị), ký tự hiển thị Bảng mã ASCII mở rộng có 256 ký tự bao gồm 128 ký tự bảng mã ASCII chuẩn 128 ký tự mở rộng gồm nhiều ký tự có dấu, ký tự trang trí khác Bảng 95 ký tự hiển thị bảng mã ASCII cho Bảng 1-2 Trong C kiểu ký tự hiểu theo hai cách, ký tự bảng mã ASCII hai mã ASCII ký tự Ví dụ, ch biến kiểu ký tự lệnh gán ch = ’A’ ch = 65 có ý nghĩa mã ASCII ký tự ‘A’ 65 (xem Bảng 1-2) Theo Bảng 1-1 ta thấy có hai loại liệu kiểu kí tự char với miền giá trị từ -128 đến 127 unsigned char (kí tự khơng dấu) với miền giá trị từ đến 255 Trường hợp biến gán giá trị vượt ngồi miền giá trị kiểu giá trị biến tính theo mã bù - (256 - c) Ví dụ gán cho char ch giá trị 179 (vượt khỏi miền giá trị qui định char) giá trị thực lưu máy - (256 - 179) = -77 Bảng 1-2 Các kí tự hiển thị bảng mã ASCII Mã Ký tự Mã Ký tự Mã Ký tự Mã Ký tự Mã Ký tự 32 51 70 F 89 Y 108 l ␠ 33 ! 52 71 G 90 Z 109 m 34 " 53 72 H 91 [ 110 n 35 # 54 73 I 92 \ 111 o 36 $ 55 74 J 93 ] 112 p 37 % 56 75 K 94 ^ 113 q 38 & 57 76 L 95 _ 114 r 39 ' 58 : 77 M 96 ` 115 s 40 ( 59 ; 78 N 97 a 116 t 41 ) 60 < 79 O 98 b 117 u 42 * 61 = 80 P 99 c 118 v 43 + 62 > 81 Q 100 d 119 w 44 , 63 ? 82 R 101 e 120 x 45 64 @ 83 S 102 f 121 y 46 65 A 84 T 103 g 122 z 47 / 66 B 85 U 104 h 123 { 48 67 C 86 V 105 i 124 | 49 68 D 87 W 106 j 125 } 50 69 E 88 X 107 K 126 ~ Một ví dụ việc sử dụng kiểu char unsigned char C sau: char c, d; // c, d duoc phep gan gia tri tu -128 đen 127 unsigned char e,f; // e đuoc phep gan gia tri tu đen 255 c = 65 ; d = 179; // d có giá tri ngồi mien cho phép e = 179; f = 330; // f có giá tri mien cho phép printf("%c,%d",c,c); // in chu 'A' giá tri so 65 printf("%c,%d",d,d); // in kí tu '|' giá tri so -77 printf("%c,%d",e,e); // in kí tu '|' giá tri so 179 printf("%c,%d",f,f); // in kí tu 'J' giá tri so 74 Từ ví dụ ta thấy biến gán giá trị miền giá trị cho phép dẫn đến kết không theo suy nghĩ thông thường Do nên ước lượng xác nhu cầu miền giá trị kiểu liệu sử dụng; ví dụ muốn sử dụng biến có giá trị từ 128 255 nên khai báo biến dạng kí tự khơng dấu (unsigned char) Với nhiều ngơn ngữ ký tự hiểu ký tự bảng mã ASCII 1.2.3 Kiểu số nguyên Trong C, số nguyên phân chia thành bốn kiểu khác với miền giá trị tương ứng cho Bảng 1-1 Các kiểu số nguyên gồm có số nguyên ngắn (short), số nguyên (int), số nguyên không dấu (unsigned int) sử dụng byte số nguyên dài (long) sử dụng byte Kiểu số ngun cịn chia thành hai loại có dấu không dấu với số byte phải dùng có miền giá trị khác nhau; mục đích việc nhằm tạo mền dẻo, thuận tiện cho người sử dụng tiết kiện tài nguyên máy tính mà giải vấn đề đặt Các phép tốn C thực số nguyên đề cập nội dung sau tài liệu 1.2.4 Kiểu số thực Để sử dụng số thực ta cần khai báo kiểu float double, miền giá trị biến kiểu mô tả Bảng 1-1 Các giá trị số kiểu double gọi số thực với độ xác gấp đơi với kiểu liệu máy tính có cách biểu diễn khác so với kiểu float để đảm bảo số số lẻ sau số thực tăng lên nhằm thể xác cao so với số kiểu float Tuy nhiên, tốn thơng dụng thường ngày độ xác số kiểu float đủ dùng 1.3 BIẾN, HẰNG VÀ BIỂU THỨC 1.3.1 Biến Biến đối tượng tạo chương trình dùng để lưu trữ giá trị thuộc kiểu cần thiết cho q trình xử lý tính tốn Giá trị biến thay đổi q trình tính tốn Có thể khẳng định biến đối tượng quan trọng chương trình, khơng đơn dùng để lưu trữ liệu mà việc tổ chức biến định đến tính hiệu thuật tốn chương trình Điều khẳng định qua tiêu đề sách “Giải thuật + Cấu trúc liệu = Chương trình” giáo sư Niklaus Emil Wirth, câu nói hiểu định lý lĩnh vực lập trình Trong C, biến phải khai báo trước sử dụng Việc khai báo nhằm cung cấp thuộc tính biến như: tên gọi (tên biến), kiểu biến, vị 10 đứng sau phải thư mục thư mục trước Ví dụ: C:\TP\BIN đường dẫn tới thư mục BIN thư mục TP ổ đĩa C Lưu ý C/C++ để biểu diễn ký tự \ người ta phải dùng hai ký tự \\, đường dẫn C:\TP\BIN phải viết C:\\TP\\BIN 7.1.2 Tệp tin Hệ điều hành tổ chức lưu trữ thông tin đĩa thành tệp tin, chương trình, văn bản, sở liệu lưu dạng nhiều tệp tin Mỗi tệp tin đĩa xác định tên vị trí (đường dẫn) tệp tin đĩa Có vài cách gọi khác tệp tin như: tập tin, tệp, file; thống cách gọi tệp tin Tên tệp tin: thông thường gồm phần, phần tên phần mở rộng hai phần phân cách dấu chấm (.) Tên tệp tin xâu ký tự, độ dài tối đa tên tệp tin phụ thuộc vào hệ điều hành với Windows 255; không bao gồm số ky tự đặc biệt như: /, \, :, *, ?, “, , | Phần mở rộng xâu ký tự với mục đích phân biệt sơ loại tệp tin khác nhau, ví dụ tệp tin có phần mở rộng DOC thường văn word, phần mở rộng EXE thường tệp tin chương trình … Các loại tệp tin: Theo phân loại thông thường người dùng có dạng tệp tin Dạng tệp tin chương trình tệp tin chứa mã lệnh chương trình, trình ứng dụng đó, gọi thực thi công việc qua hệ điều hành Dạng tệp tin thứ tệp liệu, tạo với mục đích nơi lưu trữ liệu kết tính tốn q trình 7.1.3 Dữ liệu dạng tệp tin Làm việc với tệp tin đĩa quan niệm làm việc với thiết bị khác máy tính bàn phím - tệp tin hiểu thiết bị nhập - hình - tệp tin hiểu thiết bị xuất Với ứng dụng thực, hệ thống quản lý sinh viên, quản lý điểm, v.v., liệu đầu vào cho chương trình phần mềm phần lớn lưu trữ tệp tin liệu dạng tệp tin quan trọng lập trình ứng dụng Có hai dạng tệp tin liệu tện văn tệp nhị phân Tệp tin văn (Text file) tệp tin mà liệu lưu trữ dạng văn mà người dùng (và chương trình) đọc hiểu cách trực tiếp Đ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) Truy xuất tệp tin theo kiểu văn truy xuất theo kiểu Tệp tin nhị phân (Binary file) tệp tin mà liệu lưu dạng mã nhị phân, dãy byte, thông thường việc đọc hiểu tệp tin nhị phân phải chương trình đặc biệt Đối với tệp tin nhị phân truy xuất theo địa vùng nhớ 197 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) 7.2 CÁC THAO TÁC VỚI TỆP TIN Các thao tác với tập tin: - Khai báo biến tập tin, - Mở tập tin hàm, - Thực thao tác xử lý liệu tập tin hàm đọc/ghi liệu, - Đóng tập tin hàm Ở đây, ta thao tác với tập tin nhờ hàm định nghĩa thư viện stdio.h ngơn ngữ lập trình C/C++; 7.2.1 Khai báo biến tệp tin Khai báo sử dụng tệp thiết bị nhập/xuất chuẩn dạng biến Cú pháp: FILE Trong đó: Các biến danh sách phải trỏ phân cách dấu phẩy(,) Ví dụ: FILE *f1,*f2; 7.2.2 Mở tệp tin Các biến tệp tin sau khai báo, để sử dụng cần “Mở” với số tùy chọn theo cú pháp sau Cú pháp: FILE *fopen(char *Path, const char *Mode) Trong đó: - Path: tên tệp tin cần mở bao gồm đường dẫn tới tệp tin - Mode: xâu xác định cách thức mà tập tin mở, mở để đọc, mở để ghi, mở tệp tin dạng text hay nhị phân… Các giá trị Mode cho Bảng 7-1 Bảng 7-1 Các tham số dùng cho mở tệp tin Mode Ý nghĩa r Mở tập tin văn để đọc w Tạo tập tin văn để ghi a Nối vào tập tin văn 198 rb Mở tập tin nhị phân để đọc wb Tạo tập tin nhị phân để ghi ab Nối vào tập tin nhị phân r+ Mở tập tin văn để đọc/ghi w+ Tạo tập tin văn để đọc ghi a+ Nối vào hay tạo tập tin văn để đọc/ghi r+b Mở tập tin nhị phân để đọc/ghi w+b Tạo tập tin nhị phân để đọc/ghi a+b Nối vào hay tạo tập tin nhị phân Mặc định mở dạng text xác định b, rõ ràng thêm định t để xác định kiểu text 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*/ } Giải thích chương trình: Kiểm tra trỏ f với giá trị NULL cho phép xác định lệnh thực thành công hay không? Nếu mở tập tin để ghi, trường hợp 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 7.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ả giá trị số EOF có xuất lỗi Ngồi ra, ta cịn 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 199 7.2.4 Kiểm tra xem đến cuối tệp tin 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ả Cú pháp: int feof(FILE *f) Trong f biến tệp tin mở trước 7.2.5 Di chuyển trỏ tệp tin đầu Chuyển trỏ liệu đầu tập tin Cú pháp: void rewind(FILE *f); Trong đó: f: trỏ tập tin thao tác Bảng 7-2 Các tham số whence Giá trị Ý nghĩa Vị trí đầu tập tin SEEK_SET Vị trí trỏ tập tin SEEK_CUR Vị trí cuối tập tin SEEK_END Chuyển đến vị trí sử dụng hàm fseek() Cú pháp: int fseek(FILE *stream, long offset, int whence); Trong đó: - stream: trỏ tập tin thao tác; - offset: số byte cần dịch chuyển trỏ tập tin - whence: vị trí bắt đầu để tính khoảng cách dịch chuyển cho offset Giá trị tham số xác định Bảng 7.2 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ả 7.2.6 Lấy vị trí trỏ Lấy vị trị trỏ liệu tệp tin mở Cú pháp: long ftell(FILE *stream); Trong đó: stream: biến đại diện cho tệp tin Hàm trả vị trí trỏ liệu so với vị trí đầu tệp tin 7.3 TRUY CẬP TỆP TIN VĂN BẢN 7.3.1 Ghi liệu lên tập tin văn Hàm fputc() Hàm dùng để ghi ký tự vào tập tin văn Cú pháp: int fputc(int c, FILE *f) Trong c mã Ascii ký tự cần ghi, f biến file (và mở để ghi trước đó) Hàm trả EOF gặp lỗi 200 Hàm fputs() Hàm dùng để ghi xâu ký tự chứa vùng đệm lên tập tin văn Cú pháp: int fputs(const char *buffer, FILE *f) Trong buffer trỏ có kiểu char đến vị trí xâu ký tự cần ghi Hàm trả giá trị buffer chứa xâu rỗng trả EOF gặp lỗi 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 xâu đị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 (,) Các tùy chọn cho xâu format cho Bảng 7-3 Bảng 7-3 Các tham số định dạng Định dạng Ý nghĩa %d Ghi số nguyên %[.số chữ số thập phân] f Ghi số thực có theo quy tắc làm tròn số %o Ghi số nguyên hệ bát phân %x Ghi số nguyên hệ thập lục phân %c Ghi ký tự %s Ghi xâu ký tự %e %E %g Ghi số thực dạng khoa học (nhân 10 mũ x) %G Ví dụ 7.1: Viết chương trình ghi xâu ký tự lên tập tin văn D:\\Baihat.txt #include #include int main() { FILE *f; 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(); 201 return 0; } 7.3.2 Đọc liệu từ tập tin văn Hàm fgetc() Hàm dùng để đọc liệu từ tập tin văn mở Cú pháp: int fgetc(FILE *f) Hàm trả mã Ascii ký tự (kể EOF) tập tin liên kết với trỏ f Hàm fgets() Cú pháp: char *fgets(char *buffer, int n, FILE *f) Hàm dùng để đọc xâu 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 xâu kết quả) hay gặp ký tự kết thúc EOF (ký tự không đưa vào xâu kết quả) Trong đó: - buffer (vùng đệm): trỏ có kiểu char đến nhớ đủ lớn chứa ký tự nhận được, - n: giá trị nguyên độ dài lớn xâu ký tự nhận được, - f: trỏ liên kết với tập tin đó, Ký tự NULL (‘\0’) tự động thêm vào cuối xâu 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 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: xâu định dạng (giống hàm scanf()); varlist: danh sách biến biến cách dấu phẩy (,) Ví dụ 7.2: 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; f1=fopen("D:\\Baihat.txt","rt"); f2=fopen("D:\\Baica.txt","wt"); if (f1!=NULL && f2!=NULL) { 202 int ch=fgetc(f1); while (! feof(f1)) { fputc(ch,f2); ch=fgetc(f1); } fcloseall(); } getch(); return 0; } 7.3.3 Ví dụ Ví dụ 7.3: Đọc ma trận tính ma trận, ghi ma trận chuyển vị vào file Xem xét file văn đầu vào, đầu chương trình, thay nhận từ bàn phím xuất hình #include #include int a[100][100]; int n,m; int main() { char *infile="vao.txt", *outfile="ra.txt"; int i, j; FILE *f1,*f2; f1=fopen(infile,"rt"); if(f1==NULL) { printf("Loi mo file %s",infile); getch(); return -1; } f2=fopen(outfile,"wt"); if(f2==NULL) { printf("Loi mo file %s",outfile); getch(); fclose(f1); return -2; } fscanf(f1,"%d%d",&m,&n); for(i=0;i