CHƯƠNG1 Biến, hằng, biểu thức, câu lệnh BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG BÀI GIẢNG TIN HỌC CƠ SỞ 2 Hà Nội – Năm 2020 BÀI GIẢNG TIN HỌC CƠ SỞ 2.
BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG BÀI GIẢNG TIN HỌC CƠ SỞ Hà Nội – Năm 2020 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 MỤC LỤC GIỚI THIỆU CHUNG 1.1 Ngôn ngữ lập trình 1.2 Thuật toán (Algorithm) 1.3 Sự đời phát triển ngôn ngữ C MỘT SỐ KIẾN THỨC CƠ SỞ 10 2.1 Bộ kí tự, từ khóa,tên 10 2.1.1 Bộ kí tự C 10 2.1.2 Các từ khoá (Keywords) 10 2.1.3 Tên cách đặt tên 10 2.1.4 Lời giải thích 11 2.2 Cấu trúc chương trình C 11 2.2.1 Cấu trúc tổng quát chương trình C 11 2.2.2 Chương trình đơn giản C 11 2.3 Các kiểu liệu sở 13 2.4 Biến,hằng, câu lệnh phép toán 14 2.4.1 Biến 14 2.4.2 Câu lệnh 16 2.4.3 Các phép toán 16 2.5 Thủ tục vào chuẩn 21 2.5.1 Vào ra getchar(), putchar() 21 2.5.2 In theo khuôn dạng - Printf 22 2.5.3 Nhập vào có khn dạng - scanf 23 2.5.4 Thâm nhập vào thư viện chuẩn 26 CÁC CẤU TRÚC LỆNH ĐIỀU KHIỂN 30 3.1 Câu lệnh khối 30 3.2 Cấu trúc lệnh if 30 3.3 Cấu trúc lệnh switch 32 3.4 Vòng lặp for 33 3.5 Vịng lặp khơng xác định while Cú pháp: 36 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 3.6 Vịng lặp khơng xác định while Cú pháp: 38 3.7 Lệnh break lệnh Continue 39 HÀM VÀ PHẠM VI HOẠT ĐỘNG CỦA BIẾN 56 4.1 Tính chất hàm 56 4.2 Khai báo, thiết kế hàm 57 4.3 Phương pháp truyền tham biến cho hàm 59 4.4 Biến địa phương, biến toàn cục 61 4.5 Tính đệ qui hàm 65 CẤU TRÚC DỮ LIỆU KIỂU MẢNG (Array) 68 5.1 Khái niệm mảng 68 5.2 Các thao tác mảng 72 5.3 Mảng đối hàm 74 5.4 Xâu kí tự (string) 78 5.5 Kiểu liệu Con trỏ 85 5.5.1 Con trỏ địa 85 5.5.2Con trỏ đối hàm 87 5.5.3 Con trỏ mảng 88 5.5.4 Cấp phát nhớ cho trỏ 92 5.6 Mảng trỏ 107 5.7 Đối hàm main() 109 5.8 Con trỏ hàm 111 DỮ LIỆU KIỂU TỆP (FILE) 126 6.1 Thâm nhập vào thư viện chuẩn 126 6.2 Thâm nhập tệp 130 6.3 Xử lý lỗi - Stderr Exit 133 6.4 Đưa vào đưa dòng 135 6.5 Đọc ghi file fscanf, fprintf 136 6.6 Một số hàm thông dụng khác 140 CẤU TRÚC (STRUCT) 144 7.1 Định nghĩa cấu trúc 144 7.2 Khai báo sử dụng cấu trúc 145 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 7.2.1 Sử dụng từ khóa typedef làm việc với cấu trúc 146 7.2.2 Truy cập vào thành phần cấu trúc: 146 7.3 Cấu trúc hàm 147 7.4 Cấu trúc lồng 149 7.5 Cấu trúc trỏ 150 7.6 Cấu trúc file 152 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 MỞ ĐẦU Tin học sở môn học quan trọng chương trình giáo dục đại cương bậc đại học, môn bắt buộc tất sinh viên Học Viện CNBCVT Tài liệu nhằm cung cấp cho sinh viên kiến thức tổng quan ngơn ngữ lập trình C Qua sinh viên nắm khái niệm lập trình thiết lập số chương trình đơn giản phục vụ cho khoa học kĩ thuật đặc biệt làm công cụ để phục vụ cho môn học tin học viễn thông mà em học Chúng biên soạn giảng cho tất sinh viên ngành kỹ thuật bậc đại học với mục đích giúp cho sinh viên có tài liệu học cần thiết cho môn học để đáp ứng nhu cầu ngày cao tư liệu dạy học tin học BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 GIỚI THIỆU CHUNG 1.1 Ngơn ngữ lập trình Trong phần “Tin học sở 1” tìm hiểu Winword Excel, phần mềm ứng dụng công việc soạn thảo văn làm bảng tính toán Đặc điểm phần mềm ứng dụng định rõ phạm vi ứng dụng cung cấp nhiều tốt cơng cụ để hồn thành chức Tuy nhiên người sử dụng bị bó buộc phạm vi quy định phần mềm Chẳng hạn ta khó dùng Excel để giải tốn gồm nhiều bước tính tốn tính nghiệm gần phương trình vi phân hay giải hệ phương trình tuyến tính Mặc dầu phần mềm ứng dụng ngày nhiều thuộc đủ lĩnh vực xây dựng, thiết kế, hội họa, âm nhạc bao trùm hết vấn đề nẩy sinh thực tế vô phong phú Rõ ràng chuyên gia tin học mà người sử dụng, cán kỹ thuật, cần đến phần mềm uyển chuyển mềm dẻo hơn, có khả thực nhiều thị người sử dụng để giúp họ giải công việc đa dạng máy tính Phần mềm có tính chất gọi ngơn ngữ lập trình Chính xác ngơn ngữ lập trình ngơn ngữ nhân tạo bao gồm tập từ vựng (mà ta gọi từ khóa để phân biệt với ngôn ngữ thông thường) tập quy tắc (gọi Syntax - cú pháp) mà ta sử dụng để biên soạn lệnh cho máy tính thực Như ta biết, ô nhớ máy tính biểu diễn số Vì ngơn ngữ mà máy hiểu trực tiếp ngơn ngữ lệnh dãy số nhị phân gọi ngôn ngữ máy (machine language) Mọi ngôn ngữ khác phải thông dịch biên dịch sang ngôn ngữ máy (Interpreter - thông dịch cho chạy lệnh Compiler - biên dịch thành chương trình ngơn ngữ máy hồn chỉnh, chạy nhanh thơng dịch) Có nhiều loại ngơn ngữ lập trình, hầu hết nhà khoa học máy tính cho khơng có ngơn ngữ độc có đủ khả phục vụ cho yêu cầu tất lập trình viên Theo truyền thống, ngơn ngữ lập trình phân làm loại: ngôn ngữ bậc thấp ngôn ngữ bậc cao Ngơn ngữ lập trình bậc thấp (low-level programming language): Ngơn ngữ máy, hợp ngữ (assembler: chương trình dịch hợp ngữ, assembly language: ngôn ngữ hợp ngữ) Hợp ngữ ngôn ngữ lập trình bậc thấp từ ngơn ngữ BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 máy Nó khác với ngơn ngữ máy việc sử dụng mã biểu thị chức mà máy thực Lập trình hợp ngữ phiền tối: có đến vài tá dịng mã cần thiết để thực phép cộng số Các chương trình hợp ngữ khó viết; chúng khơng có cấu trúc modun hóa rõ ràng Chương trình hợp ngữ khơng dễ chuyển từ loại máy tính sang loại máy tính khác Các chương trình viết theo tập lệnh đặc thù loại vi xử lý định Lập trình hợp ngữ mã gọn chạy nhanh Do hầu hết chương trình điều hành hệ thống viết hợp ngữ Tuy nhiên phức tạp công việc lập trình nên hãng sản xuất phần mềm chun dụng thích viết chương trình ngơn ngữ C (do Bell Laboratories hãng AT&T xây dựng) loại ngôn ngữ kết hợp cấu trúc ngôn ngữ bậc cao đại với tốc độ tính hiệu hợp ngữ cách cho phép nhúng lệnh hợp ngữ vào chương trình Ngơn ngữ lập trình bậc cao: Các ngơn ngữ lập trình bậc cao Basic, Pascal, C, C++ cho phép lập trình viên diễn đạt chương trình từ khóa câu lệnh gần giống với ngơn ngữ tự nhiên Các ngôn ngữ dược gọi “bậc cao” chúng giải phóng lập trình viên khỏi quan tâm lệnh máy tính tiến hành nào, phận thông dịch biên dịch chương trình giải chi tiết mã nguồn biến đổi thành ngôn ngữ máy Một câu lệnh ngôn ngữ bậc cao tương ứng với số lệnh ngôn ngữ máy, bạn thảo chương theo ngơn ngữ bậc cao nhanh so với bậc thấp Tuy nhiên bạn phải trả giá cho việc Chương trình ngơn ngữ máy dịch từ mã nguồn viết ngôn ngữ bậc cao chứa nhiều chi tiết thừa, tốc độ chạy chậm nhiều so với chương trình viết hợp ngữ Thơng thường trình biên dịch đặc trưng thường sinh số lệnh mã máy gấp lần hay nhiều số lệnh cần thiết viết mã máy Một cách phân loại khác ngơn ngữ lập trình: Ngơn ngữ thủ tục (Procedural Language) ngôn ngữ khai báo (Declarative Language) Ngơn ngữ thủ tục: Lập trình viên phải xác định thủ tục mà máy tính tuân theo để hồn thành cơng việc định trước Thí dụ: Basic, C, Fortran, Ngôn ngữ khai báo: Ngôn ngữ định nghĩa loạt yếu tố quan hệ, đồng thời cho phép bạn tiến hành xếp hàng kết xác định Thí dụ: Prolog, SQL (Structured Query Language) BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 Điều then chốt việc lập trình chun dụng mơdun hóa ngơn ngữ - phát triển cho nhiệm vụ lập trình phân phối cho thành viên nhóm lập trình, kết đạt phận khác hoạt động phù hợp với nhiệm vụ người hồn thành Ngơn ngữ lập trình mơdun, Module-2 ngôn ngữ hướng đối tượng C++, cho phép lập trình viên tập trung vào việc lập mã, biên dịch gỡ rối module chương trình riêng biệt, đồng thời cho chạy (kiểm tra thử) riêng module Khi module riêng chạy tốt chúng liên kết với mà không gây trục trặc 1.2 Thuật toán (Algorithm) Thuật ngữ Algorithm dịch tiếng Việt thuật toán, thuật giải giải thuật Ở dùng từ thuật toán cách gọi quen thuộc với nhiều người Thuật toán dãy hữu hạn bước, bước mơ tả xác phép toán hành động cần thực hiện, để giải vấn đề Để hiểu đầy đủ ý nghĩa khái niệm thuật toán, nêu đặc trưng sau thuật toán: Input Mỗi thuật tốn thường có số liệu vào Output Mỗi thuật tốn thường có số liệu Tính xác định (Definiteness) Mỗi bước mơ tả xác, có cách hiểu đủ đơn giản để thực Tính dừng (Finiteness) Thuật toán phải dừng sau số hữu hạn bước thực Tính hiệu (Effectiveness) Các phép tốn bước phải đủ đơn giản để thực Tính tổng qt (Generalness) Thuật tốn phải có tính tổng qt, áp dụng cho lớp đối tượng Ví dụ: Thuật tốn Euclid: Tìm ước số chung lớn hai số tự nhiên m,n Input: m,n nguyên dương Output: g ước số chung lớn m n Phương pháp: r:= m mod n BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 Nếu r=0 g:=n Ngược lại (r>0) m:=n; n:=r quay lại bước 1.3 Sự đời phát triển ngôn ngữ C Năm 1970 Ken Thompson sáng tạo ngôn ngữ B dùng môi trường hệ điều hành UNIX máy điện toán DEC PD-7 B chữ tắt BCPL (Basic Combined Progamming Language) Martin Richards viết Năm 1972 Dennis Ritchie hãng Bell Laboratories (và Ken Thompson) sáng tạo nên ngôn ngữ C nhằm tăng hiệu cho ngôn ngữ B Lúc đầu ngôn ngữ C không người ưa dùng Nhưng sau D.Ritchie cho xuất "The C Programming Language" (“Ngơn ngữ lập trình C”) ngơn ngữ C ý sử dụng rộng rãi Người ta dùng C để viết hệ điều hành đa nhiệm UNIX, O/S ngôn ngữ Dbase C cải tiến qua nhiều phiên bản: trình biên dịch Turbo C từ phiên đến phiên 5, Microsoft C từ phiên đến phiên Hiện nay, C lại phát triển để thành C++ với trình biên dịch: Borland C++, Visual C++ Turbo C++ Mặc dù có nhiều ngơn ngữ lập trình mới, C ngơn ngữ lập trình ưa chuộng C ứng dụng để viết phần mềm nhiều lĩnh vực, đặc biệt khoa học kỹ thuật BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 MỘT SỐ KIẾN THỨC CƠ SỞ 2.1 Bộ kí tự, từ khóa,tên 2.1.1 Bợ kí tự C Mọi ngôn ngữ xây dựng kí tự (các chữ, kí hiệu) Đối với ngơn ngữ C sử dụng kí tự sau: Tập chữ in hoa: A, B, C, D, , Z Tập chữ in thường: a, b, c, d, , z Tập chữ số: 0, 1, 2, 3, , Các dấu chấm câu: , ; : / ? [ ] { } ! @ # $ ^ & * ( ) + = - < > " Các kí tự khơng nhìn thấy: dấu trống (Space), dấu Tab, dấu xuống dòng (Enter), Dấu gạch _ 2.1.2 Các từ khoá (Keywords) Từ khoá tập từ dùng riêng ngơn ngữ, từ khố mang theo ý nghĩa tác dụng riêng Từ khố khơng thể định nghĩa lại khơng thể lấy từ khố đặt tên cho đối tượng Dưới bảng liệt kê từ khố thơng dụng C auto break base char continue default double else extern float for goto if int long register short sizeof static struct switch typedef union unsigned void public while volatile return 2.1.3 Tên và cách đặt tên Tên hay gọi định danh (identifier) dùng để gọi biến, hàm Đối với ngôn ngữ C, tên phải khai báo trước sử dụng Tên dãy kí tự liền gồm chữ cái, a z, A Z, chữ số dấu gạch (dấu gạch thường dùng để liên kết thành phần tên) Tuy nhiên, tên không bắt đầu chữ số không chứa kí tự đặc biệt dấu cách, dấu tab dấu chấm câu Khơng lấy từ khố C để đặt tên cho đối tượng Ví dụ cách đặt tên đúng: Delta, E_Mu_X, Function1 Ví dụ cách đặt tên sai: 2Delta: bắt đầu kí tự số 10 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 Gọi hệ thống Hàm system(s) thực thị lệnh chứa xâu kí tự s quay lại thực chương trình Nội dung s phụ thuộc chặt chẽ vào hệ điều hành cục Ví dụ system(“date”) cho chương trình date chạy; in ngày tháng đợi nhận ngày tháng Quản lý bộ nhớ Hàm calloc giống với hàm malloc mà ta dùng chương trước calloc(n, sizeof(đối tượng)) cho trỏ tới vùng không gian đủ lớn để lưu trữ n đối tượng có kích thước xác định, cho NULL yêu cầu không thoả mãn Phần nhớ khởi đầu giá trị Con trỏ có xếp thẳng nhớ cho đối tượng xét phải tạo sắc thái cho theo kiểu thích hợp, char *calloc(); int *ip; ip = (int*) calloc(n, sizeof(int)); free(p) giải phóng khơng gian trỏ p, với ban đầu có nhờ lời gọi tới calloc Khơng có hạn chế trật tự thực việc giải phóng khơng gian bị lỗi nặng giải phóng khơng gian khơng tạo calloc Hàm findfirst, findnext tìm file file thư mục qua đường dẫn Hàm trả lại giá trị việc tìm kiếm thành cơng trả lại giá trị gặp lỗi int findfirst(const char *pathname, struct ffblk *ffblk, int attrib); int findnext(struct ffblk *ffblk); char * pathname : đường dẫn tới thư mục tại, pathname chấp nhận kí tự *, ? thay cho xâu kí tự kí tự Cấu trúc ffblk gọi cấu trúc điều khiển thông tin file DOS đuợc định nghĩa DIR.H struct ffblk { char ff_reserved[21]; char ff_attrib; 141 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 unsigned ff_ftime; unsigned ff_fdate; long ff_fsize; char ff_name[13]; }; int attrib; thuộc tính file bao gồm: FA_RDONLY : Read-only attribute FA_HIDDEN : Hidden file FA_SYSTEM : System file FA_LABEL : Volume label FA_DIREC : Directory FA_ARCH : Archive Ví dụ 6.7: Hiển thị tên tất file đĩa thư mục #include #include int main() { struct ffblk ffblk1; int done; printf("Directory listing of *.*\n"); done = findfirst("*.c",&ffblk1,0); while (!done){ printf(" %s %u\n", ffblk1.ff_name,ffblk1.ff_fdate); done = findnext(&ffblk1); } return 0; } Hàm fseek: Truy nhập trực tiếp file liệu nhị phân fseek ( FILE *fp, long offset, int whence); FILE *fp : trỏ file 142 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 long offset: kích cỡ tính theo byte cần chuyển tới int whence số nguyên định nghĩa sau: SEEK_SET = : di chuyển từ vị trí bắt đầu đầu tệp SEEK_CUR = : di chuyển từ vị trí bắt đầu vị trí SEEK_END = : di chuyển từ vị trí bắt đầu cuối tệp Hàm frewin( FILE *fp) : Đặt trỏ vị trí đầu tệp Hàm ferror(FILE *fp): Xác định xem thao tác file có gặp lỗi hay khơng Hàm remove (char *filename): Xố file qua đường dẫn Hàm rename(char *oldname, char *newname): Đổi tên file cũ thành tên file Hàm mkdir(char *path): Tạo lập thư mục qua đường dẫn Hàm rmdir( char *path): Loại bỏ thư mục qua đường dẫn Hàm chdir(char *path): Thay đổi thư mục Hàm getcurdir(int driver, char *dir): Nhận thư mục ổ đĩa 143 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 CẤU TRÚC (STRUCT) 7.1 Định nghĩa cấu trúc Cấu trúc tập hợp biến có kiểu liệu khác nhau, đặt tên nhằm xử lý tốt Ví dụ: Bạn muốn lưu trữ thông tin sách bao gồm tên sách, số trang tên tác giả Bạn tạo thông tin cách riêng biệt cách tiếp cận tốt thu thập thơng tin tên tất thông tin mô tả sách Tương tự hàm, tập hợp lệnh đơn để xử lý tác vụ sau định nghĩa, sử dụng hàm lệnh đơn Cấu trúc C tập hợp biến để mô tả thông tin đối tượng sau định nghĩa, sử dụng cấu trúc kiểu liệu sở Trong C, từ khóa struct sử dụng để định nghĩa, tạo cấu trúc Cú pháp định nghĩa cấu trúc: struct structure_name { data_type member1; data_type member2; data_type memeber; }; Chúng ta định nghĩa cấu trúc cho người mô tả sau: struct book { short id; char name[50]; int page; }; Kết khai báo kiểu liệu dẫn xuất cấu trúc person Lưu ý rằng: 144 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 - Một kiểu liệu cấu trúc thường khai báo đầu chương trình, trước hàm main() tệp Sau đó, biến kiểu cấu trúc khai báo sử dụng chương trình - Khi bạn định nghĩa cấu trúc, câu lệnh đơn giản cho trình biên dịch C biết kiểu liệu cấu trúc mà không thực việc cấp phát nhớ cho cấu trúc Chỉ biến cấu trúc khai báo, việc cấp phát nhớ diễn 7.2 Khai báo sử dụng cấu trúc Sau định nghĩa cấu trúc, khai báo sử dụng biến cấu trúc kiểu liệu sở Đoạn mã nguồn định nghĩa cấu trúc book: struct book { short id; char name[50]; int page; }; Và đoạn mã nguồn hàm main(): struct book b1, b2, b[20]; Một cách khác để tạo biến cấu trúc sau: struct book { short id; char name[50]; int page; } b1, b2, b[20]; Kết hai trường hợp trên, 02 biến b1, b2 mảng b có 20 phần tử kiểu cấu trúc book khai báo 145 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 7.2.1 Sử dụng từ khóa typedef làm việc với cấu trúc Trong ngơn ngữ lập trình C, mặc định khai báo biến kiểu cấu trúc bắt buộc phải thêm từ khóa struct để cho trình biên dịch biết biến kiểu liệu cấu trúc Trường hợp muốn rút gọn từ khóa struct khai báo biến cấu trúc, sử dụng kết hợp từ khóa typedef định nghĩa cấu trúc Đoạn mã nguồn định nghĩa cấu trúc book: typedef struct book { short id; char name[50]; int page; } books; Hoặc rút gọn: typedef struct { short id; char name[50]; int page; } books; Sau kết hợp từ khóa typedef định nghĩa, khai báo biến cấu trúc mà khơng cần thêm từ khóa struct trước tên biến Đoạn mã nguồn hàm main(): book b1, b2, b[20]; 7.2.2 Truy cập vào thành phần cấu trúc: Có 02 kiểu tốn tử sử dụng để truy cập vào thành phần biến cấu trúc, cụ thể: - Nếu biến cấu trúc biến thường, sử dụng toán tử chấm ( ) - Nếu biến cấu trúc biến trỏ, sử dụng tốn tử trỏ (->) Ví dụ 7.1: #include typedef struct { // định nghĩa (def) 146 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 int id; char name[15]; short page; } book; // rút gọn typedef + struct int main() { // book b = {10, "thcs2 ptit", 100}; // khai báo khởi tạo book b; // khai báo biến thường b.id = 10; strcpy(b.name, "thcs1 ptit"); b.page = 100; printf("b {id: %d, name: %s, page: %d}\n", b.id, b.name, b.page); book *pb; // khai báo biến trỏ pb = (book*)malloc(sizeof(book)); // cấp phát nhớ cho cấu trúc book pb->id = 11; strcpy(pb->name, "thcs2 ptit"); pb->page = 101; printf("pb {id: %d, name: %s, page: %d}\n" , pb->id, pb->name, pb->page); return 0; } 7.3 Cấu trúc hàm Trong C, tương tự kiểu liệu nguyên thủy, kiểu liệu dẫn xuất cấu trúc truyền tham số hàm theo hai cách: - Truyền giá trị 147 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 Một cấu trúc truyền tham số hàm biến thơng thường, hay nói cách khác truyền giá trị Nếu cấu trúc truyền theo giá trị, thay đổi thực biến cấu trúc hàm gọi không ảnh hưởng tới biến cấu trúc ban đầu hàm gọi - Truyền địa Truyền địa nghĩa vị trí địa biến cấu trúc truyền làm tham số cho hàm Nếu cấu trúc truyền theo địa chỉ, thay đổi thực biến cấu trúc hàm gọi ảnh hưởng tới biến cấu trúc đầu hàm gọi Đoạn mã nguồn thực việc nhập hiển thị thông tin sách, đó: - Hàm input có truyền biến cấu trúc theo kiểu truyền địa - Hàm output có truyền biến cấu trúc theo kiểu truyền giá trị #include #include #define max 100 typedef struct { short id; char name[max]; char author[max]; } book; void input(book *b)// truyền địa { scanf("%d\n", &b->id); gets(b->name); gets(b->author); } void output(book b) // truyền giá trị { printf("book {%d, %s, %s}", b.id, b.name, b.author); } 148 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 int main() { book b; input(&b); output(b); return 0; } 7.4 Cấu trúc lồng Một cấu trúc chứa cấu trúc khác thành phần Sau việc truy cập thành phần cấu trúc nằm cấu trúc khác tương tự việc truy cập thành phần trúc trình bày Sử dụng đoạn mã nguồn phần 7.3 với yêu cầu thông tin tác giả gồm: tên tác giả tuổi Để giải yêu cầu, định nghĩa cấu trúc tác giả nằm cấu trúc sách #include #include #define max 100 typedef struct { char name[max]; short age; } author; typedef struct { short id; char name[max]; author book_author; // kiểu liệu author } book; void input(book *b) { scanf("%d\n", &b->id); 149 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 gets(b->name); gets(b->book_author.name); scanf("%d", &b->book_author.age); } void output(book b) { printf("book {%d, %s}\n", b.id, b.name); printf(" + author {%s, %d}", b.book_author.name, b.book_author.age); } int main() { book b; input(&b); output(b); return 0; } 7.5 Cấu trúc trỏ Tương tự mảng, thành phần cấu trúc cấp phát vùng nhớ liền kề nhớ Như vậy, định nghĩa biến trỏ kiểu liệu cấu trúc thực việc cấp phát động vùng nhớ tùy theo số cấu trúc sử dụng Quay trở lại với đoạn mã nguồn ví dụ phần 7.4, chương trình đáp ứng sách có tác giả Nếu yêu cầu sách có nhiều tác giả chương trình không đáp ứng Để giải triệt để toán này, sử dụng biến trỏ thực cấp phát động nhớ Đoạn mã nguồn thay đổi để thực việc cấp phát nhớ sử dụng hàm malloc() sau: #include 150 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 #include #define max 100 typedef struct { char name[max]; int age; } author; typedef struct { short id; char name[max]; int NoOfAuthor; author *book_author; }book; void input(book *b){ scanf("%d\n", &b->id); // id gets(b->name); // name scanf("%d", &b->NoOfAuthor); b->book_author = (author*)malloc(b->NoOfAuthor * sizeof(author)); for(int i = 0; i < b->NoOfAuthor; i++) { gets((b->book_author+i)->name); gets((b->book_author+i)->name); scanf("%d", &(b->book_author+i)->age); } } void output(book b){ printf("book {id: %d, name: %s}\n", b.id, b.name); for(int i = 0; i < b.NoOfAuthor; i++) printf("\t + author: %s %d\n" , (b.book_author + i)>name,(b.book_author + i)->age); 151 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 } int main() { /*viết chương trình nhập tt sách in ra*/ book b; input(&b); output(b); return 0; } 7.6 Cấu trúc file Sau định nghĩa, kiểu liệu cấu trúc có kích thước xác định thành phần cấu trúc cấp phát vùng nhớ liền kề nhớ khai báo Dựa vào đặc điểm này, việc đọc ghi cấu trúc vào file thường thực theo kích thước thành phần tồn cấu trúc Chúng ta dùng hàm fread(), frwite() thư viện chuẩn C để đọc ghi block thông tin file Cụ thể: size_t fread (void *ptr, size_t size, size_t n, FILE *fp); fread() đọc vào trỏ ptr n phần tử phần tử có kích cỡ n byte từ tệp trỏ trỏ file fp, hàm trả lại số phần tử size_t thực đọc size_t fwrite (void *ptr, size_t size, size_t n, FILE *fp); fwrite() ghi n phần tử kích cỡ phần tử size byte từ trỏ ptr vào tệp trỏ trỏ file fp Trong đoạn mã nguồn đây, thực thao tác đọc, ghi tìm kiếm thơng tin sách vào file #include #define max 100 typedef struct { short id; char name[max]; 152 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 } book; FILE *fptr; book b; const int size = sizeof(book); void nhap() { scanf("%d\n", &b.id); gets(b.name); fptr = fopen("ex3.bin","ab"); fwrite(&b, sizeof(book), 1, fptr); fclose(fptr); } void xuat() { fptr = fopen("ex3.bin","rb"); while(fread(&b, sizeof(book), 1, fptr)==1) { printf("%d, %s\n", b.id,b.name); } fclose(fptr); } void capnhat() { book temp; scanf("%d\n", &temp.id); gets(temp.name); fptr = fopen("ex3.bin","rb+"); while(fread(&b, sizeof(book), 1, fptr)==1) { if(temp.id == b.id) { 153 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 fseek(fptr, -size, SEEK_CUR); fwrite(&temp,sizeof(book), 1, fptr); break; } } fclose(fptr); } int main() { char c; do{ c = getchar(); switch(c) { case '1': nhap(); break; case '2': capnhat(); break; case '3': xuat(); break; default: break; } }while(c!='4'); return 0; } 154 BÀI GIẢNG TIN HỌC CƠ SỞ – KHOA CNTT1 TÀI LIỆU THAM KHẢO [1] Phạm Văn Ất, Kỹ thuật lập trình C, Nhà xuất KHKT [2] Qch Tuấn Ngọc, Ngơn ngữ lập tình C, NXB Thống kê, 2003 [3] Đỗ Xuân Lôi, Cấu trúc liệu giải thuật, NXB KHKT, 1994 [4] Nguyễn Duy Phương, Kỹ thuật lập trình, Giáo trình giảng dạy Học viện CN-BCVT [5] Brian Kerninghan, Denis Ritche, C Language Norm ANSI Prentice Hall, 1988 [6] Bryon Gottfried, Programming With C McGraw Hill, 1996 [7] Carl Townsend, Understanding C SAMS, 1989 [8] Paul Davies, The Inspensable Guide to C Addision Wisley, 1996 [9] Nikolus L.R Wirth, Program = Data Structure + Algorithms Prentice Hall, 1992 155