Tải bản đầy đủ (.pdf) (161 trang)

Giáo trình Kỹ thuật lập trình

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (6 MB, 161 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=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:



</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

KHOA CƠNG NGHỆ THÔNG TIN Trang 1


<b>1.2.1.2 </b> <b>Các thành phần cơ bản của ngôn ngữ C/C++ ... 7</b>


<b>1.2.2 </b> <b>Các kiểu dữ liệu cơ sở ... 7 </b>


<b>1.2.2.1 </b> <b>Các kiểu dữ liệu cơ bản ... 7</b>


<b>1.2.2.2 </b> <b>Khái niệm về biến và hằng ... 8 </b>


<b>1.2.2.3 </b> <b>Từ khóa ... 9 </b>


<b>1.2.2.4 </b> <b>Ghi chú ... 9 </b>


<b>1.2.3 </b> <b>Biểu thức – Toán tử - Câu lệnh ... 10 </b>


<b>1.2.3.1 </b> <b>Biểu thức – Toán tử ... 10</b>



<b>1.2.3.2 </b> <b>Lệnh và khối lệnh ... 14</b>


<b>1.2.3.3 </b> <b>Chuyển đổi kiểu giá trị ... 16</b>


<b>1.2.3.4 </b> <b>Các hàm có sẵn trong C/C++ ... 16</b>


<b>1.2.3.5 </b> <b>Phạm vi của biến ... 17</b>


<b>1.2.4 </b> <b>Thuật toán lưu đồ ... 17</b>


<b>1.2.4.1 </b> <b>Khái niệm ... 17 </b>


<b>1.2.4.2 </b> <b>Các ký hiệu trên lưu đồ ... 17 </b>


<b>1.2.5.3 </b> <b>Các ví dụ biểu diễn lưu đồ thuật toán ... 17 </b>


<b>1.2.5.4 </b> <b>Khởi động và thoát Dev-C++ ... 19 </b>


<b>1.3 </b> <b>Bài tập ... 21 </b>


<b>BÀI 2 : </b> <b>CÁC HÀM NHẬP XUẤT ... 23 </b>


<b>2.1 </b> <b>Mục tiêu ... 23</b>


<b>2.2 </b> <b>Nội dung ... 23</b>


<b>2.2.1 </b> <b>Hàm printf & scanf ... 23 </b>


<b>2.2.1.1 </b> <b>Hàm printf... 23 </b>



<b>2.2.1.2 </b> <b>Hàm scanf ... 26 </b>


<b>2.2.2 </b> <b>Hàm getche & getch ... 27 </b>


<b>2.2.2.1 </b> <b>Hàm getche ... 27 </b>


<b>2.2.2.2 </b> <b>Hàm getch ... 27 </b>


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

KHOA CÔNG NGHỆ THÔNG TIN Trang 2


<b>2.2.3.2 </b> <b>Hàm cin ... 28 </b>


<b>2.3 </b> <b>Bài tập ... 28</b>


<b>BÀI 3 : </b> <b>CẤU TRÚC ĐIỀU KHIỂN ... 30</b>


<b>3.1 </b> <b>Mục tiêu ... 30</b>


<b>3.2 </b> <b>Nội dung ... 30</b>


<b>3.2.1 </b> <b>Câu lệnh điều khiển ... 30</b>


<b>3.2.1.1 </b> <b>Dạng 1 (if thiếu) ... 30</b>


<b>3.2.1.2 </b> <b>Dạng 2 (if … else)... 34</b>


<b>3.2.1.3 </b> <b>Cấu trúc else if ... 39</b>


<b>3.2.1.4 </b> <b>Lệnh switch…case ... 45 </b>



<b>3.2.2 </b> <b>Vòng lặp ... 52 </b>


<b>3.2.2.1 </b> <b>Vòng lặp for ... 52 </b>


<b>3.2.2.2 </b> <b>Lệnh while ... 60 </b>


<b>3.2.2.3 </b> <b>Lệnh do…while ... 64</b>


<b>3.2.2.4 </b> <b>Vòng lặp lồng nhau ... 67</b>


<b>3.2.2.5 </b> <b>Lệnh break ... 69</b>


<b>3.2.2.6 </b> <b>Lệnh continue và goto ... 70</b>


<b>3.2.2.7 </b> <b>Lệnh exit ... 72</b>


<b>3.3 </b> <b>Bài tập ... 73</b>


<b>3.3.1 </b> <b>Sử dụng lệnh if ... 73 </b>


<b>3.3.2 </b> <b>Sử dụng lệnh switch ... 74 </b>


<b>3.3.3 </b> <b>Bài tập làm thêm ... 75 </b>


<b>3.3.4 </b> <b>Bài tập vòng lặp ... 75 </b>


<b>BÀI 4 : </b> <b>HÀM ... 79 </b>


<b>4.1 </b> <b>Mục tiêu ... 79</b>



<b>4.2 </b> <b>Nội dung ... 79</b>


<b>4.2.1 </b> <b>Tổng quan về hàm ... 79</b>


<b>4.2.1.1 </b> <b>Khái niệm ... 79</b>


<b>4.2.1.2 </b> <b>Cấu trúc của hàm ... 79</b>


<b>4.2.1.3 </b> <b>Các ví dụ về sử dụng hàm ... 80</b>


<b>4.2.2 </b> <b>Tham số dạng tham biến và tham trị ... 83 </b>


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

KHOA CÔNG NGHỆ THÔNG TIN Trang 3


<b>4.3 </b> <b>Bài tập ... 94 </b>


<b>4.3.1 </b> <b>Bài tập hàm ... 94 </b>


<b>4.3.2 </b> <b>Bài tập đệ quy ... 95 </b>


<b>BÀI 5 : </b> <b>MẢNG VÀ CHUỖI ... 96</b>


<b>5.1 </b> <b>Mục tiêu ... 96 </b>


<b>5.2 </b> <b>Nội dung ... 96</b>


<b>5.2.1 </b> <b>Mảng ... 96</b>


<b>5.2.1.1 </b> <b>Cách khai báo mảng ... 96</b>



<b>5.2.1.2 </b> <b>Tham chiếu đến từng phần tử mảng ... 97</b>


<b>5.2.1.3 </b> <b>Nhập/Xuất dữ liệu cho mảng một chiều ... 97</b>


<b>5.2.1.4 </b> <b>Mảng nhiều chiều ... 100</b>


<b>5.2.1.5 </b> <b>Nhập/Xuất dữ liệu cho mảng 2 chiều ... 102 </b>


<b>5.2.2 </b> <b>Chuỗi ... 109 </b>


<b>5.2.2.1 </b> <b>Cách khai báo chuỗi ... 109 </b>


<b>5.2.2.2 </b> <b>Hàm nhập (gets), xuất (puts) chuỗi... 110 </b>


<b>5.2.2.3 </b> <b>Các hàm chuỗi thường sử dụng ... 113 </b>


<b>5.3 </b> <b>Bài tập ... 114</b>


<b>BÀI 6 : </b> <b>CON TRỎ ... 119</b>


<b>6.1 </b> <b>Mục tiêu ... 119</b>


<b>6.2 </b> <b>Nội dung ... 119</b>


<b>6.2.1 </b> <b>Khái quát về con trỏ? ... 119 </b>


<b>6.2.1.1 </b> <b>Khái niệm ... 119</b>


<b>6.2.1.2 </b> <b>Lý do để dùng con trỏ ... 119 </b>



</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

KHOA CÔNG NGHỆ THÔNG TIN Trang 4


<b>6.2.1.5 </b> <b>Cấp phát và giải phóng vùng nhớ ... 123 </b>


<b>6.2.2 </b> <b>Ứng dụng của con trỏ ... 125</b>


<b>6.2.2.1 </b> <b>Hàm có tham số của con trỏ ... 125</b>


<b>6.2.2.2 </b> <b>Con trỏ và mảng ... 127</b>


<b>6.2.2.3 </b> <b>Con trỏ và chuỗi ... 130</b>


<b>6.2.2.4 </b> <b>Con trỏ trỏ đến con trỏ ... 133</b>


<b>6.3 </b> <b>Bài tập ... 135</b>


<b>BÀI 7 : </b> <b>KIỂU DỮ LIỆU NGƯỜI DÙNG TỰ ĐỊNH NGHĨA ... 136 </b>


<b>7.1 </b> <b>Mục tiêu ... 136</b>


<b>7.2 </b> <b>Nội dung ... 136 </b>


<b>7.2.1 </b> <b>Kiểu cấu trúc (Struct) ... 136 </b>


<b>7.2.1.1 </b> <b>Khái niệm ... 136 </b>


<b>7.2.1.2 </b> <b>Khai báo kiểu struct ... 136 </b>


<b>7.2.1.3 </b> <b>Tham khảo các thành phần trong struct ... 137</b>



<b>7.2.1.4 </b> <b>Khởi tạo struct ... 140</b>


<b>7.2.1.5 </b> <b>Struct lồng nhau ... 141</b>


<b>7.2.1.6 </b> <b>Sử dụng mảng các struct... 144</b>


<b>7.2.2 </b> <b>Enum ... 150 </b>


<b>7.2.2.1 </b> <b>Khái niệm ... 150</b>


<b>7.2.2.2 </b> <b>Cách khai báo khởi tạo biến có kiểu enum ... 151 </b>


<b>7.2.2.3 </b> <b>Các ví dụ ... 151 </b>


<b>7.3 </b> <b>Bài tập ... 154 </b>


<b>TÀI LIỆU THAM KHẢO ... 155</b>


<b>PHỤ LỤC ... 156</b>


<b>Chú thích hình ảnh ... 156</b>


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

KHOA CÔNG NGHỆ THÔNG TIN Trang 5
- 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 toán
<b>1.2 Nội dung </b>


<b>1.2.1 Khái qt về ngơn ngữ lập trình C/C++ </b>


<b>1.2.1.1 </b> <b>Giới thiệu </b>


- 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à toá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.


<i><b>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++ </b></i>
<i><b>cịn có một số đặc điểm khác như: </b></i>


<i>C++ là ngôn ngữ hướng đối tượng. </i>
<i>C++ là ngôn ngữ định kiểu rất mạnh. </i>



</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

KHOA CÔNG NGHỆ THÔNG TIN Trang 6


<i>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 </i>


dụng vào thư viện và có thể tái sử dụng sau này.


<i>C++ cung cấp một cơ chế đa dạng hóa tên hàm và toán tử. </i>


<i>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 </i>


hàm trong một chủ thể được bảo vệ một cách chặt chẽ.
<b>Cấu trúc của một chương trình C++ </b>


<b>Trong đó: </b>


- Khối khai báo các thư viện hàm: cú pháp để khai báo thư viện:
<b>#include<tên_thư_viên.h> </b>


<b> Ví dụ: </b> #include<iostream.h>
#include<conio.h>


- 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 toàn cục hoặc các khai báo nguyên mẫu hàm với cú
pháp sau: <kiểu hàm> <tên hàm> ([biến tham số]);


<b>Ví dụ: int songuyento(int x); </b>


- 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:


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


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

KHOA CÔNG NGHỆ THÔNG TIN Trang 7


 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 toá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 toán học: +, -, *, /, =, <, >, (, )


 Các ký hiệu đặc biệt: :. , ; " ' _ @ # $ ! ^ [ ] { } ...


 Dấu cách hay khoảng trống.
<b>Các kiểu dữ liệu cơ bản </b>


 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ố ngun và số thực (số dấu phẩy động).


<b>1.2.2 Các kiểu dữ liệu cơ sở </b>


<b>1.2.2.1 </b> <b>Các kiểu dữ liệu cơ bản </b>


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

KHOA CÔNG NGHỆ THÔNG TIN Trang 8
TT


Kiểu dữ liệu
(Type)


Kích thước
(Length)



Miền giá trị
(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


<b>1.2.2.2 </b> <b>Khái niệm về biến và hằng </b>


Khái niệm tên biến rất quan trọng trong q 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ự.


<i><b>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ự </b></i>


<i><b>đầ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ừ </b></i>
khóa.


<b>Ví dụ 1: </b>


 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)


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

KHOA CƠNG NGHỆ THƠNG TIN Trang 9
<b>+ 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 </b>
của hằng đặt theo quy tắc của tên.


<b>Định nghĩa hằng </b>
<b>Cú pháp: </b>


<b>const <kiểu_dữ_liệu> <tên_hằng> = <giá_trị>; </b>
hoặc


<b>const <tên_hằng> = <giá_trị>; </b>
<b>Chú ý: </b>



- 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.


<b>- Các hằng kí tự được viết trong cặp dấu nháy đơn ‘’. </b>


<b>- 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 “”. </b>


<b>1.2.2.3 </b> <b>Từ khóa </b>


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++<sub> có các từ khóa sau: </sub>


<b>Bảng 2: Các từ khóa trong C/C++</b>


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
<i><b> Các từ khóa khi lập trình phải viết bằng chữ thường </b></i>


<b>1.2.2.4 </b> <b>Ghi chú </b>


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

KHOA CƠNG NGHỆ THƠNG TIN Trang 10
<b>Ví dụ 3: </b>



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++<sub> gặp cặp dấu ghi chú sẽ không dịch ra ngôn ngữ máy. </sub>
<b>Kết luận: </b>


- Đố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.
<b>1.2.3 Biểu thức – Toán tử - Câu lệnh </b>


<b>1.2.3.1 </b> <b>Biểu thức – Toán tử </b>
<b>a. Biểu thức </b>


 Biểu thức là một sự kết hợp giữa các toán tử (operator) và các toá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 toán tử nào được thực hiện trước.


<b>Ví dụ: Biểu thức tính chu vi hình chữ nhật: </b>
(d+r)/2


Trong đó: d, r là biến của biểu thức.
<b>b. Toán tử </b>


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

KHOA CÔNG NGHỆ THÔNG TIN Trang 11
- 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ị
<b>Phép tăng và giảm (++ & --) </b>


Toán tử ++ dùng để tăng thêm 1 vào toá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


<i>sau) toán hạng. Ví dụ: x = x + 1 có thể viết x++ (hay ++x) đều giống nhau. </i>


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 toá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 toán tử đi sau toán
hạng, C lấy giá trị tốn hạng trước khi tăng hay giảm nó.


- Toán tử tiền tố:
x = 20


y = ++x //y = 21
- Toán tử hậu tố:


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

KHOA CÔNG NGHỆ THÔNG TIN Trang 12
x = x++ //y = 20


<b>Thứ tự ưu tiên của các toán tử số học như sau: </b>
Toán tử: ++ → -- → * → / → % → + → -


<b>Các toán tử quan hệ và các toán tử Logic </b>


Các toán tử quan hệ dùng để so sánh các giá trị giữa các biến.
<b>Bảng 4: Các phép toán tử quan hệ </b>


<b>Toán tử quan hệ </b> <b>Giải thích ý nghĩa </b>


> 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


Toán tử Logic là toá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 toán tử quan hệ và
Logic trả về 0 nếu sai và trả về 1 nếu đúng.


<b>Bảng 5: Các toán tử logic </b>


<b>Toán tử Logic </b> <b>Giải thích ý nghĩa </b>


&& AND


|| OR


! NOT (Phủ định)


