Tải bản đầy đủ

Chương 1 Lập trình hướng đối tượng

Chương 1: Các khái niệm cơ bản trong C++
1.1. Cấu trúc một chương trình C++
 Khai báo thư viện
 Định nghĩa các hằng, và các kiểu dữ liệu
 Khai báo các hàm và biến toàn cục
 Hàm thực thi ban đầu của chương trình main()
 Cài đặt các hàm đã khai báo ở bên trên
Chúng ta hãy xem xét các vấn đề này trong một chương trình C++ đơn giản dưới đây:

Dòng 1: Khai báo thư viện gồm có:
+) Chỉ thị tiền xử lý #include
+) Tên thư viện . Đối với thư viện chuẩn ta đặt trong dấu <…>, các thư viện
do người dùng định nghĩa ta đặt trong dấu “c:\\MyLib\\Dagiac.h”.
Dòng 2: Định nghĩa hàm main(). Đây là hàm bắt đầu thực thi của một chương trình C++. Do vậy
bất cứ một chương trình C++ nào cũng phải có hàm main(). Hàm main() có hai dạng: có kiểu
hoặc không có kiểu void main()
Dòng 3: Dấu { tương đương với Begin trong ngôn ngữ Pascal. Để xác định sự bắt đầu của một
hàm. Trong C++ cặp dấu { } để xác định sự bắt đầu và kết thúc của một hàm.
Dòng 4: cout << "Hello World"; Đây là dòng lệnh in lên màn hình dòng chữ "Hello World".
cout là một dòng (stream) ra chuẩn trong C++ được định nghĩa trong thư viện iostream.
Chú ý rằng dòng này kết thúc bằng dấu chấm phẩy ( ; ). Kí tự này được dùng để kết thúc một

lệnh và bắt buộc phải có sau mỗi lệnh trong chương trình C++ của bạn (một trong những lỗi phổ
biến nhất của những lập trình viên C++ là quên mất dấu chấm phẩy).
Dòng 5: Dấu } tương đương với End trong ngôn ngữ Pascal, xác định sự kết thúc của hàm main().
1.2. Các kiểu dữ liệu chuẩn trong C++
1.2.1. Kiểu số nguyên
- Kiểu số nguyên có thể là các kiểu: short , int , long, unsigned int, unsigned short… . Nhưng các
kiểu này có kích thước khác nhau.
Kiểu
int, short, short int
long, long int
unsigned int, unsigned short

Kích thước
2 byte
4 byte
2 byte

Miền giá trị
- 32768 đến + 32767
-2.147483648 đến 2.147483647
0 đến 65535


unsigned long

4byte

0 đến 429496729

Mặc định số nguyên là có dấu. Tuy nhiên, một số nguyên có thể được định nghĩa là không
có dấu bằng cách sử dụng từ khóa unsigned trong định nghĩa của nó. Các kiểu số nguyên không
dấu được bắt đầu bằng từ unsigned + kiểu dữ liệu số nguyên. Ví dụ như unsigned short,
unsigned int, unsigned long…
Ví dụ 1:
unsigned short age = 20;
unsigned int salary = 65000;
unsigned long price = 4500000;

Số nguyên luôn luôn được mặc định là kiểu int, trừ khi có một hậu tố L hoặc l thì nó
được hiểu là kiểu long . Một số nguyên cũng có thể được đặc tả sử dụng hậu tố là U hoặc u .,


Ví dụ: 1984L 1984l 1984U 1984u 1984LU 1984ul
1.2.2. Kiểu số thực
Số thực trong C++ có hai kiểu cơ bản : float và double. Cụ thể miền giá trị và kích thước
các kiểu như sau :
Kiểu
Kích thước
Miền giá trị
float
4 byte
- 3.4*10-38 đến + 3.4*1038
double
8 byte
- 1.7*10-308 đến + 1.7*10308
long float
8 byte
- 1.7*10-308 đến + 1.7*10308
long double
16 byte
- 1.2*10- 4932 đến + 1.2*10 4932
Mặc định trong C++ kiểu số thực là double.
1.2.3. Kiểu Kí tự và chuỗi
1.2.3. 1. Kiểu kí tự
Kiểu kí tự trong C++ là char, có kích thước là một byte. Biến kiểu kí tự chiếm một byte
trong bộ nhớ để lưu trữ mã kí tự(mã ASCII).
Ví dụ 2: ký tự A có mã ASCII là 65, và ký tự a có mã ASCII là 97.
char ch = 'A';

Giống như số nguyên, biến ký tự có thể là có dấu hoặc không dấu. Mặc định trong hầu hết
các hệ thống thì char nghĩa là có dấu có miền giá trị từ -128 đến 128. Tuy nhiên, trên một số hệ
thống thì char lại là không dấu( unsigned char) có miền giá trị từ 0 đến 255.
Kí tự trong C++ được viết nằm trong cặp dấu nháy đơn ví dụ ‘C’. Có một số kí tự đặc biệt
không in ra được được biểu diễn thông qua các kí hiệu đặc biệt như sau:
Kí hiệu
‘\n’
‘\t’
‘\r’
‘\v’
‘\b’
‘\’’
‘\”’

