CHƯƠNG 1 CÁC KHÁI NIỆM CƠ BẢN CỦA C++

Màu nền
Font chữ
Font size
Chiều cao dòng

Các yếu tố cơ bản 

Môi trường làm việc của C++

Các bước để tạo và thực hiện một chương trình 

Vào/ra trong C++

I. CÁC YẾU TỐ CƠ BẢN

Một ngôn ngữ lập trình (NNLT) bậc cao cho phép người sử dụng (NSD) biểu 

hiện ý tưởng của mình để giải quyết một vấn đề, bài toán bằng cách diễn đạt gần với 

ngôn ngữ thông thường thay vì phải diễn đạt theo ngôn ngữ máy (dãy các kí hiệu 0,1). 

Hiển nhiên, các ý tưởng NSD muốn trình bày phải được viết theo một cấu trúc chặt chẽ 

thường được gọi là thuật toán hoặc giải thuật và theo đúng các qui tắc của ngôn ngữ 

gọi là cú pháp hoặc văn phạm. Trong giáo trình này chúng ta bàn đến một ngôn ngữ 

lập trình như vậy, đó là ngôn ngữ lập trình C++ và làm thế nào để thể hiện các ý tưởng 

giải quyết vấn đề bằng cách viết thành chương trình trong C++. 

Trước hết, trong mục này chúng ta sẽ trình bày về các qui định bắt buộc đơn giản 

và cơ bản nhất. Thông thường các qui định này sẽ được nhớ dần trong quá trình học 

ngôn ngữ, tuy nhiên để có một vài khái niệm tương đối hệ thống về NNLT C++ chúng 

ta trình bày sơ lược các khái niệm cơ bản đó. Người đọc đã từng làm quen với các 

NNLT khác có thể đọc lướt qua phần này.

1. Bảng ký tự của C++

Hầu hết các ngôn ngữ lập trình hiện nay đều sử dụng các kí tự tiếng Anh, các kí 

hiệu thông dụng và các con số để thể hiện chương trình. Các kí tự của những ngôn ngữ 

khác không được sử dụng (ví dụ các chữ cái tiếng Việt). Dưới đây là bảng kí tự được 

phép dùng để tạo nên những câu lệnh của ngôn ngữ C++.

 Các chữ cái la tinh (viết thường và viết hoa): a .. z và A .. Z. Cùng một chữ cái 

nhưng viết thường phân biệt với viết hoa. Ví dụ chữ cái 'a' là khác với 'A'. 

 Dấu gạch dưới: _

 Các chữ số thập phân: 0, 1, . ., 9.

Chương 1. Các khái niệm cơ bản của C++

2

 Các ký hiệu toán học: +, -, *, /, % , &, ||, !, >, <, = ...

 Các ký hiệu đặc biệt khác: , ;: [ ], {}, #, dấu cách, ...

2. Từ khoá

Một từ khoá là một từ được qui định trước trong NNLT với một ý nghĩa cố định, 

thường dùng để chỉ các loại dữ liệu hoặc kết hợp thành câu lệnh. NSD có thể tạo ra 

những từ mới để chỉ các đối tượng của mình nhưng không được phép trùng với từ 

khoá. Dưới đây chúng tôi liệt kê một vài từ khoá thường gặp, ý nghĩa của các từ này, sẽ 

được trình bày dần trong các đề mục liên quan.

auto, break, case, char, continue, default, do, double, else, externe, float,

for, goto, if, int, long, register, return, short, sizeof, static, struct, switch,

typedef, union, unsigned, while ...

Một đặc trưng của C++ là các từ khoá luôn luôn được viết bằng chữ thường.

3. Tên gọi 

Để phân biệt các đối tượng với nhau chúng cần có một tên gọi. Hầu hết một đối 

tượng được viết ra trong chương trình thuộc 2 dạng, một dạng đã có sẵn trong ngôn 

ngữ (ví dụ các từ khoá, tên các hàm chuẩn ...), một số do NSD tạo ra dùng để đặt tên 

cho hằng, biến, kiểu, hàm ... các tên gọi do NSD tự đặt phải tuân theo một số qui tắc 

sau:

 Là dãy ký tự liên tiếp (không chứa dấu cách) và phải bắt đầu bằng chữ cái 

hoặc gạch dưới. tin_hoc_4

 Phân biệt kí tự in hoa và thường. 

 Không được trùng với từ khóa. 

 Số lượng chữ cái dùng để phân biệt tên gọi có thể được đặt tuỳ ý.

 Chú ý các tên gọi có sẵn của C++ cũng tuân thủ theo đúng qui tắc trên.

Trong một chương trình nếu NSD đặt tên sai thì trong quá trình xử lý sơ bộ (trước 

khi chạy chương trình) máy sẽ báo lỗi (gọi là lỗi văn phạm). 

Ví dụ 1 :

 Các tên gọi sau đây là đúng (được phép): i, i1, j, tinhoc, tin_hoc, luu_luong 

 Các tên gọi sau đây là sai (không được phép): 1i, tin hoc, luu-luong-nuoc 

 Các tên gọi sau đây là khác nhau: ha_noi, Ha_noi, HA_Noi, HA_NOI, ... Chương 1. Các khái niệm cơ bản của C++

3

4. Chú thích trong chương trình

Một chương trình thường được viết một cách ngắn gọn, do vậy thông thường bên 

cạnh các câu lệnh chính thức của chương trình, NSD còn được phép viết vào chương 

trình các câu ghi chú, giải thích để làm rõ nghĩa hơn chương trình. Một chú thích có thể 

ghi chú về nhiệm vụ, mục đích, cách thức của thành phần đang được chú thích như 

biến, hằng, hàm hoặc công dụng của một đoạn lệnh ... Các chú thích sẽ làm cho 

chương trình sáng sủa, dễ đọc, dễ hiểu và vì vậy dễ bảo trì, sửa chữa về sau. 

Có 2 cách báo cho chương trình biết một đoạn chú thích:

 Nếu chú thích là một đoạn kí tự bất kỳ liên tiếp nhau (trong 1 dòng hoặc trên 

nhiều dòng) ta đặt đoạn chú thích đó giữa cặp dấu đóng mở chú thích /* (mở) 

và */ (đóng).

 Nếu chú thích bắt đầu từ một vị trí nào đó cho đến hết dòng, thì ta đặt dấu // ở 