<i><b>Bảng 6: Bảng chân trị cho các toán tử Logic </b></i>


<b>p </b> <b>q </b> <b>p&&q </b> <b>p||q </b> <b>!p </b>


0 0 0 0 1


0 1 0 1 1



1 0 0 1 0


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

KHOA CÔNG NGHỆ THÔNG TIN Trang 13
> >= < <=


== !=
&&


Thấp nhất: ||
<b>Các toán tử Bit: </b>


Các tốn tử Bit ý nghĩa nói đến dùng để kiểm tra, gán hay sự thay đổi các Bit
thật sự trong 1 Byte của Word, mà trong C chuẩn là các kiểu dữ liệu và biến char,
int. Ta không thể sử dụng các toán tử Bit với dữ liệu thuộc các kiểu float, double,
long double, void hay các kiểu phức tạp khác.


<b>Bảng 7: Bảng toán tử bit </b>


<b>Các tốn tử </b> <b>Giải thích ý nghĩa </b>


& AND


|| OR


^ XOR


~ NOT


> Dịch phải



<< Dịch trái


<b>Bảng 8: Bảng chân trị của toán tử ^ (XOR) </b>


<b>p </b> <b>q </b> <b>p^q </b>


0 0 0


0 1 1


</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

KHOA CÔNG NGHỆ THÔNG TIN Trang 14


1 1 0


<b>Toán tử ? cùng với: </b>


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 toán tử ? như sau:


E1 ? E2 : E3


Trong đó E1, E2, E3 là các biểu thức.


<b>Ý nghĩa: Trước tiên E1 được kiểm tra điều kiện, nếu đúng E2 trở thành giá trị </b>
của biểu thức; nếu E1 sai, E3 được trở thành giá trị của biểu thức.


<i><b>Ví dụ: </b></i>
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;
<b>1.2.3.2 </b> <b>Lệnh và khối lệnh </b>


 <b>Lệnh </b>


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…
<b>Ví dụ 4: </b>


x = x + 2;


printf("Day la mot lenh\n");


 <b>Khối lệnh </b>


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 {
}


<b>Ví dụ 5: </b>


{ // đầu khối
a = 15;



</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

KHOA CÔNG NGHỆ THÔNG TIN Trang 15
biến cách nhau dấu phẩy (,), cuối cùng phải là dấu chấm phẩy (;).
<b>Ví dụ 6: </b>


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.


<b>Ý 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 </b>
<b>đầu tên biến thang để trong quá trình lập trình hoặc sau này xem lại, sửa </b>
<b>chữa chương trình dễ dàng nhận ra biến ithang có kiểu int mà khơng cần </b>
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.


 <b>Vừa khai báo vừa khởi gán </b>


Chúng ta có thể kết hợp việc khai báo với toá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.


<b>Ví dụ 7: </b>


<i><b> Khai báo trước, gán giá trị sau: </b></i>
int main(int argc, char *argv[])
{


int a, b, c;


a = 10;



b = 20;


c = 50;




}


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

KHOA CÔNG NGHỆ THÔNG TIN Trang 16
{


int a = 10, b = 20, c = 50;




}


<b>1.2.3.3 </b> <b>Chuyển đổi kiểu giá trị </b>


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;


<b>1.2.3.4 </b> <b>Các hàm có sẵn trong C/C++ </b>


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
<i>bằng lệnh #include <tên thư viện.h> </i>


<b>Bảng 9: Ý nghĩa của một số hàm có sẵn thường dùng </b>


<b>STT </b> <b>Thư viện </b> <b>Hàm có sẵn </b> <b>Ứng dụng </b>


<b>1 </b> <b>stdio.h </b>


<b>printf(), scanf(), getc(), putc(), </b>
<b>gets(), puts(), fflush(), fopen(), </b>
<b>fclose(), </b> <b>fread(), </b> <b>fwrite(), </b>
<b>getchar(), </b> <b>putchar(), </b> <b>getw(), </b>
<b>putw()… </b>


Thư viện chứa các
hàm vào/ ra chuẩn
<b>(standard input/outp</b>
<b>ut) </b>


<b>2 </b> <b>conio.h </b>


<b>clrscr(), </b> <b>getch(), </b> <b>getche(), </b>
<b>getpass(), cgets(), cputs(), putch(), </b>
<b>clreol(),… </b>



Thư viện chứa các
hàm vào ra trong
chế độ DOS (DOS
<b>console) </b>


<b>3 </b> <b>math.h </b>


<b>abs(), sqrt(), log(). log10(), sin(), </b>
<b>cos(), tan(), acos(), asin(), atan(), </b>
<b>pow(), exp(),… </b>


Thư viện chứa các
<b>hàm tính tốn </b>


<b>4 </b> <b>alloc.h </b>


<b>calloc(), realloc(), malloc(), free(), </b>
<b>farmalloc(), farcalloc(), farfree(), </b>
<b>… </b>


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

KHOA CÔNG NGHỆ THÔNG TIN Trang 17


<b>1.2.3.5 </b> <b>Phạm vi của biến </b>


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 ngoà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.


<b>1.2.4 Thuật toán lưu đồ </b>


<b>1.2.4.1 </b> <b>Khái niệm </b>


Thuật toá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ả q trình tính tốn một cách có hệ thống.
Người ta thường thể hiện thuật toán bằng lưu đồ.


<b>1.2.4.2 </b> <b>Các ký hiệu trên lưu đồ </b>


<b>Bảng 10: Bảng ký hiệu lưu đồ </b>


<b>Tên khối </b> <b>Ký hiệu </b> <b>Ý nghĩa </b>


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


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

KHOA CÔNG NGHỆ THÔNG TIN Trang 18
<b>Ví dụ 8: Tính A=x</b>2<sub>+y</sub>2


<b>Ví dụ 9 : Giải phương trình bậc 1 Ax+B=0 </b>


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

KHOA CƠNG NGHỆ THƠNG TIN Trang 19
<b>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>


<b>1.2.5.4 </b> <b>Khởi động và thoát Dev-C++ </b>


<b>a. Khởi động ứng dụng </b>


Khởi động bằng biểu tượng ngòai Desktop. Sau khi khởi động có giao
diện như sau:


Bắt đầu


Kết thúc
Sai


Điểm


Đúng


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

KHOA CÔNG NGHỆ THƠNG TIN Trang 20


<b>Hình 1: Khởi động ứng dụng Dev-C++ </b>


Khởi tạo một project mới vào File → New → Project…


<b>Hình 2: Màn hình đặt tên project </b>
- Chọn ứng dụng là Console Application


- Name: Đặt tên project


</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

KHOA CÔNG NGHỆ THÔNG TIN Trang 21
<i><b>Hình 3: Màn hình sau khi khởi động thành công </b></i>


<b>b. Chạy và biên dịch sửa lỗi chương trình </b>
- 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
<b>c. Thốt khỏi ứng dụng </b>


<b>- Ấn phím F10 (kích hoạt Menu), chọn menu File, chọn Exit; </b>
<b>- Hoặc ấn tổ hợp phím Alt – F4. </b>


<b>- Đóng project vào File – Close hoặc Ctrl – F4 </b>
<b>1.3 Bài tập </b>


1. Vẽ lưu đồ thuật toán so sánh 2 số a, b.
2. Vẽ lưu đồ thuật toán giải phương trình bậc 2.


</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>

KHOA CƠNG NGHỆ THÔNG TIN Trang 22


5. Vẽ lưu đồ (flowcharts) cho thuật toá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 toá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.


</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

KHOA CÔNG NGHỆ THÔNG TIN Trang 23
<b>2.2 Nội dung </b>


<b>2.2.1 Hàm printf & scanf </b>


<b>2.2.1.1 </b> <b>Hàm printf </b>


Hàm printf dùng để xuất, hiển thị dữ liệu đã được định dạng sẵn.
<b> Cú pháp: </b>


<b>printf ("chuỗi định dạng"[, tham số 1, tham số 2,…]); </b>
<i><b> Khi sử dụng hàm phải khai báo tiền xử lý #include <stdio.h> </b></i>


<i><b>- Hàm printf: tên hàm, phải viết bằng chữ thường, không được viết hoa. </b></i>


- 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>Bảng 11: Bảng mã định dạng nhập/xuất </b>


<b>Mã định dạng </b> <b>Diễn giải ý nghĩa </b>


%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


</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

KHOA CƠNG NGHỆ THƠNG TIN Trang 24
%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>Bảng 12: Bảng điều mã điều khiển nhập/xuất </b>


<b>Mã điều khiển </b> <b>Diễn giải ý nghĩa </b>


\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 %


<b>Ví dụ 1: printf("Bai hoc dau tien. \n"); </b>
<i><b> Kết quả in ra màn hình </b></i>


Bai hoc dau tien.
_


<b>Ví dụ 2: printf("Ma dinh dang \\\" in ra dau \" . \n"); </b>
<i><b> Kết quả in ra màn hình </b></i>


Ma dinh dang \" in ra dau ".


_


<b>Ví dụ 3: Giả sử biến i có giá trị = 100 </b>


printf("So ban vua nhap la: %d . \n", i);
<i><b> Kết quả in ra màn hình </b></i>


So ban vua nhap la: 100.


<b>Ví dụ 4: Giả sử biến a có giá trị = 27 và b có giá trị = 14 </b>
printf("Tong cua 2 so %d va %d la %d . ", a, b, a+b);


</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>

KHOA CÔNG NGHỆ THÔNG TIN Trang 25
printf("Tong cua 2 so %-5d va %-3d la %-1d .", a, b, a+b);


<i><b> Kết quả in ra màn hình </b></i>


Tong cua 2 so 27 va 14 la 41.


<b>Ghi chú : dấu trừ trước %-5d cách 5 ký tự bên trái. </b>
<b>Ví dụ 7: Sửa lại ví dụ 4 </b>


printf("Tong cua 2 so %03d va %03d la %04d .", a, b, a+b);
<i><b> Kết quả in ra màn hình </b></i>


Tong cua 2 so 027 va 014 la 0041.
<b>Ví dụ 8: Giả sử int a = 16, b = 51234, c = 2 </b>


printf("%7d%7d%7d.\n", a, b, c);
printf("%7d%7d%7d.", 165, 2, 965);


<i><b> Kết quả in ra màn hình </b></i>


16 51234 2
165 2 965


Hiển thị giá trị về bên phải 7 ký tự


printf("%-7d%-7d%-7d\n", a, b, c);
printf("%-7d%-7d%-7d\n", 165, 2, 965);
<i><b> Kết quả in ra màn hình </b></i>


16 51234 2
165 2 965


Hiển thị giá trị về bên trái 7 ký tự


<b>Ví dụ 9: Giả sử float a = 6.4, b = 1234.56, c = 62.3 </b>
printf("%7.2d%7.2d%7.2d", a, b, c);
<i><b> Kết quả in ra màn hình </b></i>


</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>

KHOA CƠNG NGHỆ THƠNG TIN Trang 26
<b>Ví dụ 10: giả sử float a = 6.4, b = 1234.55, c = 62.34 </b>


printf("%10.1d%10.1d%10.1d.\n", a, b, c);
printf("%10.1d%10.1d%10.1d.\n", 165, 2, 965);
<i><b> Kết quả in ra màn hình </b></i>


6.4 1234.6 62.3
165.0 2.0 965.0



Hiển thị giá trị về bên phải 7 ký tự và lấy 1
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);
<i><b> Kết quả in ra màn hình </b></i>


6.40 1234.55 62.34
165.00 2.00 965.00


Hiển thị giá trị về bên trái 7 ký tự và lấy 2 số
lẻ thập phân.


<b>2.2.1.2 </b> <b>Hàm scanf </b>


Hàm scanf dùng để định dạng dữ liệu khi nhập liệu từ bàn phím.
<b> Cú pháp </b>


<b>scanf ("chuỗi định dạng",[tham số 1, tham số 2,…]); </b>
<i><b> Khi sử dụng hàm phải khai báo tiền xử lý #include <stdio.h> </b></i>


<i><b>- Hàm scanf: tên hàm, phải viết bằng chữ thường, không được viết hoa. </b></i>


- 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.
<b>Ví dụ 11: scanf("%d", &i); </b>


 Nhập vào 12abc, biến i chỉ nhận giá trị 12. Nhập 3.4 chỉ nhận giá trị 3.


<b>Ví dụ 12: scanf("%d%d", &a, &b); </b>


<b> Nhập vào 2 số a, b phải cách nhau bằng khoảng trắng hoặc enter. </b>
<b>Ví dụ 13: scanf("%d/%d/%d", &thang, &ngay, &nam); </b>


 Nhập vào tháng, ngày, năm theo dạng thang/ngay/nam (09/25/2016)
<b>Ví dụ 14: scanf("%d%*c%d%*c%d", &thang, &ngay, &nam); </b>
 Nhập vào tháng, ngày, năm với dấu phân cách /, -,…; ngoại trừ số.


</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>

KHOA CÔNG NGHỆ THÔNG TIN Trang 27
<i>Hàm getch nhận một ký tự nhưng không cho hiện lên màn hình. Khi đó, nó đã </i>
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.


<i>Do đó, hàm getch thường được sử dụng trong các chương trình đơn giản với </i>
chức năng dừng chương trình


<b>2.2.3 Nhập xuất cout & cin </b>


<b>2.2.3.1 </b> <b>Hàm cout </b>


Định dạng khi xuất dữ liệu ra màn hình với thư viện iostream.
<b> Cú pháp: </b>


<b>cout<<”chuỗi cần xuất”; hoặc cout<<[tham số 1, tham số 2,…] ; </b>
<i><b> Khi sử dụng hàm phải khai báo tiền xử lý #include <iostream> </b></i>


- <i><b>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ữ </b></i>
<i><b>hoa. </b></i>



- 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.


<b>Ví dụ 16: cout<<”Bai hoc dau tien, xuat chuoi bang cout”; </b>
<b> Kết quả in ra màn hình </b>


Bai hoc dau tien, xuat chuoi bang cout


<b>Ví dụ 17: cout<<”Gia tri 1 \n”<<”Gia tri 2\n”<<”Gia tri 3”; </b>
<b> Kết quả in ra màn hình </b>


</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>

KHOA CÔNG NGHỆ THÔNG TIN Trang 28


<b>2.2.3.2 </b> <b>Hàm cin </b>


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.


<b> Cú pháp </b>


cin>>biến 1>>biến 2>>…>>biến n;
<b>Ví dụ 18: Nhập vào 2 số nguyên a và b. </b>


Hoặc
int a,b;
cin>>a;
cin>>b;



<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 </b>
nhập.


float x, y;


cout<<”Nhap x=”;
cin>>x;


cout<<”Nhap y=”;
cin>>y;


cout<< ”Ket qua x+y=”<<x+y;


<b> Kết quả thực hiện đoạn chương trình trên : </b>
Nhap x=9


Nhap y=6
Ket qua x+y=15
<b>2.3 Bài tập </b>


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.
int a,b;


</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>

KHOA CÔNG NGHỆ THÔNG TIN Trang 29


"gio:phut:giay", mỗi thành phần là một số nguyên có 2 chữ số.


Ví dụ: 02:11:05


