Giáo trình lập trình ngôn ngữ C

297 13 0
Giáo trình lập trình ngôn ngữ 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

Phân biệt sự khá nhau giữa Câu lệnh, Ch hân ác hương trình và Phần mềm à Biế được quá tr ết rình hình thàn C nh Nê dùng C khi nào và tại sa ên i ao Nắ được cấu trúc một chươ trình C ắm t ơng Hiểu rõ khái niệ giải thuật (algorithms) ệm ẽ wchart) Vẽ lưu đồ (flow Liệ kê các ký hiệu dùng tron lưu đồ ệt h ng hiệu Giới th Ngày n khoa học máy tính thâm nhập vào mọi lĩnh vực Tự động hó hiện đang là ngành chủ chốt nay,...

Bài Những khái k niệm m vềề ngôn ngữ ữC Mục tiiêu: Kết thú úc học nàyy, bạn có thể:: ¾ Phhân biệt kháác Câu lệnh, Chhương trình vàà Phần mềm ¾ Biếết q trrình hình thàn nh C ¾ Nêên dùng C khii saao ¾ Nắắm cấu trúc t chươ ơng trình C ¾ Hiểu rõ khái niệệm giải thuật (algorithms) wchart) ¾ Vẽẽ lưu đồ (flow ¾ Liệệt kê ký hiệu h dùng tronng lưu đồ hiệu Giới th Ngày nay, n khoa họcc máy tính thâm nhập vào lĩnh vựcc Tự động hóóa ngành chủủ chốt điều hư ướng phátt triển giớ ới Bất nggành nghề o cần pphải hiểu biếtt nhiều Cơng nghệ Thơng T tin lập l trình nói chung c Cụ thểể, C ngôn n ngữ lập trình cấp caoo mà lập trình viên cầần phải biết Vì V thế, giáo trình nàày, nghiên cứuu chi tiết cấu trúc ngôn nggữ C Ðầu tiên tìm hiểu khác c kh hái niệm: Lệệnh (Commannd), Chương trình (Prograam) Phần mềm m (Softwaare) 1.1 Ra R lệnh cho máy m tính làm việc Khi mộột máy tính đ khởi độộng, tự động thực thhi số tiếnn trình xu uất kết raa hình Ðiều Ð diễnn nào? Câu trả lời đđơn giản nhhờ vào Hệ điiều hành cài đặt đ bên trongg máy tính Hệ H điều hành (operating sy ystem) xem x phần mềm hệ thống Phần mềềm khởi động máy tính thiết lập l thôngg số ban đầu ttrước traoo quyền cho người n dùng Để làm đượcc điều này, hệệ điều hành phải p cấuu tạo từ ttập hợp chương trình Mọi chương trình cố gắng đưa lời giải cho m hay nhiều tốn nàào đóMọi chư ương trình cố gắng đưa giải pháp choo hay nh hiều vấn đề Mỗi M chương trrình tập hợ ợp câu lện nh giải toán cụ thể Một nhóm n lệnh tạạo thành chương c trình nhóm m chương trình tạo thànnh phần mềm m Để rõ hơn, h chúng taa xem xétt thí dụ : Một người bạn b đến nhà cchúng ta chơi mờii sữa dâuu Anh ta thấyy ngon miệngg muốn xinn công thức lààm Chúng taa hướng dẫn cho c làm m sau : Lấy sữa s Đổ nước ép p dâu vào Trộn hỗn hợ ợp làm m lạnh Bây bạn củaa theeo dẫn này, họ c tạạo sữaa dâu tuyệt vờ ời Chúng ta phân tích t thị (lệệnh) ¾ Lệnh : Lệnh nàyy hồn chỉnh chưa c ? Nó cóó trả lời câu hỏi lấy sữ ữa ‘ở đâu’ ? ¾ Lệnh thứ haai : Một lần nữ ữa, lệnh kkhơng nói rõ nước ép dâu để ‘ở đâu’ May mắn bạn đủ thông minh để hiểu cơng thức pha chế nói trên, nhiều điểm chưa rõ ràng Do muốn phổ biến cách làm, cần bổ sung bước sau : Rót ly sữa vào máy trộn Đổ thêm vào nước dâu ép Ðóng nắp máy trộn Mở điện bắt đầu trộn Dừng máy trộn lại Nếu trộn tắt máy, ngược lại trộn tiếp Khi trộn xong, rót hỗn hợp vào tô đặt vào tủ lạnh Ðể lạnh lúc lấy dùng So sánh hai cách hướng dẫn nêu trên, hướng dẫn thứ hai chắn hồn chỉnh, rõ ràng hơn, đọc hiểu Tương tự, máy tính xử lý liệu dựa vào tập lệnh mà nhận Ðương nhiên thị đưa cho máy vi tính cần phải hồn chỉnh có ý nghĩa rõ ràng Những thị cần phải tuân thủ quy tắc: Tuần tự Có giới hạn Chính xác Mỗi thị tập thị gọi “câu lệnh” tập câu lệnh gọi “chương trình” Chúng ta xét trường hợp chương trình hướng dẫn máy tính cộng hai số Các lệnh chương trình : Nhập số thứ nhớ Nhập số thứ hai nhớ Thực phép cộng số thứ số thứ hai, nhớ kết phép cộng Hiển thị kết Kết thúc Tập lệnh tuân thủ tất quy tắc đề cập Vì vậy, tập lệnh chương trình thực thành cơng việc cộng hai số máy tính Ghi chú: Khả nhớ người biết đến trí nhớ, khả nhớ liệu đưa vào máy tính gọi “bộ nhớ” Máy tính nhận liệu thời điểm làm việc với liệu vào thời điểm khác, nghĩa máy tính ghi liệu vào nhớ sau đọc để truy xuất giá trị liệu làm việc với chúng Khi khối lượng cơng việc giao cho máy tính ngày nên nhiều phức tạp tất câu lệnh khơng thể đưa vào chương trình, chúng cần chia thành số chương trình nhỏ Tất chương trình cuối tích hợp lại để chúng làm việc với Một tập hợp chương trình gọi phần mềm Lập trình C Mối quan q hệ giữaa ba khái niệệm câu lệnhh, chương trìình phần mềm có thểể biểu diễn sơ s đồ hình h 1.1: Software Program P Program Commandss Command ds Commandss Hình 1.1: Phần mềềm, chương trình t câu lệnh 1.2 N Ngơn ngữ C Vào đầầu năm m 70 phòng g thí nghiệm Bell, B Dennis Ritchie phhát triển ngơnn ngữ C C đư ược sử dụng lầần đầu m hệ thống cài đặt hệ điiều hành UN NIX C có nguuồn gốc từ nggơn ngữ BCP PL Martin n Richards phát triển BCPL sau đđược Ken Thompson phát triển thành ngôn n ngữ B, đ người khởi k thủy C C Trong BCPL v B không hỗ h trợ kiểu ữ liệu, C đ có nhiều kkiểu liệu khác k Những N kiểu ữ liệu gồm g : kiểu ký tự (characterr), kiểu số nguuyên (intergerr) kiểu số thực t (float) C liên kết chặt chẽ với v hệ thống UNIX nhưngg khơng bị tróói buộc vào mááy tính hay hệệ điều hành n C hiệuu để viết c chương trrình thuộc nhiiều lĩnnh vực khác n C cũngg dùng để đ lập trình hệ h thống Mộtt chương trìnhh hệ thống cóó ý nghĩa liênn quan đến hệệ điều hành c máy tínhh hay tiện t ích hỗ trợ ợ Hệ điềuu hành (OS), trình thơng dịch d (Interpreeters), trình sooạn thảo (Ed ditors), chươnng trình Hợp Ngữ (Assem mbly) chương trình hệ h thống Hệệ điều hành UNIX U ph hát triển dựa vào v C C đanng sử dụụng rộng rãi tính hiệuu linh hoạt Trình biên b dịch (compiler) C có sẵn cho hầu hết máy tính Mã lệnnh viết C máy đượ ợc biên dịch v chạy máy m khác chỉỉ cần thay đổii kkhơng thay đổổi Trìnhh biên dịch C dịch nhanh v cho mã đối tượng khhông lỗi C thực t thi nhanh hợp ngữ (A Assembly) Lậập trình viên có c thể tạo bảo trì thư viện hàm mà m chúng đ tái sử dụ ụng cho chươ ơng trình khácc Do đó, nhữ ững dự án lớnn quản lý dễ dàng d mà tốn rấất cơng sức ữ bậc trung 1.2.1 C – Ngôn ngữ C đượcc hiểu ngô ôn ngữ bậc truung nóó kết hợp nhữ ững yếu tố củủa ngô ôn ngữ cấp caao chức củ hợp ngữ (nngôn ngữ cấp thấp) C cho phép thao tácc thành phần mááy tính bits, b bytes, địaa chỉ… Hơn nữa, mã C rấất dễ di chuyển nghĩa phần p mềm viếết cho loại máy tính có c thể chạy t loại máy tính kh hác Mặc dù C có năm kiểểu liệu bản, khơng đư ược xem nganng hàng với nggôn ngữ cao cấp mặt kiiểu liệu C cho phép chhuyển kiểu ữ liệu Nó choo phép thao táác trực tiếp trrên bits, bytess, word conn trỏ (pointerr) Vì vậy, dùng cho lập trình mức m hệ thống 1.2.2 C - Ngơn ngữ ữ cấu trúc Thuật ngữ ngôn ngữ cấu trúc khối (block-structured language) không áp dụng với C Ngôn ngữ cấu trúc khối cho phép thủ tục (procedures) hay hàm (functions) khai báo bên thủ tục hàm khác C không cho phép việc tạo hàm hàm nên khơng phải ngơn ngữ cấu trúc khối Tuy nhiên, xem ngơn ngữ cấu trúc có nhiều điểm giống với ngơn ngữ cấu trúc ALGOL, Pascal số ngôn ngữ tương tự khác C cho phép có tổng hợp mã lệnh liệu Ðiều đặc điểm riêng biệt ngơn ngữ cấu trúc Nó liên quan đến khả tập hợp ẩn dấu tất thơng tin lệnh khỏi phần cịn lại chương trình để dùng cho tác vụ riêng biệt Ðiều thực qua việc dùng hàm hay khối mã lệnh (Code Block) Các hàm dùng để định nghĩa hay tách rời tác vụ yêu cầu chương trình Ðiều cho phép chương trình hoạt động đơn vị thống Khối mã lệnh nhóm câu lệnh chương trình nối kết với theo trật tự logic xem đơn vị thống Một khối mã lệnh tạo tập hợp nhiều câu lệnh dấu ngoặc mở đóng xoắn đây: { i = i + 1; } while (i < 40); Ngôn ngữ cấu trúc hỗ trợ nhiều cấu trúc dùng cho vòng lặp (loop) while, do-while, for Những cấu trúc lặp giúp lập trình viên điều khiển hướng thực thi chương trình 1.3 Cấu trúc chương trình C C có số từ khóa, xác 32 Những từ khóa kết hợp với cú pháp C hình thành ngơn ngữ C Nhưng nhiều trình biên dịch cho C thêm vào từ khóa dùng cho việc tổ chức nhớ giai đoạn tiền xử lý định Vài quy tắc lập trình C sau : - Tất từ khóa chữ thường (không in hoa) Ðoạn mã chương trình C có phân biệt chữ thường chữ hoa Ví dụ : while khác với DO WHILE Từ khóa khơng thể dùng cho mục đích khác đặt tên biến (variable name) tên hàm (function name) Hàm main() hàm gọi đến chương trình bắt đầu chạy (chúng ta xem xét kỹ phần sau) Xem xét đoạn mã chương trình: main () { /* This is a sample program */ int i = 0; i = i + 1; } Lập trình C Ghi chú: c Những khía k cạnh khácc chư ương trình C đ xem xét qua đoạn mã t Ðoạn mãã xem đoạn mã m mẫu, dùng lạii suốt ph hần cịn lại củaa giáo trình nàày 1.3.1 Ðịnh Ð nghĩa Hàm H Chươn ng trình C đư ược chia thànnh đơn vị v gọi hàm m Ðoạn mã m mẫu có d mộtt hàm main() Hệ điều hàn nh trao quyền q điều kkhiển cho hàm m main() chương trình C đượcc thực thi Tên n hàm ln đ theo sau cặp dấu nggoặc đơn () Trong T dấu ngooặc đơn có th hể có hay khơnng có tham số (paraameters) 1.3.2 Dấu D phân cách (Delimiters) Sau địn nh nghĩa hàm m dấu ng goặc xoắn mở { Nó thơngg báo điểm bắt đầu hààm Tương tự ự, dấu ngoặc xoắn đóng } sau câu lệnh h cuối hhàm điiểm kết thúc hàm Dấấu ngoặc xoắắn mở đánh dấu d điểm bắt đầu đ khối mã lệnhh, dấu ngoặc xoắn x đóng đáánh dấu điểm m kết thúc củaa khối mã lệnnh Trong đoạn đ mã mẫu có câu lệnhh dấu ngoặc n xoắn Hơn nữ ữa, hààm, dấu ngoặcc xoắn dùng d để phân định đđoạn mã trongg trường hợp dùng cho cấuu trúc vòng lặặp lệnh điềều kiện 1.3.3 Dấu D kết thúcc câu lệnh (Terminator) Dòng int i = 0; đoạnn mã mẫu m câu lệnh h (statement) Một câu lệnhh C g dịng dùng pphím Enter, khoảng k trắng dùng kết thúúc dấu chấm phẩy (;)) C khơng hiểểu việc xuống phím spacebar s hay khoảng cách dùngg phím tab Có C thể có nhiều câu c lệnh hààng mỗ ỗi câu lệnh phhải kết thúc dấấu chấm phẩyy Một câu lệnnh không đượ ợc kết thúc bằằng dấu chấm m phẩy xem x câu lệnh sai 1.3.4 Dòng D thíích (Commen nt) Nhữngg thích th hường viết v để mô tảả công việc củ lệnh đđặc biệt, mộtt hàm hay toààn chương g trình Trình h biên dịch khơng dịch chúng c Trongg C, thíchh bắt đầu bằngg ký hiệu /* v kết thúc bằằng */ Trườn ng hợp thhích có nhiềuu dịng, ta phải ý ký hhiệu kết thúc (*/), thiếếu ký hiệu nàày, toàn ch hương trình sẽẽ bị coi l thíích Trong đooạn mã mẫu dịng d chữ "Thiis is a samplee program" làà dịng thhích Trong trư ường hợp chúú thích trêên dịng ta dùnng // Ví dụ: int a = 0; // Biến ‘a’ khai báo m kiểu số nguyên (intergger) 1.3.5 Thư T viện C (Library) Tất trình biên dịch C chứa m thư viện hàm h chuẩn dù ùng cho nhữnng tác vụ chunng Một vài b cài đặt C đặt đ thư viện t tập p tin (file) lớnn đaa số cịn lại chhứa nhiều tập tinn nhỏ Khi lậpp trình, nhữngg hàm chứa c thư viện dùng chho nhiều loại tác vụ khác nnhau Một hààm (được viếết lậpp trình viên) đặt thư viện đượ ợc dùng nhiều n chương g trình đư ược yêu cầu Vài V trình biênn dịch cho phép hàm thêm vào thư viện chuẩn số khác lại yêu cầu c tạo thhư viện riêng 1.4 B Biên dịch thực thi mộtt chương trìn nh (Compilin ng and Runn ning) Nhữngg bước khác n việcc dịch chhương trình C từ mã nguồồn thành mã thực t thi đượcc thực nhhư sau : ¾ Soạn thảo/Xử lý l từ Ta dùng trình xử lý từ (word processor) hay trình soạn thảo (editor) để viết mã nguồn (source code) C chấp nhận loại mã nguồn viết dạng tập tin văn chuẩn Vài trình biên dịch (compiler) cung cấp mơi trường lập trình (xem phụ lục) gồm trình soạn thảo ¾ Mã nguồn Ðây đoạn văn chương trình mà người dùng đọc Nó đầu vào trình biên dịch C ¾ Bộ tiền xử lý C Từ mã nguồn, bước chuyển qua tiền xử lý C Bộ tiền xử lý xem xét câu lệnh bắt đầu dấu # Những câu lệnh gọi thị tiền biên dịch (directives) Điều giải thích sau Chỉ thị tiền biên dịch thường đặt nơi bắt đầu chương trình đặt nơi khác Chỉ thị tiền biên dịch tên ngắn gọn gán cho tập mã lệnh ¾ Mã nguồn mở rộng C Bộ tiền xử lý C khai triển thị tiền biên dịch đưa kết Ðây gọi mã nguồn C mở rộng, sau chuyển cho trình biên dịch C ¾ Trình biên dịch C (Compiler) Trình biên dịch C dịch mã nguồn mở rộng thành ngơn ngữ máy để máy tính hiểu Nếu chương trình q lớn chia thành tập tin riêng biệt tập tin biên dịch riêng rẽ Ðiều giúp ích mà tập tin bị thay đổi, toàn chương trình khơng phải biên dịch lại ¾ Bộ liên kết (Linker) Mã đối tượng với thủ tục hỗ trợ thư viện chuẩn hàm dịch riêng lẻ khác kết nối lại Bộ liên kết mã thực thi Lập trình C ¾ Bộộ nạp (Loadeer) Mãã thực thi đượ ợc thi hành bở ởi nạp hệ thống Tiếến trình đ mơ tả qu ua lưu đồ 1.2 sau : # includee file Soource file Tập tin thê êm vào Chươ ơng trình gốc Library File Coompiler Thư việ ện Trình biên dịch Other Useergenerateed Object Fiile Ob bject File Các tập tin thực t tthi khác người n dùng Tập tin đối tượng L Linker Bộ ộ liên kết Execcutable File Tập tin thực thi Hình 1.2: Biên dịch h thực thi chương trình 1.5 Các bước lập trình giảii vấn đề đ Chúng ta thường gặặp phải nhữngg toán Để giải n tốán đó, cần hiểu chúng c trước r sau mớ ới hoạch định bước cầnn làm Giả sử muuốn từ phòòng học đến quán ăn tự phục p vụ tầnng hầm Ðể thực việcc cần hiểu n tìm bước giải trước thực thi ccác bước đó: BƯỚC C : Rời phònng BƯỚC C : Ðến cầu thang BƯỚC C : Xuống tầầng hầm BƯỚC C : Ði tiếp đến quán ăn tự ự phục vụ Thủ tục liệt kê tập hợp bước b thực hiệện xác định đ rõ ràng cho c việc giải vấn đề Một tập hợp p bước nhhư gọi giải thuật (Allgorithm hay gọi vắn tắt làà algo ) Một giiải thuật (cònn gọi thuật tốn) định ngghĩa m thủ tục, côông thức hayy cách giải quuyết vấn đề Nó N gồm tậập hợp bư ước giúp đạt đ lời giải Qua phhần trên, chúnng ta thấy rõ ràng để giải m toán, trước tiên ta phải hiểu bàii toán đó, chúng taa cần tập hợpp tất thơng tin liiên quan tới nnó Bước kế xử lý nnhững mẩu thhơng tin Cuối C cùng, chúúng ta cho lời giải b tốn Giải thuật có tập hợp bước liệt kê dạng ngôn ngữ đơn giản Rất bước hai người khác viết tương tự ngơn ngữ dùng diễn tả bước khác Do đó, cần thiết có phương pháp chuẩn mực cho việc viết giải thuật để người dễ dàng hiểu Chính , giải thuật viết cách dùng hai phương pháp chuẩn mã giả (pseudo code) lưu đồ (flowchart) Cả hai phương pháp dùng để xác định tập hợp bước cần thi hành để có lời giải Liên hệ tới vấn đề đến quán ăn tự phục vụ trên, vạch kế hoạch (thuật tốn) để đến đích Tuy nhiên, để đến nơi, phải cần thi hành bước thật Tương tự, mã giả lưu đồ đưa bước cần làm Lập trình viên phải viết mã cho việc thực thi bước qua việc dùng ngơn ngữ Chi tiết về mã giả lưu đồ trình bày 1.5.1 Mã giả (pseudo code) Nhớ mã giả mã thật Mã giả sử dụng tập hợp từ tương tự mã thật khơng thể biên dịch thực thi mã thật Chúng ta xem xét mã giả qua ví dụ sau.Ví dụ hiển thị câu 'Hello World!' Ví dụ 1: BEGIN DISPLAY 'Hello World!' END Qua ví dụ trên, đoạn mã giả phải bắt đầu với từ BEGIN START, kết thúc với từ END hay STOP Ðể hiển thị giá trị đó, từ DISPLAY WRITE dùng Khi giá trị hiển thị giá trị (không đổi), trường hợp (Hello World), đặt bên dấu nháy Tương tự, để nhận giá trị người dùng, từ INPUT hay READ dùng Ðể hiểu điều rõ hơn, xem xét ví dụ 2, ví dụ ta nhập hai số máy hiển thị tổng hai số Ví dụ 2: BEGIN INPUT A, B DISPLAY A + B END Trong đoạn mã giả này, người dùng nhập vào hai giá trị, hai giá trị lưu nhớ truy xuất A B theo thứ tự Những vị trí đặt tên nhớ gọi biến Chi tiết biến giải thích phần sau chương Bước đoạn mã giả hiển thị tổng hai giá trị biến A B Tuy nhiên, đoạn mã trên, ta bổ sung để lưu tổng hai biến biến thứ ba hiển thị giá trị biến ví dụ sau Ví dụ 3: BEGIN INPUT A, B Lập trình C C = A + B DI ISPLAY C END Một tậập hợp thị hay c bước tronng mã giả gọi chuung cấấu trúc Có baa loại cấu trúúc : tuần tự, chhọn lựa lặặp lại Trong đđoạn mã giả ta t viết trên,chúng ta dùnng cấu trúc tuầần tự Chúng gọi nhhư nhữ ững thị đư ược thi hành tuần tự, nnày sau khác k bắt đầu đ từ điểm đầu đ tiên Hai loại l cấu trúc c lại đượ ợc đề cập tron ng chươ ơng sau 1.5.2 Lưu đồ (Flowcharts) Một lư ưu đồ hình ảnh nh hoạ cho ggiải thuật Nó vẽ biểu đđồ luồng thị hay n hoạt độộng tiến trình Mỗi M hoạt độngg đượ ợc biểu diễn qqua ký hiệu Ðể hiểểu điều rõ õ hơn, chúngg ta xem lưu đđồ hình h 1.3 dùng hiiển thị thông điệp truyền thống t ‘Hello World!’ S TA R T DIS P L AY 'H e ll o W o rld r !' STO P Hìn nh 1.3: Lưu đồ đ đ mã giả l bắt đầầu với từ BE EGIN ST TART, kếtt thúc với từ END Lưu đồồ giống với đoạn hay ST TOP Tương tự, t từ khóa DISPLAY D đư ược dùng để hiển h thị giá trrị đếnn người dùng Tuy nhiên, đây, từ khóa nằằm nhữnng ký hiệu Những N ký hiệuu khác mang m ý nghĩa n tương ứng ứ trìn nh bày bảngg Hình 11.4 Hình 1.4: Ký hiệu tron ng lưu đồ Ta xét lưu đồ cho ví dụ Hình 1.5 Ký hiệu bắt đầu: Dùng để bắt đầu lưu đồ Ký hiệu xuất/nhập: Dùng để nhập hai số A, B Ký hiệu xử lý: Dùng để cộng hai số Ký hiệu xuất/nhập: Dùng để hiển thị tổng C Ký hiệu kết thúc: Dùng kết thúc lưu đồ Hình 1.5: Lưu đồ cộng hai số Tại bước mà giá trị hai biến cộng gán cho biến thứ ba xem xử lý trình bày hình chữ nhật Lưu đồ mà xét đơn giản.Thông thường, lưu đồ trải rộng nhiều trang giấy Trong trường hợp thế, biểu tượng nối dùng để điểm nối hai phần chương trình nằm hai trang Vòng tròn nối kết phải chứa ký tự số hình 1.6 Như thế, tạo liên kết giưa hai lưu đồ chưa hồn chỉnh Hình 1.6: Bộ nối Bởi lưu đồ sử dụng để viết chương trình, chúng cần trình bày cho lập trình viên hiểu chúng dễ dàng Nếu có ba lập trình viên dùng ba ngơn ngữ lập trình khác để viết mã, toán họ cần giải phải Trong trường hợp này, mã giả đưa cho lập trình viên giống ngơn ngữ lập trình họ dùng tất nhiên cú pháp khác Nhưng kết cuối Do đó, cần thiết phải hiểu rõ tốn mã giả phải viết cẩn thận Chúng ta kết luận mã giả độc lập với ngôn ngữ lập trình Vài điểm cần thiết khác phải ý vẽ lưu đồ : ¬ Lúc đầu tập trung vào khía cạnh logic tốn vẽ luồng xử lý lưu đồ ¬ Một lưu đồ phải có điểm bắt đầu (START) điểm kết thúc (STOP) 10 Lập trình C Tóm tắt ¾ Ngơn ngữ C không chứa câu lệnh nhập/xuất tường minh Tất thao tác nhập/xuất thực cách sử dụng hàm thư viện chuẩn C ¾ Có hai kiểu stream – stream văn stream nhị phân ¾ Một stream văn chuỗi ký tự ¾ Một stream nhị phân chuỗi byte ¾ Một tập tin từ tập tin đĩa đến thiết bị đầu cuối hay máy in ¾ Một trỏ tập tin trỏ trỏ đến cấu trúc, chứa thơng tin tập tin, bao gồm tên, vị trí hành tập tin, tập tin đọc ghi, có lỗi xuất hay đến cuối tập tin ¾ Hàm fopen() mở stream để dùng liên kết tập tin với stream ¾ Hàm fclose() đóng stream mở hàm fopen() ¾ Hàm fcloseall() sử dụng cần đóng nhiều stream mở lúc ¾ Hàm fputc() dùng để ghi ký tự, hàm fgetc() dùng để đọc ký tự từ tập tin mở ¾ Hàm fgets() fputs() thao tác giống hàm fgetc() fputc(), ngoại trừ chúng làm việc chuỗi ¾ Hàm feof() dùng để cuối tập tin tập tin mở cho thao tác nhị phân ¾ Hàm rewind() đặt lại vị trí trỏ định vị trí đầu tập tin ¾ Hàm ferror() xác định liệu thao tác tập tin có sinh lỗi hay khơng ¾ Hàm remove() xóa tập tin cho ¾ Hàm fflush() làm chép buffer Nếu tập tin mở để đọc, vùng đệm nhập trống, tập tin mở để ghi vùng đệm xuất ghi vào tập tin ¾ Hàm fseek() sử dụng để đặt lại vị trí trỏ định vị bên tập tin ¾ Các hàm thư viên fread() fwrite() dùng để đọc ghi toàn khối liệu vào tập tin ¾ Hệ thống nhập xuất có vùng đệm bao gồm hai hàm fprintf() fscanf(), hai hàm tương tự hàm printf() scanf(), ngoại trừ chúng thao tác tập tin Quản lý tập tin 299 Kiểm tra tiến độ học tập Có hai kiểu stream stream stream _ Các tập tin mở đóng lại chương trình bị treo hay kết thúc bất thường (Đúng /Sai) Hàm _ mở stream để dùng liên kết tập tin với stream Hàm dùng để ghi ký tự vào tập tin Hàm fgets() xem ký tự sang dòng phần chuỗi (Đúng / Sai) Hàm đặt lại vị trí trỏ định vị bên tập tin đầu tập tin Mỗi ký tự đọc hay ghi từ stream, _ tăng lên Các tập tin mà hàm fread() fwrite() thao tác phải mở chế độ Vị trí hành trỏ kích hoạt hành tìm thấy trợ giúp hàm 300 Lập trình C Bài tập tự làm Viết chương trình để nhập liệu vào tập tin in theo thứ tự ngược lại Viết chương trình để truyền liệu từ tập tin sang tập tin khác, loại bỏ tất nguyên âm (a, e, i, o, u) Loại bỏ nguyên âm dạng chữ hoa lẫn chữ thường Hiển thị nội dung tập tin Quản lý tập tin 301 302 Lập trình C Bài 22 Quản Lý Tập Tin Mục tiêu: Kết thúc học này, bạn có thể: ¾ Thực thao tác tập tin văn tập tin nhị phân ¾ Mở đóng tập tin ¾ Đọc từ tập tin ghi vào tập tin ¾ Sử dụng trỏ tập tin Các bước cho giải thích cặn kẽ, dễ hiểu tư cẩn thận từ đầu đến cuối Bài viết để đáp ứng mục tiêu học để hiểu hồn tồn công cụ Xin thực theo bước cách cẩn thận Phần I – Trong thời gian 30 phút đầu: 22.1 Quản lý tập tin C C cung cấp giao diện đồng cho việc quản lý nhập xuất Các phương pháp truy cập tập tin giống phương pháp quản lý thiết bị khác Giải pháp cho tính đồng C khơng có kiểu tập tin C xem tất tập tin stream 22.1.1 Đọc, ghi truy cập liệu tập tin Có số hàm xử lý tập tin tập tin header stdio.h Chúng ta viết chương trình C sử dụng hàm Chương trình tạo hệ thống ngân hàng đơn giản Các chi tiết khách hàng nhập vào lưu tập tin gọi customer Chi tiết giao dịch gửi tiền rút tiền kiểm tra hợp lệ tập tin customer Các giao dịch hợp lệ ghi nhận tập tin trans Một báo cáo khách hàng có số vốn thấp in Các bước liệt kê sau: Định nghĩa structure để lưu trữ liệu khách hàng giao dịch Câu lệnh là: struct cust_st { int acc_no; char cust_nm[30]; float bal; }; struct tran_st { int acc_no; char trantype; float amt; }; Hiển thị danh mục để thực thao tác khác dựa lựa chọn người dùng Câu lệnh là: while(choice != 4) { clrscr(); printf("\nSelect choice from menu\n\n1 Accept customer details\n2 Record Withdrawal/Deposit Quản lý tập tin 305 transaction\n3 Print Low Balance Report\n4 Exit\n\nEnter choice: "); scanf(" %d", &choice); } Gọi hàm tương ứng dựa vào lựa chọn người dùng Câu lệnh là: if(choice == 1) addcust(); else if(choice == 2) rectran(); else if(choice == 3) prnlowbal(); Trong hàm thêm chi tiết khách hàng, định nghĩa trỏ tập tin để kết hợp với tập tin customer Khai báo biến cấu trúc để nhập liệu khách hàng Câu lệnh là: FILE *fp; struct cust_st custdata; Mở tập tin customer theo chế độ append để thêm mẫu tin Xác nhận thao tác mở tập tin thực Câu lệnh là: if((fp = fopen("customer", "a+")) == NULL) { printf("\nERROR opening customer file"); getch(); return; } Nhập liệu khách hàng vào biến cấu trúc ghi liệu vào tập tin customer Câu lệnh là: fwrite(&custdata, sizeof(struct cust_st), 1, fp); Đóng tập tin customer sau nhập liệu Câu lệnh là: fclose(fp); Trong hàm dùng để ghi giao dịch, định nghĩa biến trỏ để trỏ đến tập tin customer tập tin trans Và định nghĩa biến cấu trúc để nhập vào liệu giao dịch đọc liệu khách hàng Câu lệnh là: FILE *fp1, *fp2; struct cust_st custdata; struct tran_st trandata; Mở hai tập tin theo chế độ thích hợp Tập tin customer phải mở để đọc cập nhật, tập tin trans phải cho phép thêm mẫu tin Câu lệnh là: if((fp1=fopen("customer", "r+w"))==NULL) { printf("\nERROR opening customer file"); getch(); return; } 306 Lập trình C if((fp2 = fopen("trans", "a+")) == NULL) { printf("\nERROR opening transaction file"); getch(); return; } 10 Nhập vào số tài khoản cho giao dịch bảo đảm tồn tập tin customer Câu lệnh là: while((fread(&custdata, size, 1, fp1)) == && found == 'n') { if(custdata.acc_no == trandata.acc_no) { found='y'; break; } } 11 Để bảo đảm nhập vào kiểu giao dịch hợp lệ, câu lệnh là: if(trandata.trantype!='D' && trandata.trantype!='d' && trandata.trantype!='W' && trandata.trantype!='w') printf("\t\tInvalid transaction type, please reenter"); 12 Đối với giao dịch rút tiền, phải bảo đảm số tiền rút phải sẳn có tài khoản khách hàng Nếu sẳn có, cập nhật số tiền cịn lại tài khoản Cũng cần cập nhật số tiền tài khoản cho giao dịch gửi tiền Câu lệnh là: if(trandata.trantype=='W' || trandata.trantype=='w') { if(trandata.amt>custdata.bal) printf("\nAccount balance is %.2f Please reenter withdrawal amount.", custdata.bal); else { custdata.bal-=trandata.amt; } } else { custdata.bal+=trandata.amt; } 13 Ghi mẫu tin chứa giao dịch vào tập tin trans cập nhật mẫu tin khách hàng tập tin customer Câu lệnh là: fwrite(&trandata, sizeof(struct tran_st), 1, fp2); fseek(fp1, (long)(-size), 1); fwrite(&custdata, size, 1, fp1); Quản lý tập tin 307 Lưu ý suốt trình kiểm tra số tài khoản khách hàng, mẫu tin đọc cuối khách hàng thực giao dịch Vì vậy, trỏ tập tin tập tin customer phải nằm cuối mẫu tin cần cập nhật Con trỏ tập tin đặt lại vị trí đầu mẫu tin sử dụng hàm fseek() Ở size biến số nguyên chứa kích cở cấu trúc cho liệu khách hàng 14 Đóng hai tập tin sau nhập giao dịch Câu lệnh là: fclose(fp1); fclose(fp2); 15 Trong hàm hiển thị tài khoản có số vốn ít, định nghĩa trỏ tập tin để kết hợp với tập tin customer Khai báo biến cấu trúc để đọc liệu khách hàng Câu lệnh là: FILE *fp; struct cust_st custdata; 16 Sau mở tập tin chế độ đọc, đọc mẩu tin khách hàng kiểm tra số vốn Nếu 250, in mẩu tin Câu lệnh là: while((fread(&custdata, sizeof(struct cust_st), 1, fp))==1) { if(custdata.bal custdata.bal) printf("\nAccount balance is %.2f Please reenter withdrawal amount.", custdata.bal); else { custdata.bal -= trandata.amt; val_flag = 'y'; } } else { custdata.bal += trandata.amt; val_flag = 'y'; } } fwrite(&trandata, sizeof(struct tran_st), 1, fp2); fseek(fp1, (long)(-size), 1); fwrite(&custdata, size, 1, fp1); } else printf("\nThis account number does not exist"); printf("\nRecord another transaction? (y/n): "); scanf(" %c", &flag); } fclose(fp1); fclose(fp2); } prnlowbal() { FILE *fp; struct cust_st custdata; char flag = 'n'; clrscr(); if((fp = fopen("customer", "r")) == NULL) { printf("\nERROR opening customer file"); getch(); return; } printf("\nReport on account balances below 250\n\n"); while((fread(&custdata, sizeof(struct cust_st), 1, fp)) == 1) { if(custdata.bal < 250) { flag = 'y'; printf("\n%d\t%s\t%.2f", custdata.acc_no, custdata.cust_nm, custdata.bal); } } if(flag == 'n') Quản lý tập tin 311 printf("\nNo account balances found below 250"); getch(); fclose(fp); } Để xem kết quả, thực bước sau đây: Lưu tập tin với tên filesI.C Biên dịch tập tin, filesI.C Thực thi chương trình, filesI.C Trở chương trình soạn thảo Kết xuất chương trình sau: Select choice from menu Accept customer details Record Withdrawal/Deposit transaction Print Low Balance Report Exit Enter choice: Một mẫu kết xuất hàm thêm vào chi tiết khách hàng sau: Enter Account number: 123 Enter Customer Name: E.Wilson Enter Account Balance: 2000 Add another? (y/n): Một mẫu kết xuất hàm thêm vào chi tiết giao dịch sau: Enter Account number: 123 Enter Transaction type (D/W): W Enter amount: 1000 Record another transaction? (y/n): Một mẫu kết xuất hàm hiển thị báo cáo tài khoản có vốn thấp sau: Report on account balances below 250 104 312 Jones 200 Lập trình C 113 120 Quản lý tập tin Sharon 150 Paula 200 313 Phần II – Trong thời gian 30 phút kế tiếp: Viết chương trình C để hiển thị khác hai tập tin nhập vào đối số dòng lệnh Với khác nhau, hiển thị vị trí tìm thấy khác ký tự hai tập tin vị trí Cũng cần phải bảo đảm người sử dụng nhập vào số lượng đối số hợp lệ Cuối cùng, hiển thị tổng số khác tìm thấy Để làm điều này, a Khai báo biến argv argc để nhận vào đối số từ dòng lệnh b Khai báo trỏ trỏ đến hai tập tin c Kiểm tra tính hợp lệ argc để bảo đảm nhập số đối số d Mở hai tập tin chế độ đọc e Đặt vòng lặp để đọc ký tự từ hai tập tin đến cuối hai tập tin f Nếu ký tự khác nhau, hiển thị chúng với vị trí chúng Tăng số đếm khác lên g Nếu đến cuối tập tin, in ký tự lại tập tin khác biệt h Kiểm tra số đếm khác để hiển thị thơng báo thích hợp i Đóng hai tập tin 314 Lập trình C Bài tập tự làm Viết chương trình C để chép nội dung tập tin vào tập tin khác loại trừ từ a, an, the Viết chương trình C để nhập vào hai chuỗi số Lưu trữ chuỗi hai tập tin riêng biệt Sắp xếp chuỗi tập tin Trộn hai chuỗi vào một, xếp lưu lại chuỗi kết vào tập tin Hiển thị nội dung tập tin Quản lý tập tin 315 ... phòòng h? ?c đến quán ăn tự ph? ?c p vụ tầnng hầm Ðể th? ?c việcc c? ??n hiểu n tìm bư? ?c giải trư? ?c th? ?c thi cc? ?c bư? ?c đó: BƯ? ?C C : Rời phònng BƯ? ?C C : Ðến c? ??u thang BƯ? ?C C : Xuống tầầng hầm BƯ? ?C C : Ði... số h? ?c ch? ?c chúng C? ?c toán tử ++ Ch? ?c Lấy đối số Tăng giá trị Giảm giá trị C? ?c toán tử hai + * % / ^ Ch? ?c Cộng Trừ Nhân Lấy phần dư Chia Lấy số mũ Bảng 2.2: C? ?c toán tử số h? ?c ch? ?c ¾ C? ?c tốn... th? ?c thii chương trình rẽ nhánh Nhhững c? ??u tr? ?c cho vi? ?c rẽ nhánh n c? ??u tr? ?c chọnn lựa, c? ??u tr? ?c điều kiện hay rẽ nhánh Những c? ??u trr? ?c đề c? ??p chi tiếết sau đây: ¾ C? ??ấu tr? ?c IF (N Nếu) C? ??ấu trúc

Ngày đăng: 11/05/2021, 01:47

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

Tài liệu liên quan