vị trí đó. Như vậy // sử dụng cho các chú thích chỉ trên 1 dòng. 

Như đã nhắc ở trên, vai trò của đoạn chú thích là làm cho chương trình dễ hiểu 

đối với người đọc, vì vậy đối với máy các đoạn chú thích sẽ được bỏ qua. Lợi dụng đặc 

điểm này của chú thích đôi khi để tạm thời bỏ qua một đoạn lệnh nào đó trong chương 

trình (nhưng không xoá hẳn để khỏi phải gõ lại khi cần dùng đến) ta có thể đặt các dấu 

chú thích bao quanh đoạn lệnh này (ví dụ khi chạy thử chương trình, gỡ lỗi ...), khi cần 

sử dụng lại ta có thể bỏ các dấu chú thích.

Chú ý: Cặp dấu chú thích /* ... */ không được phép viết lồng nhau, ví dụ dòng chú 

thích sau là không được phép

/* Đây là đoạn chú thích /* chứa đoạn chú thích này */ như đoạn chú thích con */

cần phải sửa lại như sau: 

 hoặc chỉ giữ lại cặp dấu chú thích ngoài cùng 

/* Đây là đoạn chú thích chứa đoạn chú thích này như đoạn chú thích con */

 hoặc chia thành các đoạn chú thích liên tiếp nhau

/* Đây là đoạn chú thích */ /*chứa đoạn chú thích này*/ /*như đoạn chú thích con */

II. MÔI TRƯỜNG LÀM VIỆC CỦA C++

1. Khởi động - Thoát khỏi C++

Khởi động C++ cũng như mọi chương trình khác bằng cách nhấp đúp chuột lên 

biểu tượng của chương trình. Khi chương trình được khởi động sẽ hiện ra giao diện 

gồm có menu công việc và một khung cửa sổ bên dưới phục vụ cho soạn thảo. Một con Chương 1. Các khái niệm cơ bản của C++

4

trỏ nhấp nháy trong khung cửa sổ và chúng ta bắt đầu nhập nội dung (văn bản) chương 

trình vào trong khung cửa sổ soạn thảo này.

Để kết thúc làm việc với C++ (soạn thảo, chạy chương trình ...) và quay về môi 

trường Windows ta bấm chuột vào nút tắt cửa sổ (x) trên thanh tiêu đề của cửa sổ.

2. Giao diện và cửa sổ soạn thảo

a. Mô tả chung

Khi gọi chạy C++ trên màn hình sẽ xuất hiện một menu xổ xuống và một cửa sổ 

soạn thảo. Trên menu gồm có các nhóm chức năng: File, Edit, Search, Run, Compile, 

Debug, Project, Options, Window, Help. Để kích hoạt các nhóm chức năng, có thể 

ấn Alt+chữ cái biểu thị cho menu của chức năng đó (là chữ cái có gạch dưới). Ví dụ để 

mở nhóm chức năng File ấn Alt+F, sau đó dịch chuyển hộp sáng đến mục cần chọn rồi 

ấn Enter. Để thuận tiện cho NSD, một số các chức năng hay dùng còn được gắn với 

một tổ hợp các phím cho phép người dùng có thể chọn nhanh chức năng này mà không 

cần thông qua việc mở menu như đã mô tả ở trên. Một số tổ hợp phím cụ thể đó sẽ 

được trình bày vào cuối phần này. 

Các bộ chương trình dịch hỗ trợ người lập trình một môi trường tích hợp tức 

ngoài chức năng soạn thảo, nó còn cung cấp nhiều chức năng, tiện ích khác giúp người 

lập trình vừa có thể soạn thảo văn bản chương trình vừa gọi chạy chương trình vừa gỡ 

lỗi … 

Các chức năng liên quan đến soạn thảo phần lớn giống với các bộ soạn thảo khác 

(như WinWord) do vậy chúng tôi chỉ trình bày tóm tắt mà không trình bày chi tiết ở 

đây. 

b. Các chức năng soạn thảo

Hầu hết các bộ soạn thảo văn bản đều dùng menu và các phím tương tự nhau, ở 

đây chúng tôi chọn trình bày tóm tắt về bộ soạn thảo của Dev-C++: 

 Dịch chuyển con trỏ: các phím mũi tên cho phép dịch chuyển con trỏ sang 

trái, phải một kí tự hoặc lên trên, xuống dưới 1 dòng. Để dịch chuyển nhanh 

có các phím như Home (về đầu dòng), End (về cuối dòng), PgUp, PgDn (lên, 

xuống một trang màn hình). Để dịch chuyển xa hơn có thể kết hợp các phím 

này cùng phím Control (Ctrl, ^) như ^PgUp: về đầu tệp, ^PgDn: về cuối tệp.

 Chèn, xoá, sửa: Phím Insert cho phép chuyển chế độ soạn thảo giữa chèn và 

đè. Các phím Delete, Backspace cho phép xoá một kí tự tại vị trí con trỏ và 

trước vị trí con trỏ (xoá lùi).

 Các thao tác với khối dòng: Để đánh dấu khối dòng (thực chất là khối kí tự Chương 1. Các khái niệm cơ bản của C++

5

liền nhau bất kỳ) ta đưa con trỏ chuột đến vị trí đầu và kéo rê chuột (giữ tay 

trên phím trái) đến vị trí cuối, khi đó khối kí tự đuợc đánh dấu sẽ chuyển mầu 

nền. Một khối được đánh dấu có thể dùng để cắt, dán vào một nơi khác trong 

văn bản hoặc xoá khỏi văn bản. 

 Để thực hiện thao tác cắt dán, đầu tiên phải đưa khối đã đánh dấu vào bộ nhớ 

đệm bằng nhóm phím Shift-Delete hoặc Ctrl-X (cắt), sau đó dịch chuyển con 

trỏ đến vị trí mới cần hiện nội dung vừa cắt và ấn tổ hợp phím Shift-Insert 

