Giáo trình Kỹ thuật lập trình - Nguyễn Gia Quang Đăng

pdf 161 trang Gia Huy 17/05/2022 2810
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Kỹ thuật lập trình - Nguyễn Gia Quang Đăng", để 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_ky_thuat_lap_trinh_nguyen_gia_quang_dang.pdf

Nội dung text: Giáo trình Kỹ thuật lập trình - Nguyễn Gia Quang Đăng

  1. TRƯỜNG CAO ĐẲNG KINH TẾ KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH KHOA CÔNG NGHỆ THÔNG TIN - -  - - Giảng viên: Nguyễn Gia Quang Đăng Khoa Cơng nghệ thơng tin Email: nguyengiaquangdang@hotec.edu.vn Năm 2020
  2. MỤC LỤC BÀI 1 : CÁC KHÁI NIỆM CƠ BẢN CỦA NGƠN NGỮ LẬP TRÌNH C/C++ 5 1.1 Mục tiêu 5 1.2 Nội dung 5 1.2.1 Khái quát về ngơn ngữ lập trình C/C++ 5 1.2.1.1 Giới thiệu 5 1.2.1.2 Các thành phần cơ bản của ngơn ngữ C/C++ 7 1.2.2 Các kiểu dữ liệu cơ sở 7 1.2.2.1 Các kiểu dữ liệu cơ bản 7 1.2.2.2 Khái niệm về biến và hằng 8 1.2.2.3 Từ khĩa 9 1.2.2.4 Ghi chú 9 1.2.3 Biểu thức – Tốn tử - Câu lệnh 10 1.2.3.1 Biểu thức – Tốn tử 10 1.2.3.2 Lệnh và khối lệnh 14 1.2.3.3 Chuyển đổi kiểu giá trị 16 1.2.3.4 Các hàm cĩ sẵn trong C/C++ 16 1.2.3.5 Phạm vi của biến 17 1.2.4 Thuật tốn lưu đồ 17 1.2.4.1 Khái niệm 17 1.2.4.2 Các ký hiệu trên lưu đồ 17 1.2.5.3 Các ví dụ biểu diễn lưu đồ thuật tốn 17 1.2.5.4 Khởi động và thốt Dev-C++ 19 1.3 Bài tập 21 BÀI 2 : CÁC HÀM NHẬP XUẤT 23 2.1 Mục tiêu 23 2.2 Nội dung 23 2.2.1 Hàm printf & scanf 23 2.2.1.1 Hàm printf 23 2.2.1.2 Hàm scanf 26 2.2.2 Hàm getche & getch 27 2.2.2.1 Hàm getche 27 2.2.2.2 Hàm getch 27 2.2.3 Nhập xuất cout & cin 27 KHOA CƠNG NGHỆ THƠNG TIN Trang 1
  3. 2.2.3.1 Hàm cout 27 2.2.3.2 Hàm cin 28 2.3 Bài tập 28 BÀI 3 : CẤU TRÚC ĐIỀU KHIỂN 30 3.1 Mục tiêu 30 3.2 Nội dung 30 3.2.1 Câu lệnh điều khiển 30 3.2.1.1 Dạng 1 (if thiếu) 30 3.2.1.2 Dạng 2 (if else) 34 3.2.1.3 Cấu trúc else if 39 3.2.1.4 Lệnh switch case 45 3.2.2 Vịng lặp 52 3.2.2.1 Vịng lặp for 52 3.2.2.2 Lệnh while 60 3.2.2.3 Lệnh do while 64 3.2.2.4 Vịng lặp lồng nhau 67 3.2.2.5 Lệnh break 69 3.2.2.6 Lệnh continue và goto 70 3.2.2.7 Lệnh exit 72 3.3 Bài tập 73 3.3.1 Sử dụng lệnh if 73 3.3.2 Sử dụng lệnh switch 74 3.3.3 Bài tập làm thêm 75 3.3.4 Bài tập vịng lặp 75 BÀI 4 : HÀM 79 4.1 Mục tiêu 79 4.2 Nội dung 79 4.2.1 Tổng quan về hàm 79 4.2.1.1 Khái niệm 79 4.2.1.2 Cấu trúc của hàm 79 4.2.1.3 Các ví dụ về sử dụng hàm 80 4.2.2 Tham số dạng tham biến và tham trị 83 4.2.3 Vần đề tầm vực 84 KHOA CƠNG NGHỆ THƠNG TIN Trang 2
  4. 4.2.3.1 Khái niệm 84 4.2.3.2 Quy tắc cơ bản 84 4.2.3.3 Tầm vực của biến 85 4.2.3.4 Tầm vực của hàm 87 4.2.4 Dùng hướng dẫn #define 88 4.2.5 Đệ quy 89 4.2.5.1 Khái niệm 89 4.2.5.2 Các ví dụ 89 4.2.6 Ưu nhược điểm của đệ quy 94 4.3 Bài tập 94 4.3.1 Bài tập hàm 94 4.3.2 Bài tập đệ quy 95 BÀI 5 : MẢNG VÀ CHUỖI 96 5.1 Mục tiêu 96 5.2 Nội dung 96 5.2.1 Mảng 96 5.2.1.1 Cách khai báo mảng 96 5.2.1.2 Tham chiếu đến từng phần tử mảng 97 5.2.1.3 Nhập/Xuất dữ liệu cho mảng một chiều 97 5.2.1.4 Mảng nhiều chiều 100 5.2.1.5 Nhập/Xuất dữ liệu cho mảng 2 chiều 102 5.2.2 Chuỗi 109 5.2.2.1 Cách khai báo chuỗi 109 5.2.2.2 Hàm nhập (gets), xuất (puts) chuỗi 110 5.2.2.3 Các hàm chuỗi thường sử dụng 113 5.3 Bài tập 114 BÀI 6 : CON TRỎ 119 6.1 Mục tiêu 119 6.2 Nội dung 119 6.2.1 Khái quát về con trỏ? 119 6.2.1.1 Khái niệm 119 6.2.1.2 Lý do để dùng con trỏ 119 6.2.1.3 Các tốn tử 119 KHOA CƠNG NGHỆ THƠNG TIN Trang 3
  5. 6.2.1.4 Khái báo biến con trỏ 120 6.2.1.5 Cấp phát và giải phĩng vùng nhớ 123 6.2.2 Ứng dụng của con trỏ 125 6.2.2.1 Hàm cĩ tham số của con trỏ 125 6.2.2.2 Con trỏ và mảng 127 6.2.2.3 Con trỏ và chuỗi 130 6.2.2.4 Con trỏ trỏ đến con trỏ 133 6.3 Bài tập 135 BÀI 7 : KIỂU DỮ LIỆU NGƯỜI DÙNG TỰ ĐỊNH NGHĨA 136 7.1 Mục tiêu 136 7.2 Nội dung 136 7.2.1 Kiểu cấu trúc (Struct) 136 7.2.1.1 Khái niệm 136 7.2.1.2 Khai báo kiểu struct 136 7.2.1.3 Tham khảo các thành phần trong struct 137 7.2.1.4 Khởi tạo struct 140 7.2.1.5 Struct lồng nhau 141 7.2.1.6 Sử dụng mảng các struct 144 7.2.2 Enum 150 7.2.2.1 Khái niệm 150 7.2.2.2 Cách khai báo khởi tạo biến cĩ kiểu enum 151 7.2.2.3 Các ví dụ 151 7.3 Bài tập 154 TÀI LIỆU THAM KHẢO 155 PHỤ LỤC 156 Chú thích hình ảnh 156 Bảng biểu 156 KHOA CƠNG NGHỆ THƠNG TIN Trang 4
  6. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ Bài 1 : CÁC KHÁI NIỆM CƠ BẢN CỦA NGƠN NGỮ LẬP TRÌNH C/C++ 1.1 Mục tiêu Sau khi học xong học sinh sẽ trình bày và vận dụng được các kỹ năng cơ bản sau: - Khái niệm từ khĩa - Các kiểu dữ liệu - Cách ghi chú - Đặt tên biến - Khai báo biến. - Phạm vi sử dụng biến. - Vẽ phát họa được lưu đồ thuật tốn 1.2 Nội dung 1.2.1 Khái quát về ngơn ngữ lập trình C/C++ 1.2.1.1 Giới thiệu - Ngơn ngữ lập trình C do Dennis Ritchie nghĩ ra khi ơng làm việc tại AT&T Bell Laboratories vào năm 1972. - C là một ngơn ngữ mạnh và cĩ tính linh hoạt, nĩ đã nhanh chĩng được sử dụng một cách rộng rãi, vượt ra khỏi phạm vi của Bell Labs. Các lập trình viên ở khắp mọi nơi bắt đầu sử dụng nĩ để viết tất cả các loại chương trình. - C++ được biết đến như là ngơn ngữ mới bao trùm lên C và do Bjarne Stroustrup sáng tác năm 1980 cũng tại phịng thí nghiệm Bell tại bang New Jersey, Mỹ. Ban đầu được ơng đặt tên cho nĩ là “C with classes” (C với các lớp). Tuy nhiên đến năm 1983 thì ơng đổi tên thành C++, trong đĩ ++ là tốn tử tăng thêm 1 của C. - C++ được biết đến như là ngơn ngữ lập trình hướng sự vật hay hướng đối tượng - OOP (Object Oriented Programming). Nĩ cung cấp các lớp mà cĩ 4 chức năng thơng dụng trong các ngơn ngữ OO: tính trừu tượng, tính bao đĩng, tính đa hình, và tính kế thừa. C++ bao trùm lên C nên mọi đặc điểm của C đều cĩ trong C++. Ngồi ra, C++ cịn cĩ một số đặc điểm khác như: C++ là ngơn ngữ hướng đối tượng. C++ là ngơn ngữ định kiểu rất mạnh. C++ cung cấp cách truyền tham số bằng tham chiếu cho hàm. KHOA CƠNG NGHỆ THƠNG TIN Trang 5
  7. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ C++ cung cấp cơ cấu thư viện để người lập trình cĩ thể tự tạo thêm hàm thơng dụng vào thư viện và cĩ thể tái sử dụng sau này. C++ cung cấp một cơ chế đa dạng hĩa tên hàm và tốn tử. C++ cung cấp các class là loại cấu trúc mới đĩng gĩi chung cho cả dữ liệu lẫn các hàm trong một chủ thể được bảo vệ một cách chặt chẽ. Cấu trúc của một chương trình C++ Khối khai báo các thư viện hàm Các định nghĩa biến, hằng, kiểu, hàm Khối hàm main Các định nghĩa hàm của người dùng Trong đĩ: - Khối khai báo các thư viện hàm: cú pháp để khai báo thư viện: #include Ví dụ: #include #include - Các định nghĩa biến, hằng, kiểu, hàm: Cung cấp tên hàm, kiểu hàm, số đối số và kiểu của từng đối số của hàm. Các biến và hằng được định nghĩa tại đây sẽ trở thành biến và hằng tồn cục hoặc các khai báo nguyên mẫu hàm với cú pháp sau: ([biến tham số]); Ví dụ: int songuyento(int x); - Khối hàm main: Đây là thành phần bắt buộc trong một chương trình C++, thân của hàm main bắt đầu từ sau dấu mở mĩc { cho tới dấu đĩng mĩc }. - Các định nghĩa hàm của người dùng: Một định nghĩa hàm bao gồm tiêu đề của hàm, thân hàm với cú pháp như sau: KHOA CƠNG NGHỆ THƠNG TIN Trang 6
  8. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ ([Các biến tham số]) { } 1.2.1.2 Các thành phần cơ bản của ngơn ngữ C/C++ Các thành phần Các thành phần trong C++ bao gồm: + Từ khĩa. + Các khai báo biến, hằng. + Các cấu trúc điều khiển. + Biểu thức và các phép tốn. + Các định nghĩa, khai báo hàm, khai báo kiểu, Những ký tự, ký hiệu sau: (phân biệt chữ in hoa và in thường): 26 chữ cái latinh lớn A,B,C Z 26 chữ cái latinh nhỏ a,b,c z. 10 chữ số thập phân 0,1,2 9. Các ký hiệu tốn học: +, -, *, /, =, , (, ) Các ký hiệu đặc biệt: :. , ; " ' _ @ # $ ! ^ [ ] { } Dấu cách hay khoảng trống. Các kiểu dữ liệu cơ bản 3 thơng tin đặc trưng của kiểu dữ liệu: - Tên kiểu dữ liệu. - Kích thước vùng nhớ biểu diễn nĩ,miền giá trị. - Các phép tốn cĩ thể sử dụng. - Các kiểu dữ liệu đơn giản trong C++ chỉ là các kiểu số, thuộc hai nhĩm chính đĩ là số nguyên và số thực (số dấu phẩy động). 1.2.2 Các kiểu dữ liệu cơ sở 1.2.2.1 Các kiểu dữ liệu cơ bản Cĩ 4 kiểu dữ liệu cơ bản trong C là: char, int, float, double. Bảng 1: Các kiểu dữ liệu cơ bản trong C KHOA CƠNG NGHỆ THƠNG TIN Trang 7
  9. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ Kiểu dữ liệu Kích thước Miền giá trị TT (Type) (Length) (Range) 1 unsigned char 1 byte 0 đến 255 2 char 1 byte – 128 đến 127 3 enum 2 bytes – 32,768 đến 32,767 4 unsigned int 2 bytes 0 đến 65,535 5 short int 2 bytes – 32,768 đến 32,767 6 int 2 bytes – 32,768 đến 32,767 7 unsigned long 4 bytes 0 đến 4,294,967,295 8 long 4 bytes – 2,147,483,648 đến 2,147,483,647 9 float 4 bytes 3.4 * 10–38 đến 3.4 * 1038 10 double 8 bytes 1.7 * 10–308 đến 1.7 * 10308 11 long double 10 bytes 3.4 * 10–4932 đến 1.1 * 104932 1.2.2.2 Khái niệm về biến và hằng Khái niệm tên biến rất quan trọng trong quá trình lập trình, nĩ khơng những thể hiện rõ ý nghĩa trong chương trình mà cịn dùng để xác định các đại lượng khác nhau khi thực hiện chương trình. Tên thường được đặt cho hằng, biến, mảng, con trỏ, nhãn Chiều dài tối đa của tên là 32 ký tự. Tên biến hợp lệ là một chuỗi ký tự liên tục gồm: Ký tự chữ, số và dấu gạch dưới. Ký tự đầu của tên phải là chữ hoặc dấu gạch dưới. Khi đặt tên khơng được đặt trùng với các từ khĩa. Ví dụ 1:  Các đặt tên biến đúng: bien1, b_1, Number_ODD, Case  Các đặt tên sai: 3b_1 (ký tự đầu là số) number-odd (sử dụng dấu gạch ngang) float (đặt tên trùng với từ khĩa) bien 1 (cĩ khoảng trắng) f(x) (cĩ dấu ngoặc trịn) Lưu ý: Trong C/C++, phân biệt đặt tên chữ hoa và chữ thường Ví dụ 2: number khác Number KHOA CƠNG NGHỆ THƠNG TIN Trang 8
  10. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ float khác Float (float là từ khĩa, do đĩ bạn đặt tên là Float vẫn đúng) Hằng là đại lượng cĩ giá trị thuộc một kiểu dữ liệu nhất định, giá trị của hằng khơng thể thay đổi trong thời gian tồn tại của chương trình. Cĩ hai loại hằng: + Hằng khơng tên (hằng thường): là các giá trị cụ thể tức thời. + Hằng cĩ tên (hằng ký hiệu): là các hằng phải định nghĩa trước khi sử dụng, tên của hằng đặt theo quy tắc của tên. Định nghĩa hằng Cú pháp: const = ; hoặc const = ; Chú ý: - Hằng số được ngầm hiểu là hệ 10, nhưng ta cĩ thể viết các hằng trong hệ 16 hoặc 8. - Các hằng kí tự được viết trong cặp dấu nháy đơn ‘’. - Các xâu kí tự là dãy các kí tự được viết trong cặp dấu nháy kép “”. 1.2.2.3 Từ khĩa Từ khĩa là từ cĩ ý nghĩa dùng để xác định khai báo dữ liệu và viết các câu lệnh trong lập trình. Trong C/C++ cĩ các từ khĩa sau: Bảng 2: Các từ khĩa trong C/C++ asm const else for interrupt return sizeof void break continue enum goto long short switch volatile case default extern huge near static typedef while cdecl do far if pascal struct union char double float int register signed unsigned  Các từ khĩa khi lập trình phải viết bằng chữ thường 1.2.2.4 Ghi chú Trong khi lập trình cần phải ghi chú để giải thích các biến, hằng, hàm, thao tác xử lý giúp cho chương trình rõ ràng dễ hiểu, dễ nhớ, dễ sửa chữa và để người khác đọc vào dễ hiểu. Trong C/C++ hỗ trợ chọn phép các ghi chú sau: // hoặc /* nội dung ghi chú */ KHOA CƠNG NGHỆ THƠNG TIN Trang 9
  11. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ Ví dụ 3: int main(int argc, char *argv[]) { float a, b; //khai bao bien a,b kieu float a = 10; //gan 10 cho a b =13; //gan 13 cho b /* thuat toan tim so lon nhat la neu a lon hon b thi a lon nhat nguoc lai b lon nhat */ if (a > b) printf("max: %d", a); else printf("max: %d", b); } Khi biên dịch chương trình, C/C++ gặp cặp dấu ghi chú sẽ khơng dịch ra ngơn ngữ máy. Kết luận: - Đối với ghi chú dạng // dùng để ghi chú trên một hàng. - Ghi chú dạng /* . */ cĩ thể ghi chú một hàng hoặc nhiều hàng. - Nội dung ghi chú chương trình sẽ khơng thực hiện biên dịch. 1.2.3 Biểu thức – Tốn tử - Câu lệnh 1.2.3.1 Biểu thức – Tốn tử a. Biểu thức Biểu thức là một sự kết hợp giữa các tốn tử (operator) và các tốn hạng (operand) theo đúng một trật tự nhất định. Mỗi tốn hạng cĩ thể là một hằng, một biến hoặc một biểu thức khác. Trong trường hợp, biểu thức cĩ nhiều tốn tử, ta dùng cặp dấu ngoặc đơn () để chỉ định tốn tử nào được thực hiện trước. Ví dụ: Biểu thức tính chu vi hình chữ nhật: (d+r)/2 Trong đĩ: d, r là biến của biểu thức. b. Tốn tử Trong ngơn ngữ C/C++, các tốn tử +, -, *, / làm việc tương tự như khi chúng làm việc trong các ngơn ngữ khác. Ta cĩ thể áp dụng chúng cho đa số kiểu dữ liệu KHOA CƠNG NGHỆ THƠNG TIN Trang 10
  12. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ cĩ sẵn được cho phép bởi C. Khi ta áp dụng phép / cho một số nguyên hay một ký tự, bất kỳ phần dư nào cũng bị cắt bỏ. Chẳng hạn, 7/2 bằng 3 trong phép chia nguyên. Bảng 3: Các phép tốn Tốn tử Giải thích phép tốn + Phép cộng - Phép trừ * Phép nhân / Phép chia % Phép chia lấy phần dư Phép giảm 1 đơn vị ++ Phép tăng 1 đơn vị Phép tăng và giảm (++ & ) Tốn tử ++ dùng để tăng thêm 1 vào tốn hạng và trừ bớt 1. Hay viết như sau: x = x + 1 tương tự như ++x x = x - 1 tương tự như x Cả 2 phép tốn tử tăng và giảm đều cĩ thể tiền tố (đặt trước) hay hậu tố (đặt sau) tốn hạng. Ví dụ: x = x + 1 cĩ thể viết x++ (hay ++x) đều giống nhau. Tuy nhiên giữa tiền tố và hậu tố cĩ sự khác biệt khi sử dụng trong 1 biểu thức. Khi 1 tốn tử tăng hay giảm đứng trước tốn hạng của nĩ, C thực hiện việc tăng hay giảm trước khi lấy giá trị dùng trong biểu thức. Nếu tốn tử đi sau tốn hạng, C lấy giá trị tốn hạng trước khi tăng hay giảm nĩ. - Tốn tử tiền tố: x = 20 y = ++x //y = 21 - Tốn tử hậu tố: x = 20 KHOA CƠNG NGHỆ THƠNG TIN Trang 11
  13. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ x = x++ //y = 20 Thứ tự ưu tiên của các tốn tử số học như sau: Tốn tử: ++ → → * → / → % → + → - Các tốn tử quan hệ và các tốn tử Logic Các tốn tử quan hệ dùng để so sánh các giá trị giữa các biến. Bảng 4: Các phép tốn tử quan hệ Tốn tử quan hệ Giải thích ý nghĩa > Lớn hơn >= Lớn hơn hoặc bằng < Nhỏ hơn <= Nhỏ hơn hoặc bằng == Bằng != Khác Tốn tử Logic là tốn tử nhận giá trị đúng hoặc sai. Trong C mọi giá trị khác 0 được gọi là đúng, cịn sai là 0. Các biểu thức sử dụng các tốn tử quan hệ và Logic trả về 0 nếu sai và trả về 1 nếu đúng. Bảng 5: Các tốn tử logic Tốn tử Logic Giải thích ý nghĩa && AND || OR ! NOT (Phủ định) Bảng 6: Bảng chân trị cho các tốn tử Logic p q p&&q p||q !p 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 KHOA CƠNG NGHỆ THƠNG TIN Trang 12
  14. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ Độ ưu tiên các tốn tử số học cao hơn các tốn tử quan hệ và Logic. Do đĩ một biểu thức như: 20 > 1+ 22 sẽ được xem là 20 > (1 + 22) và kết quả là sai (0). Ta cĩ thể kết hợp vài tốn tử lại với nhau thành biểu thức như sau: 20>5&&!(20 >= Dịch phải << Dịch trái Bảng 8: Bảng chân trị của tốn tử ^ (XOR) p q p^q 0 0 0 0 1 1 1 0 1 KHOA CƠNG NGHỆ THƠNG TIN Trang 13
  15. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ 1 1 0 Tốn tử ? cùng với: C cĩ một tốn tử hỗ trợ rất mạnh và thích hợp để thay thế cho các câu lệnh của If-Then-Else. Cú pháp của việc sử dụng tốn tử ? như sau: E1 ? E2 : E3 Trong đĩ E1, E2, E3 là các biểu thức. Ý nghĩa: Trước tiên E1 được kiểm tra điều kiện, nếu đúng E2 trở thành giá trị của biểu thức; nếu E1 sai, E3 được trở thành giá trị của biểu thức. Ví dụ: X = 100 Y = X > 90 ? 50 : 200 Thì Y được gán giá trị 50, nếu X nhỏ hơn 90 thì Y sẽ nhận giá trị là 200. Đoạn mã này tương đương cấu trúc if như sau: X = 100; if (X < 90) Y = 50; else Y = 200; 1.2.3.2 Lệnh và khối lệnh Lệnh Lệnh là bao gồm một tác vụ, biểu thức, hàm, hay cấu trúc điều khiển Ví dụ 4: x = x + 2; printf("Day la mot lenh\n"); Khối lệnh Khối lệnh là một dãy gồm nhiều câu lệnh được đặt trong cặp dấu { }. Trong lập trình các lệnh trong khối lệnh phải viết thụt vơ 1 tab so với cặp dấu { } Ví dụ 5: { // đầu khối a = 15; b = 16; viết thụt vơ 1 tab so với cặp { } printf("Tong %d + %d = %d", a, b, a+b); KHOA CƠNG NGHỆ THƠNG TIN Trang 14
  16. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ } //cuối khối Khai báo biến  Cú pháp Kiểu dữ liệu Danh sách tên biến; - Kiểu dữ liệu: 1 trong các kiểu dữ liệu được ngơn ngữ C/C++ hỗ trợ - Danh sách tên biến: gồm các tên biến cĩ cùng kiểu dữ liệu, mỗi tên biến cách nhau dấu phẩy (,), cuối cùng phải là dấu chấm phẩy (;). Ví dụ 6: int ithang; //khai báo biến ithang cĩ kiểu int float fgia; //khai báo biến fgia cĩ kiểu float char ckitu1, ckitu2; //khai báo biến ckitu1, ckitu2 cĩ kiểu char Cách khai báo tên biến dựa trên theo quy tắc ở mục 1.2.2.1. Ý nghĩa là biến ithang là kiểu int, ta nên thêm chữ i (kí tự đầu của kiểu) vào đầu tên biến thang để trong quá trình lập trình hoặc sau này xem lại, sửa chữa chương trình dễ dàng nhận ra biến ithang cĩ kiểu int mà khơng cần phải di chuyển đến phần khai báo mới biết kiểu của biến này. Tương tự cho các kiểu biến cịn lại. Vừa khai báo vừa khởi gán Chúng ta cĩ thể kết hợp việc khai báo với tốn tử kết hợp với thức gán để biến nhận giá trị ngay cùng lúc với khai báo. Ví dụ 7:  Khai báo trước, gán giá trị sau: int main(int argc, char *argv[]) { int a, b, c; a = 10; b = 20; c = 50; }  Vừa khai báo vừa gán giá trị: int main(int argc, char *argv[]) KHOA CƠNG NGHỆ THƠNG TIN Trang 15
  17. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ { int a = 10, b = 20, c = 50; } 1.2.3.3 Chuyển đổi kiểu giá trị Quy tắc chuyển đổi kiểu dữ liệu đích phải cĩ giá trị lớn hơn kiểu dữ liệu nguồn. Ví dụ: chuyển từ int sang float. int a = 100; float f = a; Hoặc tường minh: Thay đổi kiểu dữ liệu cĩ dãy giá trị lớn sang dãy giá trị nhỏ hơn. Ví dụ: chuyển từ float sang int. float f = 100.51; int a = (int) f; 1.2.3.4 Các hàm cĩ sẵn trong C/C++ 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 Bảng 9: Ý nghĩa của một số hàm cĩ sẵn thường dùng STT Thư viện Hàm cĩ sẵn Ứng dụng printf(), scanf(), getc(), putc(), Thư viện chứa các gets(), puts(), fflush(), fopen(), hàm vào/ ra chuẩn 1 stdio.h fclose(), fread(), fwrite(), (standard input/outp getchar(), putchar(), getw(), ut) putw() clrscr(), getch(), getche(), Thư viện chứa các getpass(), cgets(), cputs(), putch(), hàm vào ra trong 2 conio.h clreol(), chế độ DOS (DOS console) abs(), sqrt(), log(). log10(), sin(), Thư viện chứa các 3 math.h cos(), tan(), acos(), asin(), atan(), hàm tính tốn pow(), exp(), calloc(), realloc(), malloc(), free(), Thư viện chứa các 4 alloc.h farmalloc(), farcalloc(), farfree(), hàm liên quan đến việc quản lý bộ nhớ KHOA CƠNG NGHỆ THƠNG TIN Trang 16
  18. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ open(), _open(), read(), _read(), Thư viện chứa các close(), _close(), creat(), _creat(), hàm vào ra cấp thấp 5 io.h creatnew(), eof(), filelength(), lock(), initgraph(), line(), circle(), Thư viện chứa các 6 graphics.h putpixel(), getpixel(), setcolor(), hàm liên quan đến đồ họa 1.2.3.5 Phạm vi của biến Khi lập trình, chúng ta phải nắm rõ phạm vi của biến. Nếu khai báo và sử dụng khơng đúng, khơng rõ ràng sẽ dẫn đến sai sĩt khĩ kiểm sốt được, vì vậy chúng ta cần phải xác định đúng vị trí, phạm vi sử dụng biến trước khi sử dụng biến.  Khai báo biến ngồi (biến tồn cục): Vị trí biến đặt bên ngồi tất cả các hàm, cấu trúc Các biến này cĩ ảnh hưởng đến tồn bộ chương trình. Chu trình sống của nĩ là bắt đầu chạy chương trình đến lúc kết thúc chương trình.  Khai báo biến trong (biến cục bộ): Vị trí biến đặt bên trong hàm, cấu trúc . Chỉ ảnh hưởng nội bộ bên trong hàm, cấu trúc đĩ Chu trình sống của nĩ bắt đầu từ lúc hàm, cấu trúc được gọi thực hiện đến lúc thực hiện xong. 1.2.4 Thuật tốn lưu đồ 1.2.4.1 Khái niệm Thuật tốn là tập hợp các quy tắc cĩ logic dùng để giải một lớp bài tốn nào đĩ để được một kết quả xác định. Lưu đồ là một dạng đồ thị dùng để mơ tả quá trình tính tốn một cách cĩ hệ thống. Người ta thường thể hiện thuật tốn bằng lưu đồ. 1.2.4.2 Các ký hiệu trên lưu đồ Bảng 10: Bảng ký hiệu lưu đồ Tên khối Ký hiệu Ý nghĩa Khối mở đầu và kết thúc Dùng mở đầu hoặc kết thúc chương trình Khối vào ra Đưa số liệu vào hoặc in kết quả Khối tính tốn Biểu diễn cơng thức tính tốn Khối điều kiện Dùng để phân nhánh chương trình Chương trình con Dùng để gọi chương trình con Mũi tên Chỉ hướng truyền thơng tin, liên hệ các khối 1.2.5.3 Các ví dụ biểu diễn lưu đồ thuật tốn KHOA CƠNG NGHỆ THƠNG TIN Trang 17
  19. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ Ví dụ 8: Tính A=x2+y2 Ví dụ 9 : Giải phương trình bậc 1 Ax+B=0 Ví dụ 10: Vẽ lưu đồ thuật tốn hiển thị các số từ 1 đến 10. KHOA CƠNG NGHỆ THƠNG TIN Trang 18
  20. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ Ví dụ 11: Vẽ lưu đồ thuật tốn kiểm tra tính hợp lệ của điểm số từ 0 đến 10 Bắt đầu Điểm Sai Điểm >=0 và Điểm <=10 ? Đúng Kết thúc 1.2.5.4 Khởi động và thốt Dev-C++ a. Khởi động ứng dụng Khởi động bằng biểu tượng ngịai Desktop. Sau khi khởi động cĩ giao diện như sau: KHOA CƠNG NGHỆ THƠNG TIN Trang 19
  21. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ Hình 1: Khởi động ứng dụng Dev-C++ Khởi tạo một project mới vào File → New → Project Hình 2: Màn hình đặt tên project - Chọn ứng dụng là Console Application - Name: Đặt tên project - Check vào chọn ngơn ngữ C++ Project KHOA CƠNG NGHỆ THƠNG TIN Trang 20
  22. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ Giả sử đặt tên project là vidu, và sau khi OK ta được giao diện như sau: Hình 3: Màn hình sau khi khởi động thành cơng b. Chạy và biên dịch sửa lỗi chương trình - Biên dịch và chạy F9 - Biên dịch tổ hợp Ctrl+F9 - Chạy chương trình tổ hợp Ctrl+F10 c. Thốt khỏi ứng dụng - Ấn phím F10 (kích hoạt Menu), chọn menu File, chọn Exit; - Hoặc ấn tổ hợp phím Alt – F4. - Đĩng project vào File – Close hoặc Ctrl – F4 1.3 Bài tập 1. Vẽ lưu đồ thuật tốn so sánh 2 số a, b. 2. Vẽ lưu đồ thuật tốn giải phương trình bậc 2. 3. Vẽ lưu đồ thuật tốn nhập vào 1 số a, kiểm tra xem số âm hay dương. 4. Vẽ lưu đồ thuật tốn tính tổng 2 số a, b. KHOA CƠNG NGHỆ THƠNG TIN Trang 21
  23. Bài 1: Các khái niệm cơ bản của ngơn ngữ lập trình C/C++ 5. Vẽ lưu đồ (flowcharts) cho thuật tốn nhập vào độ C (Celsius) và chuyển sang độ F (Fahrenheit). Biết rằng C/5 = (F-32)/9. 6. Vẽ lưu đồ cho thuật tốn nhập vào điểm tốn, điểm lý và điểm hố. Tính tổng điểm và điểm trung bình rồi hiển thị kết quả. 7. Vẽ lưu đồ cho thuật tốn tính chu vi và diện tích hình trịn. 8. Vẽ lưu đồ hiển thị các số lẻ trong đoạn [a,b] với a và b được nhập vào 9. Vẽ lưu đồ cho thuật tốn tìm số lớn nhất trong 3 số a, b và c. 10. Vẽ sơ đồ khối thuật tốn cho phép nhập vào số nguyên dương n.Hãy kiểm tra số đĩ cĩ phải số nguyên tố hay khơng. (Số nguyên tố là khác 1,chỉ chia hết cho 1,và chính nĩ). 11. Vẽ lưu đồ in ra màn hình hình chữ nhật đặc kích thước m*n (m, n nhập từ bàn phím). KHOA CƠNG NGHỆ THƠNG TIN Trang 22
  24. Bài 2: Các hàm nhập xuất Bài 2 : CÁC HÀM NHẬP XUẤT 2.1 Mục tiêu Sau khi học xong học sinh sẽ trình bày và vận dụng được các kỹ năng cơ bản sau: - Trình bày được cách sử dụng hàm nhập xuất dùng các hàm printf, scanf, cout, cin, getche, getch trong C/C++. - So sánh sự khác nhau giữa các hàm nhập xuất trong ngơn ngữ C/C++. 2.2 Nội dung 2.2.1 Hàm printf & scanf 2.2.1.1 Hàm printf Hàm printf dùng để xuất, hiển thị dữ liệu đã được định dạng sẵn.  Cú pháp: printf ("chuỗi định dạng"[, tham số 1, tham số 2, ]);  Khi sử dụng hàm phải khai báo tiền xử lý #include - Hàm printf: tên hàm, phải viết bằng chữ thường, khơng được viết hoa. - Tham số 1, : là các mục dữ liệu cần hiển thị ra màn hình. Các tham số này cĩ thể là biến, hằng hoặc biểu thức phải được định dạng trước khi in ra. - chuỗi định dạng: được đặt trong cặp nháy kép (" "), gồm 3 loại: + Chuỗi ký tự ghi như thế nào thì hiển thị ra màn hình như vậy. + Phép kết xuất giá trị của các đối mục ra màn hình gọi là mã định dạng. Sau đây là các dấu mơ tả định dạng: Bảng 11: Bảng mã định dạng nhập/xuất Mã định dạng Diễn giải ý nghĩa %c Ký tự đơn %s Chuỗi %d Số nguyên thập phân cĩ dấu %f Số chấm động (ký hiệu thập phân) %e Số chấm động (ký hiệu cĩ số mũ) %g Số chấm động (%f hay %g) %x Số nguyên thập phân khơng dấu %u Số nguyên hex khơng dấu KHOA CƠNG NGHỆ THƠNG TIN Trang 23
  25. Bài 2: Các hàm nhập xuất %o Số nguyên bát phân khơng dấu l Tiền tố dùng kèm với %d, %u, %x, %o để chỉ số nguyên dài (ví dụ %ld) + Các ký tự điều khiển và ký tự đặc biệt Bảng 12: Bảng điều mã điều khiển nhập/xuất Mã điều khiển Diễn giải ý nghĩa \n Nhảy xuống dịng kế tiếp canh về cột đầu tiên. \t Canh cột tab ngang. \r Nhảy về đầu hàng, khơng xuống hàng. \a Tiếng kêu bip. \\ In ra dấu \ \" In ra dấu " \' In ra dấu ' %% In ra dấu % Ví dụ 1: printf("Bai hoc dau tien. \n");  Kết quả in ra màn hình Bai hoc dau tien. _ Ví dụ 2: printf("Ma dinh dang \\\" in ra dau \" . \n");  Kết quả in ra màn hình Ma dinh dang \" in ra dau ". _ Ví dụ 3: Giả sử biến i cĩ giá trị = 100 printf("So ban vua nhap la: %d . \n", i);  Kết quả in ra màn hình So ban vua nhap la: 100. Ví dụ 4: Giả sử biến a cĩ giá trị = 27 và b cĩ giá trị = 14 printf("Tong cua 2 so %d va %d la %d . ", a, b, a+b);  Kết quả in ra màn hình Tong cua 2 so 27 va 14 la 41. KHOA CƠNG NGHỆ THƠNG TIN Trang 24
  26. Bài 2: Các hàm nhập xuất Ví dụ 5: Sửa lại ví dụ 4 printf("Tong cua 2 so %5d va %3d la %1d . \n", a, b, a+b);  Kết quả in ra màn hình Tong cua 2 so 27 va 14 la 41. _ Ví dụ 6: Sửa lại ví dụ 5 printf("Tong cua 2 so %-5d va %-3d la %-1d .", a, b, a+b);  Kết quả in ra màn hình Tong cua 2 so 27 va 14 la 41. Ghi chú : dấu trừ trước %-5d cách 5 ký tự bên trái. Ví dụ 7: Sửa lại ví dụ 4 printf("Tong cua 2 so %03d va %03d la %04d .", a, b, a+b);  Kết quả in ra màn hình Tong cua 2 so 027 va 014 la 0041. Ví dụ 8: Giả sử int a = 16, b = 51234, c = 2 printf("%7d%7d%7d.\n", a, b, c); printf("%7d%7d%7d.", 165, 2, 965);  Kết quả in ra màn hình 16 51234 2 Hiển thị giá trị về bên phải 7 ký tự 165 2 965 printf("%-7d%-7d%-7d\n", a, b, c); printf("%-7d%-7d%-7d\n", 165, 2, 965);  Kết quả in ra màn hình 16 51234 2 Hiển thị giá trị về bên trái 7 ký tự 165 2 965 Ví dụ 9: Giả sử float a = 6.4, b = 1234.56, c = 62.3 printf("%7.2d%7.2d%7.2d", a, b, c);  Kết quả in ra màn hình 6.40 1234.56 62.30 Hiển thị giá trị về bên phải 7 ký tự và lấy 2 số lẻ thập phân KHOA CƠNG NGHỆ THƠNG TIN Trang 25
  27. Bài 2: Các hàm nhập xuất Ví dụ 10: giả sử float a = 6.4, b = 1234.55, c = 62.34 printf("%10.1d%10.1d%10.1d.\n", a, b, c); printf("%10.1d%10.1d%10.1d.\n", 165, 2, 965);  Kết quả in ra màn hình 6.4 1234.6 62.3 Hiển thị giá trị về bên phải 7 ký tự và lấy 1 165.0 2.0 965.0 số lẻ thập phân. printf("%-10.2d%-10.2d%-10.2d.\n", a, b, c); printf("%-10.2d%-10.2d%-10.2d.\n", 165, 2, 965);  Kết quả in ra màn hình 6.40 1234.55 62.34 Hiển thị giá trị về bên trái 7 ký tự và lấy 2 số 165.00 2.00 965.00 lẻ thập phân. 2.2.1.2 Hàm scanf Hàm scanf dùng để định dạng dữ liệu khi nhập liệu từ bàn phím. Cú pháp scanf ("chuỗi định dạng",[tham số 1, tham số 2, ]);  Khi sử dụng hàm phải khai báo tiền xử lý #include - Hàm scanf: tên hàm, phải viết bằng chữ thường, khơng được viết hoa. - Chuỗi định dạng: được đặt trong cặp nháy kép (" ") là dạng biến dữ liệu nhập vào. - Tham số 1, : là danh sách các tham số mục cách nhau bởi dấu phẩy, mỗi tham số sẽ tiếp nhận giá trị nhập vào. Ví dụ 11: scanf("%d", &i);  Nhập vào 12abc, biến i chỉ nhận giá trị 12. Nhập 3.4 chỉ nhận giá trị 3. Ví dụ 12: scanf("%d%d", &a, &b);  Nhập vào 2 số a, b phải cách nhau bằng khoảng trắng hoặc enter. Ví dụ 13: scanf("%d/%d/%d", &thang, &ngay, &nam);  Nhập vào tháng, ngày, năm theo dạng thang/ngay/nam (09/25/2016) Ví dụ 14: scanf("%d%*c%d%*c%d", &thang, &ngay, &nam);  Nhập vào tháng, ngày, năm với dấu phân cách /, -, ; ngoại trừ số. Ví dụ 15: scanf("%2d%2d%4d", &ngay, &thang, &nam);  Nhập vào ngày, tháng, năm theo dạng dd/mm/yyyy.11 KHOA CƠNG NGHỆ THƠNG TIN Trang 26
  28. Bài 2: Các hàm nhập xuất 2.2.2 Hàm getche & getch 2.2.2.1 Hàm getche Hàm getche là dùng để đọc một ký tự từ dịng vào chuẩn (bàn phím) và in lên màn hình ký tự đĩ. getche là một hàm khơng cĩ tham số vào. 2.2.2.2 Hàm getch Hàm getch: Dùng để đọc một ký tự từ dịng vào chuẩn (bàn phím) nhưng KHƠNG hiện ký tự đã nhập lên màn hình. Hàm getch nhận một ký tự nhưng khơng cho hiện lên màn hình. Khi đĩ, nĩ đã thực hiện xong cơng việc. Vì máy tính thực hiện chương trình rất nhanh, nên khi bạn vừa nhập ký tự thì chương trình cũng dừng. Do đĩ, hàm getch thường được sử dụng trong các chương trình đơn giản với chức năng dừng chương trình 2.2.3 Nhập xuất cout & cin 2.2.3.1 Hàm cout Định dạng khi xuất dữ liệu ra màn hình với thư viện iostream. Cú pháp: cout - Hàm cout: tên hàm, phải viết bằng chữ thường, khơng được viết tên hàm chữ hoa. - Chuỗi phải đặt trong dấu nháy kép (“ ”) cuối câu lệnh cĩ dấu chấm phẩy. - Tham số 1, : là danh sách các tham số cách nhau bởi dấu <<, mỗi tham số sẽ tiếp nhận giá trị xuất ra màn hình. Ví dụ 16: cout<<”Bai hoc dau tien, xuat chuoi bang cout”;  Kết quả in ra màn hình Bai hoc dau tien, xuat chuoi bang cout Ví dụ 17: cout<<”Gia tri 1 \n”<<”Gia tri 2\n”<<”Gia tri 3”;  Kết quả in ra màn hình Gia tri 1 Giá tri 2 Gia tri 3 KHOA CƠNG NGHỆ THƠNG TIN Trang 27
  29. Bài 2: Các hàm nhập xuất 2.2.3.2 Hàm cin Hàm cin dùng để gán một giá trị nhập từ thiết bị nhập chuẩn (bàn phím) vào biến đã được khai báo. Cú pháp cin>>biến 1>>biến 2>> >>biến n; Ví dụ 18: Nhập vào 2 số nguyên a và b. int a,b; cin>>a>>b; Hoặc int a,b; cin>>a; cin>>b; Ví dụ 19: Viết chương trình nhập vào 2 số a, b kiểu số thực. Tính tổng 2 số vừa nhập. float x, y; cout >x; cout >y; cout<< ”Ket qua x+y=”<<x+y;  Kết quả thực hiện đoạn chương trình trên : Nhap x=9 Nhap y=6 Ket qua x+y=15 2.3 Bài tập 1. Viết chương trình nhập vào 3 số nguyên a, b, c và tính tổng, xuất kết quả. 2. Viết chương trình nhập vào chiều dài và rộng hình chữ nhật, tính diện tích hình chữ nhật 3. Viết chương trình nhập vào điểm tốn, lý, hĩa kiểu số thực và tính điểm trung bình. 4. Viết chương trình đọc và 2 số nguyên và in ra kết quả của phép (+), phép trừ (-), phép nhân (*), phép chia (/). Nhận xét kết quả chia 2 số nguyên. KHOA CƠNG NGHỆ THƠNG TIN Trang 28
  30. Bài 2: Các hàm nhập xuất 5. Viết chương trình nhập vào bán kính hình cầu, tính và in ra diện tích, thể tích của hình cầu đĩ.Hướng dẫn: S = 4 R2 và V = (4/3) R3. 6. Viết chương trình nhập vào một số a bất kỳ và in ra giá trị bình phương (a2), lập phương (a3) của a và giá trị a4. 7. Viết chương trình đọc từ bàn phím 3 số nguyên biểu diễn ngày, tháng, năm và xuất ra màn hình dưới dạng "ngay/thang/nam" (chỉ lấy 2 số cuối của năm). 8. Viết chương trình nhập vào số giây từ 0 đến 86399, đổi số giây nhập vào thành dạng "gio:phut:giay", mỗi thành phần là một số nguyên cĩ 2 chữ số. Ví dụ: 02:11:05 9. Viết chương trình nhập vào độ C (Celsius) và chuyển sang độ F (Fahrenheit). Biết rằng C/5 = (F-32)/9. 10. Viết chương trình nhập vào điểm tốn, điểm lý và điểm hố. Tính tổng điểm và điểm trung bình rồi hiển thị kết quả. 11. Viết chương trình nhập họ tên và xuất thơng tin với chuỗi “Xin chao ban: ” vừa nhập. 12. Viết chương trình nhập vào 2 chuỗi s1 và s2. Nối 2 chuỗi lại với nhau và xuất ra màn hình cho người dùng xem. 13. Viết chương trình nhập các thơng tin của người một học sinh như sau: mã sinh viên, họ tên, ngày sinh, nghành học, điểm lập trình c và xuất thơng các thơng tin vừa nhập cho người dùng xem. KHOA CƠNG NGHỆ THƠNG TIN Trang 29
  31. Bài 3: Cấu trúc điều khiển Bài 3 : CẤU TRÚC ĐIỀU KHIỂN (Cấu trúc chọn) 3.1 Mục tiêu Sau khi học xong học sinh sẽ trình bày và vận dụng được các kỹ năng cơ bản sau: Trình bày được cú pháp câu lệnh điều khiển. Sử dụng được các câu lệnh điều khiển. Trình bày các vịng lặp được sử dụng trong ngơn ngữ lập trình C/C++. Phân biệt được các vịng lặp trong ngơn ngữ lập trình C/C++. Áp dụng được vịng lặp vào bài tốn cụ thể. Trình bày các lệnh rẽ nhánh được sử dụng trong ngơn ngữ lập trình C/C++. Lựa chọn đúng câu lệnh rẽ nhánh cho bài tốn cụ thể. Ý nghĩa, cách hoạt động của vịng lặp. Cú pháp, ý nghĩa, cách sử dụng lệnh for, while, do while. Ý nghĩa và cách sử dụng lệnh break, continue. Một số bài tốn sử dụng lệnh for, while, do while thơng qua các ví dụ. So sánh, đánh giá một số bài tốn sử dụng lệnh for, while hoặc do while. Cấu trúc vịng lặp lồng nhau. 3.2 Nội dung 3.2.1 Câu lệnh điều khiển Câu lệnh điều kiện if cho phép lựa chọn một trong hai nhánh tùy thuộc vào giá trị của biểu thức điều kiện là đúng (true) hay sai (false) hoặc khác khơng hay bằng khơng. 3.2.1.1 Dạng 1 (if thiếu) Kiểm tra câu lệnh biểu thức điều kiện quyết định sẽ thực hiện hay khơng một khối lệnh thỏa điều kiện. Cú pháp lệnh: if (điều kiện)  từ khĩa if phải viết bằng chữ thường khối lệnh;  Ý nghĩa  Kết quả của điều kiện phải là đúng ( 0) hoặc sai (=0)  Nếu điều kiện đúng thì thực hiện khối lệnh và thốt khỏi if, ngược lại khơng KHOA CƠNG NGHỆ THƠNG TIN Trang 30
  32. Bài 3: Cấu trúc điều khiển làm gì cả và thốt khỏi if  Lưu đồ.  Nếu khối lệnh bao gồm từ 2 lệnh trở lên thì phải đặt trong dấu { }  Lưu ý: - Khơng đặt dấu chấm phẩy sau câu lệnh if. Ví dụ: if(điều kiện); - Trình biên dịch khơng báo lỗi nhưng khối lệnh khơng được thực hiện cho dù điều kiện đúng hay sai. Ví dụ 1: Viết chương trình nhập vào 2 số nguyên a, b. Tìm và in ra số lớn nhất. a. Ý tưởng lời giải - Trước tiên ta gán a là giá trị lớn. - Sau đĩ so sánh b với a, nếu b lớn hơn a ta gán b cho max - Cuối cùng ta được kết quả max là giá trị lớn nhất. b. Mơ tả bằng lưu đồ thuật giải thuật giải KHOA CƠNG NGHỆ THƠNG TIN Trang 31
  33. Bài 3: Cấu trúc điều khiển c. Viết chương trình Hình 4: Màn hình giải ví dụ 1 mục 3.2.1.1  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 32
  34. Bài 3: Cấu trúc điều khiển Hình 5: Kết quả chương trình chạy ví dụ 1 mục 3.2.1.1 Ví dụ 2: Viết chương trình nhập vào 2 số nguyên a, b. Nếu a lớn hơn b thì hốn đổi giá trị a và b, ngược lại khơng hốn đổi. In ra giá trị a, b. a. Ý tưởng lời giải - Nếu giá trị a lớn hơn giá trị b, bạn phải hốn chuyển 2 giá trị này cho nhau - Ta sẽ tạo một biến tạm cùng kiểu dữ liệu với a và gán biến tạm cho giá trị là a. - Sau đĩ gán giá trị b cho a và cuối cùng gán giá trị biến tạm cho b, rồi in giá trị a, b ra cho người dùng xem. b. Mơ tả bằng lưu đồ thuật giải Bắt đầu Nhập a, b a > b Sai Đúng tam = a a = b b = tam In a, b Kết thúc d. Viết chương trình KHOA CƠNG NGHỆ THƠNG TIN Trang 33
  35. Bài 3: Cấu trúc điều khiển Hình 6: Màn hình giải ví dụ 2 mục 3.2.1.1  Kết quả in ra màn hình Hình 7: Kết quả chương trình chạy ví dụ 2 mục 3.2.1.1 3.2.1.2 Dạng 2 (if else) Câu lệnh if dạng 2 được thực hiện 1 trong 2 khối lệnh. Cú pháp lệnh if (Điều kiện) Khối lệnh 1; else Khối lệnh 2; Ý nghĩa  Từ khĩa if, else phải viết bằng chữ thường KHOA CƠNG NGHỆ THƠNG TIN Trang 34
  36. Bài 3: Cấu trúc điều khiển  Nếu điều kiện đúng ( 0) thì thực hiện Khối lệnh 1  Ngược lại (Điều kiện sai) thực hiện Khối lệnh 2 Lưu đồ Lưu ý Nếu khối lệnh 1, khối lệnh 2 bao gồm từ 2 lệnh trở lên thì phải đặt trong dấu { } Ví dụ 3: Viết chương trình nhập vào 2 số nguyên a, b. In ra thơng báo "a bằng b" nếu a = b, ngược lại in ra thơng báo "a khác b". a. Ý tưởng lời giải  Nhập dữ liệu vào và so sánh a với b  Nếu a bằng b thì in ra câu thơng báo "a bằng b"  Ngược lại in ra thơng báo "a khác b". c. Mơ tả bằng lưu đồ thuật giải KHOA CƠNG NGHỆ THƠNG TIN Trang 35
  37. Bài 3: Cấu trúc điều khiển d. Viết chương trình Hình 8: Màn hình giải ví dụ 3 mục 3.2.1.2  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 36
  38. Bài 3: Cấu trúc điều khiển Hình 9: Kết quả chương trình chạy ví dụ 3 mục 3.2.1.2 Lưu ý: - Sau else khơng cĩ dấu chấm phẩy Ví dụ: else; printf(“a khac b\n”); - Trình biên dịch khơng báo lỗi, lệnh printf(“a khac b\n”); khơng thuộc else Ví dụ 4: Viết chương trình nhập vào kí tự c. Kiểm tra xem nếu kí tự nhập vào là kí tự thường trong khoảng từ 'a' đến 'z' thì đổi sang chữ in hoa và in ra, ngược lại in ra thơng báo "Kí tự bạn vừa nhập là: c". a. Ý tưởng lời giải - Trước tiên bạn phải kiểm tra xem nếu kí tự c thuộc khoảng 'a' và 'z' - Đổi kí tự c thành chữ in hoa bằng cách lấy kí tự c – 32 rồi gán lại cho chính nĩ (vì giữa kí tự thường và in hoa trong bảng mã ASCII cách nhau 32, sau khi đổi xong bạn in kí tự c ra. - Ngược lại, in câu thơng báo "Kí tự bạn vừa nhập là: c". b. Mơ tả bằng lưu đồ thuật giải KHOA CƠNG NGHỆ THƠNG TIN Trang 37
  39. Bài 3: Cấu trúc điều khiển c. Viết chương trình Hình 10: Màn hình giải ví dụ 4 mục 3.2.1.2  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 38
  40. Bài 3: Cấu trúc điều khiển Hình 11: Kết quả chương trình chạy ví dụ 4 mục 3.2.1.2 3.2.1.3 Cấu trúc else if Sẽ kiểm tra điều kiện và thực hiện 1 trong n khối lệnh cho trước. Cú pháp if (Điều kiện 1) khối lệnh 1; else if (Điều kiện 2) khối lệnh 2; else if (Điều kiện n-1)  Nếu khối lệnh 1, 2 n bao gồm từ 2 lệnh khối lệnh n-1; trở lên thì phải đặt trong dấu { } else khối lệnh n; Ý nghĩa - Từ khĩa if, else if, else phải viết bằng chữ thường - Kết quả của điều kiện 1, 2 n phải là đúng (# 0) hoặc sai (= 0) - Nếu khối lệnh 1, 2 n bao gồm từ 2 lệnh trở lên thì phải đặt trong dấu { } Lưu đồ KHOA CƠNG NGHỆ THƠNG TIN Trang 39
  41. Bài 3: Cấu trúc điều khiển Ví dụ 5: Viết chương trình nhập vào 2 số nguyên a, b. In ra thơng báo "a lớn hơn b" nếu a>b, in ra thơng báo "a nhỏ hơn b" nếu a b thì in ra thơng báo "a lớn hơn b", ngược lại nếu a b a < b Đúng Đúng "a lon hon b" "a nho hon b" "a bang b" Kết thúc c. Viết chương trình KHOA CƠNG NGHỆ THƠNG TIN Trang 40
  42. Bài 3: Cấu trúc điều khiển Hình 12: Màn hình giải ví dụ 5 mục 3.2.1.3  Kết quả in ra màn hình Hình 13: Kết quả chương trình chạy ví dụ 5 mục 3.2.1.3 Ví dụ 6: Viết chương trình nhập 3 số a, b, c là kiểu số nguyên. Tìm số lớn nhất trong 3 số vừa nhập. a. Ý tưởng lời giải - So sánh giá trị a vừa nhập lớn hơn với giá trị của b, nếu đúng - So sánh giá trị a lớn hơn giá trị c thì số lớn nhất là a, ngược lại với điều kiện a lớn hơn c thì giá trị lớn nhất sẽ là c. - Nếu điều kiện giá trị a lớn hơn giá trị b là sai (Ngược lại với điều kiện ban đầu) - So sánh nếu giá trị b lớn hơn giá trị c thì số lớn nhất là b, ngược lại (b>c) thì số lớn nhất là c. b. Lưu đồ thuật giải KHOA CƠNG NGHỆ THƠNG TIN Trang 41
  43. Bài 3: Cấu trúc điều khiển c. Viết chương trình KHOA CƠNG NGHỆ THƠNG TIN Trang 42
  44. Bài 3: Cấu trúc điều khiển Hình 14: Màn hình giải ví dụ 6 mục 3.2.1.3  Kết quả in ra màn hình Hình 15: Kết quả chương trình chạy ví dụ 6 mục 3.2.1.3 KHOA CƠNG NGHỆ THƠNG TIN Trang 43
  45. Bài 3: Cấu trúc điều khiển Ví dụ 7: Viết chương trình nhập điểm và xếp loại như sau: Nếu điểm >= 9, Xuất sắc. Nếu điểm từ 8 đến 8.9, Giỏi. Nếu điểm từ 7 đến 7.9, Khá. Nếu điểm từ 6 đến 6.9, TBKhá. Nếu điểm từ 5 đến 5.9, TBình. Cịn lại là Yếu. a. Ý tưởng lời giải Kiểm tra điểm nhập vào phải từ 0 đến 10. Nếu đúng yêu cầu xếp loại Ngược lại báo điểm khơng hợp lệ. b. Mơ tả bằng lưu đồ thuật giải Bắt đầu Nhập diêm diem >= 0 Đúng và diem =9 Sai Sai diem >=8 Đúng Sai diem >=7 Đúng Sai diem >=6 Đúng Sai diem >=5 Đúng Đúng diem khong hop Xuat sac Gioi Kha TBKha TBinh Yeu le Kết thúc d. Viết chương trình KHOA CƠNG NGHỆ THƠNG TIN Trang 44
  46. Bài 3: Cấu trúc điều khiển Hình 16: Màn hình giải ví dụ 7 mục 3.2.1.3  Kết quả in ra màn hình Hình 17: Kết quả chương trình chạy ví dụ 7 mục 3.2.1.3 3.2.1.4 Lệnh switch case Cấu trúc switch case cho phép lựa chọn một nhánh trong nhiều khả năng tùy vào điều kiện xảy ra. Cú pháp switch (Biểu thức nguyên) { case n1: Khối lệnh 1; KHOA CƠNG NGHỆ THƠNG TIN Trang 45
  47. Bài 3: Cấu trúc điều khiển case n2: Khối lệnh 2; case ni: Khối lệnh i; [default: Khối lệnh; ] } Ý nghĩa - ni là các số nguyên, hằng ký tự hoặc biểu thức hằng. Các ni cần cĩ giá trị khác nhau. - Đoạn chương trình nằm trong cặp ngoặc nhọn {} là thân của switch. - default, case là các từ khĩa. default là thành phần khơng bắt buộc. Lưu đồ Cách hoạt động:  Đầu tiên được tính, sau đĩ lần lượt so sánh giá trị của với các biểu thức hằng , , . KHOA CƠNG NGHỆ THƠNG TIN Trang 46
  48. Bài 3: Cấu trúc điều khiển  Nếu giá trị của một biểu thức hằng thứ k trong các biểu thức này trùng với giá trị của thì chương trình sẽ thực hiện các lệnh bắt đầu từ khối lệnh k và tiếp tục các lệnh phía dưới cho tới khi: + Gặp câu lệnh: break (tất nhiên nếu gặp các câu lệnh return, exit thì cũng kết thúc). + Gặp dấu đĩng mĩc } hết cấu trúc switch.  Nếu khơng trùng với giá trị nào trong các biểu thức hằng thì khối lệnh (các lệnh sau mệnh đề default nếu cĩ) sẽ được thực hiện, rồi ra khỏi cấu trúc switch. Ví dụ 8: Viết chương trình nhập vào số 1, 2, 3. In ra tương ứng 1, 2, 3 sao. a. Viết chương trình Hình 18: Màn hình giải ví dụ 8 mục 3.2.1.4  Kết quả in ra màn hình Hình 19: Kết quả chương trình chạy ví dụ 8 mục 3.2.1.4 Ví dụ 9: Viết chương trình nhập vào tháng và in ra quý tương ứng tháng đĩ trong năm. (tháng 1 - > quý 1, tháng 10 -> quý 4) KHOA CƠNG NGHỆ THƠNG TIN Trang 47
  49. Bài 3: Cấu trúc điều khiển a. Ý tưởng lời giải - Kiểm tra giá trị nhập tháng cĩ hợp lệ (trong khoảng 1 đến 12). - Nếu hợp lệ in ra quý tương ứng. b. Viết chương trình Hình 20: Màn hình giải ví dụ 9 mục 3.2.1.4  Kết quả in ra màn hình Hình 21: Kết quả chương trình chạy ví dụ 9 mục 3.2.1.4 Ví dụ 10: Viết lại chương trình ở ví dụ trên. a. Viết chương trình KHOA CƠNG NGHỆ THƠNG TIN Trang 48
  50. Bài 3: Cấu trúc điều khiển Hình 22: Màn hình giải ví dụ 10 mục 3.2.1.4  Kết quả in ra màn hình Hình 23: Kết quả chương trình chạy ví dụ 10 mục 3.2.1.4 Ví dụ 11: Viết lại chương trình ở ví dụ trên. a. Viết chương trình KHOA CƠNG NGHỆ THƠNG TIN Trang 49
  51. Bài 3: Cấu trúc điều khiển Hình 24: Màn hình giải ví dụ 11 mục 3.2.1.4  Kết quả in ra màn hình Hình 25: Kết quả chương trình chạy ví dụ 11 mục 3.2.1.4 Ví dụ 12: Viết chương trình sử dụng cấu trúc switch case, nhập 2 số nguyên a,b từ bàn phím, chương trình đưa ra lựa chọn: + Nếu người sử dụng nhập ‘+’: Thực hiện: a + b; + Nếu người sử dụng nhập ‘-‘: Thực hiện: a – b; + Nếu người sử dụng nhập ‘*’: Thực hiện: a * b; + Nếu người sử dụng nhập ‘/‘: Thực hiện: a / b; Nếu người sử dụng khơng nhập một trong các tốn tử trên thì đưa ra dịng thơng báo: “Khong hieu toan tu nay!”. KHOA CƠNG NGHỆ THƠNG TIN Trang 50
  52. Bài 3: Cấu trúc điều khiển . a. Viết chương trình Hình 26: Màn hình giải ví dụ 12 mục 3.2.1.4  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 51
  53. Bài 3: Cấu trúc điều khiển Hình 27: Kết quả chương trình chạy ví dụ 12 mục 3.2.1.4 3.2.2 Vịng lặp 3.2.2.1 Vịng lặp for Vịng lặp for xác định thực hiện lặp lại một số lần xác định dựa vào điền kiện được thỏa mãn.  Cú pháp lệnh for (khởi tạo; điều kiện ; biểu thức) { Các câu lệnh; } - Từ khĩa for phải viết bằng chữ thường  Lưu đồ KHOA CƠNG NGHỆ THƠNG TIN Trang 52
  54. Bài 3: Cấu trúc điều khiển Giải thích: + Khởi tạo: khởi tạo giá trị ban đầu cho biến điều khiển. + Điều kiện: là quan hệ logic thể hiện điều kiện tiếp tục vịng lặp. + Biểu thức: phép gán dùng thay đổi giá trị biến điều khiển. Lưu ý: + Các tham số trong for phải phân cách bằng dấu chấm phẩy (;) + Nếu điều kiện khơng cĩ, vịng for được xem là luơn luơn đúng. Muốn thốt khỏi vịng lặp for phải dùng một trong 3 lệnh break, goto hoặc return. + Với mỗi tham số cĩ thể viết thành một dãy biểu thức con phân cách nhau bởi dấu phẩy. Khi đĩ các tham số con được xác định từ trái sang phải. Tính đúng sai của dãy tham số con trong tham số thứ 2 được xác định bởi tham số con cuối cùng. + Trong thân for (các câu lệnh thực hiện) cĩ thể chứa một hoặc nhiều cấu trúc điều khiển khác. + Khi gặp lệnh break, cấu trúc lặp sâu nhất sẽ thốt ra. + Trong thân for cĩ thể dùng lệnh goto để thốt khỏi vịng lặp đến vị trí mong muốn. + Trong thân for cĩ thể sử dụng return để trở về một hàm nào đĩ. + Trong thân for cĩ thể sử dụng lệnh continue để chuyển đến đầu vịng lặp (bỏ qua các câu lệnh cịn lại trong thân). Ví dụ 13: Viết chương trình nhập vào n số nguyên dương (n>0) và tính tổng S(n)=1+2+3+ +n. KHOA CƠNG NGHỆ THƠNG TIN Trang 53
  55. Bài 3: Cấu trúc điều khiển Hình 28: Màn hình giải ví dụ 13 mục 3.2.2.1  Kết quả in ra màn hình Hình 29: Kết quả chương trình chạy ví dụ 13 mục 3.2.2.1 Ví dụ 14: Viết chương trình nhập vào n số nguyên dương (n>0) và tính tổng S(n)=12+22+32+ +n2. KHOA CƠNG NGHỆ THƠNG TIN Trang 54
  56. Bài 3: Cấu trúc điều khiển Hình 30: Màn hình giải ví dụ 14 mục 3.2.2.1  Kết quả in ra màn hình Hình 31: Kết quả chương trình chạy ví dụ 14 mục 3.2.2.1 Ví dụ 15: Viết chương trình nhập vào n số nguyên dương và tính T(n)=1*2*3* *n. KHOA CƠNG NGHỆ THƠNG TIN Trang 55
  57. Bài 3: Cấu trúc điều khiển Hình 32: Màn hình giải ví dụ 15 mục 3.2.2.1  Kết quả in ra màn hình Hình 33: Kết quả chương trình chạy ví dụ 15 mục 3.2.2.1  Nếu cĩ dấu chấm phẩy sau lệnh for(i=1; i<=n; ++i);  Các lệnh thuộc vịng lặp for sẽ khơng được thực hiện. Ví dụ 16: Viết chương trình nhập vào 4 số nguyên. Tính và in ra tổng của chúng. KHOA CƠNG NGHỆ THƠNG TIN Trang 56
  58. Bài 3: Cấu trúc điều khiển Hình 34: Màn hình giải ví dụ 16 mục 3.2.2.1  Kết quả in ra màn hình Hình 35: Kết quả chương trình chạy ví dụ 16 mục 3.2.2.1 Ví dụ 17: Viết chương trình nhập vào số nguyên n. Tính tổng các giá trị lẻ từ 0 đến n. KHOA CƠNG NGHỆ THƠNG TIN Trang 57
  59. Bài 3: Cấu trúc điều khiển Hình 36: Màn hình giải ví dụ 17 mục 3.2.2.1  Kết quả in ra màn hình Hình 37: Kết quả chương trình chạy ví dụ 17 mục 3.2.2.1 Ví dụ 18: Một vài ví dụ thay đổi biến điều khiển vịng lặp. [8] - Thay đổi biến điều khiển từ 1 đến 100, mỗi lần tăng 1: for(i = 1; i = 1; i ) KHOA CƠNG NGHỆ THƠNG TIN Trang 58
  60. Bài 3: Cấu trúc điều khiển - Thay đổi biến điều khiển từ 7 đến 77, mỗi lần tăng 7: for(i = 7; i = 2; i –= 2) Ví dụ 19: Đọc vào một loạt kí tự trên bàn phím. Kết thúc khi gặp dấu chấm '.'. Hình 38: Màn hình giải ví dụ 19 mục 3.2.2.1  Kết quả in ra màn hình Hình 39: Kết quả chương trình chạy ví dụ 19 mục 3.2.2.1 Ví dụ 20: Nhập vào 1 dãy số nguyên từ bàn phím đến khi gặp số 0 thì dừng. In ra tổng các số nguyên dương. KHOA CƠNG NGHỆ THƠNG TIN Trang 59
  61. Bài 3: Cấu trúc điều khiển Hình 40: Màn hình giải ví dụ 20 mục 3.2.2.1  Kết quả in ra màn hình Hình 41: Kết quả chương trình chạy ví dụ 20 mục 3.2.2.1 3.2.2.2 Lệnh while Vịng lặp while thực hiện các câu lệnh khi kiểm tra điều kiện là đúng. Cú pháp lệnh while(Điều kiện) { Các câu lệnh; }  Từ khĩa while phải viết bằng chữ thường  Lưu đồ KHOA CƠNG NGHỆ THƠNG TIN Trang 60
  62. Bài 3: Cấu trúc điều khiển  Giải thích + Điều kiện: cĩ thể là một biểu thức hoặc nhiều biểu thức con. Nếu là nhiều biểu thức con thì cách nhau bởi dấu phẩy (,) và tính đúng sai của biểu thức được quyết định bởi biểu thức con cuối cùng. + Trong thân while (các câu lệnh) cĩ thể chứa một câu lệnh thực thi hoặc nhiều cấu trúc điều khiển thực thi khác. + Trong thân while cĩ thể sử dụng lệnh continue để chuyển đến đầu vịng lặp (bỏ qua các câu lệnh cịn lại trong thân). + Muốn thốt khỏi vịng lặp while tùy ý cĩ thể dùng các lệnh break, goto, return như lệnh for (câu lệnh này sẽ học ở mục sau)  Lưu ý Thân while cĩ thể được thực hiện một lần hoặc nhiều lần và cũng cĩ thể khơng được thực hiện lần nào nếu ngay từ đầu biểu thức sau while đã sai Ví dụ 21: Viết chương trình in ra câu "Khoa cong nghe thong tin" 5 lần. KHOA CƠNG NGHỆ THƠNG TIN Trang 61
  63. Bài 3: Cấu trúc điều khiển Hình 42: Màn hình giải ví dụ 21 mục 3.2.2.2  Kết quả in ra màn hình Hình 43: Kết quả chương trình chạy ví dụ 21 mục 3.2.2.2 Ví dụ 22: Viết chương trình tính T(n)=1*2*3* *n, với n được nhập vào từ bàn phím. KHOA CƠNG NGHỆ THƠNG TIN Trang 62
  64. Bài 3: Cấu trúc điều khiển Hình 44: Màn hình giải ví dụ 21 mục 3.2.2.2  Kết quả in ra màn hình Hình 45: Kết quả chương trình chạy ví dụ 21 mục 3.2.2.2 Ví dụ 22: Viết chương trình nhập n từ bàn phím và đếm in ngược n. KHOA CƠNG NGHỆ THƠNG TIN Trang 63
  65. Bài 3: Cấu trúc điều khiển Hình 46: Màn hình giải ví dụ 22 mục 3.2.2.2  Kết quả in ra màn hình Hình 47: Kết quả chương trình chạy ví dụ 22 mục 3.2.2.2 3.2.2.3 Lệnh do while Cấu trúc do while thường được sử dụng để kiểm tra các giá trị đầu vào (thường là các giá trị được nhập từ bàn phím) Cú pháp lệnh do{ Các câu lệnh; } while(Điều kiện); KHOA CƠNG NGHỆ THƠNG TIN Trang 64
  66. Bài 3: Cấu trúc điều khiển  Từ khĩa do, while phải viết bằng chữ thường  Lưu đồ Vào Các câu lệnh Đúng Điều kiện Sai Ra  Giải thích + Điều kiện: cĩ thể là một biểu thức điều kiện hoặc nhiều biểu thức con. Nếu là nhiều biểu thức con thì cách nhau bởi dấu phẩy (,) và tính đúng sai của biểu thức được quyết định bởi biểu thức con cuối cùng. + Trong thân do while (các câu lệnh) cĩ thể chứa một hoặc nhiều cấu trúc điều khiển thực thi khác. + Muốn thốt khỏi vịng lặp do while ta cĩ thể dùng các lệnh break, goto, return. Ví dụ 23: Viết chương trình nhập vào số nguyên n =10 chương trình sẽ thốt ra và tính tổng các số vừa nhập. Hình 48: Màn hình giải ví dụ 23 mục 3.2.2.3 KHOA CƠNG NGHỆ THƠNG TIN Trang 65
  67. Bài 3: Cấu trúc điều khiển  Kết quả in ra màn hình Hình 49: Kết quả chương trình chạy ví dụ 23 mục 3.2.2.3 Ví dụ 24: Viết chương trình nhập vào số phần tử của dãy, hãy tìm số lớn nhất và nhỏ nhất trong các phần tử vừa nhập. KHOA CƠNG NGHỆ THƠNG TIN Trang 66
  68. Bài 3: Cấu trúc điều khiển Hình 50: Màn hình giải ví dụ 24 mục 3.2.2.3  Kết quả in ra màn hình Hình 51: Kết quả chương trình chạy ví dụ 24 mục 3.2.2.3 3.2.2.4 Vịng lặp lồng nhau Ví dụ 25: Viết chương trình nhập vào chiều dài và rộng hình chữ nhật, sau đĩ vẽ và in hình chữ nhật đặc bằng các dấu '*' cho người dùng xem. Hình 52: Màn hình giải ví dụ 25 mục 3.2.2.4  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 67
  69. Bài 3: Cấu trúc điều khiển Hình 53: Kết quả chương trình chạy ví dụ 25 mục 3.2.2.4 Ví dụ 26: Vẽ hình chữ nhật đặc cĩ chiều rộng = 10 hàng. Hàng thứ 1 = 10 số 9, hàng thứ 2 = 10 số 8 Hình 54: Màn hình giải ví dụ 26 mục 3.2.2.4  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 68
  70. Bài 3: Cấu trúc điều khiển Hình 55: Kết quả chương trình chạy ví dụ 26 mục 3.2.2.4 3.2.2.5 Lệnh break - Câu lệnh break cho phép ra khỏi các chu trình với các tốn tử for, while và switch. - Khi cĩ nhiều chu trình lồng nhau, câu lệnh break sẽ kết thúc câu lệnh điều khiển đang sử dụng và ra khỏi 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ụ 27: 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 âm thì dừng Hình 56: Màn hình giải ví dụ 27 mục 3.2.2.5  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 69
  71. Bài 3: Cấu trúc điều khiển Hình 57: Kết quả chương trình chạy ví dụ 27 mục 3.2.2.5 3.2.2.6 Lệnh continue và goto - 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 điều kiện, cịn trong vịng lặp for điều khiển được chuyển về bước khởi đầu lại. - Chú ý: Lệnh continue chỉ áp dụng cho chu trình, khơng áp dụng cho switch. - Lệnh goto cho phép nhảy vơ điều kiện tới bất kỳ điểm nào trong chương trình. Ví dụ 28: In ra màn hình giá trị từ 1 đến 10 trừ đi 2 số nguyên tố 3 và số 7 Hình 58: Màn hình giải ví dụ 28 mục 3.2.2.6  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 70
  72. Bài 3: Cấu trúc điều khiển Hình 59: Kết quả chương trình chạy ví dụ 28 mục 3.2.2.6 Ví dụ 29: Viết chương trình nhập n số nguyên dương, sử dụng lệnh goto in ra giảm dần đến 1. Hình 60: Màn hình giải ví dụ 29 mục 3.2.2.6  Kết quả in ra màn hình Hình 61: Kết quả chương trình chạy ví dụ 29 mục 3.2.2.6 KHOA CƠNG NGHỆ THƠNG TIN Trang 71
  73. Bài 3: Cấu trúc điều khiển Ví dụ 30: Viết chương trình nhập n số nguyên dương, sử dụng lệnh continue tính tổng các số vừa nhập và bấm 0 kết thúc, và in kết quả tổng cho người dùng xem. Hình 62: Màn hình giải ví dụ 30 mục 3.2.2.6  Kết quả in ra màn hình Hình 63: Kết quả chương trình chạy ví dụ 30 mục 3.2.2.6 3.2.2.7 Lệnh exit Mục đích của exit là kết thúc chương trình và trả về một mã xác định. Dạng thức của nĩ như sau: void exit (int exit code); exit code được dùng bởi một số hệ điều hành hoặc cĩ thể được dùng bởi các chương trình gọi. KHOA CƠNG NGHỆ THƠNG TIN Trang 72
  74. Bài 3: Cấu trúc điều khiển Theo quy ước, mã trả về 0 cĩ nghĩa là chương trình kết thúc bình thường cịn các giá trị khác 0 cĩ nghĩa là cĩ lỗi. 3.3 Bài tập 3.3.1 Sử dụng lệnh if 1. Viết chương trình nhập vào số nguyên dương, in ra thơng báo số chẵn hay lẻ. Hướng dẫn: Nhập vào số nguyên dương x. Kiểm tra nếu x chia chẵn cho hai thì x là số chẵn (hoặc chia cho 2 dư 0) ngược lại là số lẻ. 2. Viết chương trình nhập vào 4 số nguyên. Tìm và in ra số lớn nhất. Hướng dẫn: Ta cĩ 4 số nguyên a, b, c, d. Tìm 2 số nguyên lớn nhất x, y của 2 cặp (a, b) và (c, d). Sau đĩ so sánh 2 số nguyên x, y để tìm ra số nguyên lớn nhất. 3. Viết chương trình giải phương trình bậc 2: ax2 + bx + c = 0, với a, b, c nhập vào từ bàn phím. Hướng dẫn: Nhập vào 3 biến a, b, c. Kiểm tra biến a=0 giải phương trình bậc nhất Ngược lại ta thực hiện các bước cịn lại Tính Delta = b*b - 4*a*c Nếu Delta < 0 thì Phương trình vơ nghiệm Ngược lại Nếu Delta = 0 thì x1 = x2 = - b/(2*a) Ngược lại x1 = (- b - sqrt(Delta))/(2*a) x2 = (- b + sqrt(Delta))/(2*a) Hết nếu Hết nếu 4. Viết chương trình giải phương trình ax4+bx2+c=0. 5. Viết chương trình nhập vào giờ phút giây (hh:mm:ss). Cộng thêm số giây nhập vào và in ra kết quả dưới dạng hh:mm:ss. Hướng dẫn: Nhập vào giờ phút giây vào 3 biến gio, phut, giay và nhập và giây cơng thêm vào biến them: Nếu giay + them < 60 thì KHOA CƠNG NGHỆ THƠNG TIN Trang 73
  75. Bài 3: Cấu trúc điều khiển giay = giay + them Ngược lại giay = (giay + them) - 60 phut = phut + 1 Nếu phut >= 60 thì phut = phut - 60 gio = gio + 1 Hết nếu Hết nếu 6. Viết chương trình nhập vào năm và kiểm tra xem năm đĩ cĩ phải là năm nhuận hay khơng? (Năm nhuận là năm chia hết cho 4 và khơng hết 100 hoặc chia hết cho 400) 3.3.2 Sử dụng lệnh switch 7. 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 hết cho 4 và khơng hết 100 hoặc chia hết cho 400) 8. Viết chương trình trị chơi One-Two-Three ra cái gì ra cái này theo điều kiện: - Búa (B) thắng Kéo, thua Giấy. - Kéo (K) thắng Giấy, thua Búa. - Giấy (G) thắng Búa, thua Kéo. Hướng dẫn: Dùng lệnh switch lồng nhau 9. Viết chương trình xác định biến ký tự color rồi in ra thơng báo - RED, nếu color = 'R' hoặc color = 'r' - GREEN, nếu color = 'G' hoặc color = 'g' - BLUE, nếu color = 'B' hoặc color = 'b' - BLACK, nếu color cĩ giá trị khác. 10. Viết chương trình nhập vào 2 số x, y và 1 trong 4 tố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) KHOA CƠNG NGHỆ THƠNG TIN Trang 74
  76. Bài 3: Cấu trúc điều khiển 3.3.3 Bài tập làm thêm 11. Viết chương trình nhập vào điểm 3 mơn thi: Tốn, Lý, Hĩa của học sinh. Nếu tổng điểm >= 15 và khơng cĩ mơn nào dưới 4 thì in kết quả đậu. Nếu đậu mà các mơn đều lớn hơn 5 thì in ra lời phê "Học đều các mơn", ngược lại in ra "Học chưa đều các mơn", các trường hợp khác là "Thi hỏng". 12. Viết chương trình nhập vào ngày tháng năm (dd:mm:yy), cho biết đĩ là thứ mấy trong tuần. 13. Viết chương trình nhập số giờ làm và lương giờ rồi tính số tiền lương tổng cộng. Nếu số giờ làm lớn hơn 40 thì những giờ làm dơi ra được tính 1,5 lần. 14. Viết chương trình nhập vào 3 giá trị nguyên dương a, b, c. Kiểm tra xem a, b, c cĩ phải là 3 cạnh của tam giác khơng? Nếu là 3 cạnh của tam giác thì tính diện tích của tam giác theo cơng thức sau: p *(p a) *(p b) * p c) 15. S = , với p là 1/2 chu vi của tam giác. Hướng dẫn: a, b, c là 3 cạnh của tam giác phải thỏa điều kiện sau: (a + b) > c và (a + c) > b và (b + c) > a 16. Viết chương trình nhập vào 3 số nguyên rồi in ra màn hình theo thứ tự tăng dần. 17. Viết chương trình tính tiền điện gồm các khoảng sau: - Tiền thuê bao điện kế: 1000đ/tháng - Định mức sử dụng điện cho mỗi hộ là: 50 KW với giá 230đ/KW - Nếu phần vượt định mức <= 50KW thì tính giá 480đ/KW - Nếu 50KW < phần vượt định mức < 100KW thì tính giá 700đ/KW - Nếu phần vượt định mức <= 100KW thì tính giá 900đ/KW Chỉ số mới và cũ được nhập vào từ bàn phím - In ra màn hình chỉ số cũ, chỉ số mới, tiền trả định mức, tiền trả vượt định mức, tổng tiền phải trả. 3.3.4 Bài tập vịng lặp 18. Viết chương trình in ra bảng mã ASCII 19. Viết chương trình tính tổng bậc 3 của N số nguyên đầu tiên. 20. Viết chương trình nhập vào một số nguyên rồi in ra tất cả các ước số của số đĩ. 21. Viết chương trình vẽ một tam giác cân bằng các dấu * 22. Viết chương trình tính tổng nghịch đảo của N số nguyên đầu tiên theo cơng thức S = 1 + 1/2 + 1/3 + + 1/N KHOA CƠNG NGHỆ THƠNG TIN Trang 75
  77. Bài 3: Cấu trúc điều khiển 23. Viết chương trình tính S(n)=1+1.2+1.2.3+ +1.2.3 .n 24. Viết chương trình tính S(n)=x+x2+x3+ +xn. 25. Viết chương trình tính S(n)=x+x2+x4+ +x2n. 26. Viết chương trình tính S(n)=1+1/(1+2)+1/(1+2+3)+ +1/(1+2+3+ +n). 27. Viết chương trình tính S(x,n)=x-x2+x3+ +(-1)n+1xn. 28. Viết chương trình tính S(x,n)=-x2+x4+ +(-1)nx2n. 29. Viết chương trình tính S(x,n)=x-x3+x5+ +(-1)nx2n-1. 30. Viết chương trình tính T(x,n)=-x+x2/2!-x3/3!+ +(-1)nxn/n!. 31. Viết chương trình tính T(x,n)=-1+x2/2!-x4/4!+ +(-1)n+1x2n/(2n)!. 32. Viết chương trình tính tổng bình phương các số lẻ từ 1 đến N. 33. Viết chương trình nhập vào N số nguyên, tìm số lớn nhất, số nhỏ nhất. 34. Viết chương trình nhập vào N rồi tính giai thừa của N. 35. Viết chương trình tìm USCLN, BSCNN của 2 số. 36. Viết chương trình vẽ một tam giác cân rỗng bằng các dấu *. 37. Viết chương trình vẽ hình chữ nhật rỗng bằng các dấu *. 38. Viết chương trình nhập vào một số và kiểm tra xem số đĩ cĩ phải là số nguyên tố hay khơng? 39. Viết chương trình tính số hạng thứ n của dãy Fibonaci. Dãy Fibonaci là dãy số gồm các số hạng p(n) với: p(n) = p(n-1) + p(n-2) với n>2 và p(1) = p(2) = 1 Dãy Fibonaci sẽ là: 1 1 2 3 5 8 13 21 34 55 89 144 40. Viết chương trình tính giá trị của đa thức n n-1 1 Pn = anx + an-1x + + a1x + a0 Hướng dẫn đa thức cĩ thể viết lại Pn = ( (anx + an-1)x + an-2)x + + a0 Như vậy trước tiên tính anx + an-1, lấy kết quả nhân với x, sau đĩ lấy kết quả nhân với x cộng thêm an-2, lấy kết quả nhân với x n gọi là bậc của đa thức. 41. Viết chương trình tính xn với x, n được nhập vào từ bàn phím. 42. Viết chương trình nhập vào 1 số từ 0 đến 9. In ra chữ số tương ứng. Ví dụ: nhập vào số 5, in ra "Năm". KHOA CƠNG NGHỆ THƠNG TIN Trang 76
  78. Bài 3: Cấu trúc điều khiển 43. Viết chương trình phân tích một số nguyên N thành tích của các thừa số nguyên tố. 44. Viết chương trình lặp lại nhiều lần cơng việc nhập một ký tự và in ra mã ASCII của ký tự đĩ, khi nào nhập số 0 thì dừng. 45. Viết chương trình tìm ước số chung lớn nhất và bội số chung nhỏ nhất của 2 số nguyên. 46. Viết chương trình in lá cờ nước Mỹ. 47. Viết chương trình tính dân số của một thành phố sau 10 năm nữa, biết rằng dân số hiện nay là 6.000.000, tỉ lệ tăng dân số hàng năm là 1.8% . 48. Viết chương trình tìm các số nguyên gồm 3 chữ số sao cho tích của 3 chữ số bằng tổng 3 chữ số. Ví dụ: 1*2*3 = 1+2+3. 49. Viết chương trình tìm các số nguyên a, b, c, d khác nhau trong khoảng từ 0 tới 10 thỏa mãn điều kiện a*d*d = b*c*c*c 50. Viết chương trình tính tổ hợp N chập K (với K <= N) C=((N-k+1) * (N-k+2)* N)/1*2*3* *k Trong đĩ C là một tích gồm k phần tử với phần tử thứ I là (N-k+1)/I. Để viết chương trình này, bạn dùng vịng lặp For với biến điều khiển I từ giá trị đầu là 1 tăng đến giá trị cuối là k kết hợp với việc nhân dồn vào kết quả C. 51. Viết chương trình giải bài tốn cổ điển sau: Trăm trâu, trăm cỏ Trâu đứng ăn năm Trâu nằm ăn ba, Ba trâu già ăn một Hỏi mỗi loại trâu cĩ bao nhiêu con. 52. Viết chương trình giải bài tốn cổ điển sau: Vừa gà vừa chĩ 36 con Bĩ lại cho trịn, đếm đủ 100 chân Hỏi cĩ bao nhiêu gà, bao nhiêu chĩ 53. Viết chương trình in ra bảng cửu chương 54. Viết chương trình xác định xem một tờ giấy cĩ độ dày 0.1 mm. Phải gấp đơi tờ giấy bao nhiêu lần để nĩ cĩ độ dày 1m. 55. Viết chương trình tìm các số nguyên tố từ 2 đến N, với N được nhập vào. 56. Viết chương trình lặp đi lặp lại các cơng việc sau: KHOA CƠNG NGHỆ THƠNG TIN Trang 77
  79. Bài 3: Cấu trúc điều khiển - Nhập vào một ký tự trên bàn phím. - Nếu là chữ thường thì in ra chính nĩ và chữ HOA tương ứng. - Nếu là chữ HOA thì in ra chính nĩ và chữ thường tường ứng. - Nếu là ký số thì in ra chính nĩ. - Nếu là một ký tự điều khiển thì kết thúc chương trình 57. Viết chương trình nhập vào x, n tính: - x x x (n dấu căn) x x n - 1 + 2 n 1 58. Viết chương trình nhập vào N số nguyên, đếm xem cĩ bao nhiêu số âm, bao nhiêu số dương và bao nhiêu số khơng. KHOA CƠNG NGHỆ THƠNG TIN Trang 78
  80. Bài 4: Hàm Bài 4 : HÀM 4.1 Mục tiêu Sau khi học xong bày học sinh sẽ trình bày và vận dụng được các kỹ năng cơ bản sau: - Khái niệm, cách khai báo về hàm. - Cách truyền tham số, tham biến, tham trị. - Sử dụng biến cục bộ, tồn cục trong hàm. - Sử dụng tiền xử lý #define - Sử dụng và định nghĩa được phương pháp lập trình kiểu đệ quy. 4.2 Nội dung 4.2.1 Tổng quan về hàm 4.2.1.1 Khái niệm Hàm là đoạn chương trình thực hiện một cơng việc nhất định. Hàm chia cắt việc lớn bằng nhiều việc nhỏ. Nĩ giúp cho chương trình dễ sửa, nhất là đối với các chương trình lớn. 4.2.1.2 Cấu trúc của hàm Một hàm là một nhĩm các lệnh đi cùng nhau để thực hiện một nhiệm vụ. Mỗi chương trình C/C++ cĩ ít nhất một hàm là hàm main(), và tất cả hầu hết các chương trình bình thường đều định nghĩa thêm các hàm. Một sự khai báo hàm thơng báo với bộ biên dịch về tên của hàm, kiểu trả về và tham số. Một định nghĩa hàm cung cấp phần thân của một hàm. Một hàm được biết đến với các tên khác nhau như một phương thức, một tuyến phụ hoặc một thủ tục. Cú pháp chung định nghĩa hàm trong ngơn ngữ C/C++ như sau: ( [Danh sách tham số]) { Các lệnh xử lý trong thân hàm } Giải thích: Kiểu trả về: Một hàm cĩ thể trả về một giá trị. Kieu_tra_ve là dạng dữ liệu của giá trị mà hàm trả về. Hàm xử lý các câu lệnh khơng trả về giá trị nào cả. Đĩ là hàm void. KHOA CƠNG NGHỆ THƠNG TIN Trang 79
  81. Bài 4: Hàm Tên hàm: Đây là tên thực sự của hàm. Tên hàm và danh sách tham số cấu tạo nên dấu hiệu hàm. Quy tắc đặt tên hàm giống tên biến, hằng Mỗi đối số cách nhau bằng dấu phẩy kèm theo kiểu dữ liệu tương ứng. Danh sách tham số: Khi hàm được gọi, bạn phải truyền vào danh sách các tham số. Một giá trị hướng đến một tham số thực tế. Danh sách tham số cĩ các kiểu, thứ tự và số lượng các tham số của hàm. Các tham số trong hàm là tùy chọn, nghĩa là một hàm cĩ thể khơng cĩ tham số. Các lệnh xử lý trong thân hàm: Phần thân của một hàm bao gồm tập hợp các lệnh xác định những gì mà hàm thực hiện. 4.2.1.3 Các ví dụ về sử dụng hàm Ví dụ 1: Viết chương trình định nghĩa cho một hàm cĩ tên gọi là max(). Hàm này cĩ 2 tham số: so1 và so2 và trả về giá trị lớn nhất giữa 2 số. Hình 64: Màn hình giải ví dụ 1 mục 4.2.1.3  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 80
  82. Bài 4: Hàm Hình 65: Kết quả chương trình chạy ví dụ 1 mục 4.2.1.3  Giải thích ví dụ 1: Khi định nghĩa hàm max(), dưới đây là câu khai báo hàm: int max(int so1, int so2); Tên các tham số khơng quan trọng trong việc khai báo hàm, và kiểu dưới đây là cách khai báo hợp lệ: int max(int, int); Trong khi tạo một hàm, bạn định nghĩa những gì hàm phải làm. Để sử dụng một hàm, bạn phải gọi hàm đĩ để thực hiện một nhiệm vụ cụ thể. ketqua= max(a,b); //Dịng 20 Khi một chương trình gọi một hàm, phần điều khiển được chuyển đến hàm được gọi. Một hàm được gọi thực hiện các nhiệm vụ được định nghĩa và trả về giá trị sau khi thực hiện chương trình. Để gọi hàm, bạn đơn giản cần truyền các tham số được yêu cầu cùng với tên của hàm và nếu hàm trả về các giá trị, bạn cĩ thể dự trữ các giá trị trả về này. Chú ý: Một khai báo hàm được yêu cầu khi bạn định nghĩa một hàm và mã nguồn và khi gọi một hàm từ một file nguồn khác. Thì bạn nên khai báo hàm trước khi gọi hàm đĩ. Ví dụ 2: Viết chương trình tính tổng giữa 2 tham số truyền vào. Và tham số thứ 2 được gán mặc định. KHOA CƠNG NGHỆ THƠNG TIN Trang 81
  83. Bài 4: Hàm Hình 66: Màn hình giải ví dụ 2 mục 4.2.1.3  Kết quả in ra màn hình Hình 67: Kết quả chương trình chạy ví dụ 2 mục 4.2.1.3  Chú ý ví dụ trên như sau: Việc này được thực hiện bởi sử dụng tốn tử gán và gán các giá trị cho các tham số trong định nghĩa hàm. Nếu một giá trị cho tham số đĩ khơng được truyền khi hàm được gọi, thì giá trị mặc định đã cung cấp sẽ được sử dụng, nhưng nếu một giá trị đã được xác định, thì giá trị mặc định này bị bỏ qua và, thay vào đĩ, giá trị đã truyền được sử dụng. Ví dụ 3: Viết xây dựng hàm thời gian tính số phút đổi ra giờ. KHOA CƠNG NGHỆ THƠNG TIN Trang 82
  84. Bài 4: Hàm Hình 68: Màn hình giải ví dụ 3 mục 4.2.1.3  Kết quả in ra màn hình Hình 69: Kết quả chương trình chạy ví dụ 3 mục 4.2.1.3 4.2.2 Tham số dạng tham biến và tham trị 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 phương thức. Tham chiếu: Một tham số được truyền theo dạng tham chiếu thì giá trị sẽ bị thay đổi khi kết thúc phương thức Ví dụ 4: So sánh giữa tham trị và tham biến Bảng 13: Bảng so sánh kết quả truyền tham biến và tham trị KHOA CƠNG NGHỆ THƠNG TIN Trang 83
  85. Bài 4: Hàm Sử dụng tham trị Sử dụng tham biến Tĩm lại: - Khi truyền tham số theo kiểu tham trị thì giá trị của biến sẽ được lưu vào biến cục bộ của hàm và tương tác trên đĩ. - Khi truyền theo kiểu tham chiếu, biến khai báo trong hàm sẽ trở thành một tham chiếu của biến tồn cục. Tức là nĩ giữ chung ơ nhớ với biến tồn cục, vì thế mọi thao tác với nĩ đều ảnh hưởng đến giá trị của biến tồn cục . 4.2.3 Vần đề tầm vực 4.2.3.1 Khái niệm Trong lập trình, khái niệm tầm vực dùng để chỉ một ngữ cảnh trong đĩ các giá trị và biểu thức được kết hợp với nhau. Các ngơn ngữ lập trình khác nhau sẽ cĩ các kiểu tầm vực khác nhau. Kiểu tầm vực sẽ quyết định những kiểu thực thể nào cĩ thể chứa trong tầm vực và làm thế nào tác động vào nĩ hay cịn gọi là ngữ nghĩa. Thơng thường, tầm vực được dùng để định nghĩa phạm vi che giấu thơng tin, tức là các biến cĩ thể được nhìn thấy hoặc truy cập từ các phần khác nhau của chương trình. 4.2.3.2 Quy tắc cơ bản Chứa các khai báo hoặc định nghĩa danh hiệu (identifier); KHOA CƠNG NGHỆ THƠNG TIN Trang 84
  86. Bài 4: Hàm Chứa các phát biểu và/hoặc biểu thức để định nghĩa một giải thuật hoặc một phần giải thuật; Chứa tầm vực khác hoặc nằm trong một tầm vực khác. Một khơng gian tên là một tầm vực sử dụng bản chất bao đĩng của tầm vực để nhĩm các danh hiệu cĩ liên hệ về mặt luận lý dưới một danh hiệu duy nhất. Vì vậy, tầm vực cĩ thể ảnh hưởng đến sự phân giải tên đối với nội dung của nĩ. 4.2.3.3 Tầm vực của biến Biến tồn cục là biến được khai báo ngồi tất cả các hàm, kể cả hàm main, biến tồn cục cĩ thể được sử dụng trong cả chương trình. Biến cục bộ là biến chỉ cĩ phạm vi hoạt động trong nội bộ của 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. Và bị hủy bỏ khi chương trình kết thúc. Tham số hình thức và biến cục bộ cĩ thể trùng tên với các đại lượng ngồi hàm mà khơng gây ra nhầm lẫn nào. Khi một hàm được gọi tới, việc đầu tiên là giá trị của các tham số thực được gán cho các tham số hình thức. Như vậy các tham số hình thức chính là các bản sao của các tham số thực. Hàm chỉ làm việc trên các tham số hình thức. Các tham số hình thức cĩ thể bị biến đổi trong thân hàm, cịn các tham số thực thì khơng bị thay đổi. Ví dụ 5: Viết chương trình giải phương trình bậc nhất ax+b=0 KHOA CƠNG NGHỆ THƠNG TIN Trang 85
  87. Bài 4: Hàm Hình 70: Màn hình giải ví dụ 5 mục 4.2.3.3  Kết quả in ra màn hình Hình 71: Kết quả chương trình chạy ví dụ 5 mục 4.2.3.3 Ví dụ 6: Viết chương trình nhập vào bán kính hình cầu, tính diện tích hình cầu sau đĩ xuất kết quả cho người dùng xem. KHOA CƠNG NGHỆ THƠNG TIN Trang 86
  88. Bài 4: Hàm Hình 72: Màn hình giải ví dụ 6 mục 4.2.3.3  Kết quả in ra màn hình Hình 73: Kết quả chương trình chạy ví dụ 6 mục 4.2.3.3 Lưu ý: Phải tránh sử dụng biến tồn cục vì: Biến tồn cục được sử dụng ở bất kỳ nơi đâu trong chương trình, chúng ta mất thời gian kiểm tra lại chúng, làm tăng sự phức tạp của chương trình. Rất nguy hiểm vì giá trị của chúng cĩ thể thay đổi bởi bất cứ hàm nào mỗi khi hàm đĩ được gọi. Người lập trình khĩ kiểm sốt được. 4.2.3.4 Tầm vực của hàm Tầm vực của hàm là một thuật ngữ dùng để nĩi lên khả năng “với đến” hay nĩi cách khác là một hàm cĩ thể sử dụng hàm khác hay khơng. Đây là một vấn đề khá quan trọng, bạn cần phải nắm rõ để cĩ thể xây dựng chương trình. Hàm nào cĩ tầm vực càng cao, nĩ càng cĩ khả năng được nhiều hàm khác sử dụng. KHOA CƠNG NGHỆ THƠNG TIN Trang 87
  89. Bài 4: Hàm 4.2.4 Dùng hướng dẫn #define Sau đây là một vài ví dụ dùng dẫn hướng #define để định nghĩa hàm đơn giản #define AREA_CIRCLE (frad) (4*PI*frad*frad) //tinh dien tich hinh cau #define SUM (x, y) (x + y) //cong 2 so #define SQR (x) (x*x) //tinh x binh phuong #define MAX(x, y) (x > y) ? x : y //tim so lon nhat giua x va y #define ERROR (s) printf("%s\n", s) //in thong bao voi chuoi s Ví dụ 7: Trong ví dụ 6 sửa lại như sau Hình 74: Màn hình giải ví dụ 7 mục 4.2.4 Chạy lại chương trình, quan sát và nhận xét kết quả. Ví dụ 8: Viết chương trình tìm số lớn nhất trong 2 số thực a và b. Hình 75: Màn hình giải ví dụ 8 mục 4.2.4 KHOA CƠNG NGHỆ THƠNG TIN Trang 88
  90. Bài 4: Hàm  Kết quả in ra màn hình Hình 76: Kết quả chương trình chạy ví dụ 8 mục 4.2.4 4.2.5 Đệ quy 4.2.5.1 Khái niệm Đệ quy là hàm gọi lại chính trong thân hàm đĩ. Xây dựng hàm đệ quy cần xác định 2 yếu tố điều kiện sau: Điều kiện dừng: là trường hợp mà hàm trả về kết quả trực tiếp Điều kiện đệ quy: là trường hợp và hàm gọi lại chính nĩ ở mức độ nhỏ hơn Cú pháp đệ quy như sau: ( ) { if(thỏa đk dừng) return ; else Tên_hàm( ); //Gọi lại chính hàm đĩ } 4.2.5.2 Các ví dụ Ví dụ 9: Viết hàm tính tổng S=1+2+3+ +n Điều kiện dừng: n=1 => S(1)=1 Điều kiện đệ qui: n>1: S(n)=n+S(n-1) int tong(int n) { if(n==1) return 1; KHOA CƠNG NGHỆ THƠNG TIN Trang 89
  91. Bài 4: Hàm else return tong(n-1)+n; } Ví dụ 10: Tính n! T(n)=n! = 1*2*3* *(n-2)*(n-1)*n với n >= 1và 0! = 1. Điều kiện dừng: n=0 || n=1=> T(0)=1 Điều kiện đệ qui: n>1: T(n)=n*T(n-1) int giaithua(int n) { if(n==0 || n==1) return 1; else return n*giaithua(n-1); } Chạy lại chương trình, quan sát, nhận xét và đánh giá kết quả Ví dụ 11: Dãy số Fibonacci 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, Bắt đầu bằng 0 và 1, các số tiếp theo bằng tổng hai số đi trước. Điều kiện dừng: n=0 || n=1=> T(0)=1 Điều kiện đệ qui: n>1: Fibo(n) = Fibo(n – 1) + Fibo(n – 2) KHOA CƠNG NGHỆ THƠNG TIN Trang 90
  92. Bài 4: Hàm Hình 77: Màn hình giải ví dụ 11 mục 4.2.5.2  Kết quả in ra màn hình Hình 78: Kết quả chương trình chạy ví dụ 11 mục 4.2.5.2 Ví dụ 12: Dùng đệ quy viết chương trình tính S(n) = 1 + 1/(1+2) + 1/(1+2+3) + + 1/(1+2+3+ +n) xuất kết quả cho người dùng xem. Điều kiện dừng: n=1=> S(1)=1 Điều kiện đệ qui: n>1: S(n-1) + 1/(Tong(n-1) + n) #include KHOA CƠNG NGHỆ THƠNG TIN Trang 91
  93. Bài 4: Hàm #include using namespace std; float Tong(float n) { if(n == 1) { return (float)1; } return Tong(n-1) + n; } float TongChia(float n) { if(n == 1) { return (float)1; } return TongChia(n-1) + 1/(Tong(n-1) + n); } int main(int argc, char *argv[]) { int n; float S; cout >n; S=TongChia(n); cout<<"Tong S="<<S; cout<<"\n";system("PAUSE"); return EXIT_SUCCESS; } KHOA CƠNG NGHỆ THƠNG TIN Trang 92
  94. Bài 4: Hàm  Kết quả in ra màn hình Hình 79: Kết quả chương trình chạy ví dụ 12 mục 4.2.5.2 Ví dụ 13: Dùng đệ quy viết chương trình tính S(n) = 1 + 1.2 + 1.2.3 + + 1.2.3 n xuất kết quả cho người dùng xem. Điều kiện dừng: n=1=> S(1)=1 Điều kiện đệ qui: n>1: S(n-1) + GiaiThua(n-1)*n #include #include using namespace std; long GiaiThua(int n) { if(n==1) { return 1; } return GiaiThua(n-1)*n; } long Tong(int n) { if(n == 1) { return 1; } KHOA CƠNG NGHỆ THƠNG TIN Trang 93
  95. Bài 4: Hàm return Tong(n-1) + GiaiThua(n-1)*n; } int main(int argc, char *argv[]) { int n; long S; cout >n; S=Tong(n); cout<<"Tong S="<<S; cout<<"\n";system("PAUSE"); return EXIT_SUCCESS; }  Kết quả in ra màn hình Hình 80: Kết quả chương trình chạy ví dụ 13 mục 4.2.5.2 4.2.6 Ưu nhược điểm của đệ quy Giải thuật đệ quy cĩ ưu điểm là thuận lợi cho việc biểu diễn bài tốn, đồng thời làm gọn chương trình. Tuy nhiên cũng cĩ nhược điểm, đĩ là khơng tối ưu về mặt thời gian (so với sử dụng vịng lặp), gây tốn bộ nhớ. 4.3 Bài tập 4.3.1 Bài tập hàm 1. Viết hàm kiểm tra số nguyên tố. 2. Viết hàm tính số hạng thứ n trong dãy Fibonacci. KHOA CƠNG NGHỆ THƠNG TIN Trang 94
  96. Bài 4: Hàm 3. Viết hàm tìm số lớn nhất trong 2 số. 4.3.2 Bài tập đệ quy 4. Viết hàm đệ quy tính tổng n số nguyên dương đầu tiên: tong (n) = n + tong (n – 1) 5. In đảo ngược số n nguyên dương 6. Đếm số lượng chữ số nguyên dương n 7. Tìm chữ số cĩ giá trị lớn nhất của số nguyên dương n 8. Tìm giá trị nguyên logarit cơ số 2 của n 9. Đổi sang hệ nhị phân của số nguyên dương n 10. Tìm ước số chung lớn nhất của 2 số nguyên a, b. 11. Tìm chữ số đầu tiên của số nguyên dương n. 12. Tính P(n)=1.3.5 (2n+1) với n>=0 13. Tính S(n)=1+3+5+ +(2.n+1) với n>=0 14. Tính S(n)=1-2+3-4+ + ((-1)^(n+1)).n với n>0 15. Tính S(n)=1+1.2+1.2.3+ +1.2.3 n với n>0 16. Tính S(n)=1^2+2^2+3^2+ +n^2 với n>0 17. Tính P(x,y)=x^y 18. Tính S(n) = 1 + 1/2 + 1/3 + + 1/n với n>0 19. Tính S(n)=1+1/2+1/(2.4)+1/(2.4.6)+ +1/(2.4.6.2n) với n>0 20. Viết hàm đệ quy tính C(n, k) biết C(n, k) = 1 nếu k = 0 hoặc k = n C(n, k) = 0 nếu k > n C(n ,k) = C(n-1, k) + C(n-1, k-1) nếu 0<k<n 21. Bài tốn “Tháp Hà Nội”. 22. Bài tốn “8 hậu”. 23. Bài tốn “Mã đi tuần”. KHOA CƠNG NGHỆ THƠNG TIN Trang 95
  97. Bài 5: Mảng và chuỗi Bài 5 : MẢNG VÀ CHUỖI 5.1 Mục tiêu Sau khi học xong học sinh sẽ trình bày và vận dụng được các kỹ năng cơ bản sau: - Ý nghĩa, cách khai báo mảng, chuỗi. - Nhập, xuất mảng, chuỗi. - Khởi tạo mảng chuỗi. - Một số kỹ thuật thao tác trên mảng, chuỗi. - Dùng mảng làm tham số cho hàm. - Một số hàm xử lý chuỗi 5.2 Nội dung 5.2.1 Mảng Mảng là tập hợp các phần tử cĩ giá trị cùng kiểu dữ liệu và cùng tên. Do đĩ để truy xuất các biến thành phần, ta dùng cơ chế chỉ mục (chỉ số). Ví dụ 1: Bạn muốn tính trung bình 5 mơn học cĩ kiểu số thực được nhập từ bàn phím, bạn sẽ khai báo 5 biến: van, toan, ly, hoa, sinh cĩ kiểu là float, lệnh nhập điểm như sau: cout > van>> toan>> ly>> hoa>> sinh; Sau khi nhập 5 điểm và tính điểm trung bình cho 5 mơn như sau: Dtb=(van+ toan+ ly+ hoa+ sinh)/5;  Do số lượng biến rất ít cho nên chúng ta sử dụng khai báo biến như trên được, trong trường hợp với số lượng dữ liệu rất nhiều thì chúng ta tốn rất nhiều thời gian, vì vậy mảng được áp dụng trong số lượng dữ liệu nhiều, cĩ cùng kiểu dữ liệu. 5.2.1.1 Cách khai báo mảng Cú pháp: [ ] ; Trong đĩ: Kiểu_dữ_liệu_mảng: là kiểu dữ liệu của mảng, gồm các kiểu dữ liệu chuẩn hoặc kiểu dữ liệu do lập trình viên tự định nghĩa. Tên_mảng: là tên của mảng, do người lập trình đặt, theo quy tắc về tên của C/C++. KHOA CƠNG NGHỆ THƠNG TIN Trang 96
  98. Bài 5: Mảng và chuỗi Số_phần_tử_tối_đa: là một hằng số (hoặc biểu thức hằng) nguyên, dương là số phần tử được lưu tối đa của mảng đĩ. Ví dụ 2: int arr[100]; // Khai báo với tên mảng là arr, cĩ số phần tử tối đa là 100, kiểu dữ liệu của mảng arr là int. float hocsinh[200]; //Khai báo với tên mảng là hocsinh, cĩ số phần tử tối đa là 200, kiểu dữ liệu của mảng hocsinh là float. Khởi tạo mảng một chiều: int a[5] = {5, 9}, phần tử a[0] sẽ cĩ giá trị 5, a[1] cĩ giá trị 9, a[2], a [3], a[4] cĩ giá trị 0. int a[3] = {5, 10, 15, 20, 25} trình biên dịch báo lỗi Khởi tạo mảng khơng khai báo kích thước: Giả sử ta khai báo int a[] = {5, 10, 15, 20, 25}. Khi đĩ trình biên dịch sẽ đếm số phần tử trong danh sách khởi tạo và dùng con số đĩ làm kích thước mảng. 5.2.1.2 Tham chiếu đến từng phần tử mảng Sau khi mảng được khai báo, mỗi phần tử trong mảng đều cĩ chỉ số để tham chiếu. Cú pháp: Tên_mảng[chỉ_số] Trong đĩ: chỉ_số: là chỉ số số thứ tự của mảng, các phần tử trong một mảng được đánh chỉ số từ 0. Nếu mảng cĩ m phần tử thì chỉ số của mảng sẽ đánh từ 0 đến m-1. Mơ tả như sau: mảng arr[5] Giá trị arr[0] arr[1] arr[2] arr[3] arr[4] Chỉ số 0 1 2 3 4 5.2.1.3 Nhập/Xuất dữ liệu cho mảng một chiều Nhập mảng một chiều for(int i=0;i >arr[i]; } Xuất/ Đọc mảng một chiều for(int i=0;i<5;i++) //i chạy từ 0 đến 4 cout<<arr[i]<<”\t”; //Khoảng cách giữa các phần tử là 1 tab KHOA CƠNG NGHỆ THƠNG TIN Trang 97
  99. Bài 5: Mảng và chuỗi Ví dụ 3: Viết chương trình nhập vào một mảng A một chiều kiểu số nguyên, cĩ n phần tử với n<=20, n được nhập từ bàn phím. In các phần tử của mảng cho người dùng xem. Hình 81: Màn hình giải ví dụ 3 mục 5.2.1.3  Kết quả in ra màn hình Hình 82: Kết quả chương trình chạy ví dụ 3 mục 5.2.1.3 Ví dụ 4: Viết chương trình nhập vào một mảng A một chiều kiểu số nguyên, cĩ n phần tử với n<=20, n được nhập từ bàn phím, kiểm tra chi cho phép nhập n từ 1 đến 20. Tính tổng các phần tử vừa nhập. KHOA CƠNG NGHỆ THƠNG TIN Trang 98
  100. Bài 5: Mảng và chuỗi Hình 83: Màn hình giải ví dụ 4 mục 5.2.1.3  Kết quả in ra màn hình Hình 84: Kết quả chương trình chạy ví dụ 4 mục 5.2.1.3  Ngồi kiểu int, bạn cĩ thể khai báo mảng kiểu char, float, double Ví dụ 5: Viết chương trình nhập vào một mảng A một chiều kiểu số nguyên dương, nhập số âm sẽ kết thúc việc nhập và tính tổng các phần tử vừa nhập trên. KHOA CƠNG NGHỆ THƠNG TIN Trang 99
  101. Bài 5: Mảng và chuỗi Hình 85: Màn hình giải ví dụ 5 mục 5.2.1.3  Kết quả in ra màn hình Hình 86: Kết quả chương trình chạy ví dụ 5 mục 5.2.1.3 5.2.1.4 Mảng nhiều chiều Định nghĩa mảng 2 chiều Mảng hai chiều cĩ thể xem như bảng gồm các dịng các cột, các phần tử thuộc cùng một kiểu dữ liệu nào đĩ. Cú pháp mảng 2 chiều KHOA CƠNG NGHỆ THƠNG TIN Trang 100
  102. Bài 5: Mảng và chuỗi [dịng][cột]; Trong đĩ: - Kiểu_dữ_liệu_mảng: là kiểu dữ liệu của mảng, gồm các kiểu dữ liệu chuẩn hoặc kiểu dữ liệu do lập trình viên tự định nghĩa. - Tên_mảng: là tên của mảng, do người lập trình đặt, theo quy tắc về tên của C/C++. - dịng, cột: là hằng (hoặc biểu thức hằng) nguyên, dương tương ứng là số dịng và số cột mảng, số phần tử của mảng sẽ là dịng*cột. Ví dụ 6: int a[2][5]; // a là mảng số nguyên cĩ 2 dịng, 5 cột (cĩ 10 phần tử). float a[3][10]; // a là mảng số thực cĩ 3 dịng, 10 cột (cĩ 30 phần tử). char a[5][30]; // a là mảng kí tự cĩ 5 dịng, 30 cột Tham chiếu đến từng phần tử trong mảng 2 chiều Sau khi được khai báo, mỗi phần tử trong mảng 2 chiều đều cĩ 2 chỉ số để tham chiếu, chỉ số dịng và chỉ số cột. Với dịng là số nguyên xác định chỉ số dịng và cột là số hiệu cột cũng như trong mảng 1 chiều các chỉ số được tính từ 0. Tức là 0 ≤dịng ≤số_dịng -1 và 0≤cột≤số_cột -1 Bảng 14: Bảng biểu diễn mảng 2 chiều 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 a[2][1] a[3][4] a[0][6] a[2][8] . a[2][1] là phần tử tại dịng 2 cột 1 trong mảng 2 chiều. . a[3][4] là phần tử tại dịng 3 cột 4 trong mảng 2 chiều. . a[0][6] là phần tử tại dịng 0 cột 6 trong mảng 2 chiều. . a[2][8] là phần tử tại dịng 2 cột 8 trong mảng 2 chiều. Khởi tạo mảng 2 chiều Các phần tử mảng hai chiều cũng cĩ thể được khởi đầu giá trị theo cú pháp (4 dạng sau): KHOA CƠNG NGHỆ THƠNG TIN Trang 101
  103. Bài 5: Mảng và chuỗi  Kiểu_mảng tên_mảng[dịng][cột]={{kđ_dịng_1},{ kđ_dịng_2}, ,{ kđ_dịng_k}}; Cĩ k bộ giá trị sẽ được gán cho k dịng đầu tiên của mảng (k ≤ số_dịng), với mỗi dịng (được coi như mảng một chiều) được khởi tạo giá trị như mảng một chiều: - Dịng thứ nhất được khởi đầu bởi {kđ_dịng_1}, dịng thứ hai được khởi đầu bởi {kđ_dịng_1}, , dịng thứ k được khởi đầu bởi {kđ_dịng_k}. Yêu cầu k ≤ sd, ngược lại chương trình sẽ báo lỗi. - Các dịng cuối của mảng nếu khơng cĩ bộ khởi đầu tương ứng thì sẽ được tự động gán giá trị 0 (hoặc NULL nếu là con trỏ)  Kiểu_mảng tên_mảng[][cột] = {{kđ_dịng_1},{ kđ_dịng_2}, ,{ kđ_dịng_k}}; (khơng xác định số dịng) chương trình dịch sẽ tự động ấn định số dịng của mảng bằng số bộ khởi đầu ( = k), sau đĩ thực hiện khởi đầu như dạng 1.  Kiểu_mảng tên_mảng[dịng][cột] = { gt_1, gt_2, ,gt_n }; n giá trị trong bộ khởi đầu được gán cho các phần tử mảng theo cách: sc giá trị đầu tiên trong các giá trị khởi đầu (gt_1, ,gt_sc) được gán tuần tự cho các phần tử của dịng thứ nhất trong mảng, sc phần tử kế tiếp sẽ gán cho các phần tử ở dịng thứ 2, nếu phần tử nào của mảng khơng cĩ giá trị khởi đầu sẽ được gán 0 (con trỏ là NULL) - với điều kiện n ≤ dịng*cột, ngược lại là báo lỗi.  Kiểu_mảng tên_mảng[][cột] = { gt_1, gt_2, ,gt_n }; Số dịng của mảng sẽ được chương trình tự tính theo số giá trị trong bộ khởi đầu theo cơng thức sd = (n/sc) +1, và khởi đầu như dạng 3. Ví dụ 7: int a[3][2] = {{1,2},{3},{4,5}}; thì các phần tử của a như sau: a[0][0]=1, a[0][1]=2, a[1][0]=3, a[1][1]= 0, a[2][0]=4,a[2][1]=5; Ví dụ 8: int b[ ][2] = {{1,2},{3},{4,5}}; thì là mảng 3 dịng, 2 cột các phần tử của b như sau: b[0][0]=1, b[0][1]=2, b[1][0]=3,b[1][1]= 0, b[2][0]=4,b[2][1]=5; Ví dụ 9: int c[ ][2] = {1,2,3,4,5}; thì số dịng của c là mảng 5/2 +1 =3 dịng, các phần tử của a như sau: c[0][0]=1, c[0][1]=2, c[1][0]=3,c[1][1]= 4, b[2][0]=5,b[2][1]=0; 5.2.1.5 Nhập/Xuất dữ liệu cho mảng 2 chiều Nhập dữ liệu cho mảng 2 chiều KHOA CƠNG NGHỆ THƠNG TIN Trang 102
  104. Bài 5: Mảng và chuỗi for (i = 0; i >a[i][j]; } Thứ tự nhập mảng 2 chiều như sau: Thứ tự từng dịng từ trái sang phải. Xuất dữ liệu cho mảng 2 chiều for (i = 0; i < 5; i++) //i chạy từ 0 đến 4 cho từng dịng { for (j = 0; j < 10; j++) //j chạy từ 0 đến 9 cho cột cout<<a[i][j]<<”\t”; cout<<”\n”; //xuống dịng để in dịng kế tiếp } Ví dụ 10: Viết chương trình nhập vào 1 ma trận số nguyên n x m. In ra ma trận vừa nhập. KHOA CƠNG NGHỆ THƠNG TIN Trang 103
  105. Bài 5: Mảng và chuỗi Hình 87: Màn hình giải ví dụ 10 mục 5.2.1.5  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 104
  106. Bài 5: Mảng và chuỗi Hình 88: Kết quả chương trình chạy ví dụ 10 mục 5.2.1.5 Ví dụ 11: Viết chương trình nhập vào 1 ma trận số nguyên n x m. In ra ma trận vừa nhập và liệt kê các số lẻ trong mảng cho người dùng xem. KHOA CƠNG NGHỆ THƠNG TIN Trang 105
  107. Bài 5: Mảng và chuỗi Hình 89: Màn hình giải ví dụ 11 mục 5.2.1.5  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 106
  108. Bài 5: Mảng và chuỗi Hình 90: Kết quả chương trình chạy ví dụ 11 mục 5.2.1.5 Ví dụ 12: Nhập vào 2 ma trận vuơng cấp n số thập phân.Cộng 2 ma trận này lưu vào ma trận thứ 3 và tìm số lớn nhất trên ma trận thứ 3. KHOA CƠNG NGHỆ THƠNG TIN Trang 107
  109. Bài 5: Mảng và chuỗi Hình 91: Màn hình giải ví dụ 12 mục 5.2.1.5  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 108
  110. Bài 5: Mảng và chuỗi Hình 92: Kết quả chương trình chạy ví dụ 12 mục 5.2.1.5 5.2.2 Chuỗi 5.2.2.1 Cách khai báo chuỗi 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) Ví dụ: chuỗi "caodangkinhte" được lưu trữ như sau: Bảng 15: Bảng biểu diễn chuỗi lưu trong mảng c a o d a n g k i n h t e \0 Ký tự kết thúc chuỗi Cú pháp: char [Chiều dài tối đa] Ví dụ 13: Trong chương trình, ta cĩ khai báo: char hoten[20]; Trong khai báo này, bộ nhớ sẽ cung cấp 20+1 bytes để lưu trữ nội dung của chuỗi ký tự hoten; 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. Ví dụ 14: Nhập vào họ tên và in ra họ tên bạn vừa nhập KHOA CƠNG NGHỆ THƠNG TIN Trang 109
  111. Bài 5: Mảng và chuỗi Hình 93: Màn hình giải ví dụ 14 mục 5.2.2.1  Kết quả in ra màn hình Hình 94: Kết quả chương trình chạy ví dụ 14 mục 5.2.2.1 Khi bạn thử lại chương trình trên với dữ liệu nhập vào là Nguyen Dang, nhưng khi in ra bạn chỉ nhận được Nguyen. Vì hàm cin nhận vào dữ liệu đến khi gặp khoảng trắng thì kết thúc. 5.2.2.2 Hàm nhập (gets), xuất (puts) chuỗi Hàm nhập chuỗi (gets): Để nhập một chuỗi ký tự từ bàn phím, ta sử dụng hàm gets() Cú pháp: gets( ) Ta cũng cĩ thể sử dụng hàm scanf() để nhập dữ liệu cho biến chuỗi, tuy nhiên ta chỉ cĩ thể nhập được một chuỗi khơng cĩ dấu khoảng trắng. Ngồi ra, hàm cgets() (trong conio.h) cũng được sử dụng để nhập chuỗi. Hàm xuất chuỗi (puts): Để 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( ) KHOA CƠNG NGHỆ THƠNG TIN Trang 110
  112. Bài 5: Mảng và chuỗi Ngồ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. Ví dụ 15: Nhập vào họ tên và in ra họ tên bạn vừa nhập Hình 95: Màn hình giải ví dụ 15 mục 5.2.2.2  Kết quả in ra màn hình Hình 96: Kết quả chương trình chạy ví dụ 15 mục 5.2.2.2 Khởi tạo chuỗi Ví dụ 16: Hãy viết chương trình gán chuỗi “xin chào” vào biến mảng chao, sau đĩ nhập họ tên lưu vào mảng với tên là hoten. Xuất chuỗi gán và họ tên vừa nhập. KHOA CƠNG NGHỆ THƠNG TIN Trang 111
  113. Bài 5: Mảng và chuỗi Hình 97: Màn hình giải ví dụ 16 mục 5.2.2.2  Kết quả in ra màn hình Hình 98: Kết quả chương trình chạy ví dụ 16 mục 5.2.2.2 Mảng chuỗi Ví dụ 17: Viết chương trình xuất chuỗi trong mảng sau: Hình 99: Màn hình giải ví dụ 17 mục 5.2.2.2 KHOA CƠNG NGHỆ THƠNG TIN Trang 112
  114. Bài 5: Mảng và chuỗi  Kết quả in ra màn hình Hình 100: Kết quả chương trình chạy ví dụ 17 mục 5.2.2.2 5.2.2.3 Các hàm chuỗi thường sử dụng STT Hàm Ý nghĩa 1 strcpy(s1, s2); Sao chép chuỗi s2 cho chuỗi s1. 2 strcat(s1, s2); Nối chuỗi s2 vào cuối chuỗi s1. 3 strlen(s1); Trả về độ dài của chuỗi s1. strcmp(s1, s2); Trả về 0 nếu s1 và s2 là như nhau; nhỏ hơn 0 nếu s1 s2. 5 strchr(s1, ch); Trả về con trỏ tới vị trí đầu tiên của ch trong s1. 6 strstr(s1, s2); Trả về con trỏ tới vị trí đầu tiên của chuỗi s2 trong chuỗi s1. Ví dụ 18: Viết chương trình sử dụng một số hàm chuỗi xuất chuỗi: KHOA CƠNG NGHỆ THƠNG TIN Trang 113
  115. Bài 5: Mảng và chuỗi Hình 101: Màn hình giải ví dụ 18 mục 5.2.2.3  Kết quả in ra màn hình Hình 102: Kết quả chương trình chạy ví dụ 18 mục 5.2.2.3 5.3 Bài tập 1. Viết hàm tìm số lớn nhất, nhỏ nhất trong một mảng n số nguyên. 2. Viết chương trình nhập xuất mảng một chiều các số thực. 3. Viết chương trình khởi tạo giá trị các phần tử là 0 cho mảng một chiều các số nguyên gồm n phần tử. 4. Viết chương trình phát sinh ngẫu nhiên mảng một chiều các số nguyên âm. KHOA CƠNG NGHỆ THƠNG TIN Trang 114
  116. Bài 5: Mảng và chuỗi 5. Viết chương trình phát sinh ngẫu nhiên mảng một chiều các số nguyên sao cho mảng cĩ thứ tự tăng dần (Khơng sắp xếp). 6. Viết chương trình nhập mảng các số thực và xuất các phần tử âm trong mảng. 7. Viết chương trình nhập mảng các số nguyên và xuất các phần tử lẻ cĩ trong mảng. 8. Viết chương trình nhập vào mảng một chiều các số nguyên và xuất ra các phần tử chẵn nhỏ hơn 20. 9. Viết chương trình nhập vào mảng một chiều các số nguyên và xuất ra màn hình các phần tử là số nguyên tố. 10. Viết chương trình nhập vào mảng một chiều các số nguyên và xuất ra màn hình các phần tử là số chính phương nằm tại những vị trí lẻ trong mảng. 11. Viết phương thức tìm vị trí phần tử cĩ giá trị x xuất hiện cuối cùng trong mảng. 12. Viết phương thức tìm vị trí của phần tử nhỏ nhất trong mảng các số nguyên. 13. Viết phương thức tìm vị trí của phần tử lớn nhất trong mảng các số nguyên. 14. Viết phương thức in vị trí các phần tử nguyên tố trong mảng các số nguyên. 15. Viết phương thức in vị trí các phần tử nguyên tố lớn hơn 23. 16. Viết phương thức tìm vị trí phần tử âm đầu tiên trong mảng. Nếu khơng cĩ phần tử âm trả về –1. 17. Viết phương thức tìm vị trí phần tử âm lớn nhất trong mảng. 18. Viết phương thức tìm vị trí phần tử dương đầu tiên trong mảng. Nếu khơng cĩ phần tử dương trả về –1 19. Viết phương thức tìm vị trí phần tử dương bé nhất trong mảng. 20. Viết phương thức in các phần tử là bội của 3 hoặc 5. 21. Viết phương thức tìm số chẵn cuối cùng cĩ trong mảng, nếu khơng tồn tại số chẵn phương thức trả về -1. 22. Viết phương thức tìm số lẻ lớn nhất cĩ trong mảng, nếu khơng tồn tại số lẻ phương thức trả về -1. 23. Viết phương thức tìm và đổi chỗ phần tử lớn nhất với phần tử nhỏ nhất trong mảng. 24. Nhập vào X, viết phương thức in ra màn hình những phần tử cĩ giá trị từ 1 đến X cĩ trong mảng. 25. Viết phương thức tính tổng các phần tử chẵn trong mảng. 26. Viết phương thức tính tổng các phần tử lẻ trong mảng các số nguyên. 27. Viết phương thức tính tổng các phần tử là nguyên tố trong mảng. KHOA CƠNG NGHỆ THƠNG TIN Trang 115
  117. Bài 5: Mảng và chuỗi 28. Viết phương thức tính tổng các phần tử nằm ở vị trí chẵn trong mảng các số nguyên. 29. Viết phương thức tính tổng các phần tử chia hết cho 5 cĩ trong mảng 30. Viết phương thức xố phần tử tại vị trí lẻ trong mảng. 31. Viết phương thức xố phần tử cĩ giá trị lớn nhất trong mảng. 32. Cho giá trị X, viết phương thức xố tất cả các phần tử cĩ giá trị nhỏ hơn X. 33. Cho giá trị X, viết phương thức xố phần tử cĩ giá trị gần X nhất. 34. Viết phương thức sắp xếp mảng theo thứ tự giảm dần. 35. Viết phương thức sắp xếp mảng theo thứ tự tăng dần của các phần tử là số nguyên tố. 36. Viết phương thức sắp xếp các phần tử lẻ tăng dần. 37. Viết phương thức sắp xếp các phần tử chẵn giảm dần. 38. Viết phương thức sắp xếp các phần tử chẵn nằm bên trái theo thứ tự tăng dần cịn các phần tử lẻ bên phải theo thứ tự giảm dần. 39. Viết phương thức sắp xếp các phần tử âm giảm dần từ trái sang phải, phần tử dương tăng dần từ phải sang trái. 40. Viết chương trình nhập xuất mảng 2 chiều vuơng gồm cĩ n phần tử kiểu số nguyên. Tính tích 2 mảng 41. Viết hàm sắp xếp tăng dần, giảm dần của một dãy số cho trước. 42. Viết hàm tách tên và họ lĩt từ một chuỗi cho trước. 43. Viết hàm cắt bỏ khoảng trắng thừa ở giữa, hai đầu. 44. Viết hàm chuyển đổi 1 chuỗi sang chữ thường và 1 hàm chuyển đổi sang chữ HOA. 45. Viết hàm chuyển đổi 1 chuỗi sang dạng Title Case (kí tự đầu của mỗi từ là chữ HOA, các kí tự cịn lại chữ thường) 46. Viết chương trình nhập vào 1 chuỗi và in ra chuỗi đảo ngược. Ví dụ: Nhập vào chuỗi "Lap trinh C can ban" In ra "nab nac C hnirt paL" 47. Viết chương trình nhập vào một chuỗi ký tự rồi đếm xem trong chuỗi đĩ cĩ bao nhiêu chữ 'th'. 48. Biết rằng năm 0 là năm Canh thân (năm kỵ nhau cĩ chu kì là 3, năm hợp nhau cĩ chu kì là 4). Hãy viết chương trình cho phép gõ vào năm dương lịch (ví dụ 1997), xuất ra năm âm lịch (Đinh sửu) và các năm kỵ và hợp. Cĩ 12 chi: Tý, Sửu, Dần, Mão, Thìn, Tỵ, Ngọ, Mùi, Thân, Dậu, Tuất, Hợi. KHOA CƠNG NGHỆ THƠNG TIN Trang 116
  118. Bài 5: Mảng và chuỗi Cĩ 10 can: Giáp, Ất, Bính, Đinh, Mậu, Kỷ, Canh, Tân, Nhâm, Quý. 49. Viết chương trình nhập vào 3 chữ số (305, 6, 28). Cho biết dịng chữ mơ tả giá trị con số đĩ. Ví dụ 305 -> ba trăm lẻ năm. 50. Viết chương trình nhập vào một chuỗi sau đĩ in ra màn hình mỗi dịng là một từ. Ví dụ chuỗi "Lap trinh C". Kết quả in ra Lap trinh C 51. Viết chương trình nhập vào một chuỗi các kí tự, ký số, khoảng trắng và dấu chấm câu. Cho biết chuỗi trên gồm bao nhiêu từ. 52. Viết chương trình nhập vào một chuỗi ký tự. Kiểm tra xem chuỗi đĩ cĩ đối xứng khơng? 53. Viết chương trình nhập vào một chuỗi gồm các chữ cái (a -> z, A -> Z). Hãy đếm xem cĩ bao nhiêu nguyên âm a, i, e, o, u. 54. Giả sử số phịng trong một khách sạn được cho bởi hằng số NUM_ROOM. Viết: a. Một khai báo dãy thích hợp để theo dõi phịng nào cịn trống. b. Một hàm tìm phịng nào cịn trống. c. Viết chương trình đơn giản để quản lý phịng khách sạn theo dạng một trình đơn chọn cơng việc gồm cĩ 4 mục như sau: - Tìm phịng trống. - Trả phịng. - Liệt kê những phịng cịn trống. - Liệt kê những phịng đã thuê. - Kết thúc. 55. Viết chương trình mơ tả văn bản của một bức điện tín. Nhập liệu bao gồm 1 hay nhiều dịng chứa một số từ, mỗi từ cách nhau khoảng trắng. In ra hĩa đơn tính tiền với mỗi từ giá 100 đồng, phí trả thêm 50 đồng cho từ dài quá 8 kí tự. Hĩa đơn cĩ dạng sau: So tu : 10 So tu co kich thuoc binh thuong : 8 x 100 = 800 dong So tu co kích thuoc > 8 ki tu : 2 x 150 = 300 dong Tong cong : 1100 dong 56. Viết chương thống kê xem cĩ bao nhiêu người họ "Ly", "Tran" trong 1 danh sách cho trước. Nếu khơng cĩ thơng báo "Khơng cĩ nguoi nao thuoc ho .". KHOA CƠNG NGHỆ THƠNG TIN Trang 117
  119. Bài 5: Mảng và chuỗi 57. Viết chương trình nhập vào 1 chuỗi, sau đĩ chép sang chuỗi khác một chuỗi con từ chuỗi ban đầu cĩ số kí tự chỉ định. Ví dụ: Chuỗi ban đầu "Le Thuy Doan Trang". Nếu số kí tự chỉ định là 2 thì chuỗi đích sẽ là "Le" 58. Viết chương trình nhập vào 1 chuỗi, sau đĩ chép sang chuỗi khác một chuỗi con từ chuỗi ban đầu với vị trí bắt đầu và số kí tự chỉ định. Ví dụ: Chuỗi ban đầu "Le Thuy Doan Trang". Nếu vị trí ban đầu là 14 và số kí tự chỉ định là 5 thì chuỗi đích sẽ là "Trang" 59. Viết chương trình nhập vào 1 chuỗi nguồn, ví dụ "Nguyen Quang Dang", sau đĩ nhập vào 1 chuỗi con, ví dụ "Quang", chương trình sẽ xác định vị trí bắt đầu của chuỗi con ở vị trí nào trong chuỗi nguồn. Kết quả in ra màn hình như sau: - Chuoi nguon la : Nguyen Quang Dang - Chuoi con la : Quang - Vi tri bat dau cua chuoi con la : 8 60. Viết chương thực hiện các yêu cầu sau: - Nhập vào 1 chuỗi bất kỳ, ví dụ : "Nguyen Quang Dang - Muốn xĩa từ vị trí nào, ví dụ : 8 - Muốn xĩa bao nhieu kí tự, ví dụ : 6 Kết quả in ra man hinh: - Chuoi nguon la : Nguyen Quang Dang - Chuoi sau khi xoa : Nguyen Dang KHOA CƠNG NGHỆ THƠNG TIN Trang 118
  120. Bài 6: Con trỏ Bài 6 : CON TRỎ 6.1 Mục tiêu Sau khi học xong học sinh sẽ trình bày và vận dụng được các kỹ năng cơ bản sau: - Ý nghĩa, cách khai báo con trỏ - Sử dụng con trỏ trong mảng, chuỗi - Truyền mảng và chuỗi giữa các hàm qua con trỏ - Xử lý mảng dễ dàng qua con trỏ 6.2 Nội dung 6.2.1 Khái quát về con trỏ? 6.2.1.1 Khái niệm Con trỏ là một biến dùng để chứa địa chỉ. Vì cĩ nhiều loại địa chỉ nên cũng cĩ nhiều kiểu con trỏ tương ứng. Kiểu con trỏ int dùng để chứa địa chỉ biến kiểu int. Tương tự ta cĩ con trỏ kiểu float, kiểu double, Cũng như với 1 biến bất kỳ nào khác, con trỏ cần được khai báo trước khi sử dụng. 6.2.1.2 Lý do để dùng con trỏ Con trỏ giúp cấp phát vùng nhớ động, dùng tới đâu cấp phát tới đĩ, dùng xong thì cĩ thể giải phĩng vùng nhớ, tiết kiệm được bộ nhớ. Cĩ khả năng trỏ đến nhiều vùng nhớ khác nhau. Khi muốn tương tác với 1 vùng dữ liệu nào đĩ thay vì phải khai báo 1 vùng dữ liệu tương đương thì ta cĩ thể trỏ trực tiếp đến vùng dữ liệu đĩ và thao tác trên đĩ vì C/C++ cĩ thể tác động trực tiếp đến vùng nhớ nên các chương trình chạy bằng C/C++ thường chạy và xử lý rất nhanh. 6.2.1.3 Các tốn tử Tốn tử lấy địa chỉ (&) Địa chỉ: Khi khai báo biến, máy sẽ cấp phát cho biến một vùng nhớ. Đị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 (các byte được đánh số từ 0). Ví dụ: x=&y; KHOA CƠNG NGHỆ THƠNG TIN Trang 119
  121. Bài 6: Con trỏ Giải thích: Gán cho biến x địa chỉ của biến y vì khi đặt trước tên biến y dấu & ta khơng nĩi đến nội dung của biến nữa mà chỉ nĩi đến địa chỉ của nĩ trong bộ nhớ. Tốn tử tham chiếu (*) Bằng cách sử dụng con trỏ chúng ta cĩ thể truy xuất trực tiếp đến giá trị được lưu trữ trong biến được trỏ bởi nĩ bằng cách đặt trước tên biến con trỏ một dấu (*). Ví dụ: Giả sử biến y được đặt trong ơ nhớ cĩ địa chỉ là 1202 và cĩ các câu lệnh như sau: y = 30; z = y; x = &y; t = *y; Kết quả: biến t sẽ mang giá trị là 30. 6.2.1.4 Khái báo biến con trỏ Vì con trỏ cĩ khả năng tham chiếu trực tiếp đến giá trị mà chúng trỏ tới nên cần thiết phải chỉ rõ kiểu dữ liệu nào mà một biến con trỏ trỏ tới khi khai báo. Cú pháp khai báo: Kiểu_dữ_liệu *Tên_con_trỏ; Chú ý: kiểu dữ liệu ở đây là kiểu dữ liệu được trỏ tới, khơng phải là kiểu của bản thân con trỏ. Ví dụ: int *x; //Khai báo con trỏ x kiểu int float *k; //Khai báo con trỏ k kiểu float Phép gán con trỏ: Hai con trỏ cùng kiểu cĩ thể gán cho nhau. Xem ví dụ sau: int a, *p, *a ; float *f; a = 5 ; p = &a ; q = p ; /* đúng */ f = p ; /* sai do khác kiểu */ Ta cũng cĩ thể ép kiểu con trỏ theo cú pháp: ( *) Chẳng hạn, ví dụ trên được viết lại: int a, *p, *a ; float *f; KHOA CƠNG NGHỆ THƠNG TIN Trang 120
  122. Bài 6: Con trỏ a = 5 ; p = &a ; q = p ; /* đúng */ f = (float*)p; /* Đúng nhờ ép kiểu*/ Cộng, trừ con trỏ với một số nguyên Ta cĩ thể cộng (+), trừ (-) 1 con trỏ với 1 số nguyên N nào đĩ; kết quả trả về là 1 con trỏ. Con trỏ này chỉ đến vùng nhớ cách vùng nhớ của con trỏ hiện tại N phần tử. Xét ví dụ: Cho đoạn chương trình sau: int *x; x = (int*) malloc(20); /* Cấp phát vùng nhớ 20 byte=10 số nguyên*/ int *y, *z; y = x + 7; z = y - 3; Con trỏ NULL: là con trỏ khơng chứa địa chỉ nào cả. Ta cĩ thể gán giá trị NULL cho 1 con trỏ cĩ kiểu bất kỳ.  Lưu ý: - Ta khơng thể cộng 2 con trỏ với nhau. - Phép trừ 2 con trỏ cùng kiểu sẽ trả về 1 giá trị nguyên (int). Đây chính là khoảng cách (số phần tử) giữa 2 con trỏ đĩ. Chẳng hạn, trong ví dụ trên z-x=4. Ví dụ 1: Khai báo, sử dụng tốn tử tham chiếu, tốn tử lấy địa chỉ: Hình 103: Màn hình giải ví dụ 1 mục 6.2.1.4  Kết quả in ra màn hình KHOA CƠNG NGHỆ THƠNG TIN Trang 121