Kí tự
Kí tự xuống dòng
Kí tự tab ngang
Kí tự đầu dòng
Kí tự tab dọc
Phím xóa lùi
Dấu nháy đơn
Dấu nháy kép


‘\\’
‘\0’

Kí tự \
Kí tự null(rỗng)

1.2.3.2. Chuỗi
Chuỗi là một dãy liên tiếp các ký tự được kết thúc bằng một ký tự null. Biến chuỗi được
định nghĩa kiểu char* (con trỏ ký tự) hoặc char ten[20] - mảng kí tự.
Ví dụ 3: char ten[20];
ten= “Le Van A”;
L

e

V

a

n

A

\0

Chuỗi kí tự trong C++ được đặt nằm giữa hai dấu nháy kép “Nam dinh”. Chúng ta có thể
viết chuỗi kí tự thành nhiều dòng khác nhau thông qua việc sử dụng dấu \.
Ví dụ 4: “Xin chao cac ban\
Den voi viet nam”
Tương đương với “Xin chao cac ban Den voi viet nam”
Sự khác biệt giữa chuỗi kí tự và kí tự đơn là:
char ch=’A’;
char* ten=”A”;
Biến ch chỉ chiếm một byte trong bộ nhớ nhưng biến ten lại chiếm 2 byte 1 cho kí tự A,
còn một là kí tự null.
1. 3. Chú thích
Chú thích là đoạn văn bản mô tả chức năng hoạt động của một đoạn các câu lệnh hoặc
làm rõ nghĩa tên các biến...Nó rất cần thiết trong lập trình, giúp cho người lập trình khi xem lại
đoạn mã sẽ nhanh chóng hiểu được những gì mình đã làm. Và nó thực sự bổ ích trong việc lập
trình theo nhóm.
Có hai dạng chú thích cơ bản:
- Chú thích trên một dòng ta sử dụng dấu //. Tất cả các kí tự phía sau dấu // trên cùng
một dòng được coi là chú thích, khi biên dịch trình dịch sẽ bỏ qua.
- Chú thích nhiều dòng ta sử dụng cặp /* ....*/. Tất cả đoạn văn bản nằm giữa /*.....*/
được xem là đoạn văn bản chú thích.
Ví dụ 5: Chúng ta xét ví dụ sau:
#include
/* Đay la chuong trinh giai và bien luan
phuong trinh bac nhat ax+b=0 */
void main()
{
float a; //He so a của phuong trình
float b; // He so b cua phuong trinh
// Nhap du lieu tu ban phim
cout<<”\n a=”; cin>>a;
cout<<”\n b=”; cin>>b;


if (a!=0)
{
cout<<”Phuong trinh co No X=”<<-b/a;
}
else
{
if (b==0)
cout<<”Phuong trinh co vo so nghiem”;
else
cout<<”Phuong trinh co vo nghiem”;
}
cin.get();
cin.get();// Dung chuong trinh
}
1.4. Đặt tên trong C++
Ngôn ngữ lập trình sử dụng tên để tham chiếu tới các thực thể khác nhau để tạo ra chương
trình. Ở ví dụ 5 ta thấy các tên a, b đây là tên các biến. Ngoài tên biến chúng ta còn có các loại
tên khác như: tên hàm, tên kiểu, và tên macro.
Sử dụng tên rất tiện lợi cho việc lập trình, nó cho phép lập trình viên tổ chức dữ liệu theo
cách thức mà con người có thể hiểu được. Tên không được đưa vào mã có thể thực thi được tạo
ra bởi trình biên dịch.
C++ áp đặt những luật sau để xây dựng các tên hợp lệ (cũng được gọi là các định danh).
Một tên chứa một hay nhiều ký tự, mỗi ký tự có thể là một chữ cái ('A'-'Z' và 'a'-'z'), một kí tự số (
'0'-'9'), hoặc một ký tự gạch dưới ('_'). Tên không được bắt đầu là một số, không được trùng tên
với kiểu dữ liệu và từ khóa. Trong C++ phân biệt chữ hoa và chữ thường, các ký tự viết hoa và
viết thường là khác nhau.
Ví dụ 6:
Luong, tuan1, _tuan2 là các tên hợp lệ
12tuan, @tuan, !tuan3 là các tên không đúng.
1.5. Biến, khai báo biến.
Biến là một tên tượng trưng cho một vùng nhớ mà dữ liệu có thể được lưu trữ trên đó, có
thể được sử dụng lại và có thể thay đổi được dữ liệu trên vùng nhớ đó. Các biến được sử dụng để
lưu các giá trị dữ liệu vì thế mà chúng có thể được dùng trong nhiều tính toán khác nhau trong
một chương trình.
Cú pháp khai báo biến trong C++ như sau:
Kieu_du_lieu ten_bien;
Đầu tiên ta phải khai báo kiểu dữ liệu của biến như, int, float, char... sau đó là tên biến và
kết thúc là dấu chấm phẩy.
Ví dụ 7: int ngay;
float dientich ;
Ở ví dụ 7 ta có biến ngay kiểu số nguyên và kiến dientich kiểu số thực.
Một điểm rất linh hoạt trong C++ là ta có thể khai báo biến ở bất kì vị trí nào trong
chương trình trước khi các biến được sử dụng.