hoặc Ctrl-P. Một đoạn văn bản đã được ghi vào bộ nhớ đệm có thể được dán 

nhiều lần vào nhiều vị trí khác nhau bằng cách lặp lại tổ hợp phím Shift-Insert, 

Ctrl-P tại các vị trí khác nhau trong văn bản. Để xoá một khối dòng đã đánh 

dấu mà không ghi vào bộ nhớ đệm, dùng tổ hợp phím Ctrl-Delete. Khi một 

nội dung mới ghi vào bộ nhớ đệm thì nó sẽ xoá (ghi đè) nội dung cũ đã có, do 

vậy cần cân nhắc để sử dụng phím Ctrl-Delete (xoá và không lưu lại nội dung 

vừa xoá vào bộ đệm) và Shift-Delete (xoá và lưu lại nội dung vừa xoá) một 

cách phù hợp.

 Tổ hợp phím Ctrl-A rất thuận lợi khi cần đánh dấu nhanh toàn bộ văn bản.

c. Chức năng tìm kiếm và thay thế

Chức năng này dùng để dịch chuyển nhanh con trỏ văn bản đến từ cần tìm. Để 

thực hiện tìm kiếm bấm Ctrl-F, tìm kiếm và thay thế bấm Ctrl-R. Vào từ hoặc nhóm từ 

cần tìm vào cửa sổ Find và nhóm thay thế (nếu dùng Ctrl-R) vào cửa sổ Replace và 

đánh dấu vào các tuỳ chọn (nếu cần) trong các ô bên dưới sau đó ấn Enter. Các tuỳ 

chọn gồm: không phân biệt chữ hoa/thường, tìm từ độc lập hay đứng trong từ khác, tìm 

trong toàn văn bản hay chỉ trong phần được đánh dấu, chiều tìm đi đến cuối hay ngược 

về đầu văn bản, thay thế có hỏi lại hay không hỏi lại … 

d. Các chức năng liên quan đến tệp

 Soạn thảo tệp mới: Chọn menu File\New\Source File hoặc nhanh hơn bằng 

cách ấn Ctrl-N. Hiện ra cửa sổ soạn thảo trắng và tên file tạm thời lấy là 

Untitled.cpp.

 Ghi tệp lên đĩa: Chọn menu File\Save hoặc ấn phím Ctrl-S. Nếu tên tệp chưa 

có (còn mang tên Untitled.cpp) máy sẽ yêu cầu cho tên tệp. Phần mở rộng của 

tên tệp được mặc định là cpp. 

 Soạn thảo tệp cũ: Nếu tệp cũ đã được mở (mỗi lúc có thể được mở nhiều tệp 

để soạn thảo, nhưng chỉ nội dung 1 tệp được hiện trên màn hình để sử dụng), 

tên các tệp đã được mở sẽ xuất hiện trên thanh tiêu đề ngang của cửa sổ soạn 

thảo, nhấp chuột vào tên tệp cần sử dụng, nội dung tệp sẽ hiện ra để soạn thảo. 

Nếu tệp cũ chưa được mở (hoặc đã đóng lại trong lần mở trước), chọn menu

Chương 1. Các khái niệm cơ bản của C++

6

File\Open Project or File hoặc ấn phím Ctrl-O, nhập tên tệp hoặc chọn tệp 

trong vùng danh sách tệp bên dưới. 

Sau mỗi lần sửa chữa tệp cũ (tên tệp ghi trên thanh tiêu đề sẽ có thêm dấu * để 

báo tệp đã sửa chữa nhưng chưa được ghi lại) nên ghi lại (Ctrl-S) trước khi 

dịch và chạy chương trình. 

 Ghi tệp đang soạn thảo lên đĩa với tên mới: Chọn menu File\Save As hoặc 

Ctrl-F12 và nhập tên tệp mới vào rồi ấn Enter.

 Đóng tệp đang soạn thảo: Chọn menu File\Close hoặc Ctrl-F4. Để đóng tất cả 

file đang soạn thảo chọn File\Close All. 

e. Chức năng dịch và chạy chương trình 

 Ctrl-F9: Dịch chương trình sang file mã máy.

 Ctrl-F10: Chạy chương trình (nếu chương trình đã được dịch xong trước đó).

 F9: Dịch và chạy chương trình.

Các chức năng liên quan đến dịch chương trình có thể được chọn thông qua 

menu Compile (Alt-C).

f. Tóm tắt một số phím nóng hay dùng

 Ctrl-A: Đánh dấu toàn bộ văn bản.

 Shift-Delete: Xoá khối văn bản được đánh dấu, lưu nó vào bộ nhớ đệm.

 Shift-Insert: Dán khối văn bản trong bộ nhớ đệm vào văn bản tại vị trí con trỏ.

 Ctrl-F: Tìm kiếm

 Ctrl-R: Thay thế

 Ctrl-S: ghi tệp lên đĩa.

 Ctrl-O: mở tệp cũ ra sửa chữa

 Ctrl-N: soạn thảo tệp mới.

 Ctrl-F9: Dịch chương trình.

 Ctrl-F10: Chạy chương trình.

 F9: Dịch và chạy chương trình

 Các phím kích hoạt menu: Alt+chữ cái đại diện cho nhóm menu đó (chữ cái 

có gạch dưới). Ví dụ Alt-F mở menu File để chọn các chức năng cụ thể trong 

nó như Open (mở file), Save (ghi file lên đĩa), … Alt-C mở menu Compile để Chương 1. Các khái niệm cơ bản của C++

7

chọn các chức năng liên quan đến dịch và chạy chương trình…

Các phím chức năng có thể thay đổi đôi chút qua từng phiên bản môi trường làm 

việc của C. Tuy nhiên, trên menu, cạnh mỗi mục công việc đều có ghi phím chức 

năng kèm theo, NSD có thể rà soát và điều chỉnh lại so với nội dung trong giáo 

trình này. 

3. Cấu trúc một chương trình trong C++

Một chương trình C++ có thể được đặt trong một hoặc nhiều file văn bản khác 

nhau. Mỗi file văn bản chứa một số phần nào đó của chương trình. Với những chương 

