Giáo trình Lập trình cơ bản - Trình độ: Trung cấp - Nghề: Công nghệ thông tin - Trường Cao đẳng kỹ thuật công nghệ

docx 97 trang Gia Huy 16/05/2022 2930
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình cơ bản - Trình độ: Trung cấp - Nghề: Công nghệ thông tin - Trường Cao đẳng kỹ thuật công nghệ", để 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:

  • docxgiao_trinh_lap_trinh_co_ban_trinh_do_trung_cap_nghe_cong_ngh.docx

Nội dung text: Giáo trình Lập trình cơ bản - Trình độ: Trung cấp - Nghề: Công nghệ thông tin - Trường Cao đẳng kỹ thuật công nghệ

  1. BM/QT10/P.ĐTSV/04/04 Ban hành lần: 3 UBND TỈNH BÀ RỊA- VŨNG TÀU TRƯỜNG CAO ĐẲNG KỸ THUẬT CÔNG NGHỆ GIÁO TRÌNH MÔ ĐUN: LẬP TRÌNH CƠ BẢN NGHỀ: CÔNG NGHỆ THÔNG TIN TRÌNH ĐỘ: TRUNG CẤP Ban hành kèm theo Quyết định số: /QĐ-CĐKTCN ngày .tháng .năm của Hiệu trưởng Trường Cao đẳng Kỹ thuật Công nghệ BR – VT) BÀ RỊA–VŨNG TÀU, NĂM 2020
  2. TUYÊN BỐ BẢN QUYỀN Nhằm đáp ứng nhu cầu học tập và nghiên cứu cho giảng viên và sinh viên nghề Công nghệ Thông tin trong trường Cao đẳng Kỹ thuật Công nghệ Bà Rịa – Vũng Tàu, chúng tôi đã thực hiện biên soạn tài liệu Lập trình cơ bản này. Tài liệu được biên soạn thuộc loại giáo trình phục vụ giảng dạy và học tập, lưu hành nội bộ trong Nhà trường nên các nguồn thông tin có thể được phép dùng nguyên bản hoặc trích dùng cho các mục đích về đào tạo và tham khảo. Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu lành mạnh sẽ bị nghiêm cấm.
  3. LỜI GIỚI THIỆU Giáo trình lập trình cơ bản C được xây dựng và biên soạn trên cơ sở chương trình khung đào tạo trung cấp nghề công nghệ thông tin đã được Trường Cao Đẳng Kỹ thuật Công nghệ Bà Rịa – Vũng Tàu phê duyệt. Giáo Trình được biên soạn nhằm đáp ứng yêu cầu học tập của sinh viên bước đầu làm quen với công việc lập trình, đồng thời giúp cho sinh viên có một tài liệu học tập, rèn luyện tốt khả năng lập trình, tạo nền tảng vững chắc cho các môn học tiếp theo . Nội dung giáo trình được chia làm 16 bài: Bài 1: Giới thiệu về thuật toán Bài 2: Giới thiệu ngôn ngữ lập trình C Bài 3: Trình bày các thành phần cơ bản của ngôn ngữ lập trình C Bài 4: Sử dụng các phép toán và câu lệnh nhập, xuất trong lập trình C Bài 5: Sử dụng câu lệnh có cấu trúc điều kiện Bài 6: Sử dụng cấu trúc vòng lặp for Bài 7: Sử dụng cấu trúc vòng lặp while Bài 8: Sử dụng cấu trúc vòng lặp do while Bài 9: Sử dụng các câu lệnh break, continue, goto Bài 10: Giới thiệu về hàm Bài 11: Truyền tham số cho hàm Bài 12: Nhập xuất dữ liệu cho mảng một chiều Bài 13: Sử dụng mảng một chiều làm tham số cho hàm Bài 14: Sắp xếp mảng một chiều Bài 15: Nhập xuất chuỗi ký tự Bài 16: Thao tác trên chuỗi ký tự Trong quá trình biên soạn giáo trình, tác giả đã cố gắng cập nhật thông tin mới, đồng thời tham khảo nhiều giáo trình khác, nhưng chắc chắn sẽ không tránh khỏi những hạn chế nhất định. Rất mong nhận được ý kiến đóng góp của các nhà 1
  4. chuyên môn, các anh chị đồng nghiệp và các bạn độc giả để giáo trình được hoàn thiện hơn. Bà Rịa – Vũng Tàu, ngày tháng năm 2020 Biên soạn Nguyễn Thị Mai 2
  5. MỤC LỤC LỜI GIỚI THIỆU 1 MỤC LỤC 3 BÀI 1: THUẬT TOÁN 10 1. Ví dụ 10 2. Khái niệm 10 2.1. Khái niệm về bài toán 10 2.2. Khái niệm thuật toán 11 3. Các đặc trưng của thuật toán 11 3.1. Liệt kê 11 3.2. Dùng sơ đồ khối 12 BÀI 2: GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH C 15 1. Lịch sử hình thành 15 2. Đặc điểm của ngôn ngữ c 16 3. Cấu trúc của một chương trình c 16 4. Một số ví dụ mẫu 17 5. Cài đặt chương trình 18 6. Khởi động chương trình 18 7. Soạn thảo chương trình 18 8. Thoát khỏi chương trình 19 BÀI 3: TRÌNH BÀY CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH C 20 1. Bộ ký tự, từ khóa và tên 20 1.1. Bộ ký tự 20 1.2. Từ khóa 20 1.3. Tên 21 2. Các kiểu dữ liệu căn bản 21 2.1. Kiểu số nguyên (int): Trong C cho phép sử dụng các kiểu số nguyên sau: .21 3
  6. 2.2. Kiểu ký tự (char) 22 2.3. Kiểu dấu phẩy động 22 3. Hằng, biến, biểu thức 23 3.1. Hằng 23 3.2. Biến 25 3.3. Biểu thức 26 BÀI 4: SỬ DỤNG CÁC PHÉP TOÁN VÀ CÂU LỆNH NHẬP, XUẤT TRONG LẬP TRÌNH C 28 1. Các phép toán 28 1.1. Các phép toán toán học 28 1.2. Các phép toán quan hệ và logic 29 1.2.1. Các phép toán quan hệ 29 1.2.2. Các phép toán logic 29 1.2.3. Phép toán tăng giảm 30 1.2.4. Các phép toán lấy địa chỉ biến 31 1.2.5. Chuyển đổi kiểu dữ liệu 31 1.2.6. Thứ tự ưu tiên các phép toán 32 2. Các lệnh nhập, xuất dữ liệu 33 2.1. Các lệnh xuất 33 2.2. Các lệnh nhập 35 2.3. Các hàm nhập xuất dữ liệu khác: 36 2.3.1. Hàm getch(): 36 2.3.2.Hàm gets 36 2.3.3.Hàm getchar 37 2.3. 4. Hàm putchar 37 2.3.5. Hàm puts 37 4
  7. BÀI 5: SỬ DỤNG CÂU LỆNH CÓ CẤU TRÚC ĐIỀU KIỆN 39 1. Lệnh có cấu trúc điều kiện if 39 1.1. Cấu trúc if dạng khuyết 39 1.1.1.Cú pháp 39 1.1.2. Sự hoạt động 40 1.1.3. Lưu đồ khối 40 1.1.4. Bài tập 41 1.2. Cấu trúc if dạng đầy đủ 42 1.2.1. Cú pháp 42 1.2.2. Sự hoạt động: 43 1.2.3. Lưu đồ khối 43 1.1.4. Bài tập 43 2. Lệnh có cấu trúc lựa chọn switch case 45 2.1. Cú pháp 45 2.2. Sự hoạt động 45 2.3. Lưu đồ khối 46 2.4. Bài tập 46 BÀI 6: SỬ DỤNG CẤU TRÚC VÒNG LẶP FOR 48 1.Cú pháp 48 2. Sự hoạt động 48 3. Lưu đồ khối 49 4. Bài tập 49 BÀI 7: SỬ DỤNG CẤU TRÚC VÒNG LẶP WHILE 52 1. Cú pháp 52 2. Sự hoạt động 52 3. Lưu đồ khối 52 4. Bài tập 53 5
  8. BÀI 8: SỬ DỤNG CẤU TRÚC VÒNG LẶP DO WHILE 55 1. Cú pháp 55 2. Sự hoạt động 55 3. Lưu đồ khối 56 4. Bài tập 56 BÀI 9: SỬ DỤNG CÁC CÂU LỆNH BREAK, CONTINUE, GOTO 58 1. Lệnh break 58 2. Lệnh continue 59 3.Câu lệnh goto 59 BÀI 10: GIỚI THIỆU VỀ HÀM 62 1. Khái niệm 62 2. Khai báo hàm 64 2.1. Khai báo hàm không định kiểu dữ liệu 64 2.2. Khai báo hàm có định kiểu dữ liệu 65 3. Kết quả trả về của hàm- lệnh return- lệnh exit 66 3.1. Kết quả trả về của một hàm 66 3.2. Lệnh return: dùng để thoát khỏi một hàm và có thể trả về một giá trị nào đó. 67 4. Bài tập 68 BÀI 11: TRUYỀN THAM SỐ CHO HÀM 70 1. Cách truyền tham số cho hàm 70 2. Bài tập 71 BÀI 12: NHẬP XUẤT DỮ LIỆU CHO MẢNG MỘT CHIỀU 73 1. Khái niệm 73 2. Khai báo mảng một chiều 73 3. Khởi tạo mảng 74 3.1. Khởi tạo mảng 74 3.2. Chỉ số của mảng 75 3.3. Lấy địa chỉ của phần tử mảng một chiều 75 6
  9. 4.Nhập xuất dữ liệu cho các phần tử của mảng một chiều 75 BÀI 13: SỬ DỤNG MẢNG MỘT CHIỀU LÀM THAM SỐ CHO HÀM 77 1.Dùng mảng làm tham số cho hàm 77 2. Tìm kiếm trong mảng một chiều 79 2.1. Ý tưởng 79 Xét từng phần của mảng a. Nếu phần tử đang xét bằng x thì trả về vị trí đó. Nếu kô tìm được thì trả về -1. 79 2.2. Các bước tiến hành 79 2.3. Giải thuật 79 BÀI 14: SẮP XẾP MẢNG MỘT CHIỀU 84 1. Ý tưởng 84 2. Các bước tiến hành như sau 84 3. Giải thuật 85 BÀI 15: NHẬP XUẤT CHUỖI KÝ TỰ 88 1. Khái niệm 88 2. Khai báo biến chuỗi 88 2.1 Khai báo theo mảng 88 2.2. Vừa khai báo vừa gán giá trị 89 3. Vào ra với xâu ký tự 89 3.1. Nhập chuỗi từ bàn phím 89 3.2. Xuất chuỗi lên màn hình 89 BÀI 16: THAO TÁC TRÊN CHUỖI KÝ TỰ 91 1. Các phép toán trên chuỗi ký tự 91 2. Bài tập 94 TÀI LIỆU THAM KHẢO 96 7
  10. GIÁO TRÌNH MÔ ĐUN Tên mô đun: Lập trình cơ bản Mã mô đun: MĐ11 Vị trí, tính chất, ý nghĩa và vai trò của mô đun: - Vị trí: Mô đun được bố trí sau khi học xong môn tin học và tin học nâng cao - Tính chất: Mô đun này yêu cầu phải có tư duy logic và kiến thức về toán Mục tiêu của mô đun: - Về kiến thức: + Phân tích và xây dựng được thuật toán + Khai báo được hằng và biến dùng trong chương trình. + Trình bày được các lệnh nhập xuất và các phép toán trong lập trình c + Trình bày và vẽ được lưu đồ thuật toán của cấu trúc điều khiển và cấu trúc lặp + Trình bày được hàm và kết quả trả về của một hàm + Trình bày được các kiểu dữ liệu có cấu trúc điều kiện - Về kỹ năng: + Sử dụng câu lệnh nhập xuất vào trong các bài tập tính toán + Sử dụng câu lệnh có cấu trúc điều khiển và cấu trúc lặp vào trong các bài tập + Vận dụng hàm vào trong các chương trình + Sử dụng các kiểu dữ liệu có cấu trúc điều kiện vào trong các bài tập + Viết được các chương trình + Biên dịch, kiểm tra và sửa được các lỗi chương trình + Chạy được chương trình và kiểm nghiệm được kết quả - Về năng lực tự chủ và trách nhiệm: + Có tinh thần trách nhiệm, ý thức tổ chức kỷ luật, tác phong công nghiệp, tinh thần hợp tác trong công việc + Có ý chủ động, độc lập trong công việc, tự học cập nhật kiến thức, nâng cao trình độ chuyên môn. 8
  11. + Có khả năng tổ chức và điều hành một nhóm, đánh giá được các thành viên trong nhóm. + Rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. + Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung của mô đun: 9
  12. BÀI 1: THUẬT TOÁN Mã bài: 10.1 Giới thiệu: Bài học này sẽ giới thiệu về khái niệm bài toán trong tin học, khái niệm thuật toán, các đặc trưng của thuật toán và các phương pháp biểu diễn của thuật toán. Mục tiêu: - Giới thiệu về thuật toán - Trình bày được các đặc trưng của thuật toán - Nêu được các phương pháp biểu diễn của thuật toán. - Rèn luyện tính cẩn thận, kiên trì, sáng tạo. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Ví dụ Xét các yêu cầu sau: - Bài 1: Tính chu vi, diện tích hình chữ nhật - Bài 2: Viết một dòng chữ ra màn hình máy tính. - Bài 3: Quản lý các cán bộ trong một cơ quan. - Bài 4: Tìm số lớn nhất của hai số nguyên dương a và b. - Bài 5: Xếp loại học tập các học sinh trong lớp. Trong các yêu cầu trên, yêu cầu nào được xem như là một bài toán? 2. Khái niệm 2.1. Khái niệm về bài toán - Bài toán là một việc nào đó mà con người muốn máy tính thực hiện - Các yếu tố của một bài toán: + Input: Thông tin đã biết, thông tin đưa vào máy tính + Output: Thông tin cần tìm, thông tin lấy ra từ máy tính Ví dụ 1: Tính chu vi, diện tích hình chữ nhật - Input: Các cạnh của hình chữ nhật - Output: chu vi và diện tích hình chữ nhật 10
  13. Ví dụ 2: Tìm giá trị nhỏ nhất của các số trong một dãy số. - Input: Các số trong dãy số. - Output: Giá trị nhỏ nhất trong dãy số. Ví dụ 3: Xếp loại học tập các học sinh trong lớp. - Input: Bảng điểm của học sinh. - Output: Bảng xếp loại học tập. 2.2. Khái niệm thuật toán Bài toán Bằng cách nào? Input Output Giải bài toán Thuật toán Hướng dẫn các thao tác cho máy thực hiện để tìm ra lời giải  Thuật toán: Là tập hợp (dãy) hữu hạn các chỉ thị (hành động) được định nghĩa rõ ràng nhằm giải quyết một bài toán cụ thể nào đó. Tính chất của thuật toán: - Tính chính xác: quá trình tính toán hay các thao tác máy tính thực hiện là chính xác. - Tính rõ ràng: các câu lệnh minh bạch được sắp xếp theo thứ tự nhất định. - 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 3. Các đặc trưng của thuật toán Trong giáo trình này giới thiệu 2 cách mô tả thuật toán: 3.1. Liệt kê Nêu ra tuần tự các thao tác cần tiến hành 11
  14. Ví dụ: Tìm nghiệm phương trình bậc nhất tổng quát: ax + b = 0 ()  Giải toán thông thường: - Nếu a = 0 thì () không phải là pt bậc nhất. + Nếu b = 0 thì () vô số nghiệm + Nếu b ≠ 0 thì () vô nghiệm. - Nếu a ≠ 0 thì () có nghiệm x = -b/a.  Liệt kê: - Bước 1: Nhập a, b. - Bước 2: Nếu a = 0 thì quay lại bước 1, ngược lại thì qua bước 3. - Bước 3: Gán cho x giá trị -b/a, rồi qua bước 4. - Bước 4: Đưa ra kết quả x và kết thúc. 3.2. Dùng sơ đồ khối Dùng một số biểu tượng thể hiện các thao tác - Trong sơ đồ khối, người ta dùng một số biểu tượng thể hiện các thao tác như: Bảng 1.1: Bảng các ký hiệu biểu diễn trong thuật toán STT Ký hiệu Ý nghĩa Bắt đầu / kết thúc chương 1 trình 2 Nhập/ xuất dữ liệu 3 Điều kiện rẽ nhánh (Lựa chọn) 4 Xử lý/ tính toán/ gán 5 Chỉ hướng thao tác tiếp theo Ví dụ 1: Tìm nghiệm phương trình bậc nhất tổng quát: ax + b = 0  Liệt kê: - Bước 1: Nhập a, b. - Bước 2: Nếu a = 0 thì quay lại bước 1, ngược lại thì qua bước 3. 12
  15. - Bước 3: Gán cho x giá trị -b/a, rồi qua bước 4. - Bước 4: Đưa ra kết quả x và kết thúc. Sơ đồ khối: - Ví dụ 2: Vẽ sơ đồ khối thể hiện thuật toán tính chu vi diện tích hình chữ nhật Bắt đầu - Nhập CR - Nhập CD Chu vi=(CR+CD)*2 Diện tích=CR*CD - Hiển thị chu vi - Hiển thị diện tích Kết thúc Ví dụ 3: Vẽ sơ đồ đồ thuật toán nhật vào 2 số nguyên a,b. Tính tổng, hiệu, tích, thương của 2 số đó 13
  16. Lưu ý: Ta cần diễn tả thuật toán bằng một ngôn ngữ sao cho máy tính có thể hiểu và thực hiện được, ngôn ngữ đó gọi là ngôn ngữ lập trình. Kết quả diễn tả thuật toán như vậy gọi là chương trình. Câu hỏi, bài tập: 1.1. Lưu đồ là phương pháp hình thức giúp diễn đạt một giải thuật, trong đó .: a. Hình ô van dùng để bắt đầu và kết thúc chương trình b. Hình thoi được dùng để điều khiển lựa chọn (hay kiểm tra điều kiện) c. Hình chữ nhật được dùng để xử lý, tính toán hoặc gán d. Tất cả các câu trên đều đúng 1.2. Trình bày các đặc trưng và các ký hiệu của thuật toán 1.3. Viết thuật toán nhập vào một số nguyên dương a kiểm tra xem đó là số chẵn hay là số lẻ 1.4. Viết thuật toán nhập vào 2 số nguyên a, b. Tìm giá trị lớn nhất của hai số đó 14
  17. BÀI 2: GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH C Mã bài: 10.2 Giới thiệu: Bài học này giới thiệu về lịch sử hình thành và phát triển của ngôn ngữ lập trình c, cấu trúc của một chương trình c, thực hiện các thao tác cài đặt Dev c++, khởi động và thoát khỏi một chương trình Dev c++. Mục tiêu: - Mô tả lịch sử hình thành và phát triển của ngôn ngữ C - Trình bày được cấu trúc của một chương trình C - Thực hiện được cài đặt, khởi động, soạn thảo và thoát khỏi chương trình C - Rèn luyện tính cẩn thận, kiên trì, sáng tạo. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy Nội dung chính: 1. Lịch sử hình thành - Ngôn ngữ lập trình C ra đời năm 1972, do Dennis Ritchie khởi xướng - C được tạo ra để sử dụng như một phần căn bản của hệ điều hành UNIX (Ken Thompson, Dennis Ritchie và Douglas McIlroy, 1969) - C được sử dụng rộng rãi và có ảnh hưởng lớn đến nhiều ngôn ngữ lập trình hiện đại, trong đó có C++, được xem là mở rộng của C. - Là ngôn ngữ lập trình có cấu trúc và phân biệt chữ Hoa - thường (case sensitive) - Môi trường C: + Borland C (còn gọi là Turbo C) + Borland C++ 3.1 for DOS. - Môi trường C/C++: + Dev-C++ + Visual C++ của Microsoft + Visual Stdio sẽ thực hành trên môi trường này 15
  18. 2. Đặc điểm của ngôn ngữ c C gồm các từ khóa, những từ khóa này kết hợp với cú pháp của 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 những từ khóa dùng cho việc tổ chức bộ nhớ ở những giai đoạn tiền xử lý nhất định.  Quy tắc khi lập trình C như sau: - Không được lưu tên tập tin dưới dạng tiếng Việt có dấu và khoảng cách, các ký tự đặc biệt. - Tất cả từ khóa là chữ thường (không in hoa) - Ðoạn mã trong chương trình C có phân biệt chữ thường và chữ hoa. Ví dụ: do while thì khác với DO WHILE - Từ khóa không thể dùng cho các mục đích khác như đặt tên biến (variable name) hoặc tên hàm (function name) - Hàm main() luôn là hàm đầu tiên được gọi đến khi một chương trình bắt đầu chạy (chúng ta sẽ xem xét kỹ hơn ở phần sau) 3. Cấu trúc của một chương trình c Ví dụ viết chương trình hiển thị câu “xin chào” Hình 2.1: Ví dụ mô phỏng một chương trình c #include : khai báo sử dụng thư viện xuất/nhập chuẩn (standard I/O library). Các thư viện khác: string, time, math, conio.h, iostream.h . 16
  19.  main(): - Chương trình C được chia nhỏ thành những đơn vị gọi là hàm - Cho dù có bao nhiêu hàm trong chương trình, hệ điều hành luôn trao quyền điều khiển cho hàm main() khi một chương trình C được thực thi. - Theo sau tên hàm là dấu “ngoặc đơn” - Dấu ngoặc đơn có thể có chứa hay không chứa những tham số - Dấu phân cách { }: mở và đóng một khối mã. - Dấu kết thúc câu lệnh là dấu chấm phẩy “;”: Một câu lệnh trong C được kết thúc bằng dấu chấm phẩy. - Trình biên dịch C không hiểu việc xuống dòng, khoảng trắng hay tab - Một câu lệnh không kết thúc bằng dấu chấm phẩy sẽ được xem như dòng lệnh lỗi trong C - //: Dòng chú thích: Những chú thích thường được viết để mô tả công việc của một lệnh đặc biệt, một hàm hay toàn bộ chương trình. Trình biên dịch sẽ bỏ qua phần chú thích + Trong trường hợp chú thích nhiều dòng, nó sẽ bắt đầu bằng ký hiệu /* và kết thúc là */ 4. Một số ví dụ mẫu Ví dụ 1: #include #include main() { printf(“TRAN TRONG KINH MOI”); printf(“Ban: Hai Ha”); printf(“Den du sinh nhat”); printf(“vao luc 17h ngay 10-8-2020”); } Khi chạy chương trình có kết quả như sau: Ví dụ 2: 17
  20. #include #include main() { printf("\t * \n"); printf(" \t \n "); printf("\t \n "); printf("\t \n "); } 5. Cài đặt chương trình - Chạy file cài đặt DEV-C++ (file devcpp.exe). Làm theo hướng dẫn của máy - Vào menu "Tools" chọn "Compiler Options". - Vào tab "Settings" tab, nhấn vào "Link" ở khung bên trái và thay đổi thông số "Generate debugging information" sang "Yes": - Nhấn OK Hình 2.2: Hộp hội thoại cài đặt Dev C++ 6. Khởi động chương trình Khởi động chương trình: Start/ programs / Dev C++ 7. Soạn thảo chương trình Vào file/ new/ source File/ Xuất hiện khung cửa sổ để soạn thảo chương trình 18
  21. Hình 2.3: Hộp hội thoại mở màn hình soạn thảo Dev C++ 8. Thoát khỏi chương trình Thoát khỏi Dev C++ Dùng File/Exit hoặc Alt-X. Câu hỏi, bài tập: 2.1. Cấu trúc một chương trình C gồm: a. Các tập tin thư viện c. { bao gồm các hàm, các lệnh đơn, lệnh ghép} b. main() d. Cả a,b,c 2.2. Thứ tự các bước để chạy một chương trình C gồm: 1- Viết chương trình 2- Chạy chương trình để kiểm tra kết qủa 3- Biên dịch chương trình theo ngôn ngữ 4- Tìm một giải thuật để giải bài toán. Thứ tự của các bước là: a. 1,2,3,4 c. 4,1,3,2 b. 1,3,2,4 d. 1,4,3,2 2.3. Cho các đặc điểm sau, đặc điểm nào đúng với ngôn ngữ lập trình C a. Tất cả từ khóa là chữ hoa b. Tất cả từ khóa là chữ thường c. Hàm main() là hàm được gọi cuối cùng khi chương trình chạy d. Từ khóa được dùng để đặt tên biến, tên hàm 19
  22. BÀI 3: TRÌNH BÀY CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH C Mã bài: 10.3 Giới thiệu: Trong bài học này chúng ta làm quen với các khái niệm bộ ký tự, từ khóa, tên, các kiểu dữ liệu cơ bản trong C. Các khái niệm về hằng, biến, biểu thức và cách khai báo chúng. Mục tiêu: - Nêu và sử dụng được hệ thống kí hiệu và từ khóa - Nêu và phân tích được các kiểu dữ liệu - Phân tích và vận dụng được các loại biến, hằng biểu thức cho từng chương trình cụ thể. -Áp dụng các các bộ từ khóa, biến, hằng, biểu thức vào trong các bài tập - Rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Bộ ký tự, từ khóa và tên 1.1. Bộ ký tự - Gồm 26 chữ cái in hoa: A, B, C Z, - Gồm 26 chữ cái in thường: a, b, , z - 10 chữ số: 0,1,2, ,9 - Ký tự gạch nối _ (chú ý phân biệt dấu -). - Dấu cách (space): dùng để phân biệt các từ: Ví dụ: lop Học (7 ký tự) - LopHoc (6 ký tự). Chú ý: Khi viết chương trình, ta không được sử dụng bất kỳ ký tự nào khác ngoài các ký tự trên. 1.2. Từ khóa Từ khóa là những từ được sử dụng để khai báo các kiểu dữ liệu, để viết các toán 20
  23. tử và các câu lệnh. Bảng dưới đây liệt kê các từ khoá của lập trình C: Bảng 3.1: Các từ khóa trong ngôn ngữ lập trình C asm break case cdecl char const continue default do double else enum extern far float for goto huge if int interrupt long near pascal register return short signed sizeof static struct switch typedef union unsigned void volatile while Ý nghĩa và cách sử dụng của mỗi từ khóa sẽ được đề cập sau này, ở đây ta cần chú ý: - Không được dùng các từ khóa để đặt tên cho các hằng, biến, mảng, hàm - Từ khoá phải được viết bằng chữ thường, ví dụ: viết từ khóa khai báo kiểu nguyên là int chứ không phải là INT. 1.3. Tên Là 1 dãy ký tự bắt đầu bằng chữ hoặc ký tự gạch dưới, theo sau là chữ cái, chữ số hoặc ký tự gạch nối (-). - Tên: dùng làm tên hằng, tên biến, nhãn, tên hàm Ví dụ: Tên đúng: _abc, Delta_1, BETA. Tên sai: 1xyz (vì bắt đầu là 1 chữ số) A#B (vì có dấu #) Delta (vì có khoảng trống), X-1 (vì sử dụng dấu gạch ngang). 2. Các kiểu dữ liệu căn bản 2.1. Kiểu số nguyên (int): Trong C cho phép sử dụng các kiểu số nguyên sau: 21
  24. Bảng 3.2: Bảng các ký hiệu biểu diễn kiểu số nguyên Kiểu Phạm vi biểu diễn Kích thước int -32768 đến 32767 2 byte unsigned int 0 đến 65535 2 byte long (int) -2147483648 đến 2147483647 4 byte unsigned long 0 đến 4294967295 4 byte (int) 2.2. Kiểu ký tự (char) Một giá trị kiểu ký tự (char) chiếm 1 byte trong bộ nhớ và biểu diễn một ký tự thông qua bảng mã ASCII. Ví dục Ký tự Mã ASCII 0 048 1 049 2 050 A 065 a 097 Có hai kiểu ký tự (char) sau: Bảng 3.3: Bảng các ký hiệu biểu diễn kiểu ký tự Kiểu Phạm vi biểu Số ký tự Kích thước diễn char (signed char) -128 -> 127 256 1 byte unsigned char 0 -> 255 256 1 byte 2.3. Kiểu dấu phẩy động Trong C sử dụng ba loại giá trị dấu phẩy động: float (độ chính xác đơn), double và long double (độ chính xác kép). 22
  25. Bảng 3.4: Bảng các ký hiệu biểu diễn kiểu dấu phẩy động Kiểu Phạm vi biểu diễn Số ký tự Kích thước float 3.4E-38 -> 3.4E+38 7-8 4 byte double 1.7E-308->1.7E+308 15-16 8 byte long double 3.4E-4932-> 1.1E+4932 17-184 byte 10 byte 3. Hằng, biến, biểu thức 3.1. Hằng - Khái niệm Là một giá trị bất biến trong chương trình không thay đổi, không biến đổi. Các loại hằng được sử dụng trong C tương ứng với các kiểu dữ liệu nhất định. - Trong C, thường có các loại hằng sau: + Hằng số nguyên + Hằng số thực + Hằng ký tự + Hằng chuỗi ký tự Hằng số Ðó là các giá trị số đã xác định, một hằng số có thể là nguyên hay thực và được viết trong chương trình một cách bình thường. Hằng số nguyên - Giá trị chỉ bao gồm các chữ số, dấu +, - được lưu trữ theo kiểu int. Ví dụ: 12, -12 - Nếu giá trị vượt quá miền giá trị của int hoặc có ký tự l (hay L) theo sau giá trị thì lưu theo kiểu long int. Ví dụ: 43L hoặc 43l là hằng nguyên lưu theo kiểu long int. Hằng số thực: Trong giá trị có dấu chấm thập phân, hoặc ghi dưới dạng số có mũ, và được lưu theo kiểu float, double, long double. Ví dụ: 1.2, 2.1E -3 (2.1E-3=0.0021) hoặc 3.1e-2 (3.1e-2=0.031). 23
  26. Hằng ký tự - Một hằng kiểu ký tự được viết trong dấu ngoặc đơn (') như 'A' hoặc 'z'. - Hằng ký tự 'A' thực sự đồng nghĩa với giá trị nguyên 65, là giá trị trong bảng mã ASCII của chữ hoa 'A' (Như vậy giá trị của hằng chính là mã ASCII của nó). Ðối với một vài hằng ký tự đặc biệt, ta cần sử dụng cách viết thêm dấu \, như '\t' tương ứng với phím tab: Bảng 3.5: Bảng các ký hiệu biểu diễn kiểu ký tự Cách viết Ký tự ‘\n’ Xuống hàng ‘\t’ Tab ‘\0’ “null”- ứng với giá trị nguyên 0 trong bảng mã ASCII (khác với số ‘0’) ‘\b’ Backspace ‘\r’ CR (về đầu dòng) ‘\f’ LF (sang trang) ‘\\’ \ ‘\’” “ ‘\’’ ‘ Hằng ký tự có thể tham gia vào phép toán như mọi số nguyên khác: '8' - '1'= 56-49=7. Hằng chuỗi ký tự Là chuỗi ký tự nằm trong cặp dấu nháy kép " ". Các ký tự này cũng có thể là các ký tự được biểu diễn bằng chuỗi thoát. Ví dụ: "Turbo C", "Ngôn ngữ C++ \n\r" Một hằng chuỗi được lưu trữ tận cùng bằng một ký tự Null (\0), ví dụ chuỗi "Turbo C" được lưu trữ trong bộ nhớ như sau: T U R B O C \0 Cách định nghĩa hằng sử dụng trong chương trình Với các giá trị hằng thường được dùng trong một chương trình ta nên định nghĩa 24
  27. ở đầu chương trình (sau các dòng khai báo những thư viện chuẩn) theo cú pháp: #define Ví dụ: #define PI 3.1415 3.2. Biến Khái niệm Biến là một đại lượng được người lập trình định nghĩa và được đặt tên thông qua việc khai báo biến. Biến dùng để chứa dữ liệu trong quá trình thực hiện chương trình và giá trị của biến có thể bị thay đổi trong quá trình này. Cách đặt tên biến giống như cách đặt tên đã nói trong phần trên. Mỗi biến thuộc về một kiểu dữ liệu xác định và có giá trị thuộc kiểu đó. Cách khai báo Mỗi biến trong chương trình đều phải được khai báo trước khi sử dụng. Cú pháp khai báo biến như sau: ; Lưu ý: nếu có nhiều tên biến thì giữa các tên biến phải có dấu, Ví dụ: int a,b; float x; Khởi đầu cho các biến Ngay trên dòng khai báo ta có thể gán cho biến một giá trị. Việc làm này gọi là khởi đầu cho biến. Ví dụ: int a,b=6,d=1; Truy xuất đến địa chỉ của biến Một số hàm của C dùng đến địa chỉ của biến ví dụ như hàm scanf. Ðể nhận địa chỉ của biến dùng toán tử: & tên_biến; Ví dụ: &a; /*Chương trình này minh họa cách khai báo biến trong C*/ #include main() { 25
  28. char ki_tu; /* Khai báo một ký tự*/ int so_nguyen; /* Khai báo một số nguyên*/ float so_thuc; /* Khai báo một số thực*/ ki_tu = 'a'; so_nguyen = 15; so_thuc = 27.62; printf("%c la mot ky tu.\n",ki_tu); printf("%d la mot so nguyen.\n",so_nguyen); printf("%f la mot so thuc.\n",so_thuc); } Kết quả: a la mot ky tu. 15 la mot so nguyen 27.620001 la mot so thuc 3.3. Biểu thức Là sự kết hợp hợp lệ của những phép toán thực hiện trên các biến, hằng hoặc các giá trị của hàm. Một biểu thức bao gồm các toán tử (phép toán) và các toán hạng (biến, hằng ). Ví dụ 1: int x=2,y=7; x=(x+2*y); /* x,y là các biến tương ứng với các toán hạng ; phép cộng (+) và (*) và dấu (=) là các toán tử của biểu thức*/ Ví dụ 2: int i, a=3; a=(i=a*11); /*là một biểu thức hợp lệ. (với a là một biến đã có giá trị trước đó).*/ Câu hỏi, bài tập: 3.1. Tên nào đặt đúng qui định của lập trình C a. Tinh- tong c. #2Tinhtong b. 2Tinhtong d. Tinh_tong 3.2. Các cách khai báo sau, khai báo nào dùng để khai báo kiểu số nguyên a. int c. char 26
  29. b. float d. double 3.3. Bộ ký tự trong lập trình C gồm: a. 26 chữ cái in thường, in hoa c. Dấu cách, dấu gạch nối b. 10 chữ số (0,1, ,9) d. Tất cả các câu trên đều đúng 3.4. Kiểu số nguyên có phạm vi biểu diễn nằm trong khoảng a. 3.4E-38 ÷3.4E+38 c. -32768 ÷ 32767 b. -32767 ÷ 32768 d. 1.7E-4932 ÷ 32767 27
  30. BÀI 4: SỬ DỤNG CÁC PHÉP TOÁN VÀ CÂU LỆNH NHẬP, XUẤT TRONG LẬP TRÌNH C Mã bài: 10.4 Giới thiệu: Bài học này chúng ta sẽ làm quen với các phép toán, các câu lệnh nhập xuất và cách áp dụng các phép toán và câu lệnh đó vào trong các bài toán trong C. Mục tiêu: - Trình bày được công dụng của các phép toán - Trình bày được các lệnh nhập, xuất dữ liệu - Áp dụng các phép toán vào trong các bài toán - Sử dụng câu lệnh nhập xuất vào trong các bài tập - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Các phép toán 1.1. Các phép toán toán học Bảng 4.1: Bảng các pháp toán học Phép toán ý nghĩa Ví dụ + Phép cộng a+b - Phép trừ a-b * Phép nhân a*b / Phép chia a/b (Cho phần nguyên của phép chia a cho b) % Phép lấy phần dư a%b (Cho phần dư của phép chia a cho b) Ví dụ: 11/3 = 3 11%3 = 2 -(2+6) = -8 28
  31. Các phép toán + và - có cùng thứ tự ưu tiên, có thứ tự ưu tiên nhỏ hơn các phép *, /, % và cả ba phép này lại có thứ tự ưu tiên nhỏ hơn phép trừ một ngôi. Các phép toán số học được thực hiện từ trái sang phải. Số ưu tiên và khả năng kết hợp của phép toán được chỉ ra trong một mục sau này 1.2. Các phép toán quan hệ và logic Phép toán quan hệ và logic cho ta giá trị đúng (1) hoặc giá trị sai (0). Nói cách khác, khi các điều kiện nêu ra là đúng thì ta nhận được giá trị 1, trái lại ta nhận giá trị 0. 1.2.1. Các phép toán quan hệ Bảng 4.2: Bảng các phép toán quan hệ Phép toán Ý nghĩa Ví dụ a>b > So sánh lớn hơn 4>5 có giá trị 0 a>=b >= So sánh lớn hơn hoặc bằng 6>=2 có giá trị 1 a<b < So sánh nhỏ hơn 6<=7 có giá trị 1 a<=b <= So sánh nhỏ hơn hoặc bằng 8<=5 có giá trị 0 a==b == So sánh bằng nhau 6==6 có giá trị 1 a!=b != So sánh khác nhau 9!=9 có giá trị 0 Bốn phép toán đầu có cùng số ưu tiên, hai phép sau có cùng số thứ tự ưu tiên nhưng thấp hơn số thứ tự của bốn phép đầu. Các phép toán quan hệ có số thứ tự ưu tiên thấp hơn so với các phép toán số học, cho nên biểu thức: i<n-1 được hiểu là i<(n-1). 1.2.2. Các phép toán logic Trong C sử dụng ba phép toán logic: 29
  32. - Phép phủ định: + Ký hiệu là: ! Ví dụ: a !a khác 0 0 bằng 0 1 - Phép và (AND) + Ký hiệu là: && - Phép hoặc (OR) + Ký hiệu là: || Bảng 4.3: Bảng các phép toán logic a b a&&b a||b 1 1 1 1 1 0 0 1 0 1 0 1 0 0 0 0 Các phép quan hệ có số ưu tiên nhỏ hơn so với “!” nhưng lớn hơn so với && và ||, vì vậy biểu thức như: (a d) có thể viết lại thành: a d Chú ý: Cả a và b có thể là nguyên hoặc thực. 1.2.3. Phép toán tăng giảm C đưa ra hai phép toán một ngôi để tăng và giảm các biến (nguyên và thực). Toán tử tăng là ++ sẽ cộng 1 vào toán hạng của nó, toán tử giảm thì sẽ trừ toán hạng đi 1. Ví dụ: n=5 ++n Cho ta n=6 30
  33. n Cho ta n=4 Ta có thể viết phép toán ++ và trước hoặc sau toán hạng như sau: ++n, n++, n, n . Sự khác nhau của ++n và n++ ở chỗ: trong phép n++ thì tăng sau khi giá trị của nó đã được sử dụng, còn trong phép ++n thì n được tăng trước khi sử dụng. Sự khác nhau giữa n và n cũng như vậy. Ví dụ: n=5 x=++n Cho ta x=6 và n=6 x=n++ Cho ta x=5 và n=6 1.2.4. Các phép toán lấy địa chỉ biến  Khái niệm Ðịa chỉ của biến là số thứ tự của byte đầu tiên trong một dãy các byte liên tiếp mà máy dành cho biến. Phân loại địa chỉ biến Từ khái niệm về địa chỉ, ta nhận xét thấy: Ðịa chỉ của hai biến kiểu int liên tiếp cách nhau 2 byte, địa chỉ của hai biến kiểu float liên tiếp cách nhau 4 byte. Nên có thể phân biệt được các kiểu địa chỉ: Ðịa chỉ kiểu int, địa chỉ kiểu float, địa chỉ kiểu double. Phép lấy địa chỉ của một biến Phép toán: &x cho ta địa chỉ của biến x. 1.2.5. Chuyển đổi kiểu dữ liệu Khi hai toán hạng trong một phép toán khác kiểu dữ liệu thì kiểu dữ liệu thấp được nâng thành kiểu dữ liệu cao trước khi tính toán. Ví dụ: nếu f có kiểu float, i có kiểu int, thì trong biểu thức f +i, i sẽ tạm thời được chuyển sang kiểu float để thực hiện phép cộng. - Cú pháp: ( ) Nếu f có kiểu float, i1 và i2 có kiểu int và có giá trị 10 và 3 thì biểu thức f=i1/i2 sẽ gán vào f giá trị 3.0. Trong trường hợp này, để thu được kết quả chính xác, cần sử dụng phép ép kiểu: f=(float) i1/i2 31
  34. Ví dụ: int a,b=4;c=5;float x,y=6.8,z=3.8; a=y; /*a =6*/ a=-y; /*a =-6*/ x=a/b+c; /*x=4.0*/ x=a/b+(float) c; /*x=4.0*/ x=(float) a/b+ c; /*x=3.5*/ a=y-z ; /*a=2 (nếu kết quả là 2.999.) hoặc 3*/ 1.2.6. Thứ tự ưu tiên các phép toán Các phép toán có độ ưu tiên khác nhau, điều này có ý nghĩa trong cùng một biểu thức sẽ có một số phép toán này được thực hiện trước một số phép toán khác. Thứ tự ưu tiên của các phép toán được trình bày trong bảng sau: Bảng 4.4: Bảng thứ tự ưu tiên của các pháp toán TT Phép toán Trình tự kết hợp 1 () [] -> Trái qua phải 2 ! ~ & * - ++ (type) sizeof Phải qua trái 3 * (phép nhân) / % Trái qua phải 4 + - Trái qua phải 5 > Trái qua phải 6 >= Trái qua phải 7 == != Trái qua phải 8 & Trái qua phải 9 ^ Trái qua phải 10 | Trái qua phải 11 && Trái qua phải 12 || Trái qua phải 13 ?: Phải qua trái 14 = += -= *= /= %= >= &= ^= |= Phải qua trái 15 , Trái qua phải 32
  35. Chú thích: Các phép toán tên một dòng có cùng thứ tự ưu tiên, các phép toán ở hàng trên có số ưu tiên cao hơn các số ở hàng dưới. Đối với các phép toán cùng mức ưu tiên thì trình tự tính toán có thể từ trái qua phải hay ngược lại được chỉ ra trong cột trình tự kết hợp. Ví dụ: * px=*( px) (Phải qua trái) 8/4*6=(8/4)*6 (Trái qua phải) Nên dùng các dấu ngoặc tròn để viết biểu thức một cách chính xác. 2. Các lệnh nhập, xuất dữ liệu Hàm thư viện: Thư viện nhập xuất trong C cũng như rong C++ có tên là: #include (standard input/output) #include Ngoài ra với C++ thì ta phải khai báo sử dụng thêm namespace std bằng cú pháp using namespace std; 2.1. Các lệnh xuất  Sử dụng hàm printf() Cú pháp: printf("Dòng điều khiển",[các biểu thức]); Dòng điều khiển gồm 3 loại: + Chuỗi ký tự mang tính chất thông báo (hằng chuỗi) + Các ký tự điều khiển (\n, \r, \t ) + Các mã đặc tả để in các biểu thức tương ứng (mỗi biểu thức khi in phải có một đặc tả). Các đặc tả được dùng trong hàm printf như sau: Bảng 4.5: Bảng các ký tự đặc tả của hàm printf Mã đặc tả Kiểu dữ liệu Tác dụng %c char in một ký tự có mã ASCII tương ứng %[n]d int in một số nguyên với chiều dài tối thiểu là n %[n]ld long int in một số nguyên (long int) %[n]u int in một số nguyên ở hệ 10 không dấu 33
  36. %[n]o int in một số nguyên ở hệ bát phân tương ứng. %[n]x int in một số nguyên ở hệ 16 tương ứng %[n.m]f float in một số thực vối chiều dài n và lấy m số thập phân %s mảng ký tự in ra một chuỗi ký tự. Ví dụ: #include main() { int a = 10, b = 20; printf(“%d”, a); Xuất ra 10 printf(“%d”, b); Xuất ra 20 printf(“%d %d”, a, b); Xuất ra 10 20 }  Sử dụng hàm cout Cú pháp: cout #include using namespace std; main () { cout << "Chao mung ban den voi c++"; cout <<"\n"; cout << "Ban dang hoc C++ can ban"; cout << "\n"; } 34
  37. 2.2. Các lệnh nhập  Sử dụng hàm scanf() - Cú pháp: scanf("các đặc tả", ); Các đặc tả có dạng % (Mỗi biến muốn nhập giá trị phải có một đặc tả tương ứng). Ta có các ký tự đặc tả sau: Bảng 4.5: Bảng các ký tự đặc tả của hàm scanf Mã đặc tả Kiểu dữ liệu của Tác dụng biến %c char nhập một ký tự %d int nhập một số nguyên %ld long int nhập một số nguyên (long int) %o int nhập một số nguyên ở hệ bát phân. %x int nhập một số nguyên ở hệ 16 tương ứng %f float nhập một số thực %lf double nhập một số thực %s mảng ký tự nhập ra một chuỗi ký tự. Mảng tương ứng phải đủ lớn để chứa chuỗi nhập vào và ký tự kết thúc chuỗi (\0), lệnh scanf tự động chèn ký hiệu kết thúc chuỗi vào.  Ví dụ 1: Nhập năm sinh của một người. Tính tuổi người đó. #include #include main() { int namsinh,namhientai,tuoi; printf("nhap nam hiện tại"); scanf("%d",& namhientai); 35
  38. printf("nhap nam sinh"); scanf("%d",&namsinh); tuoi=namhientai-namsinh; printf(" tuoi la: %d", tuoi); }  Sử dụng hàm cin - Cú pháp: cin >> Tên biến; Trường hợp ban muốn nhập nhiều giá trị cùng một lênh cin thì sử dụng cú pháp sau: cin >> Tên biến 1 >> Tên biến 2>> Tên biến 3;; 2.3. Các hàm nhập xuất dữ liệu khác: 2.3.1. Hàm getch(): Thư viện: #include + Cú pháp: getch(); + Ý nghĩa: có thể sử dụng theo nhiều cách khác nhau, nếu viết getch(); là dùng để dừng màn hình 2.3.2.Hàm gets - Cú pháp:gets(Tên của mảng ký tự); - ý nghĩa: Hàm này cho phép nhận một chuỗi từ bàn phím cho đến khi gặp ký tự \n (cho phép nhập khoảng trắng giữa các từ) - Ví dụ /* Chương trình minh họa nhập dữ liệu (nhập một chuỗi (xâu) ký tự) bằng hàm gets() */ #include char a[5];//Khai báo một chuỗi(xâu) gồm 5 ký tự main() /* Ham chinh */ { int i; printf("Nhap chuoi 5 ky tu: ");gets(a); //giả sử nhập vào là ABCDEFGH,có thể nhập được khoảng trắng //Khi nhập chuỗi ta không cần phải lấy địa chỉ 36
  39. printf("%s",a); //In ra ABCDEFGH } 2.3.3.Hàm getchar - Cú pháp: getchar(void) - Ý nghĩa: Nhận một ký tự từ bàn phím và trả về ký tự nhận được - Ví dụ /* Chương trình minh họa hàm getchar() */ #include main() /* Ham chinh */ { int j; printf("Nhap 1 ky tu: "); j=getchar(); //Nhận một ký tự từ bàn phím, rồi gán cho j.Giả sử j=A printf("%c\n",j); //in ra màn hình ký tự A printf("%d",j); // in ra màn hình mã ASCII của A là 65 } 2.3. 4. Hàm putchar - Cú pháp: int putchar(int ch) - ý nghĩa: Xuất một ký tự lên màn hình. Kết quả của hàm trả về ký tự xuất nếu thành công, ngược lại cho kết quả eof (-1) Ví dụ: char c=A; putchar(c);/*in ra màn hình ký tự A*/ 2.3.5. Hàm puts - Cú pháp: int puts(char *s) - ý nghĩa: Xuất một chuỗi lên màn hình với *s là con trỏ kiểu char trỏ tới ô nhớ đầu của vùng nhớ chứa chuỗi ký tự muốn xuất. Hàm này khi xuất sẽ đưa thêm ký tự \n vào cuối, kết quả của hàm =\n nếu thành công ngược lại = EOF. - Ví du: /*Chương trình minh họa hàm puts*/ 37
  40. #include main() { puts(""); puts("Hàm puts có chức năng: Ðưa một chuỗi ký tự ra màn hình "); puts("Khi thành công, hàm trả về ký tự cuối cùng được xuất."); puts("Khi có lỗi hàm trả về EOF."); } Câu hỏi, bài tập: 4.1. Nhập 2 số a và b. Tính tổng, hiệu, tính và thương của hai số đó. 4.2. 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: tiền = số lượng * đơn giá thuế giá trị gia tăng = 10% tiền 4.3. Viết chương trình nhập vào các cạnh của hình chữ nhật, tính chu vi, diện tích 4.4. Viết chương trình tính diện tích, chu vi hình tam giác 4.5. Lập trình nhập vào ba số thực a,b,c sau đó in ra màn hình các số vừa nhập 38
  41. BÀI 5: SỬ DỤNG CÂU LỆNH CÓ CẤU TRÚC ĐIỀU KIỆN Mã bài: 10.5 Giới thiệu: Câu lệnh có cấu trúc điều kiện cho phép ta thay đổi luồng của chương trình, dựa trên một điều kiện nào đó. Bài này sẽ giúp cho người học làm quen với cú pháp, sự hoạt động, sơ đồ khối câu lệnh có cấu trúc điều kiện if, switch và cách áp dụng các câu lệnh đó và trong các bài tập Mục tiêu: - Trình bày và phân biệt được câu lệnh đơn và lệnh ghép - Trình bày được cú pháp, sự hoạt động, lưu đồ khối của câu lệnh if dạng đầy đủ và dạng khuyết - Trình bày được cú pháp, sự hoạt động, lưu đồ khối của câu lệnh switch case - Sử dụng được câu lệnh if dạng khuyết và dạng đầy đủ vào trong các bài toán cụ thể. - Sử dụng được câu lệnh câu lệnh switch case vào trong các bài toán cụ thể. - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Lệnh có cấu trúc điều kiện if 1.1. Cấu trúc if dạng khuyết 1.1.1.Cú pháp if ( ) Trong đó: if: là từ khóa, : là một biểu thức có kiểu logic, : được thể hiện bằng 1 câu lệnh hay 1 khối lệnh  Lệnh đơn: Một biểu thức lệnh (gán, tăng giá trị) kết thúc bởi dấu”;” là một câu lệnh đ ơn. Một lời gọi hàm đi sau bằng một dấu “;” cũng là một câu lệnh đơn. 39
  42. Ví dụ: x=0; i++; printf(“\n”);  Lệnh ghép: Câu lệnh ghép là tập hợp các câu lệnh được bao bởi hai dấu “{ và }”. -Cú pháp: { . } -Ví dụ: { t=x; x=y; y=t; } Các thành phần bên trong của câu lệnh ghép sẽ được thực hiện một cách tuần tự xuất hiện. Đây chính là cấu trúc tuần tự trong các ngôn ngữ lập trình cấp cao. 1.1.2. Sự hoạt động Thứ tự thực hiện của câu lệnh if như sau: - Kiểm tra : + Nếu BT điều kiện đúng (!= 0)(TRUE) thì thực hiện câu lệnh hoặc khối lệnh liền sau điều kiện. + Nếu điều kiện sai thì bỏ qua lệnh hoặc khối lệnh liền sau điều kiện (những lệnh và khối lệnh sau đó vẫn được thực hiện bình thường vì nó không phụ thuộc vào điều kiện sau if). 1.1.3. Lưu đồ khối 40
  43. Bắt đầu S Biểu thức điều kiện Đ Công việc Thoát Hình 5.1: Sơ đồ hoạt động của câu lệnh if dạng khuyết 1.1.4. Bài tập Bài tập 1: Viết chương trình nhập vào số nguyên n, em hãy cho biết n la số chẵn hay sô lẻ #include #include main () { int n; printf("Nhap n = "); scanf("%d",&n); if (n%2==0) printf("n=%d la so chan”,n); if (n%2!=0) printf("n=%d la so le”,n); } Bài tập 2: Yêu cầu người chạy chương trình nhập vào giá trị của 2 số a và b, nếu a lớn hơn b thì in ra thông báo “Gia trị a lớn hơn giá trị b”, sau đó hiển thị giá trị cụ thể của 2 số lên màn hình. #include #include 41
  44. main () { int a,b; printf("Nhap vao gia tri a=");scanf("%d",&a); printf("Nhap vao gia tri b=");scanf("%d",&b); if(a>b) printf("\n Gia tri a=%d lon hon gia tri b=%d",a,b); if(b>a) printf("\n Gia tri a=%d nho hon gia tri b=%d",a,b); } Bài tập 3: Viết chương trình tìm max của hai số a,b rồi in kết quả lên màn hình #include #include main() { float a,b,max; printf("\n Cho a=");scanf("%f",&a); printf("\n Cho b=");scanf("%f",&b); max=a; if (b>max) max=b; printf("Max cua hai so a=%8.2f va b=%8.2f la max=%8.2f",a,b,max); } 1.2. Cấu trúc if dạng đầy đủ 1.2.1. Cú pháp if ( ) else Trong đó: + if, else: là từ khóa; + : là một biểu thức có kiểu logic + , : được thể hiện bằng 1 câu lệnh hay 42
  45. 1 khối lệnh 1.2.2. Sự hoạt động: Thứ tự thực hiện của câu lệnh if như sau: - Kiểm tra + Nếu điều kiện đúng thì thực hiện công việc 1. + Nếu điều kiện sai thì thực hiện công việc 2. - Các lệnh phía sau công việc 2 không phụ thuộc vào điều kiện. 1.2.3. Lưu đồ khối Bắt đầu S Biểu thứcđiều kiện Đ Công việc 1 Công việc 2 Thoát Hình 5.2: Sơ đồ hoạt động của câu lệnh if dạng đầy đủ 1.1.4. Bài tập Bài tập 1: Viết chương trình nhập vào số nguyên n, em hãy cho biết n la số chẵn hay sô lẻ #include #include main () { int n; printf("Nhap n = "); scanf("%d",&n); if (n%2==0) printf("n=%d la so chan”,n); 43
  46. else printf("n=%d la so le”,n); } Bài tập 2: Yêu cầu người chạy chương trình nhập vào giá trị của 2 số a và b, nếu a lớn hơn b thì in ra thông báo “Gia trị a lớn hơn giá trị b”, sau đó hiển thị giá trị cụ thể của 2 số lên màn hình. #include #include main () { int a,b; printf("Nhap vao gia tri a=");scanf("%d",&a); printf("Nhap vao gia tri b=");scanf("%d",&b); if(a>b) printf("\n Gia tri a=%d lon hon gia tri b=%d",a,b); else printf("\n Gia tri a=%d nho hon gia tri b=%d",a,b); } Bài tập 2. Viết chương trình tìm max của hai số a,b rồi in kết quả lên màn hình #include #include main () { int a,b,max; printf("Nhap a,b = "); scanf("%d%d",&a,&b); if (a >b) max=a; else max=b; printf(“giá trị lớn nhất=%d”,max); } * Lưu ý: - Ta có thể sử dụng các câu lệnh if else lồng nhau. Trong trường hợp if else lồng nhau thì else sẽ kết hợp với if gần nhất chưa có else. 44
  47. - Trong trường hợp câu lệnh if “bên trong” không có else thì phải viết nó trong cặp dấu {} (coi như là khối lệnh) để tránh sự kết hợp else if sai. 2. Lệnh có cấu trúc lựa chọn switch case 2.1. Cú pháp switch ( ) { case : Thực hiện các công việc 1 khi có giá trị là break; case giá trị 2: Thực hiện các công việc 2 khi có giá trị là break; case giá trị n: Thực hiện các công việc n khi có giá trị là break; default: Thực hiện công việc khi biểu thức có giá trị khác; break; } Trong đó: + : là giá trị kiểu số nguyên. + switch, case, default: là từ khóa 2.2. Sự hoạt động - Kiểm tra giá trị của biểu thức trước. - Nếu giá trị của biểu thức bằng giá trị 1 thì thực hiện công việc 1 rồi thoát. - Nếu giá trị của biểu thức khác giá trị 1 thì so sánh với giá trị 2, nếu bằng giá trị 2 thì thực hiện công việc 2 rồi thoát. - Cứ như thế, so sánh tới giá trị n. - Nếu tất cả các phép so sánh trên đều sai thì thực hiện công việc mặc định của 45
  48. trường hợp default. Lưu ý: Các giá trị sau case cũng phải là kiểu số nguyên, không bắt buộc phải có default. 2.3. Lưu đồ khối Bắt đầu Hình 5.3. Sơ đồ hoạt động của câu lệnh switch case 2.4. Bài tập Nhập vào một số nguyên, chia số nguyên này cho 2 lấy phần dư. Kiểm tra nếu phần dư bằng 0 thì in ra thông báo “số chẵn”, nếu số dư bằng 1 thì in thông báo “số lẻ”. #include #include main (){ int songuyen, phandu; printf("\n Nhap vao so nguyen "); scanf("%d",&songuyen); phandu=(songuyen % 2); switch(phandu) { case 0: printf("%d la so chan ",songuyen);break; case 1: printf("%d la so le ",songuyen); break; } } 46
  49. Câu hỏi, bài tập: 5.1. Viết chương trình nhập vào 3 số nguyên. In ra màn hình số nguyên nhỏ nhất trong 3 số đó. 5.2. Viết chương trình nhập vào họ tên, điểm thi cuối kỳ của một học sinh. In ra họ tên học sinh, và kết quả xếp loại của học sinh theo tiêu chuẩn sau: - Giỏi: Nếu Điểm kết quả >= 8 - Khá: Nếu 8 > Điểm >= 6.5 - Trung bình: Nếu 6.5 > Điểm >= 5 - Yếu: Nếu Điểm < 5 5.3. Viết chương trình giải phương trình bậc 1: bx + c = 0 5.4. Sử dụng câu lệnh switch case viết chương trình lựa chọn các công việc sau và hiển thị kết quả ra màn hình: - Tính diện tích hình chữ nhật - Tính diện tích vuông 5.5. Viết chương trình nhập vào số nguyên n, em hãy cho biết n số chẵn hay là lẻ 47
  50. BÀI 6: SỬ DỤNG CẤU TRÚC VÒNG LẶP FOR Mã bài: 10.6 Giới thiệu: Khi hiện thực một chương trình, có những trường hợp mà bạn sẽ phải thực hiện lặp lại liên tiếp nhiều lần một đoạn chương trình. Bài học này sẽ giúp sinh viên hiểu rõ hơn về cú pháp, sự hoạt động, sơ đồ khối của câu lệnh lặp for và cách thức hoạt động của nó trong các bài tập cụ thể. Mục tiêu: - Trình bày được cú pháp, sự hoạt động, lưu đồ khối của câu lệnh for - Sử dụng được câu lệnh câu lệnh for vào trong các bài toán cụ thể. - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1.Cú pháp for (Biểu thức 1; biểu thức 2; biểu thức 3) Trong đó: + for: là từ khóa + : được thể hiện là 1 câu lệnh hay 1 khối lệnh. + Biểu thức 1: là một biểu thức gán + Biểu thức 2: là một biểu thức điều kiện + Biểu thức 3: là một biểu thức tăng/ giảm để thay đổi giá trị của biến điều kiện. 2. Sự hoạt động - B1: Khởi gán giá trị cho biểu thức 1. - B2: Kiểm tra điều kiện của biểu thức 2. + Nếu giá trị của biểu thức 2 là sai (=0)(FALSE): thoát khỏi câu lệnh for. + Nếu giá trị của biểu thức 2 là đúng (!=0)(TRUE): được thực 48
  51. hiện. - B3: Tăng hoặc giảm giá trị của biểu thức 3 và quay lại B2. 3. Lưu đồ khối Hình 6.1. Sơ đồ hoạt động của câu lệnh for Một số lưu ý khi sử dụng câu lệnh for: - Trong mỗi biểu thức có thể có nhiều biểu thức con. Các biểu thức con được phân biệt nhau bởi dấu phẩy. - Bất kỳ biểu thức nào trong 3 biểu thức nói trên đều có thể vắng nhưng phải giữ dấu chấm phẩy (;). 4. Bài tập Bài tập1: Viết đoạn chương trình in dãy số nguyên từ 1 đến 10. #include #include main() { int i; printf("\n Day so tu 1 den 10: "); 49
  52. for(i=1;i #include main () { int i,s,n; printf("\n nhap n=");scanf(“%d”,&n); s=0; for(i=1;i<=n;i++) s=s+i; printf("tong s=%d ",s); } Câu hỏi, bài tập: Viết chương trình tính các tổng sau: 6.1. s = 1 + 2+ 3+ +n 6.2. s = 2 + 5+ +(3n – 1) 1 1 1 1 6.3. s = 1 + + + + + 2 3 4 푛 1 1 1 1 6.4. s= + + + + 3 6 9 3 ∗ 푛 6.5. s = 1-2+3- +(-1)n*n 1 1 1 1 6.6. s =1+ + + + + 2 4 6 2 ∗ 푛 1 1 1 1 6.7. s =1 + + + + + 2 ∗ 3 3 ∗ 4 4 ∗ 5 푛(푛 + 1) 1 1 1 1 6.8. s =1 + + + + + 1 ∗ 3 2 ∗ 4 3 ∗ 5 (푛 ― 1) ∗ (푛 + 1) 6.9. Sử dụng cấu trúc vòng lặp viết chương trình in dãy số nguyên từ 20 đến 1 50
  53. BÀI 7: SỬ DỤNG CẤU TRÚC VÒNG LẶP WHILE Mã bài: 10.7 Giới thiệu: Ngoài cấu trúc vòng lặp for đã được giới thiệu và hướng dẫn ở bài trước, Bài học này sẽ giúp sinh viên hiểu rõ hơn về cú pháp, sự hoạt động, sơ đồ khối của câu lệnh lặp mà có số lần lặp không xác định trước (while) và cách thức hoạt động của nó trong các bài tập cụ thể. Mục tiêu: - Trình bày được cú pháp, sự hoạt động, sơ đồ khối của câu lệnh while - Sử dụng được câu lệnh câu lệnh while vào trong các bài toán cụ thể. - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Cú pháp while (Biểu thức điều kiện) Trong đó: + while: là từ khóa + : được thể hiện là 1 câu lệnh hay 1 khối lệnh. + Biểu thức điều kiện: là một biểu thức có kiểu logic 2. Sự hoạt động - Kiểm tra Biểu thức điều kiện. - Nếu điều kiện sai (=0) (false) thì thoát khỏi lệnh while. - Nếu điều kiện đúng (!=0) (True) thì thực hiện công việc rồi quay lại kiểm tra điều kiện tiếp. 3. Lưu đồ khối 51
  54. Bắt đầu Biểu thức ĐK S Đ Thoát Công việc Hình 7.1. Sơ đồ hoạt động của câu lệnh while Lưu ý: - Vòng lặp dừng lại khi nào điều kiện sai. - Khối lệnh thực hiện công việc có thể rỗng, có thể làm thay đổi điều kiện. 4. Bài tập Bài tập 1. Viết đoạn chương trình in dãy số nguyên từ 1 đến 10. #include #include main() { int i; printf("\n Day so tu 1 den 10: "); i=1; while(i #include main() { int i,s,n; 52
  55. printf("\n nhap n=");scanf(“%d”,&n); s=0;i=1; while(i<=n) { s=s+i; i=i+1; } printf("tong s=%d ",s); } Câu hỏi, bài tập: Viết chương trình tính các tổng sau: 7.1. s = 1 + 2+ 3+ +n 7.2. s = 2 + 5+ 8 +(3n – 1) 1 1 1 1 7.3. s = 1 + + + + + 2 3 4 푛 1 1 1 1 7.4. s= + + + + 3 6 9 3 ∗ 푛 7.5. s = -1+2-3- +(-1)n*n 1 1 1 1 7.6. s =1+ + + + + 2 4 6 2 ∗ 푛 1 1 1 1 7.7. s =1 + + + + + 2 ∗ 3 3 ∗ 4 4 ∗ 5 푛(푛 + 1) 1 1 1 1 7.8. s =1 + + + + + 1 ∗ 3 2 ∗ 4 3 ∗ 5 (푛 ― 1) ∗ (푛 + 1) 7.9. Sử dụng cấu trúc vòng lặp viết chương trình in dãy số nguyên từ 20 đến 1 53
  56. BÀI 8: SỬ DỤNG CẤU TRÚC VÒNG LẶP DO WHILE Mã bài: 10.8 Giới thiệu: Bài học trước chúng ta đã tìm hiểu về câu lệnh lặp có số lần lặp không xác định trước while. Bài học này sẽ giúp sinh viên hiểu rõ hơn về cú pháp, sự hoạt động, sơ đồ khối của câu lệnh lặp mà hoạt động lặp sẽ thực hiện công việc trước, sau đó mới kiểm tra điều kiện lặp và cách thức hoạt động của nó trong các bài tập cụ thể. Mục tiêu: - Trình bày được cú pháp, sự hoạt động, sơ đồ khối của câu lệnh do while - Sử dụng được câu lệnh câu lệnh do while vào trong các bài toán cụ thể. - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Cú pháp do while ( ) Trong đó: + do, while: là từ khóa + : được thể hiện là 1 câu lệnh hay 1 khối lệnh. + Biểu thức điều kiện: là một biểu thức có kiểu logic 2. Sự hoạt động - Trước tiên thực hiện công việc, sau đó mới kiểm tra Biểu thức điều kiện. - Nếu điều kiện sai thì thoát khỏi lệnh do while. - Nếu điều kiện còn đúng thì thực hiện công việc rồi quay lại kiểm tra điều kiện tiếp. 54
  57. 3. Lưu đồ khối Bắt đầu Công việc Đ Biểu thức ĐK S Thoát Hình 8.1. Sơ đồ hoạt động của câu lệnh do while Lưu ý: Lặp while kiểm tra điều kiện trước khi thực hiện lặp, còn vòng lặp do while thực hiện lệnh lặp rồi mới kiểm tra điều kiện. Do đó vòng lặp do while thực hiện lệnh ít nhất một lần. 4. Bài tập Bài tập 1: Viết đoạn chương trình in dãy số nguyên từ 1 đến 10. #include #include main() { int i; printf("\n Day so tu 1 den 10: "); i=1; do printf("%d ",i++); while(i<=10); } Bài tập 2. Viết chương trình nhập vào một số nguyên n. Tính tổng của các số 55
  58. nguyên từ 1 đến n. #include #include main() { int i,s,n; printf("\n nhap n=");scanf(“%d”,&n); s=0;i=1; do { s=s+i; i=i+1; } while(i<=n); printf("tong s=%d ",s); } Câu hỏi, bài tập: Viết chương trình tính các tổng sau: 8.1. s = 1 + 2+ 3+ +n 8.2. s = 2 + 5+ +(3n – 1) 1 1 1 1 8.3. s = 1 + + + + + 2 3 4 푛 1 1 1 1 8.4. s= + + + + 3 6 9 3 ∗ 푛 8.5. s = 1-2+3- +(-1)n*n 1 1 1 1 8.6. s =1+ + + + + 2 4 6 2 ∗ 푛 1 1 1 1 8.7. s =1 + + + + + 2 ∗ 3 3 ∗ 4 4 ∗ 5 푛(푛 + 1) 1 1 1 1 8.8. s =1 + + + + + 1 ∗ 3 2 ∗ 4 3 ∗ 5 (푛 ― 1) ∗ (푛 + 1) 8.9. Viết chương trình cho phép người dùng nhập liên tục giá trị n cho đến khi nhập số âm thì dừng 8.10. Viết chương trình cho phép người dùng nhập liên tục giá trị n cho đến khi nhập số lẻ thì dừng 56
  59. BÀI 9: SỬ DỤNG CÁC CÂU LỆNH BREAK, CONTINUE, GOTO Mã bài: 10.9 Giới thiệu: Trong bài này chúng ta sẽ làm quen với cú pháp, sự hoạt động của câu lệnh break, continue, goto và cách áp dụng chúng để giải quyết các bài tập. Mục tiêu: - Trình bày được cú pháp, sự hoạt động, sơ đồ khối của câu lệnh break, continue, goto - Sử dụng được câu lệnh câu lệnh break, continue, goto vào trong các bài toán cụ thể. - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Lệnh break  Cú pháp: break; Dùng để thoát khỏi vòng lặp. Khi gặp câu lệnh này trong vòng lặp, chương trình sẽ thoát ra khỏi vòng lặp và chỉ đến câu lệnh liền sau nó. Nếu nhiều vòng lặp >break sẽ thoát ra khỏi vòng lặp gần nhất. Ngoài ra, break còn được dùng trong cấu trúc lựa chọn switch.  Ví dụ: Cho phép người dùng nhập liên tục giá trị n cho đến khi nhập âm thì dừng. #include #include main() { int n; while(n>0) { printf(“Nhap n: ”);scanf(“%d”, &n); if(n<0) 57
  60. break; } } 2. Lệnh continue Cú pháp: continue; - Khi gặp lệnh này trong các vòng lặp, chương trình sẽ bỏ qua phần còn lại trong vòng lặp và tiếp tục thực hiện lần lặp tiếp theo. - Ðối với lệnh for, biểu thức 3 sẽ được tính giá trị và quay lại bước 2. - Ðối với lệnh while, do while; biểu thức điều kiện sẽ được tính và xét xem có thể tiếp tục thực hiện nữa hay không? (dựa vào kết quả của biểu thức điều kiện).  Ví dụ: Viết chương trình in ra tất cả các số lẻ nhỏ hơn 100 trừ các số 5,7,93 #include #include main() { int i; for(i=1;i<100;i+=2) { if((i==5)||(i==7)||(i==93)) continue; printf("%5d", i); } } 3.Câu lệnh goto Nhãn có cùng dạng như tên biến và có dấu hai chấm (:) đứng sau. Nhãn có thể được gán cho bất kỳ câu lệnh nào trong chương trình. Ví dụ 1: t:s+=a;/* t là nhãn của câu lệnh gán */ Cú pháp của toán tử goto goto nhan; Khi gặp toán tử này máy sẽ nhảy tới thực hiện câu lệnh viết sau từ khóa goto. 58
  61. Ví dụ 2: int s=1,a=3; goto t;/*Nhảy tới thực hiện lệnh sau t*/ ++a; t: s+=a;/*Kết quả s=4, bỏ qua lệnh ++a*/ Ví dụ 3: #include main() { // Khai báo biến cục bộ: int a = 10; // Vòng lặp do while VONGLAP:do // tại đây label là VONGLAP, và lệnh là do { if(a==15) { // nhảy qua bước lặp. a=a+1; goto VONGLAP; } printf("\n Gia tri cua a la:%d ",a); a=a+1; }while(a<20); return 0; } * Chú ý: - Câu lệnh goto và nhãn cần nằm trong một hàm. - Không cho phép dùng toán tử goto nhảy từ ngoài vào trong một khối lệnh, tuy nhiên nhảy từ trong ra ngoài khối lệnh là hoàn toàn hợp lệ. Câu hỏi, bài tập: 59
  62. 9.1: Lệnh nào trong các lệnh sau dùng để thoát khỏi vòng lặp (for, while) và câu lệnh switch. a. break c. continue b. goto d. exit 9.2: Lệnh nào trong các lệnh sau cho phép chuyển tới một nơi nào đó đã được gán nhãn. a. break c. continue b. goto d. exit 9.3: In ra màn hình giá trị từ 10 đến 20 trừ đi số 13 và số 17. 9.4. Viết chương trình cho phép người dùng nhập liên tục giá trị n cho đến khi nhập số lẻ thì dừng 60
  63. BÀI 10: GIỚI THIỆU VỀ HÀM Mã bài: 10.10 Giới thiệu: 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 đoạn nhỏ, mỗi đoạn giải quyết một công việc nào đó. Các đoạn như vậy gọi là các hàm. Qua bài này sẽ giới thiệu cho sinh viên hiểu được khái niệm, cách khai báo, và kết quả trả về của hàm. Mục tiêu: - Trình bày được khái niệm hàm - Trình bày được cách khai báo hàm, khai báo hàm không định kiểu và định kiểu dữ liệu - Trình bày được quy tắc xây dựng hàm và vận dụng được khi thiết kế xây dựng chương trình. - Trình bày cú pháp và sự hoạt động của câu lệnh return và exit - Viết chương trình theo cấu trúc hàm không định kiểu và định kiểu dữ liệu - Sử dụng được hàm không định kiểu và định kiểu dữ liệu vào các bài tập - Sử dụng câu lệnh return- Lệnh Exit vào trong các bài tập - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Khái niệm - Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một công việc nhất định sau đó trả về giá trị cho chương trình gọi nó, hay nói cách khác hàm là sự chia nhỏ của chương trình. - Hàm có hai loại: hàm chuẩn và hàm tự định nghĩa. Trong chương này, ta chú trọng đến cách định nghĩa hàm và cách sử dụng các hàm đó. 61
  64. Một hàm khi được định nghĩa thì có thể sử dụng bất cứ đâu trong chương trình. Trong C, một chương trình bắt đầu thực thi bằng hàm main. Ví dụ 1: Ta có 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: Ta có 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 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))); return 0; } Hàm thư viện - Hàm thư viện là những hàm đã được định nghĩa sẵn trong một thư viện nào đó, muốn sử dụng các hàm thư viện thì phải khai báo thư viện trước khi sử dụng bằng lệnh #include - Ý nghĩa của một số thư viện thường dùng: 1. stdio.h: Thư viện chứa các hàm vào/ ra chuẩn (standard input/output). Gồm các hàm printf(), scanf(), getc(), putc(), gets(), puts(), fflush(), fopen(), fclose(), fread(), fwrite(), getchar(), putchar(), getw(), putw() 62
  65. 2. conio.h: Thư viện chứa các hàm vào ra trong chế độ DOS (DOS console). Gồm các hàm clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), clreol(), 3. math.h: Thư viện chứa các hàm tính toán gồm các hàm abs(), sqrt(), log(). log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(), 4. alloc.h: Thư viện chứa các hàm liên quan đến việc quản lý bộ nhớ. Gồm các hàm calloc(), realloc(), malloc(), free(), farmalloc(), farcalloc(), farfree(), 5. io.h: Thư viện chứa các hàm vào ra cấp thấp. Gồm các hàm open(), _open(), read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(), 6. graphics.h: Thư viện chứa các hàm liên quan đến đồ họa. Gồm initgraph(), line(), circle(), putpixel(), getpixel(), setcolor(), Muốn sử dụng các hàm thư viện thì ta phải xem cú pháp của các hàm và sử dụng theo đúng cú pháp (xem trong phần trợ giúp của Turbo C). 2. Khai báo hàm Cú pháp chung: Tên hàm ([các_tham_số]); - Trong đó + : theo quy tắc đặt tên. + : tham số hình thức đầu vào giống khai báo biến, cách nhau bằng dấu phẩy “,” 2.1. Khai báo hàm không định kiểu dữ liệu - Cú pháp: void Tên_hàm ([danh sách các tham số]) { Khai báo các biến cục bộ; Các câu lệnh / khối lệnh hay lời gọi đến hàm khác; } - Trong đó + : theo quy tắc đặt tên. 63
  66. + : tham số hình thức đầu vào giống khai báo biến, cách nhau bằng dấu phẩy “,” -Ví dụ: void XuatTong(int x, int y) { int s; s=x+y; printf(“%d cong %d bang %d”,x,y,s); } void hieu(int x, int y) { int s; s=x-y; printf(“%d hieu %d bang %d”,x,y,s); } 2.2. Khai báo hàm có định kiểu dữ liệu - Cú pháp: Tên_hàm ([danh sách các tham số]) { kq; Khai báo các biến cục bộ; Các câu lệnh / khối lệnh hay lời gọi đến hàm khác; return kq; } - Trong đó + : kiểu bất kỳ của C (char, int, long, float, ). + : theo quy tắc đặt tên. + : tham số hình thức đầu vào giống khai báo biến, cách nhau bằng dấu, + : trả về cho hàm qua lệnh return. 64
  67. - Bên trong thân hàm (phần giới hạn bởi cặp dấu {}) là các khai báo cùng các câu lệnh xử lý. Các khai báo bên trong hàm được gọi là các khai báo cục bộ trong hàm và các khai báo này chỉ tồn tại bên trong hàm mà thôi. Ví dụ: { int s; s = x + y; return s; } int hieu(int x,int y) { int s; s = x - y; return s; } 3. Kết quả trả về của hàm- lệnh return- lệnh exit 3.1. Kết quả trả về của một hàm - Một hàm khi định nghĩa thì chúng vẫn chưa được thực thi trừ khi ta có một lời gọi đến hàm đó. - Cú pháp gọi hàm: ([Danh sách các tham số]) + Ví dụ 1: Xét bài toán tính tổng s=1+2+3+ +n số nguyên void tinhtong(int s) { int i; s=1; for(i=1;i<4;i++) s=s+i; printf(“%d”,s); } main() { int s; tinhtong(s); } 65
  68. + Ví dụ 2: Xét bài toán xuất kết quả của ba số nguyên a, b, c #include #include int sub(int a,int b) { int c; a=a+3; b=b+5; c=a-b; return c; } main() { int a,b,c ; a=9; b=5; c=sub(a,b); printf("%d %d %d",a,b,c); } Lưu ý: Việc gọi hàm là một phép toán, không phải là một phát biểu. 3.2. Lệnh return: dùng để thoát khỏi một hàm và có thể trả về một giá trị nào đó. Cú pháp: return ; /*không trả về giá trị*/ return ; /*Trả về giá trị của biểu thức*/ Nếu hàm có kết quả trả về, ta bắt buộc phải sử dụng câu lệnh return để trả về kết quả cho hàm. Ví dụ 1: Viết hàm tìm số lớn giữa 2 số nguyên a và b int max(int a,int b) { return(a>b)?a:b; } 3.3. Lệnh exit() Hàm exit() trong C được sử dụng để thoát khỏi chương trình. Hàm này, khi được 66
  69. 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ề); 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. 4. Bài tập Bài tập 1: Viết chương trình không định kiểu tìm giá trị lớn nhất của 2 số a,b nhập từ bàn phím. #include #include void tim_max(int a,int b) { if(a>=b) printf(" gia tri lon nhat la %d",a); else printf(" gia tri lon nhat la %d",b); } main() { int a,b; printf("nhap a=");scanf("%d",&a); printf("nhap b=");scanf("%d",&b); tim_max(a,b); } Bài tập 2: Viết chương trình định kiểu tìm giá trị lớn nhất của 2 số a,b nhập từ bàn phím. #include #include int tim_max(int a,int b) { 67
  70. if(a>=b) return a; else return b; } main() { int a,b; printf("nhap a=");scanf("%d",&a); printf("nhap b=");scanf("%d",&b); printf("Max là %d ",tim_max(a,b)); } Câu hỏi, bài tập Sử dụng hàm định kiểu và không định kiểu dữ liệu làm các bài tập sau: 10.1. Viết chương nhập vào số nguyên a,b. Tính tổng, hiệu, tích, thương của hai số đó 10.2. Viết chương trình nhập vào các cạnh của hình chữ nhật, tính chu vi, diện tích 10.3. Viết chương trình tính diện tích, chu vi hình tam giác 10.4. Viết hàm định kiểu dữ liệu thực hiện tính tổng dưới đây và in kết quả ra màn hình s=1 + 2 + 3 + 4 + + n 10.5. Viết hàm định kiểu dữ liệu thực hiện tính tổng dưới đây và in kết quả ra màn hình s = 2 + 4 + 6 + 8 + + 2*n 10.6. Viết hàm định kiểu dữ liệu thực hiện tính tổng dưới đây và in kết quả ra màn hình s = 1 + 3 + 5 + 7 + +( 2*n-1) 68
  71. BÀI 11: TRUYỀN THAM SỐ CHO HÀM Mã bài: 10.11 Giới thiệu: Trong quá trình học tập cũng như làm việc với hàm. Truyền tham số cho hàm là một kiến thức không thể thiếu với tất cả chúng ta. Bài này sẽ giới thiệu cho sinh viên biết được về tham biến, tham trị và cách áp dụng nó vào trong bài tập Mục tiêu: - Trình bày được quy tắc xây dựng hàm và vận dụng được khi thiết kế xây dựng chương trình. - Thực hiện được cách truyền tham số đúng cho hàm - Viết chương trình theo cấu trúc hàm - Sử dụng được các lệnh kết thúc và lấy giá trị trả về của hàm. - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Cách truyền tham số cho hàm  Tham số hình thức, tham số thực và biến cục bộ - Các tham số dùng khi khai báo hàm được gọi là tham số hình thức. Các tham số được cung cấp cho hàm khi gọi hàm là tham số thực. Tham số thực có thể là một biểu thức, trong khi tham số hình thức thì không thể là 1 biểu thức. Dãy các tham số thực phải tương ứng về kiểu với tham số hình thức. Có những hàm không cần có tham số. Vì vậy, khi khai báo ta có thể dùng từ khóa void để báo rằng hàm không cần tham số. - Biến cục bộ là biến chỉ có phạm vi hoạt động trong nội bộ hàm, được khai báo bên trong hàm. Do tham số thực và biến cục bộ đều có phạm vi hoạt động trong cùng một hàm nên tham số thực và biến cục bộ cần có tên khác nhau. 69
  72. - Mặc nhiên, việc truyền tham số cho hàm trong C là truyền theo giá trị nghĩa là các giá trị thực (tham số thực) không bị thay đổi giá trị khi truyền cho các tham số hình thức - Khi chương trình con được gọi để thi hành, tham trị được cấp ô nhớ và nhận giá trị là bản sao giá trị của tham số thực. Do đó, mặc dù tham trị cũng là biến, nhưng việc thay đổi giá trị của chúng không có ý nghĩa gì đối với bên ngoài hàm, không ảnh hưởng đến chương trình chính, nghĩa là không làm ảnh hưởng đến tham số thực tương ứng. - Tham trị: Một tham số được truyền theo dạng tham trị thì giá trị sẽ không bị thay đổi khi kết thúc chương trình - Truyền tham biến: Không giống như truyền tham trị, truyền tham biến sẽ làm thay đổi giá trị của biến truyền vào. Vì vậy, cách thao tác làm thay đổi trên địa chỉ truyền vào thì khi kết thúc hàm vẫn được giữ nguyên. 2. Bài tập - Tham trị: void traodoi(int x, int y) //Đây là tham trị nên không thay đổi giá trị { int z=x; x=y; y=z; } main() { int x,y; x=5;y=6; traodoi(x,y); printf(“%d%d”,x,y); } - Tham biến: Một tham số được truyền theo dạng tham biến thì giá trị sẽ bị thay đổi khi kết thúc chương trình void traodoi(int &x, int &y) { int z=x; x=y; y=z; 70
  73. } main() { int x,y; x=5;y=6; traodoi(x,y); printf(“%d%d”,x,y); } Câu hỏi, bài tập: Sử dụng hàm dưới dạng tham trị và tham biến viết các chương trình sau: 11.1. Viết chương nhập vào số nguyên a,b. Tính tổng, hiệu, tích, thương của hai số đó 11.2. Viết chương trình nhập vào các cạnh của hình chữ nhật, tính chu vi, diện tích 11.3. Viết chương trình tìm giá trị lớn nhất, nhỏ nhất của 2 số nguyên a,b 71
  74. BÀI 12: NHẬP XUẤT DỮ LIỆU CHO MẢNG MỘT CHIỀU Mã bài: 10.12 Giới thiệu: Mảng dữ liệu là một tập hợp các phần tử có cùng kiểu dữ liệu và được truy cập thông qua tên. Việc vận dụng mảng dữ liệu trong việc học tập và làm việc là điều không thể thiếu. Bài học này sẽ cung cấp cho chúng ta khái niệm, khai báo, khởi tạo, cách nhập xuất mảng một chiều. Mục tiêu: - Nêu được định nghĩa của mảng - Nêu, phân tích được các cách khai báo của mảng một chiều - Trình bày được chỉ số và phép lấy địa chỉ của mảng một chiều - Thực hiện được cách khởi tạo, truy nhập vào các phần tử của mảng một chiều - Trình bày được cách nhập xuất mảng một chiều - So sánh được cách nhập xuất của mảng với cách nhập xuất của biến - Sử dụng cách nhập xuất mảng vào trong các bài tập - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Khái niệm - Mảng là tập hợp hữu hạn các phần tử cùng kiểu, lưu trữ kế tiếp nhau trong bộ nhớ - Các phần tử trong mảng có cùng tên (là tên mảng) nhưng phân biệt với nhau ở chỉ số cho biết vị trí của nó trong mảng 2. Khai báo mảng một chiều Cú pháp:  Ý nghĩa: - Tên mảng: đây là một cái tên đặt đúng theo quy tắc đặt tên. Tên này cũng mang ý nghĩa là tên biến mảng. 72
  75. - Số phần tử: là một hằng số nguyên, cho biết số lượng phần tử tối đa trong mảng là bao nhiêu (hay nói khác đi kích thước của mảng là gì). - Kiểu: mỗi phần tử của mảng có dữ liệu thuộc kiểu gì. - Ở đây, ta khai báo một biến mảng gồm có số phần tử, phần tử thứ nhất là tên mảng [0], phần tử cuối cùng là tên mảng[số phần tử -1] Ví dụ: int a[10]; /* Khai báo biến mảng tên a, phần tử thứ nhất là a[0], phần tử cuối cùng là a[9].*/ Ta có thể coi mảng a là một dãy liên tiếp các phần tử trong bộ nhớ như sau: Vị trí: 0 1 2 3 4 5 6 7 8 9 Phần tử: a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 3. Khởi tạo mảng 3.1. Khởi tạo mảng Gồm các cách sau:  Khởi tạo giá trị cho mọi phần tử của mảng VD: int a[4] = {12, 17, 15, 19}; 0 1 2 3 A 12 17 15 19  Khởi tạo giá trị cho một số phần tử đầu mảng VD: int a[4] = {12, 17}; 0 1 2 3 a 12 17 0 0  Khởi tạo giá trị 0 cho mọi phần tử của mảng VD: int a[4] = {0}; 0 1 2 3 a 0 0 0 0 73
  76. Tự động xác định số lượng phần tử VD: int a[4] = {12, 17, 15, 19}; 0 1 2 3 a 12 17 15 19 3.2. Chỉ số của mảng Chỉ số của mảng phải là một giá trị kiểu int không vượt qua kích thước của mảng, chỉ số của mảng bắt đầu từ 0. - Ví dụ: int a[5]; /*Gồm 5 phần tử tương ứng các chỉ số từ 0 4 (a[0],a[1],a[2],a[3],a[4]) */ 3.3. Lấy địa chỉ của phần tử mảng một chiều Chỉ lấy được địa chỉ của các phần tử thuộc mảng một chiều thông qua toán tử & theo cú pháp: &tên_biến[i] (i là chỉ số của mảng) Chú ý: Tên của mảng sẽ chứa địa chỉ đầu của mảng Ví dụ: có int a[10] thì a=&a[0] 4.Nhập xuất dữ liệu cho các phần tử của mảng một chiều - Ví dụ: nhập xuất dữ liệu cho một mảng một chiều (kiểu int). #include #include main() { int a[5]; int i; /*Nhập dữ liệu*/ for (i=0;i<5;i++) { printf("\n a[%d]",i); scanf("%d",&a[i]); /*nhập trực tiếp bằng phép lấy địa chỉ*/ } 74
  77. /*Ðưa các kết quả ra màn hình*/ for (i=0;i<5;i++) printf("%d ",a[i]); } Câu hỏi, bài tập: 12.1. Lập trình thực hiện các công việc sau: - Nhập vào mảng một dãy số nguyên a1,a2,a3 an - In dãy vừa nhập ra màn hình -Tính tổng các phần tử đã nhập vào - Tinh trung bình cộng các phần tử đã nhập vào -Tính trung bình cộng các phần tử chẵn, lẻ đã nhập vào - Tìm và in giá trị lớn nhất, nhỏ nhất của mảng - Xuất ra dãy các số chẵn, số lẻ của các phần tử đã nhập vào 12.3. Lập trình thực hiện các công việc sau: - Nhập vào mảng một dãy số thực a1,a2,a3 an - In dãy vừa nhập ra màn hình -Tính tổng các phần tử đã nhập vào 75
  78. BÀI 13: SỬ DỤNG MẢNG MỘT CHIỀU LÀM THAM SỐ CHO HÀM Mã bài: 10.13 Giới thiệu: Qua bài này chúng ta sẽ tìm hiểu về cách truyền tham số cho hàm trong mảng, ý tưởng, các bước tiến hành và giải thuật tìm kiếm tuyến tính trong mảng một chiều. Mục tiêu: -Trình bày được thuật toán viết mảng dưới dạng hàm - Trình bày được thuật toán tìm kiếm vị trí, tìm kiếm phần tử trên mảng một chiều - Viết được các bài tập của mảng một chiều dưới dạng hàm - Áp dụng thuật toán tìm kiếm vị trí, tìm kiếm phần tử vào trong các bài tập - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1.Dùng mảng làm tham số cho hàm  Truyền mảng cho hàm - Tham số kiểu mảng trong khai báo hàm giống như khai báo biến mảng Ví dụ: void NhapMang(int a[100],int &n) { int i; for(i=0;i<n;i++) { printf("a[%d]=",i);scanf("%d",&a[i]); } } - Tham số kiểu mảng truyền cho hàm chính là địa chỉ của phần tử đầu tiên của mảng + Có thể bỏ số lượng phần tử hoặc sử dụng con trỏ. + Mảng có thể thay đổi nội dung sau khi thực hiện hàm. 76
  79. VD: void SapXepTang(int a[100],int n) void SapXepTang(int *a);  Lời gọi hàm void NhapMang(int a[100], int &n); void XuatMang(int a[100], int n); main() { int a[100], n; NhapMang(a, n); XuatMang(a, n); }  Ví dụ: Viết chương trình nhập vào một mảng n số nguyên hãy viết chương trình con thực hiện các công việc sau: - Nhập mảng - In mảng vừa nhập ra màn hình #include #include void nhap(int a[100],int & n) { int i; for(i=0;i<n;i++) { printf("a[%d]=",i);scanf("%d",&a[i]); } } void inra(int a[100],int n) { int i; printf("mang sau khi nhap"); for(i=0;i<n;i++) printf("%3d",a[i]); } main() 77
  80. { int chon; int a[100],n; printf("nhap n=");scanf("%d",&n); nhap(a,n); inra(a,n); } 2. Tìm kiếm trong mảng một chiều Yêu cầu: Tìm xem phần tử x có nằm trong mảng a kích thước n hay không? Nếu có thì nó nằm ở vị trí đầu tiên nào. 2.1. Ý tưởng Xét từng phần của mảng a. Nếu phần tử đang xét bằng x thì trả về vị trí đó. Nếu kô tìm được thì trả về -1. 2.2. Các bước tiến hành • Bước 1: Khởi gán i=0; • Bước 2: So sánh a[i] với giá trị x cần tìm, có 2 khả năng + a[i] = = x tìm thấy x. Dừng; + a[i] != x sang bước 3; • Bước 3: i=i+1 // Xét tiếp phần tử kế tiếp trong mảng Nếu i= =N: Hết mảng. Dừng; Ngược lại: Lặp lại bước 2; 2.3. Giải thuật Từ mô tả trên đây của thuật toán tìm tuyến tính, có thể cài đặt hàm TimTuyenTinh để xác định vị trí của phần tử khóa x trong mảng a: int TimKiem(int a[], int n, int x) { int i for(i=0;i<n;i++) { if(a[i]== x) { return i; 78
  81. } return -1; } 3. Bài tập: Viết chương trình nhập vào một mảng n số nguyên hãy viết chương trình dưới dạng hàm thực hiện các công việc sau: a. In mảng vừa nhập ra màn hình b. Nhập vào một phần tử x, kiểm tra có x trong mảng hay không, nếu có thông báo số lần xuất hiện phần tử x trong mảng, nếu không thì thông báo không có phần tử x trong mảng Ví dụ: Nhập vào dãy: 2,4,6,5,2. Nhập vào x=2 thông báo có 2 giá trị x=2 trong dãy c. Kiểm tra phần tử x trong mảng hay không, nếu có thông báo phần tử đó nằm ở vị trí nào đầu tiền của mảng, nếu không có thì thông báo không có phần tử x trong mảng #include #include void nhap(int a[100],int& n) { int i; for(i=0;i<n;i++) { printf("a[%d]=",i);scanf("%d",&a[i]); } } void inra (int a[100],int n) { int i; printf("mang sau khi nhap"); for(i=0;i<n;i++) printf("%3d",a[i]); } void timgiatri(int a[100],int n) 79
  82. { int x,d,i; printf(" nhap x=");scanf("%d",&x); d=0; for(i=0;i<n;i++) if(a[i]==x) d=d+1; if (d!=0) printf("co %d phan tu %d trong day",d,x); else printf("k co phan tu %d trong day",x); } int timkiemVT(int a[],int n,int k) { int i; for(i=0;i<n;++i) { if(a[i]==k) { return i; } } return -1; } main() { int chon; int a[100],n,k; do { printf("1. Nhap DS MANG\n"); printf("2. In DS MANG\n"); printf("3. Tim kiem gia tri\n"); printf("4. Tim kiem vi tri\n"); 80
  83. printf("0. Thoat\n"); printf("\nBan chon 1, 2, 3, 4, 0: "); scanf("%d",&chon); switch(chon) { case 1: printf(" nhap n=");scanf("%d",&n); nhap(a,n); break; case 2: inra(a,n); break; case 3: tim(a,n); break; case 4: printf(" nhap k=");scanf("%d",&k); int tt=timkiemVT(a,n,k); if(tt==-1) printf("Ko tim thay phan tu %d \n", k); else printf("Tim duoc phan tu %d tai vi tri %d \n",k,tt); break; } } while(chon!=0); } Câu hỏi, bài tập: 13.1. Lập trình thực hiện các công việc sau dưới dạng hàm - Nhập vào mảng một dãy số nguyên a1,a2,a3 an - Tính tổng của các phần tử đã nhập vào - Tìm và in giá trị lớn nhất, nhỏ nhất của mảng - Xuất ra dãy các số chẵn, số lẻ của các phần tử đã nhập vào - Nhập vào một phần tử k từ bàn phím, kiểm tra xem có bao nhiêu giá trị k xuất hiện trong dãy VD: Nhập vào dãy: 1,4,6,5,1. Nhập vào k=1 => có 2 giá trị k=1 trong dãy 81
  84. 13.2. Lập chương trình thực hiện các công việc sau dưới dạng hàm - Nhập vào một dãy số nguyên a1,a2,a3, an - Tính trung bình cộng của các phần tử đã nhập vào - Tính trung bình cộng các số chẵn, số lẻ trong dãy - Tìm kiếm một phần tử được nhập vào từ bàn phím có trong mảng hay không? - Tính tổng các phần tử lẻ của dãy số đã nhập vào n - Tính tổng s =  i-1 1/ai với giả thiết ai khác 0 với mọi i - Tính tổng các phần tử là chẵn của dãy vừa nhập. - In ra màn hình phần tử có giá trị bằng x nhập từ bàn phím 82
  85. BÀI 14: SẮP XẾP MẢNG MỘT CHIỀU Mã bài: 10.14 Giới thiệu: Sắp xếp là quá trình xử lý một danh sách các phần tử để đặt chúng theo một thứ tự thỏa mãn một tiêu chuẩn nào đó dựa trên nội dung thông tin lưu giữ tại mỗi phần tử. Bài học này sẽ giúp chúng ta biết được ý tưởng, các bước tiến hành và thuật toán sắp xếp mảng một chiều bằng phương pháp đổi chỗ. Mục tiêu: - Trình bày được thuật toán sắp xếp trên mảng một chiều - Áp dụng thuật toán sắp xếp vào trong các bài tập - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Ý tưởng Xuất phát từ đầu dãy, tìm tất các các nghịch thế chứa phần tử này, triệt tiêu chúng bằng cách đổi chỗ 2 phần tử trong cặp nghịch thế. Lặp lại xử lý trên với phần tử kế trong dãy. (Nghịch thế: Là xét một dãy a1, a2, an . Nếu i aj thì gọi đó là một nghịch thế) 2. Các bước tiến hành như sau + Bước 1: i = 0; // bắt đầu từ đầu dãy + Bước 2: j = i+1; //tìm các nghịch thế với a[i] + Bước 3: Trong khi j < N thực hiện Nếu a[j]<a[i] //xét cặp a[i], a[j] Hoán vị (a[i],a[j]); j = j+1; + Bước 4: i = i+1; Nếu i < N-1: Lặp lại Bước 2. 83
  86. Ngược lại: Dừng. 3. Giải thuật void SXDoicho(int a[], int N) { int i,j,tg; for(i = 0; i<N-1; i++) for(j =i+1;j < N ;j++) if(a[j ]< a[i])// Thỏa 1 cặp nghịch thế { tg=a[i]; a[i]=a[j]; a[j]=tg; } }  Ví dụ: cho dãy số: 2 12 8 5 1 6 4 15 84
  87. Câu hỏi, bài tập: Lập trình thực hiện các công việc sau: 14.1. Nhập vào mảng một dãy số nguyên a1,a2,a3 an 14.2. Sắp xếp mảng theo thứ tự tăng dần 14.3. Sắp xếp mảng theo thứ giảm dần 86
  88. BÀI 15: NHẬP XUẤT CHUỖI KÝ TỰ Mã bài: 10.15 Giới thiệu: Trong bài học này chúng ta sẽ làm quen với khái niệm chuỗi ký tự, khai báo, các hàm nhập xuất trên chuỗi. Mục tiêu: - Nêu khái niệm chuỗi ký tự - Khai báo được biến chuỗi ký tự - Thực hiện được thao tác nhập vào một chuỗi ký tự cho chương trình - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Khái niệm Chuỗi ký tự là một dãy gồm các ký tự hoặc một mảng các ký tự được kết thúc bằng ký tự ‘\0’ (còn được gọi là ký tự NULL trong bảng mã Ascii). Các hằng chuỗi ký tự được đặt trong cặp dấu nháy kép “ ”. 2. Khai báo biến chuỗi 2.1 Khai báo theo mảng  Cú pháp: char [Chiều dài tối đa]  Ví dụ: Trong chương trình, ta có khai báo: char Ten[12]; Trong khai báo này, bộ nhớ sẽ cung cấp 12+1 bytes để lưu trữ nội dung của chuỗi ký tự Ten; byte cuối cùng lưu trữ ký tự ‘\0’ để chấm dứt chuỗi. Ghi chú: - Chiều dài tối đa của biến chuỗi là một hằng nguyên nằm trong khoảng từ 1 đến 255 bytes. - Chiều dài tối đa không nên khai báo thừa để tránh lãng phí bộ nhớ, nhưng cũng không nên khai báo thiếu. 87
  89. 2.2. Vừa khai báo vừa gán giá trị Cú pháp: char []= Ví dụ: #include #include int main() { char Chuoi[]="Mau nang hay la mau mat em” ; printf("Vua khai bao vua gan trị: %s”,Chuoi) ; return 0; } * Ghi chú: Chuỗi được khai báo là một mảng các ký tự nên các thao tác trên mảng có thể áp dụng đối với chuỗi ký tự. 3. Vào ra với xâu ký tự 3.1. Nhập chuỗi từ bàn phím Để nhập một chuỗi ký tự từ bàn phím, ta sử dụng hàm gets() Cú pháp: gets( ) Ví dụ: char Ten[20]; gets(Ten); Ta cũng có thể sử dụng hàm scanf() để nhập dữ liệu cho biến chuỗi, tuy nhiên lúc này ta chỉ có thể nhập được một chuỗi không có dấu khoảng trắng. 3.2. Xuất chuỗi lên màn hình Để xuất một chuỗi (biểu thức chuỗi) lên màn hình, ta sử dụng hàm puts(). Cú pháp: puts( ) Ví dụ: Nhập vào một chuỗi và hiển thị trên màn hình chuỗi vừa nhập. #include #include #include int main() { char Ten[12]; 88
  90. printf("Nhap chuoi: ");gets(Ten); printf("Chuoi vua nhap: ");puts(Ten); return 0; } Ngoài ra, ta có thể sử dụng hàm printf(), cputs() (trong conio.h) để hiển thị chuỗi lên màn hình. Câu hỏi, bài tập: 15.1. Các khai báo biến sau đây. Khai báo nào đúng a. char HoTen; b. char HoTen[20]; c. char *HoTen[20]; d. Tất cả đều đúng 15.2. Khai báo nào đúng với khai báo kiểu chuỗi: a. int a, b; c. a,b: float; b. char ten[12]; d. Tất cả các câu trên đều đúng 15.3. Nhập vào một chuỗi gồm mã sinh viên, họ tên, năm sinh. Hiển thị trên màn hình chuỗi vừa nhập. 15.4. 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: tiền = số lượng * đơn giá thuế giá trị gia tăng = 10% tiền Hiển thị kết quả lên màn hình. 89
  91. BÀI 16: THAO TÁC TRÊN CHUỖI KÝ TỰ Mã bài: 10.16 Giới thiệu: Trong bài học này chúng ta sẽ làm quen với các hàm cộng, xác định độ dài, hàm ghép, hàm so sánh, hàm đổi chữ hoa sang chữ thường và ngược lại trên chuỗi ký tự. Cách áp dụng các hàm đó vào trong các bài tập. Mục tiêu: - Nêu cú pháp và công dụng của các phép toán trên chuỗi - Áp dụng các phép toán đó vào trong một chương trình cụ thể - Tích cực hóa người học, rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm. - Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy. Nội dung chính: 1. Các phép toán trên chuỗi ký tự Cộng chuỗi - Hàm strcat() - Cú pháp: strcat (s1,s2): nối s1 và s2 . - Ý nghĩa: Hàm này có tác dụng ghép chuỗi (s1) vào chuỗi (s2). - Ví dụ 1: giá trị câu s1: " ABC" ; s2: " ABE" => strcat(s1,s2) ; => " ABCABE"; Xác định độ dài chuỗi - Hàm strlen() - n = strlen(s1): cho biết độ dài của chuỗi s1. - Ví dụ: Sử dụng hàm strlen xác định độ dài một chuỗi nhập từ bàn phím. #include #include #include int main(){ char Chuoi[255]; int Dodai; printf("Nhap chuoi: ");gets(Chuoi); Dodai = strlen(Chuoi) 90
  92. printf("Chuoi vua nhap: ");puts(Chuoi); printf(“Co do dai %d”,Dodai); getch(); } Đổi một ký tự thường thành ký tự hoa - Hàm toupper() #include #include #include main() { char n,k; printf(“ nhap ky tu”); scanf(“%c”, &n); k= toupper(n); printf(“ chu hoa la %c”,k); getch(); } Đổi một ký tự chữ hoa thành ký tự chữ thường, hàm tolower(ch); Đổi chuỗi chữ thường thành chuỗi chữ hoa, hàm strupr() -Cú pháp: char *strupr(char *s) - Ý nghĩa:Hàm struppr() được dùng để chuyển đổi chuỗi chữ thường thành chuỗi chữ hoa, kết quả trả về của hàm là một con trỏ chỉ đến địa chỉ chuỗi được chuyển đổi. - Ví dụ: Viết chương trình nhập vào một chuỗi ký tự từ bàn phím. Sau đó sử dụng hàm strupr() để chuyển đổi chúng thành chuỗi chữ hoa. #include #include #include main() { char Chuoi[255],*s; printf("Nhap chuoi: ");gets(Chuoi); s=strupr(Chuoi) ; 91
  93. printf(“Chuoi chu hoa: ”);puts(s); } Đổi chuỗi chữ hoa thành chuỗi chữ thường, hàm strlwr() - Muốn chuyển đổi chuỗi chữ hoa thành chuỗi toàn chữ thường, ta sử dụng hàm strlwr(), các tham số của hàm tương tự như hàm strupr() Cú pháp: char *strlwr(char *s) So sánh chuỗi, hàm strcmp() - Cú pháp: n= strcmp (s1,s2) - Ý nghĩa: so sánh 2 chuỗi s1,s2 (so theo mã ASCII từng ký tự). + nếu n>0: s1> s2 n = 0: s1=s2 n < 0: s1<s2. So sánh chuỗi, hàm strncmp() - Cú pháp: m = strncmp (s1, s2, n) - Ý nghĩa: so sánh n ký tự đầu tiên của chuỗi s1 với s2. - Ví dụ: m = strncmp (s1, s2, 2) ; thì m = 0 do 2 ký tự đầu của chuỗi là: + s1: "ABC" và s2: " ABE" là giống nhau. Sao chép một phần chuỗi, hàm strcpy() - Cú pháp: strcpy (đích, nguồn) ; - Ý nghĩa: chép chuỗi nguồn vào chuỗi đích, gán chuỗi. - Ví dụ: char [30] ; Ten = "Nguyễn Văn Ðông "; (sai). strcpy (ten, "Nguyễn Văn Ðông "); gets (ten): Nhập vào từ bàn phím. Sao chép chuỗi, hàm strncpy() - Cú pháp strnpy (s1, s2, n) ; - Ý nghĩa: chép n phần tử đầu tiên của chuỗi s2 vào chuỗi s1. - Ví dụ: strnpy(s1,"xyz",2) ; puts (s1); 92
  94. Đổi từ chuỗi ra số, hàm atoi(), atof(), atol() (trong stdlib.h) - d= atoi (chuỗi số); chuyển chuỗi số thành int. - f = atof (chuỗi số); chuyển chuỗi số thành số thực (float). - l = atol(chuỗi số); chuyển chuỗi số thành long (nguyên 4 byte). - Ví dụ: char s[20] ; gets(s) nhập vào s từ bàn phím chuỗi " 123.45" d=atoi(s) thì d = 123. f = atof(s); thì f = 123.45 Tìm kiếm nội dung chuỗi, hàm strstr() - Cú pháp: char *strstr(const char *s1, const char *s2) - Ý nghĩa: + Hàm strstr() được sử dụng để tìm kiếm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1. +Kết quả trả về của hàm là một con trỏ chỉ đến phần tử đầu tiên của chuỗi s1 có chứa chuỗi s2 hoặc giá trị NULL nếu chuỗi s2 không có trong chuỗi s1. - Ví dụ: Viết chương trình sử dụng hàm strstr() để lấy ra một phần của chuỗi gốc bắt đầu từ chuỗi “hoc”. #include #include #include int main(){ char Chuoi[255],*s; printf("Nhap chuoi: ");gets(Chuoi); s=strstr(Chuoi,”hoc”); printf(“Chuoi trich ra: ”);puts(s); } * Chú ý: Muốn dùng các hàm về chuỗi phải khai báo đầu chương trình #include ; #include 2. Bài tập Bài tập 1: Nhập vào họ lót và tên của một người, sau đó in cả họ và tên của họ lên màn hình. 93
  95. #include #include #include int main() { char HoLot[30], Ten[12]; printf("Nhap Ho Lot: ");gets(HoLot); printf("Nhap Ten: ");gets(Ten); strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/ printf("Ho ten la: ");puts(HoLot); } Bài tập 2: Viết chương trình nhập vào họ, tên của một người. Sau đó copy tên vào họ của người đó #include #include #include int main() { char ho[255],ten[255]; printf("Nhap ho: ");gets(ho); printf("Nhap ten: ");gets(ten); strcpy(ho,ten); printf(“Chuoi dich: ”);puts(ho); } Câu hỏi, bài tập: 16.1. Trình bày cú pháp, công dụng của các hàm cộng, đếm, sao chép, đổi ký tự, một chuỗi chữ thường thành chữ hoa và ngược lại. 16.2. Viết chương trình nhập vào hai chuỗi s1 và s2, nối chuỗi s2 vào s1. Xuất chuỗi s1 ra màn hình 16.3. Viết chương trình nhập vào một chuỗi ký tự từ bàn phím. Sau đó sử dụng nhàm strlwr() để chuyển đổi chúng thành chuỗi chữ thường. 94
  96. TÀI LIỆU THAM KHẢO [1] Lê Xuân Việt, Lập trình cơ bản, Nhà xuất bản xây dựng, 2018. [2] GS Phạm Văn Ất, Kỹ thuật lập trình, Nhà xuất bản Bách Khoa Hà Nội, 2018. [3] Nguyễn Đình Tê, Hoàng Đức Hải, Giáo trình lý thuyết và bài tập ngôn ngữ C, Nhà xuất bản Giáo dục, 1999. [4] Nguyễn Cẩn, C – Tham khảo toàn diện, Nhà xuất bản Đồng Nai, 1996. [5] Võ Văn Viện, Giúp tự học Lập Trình với ngôn ngữ C, Nhà xuất bản Đồng Nai, 2002. [6] Brain W. Kernighan & Dennis Ritchie, The C Programming Language, Prentice Hall Publisher, 1988. [7] Tham khảo các tài liệu ở mạng Internet: 95