1.6. Hằng
Hằng là đại lượng không đổi trong chương trình. Có hai dạng khai báo hằng
+) Khai báo hằng không kiểu. Để định nghĩa một hằng ta thực hiện theo cú pháp sau :
#define ten_hằng giá_trị
Ví dụ 8:
#define MAX 1000
#define TH2 “Thu hai”
#define PI 3.1414141414
+) Khai báo hằng có kiểu
const kieu_dulieu ten_hang
Ví dụ 9:
const int MAX=1000;
const float PI=3.14141415;
1.7. Các toán tử trong C++

1.7.1. Toán tử gán (=).
Toán tử gán dùng để gán một giá trị nào đó cho một biến
Ví dụ 8: a = 5; gán giá trị nguyên 5 cho biến a.
+ Vế trái bắt buộc phải là một biến, còn vế phải có thể là bất kì: hằng, biến hay kết quả
của một biểu thức.
+ Toán tử gán luôn được thực hiện từ trái sang phải và không bao giờ đảo ngược.
Ví dụ 9: a = b; gán giá trị của biến a bằng giá trị đang chứa trong biến b. Chú ý rằng
chúng ta chỉ gán giá trị của b cho a và sự thay đổi của b sau đó sẽ không ảnh hưởng đến giá trị
của a.
Ví dụ 10: a = 2 + (b = 5); tương đương với b = 5; a = 2 + b;
Ví dụ 11: a = b = c = 5; gán giá trị 5 cho cả ba biến a, b và c
1.7.2. Các toán tử số học ( +, -, *, /, % )
Năm toán tử số học được hỗ trợ bởi ngôn ngữ là:
+ : cộng
-: trừ
*: nhân
/:chia
%: lấy phần dư (trong phép chia)
Thứ tự thực hiện các toán tử này cũng giống như chúng được thực hiện trong toán học.
Điều duy nhất có vẻ hơi lạ đối với bạn là phép lấy phần dư, ký hiệu bằng dấu phần trăm (%). Đây
chính là phép toán lấy phần dư trong phép chia hai số nguyên với nhau.
Ví dụ 12: a = 11 % 3;, biến a sẽ mang giá trị 2 vì 11 = 3*3 +2.
1.7.3. Các toán tử gán phức hợp (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=)
a+=b; ⇔ a=a+b.
a-=b; ⇔ a=a-b.
a*=b; ⇔ a=a*b.


a/=b; ⇔ a=a/b.
a%=b; ⇔ a=a%b.
a>>=b; ⇔ a=a>>b (a / (2 mũ b)).
a<<=b; ⇔ a=a<1.7.4. Tăng và giảm(++, --) .
Bốn dòng lệnh sau tương đương nhau đều thực hiện chức năng tăng giá trị của biến a lên
1:
a++ ;
++a;
a+=1;
a=a+1;
Bốn dòng lệnh sau tương đương nhau đều thực hiện chức năng giảm giá trị của biến a đi
1:
a--;
--a;
a- =1;
a=a-1;
Một tính chất của toán tử (++/--) là nó có thể là tiền tố hoặc hậu tố, có nghĩa là có thể viết
trước tên biến (++a) hoặc sau (a++). Trong các biểu thức đơn giản nó có cùng ý nghĩa, nhưng
trong các thao tác khác khi mà kết quả của việc tăng hay giảm được sử dụng trong một biểu thức
thì chúng có thể có một khác biệt quan trọng về ý nghĩa:
-

Trong trường hợp toán tử được sử dụng như là một tiền tố (++a) giá trị được tăng
trước khi biểu thức được tính và giá trị đã tăng được sử dụng trong biểu thức;
Ví dụ 13: B=3;
A=++B;
Thì A có giá trị là 4, và B có giá trị là 4

-

Trong trường hợp ngược lại (a++) giá trị trong biến a được tăng sau khi đã tính toán.
Hãy chú ý sự khác biệt :
Ví dụ 14: B=3;
A=B++;
Thì A có giá trị là 3, và B có giá trị là 4

1.7.5. Các toán tử quan hệ ( ==, !=, >, <, >=, <= )
Để có thể so sánh hai biểu thức với nhau chúng ta có thể sử dụng các toán tử quan hệ.
Theo chuẩn ANSI-C++ thì giá trị của thao tác quan hệ chỉ có thể là giá trị logic - chúng chỉ có thể
có giá trị true hoặc false, tuỳ theo biểu thức kết quả là đúng hay sai.
Sau đây là các toán tử quan hệ bạn có thể sử dụng trong C++
==: Bằng
!=: Khác