trình đơn giản và ngắn thường chỉ cần đặt chúng trên một file. 

Một chương trình gồm nhiều hàm, mỗi hàm phụ trách một công việc khác nhau 

của chương trình. Đặc biệt trong các hàm này có một hàm duy nhất có tên hàm là 

main(). Khi chạy chương trình, các câu lệnh trong hàm main() sẽ được thực hiện đầu 

tiên. Trong hàm main() có thể có các câu lệnh gọi đến các hàm khác khi cần thiết, và 

các hàm này khi chạy lại có thể gọi đến các hàm khác nữa đã được viết trong chương 

trình (trừ việc gọi quay lại hàm main()). Sau khi chạy đến lệnh cuối cùng của hàm 

main() chương trình sẽ kết thúc.

Cụ thể, thông thường một chương trình gồm có các nội dung sau:

 Phần khai báo các tệp nguyên mẫu: khai báo tên các tệp chứa những thành 

phần có sẵn (như các hằng chuẩn, kiểu chuẩn và các hàm chuẩn) mà NSD sẽ 

dùng trong chương trình.

 Phần khai báo các kiểu dữ liệu, các biến, hằng ... do NSD định nghĩa và được 

dùng chung trong toàn bộ chương trình.

 Danh sách các hàm của chương trình (do NSD viết, bao gồm cả hàm main()). 

Cấu trúc chi tiết của mỗi hàm sẽ được đề cập đến trong chương 4.

Dưới đây là một đoạn chương trình đơn giản chỉ gồm 1 hàm chính là hàm main(). 

Nội dung của chương trình dùng in ra màn hình dòng chữ: Hello, We are the world.

#include <iostream.h> // khai báo tệp nguyên mẫu để

int main() // được sử dụng toán tử in cout <<

{

cout << “Hello, We are the world "; // in ra màn hình

return 0; // kết thúc chương trình

}

Hoặc in ra dòng chữ: Chào các bạn, bây giờ là 2 giờ.Chương 1. Các khái niệm cơ bản của C++

8

#include <iostream.h> // khai báo tệp nguyên mẫu để

int main() // được sử dụng toán tử in cout <<

{

cout << “Chào các bạn, bây giờ là 2 giờ "; // in ra màn hình

return 0;

}

Dòng đầu tiên trong các chương trình trên là khai báo tệp nguyên mẫu iostream. 

Đây là khai báo bắt buộc vì trong chương trình có sử dụng phương thức chuẩn “cout 

<<” (in ra màn hình), phương thức này được khai báo và định nghĩa sẵn trong 

iostream. 

Không riêng hàm main(), mọi hàm khác đều phải bắt đầu tập hợp các câu lệnh 

của mình bởi dấu { và kết thúc bởi dấu }. Tập các lệnh bất kỳ bên trong cặp dấu này 

được gọi là khối lệnh. Khối lệnh là một cú pháp cần thiết trong các câu lệnh có cấu trúc 

như ta sẽ thấy trong các chương tiếp theo. 

III. CÁC BƯỚC ĐỂ TẠO VÀ THỰC HIỆN MỘT CHƯƠNG TRÌNH 

1. Qui trình viết và thực hiện chương trình

Trước khi viết và chạy một chương trình thông thường chúng ta cần:

1. Xác định yêu cầu của chương trình. Nghĩa là xác định dữ liệu đầu vào (input) 

cung cấp cho chương trình và tập các dữ liệu cần đạt được tức đầu ra (output). 

Các tập hợp dữ liệu này ngoài các tên gọi còn cần xác định kiểu của nó.Ví dụ 

để giải một phương trình bậc 2 dạng: ax2

+ bx + c = 0, cần báo cho chương 

trình biết dữ liệu đầu vào là a, b, c và đầu ra là nghiệm x1 và x2 của phương 

trình. Kiểu của a, b, c, x1, x2 là các số thực.

2. Xác định thuật toán giải.

3. Cụ thể hoá các khai báo kiểu và thuật toán thành dãy các lệnh, tức viết thành 

chương trình thông thường là trên giấy, sau đó bắt đầu soạn thảo vào trong 

máy. Quá trình này được gọi là soạn thảo chương trình nguồn.

4. Dịch chương trình nguồn để tìm và sửa các lỗi gọi là lỗi cú pháp. 

5. Chạy chương trình, kiểm tra kết quả in ra trên màn hình. Nếu sai, sửa lại 

chương trình, dịch và chạy lại để kiểm tra. Quá trình này được thực hiện lặp đi 

lặp lại cho đến khi chương trình chạy tốt theo yêu cầu đề ra của NSD. 

2. Soạn thảo tệp chương trình nguồnChương 1. Các khái niệm cơ bản của C++

9

Soạn thảo chương trình nguồn là một công việc đơn giản: gõ nội dung của 

chương trình (đã viết ra giấy) vào trong máy và lưu lại nó lên đĩa. Thông thường khi đã 

lưu lại chương trình lên đĩa lần sau sẽ không cần phải gõ lại. Có thể soạn chương trình 

nguồn trên các bộ soạn thảo (editor) khác nhưng phải chạy trong môi trường tích hợp 

C++ (Borland C, Turbo C, Dev-Cpp, Visual C, …) hoặc có thể sử dụng một số công cụ 

của C++ để dịch chương trình nguồn này sang mã máy (chương trình đích) và chạy 

trực tiếp trên chương trình đích này, không cần vào lại môi trường làm việc của C.

Mục đích của soạn thảo là tạo ra một văn bản chương trình và đưa vào bộ nhớ của 

máy chuẩn bị cho việc dịch và chạy chương trình. Văn bản chương trình cần được trình 

bày sáng sủa, rõ ràng. Các câu lệnh cần gióng thẳng cột theo cấu trúc của lệnh (các 

lệnh chứa trong một lệnh cấu trúc được trình bày thụt vào trong so với điểm bắt đầu 

của lệnh). Các chú thích nên ghi ngắn gọn, rõ nghĩa và phù hợp.

3. Dịch chương trình

Sau khi đã soạn thảo xong chương trình nguồn, bước tiếp theo thường là dịch (ấn 

tổ hợp phím Alt-F9) để tìm và sửa các lỗi gọi là lỗi cú pháp. Trong khi dịch C++ sẽ đặt 

