Giáo trình Lập trình căn bản - Nghề: Kỹ thuật sửa chữa, lắp ráp máy tính - Trình độ: Cao đẳng liên thông - Trường Cao đẳng nghề Vĩnh Long

pdf 49 trang Gia Huy 17/05/2022 1700
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình căn bản - Nghề: Kỹ thuật sửa chữa, lắp ráp máy tính - Trình độ: Cao đẳng liên thông - Trường Cao đẳng nghề Vĩnh Long", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_lap_trinh_can_ban_nghe_ky_thuat_sua_chua_lap_rap.pdf

Nội dung text: Giáo trình Lập trình căn bản - Nghề: Kỹ thuật sửa chữa, lắp ráp máy tính - Trình độ: Cao đẳng liên thông - Trường Cao đẳng nghề Vĩnh Long

  1. ỦY BAN NHÂN DÂN TỈNH VĨNH LONG TRƯỜNG CAO ĐẲNG NGHỀ VĨNH LONG GIÁO TRÌNH MÔN HỌC: LẬP TRÌNH CĂN BẢN NGHỀ: KỸ THUẬT SỬA CHỮA, LẮP RÁP MÁY TÍNH TRÌNH ĐỘ: CAO ĐẲNG LIÊN THÔNG (Ban hành theo Quyết định số 172 /QĐ - CĐNVL ngày 15 tháng 04 năm 2020 của Hiệu trưởng trường Cao đẳng nghề Vĩnh Long (Lưu hành nội bộ) NĂM 2020
  2. ỦY BAN NHÂN DÂN TỈNH VĨNH LONG TRƯỜNG CAO ĐẲNG NGHỀ VĨNH LONG Tác giả biên soạn: ThS. Nguyễn Hồng Thắm GIÁO TRÌNH MÔN HỌC: LẬP TRÌNH CĂN BẢN NGHỀ: KỸ THUẬT SỬA CHỮA, LẮP RÁP MÁY TÍNH TRÌNH ĐỘ: CAO ĐẲNG LIÊN THÔNG NĂM 2020
  3. LỜI MỞ ĐẦU  Để đáp ứng nhu cầu học tập của các em học sinh, nhất là học sinh chuyên ngành tin học, Khoa Công nghệ thông in Trường Cao đẳng nghề Vĩnh Long chúng tôi đã tiến hành biên soạn các giáo trình trong chương trình học. Giáo trình này cũng được biên soạn dựa trên kinh nghiệm giảng dạy nhiều năm môn Lập Trình Căn Bản của chúng tôi. Mục tiêu của nó nhằm giúp các em học sinh chuyên ngành có một tài liệu cô đọng dùng làm tài liệu học tập, nhưng chúng tôi cũng không loại trừ toàn bộ các đối tượng khác tham khảo. Chúng tôi nghĩ rằng các em học sinh, sinh viên không chuyên tin và những người quan tâm tới lập trình căn bản sẽ tìm được trong này những điều hữu ích. Mặc dù đã rất cố gắng nhiều trong quá trình biên soạn giáo trình nhưng chắc chắn giáo trình sẽ còn nhiều thiếu sót và hạn chế. Rất mong nhận được sự đóng góp ý kiến quý báu của học sinh và các bạn đọc để giáo trình ngày một hoàn thiện hơn. Tác giả.
  4. MỤC LỤC  BÀI MỞ ĐẦU: TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH 1 1. Giới thiệu các khái niệm cơ bản về ngôn ngữ lâp trình 1 1.1. Lập trình máy tính 1 1.2. Bài toán 1 1.3. Thuật toán 1 2. Giới thiệu lịch sử phát triển và ứng dụng của ngôn ngữ lập trình 3 3. Xây dựng thuật toán bằng sơ đồ khối 5 4. Làm quen môi trường phát triển phần mềm 6 4.1. Giao diện chương trình Turbo C 6 4.2. Các phím thường hay sử dụng đối với chương trình C 6 4.3. Thoát khỏi chương trình C 7 5. Sử dụng sự trợ giúp từ help file về cú pháp lệnh, về cú pháp hàm, các chương trình mẫu 7 5.1. Trợ giúp từ help file về cú pháp lệnh, về cú pháp hàm 7 5.2. Các chương trình mẫu 7 BÀI TẬP 12 CHƯƠNG 1: GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH C 13 1. Giới thiệu 13 2. Bộ từ vựng của C 14 1.1. Các ký tự dùng trong C 14 1.2. Từ khóa (Keyword) 14 1.3. Tên hay định danh (Identifier) 15 1.4. Dấu chấm phẩy (;) 15 1.5. Câu chú thích 15 3. Cấu trúc một chương trình C 16 BÀI TẬP 17 CHƯƠNG 2: CÁC KIỂU DỮ LIỆU CƠ SỞ 18 1. Các kiểu dữ liệu cơ sở 18 1.1. Kiểu số nguyên - int 18 1.2. Kiểu số thực - float 18 1.3. Kiểu luận lý 19 1.4. Kiểu ký tự - char 19 2. Biến, hằng, câu lệnh và biểu thức 19 2.1. Hằng ký tự và hằng chuỗi 19 2.2. Biến và lệnh gán giá trị cho biến 21
  5. 2.3. Hàm 21 2.4. Các phép toán 22 2.5. Biểu thức 26 2.6. Các lệnh và khối lệnh 26 3. Câu lệnh nhập xuất 27 3.1. Nhập dữ liệu từ bàn phím 27 3.2. Xuất dữ liệu ra màn hình 27 BÀI TẬP 30 CHƯƠNG 3: CÁC CẤU TRÚC ĐIỀU KHIỂN 32 1. Khái niệm về lệnh cấu trúc 32 2. Các lệnh cấu trúc lựa chọn 32 2.1. Câu lệnh điều kiện 32 2.2. Câu lệnh rẽ nhánh 34 3. Các câu lệnh lặp 36 3.1. Câu lệnh for 36 3.2. Câu lệnh while 37 3.3. Câu lệnh do while 38 3.4. So sánh sự khác nhau của các vòng lặp 39 4. Các lệnh chuyển điều khiển 39 4.1. Câu lệnh break 39 4.2.Câu lệnh continue 40 4.3.Câu lệnh Goto 40 4.4. Hàm Exit 40 BÀI TẬP 42 CHƯƠNG 4: HÀM 44 1. Khái niệm chương trình con 44 1.1. Cú pháp 44 1.2. Một số lưu ý 45 2. Cấu trúc chương trình có sử dụng chương trình con 46 3. Các hàm trong ngôn ngữ lập trình 49 4. Tham trị và tham biến 50 4.1. Tham trị 50 4.2 Tham biến 50 5. Biến toàn cục và biến địa phương 51 5.1. Biến toàn cục 51 5.2. Biến địa phương 53 BÀI TẬP 54
  6. CHƯƠNG 5: DỮ LIỆU KIỂU MẢNG (ARRAY), CHUỖI KÝ TỰ (STRING) VÀ BẢN CHI (STRUCT) 55 1. Dữ liệu kiểu mảng 55 1.1. Khái niệm 55 1.2. Khai báo mảng 55 1.3. Gán giá trị cho mảng 56 1.4. Một số bài toán trên mảng 57 1.5. Mảng nhiều chiều 59 2. Dữ liệu kiểu chuỗi ký tự 63 2.1. Khái niệm 63 2.2. Khai báo chuỗi 63 2.3. Các thao tác trên chuỗi 64 2.4. Nhập, xuất chuỗi 65 2.5. Các hàm làm việc với chuỗi 66 3. Dữ liệu kiểu bản ghi 68 3.1. Khái niệm 68 3.2. Khai báo kiểu bản ghi 70 3.3. Truy xuất kiểu bản ghi 70 BÀI TẬP 73 TÀI LIỆU THAM KHẢO 77
  7. 1 BÀI MỞ ĐẦU: TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH Mục tiêu − Trình bày được các khái niệm và lịch sử phát triển của ngôn ngữ lập trình; − Nêu được cách xây dựng thuật toán trong ngôn ngữ lập trình; − Xây dựng được thuật toán bằng sơ đồ khối; − Cẩn thận, tự giác trong học tập. Nội dung 1. Giới thiệu các khái niệm cơ bản về ngôn ngữ lâp trình Lập trình là việc sử dụng cấu trúc dữ liệu và các lệnh của ngôn ngữ lập trình cụ thể để mô tả dữ liệu và diễn đạt các thao tác của thuật toán. 1.1. Lập trình máy tính - Gọi tắt là lập trình (programming). - Nghệ thuật cài đặt một hoặc nhiều thuật toán trừu tượng có liên quan với nhau bằng một ngôn ngữ lập trình để tạo ra một chương trình máy tính. 1.2. Bài toán - Là việc nào đó ta muốn máy thực hiện để từ thông tin đưa vào (INPUT) tìm được thông tin ra (OUTPUT) - Ví dụ : Giài phương trình bậc nhất ax + b = 0 INPUT : a, b thuộc R OUTPUT : nghiệm của phương trình ax + b = 0 1.3. Thuật toán - Thuật toán để giải quyết một bài toán là một dãy hữu hạn các thao tác được sắp xếp theo một trình tự xác định sao cho sau khi thực hiện dãy thao tác đó, từ Input của bài toán, ta nhận được Output cần tìm - Ví dụ: Thuật toán giải phương trình: ax + b = 0 (a, b là các số thực) 1.3.1. Các đặc trưng của thuật toán - Dữ liệu đầu vào (Input): Mỗi thuật toán cần có một số (có thể bằng 0) các dữ liệu ban đầu - Kết quả (Output): Thuật toán phải cho ra được kết quả - Tính xác định: Các thao tác phải xác định, không nhập nhằng, lẫn lộn, tùy tiện.
  8. 2 - Tính khả thi: Thuật toán phải có khả năng thực hiện được trong một thời gian hữu hạn. - Tính khách quan: được viết bởi nhiều người trên máy tính nhưng kết quả phải như nhau. - Tính phổ dụng: có thể áp dụng cho một lớp các bài toán có đầu vào tương tự nhau. - Tính kết thúc: hữu hạn các bước tính toán 1.3.2. Các bước xây dựng chương trình Sử dụng ngôn ngữ tự nhiên Sử dụng mã giả - Vay mượn ngôn ngữ nào đó (ví dụ Pascal) để biểu diễn thuật toán.
  9. 3 - Cài đặt thuật toán bằng C/C++ 2. Giới thiệu lịch sử phát triển và ứng dụng của ngôn ngữ lập trình Kể từ khi ra đời năm 1837, máy tính dần có tốc độ nhanh hơn và cũng đồng nghĩa với việc phải làm nhiều việc hơn. Để có thể đáp ứng những điều này, các ngôn ngữ lập trình cũng phải phát triển theo để đơn giản hơn cho lập trình viên những cũng vẫn phải đáp ứng được các yêu cầu phức tạp của chương trình. Những năm 1950 Autocode (1952): Đây là tập hợp một loạt những hệ thống ngôn ngữ lập trình đơn giản được phát triển vào những năm 50 cho hệ thống máy tính kỹ thuật số tại đại học Manchester, Cambridge và London và được coi là ngôn ngữ lập trình chính thức đầu tiên. Autocode được phát triển bởi Alick Glennie và rất được phổ biến vào thời gian này. Những năm 1970 Pascal (1970): đây là ngôn ngữ được đặt theo tên nhà toán học người Pháp Blaise Pascal. Ngôn ngữ này được sáng tạo bởi Niklaus Wirth cho phép người dùng có thể tự xác định dạng dữ liệu của mình theo kiểu danh sách, sơ đồ cây hay đồ thị.
  10. 4 C (1972): Đây là một trong những ngôn ngữ lập trình được sử dụng nhiều nhất mọi thời đại. C được thế kế để lập trình theo cấu trúc. Phần mã nguồn của ngôn ngữ này ở dạng văn bản không định dạng và dùng những dấu chấm, phẩy để thiển hiện cấu trúc lệnh. Những năm 80 C++ (1980): ngôn ngữ này chủ yếu để lập trình hệ thống nhưng đến nay đã mở rộng ra cho cả những máy tính cá nhân thông thường, máy chủ để tạo ra những ứng dụng thông thường. Hầu hết các câu lệnh của ngôn ngữ này được kế thừa từ C và cũng vẫn giữ nguyên khả năng hướng đối tượng và lập trình tổng quát. Perl (1987): thuộc nhóm ngôn ngữ lập trình bậc cao. Ngôn ngữ này vay mượn không ít tính năng từ những ngôn ngữ khác như C, AWK và sad. Ban đầu nó thô sơ đến mức hướng dẫn sử dụng chỉ có 1 trang. Thế nhưng đến nay nó đã có thêm nhiều phiên bản và nhiều thay đổi so với ban đầu. Từ 1990 đến năm 2000 Python (1991): ngôn ngữ này được thiết kế cực kỳ đơn giản, thậm chí là có khả năng đọc được như bảng chữ cái. Triết lý của những nhà phát triển ngôn ngữ nay đó là làm cho mã nguồn ngắn hơn, không dài và phức tạp như C++ hay Java. Java (1995): ngôn ngữ này được phát triển vớ Với mục tiêu càng ít phụ thuộc vào khả năng vận hành thực tế của thiết bị càng tốt. Nói cách khác là nó chỉ cần viết một lần trên một máy, và chạy được trên mọi máy khác. Chính vì vậy mà đến nay, từ máy tính để bàn đến điện thoại di động Symbian S40 ta đều có thể gặp các chương trình Java. PHP (1995): đây là ngôn ngữ sử dụng thực thi trên máy chủ và dùng cho việc phát triển web. Nó thực hiện các yêu cầu của người dùng sau đó trả kết quả lên trình duyệt qua việc kết hợp với HTML tạo ra giao diện các trang web hiện nay. Khi mới xuất hiện, PHP không được định nghĩa là một ngôn ngữ lập trình, tuy nhiên qua thời gian, ngôn ngữ này đã có một lượng người dùng đông đảo và vẫn là sự lựa chọn của nhiều nhà phát triển web ngày nay. Những năm 2000 C# (2001): Visual Basic .NET (2001): Đây là ngôn ngữ được phát triển trên nền Visual Basic và thực hiện trên nền tảng .NET framwork. Đây là lý do vì sao khi cài đặt một số chương trình sẽ có yêu cầu cài đặt thêm .NET framwork phiên bản nào đó. Nó sử dụng các câu lệnh để xác định hành động của chương trình giống như Visual C#. Từ 2010 đến nay Swift (2014): Đây là ngôn ngữ được phát triển bởi Apple cho những nhà phát triển iOS và OSX (hệ điều hành Mac). Ngôn ngữ “trẻ nhất” này được hãng giới thiệu tại sự kiện WWDC 2014. Ngôn ngữ này có ưu điểm là mã nguồn rất ngắn và dễ đọc. Sau
  11. 5 khi viết, các chương trình có thể được kiểm tra rất nhanh và các bài kiểm tra cũng sẽ ở cấp độ cao hơn. Ngoài ra đồ hoạ các chương trình dùng ngôn ngữ này cũng sẽ đẹp hơn nhưng yêu cầu phần cứng sẽ thấp hơn. Tương lai của lập trình Các ngôn ngữ lập trình ngày càng được phát triển do đó lập trình viên cũng phải liên tục cập nhật bản thân để có thể bắt kịp xu thế này. Việc làm liên quan đến ngành lập trình cũng đang được dự báo tăng trung bình 8% ở mỗi nước cũng như mức lương trung bình cho công việc này đang ở mức 74.000 USD một năm. Số lượng những nhà phát triển hiện nay cũng đang tăng lên, dần vượt nhu cầu dự kiến số dự án phát triển sẽ lăng lên 22% đến năm 2022. Do đó mức lương cho những người làm công việc này có thể lên mức 93,350 USD một năm. 3. Xây dựng thuật toán bằng sơ đồ khối Lưu đồ thuật toán là công cụ dùng để biểu diễn thuật toán, mô tả nhập (input), dữ liệu xuất (output) và luồng xữ lý thông qua các ký hiệu hình học. Công cụ này rất thích hợp để bạn học cách tư duy phân tích bài toán. Các ký hiệu Để vẽ lưu đồ thuật toán, bạn cần nhớ và tuân thủ các ký hiệu sau đây: Khối giới hạn Chỉ thị bắt đầu và kết thúc Khối vào ra Nhập/ Xuất dữ liệu Khối lựa chọn Tùy điều kiện sẽ rẽ nhánh Khối thao tác Ghi thao tác cần thực hiện Đường đi Chỉ hướng thao tác tiếp theo Lưu đồ thuật toán được duyệt lưu đồ thuật toán theo trình tự sau: − Duyệt từ trên xuống. − Duyệt từ trái sang phải. Để cho dễ hình dung, chúng ta sẽ tìm hiểu các bài toàn sau: Ví dụ: Giải phương trình bậc nhất ax + b = 0
  12. 6 4. Làm quen môi trường phát triển phần mềm 4.1. Giao diện chương trình Turbo C Chạy Turbo C cũng giống như chạy các chương trình khác trong môi trường DOS hay Windows, màn hình sẽ xuất hiện menu của Turbo C có giao diện như sau: Giao diện Turbo C 4.2. Các phím thường hay sử dụng đối với chương trình C - Alt-Enter: phóng to/thu nhỏ màn hình C - F5: phóng to cửa sổ của một file chương trình *.cpp hoặc *.c - F6: chuyển đổi giữa các cửa sổ file chương trình. - F2: lưu một file chương trình. - F3: mở một cửa sổ mới để tạo một file chương trình. - Alt-F5: xem kết quả chạy chương trình. - F7/F8: chạy chương trình từng bước. - F9: biên dịch chương trình. - Ctrl-F9: chạy chương trình.
  13. 7 4.3. Thoát khỏi chương trình C Có hai cách cơ bản để thoát khỏi C: - Nhấn tổ hợp phím ALT+X hoặc - Nhấn tổ hợp phím Alt + F sau đó dùng phím mũi tên di đến mục Quit và ấn Enter. 5. Sử dụng sự trợ giúp từ help file về cú pháp lệnh, về cú pháp hàm, các chương trình mẫu 5.1. Trợ giúp từ help file về cú pháp lệnh, về cú pháp hàm Trong quá trình soạn thảo chương trình chúng ta có thể sử dụng các phím sau: Các phím xem thông tin trợ giúp: - F1: Xem toàn bộ thông tin trong phần trợ giúp. - Ctrl-F1: Trợ giúp theo ngữ cảnh (tức là khi con trỏ đang ở trong một lệnh hoặc hàm nào đó, gõ phím Ctrl-F1 thì chúng ta sẽ có được các thông tin về cú pháp lệnh hoặc cú pháp hàm) Trên menu Help bao gồm các lệnh gọi trợ giúp khi người lập trình cần giúp đỡ một số vấn đề nào đó như: Cú pháp câu lệnh, cách sử dụng các hàm có sẵn - Lệnh Contents: Hiển thị toàn bộ nội dung của phần help. - Lệnh Index : Hiển thị bảng tìm kiếm theo chỉ mục. - Các lệnh còn lại, chúng ta sẽ tìm hiểu khi thực hành trên máy. 5.2. Các chương trình mẫu 5.2.1. Tạo một file chương trình trong C Để tạo một file chương trình trong C, sau khi đã mở C xong nhấp chuột menu File →New (hoặc nhấn phím F3), màn hình xuất hiện như sau: Màn hình soạn thảo Ví dụ: Tạo một chương trình lưu với tên Vidu.cpp để xuất ra câu Xin chao!!!
  14. 8 #include #include void main() //dấu mở ngoặc nhọn ở dưới { printf(“Xin chao!!!”); getch(); } Màn hình soạn thảo Sau khi soạn thảo xong ta tiến hành: - Nhấn F9: biên dịch, nếu báo: Error : chương trình bị lỗi, tiến hành sữa lỗi xem mục 2. Warning : cảnh báo không nhất thiết phải sữa lỗi xem mục 3. Success : Press any key : chương trình viết đúng cú pháp có thể chạy được, nhấn tổ hợp phím CTRL – F9 để chạy chương trình. Màn hình báo biên dịch thành công Màn hình màu đen sẽ xuất hiện và hiển thị ra câu thông báo ‘Xin chao!!!’ theo như yêu cầu: Màn hình hiển thị kết quả chương trình Gõ Enter để trở về giao diện xanh của chương trình. 4.2.2. Các lỗi và cách sửa lỗi Dưới đây là các lỗi thông dụng hay gặp phải khi sử dụng phần mềm C, và vị trí sai được phát hiện chính là dòng được tô đậm màu xanh:
  15. 9 Lỗi không khai báo thư viện cho các câu lệnh được sử dụng trong file chương trình Thông báo này thường gặp là Function ‘tên câu lệnh’ should have a prototype như hình dưới, có nghĩa là câu lệnh ‘tên câu lệnh’ được sử dụng trong chương trình nhưng chưa khai báo thư viện chứa câu lệnh này. (hoặc gõ sai tên câu lệnh) Màn hình lỗi thiếu thư viện Lỗi không chỉ đúng đường dẫn đến các tệp thư viện chương trình C Câu thông báo lỗi thường gặp là Unable to open include file ‘stdio.h’ hoặc conio.h’ như hình vẽ dưới, phần mềm C không tìm thấy các file thư viện mà chương trình có sử dụng. Màn hình lỗi không chỉ dẫn đúng đường dẫn đến thư viện Lỗi thiếu dấu chấm phẩy (dấu kết thúc mỗi câu lệnh trong C) Câu thông báo lỗi thường gặp là Statement missing; như hình dưới, có nghĩa là thiếu một dấu chấm phẩy ở một dòng lệnh nào đó trong chương trình.
  16. 10 Màn hình lỗi thiếu dấu ; Các cảnh báo (Warning) Các cảnh báo thường không ảnh hưởng đến việc chạy chương trình, tuy nhiên khi có cảnh báo thì chúng ta cũng nên điều chỉnh các dòng lệnh để khắc phục cảnh báo đó. Cảnh báo ‘Function should return a value’ Cảnh báo này cho biết rằng trong chương trình có sử dụng hàm (ví dụ hàm main()) nhưng không khai báo kiểu giá trị trả về của hàm như hình sau: Màn hình lỗi cảnh báo không khai báo kiểu giá trị trả về Cảnh báo ‘ i assigned a value that is never used’ Cảnh báo này cho biết trong chương trình có khai báo biến, gán giá trị cho biến nhưng lại không sử dụng biến này khắc phục cảnh báo này bằng cách xóa đi biến được khai đó.
  17. 11 Màn hình cảnh báo khai báo biến, gán trị nhưng không sử dụng Chương trình chạy vô hạn Lỗi này xảy ra khi đã biên dịch chương trình (ấn F9) thành công và sau khi ấn Ctrl-F9 để chạy chương trình thì nó chạy vô hạn không thể thoát ra trở lại cửa sổ chương trình được sau khi ấn Enter nhiều lần. - Để tạm dừng chương trình và trở về cửa sổ chương trình, gõ tổ hợp phím Ctrl- Break → sau đó gõ phím Ctrl-F2 để làm mất dòng được tô màu xanh đậm. - Tiến hành chỉnh sửa code chương trình và lại lưu, biên dịch và chạy chương trình. Không xem được kết quả chạy chương trình Lỗi này xảy ra sau khi ấn tổ hợp phím Ctrl-F9 mà vẫn không xem được kết quả chạy chương trình, đồng thời vẫn giữ nguyên cửa sổ file chương trình. - Khắc phục bằng cách ấn tổ hợp phím Alt-F5 để xem kết quả chạy chương trình hoặc vào chỉnh sửa code (thêm dòng getch() ở kề cuối chương trình).
  18. 12 BÀI TẬP Lý thuyết 1. Thuật toán là gì? Trình bày các tính chất quan trọng của một thuật toán? 2. Các bước xây dựng chương trình? 3. Các cách biểu diễn thuật toán? Ưu và khuyết điểm của từng phương pháp? Cho ví dụ minh họa Thực hành 4. Nhập năm sinh của một người. Tính tuổi người đó. 5. Nhập 2 số a và b. Tính tổng, hiệu, tích và thương của hai số đó. 6. Nhập tên sản phẩm, số lượng và đơn giá. Tính tiền và thuế giá trị gia tăng phải trả, biết: a. tiền = số lượng * đơn giá b. thuế giá trị gia tăng = 10% tiền 7. Nhập điểm thi và hệ số 3 môn Toán, Lý, Hóa của một sinh viên. Tính điểm trung bình của sinh viên đó. 8. Nhập bán kính của đường tròn. Tính chu vi và diện tích của hình tròn đó. 9. Nhập vào số xe (gồm 4 chữ số) của bạn. Cho biết số xe của bạn được mấy nút? 10. Nhập vào 2 số nguyên. Tính min và max của hai số đó.
  19. 13 CHƯƠNG 1: GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH C Mục tiêu − Giới thiệu được ngôn ngữ lập trình C; − Nêu được bộ từ vựng của C; − Trình bày được cấu trúc một chương trình C; − Chạy được chương trình trong C; − Thực hiện các thao tác an toàn với máy tính. Nội dung 1. Giới thiệu C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển các ứng dụng. Vào những năm cuối thập kỷ 60 đầu thập kỷ 70 của thế kỷ XX, Dennish Ritchie (làm việc tại phòng thí nghiệm Bell) đã phát triển ngôn ngữ lập trình C dựa trên ngôn ngữ BCPL (do Martin Richards đưa ra vào năm 1967) và ngôn ngữ B (do Ken Thompson phát triển từ ngôn ngữ BCPL vào năm 1970 khi viết hệ điều hành UNIX đầu tiên trên máy PDP-7) và được cài đặt lần đầu tiên trên hệ điều hành UNIX của máy DEC PDP-11. Năm 1978, Dennish Ritchie và B.W Kernighan đã cho xuất bản quyển “Ngôn ngữ lập trình C” và được phổ biến rộng rãi đến nay. Lúc ban đầu, C được thiết kế nhằm lập trình trong môi trường của hệ điều hành Unix nhằm mục đích hỗ trợ cho các công việc lập trình phức tạp. Nhưng về sau, với những nhu cầu phát triển ngày một tăng của công việc lập trình, C đã vượt qua khuôn khổ của phòng thí nghiệm Bell và nhanh chóng hội nhập vào thế giới lập trình để rồi các công ty lập trình sử dụng một cách rộng rãi. Sau đó, các công ty sản xuất phần mềm lần lượt đưa ra các phiên bản hỗ trợ cho việc lập trình bằng ngôn ngữ C và chuẩn ANSI C cũng được khai sinh từ đó. Ngôn ngữ lập trình C là một ngôn ngữ lập trình hệ thống rất mạnh và rất “mềm dẻo”, có một thư viện gồm rất nhiều các hàm (function) đã được tạo sẵn. Người lập trình có thể tận dụng các hàm này để giải quyết các bài toán mà không cần phải tạo mới. Hơn thế nữa, ngôn ngữ C hỗ trợ rất nhiều phép toán nên phù hợp cho việc giải quyết các bài toán kỹ thuật có nhiều công thức phức tạp. Ngoài ra, C cũng cho phép người lập trình tự định nghĩa thêm các kiểu dữ liệu trừu tượng khác. Tuy nhiên, điều mà người mới vừa học lập trình C thường gặp “rắc rối” là “hơi khó hiểu” do sự “mềm dẻo” của C. Dù vậy, C được phổ biến khá rộng rãi và đã trở thành một công cụ lập trình khá mạnh, được sử dụng như là một ngôn ngữ lập trình chủ yếu trong việc xây dựng những phần mềm hiện nay.
  20. 14 Ngôn ngữ C có những đặc điểm cơ bản sau: - Tính cô đọng (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng hầu hết đều được biểu diễn bằng những chuỗi ký tự ngắn gọn. - Tính cấu trúc (structured): C có một tập hợp những chỉ thị của lập trình như cấu trúc lựa chọn, lặp Từ đó các chương trình viết bằng C được tổ chức rõ ràng, dễ hiểu. - Tính tương thích (compatible): C có bộ tiền xử lý và một thư viện chuẩn vô cùng phong phú nên khi chuyển từ máy tính này sang máy tính khác các chương trình viết bằng C vẫn hoàn toàn tương thích. - Tính linh động (flexible): C là một ngôn ngữ rất uyển chuyển và cú pháp, chấp nhận nhiều cách thể hiện, có thể thu gọn kích thước của các mã lệnh làm chương trình chạy nhanh hơn. - 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 các tập tin đối tượng (object) và liên kết (link) các đối tượng đó lại với nhau thành một chương trình có thể thực thi được (executable) thống nhất. 2. Bộ từ vựng của C 1.1. Các ký tự dùng trong C C là ngôn ngữ lập trình phân biệt chữ In (Upcase) và chữ thuờng (Lowcase) trong câu lệnh, biến, hằng, kiểu. Các ký tự hợp lệ đuợc liệt kê duới đây: − Bộ chữ cái 26 ký tự Latinh A, B, C Z, a, b, c z − Bộ chữ số thập phân : 0, 1, 2, , 9 − Các ký hiệu toán học thông dụng : + - * / = ( ) − Các ký tự đặc biệt : . , : ; [ ] % \ # $ ‘, gạch nối _, ‘ ’ 1.2. Từ khóa (Keyword) Từ khóa là các từ dành riêng trong ngôn ngữ, mỗi từ có chức năng nhất định và khi sử dụng phải viết đúng cú pháp. Từ khóa phân biệt chữ hoa chữ thuờng. Ngoài ra, không thể sử dụng từ khóa để đặt tên cho các biến, hàm, tên chương trình con. Từ khóa được chia thành các loại sau đây:
  21. 15 Chú ý: Trong ngôn ngữ lập trình C từ khóa bao giờ cũng được viết bằng chữ thường. 1.3. Tên hay định danh (Identifier) Tên hay định danh là một dãy ký tự dùng để chỉ tên một hằng số, hằng ký tự, tên một biến, một kiểu dữ liệu, một hàm. Tên không được trùng với các từ khóa và được tạo thành từ các chữ cái và các chữ số nhưng bắt buộc chữ đầu phải là chữ cái hoặc dấu gạch duới _. Có thể sử dụng ký tự _ chèn trong tên nhưng không cho phép chèn giữa các khoảng trắng. Tuy nhiên ta nên đặt tên ngắn gọn, dễ nhớ và đầy đủ ý nghĩa. Ví dụ: Các tên hợp lệ: GiaiPhuongTrinh, Bai_Tap1, Các tên không hợp lệ: 1A, Giai Phuong Trinh, Ngôn ngữ C phân biệt chữ hoa chữ thuờng, do đó các tên sau đây có ý nghĩa khác nhau: BaiTap, baitap, BAITAP 1.4. Dấu chấm phẩy (;) Dấu chấm phẩy ; được sử dụng để phân cách các câu lệnh trong C. Ví dụ: printf(“Nhập a : ”); scanf(“%d”, &a); 1.5. Câu chú thích C cho phép nguời lập trình chèn vào chương trình các câu ghi chú ở bất kỳ vị trí nào nhằm mục đích làm sáng tỏ thêm cấu trúc của chương trình mà không làm ảnh huởng đến các phần khác. Các câu ghi chú có thể đuợc ghi trên một dòng hoặc trên các dòng khác nhau miễn là chúng đuợc bao bởi dấu /* ở đầu và dấu */ ở cuối. Ví dụ: /* Chương trình giải phương trình bậc nhất ax + b = 0 */ /* Họ và Tên : Nguyễn Văn A MSSV : 0712001 */ Một số trình biên dịch sau này cho phép sử dụng hai dấu xổ chéo // thay cho việc dùng /* */ đối với các ghi chú trên 1 dòng. Ví dụ: // Chương trình giải phương trình bậc nhất ax + b = 0
  22. 16 3. Cấu trúc một chương trình C Chương trình được viết bằng ngôn ngữ C gồm các phần chính sau đây: - Phần khai báo chèn các tập tin tiêu đề (header file) vào chương trình. Đây là các tập tin chứa các định nghĩa cần thiết cho trình biên dịch. Có hai cách để xác định tập tin theo sau chỉ thị #include: bao tên tập tin bởi cặp dấu đối với tập tin thư viện như stdio.h, conio.h hoặc cặp dấu “ ” đối với các tập tin tiêu đề do người lập trình tạo ra. - Phần khai báo các biến toàn cục hoặc các hàm được sử dụng trong chương trình. Thông thường người ta thường đặt các nguyên mẫu hàm (function prototype) ở đây còn phần mô tả hàm được đặt ở dưới cùng. Phần định nghĩa hàm chính. Hàm này có tên là main và là thành phần duy nhất luôn phải có trong một chương trình C. Thông thường chương trình sẽ bắt đầu bằng cách thực hiện các dòng lệnh trong hàm main này. Ví dụ: // Phần khai báo chèn các tập tin tiêu đề #include #include // Phần khai báo biến toàn cục, nguyên mẫu hàm int x, y; void Nhap(int &); // Prototype hàm Nhap int TinhTong(int, int); // Protytype ham TinhTong // Phần định nghĩa hàm main void main() { int x, y, tong; Nhap(x); Nhap(y); tong = TinhTong(x, y); printf(“Tong cua x va y la %d.”, tong); }
  23. 17 // Phần mô tả các hàm void Nhap(int &n) { printf(“Nhap mot so nguyen: ”); scanf(“%d”, &n); } int TinhTong(int x, int y) { return x + y; } BÀI TẬP 1. Tên (định danh) nào sau đây đặt không hợp lệ, tại sao? 2. Tin hoc co SO A, 1BaiTapKHO 3. THucHaNH, NhapMon_L@pTrinH 4. Câu ghi chú dùng để làm gì? Cách sử dụng ra sao? Cho ví dụ minh họa. 5. Trình bày cấu trúc của một chương trình C. Giải thích ý nghĩa của từng phần trong cấu trúc.
  24. 18 CHƯƠNG 2: CÁC KIỂU DỮ LIỆU CƠ SỞ Mục tiêu − Trình bày được các kiểu dữ liệu; − Trình bày và vận dụng đượccác loại biến, hằng biểu thức cho từng chương trình cụ thể; − Trình bày và vận dụng được các lệnh nhập xuất; − Chạy được chương trình trong C; − Thực hiện các thao tác an toàn với máy tính. Nội dung 1. Các kiểu dữ liệu cơ sở Turbo C có 4 kiểu cơ sở như sau: − Kiểu số nguyên: giá trị của nó là các số nguyên như 2912, -1706, − Kiểu số thực: giá trị của nó là các số thực như 3.1415, 29.12, -17.06, − Kiểu luận lý: giá trị đúng hoặc sai. − Kiểu ký tự: 256 ký tự trong bảng mã ASCII. 1.1. Kiểu số nguyên - int Ðây là các kiểu dữ liệu mà giá trị của nó là số nguyên. Dữ liệu kiểu số nguyên lại chia ra thành hai loại như sau: - Các số nguyên có dấu (signed) để chứa các số nguyên âm hoặc dương. Kiểu Độ lớn Miền giá trị (Type) (Byte) (Range) char 1 -128 127 int 2 32.768 32.768 short 2 -32.768 32.768 long 4 -2.147.483.648 2.147.483.647 - Các số nguyên không dấu (unsigned) chứa các số nguyên dương (kể cả số 0). Kiểu Độ lớn Miền giá trị (Type) (Byte) (Range) unsigned char 1 0 255 unsigned int 2 0 65.535 unsigned short 2 0 65.535 unsigned long 4 0 4.294.967.295 1.2. Kiểu số thực - float Ðây là các kiểu dữ liệu mà giá trị của nó là số thực. Trong C định nghĩa các kiểu số thực chuẩn như sau:
  25. 19 Kiểu Độ lớn Miền giá trị (Type) (Byte) (Range) float 4 3.4*10-38 3.4*1038 double 8 1.7*10-308 1.7*10308 (*) Độ chính xác đơn (Single-precision) chính xác đến 7 số lẻ. ( ) Độ chính xác kép (Double-precision) chính xác đến 19 số lẻ. 1.3. Kiểu luận lý Đặc điểm - Trong C không hỗ trợ kiểu luận lý tuờng minh mà chỉ ngầm hiểu một cách không tường minh như sau: • false (sai) là giá trị 0. • true (đúng) là giá trị khác 0, thường là 1. - C++: bool Ví dụ - 0 (false), 1 (true), 2 (true), 2.5 (true) - 1 > 2 (0, false), 1 < 2 (1, true) 1.4. Kiểu ký tự - char Ðây chính là kiểu dữ liệu số nguyên char có độ lớn 1 byte và miền giá trị là 256 ký tự trong bảng mã ASCII. Đặc điểm - Tên kiểu: char - Miền giá trị: 256 ký tự trong bảng mã ASCII. - Chính là kiểu số nguyên do: • Lưu tất cả dữ liệu ở dạng số. • Không lưu trực tiếp ký tự mà chỉ lưu mã ASCII của ký tự đó. Ví dụ - Lưu số 65 tương đương với ký tự ‘A’ - Lưu số 97 tương đương với ký tự ‘a’. 2. Biến, hằng, câu lệnh và biểu thức 2.1. Hằng ký tự và hằng chuỗi Hằng số cũng giống như biến nhưng nội dung của nó không thể thay đổi trong quá trình thực hiện chương trình. Trong C, ta có hai kiểu hằng số, đó là hằng thường (literal constant) và hằng ký hiệu (symbol constant). 2.1.1. Hằng thường Cách khai báo hằng này thường được dùng để khởi tạo giá trị cho biến. Cú pháp khai báo hằng thường
  26. 20 = ; Những hằng số nguyên có thể được viết theo 3 dạng sau: - Một hằng số bắt đầu với bất kỳ một ký số nào khác 0 sẽ được hiểu là một số nguyên ở hệ thập phân. - Một hằng số bắt đầu với số 0 sẽ được hiểu là một số nguyên ở hệ bát phân. - Một hằng số bắt đầu với 0x hoặc 0X sẽ đuợc hiểu là một số nguyên ở hệ thập lục phân. Ví dụ: int a = 1506; // 150610 int b = 01506; // 15068 int c = 0x1506; // 150616 int d = 0X1506; // 150616 Những hằng số chấm động có thể viết theo ký hiệu khoa học. Ví dụ: float a = 1.76E2; // = 1.76*102 = 176 float b = 29.12e2; // = 29.12*102 = 2912 float c = 15.6e-3; // = 15.6*10-3 = 0.0156 2.1.2. Hằng ký hiệu Hằng ký hiệu là một hằng được gán cho một cái tên trong chương trình. Khác với hằng thuờng, hằng ký hiệu không thể thay dổi giá trị trong quá trình thực hiện chương trình. Có hai cách để khai báo hằng ký hiệu như sau: - Sử dụng chỉ thị #define Cú pháp khai báo hằng ký hiệu #define Ví dụ: #define MAX 100 #define PI 3.14 Dòng #define không kết thúc bằng dấu chấm phẩy vì nó chỉ là một chỉ thị tiền xử lý chứ không phải một câu lệnh. Cách làm này thực ra là thay thế cụm từ này bằng cụm từ kia. Chỉ thị #define có thể đặt ở bất cứ đâu trong chương trình nhưng thường được nhóm lại ở phần đầu chương trình. - Sử dụng từ khóa const Cách khai báo hằng này giống với cách khai báo hằng thường (tức là phải xác định kiểu của hằng). Ví dụ: const int max = 100; const float PI = 3.14;
  27. 21 2.2. Biến và lệnh gán giá trị cho biến Biến là một vùng nhớ có kích thước và có một địa chỉ nhất định nằm trong bộ nhớ RAM. Biến dùng để lưu giữ một dữ liệu đầu vào, đầu ra hoặc một kết quả trung gian trong quá trình làm việc. Dữ liệu được lưu trong biến nên cách tổ chức thông tin trong biến là kiểu của dữ liệu. Nội dung của biến có thể thay đổi trong quá trình làm việc. Ðể phân biệt các biến với nhau, mỗi biến sẽ được đặt một tên theo quy tắc đặt định danh và được gọi là định danh biến (Variable Indentifier). Ví dụ: i, j, dem1, TONG_CONG, KetQua Bất kỳ một biến nào khi sử dụng trong chương trình đều phải được khai báo như sau: Cú pháp khai báo biến ; , ; Các biến có cùng kiểu có thể khai báo chung và cách nhau bằng dấu phẩy. Các biến khác kiểu nhau được khai báo cách nhau bằng dấu chấm phẩy. Ví dụ: int i, j, k; unsigned char dem; float ketqua, delta; Ðể xác định độ lớn của một biến (số byte mà biến chiếm giữ trong bộ nhớ) chúng ta sử dụng toán tử sau: Toán tử lấy độ lớn của biến int sizeof( ) 2.3. Hàm Trong những chương trình lớn, có thể có những đoạn chương trình viết lặp đi lặp lại nhiều lần, để tránh rườm rà và mất thời gian khi viết chương trình; người ta thường phân chia chương trình thành nhiều module, mỗi module giải quyết một công việc nào đó. Các module như vậy gọi là các hàm. Hàm có thể trả về kết quả thông qua tên hàm hay có thể không trả về kết quả. Ví dụ 1: Hàm max để tìm số lớn giữa 2 số nguyên a, b như sau: int max(int a, int b) { return (a>b) ? a:b; } Ví dụ 2: Chương trình chính (hàm main) dùng để nhập vào 2 số nguyên a, b và in ra màn hình số lớn trong 2 số. #include #include
  28. 22 int max(int a, int b){ return (a>b) ? a:b; } int main(){ int a, b, c; printf("\n Nhap vao 3 so a, b,c "); scanf("%d%d%d",&a,&b,&c); printf("\n So lon la %d",max(a, max(b,c))); getch(); return 0; } 2.4. Các phép toán 2.4.1. Toán tử gán Toán tử gán thường được sử dụng trong lập trình, có tác dụng gán giá trị cho biến. Cú pháp lệnh gán = ; = ; = ; Ví dụ: void main(){ int a, b, thuong; a = 10; // Gan gia tri cho bien b = a; // Gan bien cho bien thuong = a / b; // Gan bieu thuc cho bien } Đặc biệt, có thể sử dụng liên tiếp các phép gán miễn là vế trái phải là biến. Ví dụ: a = b = c = d = e = 156; Câu lệnh trên tương đương với chuỗi câu lệnh gán sau: e = 156; d = e; c = d; b = c; a = b; 2.4.2. Các toán tử toán học Các toán tử toán học thực hiện các phép tính cộng, trừ, nhân, chia. C có 2 toán tử một ngôi và 5 toán tử hai ngôi. Các toán tử một ngôi Ta gọi là các toán tử một ngôi vì nó chỉ có một toán hạng đi theo. Các toán tử này chỉ tác động lên toán hạng là biến, không tác động lên toán hạng là hằng.
  29. 23 Toán tử Ý nghĩa Ví dụ ++ Tăng toán hạng lên một đơn vị x++, ++x Giảm toán hạng xuống một đơn vị x , x Toán tử một ngôi có thể đặt trước hoặc sau toán hạng. Cả hai cách này cho kết quả giống nhau nhưng cách hoạt động khác nhau. Khi đặt trước toán hạng, toán hạng sẽ được tăng (hoặc giảm) trước khi sử dụng và ngược lại. Ví dụ: gán y cho x rồi mới tăng x lên. x = 10; y = x++; // y = 10, x = 11 Ví dụ: tăng x lên rồi mới gán cho y. x = 10; y = ++x; // x = 11, y = 11 Các toán tử hai ngôi Toán tử Ý nghĩa Ví dụ + Cộng hai toán hạng với nhau x + y - Trừ hai toán hạng với nhau x - y * Nhân hai toán hạng với nhau x * y / Chia hai toán hạng với nhau x / y % Lấy số dư của phép chia nguyên x % y Toán tử % chỉ tác động lên hai toán hạng kiểu số nguyên. Đặc biệt, nếu các toán tử này kết hợp với phép gán, ta có thể sử dụng các toán tử gộp +=, –=, *=, /=, %=. Ví dụ: x += y; // Tương đuơng với x = x + y; 2.4.3. Các toán tử trên bit Tác động lên các bit của toán hạng kiểu số nguyên. Toán tử Ý nghĩa Ví dụ & And dãy bit của hai số nguyên x & y | Or dãy bit của hai số nguyên x | y ^ XOr dãy bit của hai số nguyên x ^ y >> Dịch phải n bit x >> n >=, <<=. Ví dụ: x &= y; // Tương đương với x = x & y;
  30. 24 2.4.4. Các toán tử quan hệ Các toán tử quan hệ được sử dụng để so sánh và sẽ cho kết quả là đúng hay true (giá trị 1) hoặc sai hay false (giá trị 0). Toán tử Ý nghĩa Ví dụ = = Toán hạng 1 bằng Toán hạng 2 ? x = = y > TH1 lớn hơn TH2 ? x > y = TH1 lớn hơn hay bằng TH2 ? x >= y 1) || (6 ? : ; Nếu là đúng hay true (khác 0) thì giá trị của toàn bộ biểu thức trên là giá trị của . Ngược lại, nếu là sai hay false (bằng 0) thì giá trị của toàn bộ biểu thức trên là giá trị của .
  31. 25 Ví dụ: x = (2 > 1) ? 3 : 4 ; // x = 3 do 2 > 1 đung y = (2 1 && b < 2;
  32. 26 Tuy phép so sánh thực hiện trước rồi mới tới phép && nhưng ta nên thêm các cặp ngoặc đơn để câu lệnh trở nên dễ hiểu. Ketqua = (a > 1) && (b < 2); 2.5. Biểu thức Biểu thức được tạo thành từ các toán tử (Operator) và các toán hạng (Operand) hay còn gọi là các phép tính. Toán tử tác động lên giá trị của các toán hạng cho kết quả là một giá trị có kiểu nhất định. Toán hạng có thể là: - Một hằng. - Một biến. - Một lời gọi hàm. - Một tập các dữ liệu. - Ép kiểu hay biến đổi kiểu. Toán tử là các phép toán tác động lên các dữ liệu cùng kiểu, bao gồm các loại sau: - Toán tử gán. - Các toán tử số học. - Các toán tử trên bit. - Các toán tử quan hệ. - Các toán tử luận lý. - Toán tử diều kiện. - Toán tử 2.6. Các lệnh và khối lệnh Một câu lệnh (statement) là một chỉ thị trực tiếp, hoàn chỉnh nhằm ra lệnh cho máy tính thực hiện một số tác vụ nhất định. Các câu lệnh có thể viết trên cùng một dòng. Tuy nhiên, để cho rõ ràng và dễ kiểm tra lỗi, mỗi câu lệnh nên đặt trên những dòng khác nhau. Trình biên dịch C sẽ bỏ qua các khoảng trắng (hay tab hoặc dòng trống) chen giữa lệnh. Ví dụ: các lệnh sau đây là tương đương nhau Tong = a + b; tong = a + b; tong = a + b; Tuy nhiên ta nên sử dụng cách thứ hai sẽ làm cho chương trình được trình bày đẹp và dễ đọc hơn.
  33. 27 Có một trường hợp trình biên dịch phải quan tâm đến khoảng trắng, đó là các khoảng trắng trong hằng chuỗi (chuỗi các ký tự). Ví dụ: các hằng chuỗi trong các câu lệnh sau đây là khác nhau printf(“Tin hoc co so A.”); printf(“Tin hoc coso A.”); Nếu chuỗi trong câu lệnh quá dài ta có thể xuống dòng nhưng phải thêm ký hiệu \n Ví dụ: printf(“Tin hoc co so A.”); // Cách 1 printf(“Tin hoc \n co so A.”); // Cách 2 Trong C có hai loại câu lệnh - Câu lệnh đơn: chỉ gồm một câu lệnh. - Câu lệnh phức (còn gọi là khối lệnh): gồm nhiều câu lệnh đơn được nhóm và bao bởi cặp ngoặc nhọn { }. Ví dụ: printf(“THCS A”); // Day la cau lenh don // Duoi day la cau lenh phuc (hay khoi lenh) { printf(“THCS A”); printf(“\nChuong 7.”); } 3. Câu lệnh nhập xuất 3.1. Nhập dữ liệu từ bàn phím Để nhập dữ liệu ra màn hình ta sử thủ tục sau: Hàm nhập dữ liệu từ bàn phím (#include ) scanf( [, , ]); Đối số là tên biến được đặt trước dấu &. Chuỗi định dạng cũng giống như trong lệnh xuất printf nhưng không được có các văn bản thường. Ví dụ: #include void main() { int a, b; scanf(“%d%d”, &a, &b); } Nhập các biến cách nhau khoảng trắng, tab hoặc xuống dòng. 3.2. Xuất dữ liệu ra màn hình Để xuất dữ liệu ra màn hình ta sử dụng hàm sau:
  34. 28 Hàm xuất dữ liệu ra màn hình (#include ) printf( [, , ]); Chuỗi định dạng (được đặt giữa cặp nháy kép “ ”) là cách trình bày thông tin sẽ được xuất. Một chuỗi định dạng có ba thành phần: Văn bản thường (literal text) trong chuỗi định dạng sẽ được xuất y hệt lúc gõ. Ví dụ: Xuất chuỗi Tin hoc co so A và chuỗi Chương 7 ra màn hình. Chuỗi sau xuất ngay sau chuỗi trước. printf(“Tin hoc co so A”); printf(“Chưong 7”); - Ký tự điều khiển (escape sequence) gồm dấu \ và một ký tự. Các ký tự điểu khiển bao gồm: Ký tự điều khiển Ý nghĩa \a Tiếng chuông \b Lùi lại một bước \n Xuống dòng \t Dấu tab \\ In dấu \ \? In dấu ? \“ In dấu “ Ví dụ: printf(“Tin hoc co so A”); printf(“\nChuong 7”); Kết quả: Tin hoc co so A Chuong 7 - Đặc tả (conversion specifier) gồm dấu phần % và một ký tự. Phần này dùng để xác định kiểu của biến muốn xuất. Biến muốn xuất sẽ được đặt ở phần đối số. Nếu muốn xuất nhiều biến thì các biến sẽ được liệt kê cách nhau bằng dấu phẩy. Đặc tả Ý nghĩa Kiểu dữ liệu phù hợp %c Ký tự đơn char %d Số nguyên có dấu int, short, long %f Số thực float, double %s Chuỗi ký tự char[], char* %u Số nguyên không dấu unsigned int/short/long Ví dụ: int a = 2912, b = 1706; printf(“%d cong %d bang %d”, a, b, a + b);
  35. 29 Kết quả: 2912 cong 1706 bang 4618 Lưu ý, thứ tự các đối số phải tương ứng thứ tự các đặc tả và phải chính xác (nghĩa là kiểu dữ liệu nào thì dùng đặc tả đó) nếu không kết quả xuất có thể sẽ không như ý muốn. Thông thường, khi xuất các dữ liệu kiểu số (số nguyên, số thực) ta có nhu cầu định dạng các thể hiện thông tin ra màn hình do cách xuất thông thường không đẹp mắt và khó đọc. Ví dụ: #include void main() { int a = 2912, b = 176; float c = 176.85; printf(“%d”, a); printf(“%d”, b); printf(“%f”, c); } Kết quả: 2912 176 1.7685000000 Cách xuất số thực trên rất khó chịu vì hệ thống tự động thêm các số 0 ở phần lẻ. Để có thể xác định số chữ số lẻ muốn xuất cũng như số ô trên màn hình để biểu diễn số, ta sử dụng cú pháp: Định dạng số nguyên và số thực %nd Dùng n ô để in số nguyên. Dùng n ô để in số thực và lấy k số lẻ. %n.kf n = 0 hoặc bỏ nếu không quan tâm số ô) Ví dụ: #include void main() { int a = 2912, b = 176; float c = 176.85; printf(“%10d”, a); printf(“%10d”, b); printf(“%10.2f”, c); printf(“%.2f”, c); }
  36. 30 Kết quả (theo ô trên màn hình): 2 9 1 2 1 7 6 1 7 6 . 8 5 1 7 6 . 8 5 BÀI TẬP Lý thuyết 1. Trình bày tóm tắt các kiểu dữ liệu cơ sở trong C. Cho một số ví dụ kiểu dữ liệu cụ thể trong mỗi loại (tên kiểu, độ lớn theo byte, miền giá trị). 2. Trình bày khái niệm về biến và cách sử dụng lệnh gán. 3. Phân biệt hằng thường và hằng ký hiệu. Cho ví dụ. 4. Trình bày khái niệm về biểu thức. Tại sao nên sử dụng cặp ngoặc đơn ( ) trong biểu thức? 5. Trình bày cách định dạng khi xuất các số nguyên và số thực. Cho ví dụ minh họa. 6. Tên (định danh) nào sau đây đặt không hợp lệ, tại sao? a. Tin hoc co SO A b. 1BaiTapKHO c. THucHaNH d. TinHOC_DaiCuonG 7. Câu ghi chú dùng để làm gì? Cách sử dụng ra sao? Cho ví dụ minh họa. 8. Trình bày cấu trúc của một chương trình C. Giải thích ý nghĩa của từng phần trong cấu trúc. Thực hành 9. Viết chương trình in ra màn hình các dòng chữ Chào ông, Chào bà, Chào bạn. Hướng dẫn: #include main() { printf(“ Chao ong.\n”); printf(“ Chao bà.\n”); printf(“ Chao ban.\n”); } 10. In lên màn hình một thiệp mời dự sinh nhật có dạng: THIEP MOI Thân mời bạn : Nguyễn Mạnh Hùng
  37. 31 Tới dự lễ sinh nhật của mình Vào lúc 19h ngày 12/10/2005 Tại 05/42 Trần Phú - Cần Thơ Rất mong được đón tiếp ! Hồ Thu Hương 11. Viết chương trình nhập vào độ dài 3 cạnh a, b, c của một tam giác. Tính chu vi và diện tích của tam giác theo công thức: Chu vi CV = a+b+c Diện tích S = sqrt(p*(p-a)*(p-b)*(p-c)) Trong đó: p=CV/2 In các kết quả lên màn hình 12. Viết chương trình xuất các giá trị số của các ký tự Z và z. 13. Viết chương trình xuất các các ký tự có giá trị số 72 and 104. 14. Sắp số nguyên thẳng hàng bên trái hoặc bên phải như hình sau: 1 1 12 12 123 123 1234 1234 12345 12345 15. Hiển thị lên màn ảnh 2 số 123 và 123.456 và xếp thẳng hàng về phía trái. 16. Biểu diễn 3 số 15, 150, and 1500 dưới dạng hexa. 17. Chương trình sau có lỗi gì? main(){ int ch; ch = getchar(); putchar(ch); return 0; } 18. Trong chương trình dưới đây, có cái gì sai ? #include main(){ int x, y; x = y = 0; printf("The comparison result is: %d\n", x = y); return 0; }
  38. 32 CHƯƠNG 3: CÁC CẤU TRÚC ĐIỀU KHIỂN Mục tiêu − Trình bày được các lệnh có cấu trúc; − Vận dụng được các lệnh cấu trúc: cấu trúc lựa chọn, cấu trúc lặp xác định và lặp vô định; − Vận dụng được các lệnh bẻ vòng lặp; − Thực hiện các thao tác an toàn với máy tính. Nội dung 1. Khái niệm về lệnh cấu trúc Một chương trình bao gồm nhiều câu lệnh. Thông thường các câu lệnh được thực hiện một cách lần lượt theo thứ tự mà chúng được viết ra. Các cấu trúc điều khiển cho phép thay đổi trật tự nói trên, do đó máy có thể nhảy thực hiện một câu lệnh khác ở một ví trí trước hoặc sau câu lệnh hiện thời. Xét về mặt công dụng, có thể chia các cấu trúc điều khiển thành các nhóm chính: − Nhảy không có điều kiện. − Rẽ nhánh. − Tổ chức chu trình. − Ngoài ra còn một số toán tử khác có chức năng bổ trợ như break, continue. 2. Các lệnh cấu trúc lựa chọn 2.1. Câu lệnh điều kiện 2.1.1 Khái niệm Câu lệnh if là câu lệnh làm cho chương trình thực hiện hay không thực hiện câu lệnh nào đó tùy vào điều kiện nêu ra. 2.1.2. Câu lệnh if (thiếu) Cú pháp: If (điều kiện) lệnh; Thực hiện nếu đúng. Ngược lại, sai sẽ không làm gì. bắt đầu Sơ đồ khối kết thúc
  39. 33 Trong đó: - cho kết quả đúng hoặc sai và được đặt trong cặp dấu ngoặc đơn ( ). - là câu lệnh đơn hoặc khối lệnh (kẹp các câu lệnhđơn giữa { và }). Ví dụ: Nếu a khác không thì xuất thông báo “a khác 0”. if (a != 0) printf(“a khac 0.”); 2.1.3. Câu lệnh if (đủ) Cú pháp: If (điều kiện) lệnh 1; else lệnh 2; Thực hiện nếu đúng. Ngược lại, sai sẽ thực hiện . bắt đầu Sơ đồ khối kết thúc Ví dụ: Tùy theo giá trị của a để xuất thông báo tương ứng. if (a != 0) printf(“a khac 0.”); else printf(“a bang 0.”); 2.1.4. Một số lưu ý Các câu lệnh if có thể lồng vào nhau và theo nguyên tắc, phần else sẽ thuộc if gần nhất. Tuy nhiên, để cho rõ ràng và dễ hiểu ta nên đặt vào đúng cấp đồng thời thêm { và }. if (a!=0){ if (b>0)
  40. 34 printf(“a!=0 va b>0.”); else printf(“a!=0 va b<=0.”); } printf(“a=0.”); Không được thêm ; sau biểu thức điều kiện vì như thế câu phần theo sau if bây giờ không còn thuộc if nữa. Nói cách khác, cho dù biểu thức điều kiện là đúng hay sai thì các lệnh tiếp theo cũng sẽ được thực hiện. Ví dụ: int a = 0; if (a != 0); // Phải bỏ dấu ; printf(“a khac 0.”); // Luôn thực hiện 2.2. Câu lệnh rẽ nhánh 2.2.1. Khái niệm Câu lệnh switch là câu lệnh làm chương trình thực hiện chọn lựa một trong nhiều hành động để thực hiện. 2.2.2. Cú pháp
  41. 35 Trong đó: - là biến hay biểu thức cho ra dữ liệu kiểu rời rạc, hữu hạn, đếm được như các kiểu số nguyên, ký tự, liệt kê và được đặt trong cặp dấu ngoặc đơn “( )”. Không được sử dụng kiểu số thực. - , , là một hay nhiều câu lệnh đơn. - Cuối mỗi trường hợp (case) sẽ có hoặc không có lệnh break. Khi gặp lệnh này, lệnh switch sẽ kết thúc. - Phần default có thể có hoặc không. Nếu không tìm thấy trường hợp nào phù hợp, phần này sẽ được thực hiện. Ví dụ: Lệnh switch sau sẽ xuất thông báo “Một” nếu a bằng 1, xuất thông báo “Hai” nếu a bằng 2, xuất thông báo “Ba” nếu a bằng 3. Nếu không sẽ xuất “a 3” và “Khong biet doc!”. switch (a) { case 1 : printf(“Mot”); break; case 2 : printf(“Hai”); break; case 3 : printf(“Ba”); break; default: printf(“a 6”); printf(“\nKhong biet doc!”); } 2.2.3. Một số lưu ý Về mặt cú pháp, câu lệnh switch là một câu lệnh đơn. Các câu lệnh switch cũng có thể lồng vào nhau. switch (a){ case 1 : printf(“Mot”); break; case 2 : switch (b){ case 1 : printf(“Hai-Mot”);break; case 2 : printf(“Hai-Hai”);break; } break; case 3 : printf(“Ba”); break; default: printf(“Khong biet doc!”); }
  42. 36 Lệnh break sau mỗi trường hợp (case) rất quan trọng. Nếu thiếu thì sau khi thực hiện trường hợp tương ứng nó sẽ thực hiện tiếp trường hợp liền sau nó đến khi gặp lệnh break hoặc kết thúc switch. Trường hợp (case) cuối cùng không cần lệnh break. Ví dụ sau đây do thiếu break nên sẽ in MotHaiBa khi a = 1. switch (a){ case 1: printf(“Mot”); case 2: printf(“Hai”); case 3: printf(“Ba”); } Tuy nhiên, trong một số trường hợp, việc bỏ break cũng có lợi nếu như ta muốn nhóm các trường hợp cùng loại. Ví dụ, thông thường ta sẽ viết như sau nếu muốn xét các số chẵn lẻ. switch (a){ case 1: printf(“So le”); break; case 2: printf(“So chan”); break; case 3: printf(“So le”); break; case 4: printf(“So chan”); break; case 5: printf(“So le”); break; } Ta viết lại như sau sẽ gọn hơn: switch (a){ case 1: case 3: case 5: printf(“So le”); break; case 2: case 4: printf(“So chan”); break; } 3. Các câu lệnh lặp 3.1. Câu lệnh for Câu lệnh for là câu lệnh làm cho chương trình thực hiện lặp lại một hay nhiều hành động một số lần nhất định.
  43. 37 Cú pháp: for ( ; ; ) ; bắt đầu Sơ đồ khối kết thúc Trong đó: - : là một câu lệnh gán để đặt cho biến đếm một giá trị cụ thể. - : là biểu thức logic. Nếu nhận giá trị sai, câu lệnh for sẽ kết thúc. Ngược lại, sẽ được thực hiện. - : là một biểu thức nhằm tăng giá trị biến đếm trong biểu thức khởi đầu. Biểu thức này sẽ được thi hành sau khi được hiện. - : là câu lệnh đơn hoặc khối lệnh. Ví dụ: In các số từ 0 đến 9 ra màn hình. int i; for (i = 0; i < 10; i++) printf(“%d\n”, i); Ta cũng có thể vừa khai báo và khởi tạo biến trong phần khởi đầu của for: for (int i = 0; i < 10; i++) printf(“%d\n”, i); Thực hiện nhiều câu lệnh đồng thời (khối lệnh): for (int i = 0; i < 10; i++){ printf(“%d”, i); printf(“\n”); } 3.2. Câu lệnh while Câu while là câu lệnh làm cho chương trình thực hiện lặp lại nhiều lần một số hành động cho trước trong khi vẫn còn thỏa một điều kiện để tiếp tục quá trình lặp.
  44. 38 Cú pháp: while ( ) ; bắt đầu Sơ đồ khối kết thúc Trong đó : - : là một biểu thức logic và được đặt trong cặp dấu ngoặc đơn ( ). Nếu nhận giá trị sai, câu lệnh while sẽ kết thúc. Ngược lại, sẽ được thực hiện. - : là câu lệnh đơn hoặc khối lệnh. Ví dụ: In các số từ 0 đến 9 ra màn hình. int n = 0; while (n và giống như lệnh while. Ví dụ: In các số từ 0 đến 9 ra màn hình. n = 0; do{ printf(“%d\n”, n); n++; } while (n < 10); Ứng dụng của câu lệnh này là tạo vòng lặp nhập dữ liệu cho một biến sao cho biến đó có giá trị giới hạn trong một phạm vi nào đó. Đoạn chương trình sau đây yêu cầu người sử dụng nhập vào giá trị cho biến n trong đoạn từ 1 đến 100.
  45. 39 int n; do{ printf(“Nhap n : ”); scanf(“%d”, &n); } while (n 100); 3.4. So sánh sự khác nhau của các vòng lặp - Vòng lặp for thường sử dụng khi biết được số lần lặp xác định. - Vòng lặp thường while, do while sử dụng khi không biết rõ số lần lặp. - Khi gọi vòng lặp while, do while, nếu biểu thức sai vòng lặp while sẽ không được thực hiện lần nào nhưng vòng lặp do while thực hiện được 1 lần. Số lần thực hiện ít nhất của while là 0 và của do while là 1 4. Các lệnh chuyển điều khiển 4.1. Câu lệnh break Câu lệnh break cho phép ra khỏi các chu trình với các toán tử for, while và switch. Khi có nhiều chu trình lồng nhau, câu lệnh break sẽ đưa máy ra khỏi chu trình bên trong nhất chứa nó không cần điều kiện gì. Mọi câu lệnh break có thể thay bằng câu lệnh goto với nhãn thích hợp. Ví dụ: Biết số nguyên dương n sẽ là số nguyên tố nếu nó không chia hết cho các số nguyên trong khoảng từ 2 đến căn bậc hai của n. Viết đoạn chương trình đọc vào số nguyên dương n, xem n có là số nguyên tố. #include #include unsigned int n; void main(){ int i,nt=1; printf("\n cho n="); scanf("%d",&n); for (i=2;i<=sqrt(n);++i) if ((n % i)==0){ nt=0; break; } if (nt) printf("\n %d la so nguyen to",n); else
  46. 40 printf("\n %d khong la so nguyen to",n); } 4.2.Câu lệnh continue Trái với câu lệnh break, lệnh continue dùng để bắt đầu một vòng mới của chu trình chứa nó. Trong while và do while, lệnh continue chuyển điều khiển về thực hiện ngay phần kiểm tra, còn trong for điều khiển được chuyển về bước khởi đầu lại (tức là bước: tính biểu thức 3, sau đó quay lại bước 2 để bắt đầu một vòng mới của chu trình). Chú ý: Lệnh continue chỉ áp dụng cho chu trình chứ không áp dụng cho switch. Ví dụ: In ra màn hình giá trị từ 10 đến 20 trừ đi số 13 và số 17. #include void main(){ for (int i=10 ; i void main (){ int n=10; loop: ; printf(“%d ,”,n); n ; if (n>0) goto loop; printf(“Kết thúc!”); getch(); } 4.4. Hàm Exit Hàm exit() trong C được sử dụng để thoát khỏi chương trình. Hàm này, khi được triệu gọi sẽ ngay lập tức kết thúc chương trình và chuyển quyền điều khiển cho hệ điều hành. Cú pháp: exit (int mã_trả_về);
  47. 41 mã_trả_về thường là số 0. Số 0 sẽ xác định việc kết thúc chương trình một cách bình thường. Tuy nhiên có một vài trường hợp mã_trả_về là những số khác 0 để xác định một vài loại lỗi. 5. Kết hợp các cấu trúc điều khiển trong chương trình Ví dụ 1: Viết chương trình tìm ước số chung của 2 số. #include #include void main(){ unsigned int a,b; printf("\nNhap hai so a,b: "); scanf("%u%u",&a,&b); while (a%b==0 || b%a ==0){ if (a>b & ((a%b)==0)) printf("\nUoc chung la= %d",a/b); else if (b>a & ((b%a)==0)) printf("\Uoc chung la= %d",b/a); } printf("\nKhong co uoc so!!!"); getch(); } Ví dụ 2: Nhập 3 số nguyên a, b và n với a, b #include void main(){ int a, b, n, i, s; do{ printf(“Nhap a, b, n: ”); scanf(“%d%d%d”, &a, &b, &n); } while (a >= n || b >= n); s = 0; for (i = 1; i <= n – 1; i++) if (i % a == 0 && i % b != 0) s = s + i; printf(“Tong cac thoa yeu cau la %d”, s); }
  48. 42 BÀI TẬP Lý thuyết 1. Nêu cú pháp và vẽ sơ đồ khối của câu lệnh if, switch for, lệnh while và lệnh do while. Chỉ rõ điều kiện của các thành phần trong cú pháp. 2. Cho các ví dụ tương ứng Thực hành 3. Nhập một số nguyên bất kỳ. Hãy đọc giá trị của số nguyên đó nếu nó có giá trị từ 0 đến 9, ngược lại thông báo không đọc được. 4. Nhập 3 số nguyên a, b và c từ bàn phím. Hãy tìm số có giá trị nhỏ nhất ( hoặc lớn nhất). 5. Tính tiền đi taxi từ số km nhập vào. Biết: - 1 km đầu giá 15000đ - Từ km thứ 2 đến km thứ 5 giá 13500đ - Từ km thứ 6 trở đi giá 11000đ - Nếu đi hơn 120 km sẽ được giảm 10% trên tổng số tiền. 6. Viết chương trình nhập vào tháng, in ra tháng đó có bao nhiêu ngày. Hướng dẫn: Nhập vào tháng Nếu là tháng 1, 3, 5, 7,8, 10, 12 thì có 30 ngày Nếu là tháng 4, 6, 9, 11 thì có 31 ngày Nếu là tháng 2 và là năm nhuận thì có 29 ngày ngược lại 28 ngày (Năm nhuận là năm chia chẵn cho 4) 7. Viết chương trình nhập vào 2 số x, y và 1 trong 4 toán tử +, -, *, /. Nếu là + thì in ra kết quả x + y, nếu là – thì in ra x – y, nếu là * thì in ra x * y, nếu là / thì in ra x / y (nếu y = 0 thì thông báo không chia được) 8. Nhập một số nguyên dương n. Hãy cho biết: a. Có phải là số đối xứng? Là số nghịch đảo bằng chính nó. Ví dụ: 121, b. Có phải là số chính phương? Là số bằng bình phương số khác. Ví dụ: 4, 9, c. Có phải là số nguyên tố? Là số lớn hơn 1 và chỉ có 2 ước số là 1 và nó. Ví dụ: 2, 3, 5, 7, 11, 13, d. Chữ số lớn nhất và nhỏ nhất? Ví dụ: số 1706, nhỏ nhất 0 và lớn nhất 7 e. Các chữ số có tăng dần hay giảm dần không? Ví dụ: 12245, 156, 442, 941,
  49. 43 9. Nhập số nguyên n. Tính: a. S = 1 + 2 + + n b. S = 12 + 22 + + n2 c. S = 1 + 1/2 + + 1/n d. S = 1! + 2! + + n! 10. Nhập 3 số nguyên n, a, b (a, b < n). Tính tổng các số chia hết cho a nhưng không chia hết cho b và nhỏ hơn n. 11. Tính tổng các số nguyên tố nhỏ hơn n (0 < n < 50). 12. Nhập một số nguyên dương. Xuất ra số ngược lại. 13. Tìm và in lên màn hình tất cả các số nguyên trong phạm vi từ 10 đến 99 sao cho tích của 2 chữ số bằng 2 lần tổng của 2 chữ số đó. 14. Tìm các ước số chung nhỏ nhất của 2 số nguyên dương 15. In n số đầu tiên trong dãy Fibonacy. Dãy Fibonacy là dãy a0, a1, , an-2, an-1, an với: a. a0 = a1 = 1 b. an = an-1 + an-2 (n ≥ 2) Ví dụ: 1 1 2 3 5 8 13 21