>: Lớn hơn
<: Nhỏ hơn
> =: Lớn hơn hoặc bằng
< =: Nhỏ hơn hoặc bằng
Ví dụ 15:
(7 == 5)
sẽ trả giá trị false
(6 >= 6) sẽ trả giá trị true
1.7.6. Các toán tử logic ( !, &&, || ).
- Toán tử !: tương đương với toán tử logic NOT, nó chỉ có một đối số ở phía bên phải và
việc duy nhất mà nó làm là đổi ngược giá trị của đối số từ true sang false hoặc ngược lại.
Ví dụ 15:
!(5 == 5) trả về false vì biểu thức bên phải (5 == 5) có giá trị true.
!(6 <= 4) trả về true vì (6 <= 4)có giá trị false.
- Toán tử logic && và || được sử dụng khi tính toán hai biểu thức để lấy ra một kết quả
duy nhất. Chúng tương ứng với các toán tử logic AND và OR. Kết quả của chúng phụ thuộc vào
mối quan hệ của hai đối số:
Ví dụ 16:
( (5 == 5) && (3 > 6) ) trả về false ( true && false ).
( (5 == 5) || (3 > 6)) trả về true ( true || false ).
1.7.7. Toán tử điều kiện ( ? ).
Toán tử điều kiện tính toán một biểu thức và trả về một giá trị tuỳ thuộc vào biểu thức đó
là đúng hay sai. Cấu trúc của nó như sau:
(Biểu thức điều kiện) ? result1 : result2
Nếu biểu thức điều kiện là true thì giá trị trả về sẽ là result1, nếu không giá trị trả về là
result2.
Ví dụ 17: 7==5 ? 4 : 3 trả về 3 vì 7 không bằng 5.
a>b ? a : b trả về giá trị lớn hơn, a hoặc b.
1.7.8. Các toán tử thao tác bit ( &, |, ^, ~, <<, >> ).
Các toán tử thao tác bit thay đổi các bit biểu diễn một biến, có nghĩa là thay đổi biểu diễn
nhị phân của chúng
+) &: AND
Ví dụ 18:
int a=4; // viết dưới dạng nhị phân a=100
int b=5; // viết dưới dạng nhị phân a=101
int c;
c=a & b; //c=100;
+) | : OR
Ở ví dụ 18 nếu c= a|b thì c=5 viết dưới dạng nhị phân là 101
+) ^: XOR
Ở ví dụ 18 nếu c= a^b thì c=1 viết dưới dạng nhị phân là 001
+) ~:NOT
Ở ví dụ 18 nếu c= ~a thì c=3 viết dưới dạng nhị phân là 011


1.7.9. Các toán tử chuyển đổi kiểu
Các toán tử chuyển đổi kiểu cho phép bạn chuyển đổi dữ liệu từ kiểu này sang kiểu khác.
Có vài cách để làm việc này trong C++, cách cơ bản nhất được thừa kế từ ngôn ngữ C là đặt
trước biểu thức cần chuyển đổi tên kiểu dữ liệu được bọc trong cặp ngoặc đơn (),
Ví dụ 19:
int i;
float f = 3.14;
i = (int) f;
Đoạn mã trên chuyển số thập phân 3.14 sang một số nguyên (3). Ở đây, toán tử chuyển
đổi kiểu là (int). Chúng ta có thể chuyển đổi kiểu theo một kiểu khác đó là đặt trước biểu thức
cần chuyển đổi kiểu tên kiểu mới và bao bọc biểu thức giữa một cặp ngoặc đơn.
i = int ( f );
1.7.10. Toán tử sizeof()
Toán tử này có một tham số, đó có thể là một kiểu dữ liệu hay là một biến và trả về kích
cỡ bằng byte của kiểu hay đối tượng đó.
a = sizeof (char);
a sẽ mang giá trị 1 vì kiểu char luôn có kích cỡ 1 byte trên mọi hệ thống. Giá trị trả về của
sizeof là một hằng số vì vậy nó luôn luôn được tính trước khi chương trình thực hiện.
1.7.11. Các toán tử khác
Trong C++ còn có một số các toán tử khác, như các toán tử liên quan đến con trỏ như new
, delete hay lập trình hướng đối tượng như toán tử phạm vi :: …. Chúng sẽ được nói đến cụ thể
trong các phần tương ứng.
1.7.12. Thứ tự ưu tiên của các toán tử
Khi viết các biểu thức phức tạp với nhiều toán hạng các bạn có thể tự hỏi toán hạng nào
được tính trước, toán hạng nào được tính sau. Ví dụ như trong biểu thức sau:
a=5+7%2
có thể có hai cách hiểu sau:
a = 5 + (7 % 2) với kết quả là 6, hoặc
a = (5 + 7) % 2 với kết quả là 0
Câu trả lời đúng là biểu thức đầu tiên. Vì nguyên nhân nói trên, ngôn ngữ C++ đã thiết lập
một thứ tự ưu tiên giữa các toán tử, không chỉ riêng các toán tử số học mà tất cả các toán tử có
thể xuất hiện trong C++. Thứ tự ưu tiên của chúng được liệt kê trong bảng sau theo thứ tự từ cao
xuống thấp.