con trỏ vào nơi gây lỗi (viết sai cú pháp) trong văn bản. Sau khi sửa xong một lỗi NSD 

có thể dùng Alt-F8 để chuyển con trỏ đến lỗi tiếp theo hoặc dịch lại. Để chuyển con trỏ 

về ngược lại lỗi trước đó có thể dùng Alt-F7. Quá trình sửa lỗi  dịch được lặp lại cho 

đến khi văn bản đã được sửa hết lỗi cú pháp.

Sản phẩm sau khi dịch là một tệp mới gọi là chương trình đích có đuôi EXE tức 

là tệp mã máy để thực hiện.Tệp này có thể lưu tạm thời trong bộ nhớ phục vụ cho quá 

trình chạy chương trình hoặc lưu lại trên đĩa tuỳ theo tuỳ chọn khi dịch của NSD. 

Trong và sau khi dịch, C++ sẽ hiện một cửa sổ chứa thông báo về các lỗi (nếu có), 

hoặc thông báo chương trình đã được dịch thành công (không còn lỗi). Các lỗi này 

được gọi là lỗi cú pháp.

4. Chạy chương trình

Ấn Ctrl-F10 (nếu chương trình đã được dịch trước đó) hoặc ấn F9 để chạy 

chương trình. Khi ấn F9, nếu chương trình chưa dịch sang mã máy, máy sẽ tự động 

dịch lại trước khi chạy. Kết quả của chương trình sẽ hiện ra trong một cửa sổ kết quả 

để NSD kiểm tra. Nếu kết quả chưa được như mong muốn, quay lại văn bản để sửa, 

dịch lại và chạy lại chương trình. Quá trình này được lặp lại cho đến khi chương trình 

chạy đúng như yêu cầu đã đề ra. Khi chương trình chạy, cửa sổ kết quả sẽ hiện ra tạm 

thời che khuất cửa sổ soạn thảo. Sau khi kết thúc chạy chương trình cửa sổ soạn thảo sẽ 

tự động hiện ra trở lại và che khuất cửa sổ kết quả. Để xem lại kết quả đã hiện ấn AltF5. (sau khi xem xong để quay lại cửa sổ soạn thảo ấn phím bất kỳ). Hoặc tốt nhất nên 

cài thêm câu lệnh getch() vào sau đoạn lệnh có hiện kết quả, lúc này màn hình sẽ tạm Chương 1. Các khái niệm cơ bản của C++

10

dừng để NSD quan sát kết quả, sau khi quan sát xong, ấn phím bất kỳ chương trình sẽ 

chạy tiếp. 

IV.VÀO/RA TRONG C++

Trong phần này chúng ta làm quen một số lệnh đơn giản cho phép NSD nhập dữ 

liệu vào từ bàn phím hoặc in kết quả ra màn hình. Trong phần sau của giáo trình chúng 

ta sẽ khảo sát các câu lệnh vào/ra phức tạp hơn

1. Vào dữ liệu từ bàn phím

Để nhập dữ liệu vào cho các biến có tên biến_1, biến_2, biến_3 chúng ta sử dụng 

câu lệnh:

cin >> biến_1 ;

cin >> biến_2 ;

cin >> biến_3 ;

hoặc:

cin >> biến_1 >> biến_2 >> biến_3 ;

biến_1, biến_2, biến_3 là các biến được sử dụng để lưu trữ các giá trị NSD nhập 

vào từ bàn phím. Khái niệm biến sẽ được mô tả cụ thể hơn trong chương 2, ở đây 

biến_1, biến_2, biến_3 được hiểu là các tên gọi để chỉ 3 giá trị khác nhau. Hiển nhiên 

có thể nhập dữ liệu nhiều hơn 3 biến bằng cách tiếp tục viết tên biến vào bên phải sau

dấu >> của câu lệnh.

Khi chạy chương trình nếu gặp các câu lệnh trên chương trình sẽ "tạm dừng" để 

chờ NSD nhập dữ liệu vào cho các biến. Sau khi NSD nhập xong dữ liệu, chương trình 

sẽ tiếp tục chạy từ câu lệnh tiếp theo sau của các câu lệnh trên.

Cách thức nhập dữ liệu của NSD phụ thuộc vào loại giá trị của biến cần nhập mà 

ta gọi là kiểu, ví dụ nhập một số có cách thức khác với nhập một chuỗi kí tự. Giả sử 

cần nhập độ dài hai cạnh của một hình chữ nhật, trong đó cạnh dài được qui ước bằng 

tên biến cd và chiều rộng được qui ước bởi tên biến cr. Câu lệnh nhập sẽ như sau:

cin >> cd >> cr ;

Khi máy dừng chờ nhập dữ liệu NSD sẽ gõ giá trị cụ thể của các chiều dài, rộng 

theo đúng thứ tự trong câu lệnh. Các giá trị này cần cách nhau bởi ít nhất một dấu trắng 

(ta qui ước gọi dấu trắng là một trong 3 loại dấu được nhập bởi các phím sau: phím 

spacebar (dấu cách), phím tab (dấu tab) hoặc phím Enter (dấu xuống dòng)). Các giá trị 

NSD nhập vào cũng được hiển thị trên màn hình để NSD dễ theo dõi.

Ví dụ nếu NSD nhập vào 23 11  thì chương trình sẽ gán giá trị 23 cho biến cd và Chương 1. Các khái niệm cơ bản của C++

11

11 cho biến cr.

Chú ý: giả sử NSD nhập 2311  (không có dấu cách giữa 23 và 11) thì chương 

trình sẽ xem 2311 là một giá trị và gán cho cd. Máy sẽ tạm dừng chờ NSD nhập tiếp 

giá trị cho biến cr.

2. In dữ liệu ra màn hình

Để in giá trị của các biểu thức ra màn hình ta dùng câu lệnh sau:

cout << bt_1 ;

cout << bt_2 ;

cout << bt_3 ;

hoặc:

cout << bt_1 << bt_2 << bt_3 ;