<b>9. Viết chương trình nhập vào độ C (Celsius) và chuyển sang độ F (Fahrenheit). Biết rằng </b>
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: <họ tên>”
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.


</div>
<span class='text_page_counter'>(31)</span><div class='page_container' data-page=31>

KHOA CÔNG NGHỆ THÔNG TIN Trang 30
<b>Bài 3 : CẤU TRÚC ĐIỀU KHIỂN </b>


<b>(Cấu trúc chọn) </b>
<b>3.1 Mục tiêu </b>


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 toá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 toá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 toán sử dụng lệnh for, while hoặc do…while.


 Cấu trúc vòng lặp lồng nhau.
<b>3.2 Nội dung </b>


<b>3.2.1 Câu lệnh điều khiển </b>


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.


<b>3.2.1.1 </b> <b>Dạng 1 (if thiếu) </b>


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.



<b>Cú pháp lệnh: </b>


<i><b> Ý nghĩa </b></i>


 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


<b>if (điều kiện) </b> <b>  từ khóa if phải viết bằng chữ thường </b>


</div>
<span class='text_page_counter'>(32)</span><div class='page_container' data-page=32>

KHOA CÔNG NGHỆ THÔNG TIN Trang 31
<b> Nếu khối lệnh bao gồm từ 2 lệnh trở lên thì phải đặt trong dấu { } </b>


<b> Lưu ý: </b>


- 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.


<b>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. </b>
<i><b>a. Ý tưởng lời giải </b></i>


<i><b>- Trước tiên ta gán a là giá trị lớn. </b></i>


<i><b>- Sau đó so sánh b với a, nếu b lớn hơn a ta gán b cho max </b></i>
<i><b>- Cuối cùng ta được kết quả max là giá trị lớn nhất. </b></i>



</div>
<span class='text_page_counter'>(33)</span><div class='page_container' data-page=33>

KHOA CÔNG NGHỆ THÔNG TIN Trang 32
<i><b>c. Viết chương trình </b></i>


</div>
<span class='text_page_counter'>(34)</span><div class='page_container' data-page=34>

KHOA CÔNG NGHỆ THÔNG TIN Trang 33
<b>Hình 5: Kết quả chương trình chạy ví dụ 1 mục 3.2.1.1 </b>


<b>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á </b>
trị a và b, ngược lại khơng hốn đổi. In ra giá trị a, b.


<i><b>a. Ý tưởng lời giải </b></i>


- Nếu giá trị a lớn hơn giá trị b, bạn phải hoá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.
<i><b>- 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></i>
b ra cho người dùng xem.


<i><b>b. Mô tả bằng lưu đồ thuật giải </b></i>


<i><b>d. Viết chương trình </b></i>


a > b
Đúng
Bắt đầu
Nhập a, b


Sai


</div>
<span class='text_page_counter'>(35)</span><div class='page_container' data-page=35>

KHOA CÔNG NGHỆ THÔNG TIN Trang 34
<b>Hình 6: Màn hình giải ví dụ 2 mục 3.2.1.1 </b>



<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 7: Kết quả chương trình chạy ví dụ 2 mục 3.2.1.1 </b>
<b>3.2.1.2 </b> <b>Dạng 2 (if … else) </b>


Câu lệnh if dạng 2 được thực hiện 1 trong 2 khối lệnh.


 <b>Cú pháp lệnh </b>


 <b>Ý nghĩa </b>


 Từ khóa if, else phải viết bằng chữ thường
<b>if (Điều kiện) </b>


<b>Khối lệnh 1; </b>
<b>else </b>


</div>
<span class='text_page_counter'>(36)</span><div class='page_container' data-page=36>

KHOA CÔNG NGHỆ THÔNG TIN Trang 35


 <b>Lưu ý </b>


<b>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 { </b>
}


<b>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>
= b, ngược lại in ra thông báo "a khác b".


<i><b>a. Ý tưởng lời giải </b></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".


</div>
<span class='text_page_counter'>(37)</span><div class='page_container' data-page=37>

KHOA CÔNG NGHỆ THÔNG TIN Trang 36
<i><b>d. Viết chương trình </b></i>


</div>
<span class='text_page_counter'>(38)</span><div class='page_container' data-page=38>

KHOA CƠNG NGHỆ THƠNG TIN Trang 37
<b>Hình 9: Kết quả chương trình chạy ví dụ 3 mục 3.2.1.2 </b>


 <b>Lưu ý: </b>


- 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


<b>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ự </b>
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".


<i><b>a. Ý tưởng lời giải </b></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.


</div>
<span class='text_page_counter'>(39)</span><div class='page_container' data-page=39>

KHOA CÔNG NGHỆ THÔNG TIN Trang 38


<i><b>c. Viết chương trình </b></i>


</div>
<span class='text_page_counter'>(40)</span><div class='page_container' data-page=40>

KHOA CƠNG NGHỆ THƠNG TIN Trang 39
<b>Hình 11: Kết quả chương trình chạy ví dụ 4 mục 3.2.1.2 </b>


<b>3.2.1.3 </b> <b>Cấu trúc else if </b>


Sẽ kiểm tra điều kiện và thực hiện 1 trong n khối lệnh cho trước.


<b> Cú pháp </b>


 <b>Ý nghĩa </b>


- 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 { }


 <b>Lưu đồ </b>


<b>if (Điều kiện 1) </b>


<b>khối lệnh 1; </b>
<b>else if (Điều kiện 2) </b>


<b>khối lệnh 2; </b>
<b>… </b>



<b>else if (Điều kiện n-1) </b> <b> Nếu khối lệnh 1, 2…n bao gồm từ 2 lệnh </b>
<b>khối lệnh n-1; </b> <b> trở lên thì phải đặt trong dấu { } </b>


<b> else </b>


</div>
<span class='text_page_counter'>(41)</span><div class='page_container' data-page=41>

KHOA CƠNG NGHỆ THƠNG TIN Trang 40
<b>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 </b>
a>b, in ra thông báo "a nhỏ hơn b" nếu a<b, in ra thông báo "a bằng b" nếu a=b.


<i><b>a. Ý tưởng lời giải </b></i>


- Trước tiên so sánh a với 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 thì in ra thơng báo "a
nhỏ hơn b"


- Ngược với 2 trường hợp trên thì in ra thông báo "a bằng b".
<i><b>b. Mô tả bằng lưu đồ thuật giải </b></i>


<i><b>c. Viết chương trình </b></i>


a > b Sai
Bắt đầu


Nhập a, b


"a lon hon b"


a < b



Kết thúc
Đúng


"a nho hon b" "a bang b"
Sai


</div>
<span class='text_page_counter'>(42)</span><div class='page_container' data-page=42>

KHOA CƠNG NGHỆ THƠNG TIN Trang 41
<b>Hình 12: Màn hình giải ví dụ 5 mục 3.2.1.3 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 13: Kết quả chương trình chạy ví dụ 5 mục 3.2.1.3 </b>


<b>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 </b>
số vừa nhập.


<i><b>a. Ý tưởng lời giải </b></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
<b>nhất là c. </b>


</div>
<span class='text_page_counter'>(43)</span><div class='page_container' data-page=43></div>
<span class='text_page_counter'>(44)</span><div class='page_container' data-page=44>

KHOA CÔNG NGHỆ THÔNG TIN Trang 43
<b>Hình 14: Màn hình giải ví dụ 6 mục 3.2.1.3 </b>



<i><b> Kết quả in ra màn hình </b></i>


</div>
<span class='text_page_counter'>(45)</span><div class='page_container' data-page=45>

KHOA CÔNG NGHỆ THÔNG TIN Trang 44
<b>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 </b>
đ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.


<i><b>a. Ý tưởng lời giải </b></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ệ.
<i><b>b. Mô tả bằng lưu đồ thuật giải </b></i>


<i><b>d. Viết chương trình </b></i>
diem >= 0


và diem <= 10
Bắt đầu
Nhập diêm
Kết thúc
Yeu
diem >=9
Đúng
Sai


</div>
<span class='text_page_counter'>(46)</span><div class='page_container' data-page=46>

KHOA CÔNG NGHỆ THÔNG TIN Trang 45
<b>Hình 16: Màn hình giải ví dụ 7 mục 3.2.1.3 </b>



<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 17: Kết quả chương trình chạy ví dụ 7 mục 3.2.1.3 </b>
<b>3.2.1.4 </b> <b>Lệnh switch…case </b>


<b>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 </b>
điều kiện xảy ra.


<b> Cú pháp </b>


<b>switch (Biểu thức nguyên) </b>
<b> { </b>


</div>
<span class='text_page_counter'>(47)</span><div class='page_container' data-page=47>

KHOA CÔNG NGHỆ THÔNG TIN Trang 46
case n2: Khối lệnh 2;




case ni: Khối lệnh i;
[default: Khối lệnh; ]
<b> } </b>


 <b>Ý nghĩa </b>


<i>- ni là các số nguyên, hằng ký tự hoặc biểu thức hằng. Các ni</i> cần có giá trị khác


nhau.


<b>- Đoạn chương trình nằm trong cặp ngoặc nhọn {} là thân của switch. </b>


<b>- default, case là các từ khóa. default là thành phần không bắt buộc. </b>


 <b>Lưu đồ </b>


 <b>Cách hoạt động: </b>


</div>
<span class='text_page_counter'>(48)</span><div class='page_container' data-page=48>

KHOA CÔNG NGHỆ THÔNG TIN Trang 47
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.


<b>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. </b>
<i><b>a. Viết chương trình </b></i>


<b>Hình 18: Màn hình giải ví dụ 8 mục 3.2.1.4 </b>
<i><b> Kết quả in ra màn hình </b></i>


<i><b>Hình 19: Kết quả chương trình chạy ví dụ 8 mục 3.2.1.4 </b></i>


</div>
<span class='text_page_counter'>(49)</span><div class='page_container' data-page=49>

KHOA CÔNG NGHỆ THÔNG TIN Trang 48
<i><b>a. Ý tưởng lời giải </b></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.


<i><b>b. Viết chương trình </b></i>


<b>Hình 20: Màn hình giải ví dụ 9 mục 3.2.1.4 </b>
<i><b> Kết quả in ra màn hình </b></i>


<i><b>Hình 21: Kết quả chương trình chạy ví dụ 9 mục 3.2.1.4 </b></i>


<b>Ví dụ 10: Viết lại chương trình ở ví dụ trên. </b>


</div>
<span class='text_page_counter'>(50)</span><div class='page_container' data-page=50>

KHOA CƠNG NGHỆ THƠNG TIN Trang 49
<b>Hình 22: Màn hình giải ví dụ 10 mục 3.2.1.4 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 23: Kết quả chương trình chạy ví dụ 10 mục 3.2.1.4 </b>
<b>Ví dụ 11: Viết lại chương trình ở ví dụ trên. </b>


</div>
<span class='text_page_counter'>(51)</span><div class='page_container' data-page=51>

KHOA CƠNG NGHỆ THƠNG TIN Trang 50
<b>Hình 24: Màn hình giải ví dụ 11 mục 3.2.1.4 </b>


<i><b> Kết quả in ra màn hình </b></i>


<i><b>Hình 25: Kết quả chương trình chạy ví dụ 11 mục 3.2.1.4 </b></i>


<b>Ví dụ 12: Viết chương trình sử dụng cấu trúc switch...case, nhập 2 số ngun a,b từ bàn </b>
<b>phím, chương trình đưa ra lựa chọn: </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 nhập ‘/‘: Thực hiện: a / b;


</div>
<span class='text_page_counter'>(52)</span><div class='page_container' data-page=52>

KHOA CÔNG NGHỆ THÔNG TIN Trang 51
<b>Hình 26: Màn hình giải ví dụ 12 mục 3.2.1.4 </b>


</div>
<span class='text_page_counter'>(53)</span><div class='page_container' data-page=53>

KHOA CÔNG NGHỆ THÔNG TIN Trang 52
<b>for (khởi tạo; điều kiện ; biểu thức) </b>



{


<b>Các câu lệnh; </b>
}


<i><b>Hình 27: Kết quả chương trình chạy ví dụ 12 mục 3.2.1.4 </b></i>
<b>3.2.2 Vòng lặp </b>


<b>3.2.2.1 </b> <b>Vòng lặp for </b>


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.


<i><b> Cú pháp lệnh </b></i>


</div>
<span class='text_page_counter'>(54)</span><div class='page_container' data-page=54>

KHOA CÔNG NGHỆ THÔNG TIN Trang 53
+ Nếu điều kiện khơng có, vịng for được xem là ln ln đúng. Muốn thốt khỏi
<b>vòng lặp for phải dùng một trong 3 lệnh break, goto hoặc return. </b>


+ 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.


<b>+ Khi gặp lệnh break, cấu trúc lặp sâu nhất sẽ thốt ra. </b>


<b>+ Trong thân for có thể dùng lệnh goto để thốt khỏi vịng lặp đến vị trí mong </b>


muốn.


<b>+ Trong thân for có thể sử dụng return để trở về một hàm nào đó. </b>


+ 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).


</div>
<span class='text_page_counter'>(55)</span><div class='page_container' data-page=55>

KHOA CÔNG NGHỆ THÔNG TIN Trang 54
<b>Hình 28: Màn hình giải ví dụ 13 mục 3.2.2.1 </b>


<i><b> Kết quả in ra màn hình </b></i>


</div>
<span class='text_page_counter'>(56)</span><div class='page_container' data-page=56>

KHOA CƠNG NGHỆ THƠNG TIN Trang 55
<b>Hình 30: Màn hình giải ví dụ 14 mục 3.2.2.1 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 31: Kết quả chương trình chạy ví dụ 14 mục 3.2.2.1 </b>


</div>
<span class='text_page_counter'>(57)</span><div class='page_container' data-page=57>

KHOA CÔNG NGHỆ THÔNG TIN Trang 56
<b>Hình 32: Màn hình giải ví dụ 15 mục 3.2.2.1 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 33: Kết quả chương trình chạy ví dụ 15 mục 3.2.2.1 </b>
<b> Nếu có dấu chấm phẩy sau lệnh for(i=1; i<=n; ++i); </b>


<b> Các lệnh thuộc vịng lặp for sẽ khơng được thực hiện. </b>


</div>
<span class='text_page_counter'>(58)</span><div class='page_container' data-page=58>

KHOA CƠNG NGHỆ THƠNG TIN Trang 57


<b>Hình 34: Màn hình giải ví dụ 16 mục 3.2.2.1 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 35: Kết quả chương trình chạy ví dụ 16 mục 3.2.2.1 </b>


</div>
<span class='text_page_counter'>(59)</span><div class='page_container' data-page=59>

KHOA CÔNG NGHỆ THÔNG TIN Trang 58
<b>Hình 36: Màn hình giải ví dụ 17 mục 3.2.2.1 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 37: Kết quả chương trình chạy ví dụ 17 mục 3.2.2.1 </b>
<b>Ví dụ 18: Một vài ví dụ thay đổi biến điều khiển vòng lặp. [8] </b>


- Thay đổi biến điều khiển từ 1 đến 100, mỗi lần tăng 1:
for(i = 1; i <= 100; i++)


</div>
<span class='text_page_counter'>(60)</span><div class='page_container' data-page=60>