1.8. Nhập và xuất dữ liệu trong C++
Để nhập và xuất dữ liệu trong C++, có thư viện iostream chứa 2 đối tượng :
- Đối tượng cin: bao gồm có toán tử nhập, các phương thức để lo nhập dữ liệu từ bàn
phím
- Đối tượng cout: bao gồm có toán tử xuất, các phương thức và các cờ định dạng cho việc
xuất dữ liệu ra màn hình.
1.8.1. Xuất dữ liệu
cout là một đối tượng bao gồm có toán tử xuất: <<, các phương thức và các cờ định dạng
xuất dữ liệu.
1.8.1.1. Toán tử xuất <<
Để xuất dữ liệu ta sử dụng toán tử xuất << với cú pháp như sau:
cout<< thamso1<Thamso có thể là:
- Số
- Chuỗi
- Kí tự
- Biểu thức
- Biến
Ví dụ:
int n=5;
cout<<“Gia tri so:”<int a=10, b=6;
cout<<“Gia tri lon nhat:”<<(a>b?a:b);


1.8.1.2. Định dạng xuất dữ liệu:
a) Đặt độ rộng hiển thị:
Chúng ta có hai cách để đặt độ rộng hiển thị:
- Để đặt độ rộng hiển thị ta sử dụng phương thức width(int n) của đối tượng cout
cout.width(n);
Ví dụ:
int n=5678
cout.width(8);
cout<Kết quả là: ____5678
- Để đặt độ rộng hiển thị chúng cũng có thể sử dụng hàm setw(int n) trong thư viện
như sau :
cout<Ví dụ: int n=5678
cout<Kết quả là: ____5678
b) Đặt kí tự độn
Mặc định kí tự độn là dấu cách. Chúng ta cũng có hai cách để đặt kí tự độn trong hiển
thị:
- Sử dụng phương thức fill(char c) của cout
Ví dụ: int n=5678
cout.fill(‘*’) ;
cout.width(8) ;
cout<Kết quả là: ****5678
- Sử dụng hàm setfill(char c) của thư viện
c) Định dạng hiển thị số thập phân
- Đặt độ chính xác cho việc số thập phân
Để đặt độ chính xác cho việc hiển thị số thập phân chúng ta có hai cách :
+ Sử dụng phương thức precision(int n) của đối tượng cout như ví dụ sau:
Cú pháp: cout.precision(k);
Ví dụ:
float x=43.56768;
cout.precision(4);
cout<Kết quả: 43.57
+ Sử dụng hàm setprecision(int n) trong thư viện như sau:
Cú pháp: cout<Ví dụ:
float x=43.56768;
cout<Kết quả: 43.57
d) Các cờ định dạng
+) Để bật các cờ định dạng ta có hai cách:


- Sử dụng phương thức setf(long f) của đối tượng cout
- Sử dụng hàm setiosflags(long f) trong thư viện
+) Để tắt các cờ chúng ta cũng có hai cách:
- Sử dụng phương thức unsetf(long f) của đối tượng cout
- Sử dụng hàm resetiosflags(long f) trong thư viện
Sau đây chúng ta sẽ xét một số nhóm cờ định dạng:
+) Căn lề hiển thị: Trong C++ có 2 cờ định dạng căn lề đó là cờ căn lề trái ios::left; cờ căn
lề phải ios::right
Ví dụ:
float x=43.56768;
cout.width(8);
cout.setf(ios::left).precision(2);
Kết quả: 43.57_ _ _ _
Mặc định trong C++ là căn lề phải, tức là cờ ios::right được bật
+) Định dạng số nguyên:
- ios::dec để hiển thị số nguyên dưới dạng thập phân
- ios::oct để hiển thị số nguyên dưới dạng cơ số 8
- ios::hex để hiển thị số nguyên dưới dạng cơ số 16
+) Định dạng số thực
- ios::fixed: mặc định được hiển thị
- ios::showpoint: hiển thị số chữ số phần thập phân được in ra đúng bằng độ chính
xác.
- ios::scientific: hiển thị số thực dưới dạng hàm mũ
Mặc định cờ ios::fixed được bật và ios::showpoint tắt
1.8.2. Nhập dữ liệu
cin là một đối tượng kiểu istream trong C++. Đây là dòng nhập chuẩn gắn với bàn phím.
Các thao tác nhập dữ liệu từ bàn phím sẽ gắn liền với các thao tác trên dòng cin.
Đối tượng cin bao gồm có:
+) Toán tử nhập >>: để nhập dữ liệu từ bàn phím.
+) Các phương thức như là get(); getline(); ignore();….
1.8.2.1. Toán tử nhập >>
Cú pháp để đọc dữ liệu vào từ bàn phím trên dòng cin sử dụng toán tử nhập như sau:
cin>>thamso1>>thamso2>>………>>thamson;
Trong đó tham số có thể là:
- Biến
- Phần tử mảng
- Con trỏ ký tự.
*) Nguyên tắc nhập lần lượt như sau:
- Bỏ qua các kí tự trắng như tab, dấu cách, enter… đứng trước nếu có.
- Đọc lần lượt các kí tự nhập vào tương ứng với kiểu tham số.
- Nếu gặp kí tự trắng sẽ kết thúc việc nhập.
Ví dụ:
int a;
cin>>a;


