Bài giảng ngôn ngữ lập trình C

74 3 0
Bài giảng ngôn ngữ lập trình C

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Chương 1 Mở đầu CHƯƠNG 1 MỞ ĐẦU Ngôn ngữ lập trình C Ngôn ngữ C do Dennis Ritchie xây dựng từ năm 1972 tại phòng thí nghiệm Bell Telephone với mục đích tạo ngôn ngữ để viết HĐH UNIX Song nhờ có các tí.

CHƯƠNG MỞ ĐẦU Ngơn ngữ lập trình C: Ngơn ngữ C Dennis Ritchie xây dựng từ năm 1972 phịng thí nghiệm Bell Telephone với mục đích tạo ngơn ngữ để viết HĐH UNIX Song nhờ có tính ưu việt tính mềm dẻo nên giới tin học chấp nhận Đến năm 1978, sách xuất “The C programming language” Kernighan Ritchie viết C ngôn ngữ bậc trung nên mạnh sử lý bit, byte sử lý địa nhớ Vì C thích hợp cho lập trình hệ thống Có nhiều chương trình dịch khác nhau: Turbo C Borland, Quick C, Microsoft C, Think C… Sử dụng Turbo C để chạy ví dụ gọn nhẹ, nhanh, hiệu quả… Tuy nhiên, C có số khuyết điểm: - Cú pháp thuộc loại lạ khó học Nếu người sử dụng học qua ngơn ngữ khác C dễ dàng tiếp cận - Một số ký hiệu C có nhiều nghĩa khác Ví dụ: dấu “*” tốn tử nhân, tốn tử khơng định hướng, toán tử thay thế… Việc sử dụng nghĩa toán tử phụ thuộc vào ngữ cảnh sử dụng - Việc truy nhập tự vào liệu, việc trộn lẫn kiểu liệu… làm cho chương trình có phần bất ổn Mặc dù vậy, ngơn ngữ C đơng đảo người sử dụng chấp nhận vì: - C ngôn ngữ mạnh mềm dẻo C dùng để viết HĐH, chương trình điều khiển, soạn thảo văn bản, đồ hoạ, bảng tính… chí chương trình dịch cho ngơn ngữ khác - Ngôn ngữ C nhà tin học chuyên nghiệp dùng phổ biến, lĩnh vực thiết kế phần mềm hệ thống Tính hiệu chương trình dịch - C ngơn ngữ dễ thích nghi - C ngơn ngữ có từ khố - C ngơn ngữ có cấu trúc Module, sử dụng hàm Các hàm sử dụng nhiều lần chương trình chương trình khác 1.1 Các khái niệm bản 1.1.1 Các qui tắc cần nhớ viết chương trình C Tiền xử lý biên dịch Trong C, việc dịch (translation) tập tin nguồn tiến hành hai bước hoàn toàn độc lập với nhau: - Tiền xử lý - Biên dịch Hai bước phần lớn thời gian nối tiếp với cách tự động theo cách thức mà ta có ấn tượng thực xử lý Nói chung, ta thường nói đến việc tồn tiền xử lý (preprocessor?) nhằm rõ chương trình thực việc xử lý trước Ngược lại, thuật ngữ trình biên dịch hay biên dịch cịn nhập nhằng tồn hai giai đoạn, lại giai đoạn thứ hai Bước tiền xử lý tương ứng với việc cập nhật văn chương trình nguồn, chủ yếu dựa việc diễn giải mã lệnh đặc biệt gọi thị dẫn hướng tiền xử lý (destination directive of preprocessor); thị nhận biết chúng bắt đầu ký hiệu (symbol) # Hai thị quan trọng là: - Chỉ thị gộp vào tập tin nguồn khác: #include - Chỉ thị việc định nghĩa macros ký hiệu: #define Chỉ thị sử dụng trước hết nhằm gộp vào nội dung tập tin cần có (header file), khơng thể thiếu việc sử dụng cách tốt hàm thư viện chuẩn, phổ biến là: #include Chỉ thị thứ hai hay sử dụng tập tin thư viện (header file) định nghĩa trước thường khai thác lập trình viên việc định nghĩa ký hiệu là: #define NB_COUPS_MAX 100 #define SIZE 25 1.1.2 Cấu trúc chương trình C Một chương trình C bao gồm phần như: Các thị tiền xử lý, khai báo biến ngồi, hàm tự tạo, chương trình (hàm main) Cấu trúc chương trình sau : Các thị tiền xử lý #include< Tên tệp tin thư viện>// Tệp tiêu đề #define … Định nghĩa kiểu liệu( Phần không bắt buộc) Khai báo các prototype( tên hàm, các tham số, kiểu trả về, …) : phần khai báo đầu hàm, định nghĩa hàm Khai báo các biến ngồi ( Khơng bắt buộc) : Khai báo biến toàn cục sử dụng chương trình Chương trình ( Phần bắt buộc phải có) main() { Các khai báo; Các câu lệnh; } Cài đặt các hàm < Kiểu giá trị trả về> ( Các tham số) { Các câu lệnh; } Cặp dấu ghi thích Trong ngơn ngữ lập trình C, nội dung thích phải viết cặp dấu /* */ Các tập tin thư viện thông dụng Đây tập tin chứa hàm thông dụng lập trinh C, muốn sử dụng hàm tập tin header phải khai báo #include phần đầu chương trình 1) stdio.h: Tập tin định nghĩa hàm vào/ra chuẩn (standard input/output) Gồm hàm in liệu (printf()), nhập giá trị cho biến (scanf()), nhận ký tự từ bàn phím (getc()), in ký tự hình (putc()), nhận dãy ký tự từ bàm phím (gets()), in chuỗi ký tự hình (puts()), xóa vùng đệm bàn phím (fflush()), fopen(), fclose(), fread(), fwrite(), getchar(), putchar(), getw(), putw()… 2) conio.h : Tập tin định nghĩa hàm vào chế độ DOS (DOS console) Gồm hàm clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), clreol(),… 3) math.h: Tập tin định nghĩa hàm tính tốn gồm hàm abs(), sqrt(), log() log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(),… 4) alloc.h: Tập tin định nghĩa hàm liên quan đến việc quản lý nhớ Gồm hàm calloc(), realloc(), malloc(), free(), farmalloc(), farcalloc(), farfree(), … 5) io.h: Tập tin định nghĩa hàm vào cấp thấp Gồm hàm open(), _open(), read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(),… 6) graphics.h: Tập tin định nghĩacác hàm liên quan đến đồ họa Gồm initgraph(), line(), circle(), putpixel(), getpixel(), setcolor(), … Còn nhiều tập tin khác Cú pháp khai báo các phần bên chương trình C Chỉ thị #include để sử dụng tập tin thư viện Cú pháp: #include // Tên tập tin đạt dấu hay #include “Tên đường dẫn” Menu Option Turbo C có mục INCLUDE DIRECTORIES, mục dùng để định tập tin thư viện lưu trữ thư mục Nếu ta dùng #include Turbo C tìm tập tin thư viện thư mục xác định INCLUDE DIRECTORIES Ví dụ: include Nếu ta dùng #include”Tên đường dẫn” ta phải rõ tên đâu, tên thư mục tập tin thư viện Ví dụ: #include”C:\\TC\\math.h” Trong trường hợp tập tin thư viện nằm thư mục hành ta cần đưa tên tập tin thư viện Ví dụ: #include”math.h” Cấu trúc hàm main Hàm main chương trình chính, gồm lệnh xử lý, lời gọi hàm khác Cú pháp: main( đối số) { Các khai báo câu lệnh định nghĩa hàm return ; } Ví dụ 1: int main() { printf(“Day la chuong trinh chinh”); getch(); return 0; } Ví dụ 2: int main() { int a=5, b=6,c; float x=3.5, y=4.5,z; printf(“Day la chuong trinh chinh”); c=tong(a,b); printf(“\n Tong cua %d va %d la %d”,a,b,c); z=tong(x,y); printf(“\n Tong cua %f %f %f”, x,y,z); getch(); return 0; } 1.1.3 Sử dụng môi trường Turbo C++ Khởi động C++ chương trình khác cách nhấp đúp chuột lên biểu tượng chương trình Giao diện cửa sổ soạn thảo Khi gọi chạy C++ hình xuất menu xổ xuống cửa sổ soạn thảo Trên menu gồm có nhóm chức năng: File, Edit, Search, Run, Compile, Debug, Project, Options, Window, Help Các chương trình dịch hỗ trợ người lập trình mơi trường tích hợp tức ngồi chức soạn thảo, cịn cung cấp nhiều chức năng: Các chức soạn thảo Chức tìm kiếm thay Các chức liên quan đến tệp Chức dịch chạy chương trình Tóm tắt số phím nóng hay dùng - Các phím dịch chuyển trỏ soạn thảo  F2: ghi tệp lên đĩa  F3: mở tệp cũ sửa chữa soạn thảo tệp  F4: chạy chương trình đến vị trí trỏ  F5: Thu hẹp/mở rộng cửa sổ soạn thảo  F6: Chuyển đổi cửa sổ soạn thảo  F7: Chạy chương trình theo lệnh, kể lệnh hàm  F8: Chạy chương trình theo lệnh hàm  F9: Dịch liên kết chương trình Thường dùng chức để tìm lỗi cú pháp chương trình nguồn trước chạy  Alt-F7: Chuyển trỏ nơi gây lỗi trước  Alt-F8: Chuyển trỏ đến lỗi  Ctrl-F9: Chạy chương trình  Ctrl-Insert: Lưu khối văn đánh dấu vào nhớ đệm  Shift-Insert: Dán khối văn nhớ đệm vào văn vị trí trỏ  Shift-Delete: Xoá khối văn đánh dấu, lưu vào nhớ đệm  Ctrl-Delete: Xố khối văn đánh dấu (không lưu vào nhớ đệm)  Alt-F5: Chuyển sang cửa sổ xem kết chương trình vừa chạy xong  Alt-X: C++ lại Windows  Đánh dấu đầu khối: Ctrl_K B  Đánh dấu cuối khối: Ctrl_K K  Đánh dấu cuối khối: Ctrl_K K  Đánh dấu từ: Ctrl_K T  Sao chép khối: Ctrl_K C  Di chuyển khối: Ctrl_K V  Ctrl_K Y Xoá khối: 1.2 Sử dụng các kiểu liệu * Các thành phần bản ngơn ngữ lập trình C Tập ký tự thường dùng C C sử dụng ký tự: - Chữ hoa, chữ thường, chữ số, dấu chấm câu… + Chữ hoa: A, B, , Z + Chữ thường: a, b, c, ,z + Chữ số: 0, 1, , + Các ký hiệu toán học: +, -, *, /, =, (, ), + Ký hiệu gạch nối: _ + Các ký hiệu đặc biệt như: , ; [] {} ? ! \ & | % # Từ khoá C auto break case char const continue default double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Chú ý: - Không dùng từ khoá đặt tên cho hằng, biến, mảng, hàm - Từ khố khơng viết hoa mà phải viết thường - C phân biệt chữ hoa chữ thường Tên cách đặt tên Chương trình dùng nhiều tên: tên chương trình, tên biến, tên hằng, tên hàm… Mọi tên phải khai báo trước sử dụng Tên đặt với tên hợp lệ Tên không bắt đầu chữ số, không chứa ký tự đặc biệt, không chứa khoảng trắng, không từ khoá… Tên chữ hoa tên chữ thường khác Ví dụ: Turbo C khác turbo c khác TURBO C Tên hàm phải có nghĩa cú pháp Ví dụ: Tên khơng Cú pháp (digit) Tên hàm không khởi đầu số * (Asterisk) Tên hàm không khởi đầu dấu Tên hàm không khởi đầu từ + (Addition) khóa (dot) Tên hàm khơng khởi đầu total-number Tên hàm khơng chứa ký hiệu tốn tử account'97 Tên hàm không chứa dấu ‘ Tên hợp lệ: print2copy, total_number, _quick_add, Method3, chieu_dai, Chieu_Rong, Chu_Vi, Dien_Tich, 1.2.1 Các kiểu liệu bản Một kiểu liệu định nghĩa: Là tập hợp giá trị mà biến thuộc kiểu nhận Trên xác định số phép tốn Có nhiều kiểu liệu: - Kiểu vô hướng: kiểu số nguyên, kiểu số thực, kiểu ký tự,… - Kiểu liệu có cấu trúc: kiểu mảng, kiểu cấu trúc, kiểu tập tin - Kiểu trỏ Trong C sử dụng các kiểu liệu sau : a Kiểu số ngun Dữ liệu số khơng có thành phần thập phân Khoảng lớn phụ thuộc vào độ dài nhớ lưu trữ Số nguyên 32 bits : từ 2147483647 (231 - 1) đến -2147483648 Số nguyên 16 bits : từ 32767 (215 - 1) đến -32768 Các kiểu số nguyên sau đây: Kiểu Character Interger Short integer Long integer Unsigned char … Từ khoá char int short long unsigned char … byte 2 … Giá trị -127  128 -3276832767 -3276832767 -231 231-1  255 … Các phép tính số học với số nguyên: cộng (+), trừ (-), nhân (*), chia (/), chia lấy dư (%) Chú ý: Số nguyên chia cho số nguyên số nguyên Ví dụ: 9/2 = b Kiểu số thực - Dữ liệu số thực biểu diễn dấu chấm động Số thực 32 bits: khoảng giá trị từ 3.4E-38 đến 3.4E+38, có số lẻ thập phân Các phép tính số thực số thực với số nguyên cho kết kiểu số thực (float) - Dữ liệu số thực có độ xác gấp đơi Số thực 64 bits, có 10 số lẻ thập phân Kiểu số thực: biểu diễn số thực độ xác định khai báo với từ khóa sau: float (4 byte), double (8 byte), long double (10 byte) Các kiểu số thực sau đây: Kiểu Từ khoá byte Giá trị Số thực xác đơn float 3.4E-38  3.4E+38 Số thực xác kép double 1.7E-3081.7E+308 Số thực xác kép Độ dài long double 10 3.4E-49321.1E+4932 lớn Các phép tính kiểu số thực: cộng (+), trừ (-), nhân (*), chia (/) Chú ý: - Đối với số thực khơng có phép toán chia lấy dư (%) - Số nguyên (a) chia cho số nguyên (b) để số thực ta thực chuyển đổi kiểu sau: (float)a/b; Các hàm toán học C: - sin(x) : Hàm sin x - cos(x) : Hàm cos x - tan(x) : Hàm tang x - log(x): - abs(x): trị tuyệt đối x - round(x): làm tròn số x - sqrt(x) : Căn bậc hai x - pow(x,n) : hàm x mũ n c Kiểu ký tự ký tự - Một đối tượng kiểu ký tự biểu thị ký tự đơn, ứng với bảng mã ASCII bits - Kiểu ký tự C khai báo với từ khóa char Hằng ký tự viết dấu nháy đơn Giá trị mã ASCII ký tự Ví dụ : 'A' = 65; 'd' = 100, '9 ' - '0 ' = 57 - 48 = - Hằng ký tự: cịn viết ‘\’ số thứ tự ký tự mã ASCII Ví dụ : ‘A’ ‘\65’ ‘\0101’ ‘\0x41’ Một số đặc biệt viết theo qui ước sau: Viết Ký tự Diễn giải '\‘‘ ' dấu nháy đơn ' \" ' " dấu nháy kép ' \\ ' \ dấu chéo ngược '\n ‘ \n ký tự xuống dòng ' \0 ' \0 ký tự rỗng ( null) ' \b ' \b BACKSPACE ' \f ' \f Kết thúc trang (form-feed) ' \r ' \r Xuống dòng (RETURN) ' \t ' \t TAB Chú ý : - Phân biệt ký tự '0 ' ' \0 ' Hằng ' ' với chữ số có mã = 48 - Hằng '\0 ' với ký tự \0 (null) có mã * Các hàm xử lý ký tự: Khi sử dụng hàm phải khai báo thư viện - toASCII (c): chuyển ký tự c thành mã ASCII - tolower (c):chuyển ký tự c thành chữ thường - toupper (c): chuyển ký tự c thành chữ hoa d Kiểu logic - Boolean Trong C khơng có kiểu boolean Nhưng ngầm định kiểu số boolean kiểu số nguyên Ví dụ: 0: tương ứng với giá trị false, l: tương ứng với giá trị true * Các phép toán kiểu Boolean Toán tử && || ! Phép toán logic AND OR NOT * Các biểu thức quan hệ: Phép toán Ý nghĩa != Khác == Bằng >= Lớn Lớn < Bé 1.2.2 Biểu thức a Hằng C (Constant) Là đại lượng khơng đổi suốt q trình thực thi chương trình Hằng chuỗi ký tự, ký tự, số xác định Chúng biểu diễn hay định dạng (Format) với nhiều dạng thức khác - Hằng số thực Số thực bao gồm giá trị kiểu float, double, long double thể theo cách sau: - Cách 1: Sử dụng cách viết thông thường mà sử dụng mơn Tốn, Lý, …Điều cần lưu ý sử dụng dấu thập phân dấu chấm (.); Ví dụ: 123.34 -223.333 3.00 -56.0 - Cách 2: Sử dụng cách viết theo số mũ hay số khoa học Một số thực tách làm phần, cách ký tự e hay E Phần giá trị: số nguyên hay số thực viết theo cách Phần mũ: số nguyên Giá trị số thực là: Phần giá trị nhân với 10 mũ phần mũ Ví dụ: 1234.56e-3 = 1.23456 (là số 1234.56 * 10-3) -123.45E4 = -1234500 ( -123.45 *104) - Hằng số nguyên Số nguyên gồm kiểu int (2 bytes) , long (4 bytes) thể theo cách sau - Hằng ký tự Hằng ký tự ký tự riêng biệt viết cặp dấu nháy đơn (‘) Mỗi ký tự tương ứng với giá trị bảng mã ASCII Hằng ký tự xem trị số ngun Ví dụ: ‘a’, ‘A’, ‘0’, ‘9’ Chúng ta thực phép toán số học ký tự (thực chất thực phép toán giá trị ASCII chúng) 10 Truy nhập qua trỏ: Có thể truy nhập đến thành phần thơng qua trỏ theo hai cách sau : Cách : Tên_con_trỏ->Tên_thành_phần Cách hai : (*Tên_con_trỏ).Tên_thành_phần Ví dụ : nc1.ngaysinh.nam p1-> ngaysinh.nam ds[4].ngaysinh.thang (*p2) ngaysinh.thang Phép gán qua trỏ: Giả sử ta gán : p1=&nc1; p2=&ds[4]; Khi dùng : *p1 thay cho nc1 *p2 thay cho ds[4] 5.2 Kiểu hợp - Định nghĩa: Hợp (union) khối nhớ dùng để lưu trữ liệu với kiểu khác Khác với struct, đối tượng liệu có địa vùng nhớ lưu trữ Khai báo tương tự struct - Khai báo: union automobile { int year; char model[8]; int engine_power; float weight; }; - Định nghĩa biến kiểu hợp: union automobile sedan, pick_up, sport_utility; - Tổng hợp từ khai báo định nghĩa biến cấu trúc: union automobile { int year; char model[8]; int engine_power; float weight; 60 } sedan, pick_up, sport_utility; Tên tag bỏ qua ta định nghĩa lần không định nghĩa biến khác union { int year; char model[8]; int engine_power; float weight; } sedan, pick_up, sport_utility; - Tham chiếu các phần tử kiểu hợp - Ta dùng dấu chấm (.) -> cấu trúc sedan.year = 1997; Hoặc: union automobile *ptr; ptr->year = 1997; Ví dụ: 1: /* Referencing a union */ 2: #include 3: #include 4: 5: main(void) 6: { 7: union menu { 8: char name[23]; 9: double price; 10: } dish; 11: 12: printf("The content assigned to the union separately:\n"); 13: /* reference name */ 14: strcpy(dish.name, "Sweet and Sour Chicken"); 15: printf("Dish Name: %s\n", dish.name); 16: /* reference price */ 17: dish.price = 9.95; 18: printf("Dish Price: %5.2f\n", dish.price); 19: 20: return 0; 21: } Kết quả: The content assigned to the union separately: Dish Name: Sweet and Sour Chicken Dish Price: 9.95 BÀI TẬP 61 Định nghĩa dãy cấu trúc dùng làm danh bạ điện thoại, gồm có tên, địa chỉ, số điện thoại, với số mẫu tin tối đa 40 Viết chương trình với chức sau: nhập thơng mới, tìm kiếm số điện thoại, in danh sách theo quận Viết chương trình nhận vào thơng tin sau: Tên đội bóng, số trận thắng, số trận hịa, số trận thua In đội bóng có số điểm cao (với trận thắng = điểm, trận hòa = điểm trận thua = điểm) Xây dựng cấu trúc gồm: Họ tên, ngày sinh, trường, số báo danh, điểm thi Trong đó, điểm thi cấu trúc gồm mơn: Tốn, Lý, Hóa Nhập liệu vào khoảng 10 thí sinh, tìm in thí sinh có tổng điểm mơn >= 15 Viết chương trình nhập vào danh sách nhân viên gồm Họ tên, Chức vụ, Lương bản, Hệ số, Tạm ứng Sau in danh sách bảng lương nhân viên: Họ tên, Chức vụ, Lương (lương = Lương * hệ số), Tạm ứng, Thực lãnh (Lương - Tạm ứng), xếp thực lãnh theo thứ tự giảm dần Viết chương trình tạo lập tìm kiếm liệu Nội dung yêu cầu gồm: Nhập họ tên, địa (gồm: Quận, phường, tổ), tuổi, lương Tìm kiếm người Quận có tuổi 30 thu nhập từ 500.000đ trở lên in hình Viết chương trình sử dụng trỏ cấu trúc thể ngày, tháng, năm hình, tính khoảng cách ngày Viết chương trình khai báo kiểu liệu thể số phức Sử dụng kiểu để viết hàm tính tổng, hiệu, tích hai số phức Viết chương trình khai báo kiểu liệu để biểu diễn phân số Hãy viết hàm thực cơng việc sau: • Tính tổng, hiệu, tích, thương hai phân số • Rút gọn phân số • Qui đồng hai phân số Tổ chức liệu để quản lí sinh viên cấu trúc mẫu tin mảng N phần tử, phần tử có cấu trúc sau: - Mã sinh viên - Tên - Năm sinh - Điểm toán, lý, hố, điểm trung bình Viết chương trình thực cơng việc sau: • Nhập danh sách sinh viên cho lớp học • Xuất danh sách sinh viên hình • Tìm sinh viên có điểm trung bình cao • Sắp xếp danh sách lớp theo thứ tự tăng dần điểm trung bình Viết chương trình quản lý lớp học trường Các thông tin lớp học sau : Tên lớp,- Sĩ số, Danh sách sinh viên lớp • Nhập vào danh sach lớp với thông tin yêu cầu • In danh sách lớp có sinh viên có điểm trung bình loại giỏi • Tìm lớp có nhiều sinh viên • Tìm lớp có sinh viên • Tìm sinh viên có điểm trung bình cao 62 CHƯƠNG LẬP TRÌNH XỬ LÝ TỆP TIN Trong C, tập tin biểu thị thiết bị cụ thể trao đổi thơng tin Nó tập tin đĩa, ảnh, máy in, băng từ Khi tiếp cận, phải có động tác mở tập tin; khơng dùng nữa, ta đóng lại - Có kiểu nhập xuất tập tin: kiểu văn (text file) kiểu nhị phân (binary file) CÁC THAO TÁC TRÊN 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 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 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; Định nghĩa: Trong C, tập tin biểu thị thiết bị cụ thể trao đổi thơng tin Nó tập tin đĩa, ảnh, máy in, băng từ Khi tiếp cận, phải có động tác mở tập tin; khơng dùng nữa, ta đóng lại - FILE *fptr; fptr = fopen ("data.dat","wt"); Mở tập tin ( fopen) Cú pháp: FILE *fopen(char *Path, const char *Mode) Trong đó: - Path: chuỗi đường dẫn đến tập tin đĩa *mode: chuỗi cho biết kiểu nhập xuất "r" "w" "a" "r+" "w+" "a+" "rb" "wb" "ab" Mở text file để đọc Tạo text file để viết Mở text file để thêm vào Mở text file để đọc ghi Tạo text file để viết hay đọc Mở tạo text file để thêm vào Mở binary file để đọc Tạo binary file để viết Mở binary file để thêm vào 63 "r+b" Mở binary file để đọc ghi "w+b" Tạo binary file để viết hay đọc "a+b" Mở tạo binary file để thêm vào - 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 FILE *fptr; if ((fptr = fopen("test.txt", "r")) == NULL){ printf("Cannot open test.txt file.\n"); exit(1); } Đó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 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 Kiểm tra đến cuối tập tin hay chưa? Cú pháp: int feof(FILE *f) 64 Ý 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ả 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) 6.1 Thao tác với tệp tin văn bản Ghi liệu lên tập tin văn bản 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 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 Hàm fprintf() Hàm dùng để ghi liệu có định dạng lên tập tin văn 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) 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 (,) Định dạng %d Ý nghĩa Ghi số nguyên 65 %[.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 chuỗi ký tự %e %E %g %G Ghi số thực dạng khoa học (nhân 10 mũ x) 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 Đọc liệu từ tập tin văn bản 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 Hàm fgets() Cú pháp: char *fgets(char *buffer, int n, FILE *f) 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 66 ‘\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 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); } 67 closeall(); } getch(); return 0; } 6.2 Thao tác với tập tin nhị phân 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 Đọ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 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 đó: 68 - 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à: SEEK_SET SEEK_CUR SEEK_END Vị trí đầu tập tin Vị trí trỏ tập tin Vị trí cuối tập tin 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ả 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); } 69 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) { 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 tr ỏ vị cuối tập tin + Hàm void rewind (FILE*fp) : chuyển trỏ vị tập fp đầu tập tin + Hàm int fseek (FILE*fp, long số byte, int xp) Ðối : fp : trỏ tập tin; số byte : số byte cần di chuyển xp " cho biết vị trí xuất phát mà việc dịch chuyển xp = SEEK - SET hay xuất phát từ đầu tập xp = SEEK - CUR hay : xuất phát từ vị trí trỏ xp= SEEK - END HAY : xuất phát từ vị trí cuối tập trỏ 72 + Công dụng : hàm di chuyển trỏ vị tập fp từ vị trí xác định xp qua số byte giá trị tuyệt đối số byte Nếu số byte > : chuyển h ướng cuối tập ngược lại chuyển hướng đầu tập Nếu thành công trả trị Nếu có lỗi trả khác + Chú ý : không nên dùng fseep ki ểu văn bản, chuyển đổi ký tự( mã 10) làm cho việc định vị thiếu xác + Hàm long ftell(FILE*fp) ; : cho bi ết vị trí trỏ vị (byte thứ tr ên tập fp) không thành công trả trị -1L + Ví dụ 1: giả sử tập fp có ký tự fseek (fp,0,SEEK-END) => ftell(fp) = fseek(fp,0,2) => ftell(fp) = fseek (fp,-2, SEEK-END) => ftell(fp) = fseek(fp,0,SEEK -SET) => ftell(fp) = fseek(fp,0, 0) =>ftell(fp) = + Ví dụ : giả sử ta có tập tin c: \lop.txt chứa danh sách học viên Hãy đọc danh sách xếp giảm dần the o điểm sau ghi lại file c: \lop.txt ( nối điểm) #include #include #include #define N 100 typedef struct { char ten[20] ; int tuoi; float diem ; } KieuHV ; void main( ) { KieuHV hv[N] ; t; FILE*fp ; int i, , n ; fp = fopen ("c:\\lop.txt ", "rat"); if (fp = =NULL) { printf ("không mở file "); exit(1); } n=0;i=0; while (!feof (fp)) { fread (&hv[i], size of (KieuHV), 1,fp); i++; n++ ; /* xếp giảm dần theo điểm */ for (i=0, i

Ngày đăng: 12/10/2022, 20:51

Hình ảnh liên quan

- Một đối tượng của kiểu ký tự biểu thị một ký tự đơn, ứng với bảng mã ASCII 8 bits. - Bài giảng ngôn ngữ lập trình C

t.

đối tượng của kiểu ký tự biểu thị một ký tự đơn, ứng với bảng mã ASCII 8 bits Xem tại trang 9 của tài liệu.
Bảng chân trị cho các toán tử Logic: - Bài giảng ngôn ngữ lập trình C

Bảng ch.

ân trị cho các toán tử Logic: Xem tại trang 14 của tài liệu.
4.Viết chương trình tính diện tích và chu vi của hình chữ nhật với chiều dài và chiều rộng được nhập từ bàn ph ím. - Bài giảng ngôn ngữ lập trình C

4..

Viết chương trình tính diện tích và chu vi của hình chữ nhật với chiều dài và chiều rộng được nhập từ bàn ph ím Xem tại trang 41 của tài liệu.

Tài liệu cùng người dùng

Tài liệu liên quan