KHOA CƠNG NGHỆ THƠNG TIN Trang 59
<b>Hình 38: Màn hình giải ví dụ 19 mục 3.2.2.1 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 39: Kết quả chương trình chạy ví dụ 19 mục 3.2.2.1 </b>


</div>
<span class='text_page_counter'>(61)</span><div class='page_container' data-page=61>

KHOA CÔNG NGHỆ THÔNG TIN Trang 60
<b>while(Điều kiện) </b>


<b>{ </b>


<b>Các câu lệnh; </b>


<b>} </b>


<b>Hình 40: Màn hình giải ví dụ 20 mục 3.2.2.1 </b>
<i><b> Kết quả in ra màn hình </b></i>


<i><b>Hình 41: Kết quả chương trình chạy ví dụ 20 mục 3.2.2.1 </b></i>


<b>3.2.2.2 </b> <b>Lệnh while </b>


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.
<i><b>Cú pháp lệnh </b></i>


</div>
<span class='text_page_counter'>(62)</span><div class='page_container' data-page=62>

KHOA CÔNG NGHỆ THÔNG TIN Trang 61
<b> Giải thích </b>


+ Đ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).


<b>+ Muốn thốt khỏi vịng lặp while tùy ý có thể dùng các lệnh break, goto, return </b>
<b>như lệnh for (câu lệnh này sẽ học ở mục sau) </b>


<b> Lưu ý </b>



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


</div>
<span class='text_page_counter'>(63)</span><div class='page_container' data-page=63>

KHOA CÔNG NGHỆ THÔNG TIN Trang 62
<i><b>Hình 42: Màn hình giải ví dụ 21 mục 3.2.2.2 </b></i>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 43: Kết quả chương trình chạy ví dụ 21 mục 3.2.2.2 </b>


</div>
<span class='text_page_counter'>(64)</span><div class='page_container' data-page=64>

KHOA CÔNG NGHỆ THÔNG TIN Trang 63
<b>Hình 44: Màn hình giải ví dụ 21 mục 3.2.2.2 </b>


<i><b> Kết quả in ra màn hình </b></i>


</div>
<span class='text_page_counter'>(65)</span><div class='page_container' data-page=65>

KHOA CƠNG NGHỆ THƠNG TIN Trang 64
<b>do{ </b>


<b>Các câu lệnh; </b>
<b>} </b>


<b>while(Điều kiện); </b>


<b>Hình 46: Màn hình giải ví dụ 22 mục 3.2.2.2 </b>
<b> Kết quả in ra màn hình </b>


<b>Hình 47: Kết quả chương trình chạy ví dụ 22 mục 3.2.2.2 </b>


<b>3.2.2.3 </b> <b>Lệnh do…while </b>



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)


</div>
<span class='text_page_counter'>(66)</span><div class='page_container' data-page=66>

KHOA CÔNG NGHỆ THÔNG TIN Trang 65
<b> Giải thích </b>


+ Đ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.


<b>+ 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 </b>
khiển thực thi khác.


<b>+ Muốn thoát khỏi vịng lặp do…while ta có thể dùng các lệnh break, goto, return. </b>
<b>Ví dụ 23: Viết chương trình nhập vào số nguyên n <10, nếu người nhập n>=10 chương </b>
trình sẽ thốt ra và tính tổng các số vừa nhập.


<b>Hình 48: Màn hình giải ví dụ 23 mục 3.2.2.3 </b>
Đúng


</div>
<span class='text_page_counter'>(67)</span><div class='page_container' data-page=67>

KHOA CÔNG NGHỆ THÔNG TIN Trang 66
<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 49: Kết quả chương trình chạy ví dụ 23 mục 3.2.2.3 </b>


</div>
<span class='text_page_counter'>(68)</span><div class='page_container' data-page=68>

KHOA CƠNG NGHỆ THƠNG TIN Trang 67
<b>Hình 51: Kết quả chương trình chạy ví dụ 24 mục 3.2.2.3 </b>


<b>3.2.2.4 </b> <b>Vịng lặp lồng nhau </b>



<b>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 </b>
hình chữ nhật đặc bằng các dấu '*' cho người dùng xem.


</div>
<span class='text_page_counter'>(69)</span><div class='page_container' data-page=69>

KHOA CƠNG NGHỆ THƠNG TIN Trang 68
<b>Hình 53: Kết quả chương trình chạy ví dụ 25 mục 3.2.2.4 </b>


<b>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 </b>
thứ 2 = 10 số 8…


</div>
<span class='text_page_counter'>(70)</span><div class='page_container' data-page=70>

KHOA CƠNG NGHỆ THƠNG TIN Trang 69
<b>Hình 55: Kết quả chương trình chạy ví dụ 26 mục 3.2.2.4 </b>


<b>3.2.2.5 </b> <b>Lệnh break </b>


<b>- Câu lệnh break cho phép ra khỏi các chu trình với các tốn tử for, </b>
<b>while và switch. </b>


<b>- 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 </b>
đ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ì.


<b>- 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. </b>


<b>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 </b>
nhập âm thì dừng


</div>
<span class='text_page_counter'>(71)</span><div class='page_container' data-page=71>

KHOA CÔNG NGHỆ THÔNG TIN Trang 70
<b>Hình 57: Kết quả chương trình chạy ví dụ 27 mục 3.2.2.5 </b>


<b>3.2.2.6 </b> <b>Lệnh continue và goto </b>



<b>- Continue dùng để bắt đầu một vòng mới của chu trình chứa nó </b>


<b>- Trong while và do ... while, lệnh continue chuyển điều khiển về thực hiện ngay </b>
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.


<b>- Chú ý: Lệnh continue chỉ áp dụng cho chu trình, khơng áp dụng cho switch. </b>
- 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.


<b>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 </b>


</div>
<span class='text_page_counter'>(72)</span><div class='page_container' data-page=72>

KHOA CÔNG NGHỆ THÔNG TIN Trang 71
<b>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 </b>
dần đến 1.


<i><b>Hình 60: Màn hình giải ví dụ 29 mục 3.2.2.6 </b></i>
<i><b> Kết quả in ra màn hình </b></i>


</div>
<span class='text_page_counter'>(73)</span><div class='page_container' data-page=73>

KHOA CƠNG NGHỆ THƠNG TIN Trang 72
<b>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 </b>
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.


<i><b>Hình 62: Màn hình giải ví dụ 30 mục 3.2.2.6 </b></i>
<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 63: Kết quả chương trình chạy ví dụ 30 mục 3.2.2.6 </b>


<b>3.2.2.7 </b> <b>Lệnh exit </b>


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:


<i><b>void exit (int exit code); </b></i>


<i>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 </i>


</div>
<span class='text_page_counter'>(74)</span><div class='page_container' data-page=74>

KHOA CÔNG NGHỆ THÔNG TIN Trang 73
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:


</div>
<span class='text_page_counter'>(75)</span><div class='page_container' data-page=75>

KHOA CÔNG NGHỆ THÔNG TIN Trang 74
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)


<b>3.3.2 Sử dụng lệnh switch </b>


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.


</div>
<span class='text_page_counter'>(76)</span><div class='page_container' data-page=76>

KHOA CÔNG NGHỆ THÔNG TIN Trang 75
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:


15. S = p*(pa)*(pb)*pc), 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ả.


<b>3.3.4 Bài tập vòng lặp </b>


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 *


</div>
<span class='text_page_counter'>(77)</span><div class='page_container' data-page=77>

KHOA CÔNG NGHỆ THÔNG TIN Trang 76
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<sub>+x</sub>3<sub>+…+(-1)</sub>n+1<sub>x</sub>n<sub>. </sub>


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ố ngun 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


Pn = anxn<sub> + an-1x</sub>n-1<sub> + … + a1x</sub>1<sub> + a0 </sub>
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.


</div>
<span class='text_page_counter'>(78)</span><div class='page_container' data-page=78>

KHOA CƠNG NGHỆ THƠNG TIN Trang 77
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.


</div>
<span class='text_page_counter'>(79)</span><div class='page_container' data-page=79>

KHOA CÔNG NGHỆ THÔNG TIN Trang 78
- 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)
- 1 +


1
n


x
...
2


x n





</div>
<span class='text_page_counter'>(80)</span><div class='page_container' data-page=80>

KHOA CÔNG NGHỆ THÔNG TIN Trang 79
- Sử dụng biến cục bộ, toà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.
<b>4.2 Nội dung </b>


<b>4.2.1 Tổng quan về hàm </b>


<b>4.2.1.1 </b> <b>Khái niệm </b>


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.



<b>4.2.1.2 </b> <b>Cấu trúc của hàm </b>


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
<b>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 </b>
thường đều định nghĩa thêm các hàm.


<b>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 </b>
<b>số. Một định nghĩa hàm cung cấp phần thân của một hàm. </b>


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++<sub> như sau: </sub>
<Kiểu_trả_về> <tên_hàm> ( [Danh sách tham số])


{


Các lệnh xử lý trong thân hàm
}


<b>Giải thích: </b>


</div>
<span class='text_page_counter'>(81)</span><div class='page_container' data-page=81>

KHOA CÔNG NGHỆ THÔNG TIN Trang 80


 <b>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 </b>
<b>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>
<b>bằng dấu phẩy kèm theo kiểu dữ liệu tương ứng. </b>


 <b>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ố. </b>


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ố.


 <b>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 </b>
xác định những gì mà hàm thực hiện.


<b>4.2.1.3 </b> <b>Các ví dụ về sử dụng hàm </b>


<b>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ó </b>
2 tham số: so1 và so2 và trả về giá trị lớn nhất giữa 2 số.


</div>
<span class='text_page_counter'>(82)</span><div class='page_container' data-page=82>

KHOA CÔNG NGHỆ THÔNG TIN Trang 81
<b> Giải thích ví dụ 1: </b>


 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
<b>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ề </b>
<b>này. </b>


<b>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ã </b>
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
<b>trước khi gọi hàm đó. </b>


</div>
<span class='text_page_counter'>(83)</span><div class='page_container' data-page=83>

KHOA CƠNG NGHỆ THƠNG TIN Trang 82
<b>Hình 66: Màn hình giải ví dụ 2 mục 4.2.1.3 </b>


<i><b> Kết quả in ra màn hình </b></i>


<i><b>Hình 67: Kết quả chương trình chạy ví dụ 2 mục 4.2.1.3 </b></i>
<i><b> Chú ý ví dụ trên như sau: </b></i>


Việc này được thực hiện bởi sử dụng toá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.


</div>
<span class='text_page_counter'>(84)</span><div class='page_container' data-page=84>

KHOA CƠNG NGHỆ THƠNG TIN Trang 83
<b>Hình 68: Màn hình giải ví dụ 3 mục 4.2.1.3 </b>


<i><b> Kết quả in ra màn hình </b></i>



<i><b>Hình 69: Kết quả chương trình chạy ví dụ 3 mục 4.2.1.3 </b></i>
<b>4.2.2 Tham số dạng tham biến và tham trị </b>


<b>Tham trị: Một tham số được truyền theo dạng tham trị thì giá trị sẽ không bị thay </b>
đổi khi kết thúc phương thức.


<b>Tham chiếu: Một tham số được truyền theo dạng tham chiếu thì giá trị sẽ bị thay đổi </b>
khi kết thúc phương thức


<b>Ví dụ 4: So sánh giữa tham trị và tham biến </b>


</div>
<span class='text_page_counter'>(85)</span><div class='page_container' data-page=85>

KHOA CÔNG NGHỆ THÔNG TIN Trang 84


<b>Sử dụng tham trị </b> <b>Sử dụng tham biến </b>


<b>Tóm lại: </b>


- 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 toà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 toàn cục .


<b>4.2.3 Vần đề tầm vực </b>


<b>4.2.3.1 </b> <b>Khái niệm </b>


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.


<b>4.2.3.2 </b> <b>Quy tắc cơ bản </b>


</div>
<span class='text_page_counter'>(86)</span><div class='page_container' data-page=86>

KHOA CÔNG NGHỆ THÔNG TIN Trang 85
<b>Biến toàn cục là biến được khai báo ngoài tất cả các hàm, kể cả hàm main, biến tồn </b>
cục có thể được sử dụng trong cả chương trình.


<b>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>
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.


<b>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à </b>
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.


</div>
<span class='text_page_counter'>(87)</span><div class='page_container' data-page=87>

KHOA CƠNG NGHỆ THƠNG TIN Trang 86


<b>Hình 70: Màn hình giải ví dụ 5 mục 4.2.3.3 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 71: Kết quả chương trình chạy ví dụ 5 mục 4.2.3.3 </b>


</div>
<span class='text_page_counter'>(88)</span><div class='page_container' data-page=88>

KHOA CƠNG NGHỆ THƠNG TIN Trang 87
<b>Hình 72: Màn hình giải ví dụ 6 mục 4.2.3.3 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 73: Kết quả chương trình chạy ví dụ 6 mục 4.2.3.3 </b>
<b>Lưu ý: Phải tránh sử dụng biến tồn cục vì: </b>


 Biến toà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.


<b>4.2.3.4 </b> <b>Tầm vực của hàm </b>


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.


</div>
<span class='text_page_counter'>(89)</span><div class='page_container' data-page=89>

KHOA CÔNG NGHỆ THÔNG TIN Trang 88
<b>4.2.4 Dùng hướng dẫn #define </b>


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
<b>Ví dụ 7: Trong ví dụ 6 sửa lại như sau </b>


<b>Hình 74: Màn hình giải ví dụ 7 mục 4.2.4 </b>
Chạy lại chương trình, quan sát và nhận xét kết quả.


<b>Ví dụ 8: Viết chương trình tìm số lớn nhất trong 2 số thực a và b. </b>


</div>
<span class='text_page_counter'>(90)</span><div class='page_container' data-page=90>

KHOA CÔNG NGHỆ THÔNG TIN Trang 89
<b>Hình 76: Kết quả chương trình chạy ví dụ 8 mục 4.2.4 </b>


<b>4.2.5 Đệ quy </b>


<b>4.2.5.1 </b> <b>Khái niệm </b>


Đệ 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


<b>Cú pháp đệ quy như sau: </b>



<Kiểu trả về> <Tên_hàm>(<ds tham số>)
{


if(thỏa đk dừng)
return <gia_tri>;
else


Tên_hàm(<ds tham số>); //Gọi lại chính hàm đó
}


<b>4.2.5.2 </b> <b>Các ví dụ </b>


<b>Ví dụ 9: Viết hàm tính tổng S=1+2+3+…+n </b>


 Điều kiện dừng: n=1 => S(1)=1


 Điều kiện đệ qui: n>1: S(n)=n+S(n-1)


<b>int tong(int n) </b>
{


</div>
<span class='text_page_counter'>(91)</span><div class='page_container' data-page=91>

KHOA CÔNG NGHỆ THÔNG TIN Trang 90
else


return tong(n-1)+n;
}


<b>Ví dụ 10: Tính n! </b>



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)


