Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C Giáo trình NGÔN NGỮ LẬP TRÌNH C PHẦN 2 Lập trình căn bản PHẦN 2 GIỚI THIỆU VỀ MỘT NGÔN NGỮ LẬP TRÌNH NGÔN NGỮ LẬP TRÌNH C Chương 1 GIỚI THIỆU VỀ NGÔN NGỮ C MÔI TRƯỜNG TURBO C 3 0 Học xong chương này, sinh viên sẽ nắm được các vấn.
Lập trình PHẦN GIỚI THIỆU VỀ MỘT NGƠN NGỮ LẬP TRÌNH NGƠN NGỮ LẬP TRÌNH C Chương GIỚI THIỆU VỀ NGÔN NGỮ C & MÔI TRƯỜNG TURBO C 3.0 Học xong chương này, sinh viên nắm vấn đề sau: - Tổng quan ngơn ngữ lập trình C - Mơi trường làm việc cách sử dụng Turbo C 3.0 I TỔNG QUAN VỀ NGƠN NGỮ LẬP TRÌNH C C ngơn ngữ lập trình cấp cao, sử dụng phổ biến để lập trình hệ thống với Assembler phát triển ứng dụng Vào năm cuối thập kỷ 60 đầu thập kỷ 70 kỷ XX, Dennish Ritchie (làm việc phịng thí nghiệm Bell) phát triển ngơn ngữ lập trình C dựa ngơn ngữ BCPL (do Martin Richards đưa vào năm 1967) ngôn ngữ B (do Ken Thompson phát triển từ ngôn ngữ BCPL vào năm 1970 viết hệ điều hành UNIX máy PDP-7) cài đặt lần hệ điều hành UNIX máy DEC PDP-11 Năm 1978, Dennish Ritchie B.W Kernighan cho xuất “Ngơn ngữ lập trình C” phổ biến rộng rãi đến Lúc ban đầu, C thiết kế nhằm lập trình mơi trường hệ điều hành Unix nhằm mục đích hỗ trợ cho cơng việc lập trình phức tạp Nhưng sau, với nhu cầu phát triển ngày tăng cơng việc lập trình, C vượt qua khn khổ phịng thí nghiệm Bell nhanh chóng hội nhập vào giới lập trình để cơng ty lập trình sử dụng cách rộng rãi Sau đó, cơng ty sản xuất phần mềm đưa phiên hỗ trợ cho việc lập trình ngơn ngữ C chuẩn ANSI C khai sinh từ Ngơn ngữ lập trình C ngơn ngữ lập trình hệ thống mạnh “mềm dẻo”, có thư viện gồm nhiều hàm (function) tạo sẵn Người lập trình tận dụng hàm để giải tốn mà khơng cần phải tạo Hơn nữa, ngôn ngữ C hỗ trợ nhiều phép toán nên phù hợp cho việc giải tốn kỹ thuật có nhiều cơng thức phức tạp Ngồi ra, C cho phép người lập trình tự định nghĩa thêm kiểu liệu trừu tượng khác Tuy nhiên, điều mà người vừa học lập trình C thường gặp “rắc rối” “hơi khó hiểu” “mềm dẻo” C Dù vậy, C phổ biến rộng rãi trở thành công cụ lập Trang 12 Lập trình trình mạnh, sử dụng ngôn ngữ lập trình chủ yếu việc xây dựng phần mềm Ngơn ngữ C có đặc điểm sau: o Tính đọng (compact): C có 32 từ khóa chuẩn 40 tốn tử chuẩn, hầu hết biểu diễn chuỗi ký tự ngắn gọn o Tính cấu trúc (structured): C có tập hợp thị lập trình cấu trúc lựa chọn, lặp… Từ chương trình viết C tổ chức rõ ràng, dễ hiểu o Tính tương thích (compatible): C có tiền xử lý thư viện chuẩn vô phong phú nên chuyển từ máy tính sang máy tính khác chương trình viết C hồn tồn tương thích o Tính linh động (flexible): C ngôn ngữ uyển chuyển cú pháp, chấp nhận nhiều cách thể hiện, thu gọn kích thước mã lệnh làm chương trình chạy nhanh o Biên dịch (compile): C cho phép biên dịch nhiều tập tin chương trình riêng rẽ thành tập tin đối tượng (object) liên kết (link) đối tượng lại với thành chương trình thực thi (executable) thống II MÔI TRƯỜNG LẬP TRÌNH TURBO C Turbo C mơi trường hỗ trợ lập trình C hãng Borland cung cấp Mơi trường cung cấp chức như: soạn thảo chương trình, dịch, thực thi chương trình… Phiên sử dụng Turbo C 3.0 II.1 Gọi Turbo C Chạy Turbo C giống chạy chương trình khác mơi trường DOS hay Windows, hình xuất menu Turbo C có dạng sau: Dòng gọi menu (menu bar) Mỗi mục menu lại có nhiều mục nằm menu kéo xuống Dòng ghi chức số phím đặc biệt Chẳng hạn gõ phím F1 ta có hệ thống trợ giúp mà ta tham khảo nhiều thơng tin bổ ích Trang 13 Lập trình Muốn vào menu ngang ta gõ phím F10 Sau dùng phím mũi tên qua trái phải để di chuyển vùng sáng tới mục cần chọn gõ phím Enter Trong menu kéo xuống ta lại dùng phím mũi tên lên xuống để di chuyển vùng sáng tới mục cần chọn gõ Enter Ta chọn mục menu cách giữ phím Alt gõ vào ký tự đại diện mục (ký tự có màu sắc khác với ký tự khác) Chẳng hạn để chọn mục File ta gõ Alt-F (F ký tự đại diện File) II.2 Soạn thảo chương trình Muốn soạn thảo chương trình ta chọn mục New menu File (File >New) Trên hình xuất vùng trống ta soạn thảo nội dung chương trình Trong trình soạn thảo chương trình ta sử dụng phím sau: Các phím xem thơng tin trợ giúp: - F1: Xem tồn thơng tin phần trợ giúp - Ctrl-F1: Trợ giúp theo ngữ cảnh (tức trỏ từ đo, chẳng hạn int mà bạn gõ phím Ctrl-F1 bạn có thơng tin kiểu liệu int) Các phím di chuyển trỏ vùng soạn thảo chương trình: Phím Ý nghĩa Phím tắt ( tổ hợp phím) Enter Đưa trỏ xuống dòng Mũi tên lên Đưa trỏ lên hàng trước Ctrl-E Mũi tên xuống Đưa trỏ xuống hàng sau Ctrl-X Mũi tên sang trái Đưa trỏ sang trái ký tự Ctrl-S Mũi tên sang phải Đưa trỏ sang phải ký tự Ctrl-D End Đưa trỏ đến cuối dòng Home Đưa trỏ đến đầu dòng PgUp Đưa trỏ lên trang trước Ctrl-R PgDn Đưa trỏ xuống trang sau Ctrl-C Đưa trỏ sang từ bên trái Ctrl-A Đưa trỏ sang từ bên phải Ctrl-F Các phím xố ký tự/ dịng: Phím Ý nghĩa Phím tắt Delete Xố ký tự ví trí trỏ Ctrl-G BackSpace Di chuyển sang trái đồng thời xoá ký tự đứng trước trỏ Ctrl-H Xố dịng chứa trỏ Ctrl-Y Xóa từ vị trí trỏ đến cuối dịng Ctrl-Q-Y Xóa ký tự bên phải trỏ Ctrl-T Các phím chèn ký tự/ dịng: Insert Thay đổi viết xen hay viết chồng Ctrl-N Xen dòng trống vào trước vị trí trỏ Sử dụng khối : Khối đoạn văn chương trình hình chữ nhật xác định đầu khối góc bên trái cuối khối góc bên phải hình chữ nhật Khi khối xác định (trên hình khối có màu sắc khác chỗ bình thường) ta có Trang 14 Lập trình thể chép khối, di chuyển khối, xoá khối Sử dụng khối cho phép soạn thảo chương trình cách nhanh chóng sau thao tác khối: Phím tắt Ý nghĩa Ctrl-K-B Đánh dấu đầu khối Ctrl-K-K Đánh dấu cuối khối Ctrl-K-C Chép khối vào sau vị trí trỏ Ctrl-K-V Chuyển khối tới sau vị trí trỏ Ctrl-K-Y Xố khối Ctrl-K-W Ghi khối vào đĩa tập tin Ctrl-K-R Đọc khối (tập tin) từ đĩa vào sau vị trí trỏ Ctrl-K-H Tắt/mở khối Ctrl-K-T Đánh dấu từ chứa chon trỏ Ctrl-K-P In khối Các phím, phím tắt thực thao tác khác: Phím Ý nghĩa Phím tắt Ctrl-K-D, F10 Kích hoạt menu Ctrl-K-Q F2 Lưu chương trình soạn vào đĩa Ctrl-K-S F3 Tạo tập tin Tab Di chuyển trỏ khoảng đồng thời đẩy dòng văn Ctrl-I ESC Hủy bỏ thao tác lệnh Ctrl-U Đóng tập tin Alt-F3 Hiện hộp thoại tìm kiếm Ctrl-Q-F Hiện hộp thoại tìm kiếm thay Ctrl-Q-A Tìm kiếm tiếp tục Ctrl-L Ví dụ: Bạn gõ đoạn chương trình sau: #include #include int main () { char ten[50]; printf(“Xin cho biet ten cua ban !”); scanf(“%s”,ten); printf(“Xin chao ban %s”,ten); getch(); return 0; } II.3 Ghi chương trình soạn thảo vào đĩa Sử dụng File/Save gõ phím F2 Có hai trường hợp xảy ra: - Nếu chương trình chưa ghi lần hội thoại xuất cho phép bạn xác định tên tập tin (FileName) Tên tập tin phải tuân thủ quy cách đặt tên DOS khơng cần có phần mở rộng (sẽ tự động có phần mở rộng C CPP nói thêm phần Option) Sau gõ phím Enter - Nếu chương trình ghi lần ghi thay đổi bổ sung lên tập tin chương trình cũ Trang 15 Lập trình Chú ý: Để đề phòng điện soạn thảo chương trinh bạn nên gõ phím F2 Quy tắc đặt tên tập tin DOS: Tên tập tin gồm phần: Phần tên phần mở rộng o Phần tên tập tin phải bắt đầu ký tự từ a z (không phân biệt hoa thường), theo sau ký tự từ a z, ký số từ hay dấu gạch (_), phần dài tối đa ký tự o Phần mở rộng: phần dài tối đa ký tự Ví dụ: Ghi chương trình vừa soạn thảo lên đĩa với tên CHAO.C II.4 Thực chương trình Để thực chương trình dùng Ctrl-F9 (giữ phím Ctrl gõ phím F9) Ví dụ: Thực chương trình vừa soạn thảo xong quan sát hình để thấy kết việc thực thi chương trình sau gõ phím để trở lại với Turbo II.5 Mở chương trình có đĩa Với chương trình có đĩa, ta mở để thực sửa chữa bổ sung Để mở chương trình ta dùng File/Open gõ phím F3 Sau gõ tên tập tin vào hộp File Name lựa chọn tập tin danh sách tập tin gõ Enter Ví dụ: Mở tập tin CHAO.C sau bổ sung để có chương trình sau: #include #include int main () { char ten[50]; printf(“Xin cho biet ten cua ban !”); scanf(“%s”,ten); printf(“Xin chao ban %s\n ”,ten); printf(“Chao mung ban den voi Ngon ngu lap trinh C”); getch(); return 0; } Ghi lại chương trình (F2) cho thực (Ctrl-F9) Hãy so sánh xem có khác trước? II.6 Thốt khỏi Turbo C trở DOS (hay Windows) Dùng File/Exit Alt-X II.7 Sử dụng số lệnh menu II.7.1 Các lệnh menu File (Alt -F) - Lệnh New : Dùng để tạo chương trình Tên ngầm định chương trình NONAMEXX.C (XX số từ 00 đến 99) - Lệnh Open : Dùng để mở chương trình có sẵn đĩa để sửa chữa, bổ sung để thực chương trình Trang 16 Lập trình Khi tập tin mở văn chương trình trình bày vùng soạn thảo; hộp thoại Open sau: Nơi nhập tên file Thư mực hành Trong trường hợp ta nhập vào tên tập tin chưa tồn chương trình tạo sau ta lưu trữ, chương trình lưu với tên - Lệnh Save : Dùng để lưu chương trình soạn thảo vào đĩa - Lệnh Save as : Dùng để lưu chương trình soạn thảo với tên khác, hộp thoại lưu tập tin soạn với tên khác sau: Tên (tên cũ) Tên ( kể tên thư mục) - Lệnh : Save All: Trong lúc làm việc với Turbo C, ta mở lúc nhiều chương trình để sửa chữa, bổ sung Lệnh Save All dùng để lưu lại thay đổi tất chương trình mở - Lệnh Change Dir : Dùng để đổi thư mục hành Trang 17 Lập trình Thư mục hành Chọn thư mục khác - Lệnh Print : Dùng để in chương trình soạn thảo máy in - Lệnh Printer Setup : Dùng để thiết đặt số thông số cho máy in - Lệnh Dos Shell : Dùng để thoát tạm thời Dos, để trở lại Turbo C ta đánh EXIT - Lệnh Exit : Dùng để thoát khỏi C II.7.2 Các lệnh menu Edit (Alt -E) - Lệnh Undo : Dùng để hủy bỏ thao tác soạn thảo cuối cửa số soạn thảo - Lệnh Redo : Dùng để phục hồi lại thao tác bị Undo cuối - Lệnh Cut : Dùng để xóa phần văn đánh dấu khối, phần liệu bị xóa lưu vào vùng nhớ đặc biệt gọi Clipboard - Lệnh Copy : Dùng để chép phần chương trình đánh dấu khối vào Clipboard - Lệnh Paste : Dùng để dán phần chương trình lưu Clipboard vào số soạn thảo, bắt đầu vị trí trỏ - Lệnh Clear : Dùng để xóa phần liệu đánh dấu khối, liệu bị xóa khơng lưu vào Clipboard - Lệnh Show clipboard : Dùng để hiển thị phần chương trình lưu Clipboard cửa sổ II.7.3 Các lệnh menu Search (Alt -S) - Lệnh Find : Dùng để tìm kiếm cụm từ văn chương trình Nếu tìm thấy trỏ di chuyển đến đoạn văn trùng với cụm từ cần tìm; hộp thoại Find sau: Trang 18 Lập trình Nhập cụm từ cần tìm vào Ý nghĩa lựa chọn hộp thoại sau: Case sentitive : Phân biệt chữ IN HOA với chữ in thường so sánh cụm từ cần tìm với văn chương trình Whole word only: Một đoạn văn chương trình trùng với tồn cụm từ cần tìm xem tìm thấy Regular expression: Tìm theo biểu thức Global :Tìm tất tập tin Forward : Tìm đến cuối tập tin Selected text: Chỉ tìm khối văn đánh dấu Backward: Tìm đến đầu tập tin From cursor : Bắt đầu từ vị trí nháy Entire scope: Bắt đầu vị trí khối tập tin - Lệnh Replace : Dùng để tìm kiếm đoạn văn đó, tự động thay đoạn văn khác, hộp thoại replace sau: Tìm cụm từ Scanf thay scanf - Lệnh Search again : Dùng để thực lại việc tìm kiếm - Các lệnh lại menu Search, bạn tìm hiểu thêm thực hành trực tiếp máy tính II.7.4 Các lệnh menu Run (Alt -R) - Lệnh Run : Dùng để thực thi hay "chạy" chương trình - Lệnh Step over : Dùng để "chạy" chương trình bước - Lệnh Trace into : Dùng để chạy chương trình bước Khác với lệnh Step over chỗ: Lệnh Step over không cho xem bước "chạy" chương trình con, cịn lệnh Trace into cho xem bước chương trình Trang 19 Lập trình - Các lệnh cịn lại, bạn tìm hiểu thêm thực hành máy II.7.5 Các lệnh menu Compile (Alt C) - Lệnh Complie: Biên dịch chương trình - Lệnh Make , Build, … : Các lệnh bạn tìm hiểu thêm thực hành trực tiếp máy tính - Lệnh Information : Dùng để thị thơng tin chương trình, Mode, mơi trường II.7.6 Các lệnh menu Debug (Alt-D) Trên menu Debug bao gồm số lệnh giúp người lập trình "gỡ rối" chương trình Người lập trình sử dụng chức "gỡ rối" gặp số "lỗi" thuật toán, sử dụng biến nhớ… - Lệnh Breakpoints: Dùng để đặt "điểm dừng" chương trình Khi chương trình thực thi đến "điểm dừng dừng lại" - Lệnh Watch : Dùng để mở cửa sổ hiển thị kết trung gian biến nhớ chạy chương trình bước - Lệnh Evaluate/Modify: Bạn tìm hiểu thực hành trực tiếp máy II.7.7 Các lệnh menu Project (Alt- P) Trên menu Project bao gồm lệnh liên quan đến dự án : đóng, mở, thêm , xóa mục,… II.7.8 Các lệnh menu Option (Alt -O) Trên menu Option bao gồm lệnh giúp người lập trình thiết đặt số tự chọn chạy chương trình Thơng thường, người lập trình khơng cần phải thiết đặt lại tự chọn - Lệnh Compiler : Dùng để thiết đặt lại số thông số biên dịch chương trình hình sau Phần trình bày thuộc mục: Directories, Enviroment Save; phần khác sinh viên tự tìm hiểu - Lệnh Directories : Dùng để đặt lại đường dẫn tìm đến tập tin cần thiết biên dịch chương trình hình sau: Trang 20 Lập trình Include directory: Thư mục chứa tập tin mà muốn đưa vào chương trình (các tập tin h dòng #include) Library directory : Thư mục chứa tập tin thư viện ( tập tin Lib) Output directory: Thư mục chứa tập tin “đối tượng “ (có phần mở rộng OBJ), tập tin thực thi (.exe) biên dịch chương trình Source directory: Thư mục chứa tập tin “nguồn” (có phần mở rộng obj, lib) - Lệnh Environment: dùng để thiết lập môi trường làm việc như: Reference…: Các tham chiếu Editor: Môi trường soạn thảo gồm: tạo tập tin dự phịng có chỉnh sửa (create backup file), chế độ viết đè (insert mode), tự động thụt đầu dịng (indent), đổi màu từ khóa (Syntax highlighting)… Đặc biệt, phần thiết lập phần mở rộng mặc định (Default Extension) tập tin chương trình C hay CPP (C Plus Plus: C++) Mouse : Đặt chuột Colors…: Đặt màu II.7.9 Các lệnh menu Window (Alt- W) Trên menu Window bao gồm lệnh thao tác đến cửa sổ như: - Lệnh Cascade : Dùng để xếp cửa sổ - Lệnh Close all : Dùng để đóng tất cửa sổ - Lệnh Zoom: Dùng để phóng to/ thu nhỏ cửa sổ - Các lệnh Tile, Refresh display, Size/ Move, Next, Previous, Close, List : Các bạn tìm hiểu thêm thực hành trực tiếp máy tính II.7.10 Các lệnh menu Help (Alt- H) Trên menu Help bao gồm lệnh gọi trợ giúp người lập trình cần giúp đỡ số vấn đề như: Cú pháp câu lệnh, cách sử dụng hàm có sẵn… - Lệnh Contents: Hiện thị tồn nội dung phần help Trang 21 Lập trình II CÁC THAO TÁC TRÊN BIẾN KIỂU CẤU TRÚC II.1 Truy xuất đến trường biến cấu trúc Cú pháp: . Khi sử dụng cách truy xuất theo kiểu này, thao tác . giống thao tác biến kiểu liệu Ví dụ : Viết chương trình cho phép đọc liệu từ bàn phím cho biến mẩu tin SinhVien in biến mẩu tin lên hình: #include #include #include typedef struct { unsigned char Ngay; unsigned char Thang; unsigned int Nam; } NgayThang; typedef struct { char MSSV[10]; char HoTen[40]; NgayThang NgaySinh; int Phai; char DiaChi[40]; } SinhVien; /* Hàm in lên hình mẩu tin SinhVien*/ void InSV(SinhVien s) { printf("MSSV: | Ho va ten | Ngay Sinh | Dia chi\n"); printf("%s | %s | %d-%d-%d | %s\n",s.MSSV,s.HoTen, s.NgaySinh.Ngay,s.NgaySinh.Thang,s.NgaySinh.Nam,s.DiaChi); } int main() { SinhVien SV, s; printf("Nhap MSSV: ");gets(SV.MSSV); printf("Nhap Ho va ten: ");gets(SV.HoTen); printf("Sinh ngay: ");scanf("%d",&SV.NgaySinh.Ngay); printf("Thang: ");scanf("%d",&SV.NgaySinh.Thang); printf("Nam: ");scanf("%d",&SV.NgaySinh.Nam); printf("Gioi tinh (0: Nu), (1: Nam): ");scanf("%d",&SV.Phai); flushall(); printf("Dia chi: ");gets(SV.DiaChi); InSV(SV); s=SV; /* Gán trị cho mẩu tin s*/ InSV(s); getch(); return 0; } Trang 100 Lập trình Lưu ý: - Các biến cấu trúc gán cho Thực chất thao tác tồn cấu trúc khơng phải trường riêng rẽ Chương trình dịng s=SV ví dụ - Với biến kiểu cấu trúc ta thực thao tác sau đây: o Sử dụng hàm xuất nhập biến cấu trúc o Các phép toán quan hệ, phép tốn số học logic Ví dụ: Nhập vào hai số phức tính tổng chúng Ta biết số phức cặp (a,b) a, b số thực, a gọi phần thực, b phần ảo (Đôi người ta viết số phức dạng a + ib i đơn vị ảo có tính chất i2=-1) Gọi số phức c1=(a1, b1) c2=(a2,b2) tổng hai số phức c1 c2 số phức c3 mà c3=(a1+a2, b1+b2) Với hiểu biết ta xem số phức cấu trúc có hai trường, trường biểu diễn cho phần thực, trường biểu diễn cho phần ảo Việc tính tổng hai số phức tính cách lấy phần thực cộng với phần thực phần ảo cộng với phần ảo #include #include #include typedef struct { float Thuc; float Ao; } SoPhuc; /* Hàm in số phức lên hình*/ void InSoPhuc(SoPhuc p) { printf("%.2f + i%.2f\n",p.Thuc,p.Ao); } int main() { SoPhuc p1,p2,p; clrscr(); printf("Nhap so phuc thu nhat:\n"); printf("Phan thuc: ");scanf("%f",&p1.Thuc); printf("Phan ao: ");scanf("%f",&p1.Ao); printf("Nhap so phuc thu hai:\n"); printf("Phan thuc: ");scanf("%f",&p2.Thuc); printf("Phan ao: ");scanf("%f",&p2.Ao); printf("So phuc thu nhat: "); InSoPhuc(p1); printf("So phuc thu hai: "); Trang 101 Lập trình InSoPhuc(p2); p.Thuc = p1.Thuc+p2.Thuc; p.Ao = p1.Ao + p2.Ao; printf("Tong so phuc: "); InSoPhuc(p); getch(); return 0; } Kết thực chương trình: II.2 Khởi tạo cấu trúc Việc khởi tạo cấu trúc thực lúc khai báo biến cấu trúc Các trường cấu trúc khởi tạo đạt dấu { }, chúng phân cách dấu phẩy (,) Ví dụ: Khởi tạo biến cấu trúc NgaySinh: struct NgayThang NgaySinh ={29, 8, 1986}; III CON TRỎ CẤU TRÚC III.1 Khai báo Việc khai báo biến trỏ kiểu cấu trúc tương tự khai báo biến trỏ khác, nghĩa đặt thêm dấu * vào phía trước tên biến Cú pháp: struct * ; Ví dụ: Ta khai báo trỏ cấu trúc kiểu NgayThang sau: struct NgayThang *p; /* NgayThang *p; // Nếu có định nghĩa kiểu */ III.2 Sử dụng trỏ kiểu cấu trúc Khi khai báo biến trỏ cấu trúc, biến trỏ chưa có địa cụ thể Lúc cấp phát byte để lưu giữ địa ghi nhận trỏ đến cấu trúc, chưa đến đối tượng cụ thể Muốn thao tác trỏ cấu trúc hợp lệ, tương tự trỏ khác, ta phải: - Cấp phát vùng nhớ cho (sử dụng hàm malloc() hay calloc) - Hoặc, cho quản lý địa biến cấu trúc Ví dụ: Sau khởi tạo giá trị cấu trúc: struct NgayThang Ngay = {29,8,1986}; Trang 102 Lập trình p = &Ngay; lúc biến trỏ p chứa địa Ngay III.3 Truy cập thành phần cấu trúc quản lý trỏ Để truy cập đến trường cấu trúc thông qua trỏ nó, ta sử dụng tốn tử dấu mũi tên (->: dấu - dấu >) Ngồi ra, ta sử dụng đến phép toán * để truy cập vùng liệu quản lý trỏ cấu trúc để lấy thơng tin cần thiết Ví dụ: Sử dụng trỏ cấu trúc #include #include typedef struct { unsigned char Ngay; unsigned char Thang; unsigned int Nam; } NgayThang; int main() { NgayThang Ng={29,8,1986}; NgayThang *p; clrscr(); p=&Ng; printf("Truy cap binh thuong %d-%d-%d\n", Ng.Ngay,Ng.Thang,Ng.Nam); printf("Truy cap qua tro %d-%d-%d\n", p->Ngay,p->Thang,p->Nam); printf("Truy cap qua vung nho tro %d-%d-%d\n", (*p).Ngay,(*p).Thang,(*p).Nam); getch(); return 0; } Kết quả: IV BÀI TẬP IV.1 Mục đích yêu cầu Làm quen biết cách sử dụng kiểu liệu cấu trúc kết hợp với kiểu liệu học Phân biệt kiểu liệu mảng kiểu cấu trúc Thực tập phần nội dung Trang 103 Lập trình IV.2 Nội dung Hãy định nghĩa kiểu: struct Hoso{ char HoTen[40]; float Diem; char Loai[10]; }; Viết chương trình nhập vào họ tên, điểm n học sinh Xếp loại văn hóa theo cách sau: Điểm Xếp loại 9, 10 Giỏi 7, Khá 5, Trung bình Khơng đạt In danh sách lên hình theo dạng sau: XEP LOAI VAN HOA HO VA TEN DIEM XEPLOAI Nguyen Van A Kha Ho Thi B Trung binh Dang Kim C Khong dat Xem phân số cấu trúc có hai trường tử số mẫu số Hãy viết chương trình thực phép toán cộng, trừ, nhân, chia hai phân số (Các kết phải tối giản ) Tạo danh sách cán công nhân viên, người người xem cấu trúc bao gồm trường Ho, Ten, Luong, Tuoi, Dchi Nhập số người vào danh sách, xếp tên theo thứ tự từ điển, in danh sách xếp theo mẫu sau: DANH SACH CAN BO CONG NHAN VIEN | STT |HO VA TEN | LUONG | TUOI | DIACHI | | Nguyen Van | 333.00 | 26 Tho | | | Dang Kim B | 23 | Vinh Long | Trang 104 | Can 290.00 | | Lập trình Chương 10 KIỂU TẬP TIN Học xong chương này, sinh viên nắm rõ vấn đề sau: Một số khái niệm tập tin? Các bước thao tác với tập tin Một số hàm truy xuất tập tin văn Một số hàm truy xuất tập tin nhị phân I MỘT SỐ KHÁI NIỆM VỀ TẬP TIN Đố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 toán với số liệu lớn Để giải vấn đề, người ta đưa kiểu tập tin (file) cho phép lưu trữ liệu nhớ (đĩ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 tin: o Tập tin văn (Text File): loại tập tin dùng để ghi ký tự lên đĩa, ký tự lưu trữ dạng mã Ascii Điểm đặc biệt liệu tập tin lưu trữ thành dòng, dòng kết thúc ký tự xuống dòng (new line), ký hiệu ‘\n’; ký tự kết hợp ký tự CR (Carriage Return - Về đầu dòng, mã Ascii 13) LF (Line Feed - Xuống dòng, mã Ascii 10) Mỗi tập tin kết thúc ký tự EOF (End Of File) có mã Ascii 26 (xác định tổ hợp phím Ctrl + Z) Tập tin văn truy xuất theo kiểu o Tập tin định kiểu (Typed File): loại tập tin bao gồm nhiều phần tử có kiểu: char, int, long, cấu trúc… lưu trữ đĩa dạng chuỗi byte liên tục o Tập tin không định kiểu (Untyped File): loại tập tin mà liệu chúng gồm cấu trúc liệu mà người ta không quan tâm đến nội dung kiểu nó, lưu ý đến yếu tố vật lý tập tin độ lớn yếu tố tác động lên tập tin mà Biến tập tin: biến thuộc kiểu liệu tập tin dùng để đại diện cho tập tin Dữ liệu chứa tập tin truy xuất qua thao tác với thông số biến tập tin đại diện cho tập tin Con trỏ tập tin: Khi tập tin mở để làm việc, thời điểm, có vị trí tập tin mà việc đọc/ghi thơng tin xảy Người ta hình dung có trỏ đến vị trí đặt tên trỏ tập tin Trang 105 Lập trình 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) II 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 II.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; II.2 Mở tập tin Cú pháp: FILE *fopen(char *Path, const char *Mode) Trong đó: - Path: chuỗi đường dẫn đến tập tin đĩa - Type: chuỗi xác định cách thức mà tập tin mở Các giá trị Mode: Chế độ r w a rb wb ab r+ w+ a+ r+b w+b a+b Ý nghĩa Mở tập tin văn để đọc Tạo tập tin văn để ghi Nối vào tập tin văn Mở tập tin nhị phân để đọc Tạo tập tin nhị phân để ghi Nối vào tập tin nhị phân Mở tập tin văn để đọc/ghi Tạo tập tin văn để đọc ghi Nối vào hay tạo tập tin văn để đọc/ghi Mở tập tin nhị phân để đọc/ghi Tạo tập tin nhị phân để đọc/ghi Nối vào hay tạo tập tin nhị phân - 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*/ Trang 106 Lập trình /* Đó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 II.3 Đóng tập tin Hàm fclose() dùng để đóng tập tin mở hàm fopen() Hàm ghi liệu lại vùng đệm vào tập tin đóng lại tập tin Cú pháp: int fclose(FILE *f) Trong f trỏ tập tin mở hàm fopen() Giá trị trả hàm báo việc đóng tập tin thành cơng Hàm trả EOF có xuất lỗi Ngồi ra, ta 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 II.4 Kiểm tra đến cuối tập tin hay chưa? Cú pháp: int feof(FILE *f) Ý nghĩa: Kiểm tra xem chạm tới cuối tập tin hay chưa trả EOF cuối tập tin chạm tới, ngược lại trả II.5 Di chuyển trỏ tập tin đầu tập tin - Hàm rewind() Khi ta thao tác tập tin mở, trỏ tập tin ln di chuyển phía cuối tập tin Muốn cho trỏ quay đầu tập tin mở nó, ta sử dụng hàm rewind() Cú pháp: void rewind(FILE *f) III TRUY CẬP TẬP TIN VĂN BẢN III.1 Ghi liệu lên tập tin văn III.1.1 Hàm putc() Hàm dùng để ghi ký tự lên tập tin văn mở để làm việc Cú pháp: int putc(int c, FILE *f) Trong đó, tham số c chứa mã Ascii ký tự Mã ghi lên tập tin liên kết với trỏ f Hàm trả EOF gặp lỗi III.1.2 Hàm fputs() Hàm dùng để ghi chuỗi ký tự chứa vùng đệm lên tập tin văn Cú pháp: int puts(const char *buffer, FILE *f) Trang 107 Lập trình 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 III.1.3 Hàm fprintf() Hàm dùng để ghi liệu có định dạng lên tập tin văn Cú pháp: fprintf(FILE *f, const char *format, varexpr) Trong đó: format: chuỗi định dạng (giống với định dạng hàm printf()), varexpr: danh sách biểu thức, biểu thức cách dấu phẩy (,) Định dạng Ý nghĩa %d %[.số chữ số thập phân] f Ghi số nguyên 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 Ghi số thực dạng khoa học (nhân 10 mũ x) %G 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 Trang 108 Lập trình III.2 Đọc liệu từ tập tin văn III.2.1 Hàm getc() Hàm dùng để đọc liệu từ tập tin văn mở để làm việc Cú pháp: int getc(FILE *f) Hàm trả mã Ascii ký tự (kể EOF) tập tin liên kết với trỏ f III.2.2 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 ‘\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 III.2.3 Hàm fscanf() Hàm dùng để đọc liệu từ tập tin văn vào danh sách biến theo định dạng Cú pháp: fscanf(FILE *f, const char *format, varlist) Trong đó: format: chuỗi định dạng (giống hàm scanf()); varlist: danh sách biến biến cách dấu phẩy (,) Ví dụ: Viết chương trình chép tập tin D:\Baihat.txt sang tập tin D:\Baica.txt #include #include int main() { FILE *f1,*f2; clrscr(); f1=fopen("D:\\Baihat.txt","rt"); f2=fopen("D:\\Baica.txt","wt"); if (f1!=NULL && f2!=NULL) { int ch=fgetc(f1); while (! feof(f1)) { fputc(ch,f2); ch=fgetc(f1); } Trang 109 Lập trình fcloseall(); } getch(); return 0; } IV TRUY CẬP TẬP TIN NHỊ PHÂN IV.1 Ghi liệu lên tập tin nhị phân - Hàm fwrite() Cú pháp: size_t fwrite(const void *ptr, size_t size, size_t n, FILE *f) Trong đó: - ptr: trỏ đến vùng nhớ chứa thông tin cần ghi lên tập tin - n: số phần tử ghi lên tập tin - size: kích thước phần tử - f: trỏ tập tin mở - Giá trị trả hàm số phần tử ghi lên tập tin Giá trị n trừ xuất lỗi IV.2 Đọc liệu từ tập tin nhị phân - Hàm fread() Cú pháp: size_t fread(const void *ptr, size_t size, size_t n, FILE *f) Trong đó: - ptr: trỏ đến vùng nhớ nhận liệu từ tập tin - n: số phần tử đọc từ tập tin - size: kích thước phần tử - f: trỏ tập tin mở - Giá trị trả hàm số phần tử đọc từ tập tin Giá trị n hay nhỏ n chạm đến cuối tập tin có lỗi xuất IV.3 Di chuyển trỏ tập tin - Hàm fseek() Việc ghi hay đọc liệu từ tập tin làm cho trỏ tập tin dịch chuyển số byte, kích thước kiểu liệu phần tử tập tin Khi đóng tập tin mở lại nó, trỏ ln vị trí đầu tập tin Nhưng ta sử dụng kiểu mở tập tin “a” để ghi nối liệu, trỏ tập tin di chuyển đến vị trí cuối tập tin Ta điều khiển việc di chuyển trỏ tập tin đến vị trí định hàm fseek() Cú pháp: int fseek(FILE *f, long offset, int whence) Trong đó: - f: trỏ tập tin thao tác - offset: số byte cần dịch chuyển trỏ tập tin kể từ vị trí trước Phần tử vị trí - whence: vị trí bắt đầu để tính offset, ta chọn điểm xuất phát là: SEEK_SET Vị trí đầu tập tin Trang 110 Lập trình - Vị trí trỏ tập tin SEEK_CUR Vị trí cuối tập tin SEEK_END 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ả IV.4 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 fclose(f); } getch(); return 0; } %ld",d,i,l); 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]; Trang 111 Lập trình } 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