Nếu trên bàn phím ta gõ các kí tự như sau: 456X7. Thì kết quả
biến a sẽ nhận là 456.
Theo nguyên tắc trên thì đối với việc nhập chuỗi kí tự ta không thể thực hiện được với
chuỗi kí tự có chứa kí tự trắng.
Ví dụ:
char ten[30];
cin>>ten;
Nếu trên bàn phím ta gõ các kí tự như sau: LE VAN A. Thì kết
quả biến ten sẽ nhận là LE.
1.8.2.1. Nhập kí tự và chuỗi kí tự
Theo nguyên tắc của toán tử nhập >> thì nó chỉ thích hợp với việc nhập dữ liệu cho các
biến có kiểu số, còn đối với kí tự và chuỗi kí tự thì cin có các phương thức nhập rất hiệu quả đó
là: cin.get(); cin.getline(), cin.ignore(); Chúng ta sẽ xem xét lần lượt các hàm này.
a. Hàm cin.get()
Đây là một hàm chồng nên chúng ta có thể sử dụng nó dưới 3 dạng khác nhau:
Dạng 1: int cin.get() để đọc một kí tự từ bàn phím bao gồm cả các kí tự trắng
Ví dụ: char ch;
ch=cin.get();
Nếu ở bàn phím ta gõ ở bàn phím:
+) ABC: thì biến ch sẽ là A
+) : thì biến ch sẽ là
+) : thì biến ch sẽ là
• Dạng 2: istream& cin.get(char& ch) dùng để đọc một kí tự bao gồm cả kí tự trắng
và đặt vào biến tham chiếu ch;
Vì hàm cin.get() ở dạng này có kết quả trả về là một đối tượng cin, nên ta có thể sử
dụng nhiều hàm get() nối đuôi nhau.
Ví dụ 1:
char ch1, ch2 ;
cin.get(ch1);
cin.get(ch2);
Ví dụ 2:
char ch1, ch2 ;
cin.get(ch1).get(ch2);



Nếu ở bàn phím ta gõ ở bàn phím:
+) ABC: thì biến ch1= ‘A’; ch2=’B’
+) A: thì biến ch1= ‘A’; ch2=.
Dạng 3: istream& cin.get(char* str, int n, char gh=’\n’) dùng để nhập chuỗi kí tự
bao gồm cả các kí tự trắng, và đưa chuỗi kí tự đã nhập vào vùng nhớ được trỏ đến bởi
con trỏ str.
Quá trình đọc chuỗi kí tự từ bàn phím sẽ kết thúc khi gặp một trong hai tình huống
sau:
+) Số kí tự nhập vào là n-1
+) Gặp kí tự giới hạn gh


Vì hàm cin.get() ở dạng này có kết quả trả về là một đối tượng cin, nên ta có thể sử
dụng nhiều hàm get() nối đuôi nhau.
Ví dụ:
char ten[30] ;
cin.get(ten, 30) ;
Nếu từ bàn phím ta gõ : LE VAN TUAN thì biến ten = LE VAN TUAN.
Nhưng kí tự vẫn nằm trên dòng nhập, nếu ta đọc hai chuỗi kí tự liền nhau,
thì chuỗi thứ hai sẽ bị trôi.
Ví dụ:
char ten[30] , dc[30];
cin.get(ten, 30).get(dc,30);
Khi đó nếu ta gõ vào từ bàn phím: LE VAN TUAN thì ten= LE VAN
TUAN, nhưng biến dc= “”;
Để khắc phục nhược điểm trên ta dùng hàm get() dạng 1 hoặc hàm ignore() để đọc kí
tự ra khỏi dòng nhập.
Ví dụ:
char ten[30] , dc[30];
cin.get(ten, 30);
cin.get();//hoặc cin.ignore();
cin.get(dc,30);
b. Hàm cin.getline() : istream& cin.getline(char* str, int n, char gh=’\n’)
Hàm cin.getline() giống như hàm cin.get() ở dạng 3 nhưng hàm này tối ưu hơn bởi vì nó
loại kí tự giới hạn ‘\n’ ra khỏi dòng nhập. Như vậy ta có thể dùng hàm cin.getline() để
nhập nhiều chuỗi kí tự cùng một lúc
Ví dụ:
char ten[30] , dc[30];
cin.getline(ten, 30).get getline(dc,30);
c. Hàm cin.ignore() : Dùng để đọc một kí tự ra khỏi dòng nhập
d. Các điểm chú ý khi nhập cả số và chuỗi kí tự
- Khi ta dùng toán tử >> sẽ để lại kí tự trắng trên dòng nhập, nó sẽ làm trôi biến chuỗi
cần nhập phía sau. Vì vậy ta phải dùng hàm cin.get() ở dạng 1 hoặc cin.ignore() để
loại kí tự trắng ra khỏi dòng nhập
Ví dụ :
int a ;
cin>>a ;
char ten[30] ;
cin.ignore() ;
cin>>ten ;