cũng giống câu lệnh nhập ở đây chúng ta cũng có thể mở rộng lệnh in với nhiều 

hơn 3 biểu thức. Câu lệnh trên cho phép in giá trị của các biểu thức bt_1, bt_2, bt_3. 

Các giá trị này có thể là tên của biến hoặc các kết hợp tính toán trên biến.

Ví dụ để in câu "Chiều dài là " và số 23 và tiếp theo là chữ "mét", ta có thể sử 

dụng 3 lệnh sau đây:

cout << "Chiều dài là " ;

cout << 23 ;

cout << "mét";

hoặc có thể chỉ bằng 1 lệnh:

cout << "Chiều dài là 23 mét" ;

Trường hợp chưa biết giá trị cụ thể của chiều dài, chỉ biết hiện tại giá trị này đã 

được lưu trong biến cd (ví dụ đã được nhập vào là 23 từ bàn phím bởi câu lệnh cin >>

cd trước đó) và ta cần biết giá trị này là bao nhiêu thì có thể sử dụng câu lệnh in ra màn 

hình.

cout << "Chiều dài là" << cd << "mét" ;

Khi đó trên màn hình sẽ hiện ra dòng chữ: "Chiều dài là 23 mét". Như vậy trong 

trường hợp này ta phải dùng đến ba lần dấu phép toán << chứ không phải một như câu 

lệnh trên. Ngoài ra phụ thuộc vào giá trị hiện được lưu trong biến cd, chương trình sẽ 

in ra số chiều dài thích hợp chứ không chỉ in cố định thành "chiều dài là 23 mét". Ví dụ 

nếu cd được nhập là 15 thì lệnh trên sẽ in câu "chiều dài là 15 mét".

Một giá trị cần in không chỉ là một biến như cd, cr, ... mà còn có thể là một biểu 

thức, điều này cho phép ta dễ dàng yêu cầu máy in ra diện tích và chu vi của hình chữ Chương 1. Các khái niệm cơ bản của C++

12

nhật khi đã biết cd và cr bằng các câu lệnh sau:

cout << "Diện tích = " << cd * cr ;

cout << "Chu vi = " << 2 * (cd + cr) ;

hoặc gộp tất cả thành 1 câu lệnh:

cout << Diện tích = " << cd * cr << ‘

’ << " Chu vi = " << 2 * (cd + cr) ;

ở đây có một kí tự đặc biệt: đó là kí tự '

' kí hiệu cho kí tự xuống dòng, khi gặp 

kí tự này chương trình sẽ in các phần tiếp theo ở đầu dòng kế tiếp. Do đó kết quả của 

câu lệnh trên là 2 dòng sau đây trên màn hình:

Diện tích = 253

Chu vi = 68

ở đây 253 và 68 lần lượt là các giá trị mà máy tính được từ các biểu thức cd * cr,

và 2 * (cd + cr) trong câu lệnh in ở trên.

Chú ý: để sử dụng các câu lệnh nhập và in trong phần này, đầu chương trình phải 

có dòng khai báo #include <iostream.h>.

Thông thường ta hay sử dụng lệnh in để in câu thông báo nhắc NSD nhập dữ liệu 

trước khi có câu lệnh nhập. Khi đó trên màn hình sẽ hiện dòng thông báo này rồi mới 

tạm dừng chờ dữ liệu nhập vào từ bàn phím. Nhờ vào thông báo này NSD sẽ biết phải 

nhập dữ liệu, nhập nội dung gì và như thế nào ... ví dụ:

cout << "Hãy nhập chiều dài: "; cin >> cd;

cout << "Và nhập chiều rộng: "; cin >> cr;

khi đó máy sẽ in dòng thông báo "Hãy nhập chiều dài: " và chờ sau khi NSD 

nhập xong 23 , máy sẽ thực hiện câu lệnh tiếp theo tức in dòng thông báo "Và nhập 

chiều rộng: " và chờ đến khi NSD nhập xong 11  chương trình sẽ tiếp tục thực hiện 

các câu lệnh tiếp theo. 

Ví dụ 2 : Từ các thảo luận trên ta có thể viết một cách đầy đủ chương trình tính 

diện tích và chu vi của một hình chữ nhật. Để chương trình có thể tính với các bộ giá 

trị khác nhau của chiều dài và rộng ta cần lưu giá trị này vào trong các biến (ví dụ cd, 

cr). 

#include <iostream.h> // khai báo tệp nguyên mẫu để dùng được cin, cout

#include <windows.h> // khai báo tệp nguyên mẫu để dùng system(...) ;

int main() // đây là hàm chính của chương trình

{

float cd, cr ; // khai báo các biến có tên cd, cr để chứa độ dài các cạnhChương 1. Các khái niệm cơ bản của C++

13

cout << "Hãy nhập chiều dài: " ; cin >> cd ; // nhập dữ liệu

cout << "Hãy nhập chiều rộng: " ; cin >> cr ;

cout << "Diện tích = " << cd * cr << '

' ; // in kết quả

cout << "Chu vi = " << 2 * (cd + cr) << '

';

system("pause") ;

return 0;

}

Chương trình này có thể gõ vào máy và chạy. Khi chạy đến câu lệnh nhập, 

chương trình dừng để chờ nhận chiều dài và chiều rộng, NSD nhập các giá trị cụ thể, 

chương trình sẽ tiếp tục thực hiện và in ra kết quả. Thông qua câu lệnh nhập dữ liệu và 

2 biến cd, cr NSD có thể yêu cầu chương trình cho kết quả của một hình chữ nhật bất 

kỳ chứ không chỉ trong trường hợp hình có chiều dài 23 và chiều rộng 11 như trong ví 

dụ cụ thể trên. 

3. Định dạng thông tin cần in ra màn hình

Một số định dạng đơn giản được chúng tôi trình bày trước ở đây. Các định dạng 

chi tiết và phức tạp hơn sẽ được trình bày trong các phần sau của giáo trình. Để sử 

dụng các định dạng này cần khai báo file nguyên mẫu <iomanip> ở đầu chương trình 

bằng chỉ thị #include <iomanip>. 

 endl: Tương đương với kí tự xuống dòng '