<b>int giaithua(int n) </b>
{


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ả
<b>Ví dụ 11: Dãy số Fibonacci </b>


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


</div>
<span class='text_page_counter'>(92)</span><div class='page_container' data-page=92>

KHOA CƠNG NGHỆ THƠNG TIN Trang 91
<b>Hình 77: Màn hình giải ví dụ 11 mục 4.2.5.2 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 78: Kết quả chương trình chạy ví dụ 11 mục 4.2.5.2 </b>



<b>Ví dụ 12: Dùng đệ quy viết chương trình tính </b>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


</div>
<span class='text_page_counter'>(93)</span><div class='page_container' data-page=93>

KHOA CÔNG NGHỆ THÔNG TIN Trang 92
#include <iostream>


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);
}


</div>
<span class='text_page_counter'>(94)</span><div class='page_container' data-page=94>

KHOA CÔNG NGHỆ THƠNG TIN Trang 93
<b>Hình 79: Kết quả chương trình chạy ví dụ 12 mục 4.2.5.2 </b>


<b>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 </b>
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 <cstdlib>


#include <iostream>
using namespace std;
long GiaiThua(int n)
{


if(n==1)
{


return 1;
}


return GiaiThua(n-1)*n;
}


long Tong(int n)


{


if(n == 1)
{


</div>
<span class='text_page_counter'>(95)</span><div class='page_container' data-page=95>

KHOA CÔNG NGHỆ THÔNG TIN Trang 94
return Tong(n-1) + GiaiThua(n-1)*n;


}


int main(int argc, char *argv[])
{


int n;
long S;


cout<<"Nhap n=";
cin>>n;


S=Tong(n);


cout<<"Tong S="<<S;


cout<<"\n";system("PAUSE");
return EXIT_SUCCESS;
}


<i><b> Kết quả in ra màn hình </b></i>



<b>Hình 80: Kết quả chương trình chạy ví dụ 13 mục 4.2.5.2 </b>
<b>4.2.6 Ưu nhược điểm của đệ quy </b>


Giải thuật đệ quy có ưu điểm là thuận lợi cho việc biểu diễn bài toá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ớ.


<b>4.3 Bài tập </b>


<b>4.3.1 Bài tập hàm </b>


1. Viết hàm kiểm tra số nguyên tố.


</div>
<span class='text_page_counter'>(96)</span><div class='page_container' data-page=96>

KHOA CÔNG NGHỆ THÔNG TIN Trang 95
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 toán “Tháp Hà Nội”.


</div>
<span class='text_page_counter'>(97)</span><div class='page_container' data-page=97>

KHOA CÔNG NGHỆ THÔNG TIN Trang 96
<b>Bài 5 : </b>


<b>MẢNG VÀ CHUỖI </b>


<b>5.1 Mục tiêu </b>


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
<b>5.2 Nội dung </b>


<b>5.2.1 Mảng </b>



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ố).


<b>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>
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:


<i><b>cout<<”nhap diem thu tu cac mon: “; </b></i>
<i><b>cin>> van>> toan>> ly>> hoa>> sinh; </b></i>


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.


<b>5.2.1.1 </b> <b>Cách khai báo mảng </b>
<b>Cú pháp: </b>


<b><Kiểu_dữ_liệu_mảng> < Tên_mảng > [ < Số_phần_tử_tối_đa> ] ; </b>
<b>Trong đó: </b>


<b> 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 </b>
chuẩn hoặc kiểu dữ liệu do lập trình viên tự định nghĩa.


</div>
<span class='text_page_counter'>(98)</span><div class='page_container' data-page=98>

KHOA CÔNG NGHỆ THÔNG TIN Trang 97
<b>Khởi tạo mảng một chiều: </b>


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
<b>Khởi tạo mảng khơng khai báo kích thước: </b>


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.
<b>5.2.1.2 </b> <b>Tham chiếu đến từng phần tử mảng </b>


Sau khi mảng được khai báo, mỗi phần tử trong mảng đều có chỉ số để tham chiếu.
<b>Cú pháp: Tên_mảng[chỉ_số] </b>


<b>Trong đó: chỉ_số: là chỉ số số thứ tự của mảng, các phần tử trong một mảng được </b>
đá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.


<b>Mô tả như sau: mảng arr[5] </b>


Giá trị arr[0] arr[1] arr[2] arr[3] arr[4]


Chỉ số 0 1 2 3 4


<b>5.2.1.3 </b> <b>Nhập/Xuất dữ liệu cho mảng một chiều </b>


 <b>Nhập mảng một chiều </b>


for(int i=0;i<5;i++) //i chạy từ 0 đến 4
{


cout<<”Phan tu thu “<<i+1<<”: ”;
cin>>arr[i];



}


 <b>Xuất/ Đọc mảng một chiều </b>


for(int i=0;i<5;i++) //i chạy từ 0 đến 4


</div>
<span class='text_page_counter'>(99)</span><div class='page_container' data-page=99>

KHOA CƠNG NGHỆ THƠNG TIN Trang 98
<b>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 </b>
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.


<b>Hình 81: Màn hình giải ví dụ 3 mục 5.2.1.3 </b>
<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 82: Kết quả chương trình chạy ví dụ 3 mục 5.2.1.3 </b>


</div>
<span class='text_page_counter'>(100)</span><div class='page_container' data-page=100>

KHOA CƠNG NGHỆ THƠNG TIN Trang 99
<b>Hình 83: Màn hình giải ví dụ 4 mục 5.2.1.3 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 84: Kết quả chương trình chạy ví dụ 4 mục 5.2.1.3 </b>
 Ngồi kiểu int, bạn có thể khai báo mảng kiểu char, float, double…


</div>
<span class='text_page_counter'>(101)</span><div class='page_container' data-page=101>

KHOA CÔNG NGHỆ THƠNG TIN Trang 100
<b>Hình 85: Màn hình giải ví dụ 5 mục 5.2.1.3 </b>


<i><b> Kết quả in ra màn hình </b></i>



<i><b>Hình 86: Kết quả chương trình chạy ví dụ 5 mục 5.2.1.3 </b></i>
<b>5.2.1.4 </b> <b>Mảng nhiều chiều </b>


<b>Định nghĩa mảng 2 chiều </b>


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 đó.


</div>
<span class='text_page_counter'>(102)</span><div class='page_container' data-page=102>

KHOA CÔNG NGHỆ THÔNG TIN Trang 101
<b>dòng và số cột mảng, số phần tử của mảng sẽ là dịng*cột. </b>


<b>Ví dụ 6: </b>


int a[2][5]; // a là mảng số ngun 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


<b>Tham chiếu đến từng phần tử trong mảng 2 chiều </b>


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>Bảng 14: Bảng biểu diễn mảng 2 chiều </b>


0 1 2 3 4 5 6 7 8 9


0


1
2
3
4


<b>a[2][1] </b> <b>a[3][4] </b> <b>a[0][6] </b> <b>a[2][8] </b>
 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.
<b> a[2][8] là phần tử tại dòng 2 cột 8 trong mảng 2 chiều. </b>


<b>Khởi tạo mảng 2 chiều </b>


</div>
<span class='text_page_counter'>(103)</span><div class='page_container' data-page=103>

KHOA CÔNG NGHỆ THÔNG TIN Trang 102
<b> Kiểu_mảng tên_mảng[dịng][cột]={{kđ_dịng_1},{ kđ_dịng_2},..,{ </b>


<b>kđ_dịng_k}}; </b>


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ỏ)



<b> Kiểu_mảng tên_mảng[][cột] = {{kđ_dịng_1},{ kđ_dịng_2},..,{ </b>
<b>kđ_dịng_k}}; </b>


(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.
<b> Kiểu_mảng tên_mảng[dòng][cột] = { gt_1, gt_2,...,gt_n }; </b>


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.


<b> Kiểu_mảng tên_mảng[][cột] = { gt_1, gt_2,...,gt_n }; </b>


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.


<b>Ví dụ 7: int a[3][2] = {{1,2},{3},{4,5}}; thì các phần tử của a như sau: </b>
a[0][0]=1, a[0][1]=2, a[1][0]=3, a[1][1]= 0, a[2][0]=4,a[2][1]=5;


<b>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ử </b>
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;


<b>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 </b>
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;
<b>5.2.1.5 </b> <b>Nhập/Xuất dữ liệu cho mảng 2 chiều </b>


</div>
<span class='text_page_counter'>(104)</span><div class='page_container' data-page=104>

KHOA CÔNG NGHỆ THÔNG TIN Trang 103
Thứ tự nhập mảng 2 chiều như sau: Thứ tự từng dòng từ trái sang phải.
<b>Xuất dữ liệu cho mảng 2 chiều </b>


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
}


</div>
<span class='text_page_counter'>(105)</span><div class='page_container' data-page=105>

KHOA CÔNG NGHỆ THÔNG TIN Trang 104
<b>Hình 87: Màn hình giải ví dụ 10 mục 5.2.1.5 </b>


</div>
<span class='text_page_counter'>(106)</span><div class='page_container' data-page=106>

KHOA CÔNG NGHỆ THÔNG TIN Trang 105
<b>Hình 88: Kết quả chương trình chạy ví dụ 10 mục 5.2.1.5 </b>


</div>
<span class='text_page_counter'>(107)</span><div class='page_container' data-page=107>

KHOA CÔNG NGHỆ THƠNG TIN Trang 106
<b>Hình 89: Màn hình giải ví dụ 11 mục 5.2.1.5 </b>


</div>
<span class='text_page_counter'>(108)</span><div class='page_container' data-page=108>

KHOA CƠNG NGHỆ THƠNG TIN Trang 107
<b>Hình 90: Kết quả chương trình chạy ví dụ 11 mục 5.2.1.5 </b>


</div>
<span class='text_page_counter'>(109)</span><div class='page_container' data-page=109>

KHOA CƠNG NGHỆ THƠNG TIN Trang 108
<b>Hình 91: Màn hình giải ví dụ 12 mục 5.2.1.5 </b>



</div>
<span class='text_page_counter'>(110)</span><div class='page_container' data-page=110>

KHOA CÔNG NGHỆ THÔNG TIN Trang 109
<b>Hình 92: Kết quả chương trình chạy ví dụ 12 mục 5.2.1.5 </b>


<b>5.2.2 Chuỗi </b>


<b>5.2.2.1 </b> <b>Cách khai báo chuỗi </b>


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>Bảng 15: Bảng biểu diễn chuỗi lưu trong mảng </b>


c a o d a n g k i n h t e \0


<b>Cú pháp: char <Biến> [Chiều dài tối đa]</b>
<b>Ví dụ 13: Trong chương trình, ta có khai báo: </b>


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.
<b>Ghi chú: </b>


- 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.


<b>Ví dụ 14: Nhập vào họ tên và in ra họ tên bạn vừa nhập </b>


</div>
<span class='text_page_counter'>(111)</span><div class='page_container' data-page=111>

KHOA CÔNG NGHỆ THÔNG TIN Trang 110
<b>Hình 93: Màn hình giải ví dụ 14 mục 5.2.2.1 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 94: Kết quả chương trình chạy ví dụ 14 mục 5.2.2.1 </b>


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.


<b>5.2.2.2 </b> <b>Hàm nhập (gets), xuất (puts) chuỗi </b>


<b>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 </b>
gets()


<b>Cú pháp: gets(<Biến chuỗi>) </b>


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.


Ngoài ra, hàm cgets() (trong conio.h) cũng được sử dụng để nhập chuỗi.
<b>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ử </b>
dụng hàm puts()


</div>
<span class='text_page_counter'>(112)</span><div class='page_container' data-page=112>

KHOA CÔNG NGHỆ THÔNG TIN Trang 111


<b>Hình 95: Màn hình giải ví dụ 15 mục 5.2.2.2 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 96: Kết quả chương trình chạy ví dụ 15 mục 5.2.2.2 </b>
<b>Khởi tạo chuỗi </b>


</div>
<span class='text_page_counter'>(113)</span><div class='page_container' data-page=113>

KHOA CƠNG NGHỆ THƠNG TIN Trang 112
<b>Hình 97: Màn hình giải ví dụ 16 mục 5.2.2.2 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 98: Kết quả chương trình chạy ví dụ 16 mục 5.2.2.2 </b>
<b>Mảng chuỗi </b>


<b>Ví dụ 17: Viết chương trình xuất chuỗi trong mảng sau: </b>


</div>
<span class='text_page_counter'>(114)</span><div class='page_container' data-page=114>

KHOA CÔNG NGHỆ THÔNG TIN Trang 113


<b>5.2.2.3 </b> <b>Các hàm chuỗi thường sử dụng </b>


<b>STT </b> <b>Hàm </b> <b>Ý nghĩa </b>


1 <b>strcpy(s1, s2); Sao chép chuỗi s2 cho chuỗi s1. </b>
2 <b>strcat(s1, s2); Nối chuỗi s2 vào cuối chuỗi s1. </b>
3 <b>strlen(s1); </b> Trả về độ dài của chuỗi s1.


4 <b>strcmp(s1, s2); Trả về 0 nếu s1 và s2 là như nhau; nhỏ hơn 0 nếu s1<s2; lớn </b>
hơn 0 nếu s1>s2.



5 <b>strchr(s1, ch); Trả về con trỏ tới vị trí đầu tiên của ch trong s1. </b>


</div>
<span class='text_page_counter'>(115)</span><div class='page_container' data-page=115>

KHOA CÔNG NGHỆ THÔNG TIN Trang 114
<b>Hình 101: Màn hình giải ví dụ 18 mục 5.2.2.3 </b>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 102: Kết quả chương trình chạy ví dụ 18 mục 5.2.2.3 </b>
<b>5.3 Bài tập </b>


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ử.


</div>
<span class='text_page_counter'>(116)</span><div class='page_container' data-page=116>

KHOA CÔNG NGHỆ THÔNG TIN Trang 115
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.


</div>
<span class='text_page_counter'>(117)</span><div class='page_container' data-page=117>

KHOA CÔNG NGHỆ THÔNG TIN Trang 116
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 vng gồm có n phần tử kiểu số ngun.
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.


</div>
<span class='text_page_counter'>(118)</span><div class='page_container' data-page=118>

KHOA CÔNG NGHỆ THÔNG TIN Trang 117
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 q 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


</div>
<span class='text_page_counter'>(119)</span><div class='page_container' data-page=119>

KHOA CÔNG NGHỆ THƠNG TIN Trang 118
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:


</div>
<span class='text_page_counter'>(120)</span><div class='page_container' data-page=120>

KHOA CÔNG NGHỆ THÔNG TIN Trang 119
- 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ỏ


<b>6.2 Nội dung </b>


<b>6.2.1 Khái quát về con trỏ? </b>


<b>6.2.1.1 </b> <b>Khái niệm </b>



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.


<b>6.2.1.2 </b> <b>Lý do để dùng con trỏ </b>


 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.


<b>6.2.1.3 </b> <b>Các toán tử </b>


<b>Toán tử lấy địa chỉ (&) </b>


<b>Đị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ỉ </b>
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).


</div>
<span class='text_page_counter'>(121)</span><div class='page_container' data-page=121>

KHOA CÔNG NGHỆ THÔNG TIN Trang 120
<i><b>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 </b></i>
& 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ớ.


<b>Tốn tử tham chiếu (*) </b>


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 (*).


<b>Ví dụ: Giả sử biến y được đặt trong ơ nhớ có địa chỉ là 1202 và có các câu </b>
lệnh như sau:


y = 30;
z = y;
x = &y;
t = *y;


<i><b>Kết quả: biến t sẽ mang giá trị là 30. </b></i>


<b>6.2.1.4 </b> <b>Khái báo biến con trỏ </b>


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.


<b>Cú pháp khai báo: </b>


<i><b>Kiểu_dữ_liệu *Tên_con_trỏ; </b></i>


<b>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 </b>
thân con trỏ.



<b>Ví dụ: </b>


<b> int *x; //Khai báo con trỏ x kiểu int </b>
<b> float *k; //Khai báo con trỏ k kiểu float </b>


<b>Phép gán con trỏ: Hai con trỏ cùng kiểu có thể gán cho nhau. </b>
<i><b>Xem ví dụ sau: </b></i>


int a, *p, *a ; float *f;


a = 5 ; p = &a ; q = p ; /* đúng */
f = p ; /* sai do khác kiểu */


<b>Ta cũng có thể ép kiểu con trỏ theo cú pháp: (<Kiểu kết quả>*)<Tên con trỏ> </b>
Chẳng hạn, ví dụ trên được viết lại:


</div>
<span class='text_page_counter'>(122)</span><div class='page_container' data-page=122>

KHOA CÔNG NGHỆ THÔNG TIN Trang 121
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;


<b> Con trỏ NULL: là con trỏ không chứa địa chỉ nào cả. Ta có thể gán giá trị </b>
NULL cho 1 con trỏ có kiểu bất kỳ.


<i><b> Lưu ý: </b></i>



- 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
<i>cách (số phần tử) giữa 2 con trỏ đó. Chẳng hạn, trong ví dụ trên z-x=4. </i>


<b>Ví dụ 1: Khai báo, sử dụng tốn tử tham chiếu, toán tử lấy địa chỉ: </b>


</div>
<span class='text_page_counter'>(123)</span><div class='page_container' data-page=123>

KHOA CƠNG NGHỆ THƠNG TIN Trang 122
<b>Hình 104: Kết quả chương trình chạy ví dụ 1mục 6.2.1.4 </b>


<b>Ví dụ 2: Viết chương trình nhập 2 số a và b tính tổng 2 số vừa nhập (sử dụng biến con </b>
trỏ)


</div>
<span class='text_page_counter'>(124)</span><div class='page_container' data-page=124>

KHOA CÔNG NGHỆ THÔNG TIN Trang 123
<b>Hình 106: Kết quả chương trình chạy ví dụ 2 mục 6.2.1.4 </b>


<b>Lưu ý: </b>


- Khi sử dụng biến con trỏ trong biểu thức thì địa chỉ đang chứa trong con trỏ sẽ
được sử dụng để tính tốn giá trị của biểu thức.


- Nếu muốn lấy giá trị của biến mà con trỏ đang trỏ tới để sử dụng trong biểu thức
thì ta thêm dấu * vào đằng trước tên biến con trỏ.


- Khi đó, hai biến k và t có giá trị khác nhau. Trong biểu thức k, địa chỉ đang chứa
trong con trỏ p và q sẽ được cộng lại và đặt vào k; ngược lại t sẽ có giá trị =
a+b=8.


<b>6.2.1.5 </b> <b>Cấp phát và giải phóng vùng nhớ </b>



<b>Xét ví dụ sau: </b>
#include <stdio.h>
int main() {
int *px;
*px = 42;


printf("Vi tri con tro px la %p \n", px);


printf("Gia tri con tro px tro toi la %d \n", *px);
return 0;


}


Khi biên dịch thì sẽ khơng có lỗi (có cảnh báo), khi chạy sẽ khơng thể chạy được
mà chương trình sẽ thốt ra ln.


</div>
<span class='text_page_counter'>(125)</span><div class='page_container' data-page=125>

KHOA CÔNG NGHỆ THÔNG TIN Trang 124
<b>Để cấp phát vùng nhớ cho con trỏ ta dùng các hàm sau trong thư viện stdlib.h. </b>


 malloc : tên con trỏ = (kiểu con trỏ *) malloc (sizeof(kiểu con trỏ));


 calloc : tên con trỏ = (kiểu con trỏ *) malloc (n, sizeof(kiểu con trỏ));
<b>Trong đó: </b>


- sizeof(kiểu con trỏ) là kích thước của kiểu;
- n là số lần của sizeof(kiểu con trỏ) được cấp.
<b>Xem xét ví dụ sau: </b>


#include <stdio.h>
#include <stdlib.h>


int main() {


int *px, *qx;


px = (int *) malloc(sizeof(int));
qx = (int *) calloc(1, sizeof(int));
printf("Vi tri con tro px la %p \n", px);


printf("Gia tri con tro px tro toi la %d \n", *px);
printf("Vi tri con tro qx la %p \n", qx);


printf("Gia tri con tro qx tro toi la %d \n", *qx);
return 0;


}


Sự khác nhau duy nhất giữa malloc và calloc chúng ta hiểu đơn giản là:


+ malloc thì khi cấp phát máy sẽ cấp phát cho px 1 ô bất kỳ mà không cần biết ô
đó có dữ liệu là gì hay khơng có dữ liệu (do đó *px có giá trị như trên).


+ calloc cũng vậy nhưng khác 1 điểm là sau khi cấp phát thì máy sẽ tự động gán
ln giá trị 0 cho ô nhớ mà biến qx trỏ tới, tức qx có giá trị mặc định là 0.


Khi cấp phát cho biến con trỏ 1 số lượng ô nhớ nào đó mà trong q trình làm
<b>việc ta thiếu và cần cấp phát thêm thì ta sử dụng lệnh realloc: </b>


<b>tên_con_trỏ = (kiểu_con_trỏ *) realloc (tên_con_trỏ, số lượng cần cấp phát * </b>
<b>sizeof(kiểu con trỏ)); </b>



Trong đó: số lượng cần cấp phát = cũ + mới.


Ta hiểu như sau: ban đầu ta cấp phát cho con trỏ px là 10 ơ nhớ. Sau đó muốn cấp
phát thêm cho nó 5 ơ nhớ nữa thì số lượng cấp phát = 15.


</div>
<span class='text_page_counter'>(126)</span><div class='page_container' data-page=126>

KHOA CÔNG NGHỆ THÔNG TIN Trang 125
y = (double *) malloc(10 * sizeof(double)); /*cap phat bo nho cho 10 so thuc cham
phay dong*/


}


<b>Ví dụ 4: Ta có thể cấp phát lại vùng nhớ do con trỏ x quản lý như sau </b>
int a, *x;


x=(int*)malloc(sizeof(int)); /*Cấp phát vùng nhớ có kích thước 2 byte*/
x = realloc(x, 6); /* Cấp phát lại vùng nhớ có kích thước 6 byte*/


<b>6.2.2 Ứng dụng của con trỏ </b>


<b>6.2.2.1 </b> <b>Hàm có tham số của con trỏ </b>


<b>Ví dụ 5: Viết chương trình khai báo biến x và xem địa chỉ lưu trữ của giá trị biến x. </b>


</div>
<span class='text_page_counter'>(127)</span><div class='page_container' data-page=127>

KHOA CÔNG NGHỆ THÔNG TIN Trang 126
<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 108: Kết quả chương trình chạy ví dụ 5 mục 6.2.2.1 </b>
<b>Ví dụ 6: Viết hàm sử dụng con trỏ hoán đổi 2 số ngun. </b>


<b>Hình 109: Màn hình giải ví dụ 6 mục 6.2.2.1 </b>


<i><b> Kết quả in ra màn hình </b></i>


</div>
<span class='text_page_counter'>(128)</span><div class='page_container' data-page=128>

KHOA CÔNG NGHỆ THÔNG TIN Trang 127
int *ptr;


int arr[10];
ptr = &arr[0];


Như ở trên, con trỏ chứa địa chỉ của phần tử đầu tiên của mảng. C cung cấp một cách
khác để trỏ tới phần tử đầu tiên của mảng, ptr = arr;


<b>Ghi chú: Cần nhớ rằng tên của một con trỏ mảng mà khơng có kèm chỉ số thì nó là một </b>
con trỏ trỏ tới phần tử đầu tiên của mảng.


<b>Quy tắc biến đổi mảng: </b>


<i>- Nếu arr1 là một mảng, thì biểu thức arr1 + 1 sẽ cho địa chỉ của phần tử thứ 2 </i>
trong mảng.


- Sử dụng tốn tử gián tiếp * đứng phía trước tên biến để lấy giá trị được chứa
trong địa chỉ này. Như vậy *(arr1 + 1) sẽ cho giá trị được lưu trong phần tử thứ 2 của
mảng.


- Vì thế chúng ta có thể sử dụng quy tắc biến đổi này để chuyển đổi bất cứ mảng
nào được tham chiếu tới bằng các biểu thức với con trỏ tương đương.


arr1[0] tương đương với *(arr1 + 0)
arr1[1] tương đương với *(arr1 + 1)
arr1[2] tương đương với *(arr1 + 2)



<b>Lưu ý: Nếu khơng có cặp ngoặc đơn thì phép tốn *arr1 + 1 sẽ cho một kết quả </b>
khác hoàn toàn.


</div>
<span class='text_page_counter'>(129)</span><div class='page_container' data-page=129>

KHOA CÔNG NGHỆ THÔNG TIN Trang 128
<i><b>Hình 111: Màn hình giải ví dụ 7 mục 6.2.2.2 </b></i>


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 112: Kết quả chương trình chạy ví dụ 7 mục 6.2.2.2 </b>


</div>
<span class='text_page_counter'>(130)</span><div class='page_container' data-page=130>

KHOA CÔNG NGHỆ THÔNG TIN Trang 129
<b>Hình 113: Màn hình giải ví dụ 8 mục 6.2.2.2 </b>


</div>
<span class='text_page_counter'>(131)</span><div class='page_container' data-page=131>

KHOA CÔNG NGHỆ THÔNG TIN Trang 130
<i><b>Hình 114: Kết quả chương trình chạy ví dụ 8 mục 6.2.2.2 </b></i>


<b>6.2.2.3 </b> <b>Con trỏ và chuỗi </b>


Do chuỗi ký tự bản chất cũng là mảng các ký tự nên phần này nó cũng xem như mảng 1
<b>chiều. </b>


<b>Ví dụ 9: Viết chương trình xuất thơng báo hỏi tên và trả lời, in tên vừa nhập cho người </b>
dùng xem.


</div>
<span class='text_page_counter'>(132)</span><div class='page_container' data-page=132>

KHOA CÔNG NGHỆ THÔNG TIN Trang 131
<b>Hình 116: Kết quả chương trình chạy ví dụ 9 mục 6.2.2.3 </b>


<b>Ví dụ 10: Viết chương trình khởi tạo danh sách mảng các tháng (từ tháng 1 đến tháng </b>
12), khi người dùng nhập vào tháng nào sẽ xuất tháng đó cho người dùng xem.



<i><b>Hình 117: Màn hình giải ví dụ 10 mục 6.2.2.3 </b></i>
<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 118: Kết quả chương trình chạy ví dụ 10 mục 6.2.2.3 </b>


</div>
<span class='text_page_counter'>(133)</span><div class='page_container' data-page=133>

KHOA CÔNG NGHỆ THÔNG TIN Trang 132
<b>Hình 119: Màn hình giải ví dụ 11 mục 6.2.2.3 </b>


</div>
<span class='text_page_counter'>(134)</span><div class='page_container' data-page=134>

KHOA CÔNG NGHỆ THÔNG TIN Trang 133
<b>Hình 120: Kết quả chương trình chạy ví dụ 11 mục 6.2.2.3 </b>


<b>6.2.2.4 </b> <b>Con trỏ trỏ đến con trỏ </b>


Trong lập trình C++ cho phép sử dụng các con trỏ trỏ tới các con trỏ khác giống
như là trỏ tới dữ liệu. Để làm việc đó chúng ta chỉ cần thêm một dấu sao (*) cho mỗi
mức tham chiếu.


char a;
char * b;
char ** c;
a = 'z';
b = &a;
c = &b;


<b>giả sử rằng a,b,c được lưu ở các ô nhớ 7230, 8092 and 10502, ta có thể mơ tả đoạn </b>
mã trên như sau:


</div>
<span class='text_page_counter'>(135)</span><div class='page_container' data-page=135>

KHOA CÔNG NGHỆ THÔNG TIN Trang 134
<b>c là một biến có kiểu (char **) mang giá trị 8092*c là một biến có kiểu (char*) </b>
<b>mang giá trị 7230**c là một biến có kiểu (char) mang giá trị 'z' </b>



<b>Ví dụ 12: </b>


</div>
<span class='text_page_counter'>(136)</span><div class='page_container' data-page=136>

KHOA CÔNG NGHỆ THÔNG TIN Trang 135


3. Viết chương trình nhập vào một tên và đếm số ký tự là nguyên âm và phụ âm.


4. Viết chương trình tìm phần tử có giá trị nhỏ nhất và lớn nhất trong mảng một


chiều.


5. Viết chương trình tìm phần tử có giá trị nhỏ nhất và lớn nhất trong mảng hai


</div>
<span class='text_page_counter'>(137)</span><div class='page_container' data-page=137>

KHOA CÔNG NGHỆ THÔNG TIN Trang 136
<b>Bài 7 : </b>


<b>KIỂU DỮ LIỆU NGƯỜI DÙNG TỰ ĐỊNH NGHĨA </b>
<b>7.1 Mục tiêu </b>


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 struct, emum


- Nhập, xuất struct.
- Khởi tạo struct, enum


- Một số kỹ thuật thao tác trên struct, enum
- Dùng struct tham số cho hàm.


<b>7.2 Nội dung </b>



<b>7.2.1 Kiểu cấu trúc (Struct) </b>


<b>7.2.1.1 </b> <b>Khái niệm </b>


Struct là một dạng cấu trúc được dùng để định nghĩa một tập hợp các biến dưới
dạng một tên đơn giản.


Kiểu cấu trúc giúp các lập trình viên trong việc khai báo các thành phần là các
kiểu dữ liệu khác nhau.


<b>7.2.1.2 </b> <b>Khai báo kiểu struct </b>
<b>Cú pháp: </b>


<b>struct <tên_struct> </b>
{


//Danh_sách_biến
<b>}; </b>


<b>typedef struct <tên_struct> <TÊN_STRUCT>; </b>
<b>Trong đó: </b>


<b>- Tên_struct: tên cấu trúc do người dùng định nghĩa </b>
<b>- Danh_sách_biến: các tham số dữ liệu, thông tin. </b>


<i>Giả sử chúng ta muốn biểu diễn định nghĩa một cấu trúc gọi là date gồm có ba </i>
thành phần ngày, tháng và năm. Cú pháp của cấu trúc này như sau:


<b>struct date </b> //Từ khóa struct và tên cấu trúc
{



</div>
<span class='text_page_counter'>(138)</span><div class='page_container' data-page=138>

KHOA CÔNG NGHỆ THÔNG TIN Trang 137
<b>struct hocsinh </b>


<b>{ </b>


hoten char(20) ;
float toan ;
float ly ;
float hoa ;
} ;


<b>typdedef struct hocsinh HOCSINH; </b>


<b>Ví dụ 2: Khai báo định nghĩa phân số kiểu struct gồm các thông tin sau: tuso, mauso </b>
<b>struct phanso </b>


<b>{ </b>


float tuso;
float mauso;
};


<b>typdedef struct phanso PHANSO; </b>


<b>7.2.1.3 </b> <b>Tham khảo các thành phần trong struct </b>
HOCSINH hoten[20] toan ly hoa


hs hs.hoten hs.toan hs.ly hs.hoa



Để tham chiếu đến hoten trong HOCSINH ta gán biến HOCSINH với tên là hs và
<b>tham chiếu đến biến dữ liệu như sau: hs.hoten tương tự cho các biến còn lại. </b>


<b>Đối với biến khai báo kiểu con trỏ HOCSINH *hs thì tham chiếu đến bien hoten: hs </b>
<b>-> hoten. </b>


</div>
<span class='text_page_counter'>(139)</span><div class='page_container' data-page=139>

KHOA CÔNG NGHỆ THÔNG TIN Trang 138
<b>Hình 123: Màn hình giải ví dụ 3 mục 7.2.1.3 </b>


<i><b> Kết quả in ra màn hình </b></i>


</div>
<span class='text_page_counter'>(140)</span><div class='page_container' data-page=140>

KHOA CÔNG NGHỆ THÔNG TIN Trang 139
float toan;


float ly;
float hoa;
};


typedef struct hocsinh HOCSINH;
void nhap(HOCSINH hs)


{


float t,l,h;


cout<<"nhap ho ten: ";
fflush(stdin);


gets(hs.hoten);



cout<<"nhap diem toan: ";
cin>>t;


hs.toan=t;


cout<<"nhap diem ly: ";
cin>>l;


hs.ly=l;


cout<<"nhap diem hoa: ";
cin>>h;


hs.hoa=h;
}


void xuat(HOCSINH hs)
{


</div>
<span class='text_page_counter'>(141)</span><div class='page_container' data-page=141>

KHOA CÔNG NGHỆ THÔNG TIN Trang 140
cout<<"Ho ten: ";


puts(hs.hoten);


cout<<"Diem toan: "<<hs.toan<<"\tLy: "<<hs.ly<<"\tHoa: "<<hs.hoa;
}


int main(int argc, char *argv[])
{



HOCSINH n;
nhap(n);
xuat(n);


printf("\n");system("PAUSE");
return EXIT_SUCCESS;
}


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 125: Kết quả chương trình chạy ví dụ 4 mục 7.2.1.3 </b>
<b>7.2.1.4 </b> <b>Khởi tạo struct </b>


Việc khởi tạo các cấu trúc có sự khác biệt so với dạng biến thơng thường, các
phần tử trong cấu trúc được truy cập thông qua toán tử là dấu chấm. Các phần tử riêng
biệt được khởi tạo như sau:


</div>
<span class='text_page_counter'>(142)</span><div class='page_container' data-page=142>

KHOA CÔNG NGHỆ THÔNG TIN Trang 141
static struct DATE d = {17,12};


<i>Với trường hợp trên thì phần tử: year sẽ được khởi tạo là 0 </i>


Chuẩn ANSI hiện tại cho phép gán toàn bộ một biến cấu trúc cho một biến cấu
trúc khác có cùng số phần tử và mỗi phần tử tương ứng có cùng kiểu dữ liệu


<b>7.2.1.5 </b> <b>Struct lồng nhau </b>


</div>
<span class='text_page_counter'>(143)</span><div class='page_container' data-page=143>

KHOA CÔNG NGHỆ THÔNG TIN Trang 142
<b>Hình 126: Màn hình giải ví dụ 5 mục 7.2.1.5 </b>



<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 127: Kết quả chương trình chạy ví dụ 5 mục 7.2.1.5 </b>


<b>Ví dụ 6: Viết chương trình định nghĩa đường trịn dạng cấu trúc, nhập và xuất thơng </b>
tin đường trịn cho người dùng xem.


#include <cstdlib>
#include <iostream>
using namespace std;
struct diem


{


float x;
float y;
};


typedef struct diem DIEM;
struct Duongtron


{


DIEM I; //Toa do tâm I
float R;//Bán kính duong tròn
};


typedef struct Duongtron DUONGTRON;
void nhap(DIEM &d)



{


</div>
<span class='text_page_counter'>(144)</span><div class='page_container' data-page=144>

KHOA CÔNG NGHỆ THÔNG TIN Trang 143
cout<<"Toa do: ("<<d.x<<","<<d.y<<")";


}


void nhapdt(DUONGTRON &dt)
{


cout<<"Nhap tam:\n";
nhap(dt.I);


cout<<"Ban kinh R=";
cin>>dt.R;


}


void xuatdt(DUONGTRON dt)
{


cout<<"Tam duong tron vua nhap:\n";
xuat(dt.I);


cout<<"\nBan kinh R="<<dt.R;
}


int main(int argc, char *argv[])
{



DUONGTRON n;
nhapdt(n);


xuatdt(n);


printf("\n");system("PAUSE");
return EXIT_SUCCESS;
}


</div>
<span class='text_page_counter'>(145)</span><div class='page_container' data-page=145>

KHOA CÔNG NGHỆ THÔNG TIN Trang 144
<i><b>Hình 128: Kết quả chương trình chạy ví dụ 6 mục 7.2.1.5 </b></i>


<b>7.2.1.6 </b> <b>Sử dụng mảng các struct </b>


Ngôn ngữ C/C++<sub> khơng giới hạn lập trình viên chỉ được lưu trữ các kiểu dữ liệu </sub>
đơn giản trong một mảng. Người dùng có thể định nghĩa các cấu trúc đóng vai trị các
phần tử của một mảng.


<b>Ví dụ 7: Viết chương trình định nghĩa thông tin học sinh gồm họ tên, điểm tốn, </b>
điểm lý, điểm hóa kiểu cấu trúc, nhập và in danh sách học sinh.


#include <cstdlib>
#include <iostream>
using namespace std;
struct hocsinh


{


char hoten[20];


float toan;
float ly;
float hoa;
};


typedef struct hocsinh HOCSINH;
void nhap(HOCSINH hs[],int &n)
{


for(int i=0;i<n;i++)
{


</div>
<span class='text_page_counter'>(146)</span><div class='page_container' data-page=146>

KHOA CÔNG NGHỆ THÔNG TIN Trang 145
cout<<"nhap diem ly: ";


cin>>l;hs[i].ly=l;


cout<<"nhap diem hoa: ";
cin>>h;hs[i].hoa=h;
}


}


void xuat(HOCSINH hs[],int n)
{


cout<<"Danh sach hoc sinh vua nhap: \n";
for(int i=0;i<n;i++)


{



cout<<"\n"<<i+1<<")";
//puts(hs[i].hoten);


cout<<hs[i].hoten<<"\t\t\tDiem toan: "<<hs[i].toan<<"\tLy: "<<hs[i].ly<<"\tHoa:
"<<hs[i].hoa;


}
}


int main(int argc, char *argv[])
{


HOCSINH hs[100];
int n;


cout<<"Nhap so hoc sinh: ";
cin>>n;


</div>
<span class='text_page_counter'>(147)</span><div class='page_container' data-page=147>

KHOA CÔNG NGHỆ THÔNG TIN Trang 146
xuat(hs,n);




printf("\n");system("PAUSE");
return EXIT_SUCCESS;
}


<i><b> Kết quả in ra màn hình </b></i>



<b>Hình 129: Kết quả chương trình chạy ví dụ 7 mục 7.2.1.5 </b>
<b>Ví dụ 8: Cải tiến lại ví dụ trên như sau </b>


#include <cstdlib>
#include <iostream>
using namespace std;
struct hocsinh


{


</div>
<span class='text_page_counter'>(148)</span><div class='page_container' data-page=148>

KHOA CÔNG NGHỆ THÔNG TIN Trang 147
cout<<"nhap ho ten: ";


fflush(stdin);
gets(hs.hoten);


cout<<"nhap diem toan: ";
cin>>t;hs.toan=t;


cout<<"nhap diem ly: ";
cin>>l;hs.ly=l;


cout<<"nhap diem hoa: ";
cin>>h;hs.hoa=h;


return hs;
}


void nhap(HOCSINH hs[],int &n)
{



for(int i=0;i<n;i++)
{


cout<<"Nhap hoc sinh thu "<<i+1<<endl;
hs[i]=newhs();


}
}


void xuat(HOCSINH hs[],int n)
{


cout<<"Danh sach hoc sinh vua nhap: \n";
for(int i=0;i<n;i++)


</div>
<span class='text_page_counter'>(149)</span><div class='page_container' data-page=149>

KHOA CÔNG NGHỆ THÔNG TIN Trang 148
cout<<"\n"<<i+1<<")";


//puts(hs[i].hoten);


cout<<hs[i].hoten<<"\t\t\tDiem toan: "<<hs[i].toan<<"\tLy: "<<hs[i].ly<<"\tHoa:
"<<hs[i].hoa;


}
}


int main(int argc, char *argv[])
{



HOCSINH hs[100];
int n;


cout<<"Nhap so hoc sinh: ";
cin>>n;


nhap(hs,n);
xuat(hs,n);


printf("\n");system("PAUSE");
return EXIT_SUCCESS;
}


</div>
<span class='text_page_counter'>(150)</span><div class='page_container' data-page=150>

KHOA CƠNG NGHỆ THƠNG TIN Trang 149
<b>Hình 130: Kết quả chương trình chạy ví dụ 8 mục 7.2.1.5 </b>


Cấu trúc và con trỏ


Cũng giống như với một biến, chúng ta có thể khai báo một con trỏ trỏ tới một cấu trúc
<b>và gán địa chỉ mở đầu của cấu trúc cho nó. Đoạn mã sau sẽ giúp bạn hiểu về khái niệm này. </b>


<b>Ví dụ 9: Sử dụng con trỏ cấp phát cho danh sách học sinh: </b>
Từ ví dụ trên, hiệu chỉnh hàm main lại như sau:


{


//HOCSINH hs[100];
int n;


cout<<"Nhap so hoc sinh: ";


cin>>n;


HOCSINH *hs = (HOCSINH*)malloc(n * sizeof(HOCSINH));
nhap(hs,n);


xuat(hs,n);


</div>
<span class='text_page_counter'>(151)</span><div class='page_container' data-page=151>

KHOA CÔNG NGHỆ THÔNG TIN Trang 150
return EXIT_SUCCESS;


}


<b>7.2.2 Enum </b>


<b>7.2.2.1 </b> <b>Khái niệm </b>


Một Enumeration (liệt kê) là một tập hợp các hằng số nguyên được đặt tên. Một
<b>kiểu enum được khai báo bởi sử dụng từ khóa enum trong C#. </b>


Các kiểu liệt kê trong C/C++<sub> là kiểu dữ liệu giá trị. Nói cách khác, kiểu liệt kê chứa </sub>
các giá trị của nó và khơng thể kế thừa hoặc khơng thể truyền tính kế thừa.


<b>Cú pháp: </b>


<b>enum <tên_enum> </b>
{


danh_sách_enum
};



<b>typedef enum <tên_enum> <TÊN_ENUM>; </b>
<b>Trong đó: </b>


<b>- tên_enum: xác định tên kiểu liệt kê. </b>


<b>- danh_sách_enum: là danh sách các định danh được phân biệt nhau bởi </b>
dấu phẩy.


<b>Chú ý: enum phải viết bằng chữ thường. </b>


Mỗi biến trong danh sách liệt kê này đại diện cho một giá trị nguyên. Theo mặc
định, giá trị của biến kiểu liệt kê đầu tiên là 0, biến kế tiếp tăng dần lên 1 đơn vị.


<b>Ví dụ 10: Định nghĩa kiểu enum về các hãng xe </b>
<b>enum e_acomany { </b>


</div>
<span class='text_page_counter'>(152)</span><div class='page_container' data-page=152>

KHOA CÔNG NGHỆ THÔNG TIN Trang 151
red=1,


orange=2,
yellow=3,
green,
blue=8,
indigo=8,
violet=16
} ;


typedef enum rainbowcolors RAINBOWCOLORS;


Nếu chúng ta chỉ định một giá trị nguyên cho một giá trị nào đó của biến kiểu dữ liệu


liệt kê thì các giá trị tiếp theo sẽ là các giá trị nguyên tiếp theo.


<b>7.2.2.3 </b> <b>Các ví dụ </b>


<b>Ví dụ 12: Thực hiện lựa chọn màu cho hoa quả có 3 màu như sau: orange, guava, apple. </b>
#include <cstdlib>


#include <iostream>
using namespace std;
enum Fruits{


orange,
guava,
apple
};


</div>
<span class='text_page_counter'>(153)</span><div class='page_container' data-page=153>

KHOA CÔNG NGHỆ THÔNG TIN Trang 152
FRUITS myFruit;


int i;


cout << "Please enter the fruit of your choice(0 to 2)::";
cin >> i;


switch(i)
{


case orange:


cout << "Your fruit is orange";


break;


case guava:


cout << "Your fruit is guava";
break;


case apple:


cout << "Your fruit is apple";
break;


}


printf("\n");system("PAUSE");
return EXIT_SUCCESS;
}


<i><b> Kết quả in ra màn hình </b></i>


<b>Hình 131: Kết quả chương trình chạy ví dụ 12 mục 7.2.2.3 </b>


</div>
<span class='text_page_counter'>(154)</span><div class='page_container' data-page=154>

KHOA CÔNG NGHỆ THÔNG TIN Trang 153
Cadillac=11,


Ford=44,
Jaguar=45,
Lexus,



Maybach=55,
RollsRoyce=65,
Saab=111
};


typedef enum e_acomany E_ACOMANY;
int main(int argc, char *argv[])


{


E_ACOMANY e;
e=Lexus;


cout<<"Lexus: "<<e<<endl;


e=Maybach;


cout<<"Maybach: "<<e<<endl;


printf("\n");system("PAUSE");
return EXIT_SUCCESS;
}


</div>
<span class='text_page_counter'>(155)</span><div class='page_container' data-page=155>

KHOA CÔNG NGHỆ THÔNG TIN Trang 154
<b>Hình 132: Kết quả chương trình chạy ví dụ 13 mục 7.2.2.3 </b>


<b>7.3 Bài tập </b>



1. Viết chương nhập xuất điểm trong mặt phẳng kiểu số thực, tính khoảng cách giữa 2
điểm, tọa độ trọng tâm giữa 3 điểm.


2. Viết chương trình thực hiện: Nhập vào tạo độ 3 điểm A,B,C trong khơng gian, tính
độ dài 3 đoạn thẳng AB, AC, BC và kiểm tra xem A, B, C có thẳng hàng không?


3. Viết các hàm thực hiện: Nhập thông tin SV gồm: họ tên, địa chỉ, tuổi, điểm tốn, lý,
hóa. Tính điểm tổng kết, in thơng tin sinh viên.


4. Viết chương trình nhập vào ngày tháng năm, xuất cho người dùng xem ngày hôm
qua.


5. Định nghĩa 1 dãy cấu trúc có thể được dùng làm danh bạ điện thoại, gồm có tên, địa
chỉ, số điện thoại, với số mẫu tin tối đa là 40. Viết chương trình với các chức năng sau: nhập
thơng mới, tìm kiếm số điện thoại, in danh sách theo quận.