1.9. Dữ liệu kiểu cấu trúc, hợp và liệt kê
1.9.1. Dữ liệu kiểu cấu trúc - struct
Dữ liệu kiểu cấu trúc là kiểu dữ liệu do người dùng định nghĩa bao gồm nhiều thành phần
có các kiểu dữ liệu khác nhau.
- Cú pháp định nghĩa kiểu dữ liệu cấu trúc :
struct ten_kieu{
// Khai báo các thành phần của cấu trúc
};
Ví dụ :
struct SINHVIEN
{
char* hoten ;
char* quequan ;
int tuoi ;
float DTB ;
};
- Khai báo biến có kiểu dữ liệu là cấu trúc :
SINHVIEN *p, ds[100], sv;
- Để truy cập vào các thành phần của cấu trúc ta dùng toán tử . thực hiện như sau:
ds[1].hoten=”Le Van An”;
ds[1].tuoi=20;
Nhưng đối với dạng con trỏ ta sử dụng toán tử -> để truy cập các thành phần của cấu trúc
như sau:
p->hoten=”Nguyen Van A”;
p->tuoi=20;
1.9.2. Dữ liệu kiểu hợp - union
union là kiểu dữ liệu do người dùng định nghĩa, mà nhiều biến khác nhau cùng dùng
chung một vùng nhớ với mục đích tiết kiệm bộ nhớ.
- Cú pháp định nghĩa kiểu dữ liệu hợp:
union ten_kieu{
// Khai báo các thành phần của union
};
Ví dụ :
union Memory_address
{
unsigned char byte_thap ;
unsigned char byte_cao;
unsigned int address;
};
Với ví dụ trên ta thấy 3 biến byte_thap, byte_cao, address đều dùng chung một vùng
nhớ 2 byte trong đó: ô nhớ thứ nhất là biến byte_thap ; ô nhớ thứ 2 là byte_cao, cả 2 ô
nhớ là address.


- Khai báo biến kiểu union
Memory_address add ;
- Việc truy cập các thành phần dữ liệu giống như kiểu có cấu trúc
Nếu add.address=0x1234;
Thì: byte_thap=0x34;
byte_cao=0x12;
-

Trong C++ cho phép dùng kiểu union không tên như sau:
union{
// Khai báo các thành phần của union

};
Ví dụ :
void main()
{
union
{
unsigned long k ;
unsigned char b[3] ;
};
k=0x11223344 ;
cout<cout<<”\n”<cout<<”\n”<cout<<”\n”<cin.get();
}
1.9.2. Dữ liệu kiểu liệt kê – enum
Kiểu liệt kê là kiểu dữ liệu tự định nghĩa mà nó liệt kê ra một số giá trị cần thiết sử
dụng.
- Cú pháp định nghĩa:
enum ten_kieu { danh sách các giá trị};
Ví dụ:
enum MAU{xanh, do, tim, vang};
- Khai báo biến:
MAU mau1, dsmau[4];
mau1=xanh;
- Giá trị kiểu liệt kê là các số nguyên. Nên chúng ta có thể thực hiện được các phép toán
trên các giá trị enum
mau1 có giá trị là 0;
Ví dụ:
MAU m1,m2,m3;
m1=do// m1=1;


-

m2=tim;//m2=2
m3=m1+m2;//m3=3
Không thể thực hiện phép gán một giá trị số nguyên cho các biến kiểu enum
m1=1; // sai, không thể thực hiện được
m1=MAU(2); //đúng m1=tim

