Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4 Giáo trình Cấu trúc dữ liệu và giải thuật 4
Bài giảng Lập trình C -1- _ Lập trình C Chương Thành phần – chương trình 1.1 Giới thiệu Ngơn ngữ C đời từ năm 1972 Brian Kernighan Dennis Ritchie Năm 1983, Viện chuẩn hoá quốc gia Mỹ (ANSI - American National Standards Institute) tiến hành chuẩn hoá Năm 1989, Tổ chức chuẩn hoá quốc tế (ISO - International Organization for Standardization) tiếp tục chuẩn hố đến năm 1990 việc chuẩn hố hồn thành gọi “C chuẩn” Mọi ngơn ngữ C trước gọi C K&R C ngôn ngữ sử dụng rộng rãi Từ “C chuẩn”, hãng phần mềm phát triển thành ngôn ngữ C riêng như: Microsoft C, Quick C, Turbo C, Borland C Năm 1983, với phát triển công nghệ phần mềm, từ “lập trình cấu trúc” sang “lập trình hướng đối tượng” ngơn ngữ C phát triển thành C++ 1.2 Các thành phần ngơn ngữ C 1.2.1 Từ khóa Từ khóa (keyword) từ dành riêng ngơn ngữ C Từ khóa phải sử dụng cú pháp không định nghĩa lại Dưới số từ khóa thông dụng: auto break case char continue default double else extern float for goto if int long register return short sizeof static struct switch typedef union unsigned void volatile while 1.2.2 Tên Tên (identifier) dùng để định danh hay đặt tên cho thành phần chương trình, chẳng hạn tên biến, tên hằng, tên hàm, Tên dãy kí tự gồm chữ (a z, A Z), chữ số (0 9) ký tự gạch nối “_” Các lưu ý đặt tên: - Bắt đầu chữ dấu gạch dưới; tên không bắt đầu chữ số - Tên khơng chứa kí tự trống, khơng trùng với từ khóa _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -2- _ Ví dụ tên hợp lệ: so_sanh, chuong_trinh, batdau, program12; tên không hợp lệ: trung binh, 1_bien, char, abc$ten Nên đặt tên gợi nhớ có ý nghĩa 1.2.3 Tên chuẩn Tên chuẩn tên có sẵn ngôn ngữ C Một số tên chuẩn như: printf, sin, sqrt, M_PI, BLUE Không cấm việc đặt tên trùng với tên chuẩn ý nghĩa tên chuẩn khơng cịn giá trị 1.2.4 Hằng, biến, biểu thức Hằng đại lượng không đổi suốt q trình thực thi chương trình Hằng ký tự, chuỗi ký tự, giá trị số xác định Hằng biểu diễn hay định dạng với nhiều dạng thức khác Hằng số thực dùng dấu chấm thập phân dạng khoa học Hằng ký tự dùng dấu nháy đơn Hằng chuỗi kí tự dùng dấu nháy kép Ví dụ: 123 số nguyên, 31.2 số thực, 314e-2 số thực dạng khoa học có giá trị 3.14, „a‟ kí tự, “bai toan” chuỗi kí tự Biến đại lượng thay đổi giá trị chương trình Khai báo biến để chương trình dành riêng vùng nhớ thích hợp cho biến Chương trình truy cập giá trị biến thơng qua tên biến Biểu thức công thức tính tốn để có giá trị theo qui tắc tốn học Một biểu thức bao gồm tốn tử tốn hạng (có thể giá trị, biến, số) Khi tính tốn ưu tiên cho biểu thức ngoặc đơn Ví dụ: (x + y) / z a>b 1.2.5 Dấu ngăn cách câu lệnh, khoảng trống Dấu “;” dùng để ngăn cách lệnh, nghĩa lệnh khai báo phải kết thúc dấu chấm phẩy “;” Bản thân “;” lệnh rỗng Khoảng trống trình biên dịch bỏ qua Khoảng trống gồm ký tự: dấu cách (space bar), dấu tab dấu sang dòng (Enter) _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -3- _ 1.2.6 Lời thích Khi viết chương trình, nên sử dụng lời thích để làm cho chương trình dễ hiểu Trong chương trình, lời thích đặt hai dấu “/*” “*/” Ví dụ: /* Day la ham so sanh so */ Lời thích khơng lồng vào Ví dụ thích sau có lỗi: /* Dai hoc Da Nang /* Truong DHBK*/ */ 1.3 Kiểu liệu chuẩn Kiểu liệu tập hợp giá trị phép toán thực giá trị Các kiểu liệu có sẵn ngơn ngữ C gọi kiểu liệu chuẩn 1.3.1 Kiểu kí tự - char Một giá trị kiểu char chiếm byte biểu diễn kí tự bảng mã ASCII Ví dụ: Kí tự Mã ASCII „0‟ 48 „a‟ 65 „A‟ 97 Có hai kiểu char: signed char unsinged char Kiểu kí tự Kích thước (signed) char byte unsigned char byte 1.3.2 Kiểu số nguyên Kiểu số nguyên (signed) int, short (int) unsigned (int) (signed) long unsigned long Miền giá trị -128 127 255 Kích thước byte byte byte byte Miền giá trị -32768 32767 65535 -2147483648 2147483647 4294967295 Từ khóa short dùng mặc định int short int Với kiểu số ngun mặc định số ngun có dấu (signed), để định số nguyên không dấu (không có số âm) đặt từ khóa unsigned trước tên kiểu với Lưu ý: kiểu kí tự xem dạng kiểu số nguyên Các số hệ 16 viết 10 chữ số chữ là: A, B, C, D, E, F _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -4- _ Hằng số 16: thêm kí tự 0x 0X vào trước số ngun hệ 16 Ví dụ: 0x41 có giá trị thập phân 65 0XF có giá trị thập phân 15 Hằng số 8: thêm kí tự (số 0) vào trước số nguyên hệ Ví dụ: 017 có giá trị thập phân 15 0101 có giá trị thập phân 65 Cách biểu diễn số nguyên hệ 16 hệ thường dùng lập trình hệ thống Ngơn ngữ C mặc định kiểu liệu int Ví dụ: 16/5 có giá trị Hằng kiểu long thêm L vào sau (chữ l thường dễ nhầm với số 1) Ví dụ: 123456L 1.3.3 Kiểu số thực Kiểu số thực float double long double Kích thước byte byte 10 byte Miền giá trị 3.4E-38 3.4E+38 1.7E-308 1.7E+308 3.4E-4932 1.1E+4932 Có cách biểu diễn số thực: Ví dụ: Dạng thập phân: dùng dấu chấm để ngăn cách phần nguyên phần thập phân -12.345672 1203.8375 Ví dụ: Dạng khoa học: gồm phần định trị phần mũ số 10 Hai phần cách chữ E e -6.123E+02 0.9827462E-03 1.3.4 Ép kiểu Ép kiểu (còn gọi chuyển kiểu) chuyển giá trị toán hạng biểu thức có kiểu liệu sang kiểu liệu khác Có hai cách chuyển kiểu: chuyển kiểu tự động chuyển kiểu tường minh Với chuyển kiểu tự động, biểu thức thực kiểu liệu khác nhau, ngôn ngữ C tự động chuyển sang kiểu có kích thước lớn để thực Ví dụ: 11.2/5 giống 11.2/5.0 Với chuyển kiểu tường minh, dùng cú pháp sau: _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -5- _ Cú pháp: (kiểu_mới) biểu_thức kiểu_mới (biểu_thức) Trong cú pháp trên, kiểu_mới kiểu đích cần chuyển đến biểu_thức cần chuyển kiểu Ví dụ: i = (int) 2.7; /* i =3 */ n = int(12.3); /* n =12 */ m=2; n = 5; x = float(m)/n; 1.4 /* x = 2.0/5 = 0.4 */ Các phép toán 1.4.1 Các phép toán số nguyên Các phép toán số ngun bao gồm: Phép tốn Kí hiệu Cộng + Trừ Nhân * Chia lấy phần nguyên / Chia lấy phần dư % Ví dụ 2+5 = „A‟-„B‟ = -1 7*3 = 21 15 / = 17 % = 1.4.2 Các phép toán số thực Các phép toán số thực bao gồm: cộng (+), trừ (-), nhân (*), chia (/) 1.4.3 Các phép toán so sánh Một biểu thức chứa phép so sánh ==, !=, >, =, So sánh lớn < So sánh nhỏ >= So sánh lớn 10 || có giá trị !5 có giá trị sai Thứ tự ưu tiên phép toán logic: !, &&, || Ví dụ: !3 > = > = (sai) !(3>5) = !0 = (đúng) !!5 = !0 = (đúng) 1.4.5 Các phép toán bit Ngơn ngữ C cịn cung cấp cho toán tử để thao tác bit (0 1) Các toán tử bao gồm: Phép toán bit Ý nghĩa & Phép AND bit | Phép OR bit ^ Phép XOR bit Phép đảo bit > Phép dịch phải (chia 2) Ví dụ: phép đảo bit số nguyên (kiểu int) = 0000 0000 0000 0011 ~ = 1111 1111 1111 1100 Quy tắc thực phép AND bit là: 0&0=0 0&1=0 1&0=0 1&1=1 _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -7- _ Ví dụ: & & kết quả: 0000 0000 0000 0011 = 0000 0000 0000 0101 = 0000 0000 0000 0001 = Qui tắc thực phép OR bit là: 0|0=0 0|1=1 1|0=1 1|1=1 Qui tắc thực phép XOR (eXclusive OR-hoặc tuyển chọn) bit là: 0^0=0 0^1=1 1^0=1 1^1=0 Các phép dịch trái () bít tương đương với chia a > n = a/(2n); /*tương đương với a/(2n) */ 1.5 Cấu trúc chương trình khai báo 1.5.1 Khái niệm hàm Hàm đoạn chương trình viết lần sử dụng nhiều lần, lần sử dụng cần gọi tên hàm cung cấp tham số tương ứng Khai báo, định nghĩa sử dụng hàm trình bày cụ thể phần 1.5.2 Cấu trúc chương trình Một chương trình C thường có cấu trúc sau: #include < > /* Gọi tệp tiêu đề chương trình */ #define /* Khai báo số hay gọi macro*/ typedef /* Định nghĩa kiểu liệu */ /* Nguyên mẫu hàm: khai báo tên hàm tham số */ /* Khai báo biến toàn cục */ main() { _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -8- _ /* Khai báo biến */ /* Các câu lệnh */ } /* Định nghĩa hàm */ Như vậy, chương trình C, có nhiều phần khác nhau: khai báo, định nghĩa, Tất phần tùy chọn (có thể có khơng có), trừ định nghĩa hàm main( ) bắt buộc phải có Hàm main( ) hàm chương trình C, định nghĩa hàm main( ) bắt buộc Ví dụ: chương trình đơn giản main( ){} Chương trình khơng làm cả, khơng báo lỗi, khơng chứa câu lệnh 1.5.3 Các khai báo Trong cấu trúc chung chương trình C, có nhiều loại khai báo khác nhau, phần giới thiệu vài khai báo đơn giản, khai báo kiểu hàm trình bày sau a) #include Dùng để gọi tệp tiêu đề vào chương trình, tệp tiêu đề chứa hàm chuẩn hàm người sử dụng định nghĩa Cú pháp: #include Ví dụ: gọi tệp tiêu đề stdio.h để sử dụng hàm nhập xuất chuẩn #include b) #define Dùng để định nghĩa số hay macro Khai báo macro dùng để đặt tên cho số với mục đích để chương trình dễ hiểu dễ thay đổi đại lượng truy cập nhiều lần chương trình Cú pháp: #define tên_macro phần_thay_ Khi biên dịch chương trình, gặp tên_macro thay phần_thay_ Ví dụ: #define MAX 100 #define PI 3.14 Lưu ý: - Mỗi dẫn (#) viết dịng - Nếu cuối phần_thay_ macro có dấu “;” xem phần Ví dụ: _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -9- _ #define BYE printf(“Tạm biệt”); - Các từ khóa hàm chuẩn chữ thường; macro chuẩn chữ hoa Ví dụ: sin, log, for, RED, XOR_PUT - Nên dùng chữ hoa đặt tên macro c) Khai báo biến Muốn sử dụng biến, bắt buộc phải khai báo trước sử dụng Cú pháp: kiểu_dữ_liệu danh_sách _biến; Ví dụ: int a, b; /* khai báo biến a, b kiểu int */ float x, y, so_thuc; /* khai báo biến x, y, so_thuc kiểu số thực*/ Lưu ý, khai báo biến khởi tạo giá trị cho biến sau: int a, b = 100; b có giá trị đầu 100, a có giá trị đầu giá trị ngẫu nhiên d) Khai báo biến Biến biến nhớ chương trình khơng thay đổi Cú pháp: const kiểu tên_hằng = giá_trị_hằng ; Ví dụ: const float PI = 3.14; const MAX = 100; Chương trình tạo biến tên PI nhớ có giá trị 3.14, biến tên MAX kiểu int có giá trị 100 1.6 Quy tắc viết chương trình - Các lệnh nhóm nên nhóm thẳng cột dọc - Đặt tên cho đại lượng nên có tính gợi nhớ, có ý nghĩa - Nên viết thêm lời giải thích bên cạnh lệnh cho rõ 1.7 Phép gán a) Phép gán đơn Cú pháp: biến = biểu_thức; Gán giá trị biểu_thức cho biến _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -10- _ Ví dụ: a = 1; /* biến a nhận giá trị */ b = a + 1; /* biến b nhận giá trị biểu thức a + tức giá trị */ Biểu thức gán có giá trị giá trị biến sau gán Ví dụ: a = b = c = 1; /* gán giá trị cho biến a, b, c */ x = a + (y = 3); /* y nhận giá trị 3, sau x nhận giá trị a + y, nghĩa x = */ b) Phép gán kết hợp Cú pháp: tên_biến pt = biểu_thức; Lấy giá trị biến thực phép toán pt với biểu thức, giá trị gán trở lại cho biến Ví dụ: a += 1; /* a=a+1; */ x *= 2+3; /* x=x*5; */ c) Phép tăng/giảm (++/ ) Toán tử “++” đặt trước sau biến nguyên để tăng biến đơn vị Tương tự, toán tử “ ” đặt trước sau biến để giảm biến đơn vị Ví dụ: i++; /* i = i+1 i+=1; ++i; */ Nếu đặt trước biến giá trị biến tăng/giảm trước thực lệnh Tương tự, cho đặt sau biến giá trị biến tăng/giảm sau thực lệnh Ví dụ: x = 5; y = x++; /* y=5; x=6; */ x = 10; y = x; /* x=9; y=9; */ Xét phép gán sau: a = 3; b = a + a; Như vậy, a phải thực trước, sau thực b = + = Lệnh b = a + a; tương đương với lệnh: a; b = a + a; _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -87- _ union sử dụng nhiều trường hợp Ví dụ viết chương trình dịch khơng phụ thuộc vào máy Máy yêu cầu int, máy yêu cầu long int Bạn lo nghĩ điều union giữ dấu vết kích thước union cho trường hợp Ví dụ: union table { int number; long address; char code; }; union table co_address; union table code_string[10]; union table address_no; _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -88- _ Câu hỏi tập chương Dùng kiểu cấu trúc khai báo kiểu điểm mặt phẳng Oxy Nhập hai điểm A, B in khoảng cách chúng Dùng kiểu cấu trúc khai báo kiểu phân số Viết hàm tiện ích để tính tốn phân sơ: a) Hàm GCD(a,b) : tính ước chung lớn hai số nguyên a, b b) Hàm Reduce(x) : Tối giản phân số x c) Hàm Sum(x,y) : Tính x+y d) Hàm Prod(x,y) : Tính xy e) Hàm Sub(x,y) : Tính x-y Kiểu đa thức khai báo cấu trúc với trường: mảng hệ số bậc đa thức Sơ đồ Horner để tính đa thức P(x) = anxn + an-1xn-1 + + a1x + a0 biểu diễn sau: P(x) = a0 + (a1 + (a2 + ( +( an)x) )x)x Viết chương trình nhập bậc n P(x) nhập mảng hệ số Dùng sơ đồ Horner đề tính in hình giá trị P(x) Kiểu đa thức khai báo cấu trúc với trường: mảng hệ số bậc đa thức Viết hàm tính: a) Tổng hai đa thức b) Hiệu hai đa thức c) Tích hai đa thức Xét mảng struct struct{ char hoten[25]; char quequan[30]; int tuoi; }person[100]; Mỗi phần tử mảng cấu trúc chứa thơng tin người Viết chương trình thực yêu cầu sau: a) Nhập số nguyên dương n nhập số liệu cho n người (n100) b) Sắp xếp danh sách theo thứ tự tăng tuổi c) In hình danh sách theo thứ tự tăng tuổi Viết chương trình quản lý điểm thi đại học khối A hội đồng thi gồm n thí sinh (n100) với thơng tin: số báo danh, họ tên, ngày sinh, điểm toán, điểm lý, điểm hóa Viết chương trình có chức sau: a) Nhập danh sách thí sinh b) Sắp xếp danh sách sinh viên theo số báo danh c) Tính tổng điểm thí sinh d) Nhập điểm chuẩn dc Thí sinh trúng tuyển thí sinh có tổng điểm khơng thấp dc không bị điểm không môn In hình danh sách thí sinh trúng tuyển _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -89- _ Viết chương trình quản lý lớp học gồm n sinh viên (n100) với thông tin: họ, tên, ngày sinh, quên quán Viết chương trình có chức sau: a) Nhập danh sách lớp b) Sắp xếp danh sách sinh viên theo tên Nếu tên trùng theo họ c) Nhập thông tin cho sinh viên chuyển đến lớp Chèn sinh viên vào danh sách cho thứ tự d) Nhập tên t In tất thí sinh có tên t e) Nhập số thứ tự k Xóa sinh viên thứ k khỏi danh sách Viết chương trình quản lý phiếu nhập kho hàng tháng, gồm n phiếu (n100) với thông tin: số phiếu, ngày nhập, tên mặt hàng, mã mặt hàng, số lượng, đơn giá Viết chương trình có chức sau: a) Nhập danh sách phiếu b) Tình thành tiền phiếu c) Sắp xếp danh sách phiếu theo mã mặt hàng Nếu trùng theo ngày nhập d) Tính tổng tiền nhập hàng tháng e) Thống kê hàng nhập theo mặt hàng gồm : mã mặt hàng, tên mặt hàng, tổng số lượng, thành tiền Viết chương trình quản lý lương tháng công ty, gồm n nhân viên (n100) với thông tin: họ tên, hệ số lương, hệ số phụ cấp, hệ số chức vụ, giờ, tạm ứng Tuy nhiên, để tiết kiệm nhớ, hệ số chức vụ hệ số đặt chung trường (union) Viết chương trình có chức sau: a) Nhập danh sách lương b) Tính thành tiền nhân viên: thành tiền = 1050000*(hệ số phụ cấp+hệ số chức vụ giờ) c) Tính thực nhận nhân viên: thực nhận = thành tiền – tạm ứng c) Sắp xếp danh sách theo thứ tự giảm dần thực nhận d) In hình bảng lương Tạm dừng sau 20 người 10 Kiểu số union gồm trường: thuc kiểu float nguyen mảng gồm số nguyên kiểu char Viết chương trình nhập giá trị thực cho số In hình số nguyên dạng nhị phân (cơ số 2) _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -90- _ Chương Kiểu tệp tin 9.1 Giới thiệu Đố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 (file) cho phép lưu trữ liệu nhớ ngồi (đĩa) Khi kết thúc chương trình liệu cịn 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: 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 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 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 Dòng chảy 9.2 Các thao tác lên tệp Muốn thao tác tập tin, ta phải làm theo bước: Khai báo biến tập tin _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -91- _ Mở tập tin hàm fopen() Thực thao tác xử lý liệu tập tin hàm đọc/ghi liệu Đó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 9.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; 9.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 - Mode: chuỗi xác định cách thức mà tập tin mở Các giá trị Mode: Chế độ (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 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 Hàm trả trỏ đến tệp mở thành công, không trả trỏ NULL _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -92- _ Ví dụ 1: Mở tệp text để đọc #include FILE *fp; if ((fp = fopen("dulieu.txt","r")) == NULL) { fprintf(stderr,"Không thể mở tệp dulieu.txt\n"); exit(1); } Đóng tệp 9.3 Sau khơng làm việc với tệp nữa, cần phải đóng tệp hàm fclose() với cú pháp sau: int fclose(FILE *fp) - Tham số trỏ tệp cần đóng - Hàm trả thành công, ngược lại trả EOF Ví dụ: #include FILE *f; fclose(f); Đọc ghi kí tự tệp 9.4 9.4.1 Đọc kí tự Ngơn ngữ C cung cấp hai hàm đọc kí tự với cú pháp sau: int getc(FILE *fp) int fgetc(FILE *fp) Hai hàm có chức nhau, đọc kí tự từ tệp tin trỏ fp Hàm trả kí tự đọc được, có lỗi xảy trả EOF Ví dụ: #include int c; FILE *fi; while ((c = fgetc(fi)) != EOF) { /* sử dụng kí tự c */ } _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -93- _ 9.4.2 Ghi kí tự Ngơn ngữ C cung cấp hai hàm ghi kí tự với cú pháp sau: int putc(int ch, FILE *fp) int fputc(int ch, FILE *fp) Hai hàm có chức nhau, ghi kí tự ch vào tệp tin trỏ fp Hàm trả kí tự ghi được, có lỗi xảy trả EOF Ví dụ: #include int c; FILE *fi,*fo; main() { /* fi : trỏ tệp tin mở để đọc */ if ((fp = fopen("dulieu.txt","r")) == NULL) { fprintf(stderr,"Không thể mở tệp dulieu.txt\n"); exit(1); } /* fo : trỏ tệp tin mở để ghi */ if ((fp = fopen("tepmoi.txt","w")) == NULL) { fprintf(stderr,"Không thể mở tệp tepmoi.txt\n"); exit(1); } while ((c = fgetc(fi)) != EOF) fputc(c,fo); fclose(fi); fclose(fo); } 9.5 Đọc ghi dòng tệp 9.5.1 Đọc dịng Hàm đọc dịng fgets có cú pháp sau: char *fgets(char *s, int n, FILE *fp) Các tham số: _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -94- _ - s trỏ kiểu char trỏ đến vùng nhớ chứa chuỗi kí tự đọc từ tệp - n độ dài lớn chuỗi đọc - fp trỏ tệp đọc Hàm trả địa vùng nhớ nhận kết Nếu có lỗi cuối tệp trả NULL Việc đọc dòng kết thúc trường hợp sau xảy ra: - Hoặc đọc n-1 kí tự - Hoặc gặp dấu xuống dòng (cặp mã 13 10) Mã 10 ghi vào chuỗi kết - Hoặc kết thúc tệp Chuỗi kết bổ sung thêm kí hiệu „\0‟ Ví dụ: #include #define LONG 80 char line[LONG]; FILE *fi; main() { /* fi : trỏ tệp tin mở để đọc */ if ((fp = fopen("dulieu.txt","r")) == NULL) { fprintf(stderr,"Không thể mở tệp dulieu.txt\n"); exit(1); } while (fgets(line,LONG,fi) != NULL) /* dừng có lỗi kết thúc tệp */ { printf(“%s\n”, line); } fclose(fi); getch(); } 9.5.2 Ghi dòng Hàm ghi dòng fputs có cú pháp sau: int fputs(const char *s, FILE *fp) Tham số: - s trỏ đến chuỗi kí tự kết thúc „\0‟ cần ghi vào tệp _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -95- _ - fp trỏ tệp Hàm fputs ghi chuỗi s vào tệp fp (khơng ghi „\0‟) Khi thành cơng trả kí tự cuối ghi lên tệp, có lỗi hàm trả EOF 9.6 Một số hàm khác Kiểm tra cuối tệp – feof Cú pháp: int feof(FILE *fp) Hàm cho giá trị khác gặp cuối tệp đọc, ngược lại hàm cho giá trị Chuyển đầu đọc đầu tệp Cú pháp: void rewind(FILE *fp) Đóng tất tệp mở Cú pháp: int fcloseall(void) Trả số nguyên số tệp đóng thành cơng, ngược lại trả EOF Xóa tệp – unlink/remove Cú pháp: int unlink(const char *name) Xóa tệp có tên name Nếu thành công trả 0, ngược lại trả EOF Hàm remove hoàn toàn tương tự _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -96- _ Câu hỏi tập chương Viết chương trình đọc tệp tin văn có máy In hình dịng Viết chương trình đọc tệp tin văn có máy In hình từ dịng Tạm dừng sau 20 từ Viết chương trình nhập tên hai tệp tin Tạo tệp tin thứ ba cách nối tệp tin thứ hai vào cuối tệp tin thứ Giả sử tệp tin ”Num.dat” tệp nhị phân chứa số nguyên kiểu int Viết chương trình đọc tệp ghi số vào tệp “Num.txt” dạng văn Cho tệp tin liệu ”matran.inp” tổ chức theo khuôn dạng tệp tin văn sau: - Dòng số tự nhiên n cấp ma trận vng A - n dịng dịng ghi n số thực Mỗi số thực phân biệt với nhiều ký tự trống phần tử A[i][j] ma trận vuông A; Hãy viết chương trình tìm hàng cột có tổng phần tử lớn Ghi kết hàng cột vào tệp ”max.out” mà phần tử phân biệt ký tự trống Viết chương trình thực công việc sau: Xây dựng tệp tin ”MT.txt” ghi lên dịng đầu cấp n, 2n dòng dòng chứa cá phần tử hai ma trận vuông cấp n A B Đọc lại tệp tin ”MT.txt” cho hai ma trận A, B Tính ma trận tích C=A*B, sau ghi bổ sung ma trận C vào tệp tin Đọc laị ma trận A, B C từ file ”MT.txt” in hình Viết chương trình đọc chương trình nguồn C Xóa tất lời thích Ghi lại vào chương trình Viết chương trình đếm số từ tệp văn Viết chương trình đếm số từ khác tệp văn (không phân biệt chữ hoa/chữ thường) 10 Viết chương trình tệp văn In hình bảng tần số xuất từ khác (không phân biệt chữ hoa/chữ thường) _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -97- _ Tài liệu tham khảo [1] Ngôn ngữ C, Nguyễn Hùng , Scitec, 1990 [2] C from A to Z [3] C++ Programming, The Peter Norton Computing Group, 1991 _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -98- _ Mục lục Chương 1.1 Thành phần – chương trình Giới thiệu 1.2 Các thành phần ngôn ngữ C 1.2.1 Từ khóa 1.2.2 Tên 1.2.3 Tên chuẩn 1.2.4 Hằng, biến, biểu thức 1.2.5 Dấu ngăn cách câu lệnh, khoảng trống 1.2.6 Lời thích 1.3 Kiểu liệu chuẩn 1.3.1 Kiểu kí tự - char 1.3.2 Kiểu số nguyên 1.3.3 Kiểu số thực 1.3.4 Ép kiểu 1.4 Các phép toán 1.4.1 Các phép toán số nguyên 1.4.2 Các phép toán số thực 1.4.3 Các phép toán so sánh 1.4.4 Các phép toán logic 1.4.5 Các phép toán bit 1.5 Cấu trúc chương trình khai báo 1.5.1 Khái niệm hàm 1.5.2 Cấu trúc chương trình 1.5.3 Các khai báo 1.6 Quy tắc viết chương trình 1.7 Phép gán Câu hỏi tập chương 11 Chương Lệnh nhập xuất 13 2.1 Lệnh printf 13 2.2 Lệnh scanf 15 _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -99- _ 2.3 Một số tệp tiêu đề chuẩn 16 2.3.1 Tệp tiêu đề stdio.h 16 2.3.2 Tệp tiêu đề conio.h 16 2.3.3 Tệp tiêu đề stdlib.h 17 2.3.4 Tệp tiêu đề math.h 17 Chương Lệnh điều kiện 19 3.1 Lệnh if 19 3.2 Khối lệnh 20 3.3 Biểu thức “? :” (hay gọi toán tử điều kiện) 23 3.4 Lệnh switch case 23 Chương Lệnh vòng lặp 27 4.1 Vòng lặp for 27 4.2 Vòng lặp while 30 4.3 Vòng lặp while 31 4.4 Lệnh break lệnh continue 33 4.4.1 Lệnh break 33 4.4.2 Lệnh continue 34 Chương Hàm 38 5.1 Giới thiệu 38 5.2 Định nghĩa hàm 39 5.3 Cách gọi hàm 40 5.4 Biến cục bộ, biến toàn cục 41 5.4.1 Định nghĩa 41 5.4.2 Biến cục tự động biến cục tĩnh 43 5.5 Tham số trỏ 44 5.5.1 Địa trỏ 45 5.5.2 Hàm có tham số trỏ 46 5.6 Hàm đệ quy 48 Câu hỏi tập chương 51 Chương 6.1 Kiểu mảng 53 Mảng chiều 53 _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -100- _ 6.1.1 Khai báo mảng 53 6.1.2 Truy xuất phần tử mảng 54 6.1.3 Khởi tạo mảng 55 6.2 Từ khóa typedef 56 6.3 Mảng tham số hàm 57 6.4 Sắp xếp mảng 58 6.4.1 Sắp xếp chọn 58 6.4.2 Sắp xếp bọt 59 6.4.3 Sắp xếp nhanh (quick-sort) 60 6.5 Tìm kiếm phần tử mảng 61 6.5.1 Tìm kiếm 61 6.5.2 Tìm kiếm nhị phân 61 6.6 Mảng nhiều chiều 62 6.6.1 Khai báo mảng chiều 62 6.6.2 Truy xuất mảng chiều 62 Chương Chuỗi kí tự 68 7.1 Khai báo khởi gán 68 7.1.1 Khai báo 68 7.1.2 Khởi gán 68 7.1.3 Truy cập phần tử chuỗi kí tự 69 7.2 Một số hàm xử lý chuỗi kí tự (trong string.h) 69 7.3 Một số hàm chuyển đổi chuỗi số (trong stdlib.h) 74 7.4 Một số hàm kiểm tra kí tự (trong ctype.h) 76 7.5 Mảng chuỗi kí tự 77 Chương Kiểu cấu trúc kiểu hợp 81 8.1 Kiểu cấu trúc 81 8.1.1 Khái niệm định nghĩa kiểu cấu trúc 81 8.1.2 Mô tả khai báo kiểu cấu trúc 81 8.1.3 Khai báo cấu trúc lồng 82 8.1.4 Truy cập phần tử cấu trúc 83 8.1.5 Gán cấu trúc 83 8.1.6 Mảng cấu trúc 84 8.1.7 Con trỏ cấu trúc 84 8.1.8 Hàm sử dụng cấu trúc 84 _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt Bài giảng Lập trình C -101- _ 8.2 Kiểu hợp 86 Chương 9.1 Kiểu tệp tin 90 Giới thiệu 90 9.2 Các thao tác lên tệp 90 9.2.1 Khai báo biến tập tin 91 9.2.2 Mở tập tin 91 9.3 Đóng tệp 92 9.4 Đọc ghi kí tự tệp 92 9.4.1 Đọc kí tự 92 9.4.2 Ghi kí tự 93 9.5 Đọc ghi dòng tệp 93 9.5.1 Đọc dòng 93 9.5.2 Ghi dòng 94 9.6 Một số hàm khác 95 _ GV: Phan Thanh Tao CuuDuongThanCong.com -2016https://fb.com/tailieudientucntt ... chương trình giải phương trình bậc (ax2 + bx + c = 0, a0) Viết chương trình giải phương trình bậc bốn trùng phương (ax4 + bx2 + c = 0, a0) Có đếm số nghiệm khác phương trình Viết chương trình giải. .. 1.5.2 Cấu trúc chương trình Một chương trình C thường có cấu trúc sau: #include < > /* Gọi tệp tiêu đề chương trình */ #define /* Khai báo số hay gọi macro*/ typedef /* Định nghĩa kiểu liệu */... giá trị -128 127 255 Kích thước byte byte byte byte Miền giá trị -32768 32767 65535 -2 147 483 648 2 147 483 647 42 949 67295 Từ khóa short dùng mặc định int short int Với kiểu số ngun mặc định số ngun