6. Viết chương trình đọc vào tên, địa chỉ, sắp xếp tên và địa chỉ theo thứ tự alphabet,
sau đó hiển thị danh sách đã được sắp xếp.


7. Viết chương trình nhận vào các thơng tin sau: Tên đội bóng, số trận thắng, số trận
hòa, số trận thua. In ra đội bóng có số điểm cao nhất (với 1 trận thắng = 3 điểm, 1 trận hòa = 1
điểm và 1 trận thua = 0 điểm).


8. Xây dựng cấu trúc gồm: Họ tên, ngày sinh, trường, số báo danh, điểm thi. Trong đó,
điểm thi là cấu trúc gồm 3 mơn: Tốn, Lý, Hóa. Nhập liệu vào khoảng 10 thí sinh, tìm và in ra
các thí sinh có tổng điểm 3 mơn >= 15.


9. Viết chương trình tạo lập và tìm kiếm dữ liệu. Nội dung yêu cầu gồm: Nhập họ và
tên, địa chỉ (gồm: Quận, phường, tổ), tuổi, lương. Tìm kiếm những người ở Quận 3 có tuổi dưới
30 thu nhập từ 500.000đ trở lên và in ra màn hình.



</div>
<span class='text_page_counter'>(156)</span><div class='page_container' data-page=156>

KHOA CÔNG NGHỆ THÔNG TIN Trang 155
[4] Phạm Văn Ất, Giáo trình kỹ thuật lập trình C – Căn bản và Nâng cao, Giao thông vận tải,
2006


[5] Nguyễn Ngọc Cương, Giáo trình ngơn ngữ lập trình C/C++<sub>, Thơng tin và truyền thơng, </sub>
2015


[6] truy cập 2/6/2016
[7] truy cập ngày 2/6/2016


[8] , truy cập ngày 25/7/2016


[9] truy cập ngày 6/8/2016


</div>
<span class='text_page_counter'>(157)</span><div class='page_container' data-page=157>

KHOA CÔNG NGHỆ THÔNG TIN Trang 156
<b>Phụ lục </b>


<b>Chú thích hình ảnh </b>


Hình 1: Khởi động ứng dụng Dev-C++ ... 20


Hình 2: Màn hình đặt tên project ... 20


Hình 3: Màn hình sau khi khởi động thành cơng ... 21


Hình 4: Màn hình giải ví dụ 1 mục 3.2.1.1 ... 32


Hình 5: Kết quả chương trình chạy ví dụ 1 mục 3.2.1.1 ... 33



Hình 6: Màn hình giải ví dụ 2 mục 3.2.1.1 ... 34


Hình 7: Kết quả chương trình chạy ví dụ 2 mục 3.2.1.1 ... 34


Hình 8: Màn hình giải ví dụ 3 mục 3.2.1.2 ... 36


Hình 9: Kết quả chương trình chạy ví dụ 3 mục 3.2.1.2 ... 37


Hình 10: Màn hình giải ví dụ 4 mục 3.2.1.2 ... 38


Hình 11: Kết quả chương trình chạy ví dụ 4 mục 3.2.1.2 ... 39


Hình 12: Màn hình giải ví dụ 5 mục 3.2.1.3 ... 41


Hình 13: Kết quả chương trình chạy ví dụ 5 mục 3.2.1.3 ... 41


Hình 14: Màn hình giải ví dụ 6 mục 3.2.1.3 ... 43


Hình 15: Kết quả chương trình chạy ví dụ 6 mục 3.2.1.3 ... 43


Hình 16: Màn hình giải ví dụ 7 mục 3.2.1.3 ... 45


Hình 17: Kết quả chương trình chạy ví dụ 7 mục 3.2.1.3 ... 45


Hình 18: Màn hình giải ví dụ 8 mục 3.2.1.4 ... 47


Hình 19: Kết quả chương trình chạy ví dụ 8 mục 3.2.1.4 ... 47


Hình 20: Màn hình giải ví dụ 9 mục 3.2.1.4 ... 48



Hình 21: Kết quả chương trình chạy ví dụ 9 mục 3.2.1.4 ... 48


Hình 22: Màn hình giải ví dụ 10 mục 3.2.1.4 ... 49


Hình 23: Kết quả chương trình chạy ví dụ 10 mục 3.2.1.4 ... 49


Hình 24: Màn hình giải ví dụ 11 mục 3.2.1.4 ... 50


Hình 25: Kết quả chương trình chạy ví dụ 11 mục 3.2.1.4 ... 50


Hình 26: Màn hình giải ví dụ 12 mục 3.2.1.4 ... 51


Hình 27: Kết quả chương trình chạy ví dụ 12 mục 3.2.1.4 ... 52


</div>
<span class='text_page_counter'>(158)</span><div class='page_container' data-page=158>

KHOA CÔNG NGHỆ THÔNG TIN Trang 157


Hình 35: Kết quả chương trình chạy ví dụ 16 mục 3.2.2.1 ... 57


Hình 36: Màn hình giải ví dụ 17 mục 3.2.2.1 ... 58


Hình 37: Kết quả chương trình chạy ví dụ 17 mục 3.2.2.1 ... 58


Hình 38: Màn hình giải ví dụ 19 mục 3.2.2.1 ... 59


Hình 39: Kết quả chương trình chạy ví dụ 19 mục 3.2.2.1 ... 59


Hình 40: Màn hình giải ví dụ 20 mục 3.2.2.1 ... 60


Hình 41: Kết quả chương trình chạy ví dụ 20 mục 3.2.2.1 ... 60



Hình 42: Màn hình giải ví dụ 21 mục 3.2.2.2 ... 62


Hình 43: Kết quả chương trình chạy ví dụ 21 mục 3.2.2.2 ... 62


Hình 44: Màn hình giải ví dụ 21 mục 3.2.2.2 ... 63


Hình 45: Kết quả chương trình chạy ví dụ 21 mục 3.2.2.2 ... 63


Hình 46: Màn hình giải ví dụ 22 mục 3.2.2.2 ... 64


Hình 47: Kết quả chương trình chạy ví dụ 22 mục 3.2.2.2 ... 64


Hình 48: Màn hình giải ví dụ 23 mục 3.2.2.3 ... 65


Hình 49: Kết quả chương trình chạy ví dụ 23 mục 3.2.2.3 ... 66


Hình 50: Màn hình giải ví dụ 24 mục 3.2.2.3 ... 67


Hình 51: Kết quả chương trình chạy ví dụ 24 mục 3.2.2.3 ... 67


Hình 52: Màn hình giải ví dụ 25 mục 3.2.2.4 ... 67


Hình 53: Kết quả chương trình chạy ví dụ 25 mục 3.2.2.4 ... 68


Hình 54: Màn hình giải ví dụ 26 mục 3.2.2.4 ... 68


Hình 55: Kết quả chương trình chạy ví dụ 26 mục 3.2.2.4 ... 69


Hình 56: Màn hình giải ví dụ 27 mục 3.2.2.5 ... 69



Hình 57: Kết quả chương trình chạy ví dụ 27 mục 3.2.2.5 ... 70


</div>
<span class='text_page_counter'>(159)</span><div class='page_container' data-page=159>

KHOA CÔNG NGHỆ THÔNG TIN Trang 158


Hình 59: Kết quả chương trình chạy ví dụ 28 mục 3.2.2.6 ... 71


Hình 60: Màn hình giải ví dụ 29 mục 3.2.2.6 ... 71


Hình 61: Kết quả chương trình chạy ví dụ 29 mục 3.2.2.6 ... 71


Hình 62: Màn hình giải ví dụ 30 mục 3.2.2.6 ... 72


Hình 63: Kết quả chương trình chạy ví dụ 30 mục 3.2.2.6 ... 72


Hình 64: Màn hình giải ví dụ 1 mục 4.2.1.3 ... 80


Hình 65: Kết quả chương trình chạy ví dụ 1 mục 4.2.1.3 ... 81


Hình 66: Màn hình giải ví dụ 2 mục 4.2.1.3 ... 82


Hình 67: Kết quả chương trình chạy ví dụ 2 mục 4.2.1.3 ... 82


Hình 68: Màn hình giải ví dụ 3 mục 4.2.1.3 ... 83


Hình 69: Kết quả chương trình chạy ví dụ 3 mục 4.2.1.3 ... 83


Hình 70: Màn hình giải ví dụ 5 mục 4.2.3.3 ... 86


Hình 71: Kết quả chương trình chạy ví dụ 5 mục 4.2.3.3 ... 86



Hình 72: Màn hình giải ví dụ 6 mục 4.2.3.3 ... 87


Hình 73: Kết quả chương trình chạy ví dụ 6 mục 4.2.3.3 ... 87


Hình 74: Màn hình giải ví dụ 7 mục 4.2.4 ... 88


Hình 75: Màn hình giải ví dụ 8 mục 4.2.4 ... 88


Hình 76: Kết quả chương trình chạy ví dụ 8 mục 4.2.4 ... 89


Hình 77: Màn hình giải ví dụ 11 mục 4.2.5.2 ... 91


Hình 78: Kết quả chương trình chạy ví dụ 11 mục 4.2.5.2 ... 91


Hình 79: Kết quả chương trình chạy ví dụ 12 mục 4.2.5.2 ... 93


Hình 80: Kết quả chương trình chạy ví dụ 13 mục 4.2.5.2 ... 94


Hình 81: Màn hình giải ví dụ 3 mục 5.2.1.3 ... 98


Hình 82: Kết quả chương trình chạy ví dụ 3 mục 5.2.1.3 ... 98


Hình 83: Màn hình giải ví dụ 4 mục 5.2.1.3 ... 99


Hình 84: Kết quả chương trình chạy ví dụ 4 mục 5.2.1.3 ... 99


Hình 85: Màn hình giải ví dụ 5 mục 5.2.1.3 ... 100


Hình 86: Kết quả chương trình chạy ví dụ 5 mục 5.2.1.3 ... 100



Hình 87: Màn hình giải ví dụ 10 mục 5.2.1.5 ... 104


</div>
<span class='text_page_counter'>(160)</span><div class='page_container' data-page=160>

KHOA CÔNG NGHỆ THÔNG TIN Trang 159


Hình 95: Màn hình giải ví dụ 15 mục 5.2.2.2 ... 111


Hình 96: Kết quả chương trình chạy ví dụ 15 mục 5.2.2.2 ... 111


Hình 97: Màn hình giải ví dụ 16 mục 5.2.2.2 ... 112


Hình 98: Kết quả chương trình chạy ví dụ 16 mục 5.2.2.2 ... 112


Hình 99: Màn hình giải ví dụ 17 mục 5.2.2.2 ... 112


Hình 100: Kết quả chương trình chạy ví dụ 17 mục 5.2.2.2 ... 113


Hình 101: Màn hình giải ví dụ 18 mục 5.2.2.3 ... 114


Hình 102: Kết quả chương trình chạy ví dụ 18 mục 5.2.2.3 ... 114


Hình 103: Màn hình giải ví dụ 1 mục 6.2.1.4 ... 121


Hình 104: Kết quả chương trình chạy ví dụ 1mục 6.2.1.4 ... 122


Hình 105: Màn hình giải ví dụ 2 mục 6.2.1.4 ... 122


Hình 106: Kết quả chương trình chạy ví dụ 2 mục 6.2.1.4 ... 123


Hình 107: Màn hình giải ví dụ 5 mục 6.2.2.1 ... 125



Hình 108: Kết quả chương trình chạy ví dụ 5 mục 6.2.2.1 ... 126


Hình 109: Màn hình giải ví dụ 6 mục 6.2.2.1 ... 126


Hình 110: Kết quả chương trình chạy ví dụ 6 mục 6.2.2.1 ... 126


Hình 111: Màn hình giải ví dụ 7 mục 6.2.2.2 ... 128


Hình 112: Kết quả chương trình chạy ví dụ 7 mục 6.2.2.2 ... 128


Hình 113: Màn hình giải ví dụ 8 mục 6.2.2.2 ... 129


Hình 114: Kết quả chương trình chạy ví dụ 8 mục 6.2.2.2 ... 130


Hình 115: Màn hình giải ví dụ 9 mục 6.2.2.3 ... 130


Hình 116: Kết quả chương trình chạy ví dụ 9 mục 6.2.2.3 ... 131


Hình 117: Màn hình giải ví dụ 10 mục 6.2.2.3 ... 131


</div>
<span class='text_page_counter'>(161)</span><div class='page_container' data-page=161>

KHOA CÔNG NGHỆ THÔNG TIN Trang 160


Hình 119: Màn hình giải ví dụ 11 mục 6.2.2.3 ... 132


Hình 120: Kết quả chương trình chạy ví dụ 11 mục 6.2.2.3 ... 133


Hình 121: Màn hình giải ví dụ 12 mục 6.2.2.4 ... 134


Hình 122: Kết quả chương trình chạy ví dụ 12 mục 6.2.2.4 ... 135



Hình 123: Màn hình giải ví dụ 3 mục 7.2.1.3 ... 138


Hình 124: Kết quả chương trình chạy ví dụ 3 mục 7.2.1.3 ... 138


Hình 125: Kết quả chương trình chạy ví dụ 4 mục 7.2.1.3 ... 140


Hình 126: Màn hình giải ví dụ 5 mục 7.2.1.5 ... 142


Hình 127: Kết quả chương trình chạy ví dụ 5 mục 7.2.1.5 ... 142


Hình 128: Kết quả chương trình chạy ví dụ 6 mục 7.2.1.5 ... 144


Hình 129:Kết quả chương trình chạy ví dụ 7 mục 7.2.1.5 ... 146


Hình 130: Kết quả chương trình chạy ví dụ 8 mục 7.2.1.5 ... 149


Hình 131: Kết quả chương trình chạy ví dụ 12 mục 7.2.2.3 ... 152


Hình 132: Kết quả chương trình chạy ví dụ 13 mục 7.2.2.3 ... 154


<b>Bảng biểu </b>
Bảng 1: Các kiểu dữ liệu cơ bản trong C ... 7


Bảng 2: Các từ khóa trong C/C++<sub> ... 9 </sub>


Bảng 3: Các phép toán ... 11


Bảng 4: Các phép toán tử quan hệ ... 12


Bảng 5: Các toán tử logic ... 12



Bảng 6: Bảng chân trị cho các toán tử Logic ... 12


Bảng 7: Bảng toán tử bit ... 13


Bảng 8: Bảng chân trị của toán tử ^ (XOR) ... 13


Bảng 9: Ý nghĩa của một số hàm có sẵn thường dùng ... 16


Bảng 10: Bảng ký hiệu lưu đồ ... 17


Bảng 11: Bảng mã định dạng nhập/xuất ... 23


Bảng 12: Bảng điều mã điều khiển nhập/xuất ... 24


Bảng 13: Bảng so sánh kết quả truyền tham biến và tham trị ... 83


Bảng 14: Bảng biểu diễn mảng 2 chiều ... 101


</div>

<!--links-->
Giáo trình bài tập kỹ thuật lập trình C - MỞ ĐẦU
  • 2
  • 1
  • 16
  • ×