'.

 setw(n): Bình thường các giá trị được in ra bởi lệnh cout << sẽ thẳng theo lề 

trái với độ rộng phụ thuộc vào độ rộng của giá trị đó. Phương thức setw(n) 

cho phép qui định độ rộng dành để in ra các giá trị là n cột màn hình và nếu n

lớn hơn độ dài thực của giá trị, giá trị sẽ in ra theo lề phải, để trống phần thừa 

(dấu cách) ở trước. 

 setprecision(n): Chỉ định số chữ số của phần thập phân in ra là n. Số sẽ được 

làm tròn trước khi in ra.

 setiosflags(ios::showpoint): Phương thức setprecision chỉ có tác dụng trên 

một dòng in. Để cố định các giá trị đã đặt cho mọi dòng in (cho đến khi đặt lại 

giá trị mới) ta sử dụng phương thức setiosflags(ios::showpoint).

Ví dụ sau minh hoạ cách sử dụng các phương thức trên. 

Ví dụ 3 : 

#include <iostream.h> // để sử dụng cout <<

#include <iomanip.h> // để sử dụng các định dạngChương 1. Các khái niệm cơ bản của C++

14

#include <windows.h> // để sử dụng system(...) ;

int main()

{

cout << "CHI TIÊU" << endl << "=======" << endl ;

cout << setiosflags(ios::showpoint) << setprecision(2) ;

cout << "Sách vở" << setw(20) << 123.456 << endl;

cout << "Thức ăn" << setw(20) << 2453.6 << endl;

cout << "Quần áo lạnh" << setw(15) << 3200.0 << endl;

system(“pause”); // tạm dừng (để xem kết quả)

return 0; // kết thúc thực hiện hàm main()

}

Chương trình này khi chạy sẽ in ra bảng sau:

CHI TIÊU

========

Sách vở 123.46

Thức ăn 2453.60

Quần áo lạnh 3200.00

Chú ý: toán tử nhập >> chủ yếu làm việc với dữ liệu kiểu số. Để nhập kí tự hoặc 

xâu kí tự, C++ cung cấp các phương thức (hàm) sau:

 cin.get(c): cho phép nhập một kí tự vào biến kí tự c,

 cin.getline(s,n): cho phép nhập tối đa n-1 kí tự vào xâu s.

các hàm trên khi thực hiện sẽ lấy các kí tự còn lại trong bộ nhớ đệm (của lần nhập 

trước) để gán cho c hoặc s. Do toán tử cin >> x sẽ để lại kí tự xuống dòng trong bộ đệm 

nên kí tự này sẽ làm trôi các lệnh sau đó như cin.get(c), cin.getline(s,n) (máy không 

dừng để nhập cho c hoặc s). Vì vậy trước khi sử dụng các phương thức cin.get(c) hoặc 

cin.getline(s,n) nên sử dụng phương thức cin.ignore(1) để lấy ra kí tự xuống dòng còn 

sót lại trong bộ đệm. Ví dụ đoạn lệnh sau cho phép nhập một số nguyên x (bằng toán tử 

>>) và một kí tự c (bằng phương thức cin.get(c)): 

int x;

char c;

cin >> x; cin.ignore(1);

Chương 1. Các khái niệm cơ bản của C++

15

cin.get(c);

4. Vào/ra trong C

Trong phần trên chúng tôi đã trình bày 2 toán tử vào/ra và một số phương thức, 

hàm nhập và định dạng trong C++. Phần này chúng tôi trình bày các câu lênh nhập 

xuất theo khuôn dạng cũ trong C. Hiển nhiên các câu lệnh này vẫn dùng được trong 

chương trình viết bằng C++, tuy nhiên chỉ nên sử dụng hoặc các câu lệnh của C++ 

hoặc của C, không nên dùng lẫn lộn cả hai vì dễ gây nhầm lẫn. Do đó mục này chỉ có 

giá trị tham khảo để bạn đọc có thể hiểu được các câu lệnh vào/ra trong các chương 

trình viết theo NNLT C cũ. 

a. In kết quả ra màn hình

Để in các giá trị bt_1, bt_2, …, bt_n ra màn hình theo một khuôn dạng mong 

muốn ta có thể sử dụng câu lệnh sau đây: 

printf(dòng định dạng, bt_1, bt_2, ..., bt_n) ;

trong đó dòng định dạng là một dãy kí tự đặt trong cặp dấu nháy kép (“”) qui định 

khuôn dạng cần in của các giá trị bt_1, bt_2, …, bt_n. Các bt_i có thể là các hằng, biến 

hay các biểu thức tính toán. Câu lệnh trên sẽ in giá trị của các bt_i này theo thứ tự xuất 

hiện của chúng và theo qui định được cho trong dòng định dạng.

Ví dụ, giả sử x = 4, câu lệnh:

printf(“%c %0.4f”, 65, 4.372 + 1) ; A 5.4

sẽ in các số 3 và 5.00 ra màn hình, trong đó 3 được in dưới dạng số nguyên (được 

qui định bởi “%d”) và x + 1 (có giá trị là 5) được in dưới dạng số thực với 2 số lẻ thập 

phân (được qui định bởi “%m.nf”). Cụ thể, các kí tự đi sau kí hiệu % dùng để định dạng 

việc in gồm có:

d in số nguyên dưới dạng hệ thập phân

o in số nguyên dạng hệ 8

x, X in số nguyên dạng hệ 16

u in số nguyên dạng không dấu

c in kí tự

s in xâu kí tự

e, E in số thực dạng dấu phẩy động

f in số thực dạng dấu phẩy tĩnh

 Các kí tự trên phải đi sau dấu %. Các kí tự nằm trong dòng định dạng nếu 

không đi sau % thì sẽ được in ra màn hình. Muốn in % phải viết 2 lần (tức Chương 1. Các khái niệm cơ bản của C++

16

%%).

Ví dụ câu lệnh: printf(“Tỉ lệ học sinh giỏi: %0.2f %%”, 32.486) ;

sẽ in câu “Tỉ lệ học sinh giỏi: “, tiếp theo sẽ in số 32.486 được làm tròn đến 2 số lẻ 