1.10. Cấp phát bộ nhớ trong C++
1.10.1. Sử dụng các hàm của C
C++ cũng dùng các hàm cấp phát bộ nhớ của C: malloc() và free();
Ví dụ: Đoạn mã sau tạo mảng động có kích thước là 2 phần tử kiểu int
int* p;
p= (int*) malloc(2*sizeof(int));
p[0]=10;
p[1]=5;
cout.width(3);
cout<free(p);// Giải phóng vùng nhớ
1.10.2. Sử dụng các toán tử của C++: new và delete
- Để cấp phát bộ nhớ C++ sử dụng toán tử new
Ví dụ: Cấp phát vùng nhớ cho 100 phần tử kiểu float
float* p;
p= new float[100];
Để xác định vùng nhớ cấp phát có thành công không ta căn cứ vào giá trị của con trỏ
được cấp phát. Ở ví dụ trên nếu cấp phát thành công con trỏ p sẽ có giá trị khác NULL ngược lại
sẽ có giá trị = NULL.
- Để giải phóng vùng nhớ ta sử dụng toán tử delete
delete contro;
Ví dụ:
float* p;
p= new float[100];
……….
delete p;
1.11. Chương trình mẫu
#include
#include
struct SINHVIEN
{
char hoten[30];
char diachi[30];
float DTB;
};
void main()
{
SINHVIEN* ds;
clrscr();


int N=0;
cout<<"\n So SV N="; cin>>N;
ds= new SINHVIEN[N];
cout<<"\n Nhap du lieu cho DS SV";
for (int i=0; i{
cin.get();
cout<<"\n SV thu "<cout<<"\nHo ten : "; cin.getline(ds[i].hoten,30);
cout<<"\nDia chi: "; cin.getline(ds[i].diachi,30);
cout<<"\nDTB :"; cin>>ds[i].DTB;
}
// In Danh sach
for (i=0; i{
cout<<"\n SV thu "<cout<<"\n"<cout<<"\n"<cout<<"\n"<}
cin.get();
cin.get();
delete ds;
}
1.12. Cấu trúc rẽ nhánh và lựa chọn
1.12.1. Cấu trúc rẽ nhánh
Dạng 1:
if (biểu thức điều kiện)
{
các lệnh thực hiện ;
}
Ví dụ: ta xây dựng một chương trình thực hiện phép chia
#include
void main()
{
float x=0;
float y=0;
cout<<"\n Nhap gia tri 2 so:";
cout<<"\n x=:"; cin>>x;
cout<<"\n y=:"; cin>>y;
if (y!=0)
cout<<"\n Ket qua phep chia la:"<cin.get();}


Trong ví dụ trên ta chỉ thực hiện phép chia khi mẫu số y khác 0
Dạng 2:
if (biểu thức điều kiện)
{
Đoạn lệnh 1;
}
else

{
Đoạn lệnh 2;
}
Cũng như ở ví dụ trên ta thực hiện khi mẫu số bằng 0 đưa ra lời thông báo như
sau:
#include
void main()
{
float x=0;
float y=0;
cout<<"\n Nhap gia tri 2 so:";
cout<<"\n x=:"; cin>>x;
cout<<"\n y=:"; cin>>y;
if (y!=0)
cout<<"\n Ket qua phep chia la:"<else
cout<<"\n Khong thuc hien duoc mau so =0;
cin.get();
}
Dạng 3:

if (Biểu thức điều kiện 1)

{
Lệnh thực hiện

}
else if (Biểu thức điều kiện 2)

{
......
}
else if (Biểu thức điều kiện 3)

{
............
}
else

{
......................
}


Dạng 4: Các câu lệnh if có thể lồng nhau như sau:
if (ch >= '0' && ch <= '9')
kind = digit;
else {
if (ch >= 'A' && ch <= 'Z')
kind = upperLetter;
else {
if (ch >= 'a' && ch <= 'z')
kind = lowerLetter;
else
kind = special;
}
}

Chúng ta cùng xét ví dụ giải phương trình bậc 2 như sau:
Ví dụ: giải phương trình bậc 2:
#include
#include
#include
void main()
{
float a,b,c,x1,x2,detal;
// Nhap du lieu dau vao
cout<<"\n Nhap a=";cin>>a;
cout<<"\n Nhap b=";cin>>b;
cout<<"\n Nhap c=";cin>>c;
//Giai phuong trinh
if (a==0)
{
if (b==0 && c==0) cout<<"\nPTVSN";
else if (b!=0)cout<<"PTCN x1="<<-c/b;
else cout<<"n PTVN";
}
else
{
detal=b*b-4*a*c;
if (detal==0) cout<<"\nPTCo N kep="<<-b/(2*a);
else if (detal<0)
cout<<"\nPTVN";
else
{
cout<<"\nPTCO N0 x1="<<(-b-sqrt(detal))/(2*a);
cout<<"\nPTCO N0 x2="<<(-b+sqrt(detal))/(2*a);
}
}


cin.get();
cin.get();
}
1.12.2. Cấu trúc lựa chọn
Lệnh switch cung cấp phương thức lựa chọn giữa một tập các khả năng dựa trên giá trị
của biểu thức.
Cú pháp:
switch (biểu thức)
{
case hằng1 :
các lệnh; break;
...
case hằng n:
các lệnh; break;
default :
các lệnh;
}
Ví dụ: Chúng ta sử dụng cấu trúc lựa chọn này để viết lịch làm việc trong tuần với biểu
thức lựa chọn là ngày thứ nhập từ bàn phím như sau:
#include
void main()
{
int thu=2;
cout<<"\n Nhap vao ngay thu can xem lich '2, 3, 4, 5, 6, 7,8':";
cin>>thu;
switch(thu)
{
case 2:
cout<<"\n 8h: hop; 13h30 di cong tac VKT";
break;
case 3:
cout<<"\n 8h: du hoi thao";
cout<<"\n 11h: Nop bao cao";
break;
case 4:
cout<<"\n Chuan bi hoi thao";
break;
case 5:
cout<<"\n Nop noi dung hoi thao";
break;
case 6:
cout<<"\n To chuc hoi thao";
break;


default:
cout<<"\n Nghi";
}
cin.get();
cin.get();
}



×