thập phân lấp vào vị trí của “%0.2f”, và cuối cùng sẽ in dấu “%” (do có %% trong dòng 

định dạng). Câu được in ra màn hình sẽ là:

Tỉ lệ học sinh giỏi: 32.49%

Chú ý: Mỗi bt_i cần in phải có một định dạng tương ứng trong dòng định dạng. 

Ví dụ câu lệnh trên cũng có thể viết:

printf(“%s %0.2f” , “Tỉ lệ học sinh giỏi: “, 32.486);

trong câu lệnh này có 2 biểu thức cần in. Biểu thức thứ nhất là xâu kí tự “Tỉ lệ học 

sinh giỏi:” được in với khuôn dạng %s (in xâu kí tự) và biểu thức thứ hai là 32.486

được in với khuôn dạng %0.2f (in số thực với 2 số lẻ phần thập phân).

 Nếu giữa kí tự % và kí tự định dạng có số biểu thị độ rộng cần in thì giá trị in 

ra sẽ được gióng cột sang lề phải, để trống các dấu cách phía trước. Nếu độ 

rộng âm (thêm dấu trừ  phía trước) sẽ gióng cột sang lề trái. Nếu không có 

độ rộng hoặc độ rộng bằng 0 (ví dụ %0.2f) thì độ rộng được tự điều chỉnh 

đúng bằng độ rộng của giá trị cần in.

 Dấu + trước độ rộng để in giá trị số kèm theo dấu (dương hoặc âm)

 Trước các định dạng số cần thêm kí tự l (ví dụ ld, lf) khi in số nguyên dài long

hoặc số thực với độ chính xác gấp đôi double.

Ví dụ 4 :

main()

{

int i = 2, j = 3 ;

printf(“Chương trình tính tổng 2 số nguyên:

i + j = %d”, i+j);

}

sẽ in ra: 

Chương trình tính tổng 2 số nguyên:

i + j = 5.

b. Nhập dữ liệu từ bàn phím

scanf(dòng định dạng, biến_1, biến_2, ..., biến_n) ;Chương 1. Các khái niệm cơ bản của C++

17

Lệnh này cho phép nhập dữ liệu vào cho các biến biến_1, …, biến_n. Trong đó 

dòng định dạng chứa các định dạng về kiểu biến (nguyên, thực, kí tự …) được viết như 

trong mô tả câu lệnh printf. Các biến được viết dưới dạng địa chỉ của chúng tức có dấu 

& trước mỗi tên biến. Ví dụ câu lệnh:

scanf(“%d %f %ld”, &x, &y, &z) ;

cho phép nhập giá trị cho các biến x, y, z trong đó x là biến nguyên, y là biến thực 

và z là biến nguyên dài (long). Câu lệnh:

scanf(“%2d %f %lf %3s”, &i, &x, &d, s);

cho phép nhập giá trị cho các biến i, x, d, s, trong đó i là biến nguyên có 2 chữ số, 

f là biến thực (độ dài tùy ý), d là biến nguyên dài và s là xâu kí tự có 3 kí tự. Giả sử 

NSD nhập vào dãy dữ liệu: 12345 67abcd  thì các biến trên sẽ được gán các giá 

trị như sau: i = 12, x = 345, d = 67 và s = “abc”. Kí tự d và dấu enter () sẽ được lưu lại 

trong bộ nhớ và tự động gán cho các biến của lần nhập sau.

Cuối cùng, chương trình trong ví dụ 3 được viết lại với printf() và scanf() như sau:

Ví dụ 5 :

#include <stdio.h> // để sử dụng các hàm printf() và scanf()

#include <conio.h> // để sử dụng hàm getch()

int main()

{

printf("CHI TIÊU

=======

") ;

printf("Sách vở %20.2f

" , 123.456) ;

printf("Thức ăn %20.2f

" , 2453.6) ;

printf(“Quần áo lạnh %15.2f

" , 3200.0) ;

getch(); // tạm dừng (để xem kết quả)

return 0; // kết thúc thực hiện hàm main()

}Chương 1. Các khái niệm cơ bản của C++

18

BÀI TẬP

1. Những tên gọi nào sau đây là hợp lệ:

 x  123variabe  tin_hoc  toan tin  so-dem

 RADIUS  one.0  number#  Radius  nam2000

2. Bạn hãy thử viết một chương trình ngắn nhất có thể được.

3. Tìm các lỗi cú pháp trong chương trình sau:

#include (iostream)

int main(); / Giải phương trình bậc 1

{

cout << 'Day la chương trình: Gptb1.

Xin chao cac ban';

system(“pause”);

}

4. Viết chương trình in nội dung một bài thơ nào đó.

5. Viết chương trình in ra 4 dòng, 2 cột gồm các số sau và gióng cột:

 thẳng theo lề trái 0.63 64.1

 thẳng theo lề phải 12.78 -11.678

 thẳng theo dấu chấm thập phân -124. 6 59.002

65.7 -1200.654

6. Hãy viết và chạy các chương trình trong các ví dụ 3, 5.

7. Chương trình sau khai báo 5 biến kí tự a, b, c, d, e và một biến số nam. Hãy điền 

thêm các câu lệnh vào các dòng … để chương trình thực hiện nhiệm vụ sau:

 Nhập giá trị cho biến nam

 Nhập giá trị cho các biến kí tự a, b, c, d, e.

 In ra màn hình dòng chữ được ghép bởi 5 kí tự đã nhập và chữ "năm" sau đó 

in số đã nhập (nam). Ví dụ nếu 5 chữ cái đã nhập là 'H', 'A', 'N', 'O', 'I' và nam

được nhap là 2000, thì màn hình in ra dòng chữ: HANOI năm 2000.

 Nhập chương trình đã sửa vào máy và chạy để kiểm tra kết quả.

#include <iostream.h>

main()

{Chương 1. Các khái niệm cơ bản của C++

19

int nam;

char a, b, c, d, e;

cin >> nam ;

… ;

cin.get(a); cin.get(b); cin.get(c); … ; … ;

// in kết quả

cout << a << … << … << … << … << " nam " << … ;

system(“pause”);

}

Bạn đang đọc truyện trên: Truyen2U.Pro