Giáo trình Ngôn ngữ lập trình C++ - Chương 2: Kiểu dữ liệu, biểu thức và câu lệnh

Thông thường dữliệu hay dùng là sốvà chữ. Tuy nhiên việc phân chia chỉ2 loai

dữliệu là không đủ. Đểdễdàng hơn cho lập trình, hầu hết các NNLT đều phân chia dữ

liệu thành nhiều kiểu khác nhau được gọi là các kiểu cơbản hay chuẩn. Trên cơsởkết

hợp các kiểu dữliệu chuẩn, NSD có thểtự đặt ra các kiểu dữliệu mới đểphục vụcho

chương trình giải quyết bài toán của mình. Có nghĩa lúc đó mỗi đối tượng được quản lý

trong chương trình sẽlà một tập hợp nhiều thông tin hơn và được tạo thành từnhiều

loại (kiểu) dữliệu khác nhau. Dưới đây chúng ta sẽxét đến một sốkiểu dữliệu chuẩn

được qui định sẵn bởi C++.

Một biến như đã biết là một sốô nhớliên tiếp nào đó trong bộnhớdùng đểlưu

trữdữliệu (vào, ra hay kết quảtrung gian) trong quá trình hoạt động của chương trình.

Đểquản lý chặt chẽcác biến, NSD cần khai báo cho chương trình biết trước tên biến

và kiểu của dữliệu được chứa trong biến. Việc khai báo này sẽlàm chương trình quản

lý các biến dễdàng hơn nhưtrong việc phân bốbộnhớcũng nhưquản lý các tính toán

trên biến theo nguyên tắc: chỉcó các dữliệu cùng kiểu với nhau mới được phép làm

toán với nhau. Do đó, khi đềcập đến một kiểu chuẩn của một NNLT, thông thường

chúng ta sẽxét đến các yếu tốsau:

− tên kiểu: là một từdành riêng đểchỉ định kiểu của dữliệu.

− sốbyte trong bộnhớ đểlưu trữmột đơn vịdữliệu thuộc kiểu này: Thông

thường sốbyte này phụthuộc vào các trình biên dịch và hệthống máy khác

nhau, ở đây ta chỉxét đến hệthống máy PC thông dụng hiện nay.

pdf22 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 5614 | Lượt tải: 2download
Tóm tắt nội dung Giáo trình Ngôn ngữ lập trình C++ - Chương 2: Kiểu dữ liệu, biểu thức và câu lệnh, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
) / 
2*a; là sai vì theo mức độ ưu tiên x sẽ được tính như −b + ((sqrt(delta)/2) * a) 
(thứ tự tính sẽ là phép toán 1 ngôi đổi dấu −b, đến phép chia, phép nhân và 
cuối cùng là phép cộng). Để tính chính xác cần phải viết (−b + sqrt(delta)) / 
(2*a). 
− Cho a = 1, b = 2, c = 3. Biểu thức a += b += c cho giá trị c = 3, b = 5, a = 6. 
Thứ tự tính sẽ là từ phải sang trái, tức câu lệnh trên tương đương với các câu 
lệnh sau: 
a = 1 ; b = 2 ; c = 3 ; 
b = b + c ; // b = 5 
a = a + b ; // a = 6 
Để rõ ràng, tốt nhất nên viết biểu thức cần tính trước trong các dấu ngoặc. 
b. Phép chuyển đổi kiểu 
Khi tính toán một biểu thức phần lớn các phép toán đều yêu cầu các toán hạng 
phải cùng kiểu. Ví dụ để phép gán thực hiện được thì giá trị của biểu thức phải có cùng 
kiểu với biến. Trong trường hợp kiểu của giá trị biểu thức khác với kiểu của phép gán 
thì hoặc là chương trình sẽ tự động chuyển kiểu giá trị biểu thức về thành kiểu của biến 
được gán (nếu được) hoặc sẽ báo lỗi. Do vậy khi cần thiết NSD phải sử dụng các câu 
lệnh để chuyển kiểu của biểu thức cho phù hợp với kiểu của biến. 
− Chuyển kiểu tự động: về mặt nguyên tắc, khi cần thiết các kiểu có giá trị thấp 
sẽ được chương trình tự động chuyển lên kiểu cao hơn cho phù hợp với phép 
toán. Cụ thể phép chuyển kiểu có thể được thực hiện theo sơ đồ như sau: 
char ↔ int → long int → float → double 
Ví dụ: 
int i = 3; 
float f ; 
f = i + 2; 
trong ví dụ trên i có kiểu nguyên và vì vậy i+2 cũng có kiểu nguyên trong khi f có 
kiểu thực. Tuy vậy phép toán gán này là hợp lệ vì chương trình sẽ tự động chuyển kiểu 
 35
Chương 2. Kiểu dữ liệu, biểu thức và câu lệnh 
cuả i+2 (bằng 5) sang kiểu thực (bằng 5.0) rồi mới gán cho f. 
− Ép kiểu: trong chuyển kiểu tự động, chương trình chuyển các kiểu từ thấp đến 
cao, tuy nhiên chiều ngược lại không thể thực hiện được vì nó có thể gây mất 
dữ liệu. Do đó nếu cần thiết NSD phải ra lệnh cho chương trình. Ví dụ: 
int i; 
float f = 3 ; // tự động chuyển 3 thành 3.0 và gán cho f 
i = f + 2 ; // sai vì mặc dù f + 2 = 5 nhưng không gán được cho i 
Trong ví dụ trên để câu lệnh i = f+2 thực hiện được ta phải ép kiểu của biểu thức 
f+2 về thành kiểu nguyên. Cú pháp tổng quát như sau: 
(tên_kiểu)biểu_thức // cú pháp cũ trong C 
hoặc: 
tên_kiểu(biểu_thức) // cú pháp mới trong C++ 
trong đó tên_kiểu là kiểu cần được chuyển sang. Như vậy câu lệnh trên phải được 
viết lại: 
i = int(f + 2) ; 
khi đó f+2 (bằng 5.0) được chuyển thành 5 và gán cho i. 
Dưới đây ta sẽ xét một số ví dụ về lợi ích của việc ép kiểu. 
• Phép ép kiểu từ một số thực về số nguyên sẽ cắt bỏ tất cả phần thập phân của 
số thực, chỉ để lại phần nguyên. Như vậy để tính phần nguyên của một số thực 
x ta chỉ cần ép kiểu của x về thành kiểu nguyên, có nghĩa int(x) là phần 
nguyên của số thực x bất kỳ. Ví dụ để kiểm tra một số nguyên n có phải là số 
chính phương, ta cần tính căn bậc hai của n. Nếu căn bậc hai x của n là số 
nguyên thì n là số chính phương, tức nếu int(x) = x thì x nguyên và n là chính 
phương, ví dụ: 
int n = 10 ; 
float x = sqrt(n) ; // hàm sqrt(n) trả lại căn bậc hai của số n 
if (int(x) == x) cout << "n chính phương" ; 
else cout << "n không chính phương" ; 
• Để biết mã ASCII của một kí tự ta chỉ cần chuyển kí tự đó sang kiểu nguyên. 
char c ; 
cin >> c ; 
cout << "Mã của kí tự vừa nhập là " << int(c) ; 
 36
Chương 2. Kiểu dữ liệu, biểu thức và câu lệnh 
Ghi chú: Xét ví dụ sau: 
int i = 3 , j = 5 ; 
float x ; 
x = i / j * 10; // x = 6 ? 
cout << x ; 
trong ví dụ này mặc dù x được khai báo là thực nhưng kết quả in ra sẽ là 0 thay vì 
6 như mong muốn. Lý do là vì phép chia giữa 2 số nguyên i và j sẽ cho lại số nguyên, 
tức i/j = 3/5 = 0. Từ đó x = 0*10 = 0. Để phép chia ra kết quả thực ta cần phải ép kiểu 
hoặc i hoặc j hoặc cả 2 thành số thực, khi đó phép chia sẽ cho kết quả thực và x được 
tính đúng giá trị. Cụ thể câu lệnh x = i/j*10 được đổi thành: 
x = float(i) / j * 10 ; // đúng 
x = i / float(j) * 10 ; // đúng 
x = float(i) / float(j) * 10 ; // đúng 
x = float(i/j) * 10 ; // sai 
Phép ép kiểu: x = float(i/j) * 10 ; vẫn cho kết quả sai vì trong dấu ngoặc phép chia 
i/j vẫn là phép chia nguyên, kết quả x vẫn là 0. 
4. Câu lệnh và khối lệnh 
Một câu lệnh trong C++ được thiết lập từ các từ khoá và các biểu thức … và luôn 
luôn được kết thúc bằng dấu chấm phẩy. Các ví dụ vào/ra hoặc các phép gán tạo thành 
những câu lệnh đơn giản như: 
cin >> x >> y ; 
x = 3 + x ; y = (x = sqrt(x)) + 1 ; 
cout << x ; 
cout << y ; 
Các câu lệnh được phép viết trên cùng một hoặc nhiều dòng. Một số câu lệnh 
được gọi là lệnh có cấu trúc, tức bên trong nó lại chứa dãy lệnh khác. Dãy lệnh này 
phải được bao giữa cặp dấu ngoặc {} và được gọi là khối lệnh. Ví dụ tất cả các lệnh 
trong một hàm (như hàm main()) luôn luôn là một khối lệnh. Một đặc điểm của khối 
lệnh là các biến được khai báo trong khối lệnh nào thì chỉ có tác dụng trong khối lệnh 
đó. Chi tiết hơn về các đặc điểm của lệnh và khối lệnh sẽ được trình bày trong các 
chương tiếp theo của giáo trình. 
 37
Chương 2. Kiểu dữ liệu, biểu thức và câu lệnh 
V. THƯ VIỆN CÁC HÀM TOÁN HỌC 
Trong phần này chúng tôi tóm tắt một số các hàm toán học hay dùng. Các hàm 
này đều được khai báo trong file nguyên mẫu math.h. 
1. Các hàm số học 
• abs(x), labs(x), fabs(x) : trả lại giá trị tuyệt đối của một số nguyên, số nguyên 
dài và số thực. 
• pow(x, y) : hàm mũ, trả lại giá trị x lũy thừa y (xy). 
• exp(x) : hàm mũ, trả lại giá trị e mũ x (ex). 
• log(x), log10(x) : trả lại lôgarit cơ số e và lôgarit thập phân của x (lnx, logx) . 
• sqrt(x) : trả lại căn bậc 2 của x. 
• atof(s_number) : trả lại số thực ứng với số viết dưới dạng xâu kí tự s_number. 
2. Các hàm lượng giác 
• sin(x), cos(x), tan(x) : trả lại các giá trị sinx, cosx, tgx. 
 38
Chương 2. Kiểu dữ liệu, biểu thức và câu lệnh 
BÀI TẬP 
1. Viết câu lệnh khai báo biến để lưu các giá trị sau: 
− Tuổi của một người − Số lượng cây trong thành phố 
− Độ dài cạnh một tam giác − Khoảng cách giữa các hành tinh 
− Một chữ số − Nghiệm x của phương trình bậc 1 
− Một chữ cái − Biệt thức ∆ của phương trình bậc 2 
2. Viết câu lệnh nhập vào 4 giá trị lần lượt là số thực, nguyên, nguyên dài và kí tự. In 
ra màn hình các giá trị này để kiểm tra. 
3. Viết câu lệnh in ra màn hình các dòng sau (không kể các số thứ tự và dấu: ở đầu 
mỗi dòng) 
1: Bộ Giáo dục và Đào tạo Cộng hoà xã hội chủ nghĩa Việt Nam 
2: 
3: Sở Giáo dục Hà Nội Độc lập - Tự do - Hạnh phúc 
Chú ý: khoảng trống giữa chữ Đào tạo và Cộng hoà (dòng 1) là 2 tab. Dòng 2: để 
trống. 
4. Viết chương trình nhập vào một kí tự. In ra kí tự đó và mã ascii của nó. 
5. Viết chương trình nhập vào hai số thực. In ra hai số thực đó với 2 số lẻ và cách 
nhau 5 cột. 
6. Nhập, chạy và giải thích kết quả đạt được của đoạn chương trình sau: 
#include 
void main() 
{ 
 char c1 = 200; unsigned char c2 = 200 ; 
 cout << "c1 = " << c1 << ", c2 = " << c2 << "\n" ; 
cout << "c1+100 = " << c1+100 << ", c2+100 = " << c2+100 ; 
} 
7. Nhập a, b, c. In ra màn hình dòng chữ phương trình có dạng ax^2 + bx + c = 0, 
 39
Chương 2. Kiểu dữ liệu, biểu thức và câu lệnh 
trong đó các giá trị a, b, c chỉ in 2 số lẻ (ví dụ với a = 5.141, b = −2, c = 0.8 in ra 
5.14 x^2 −2.00 x + 0.80). 
8. Viết chương trình tính và in ra giá trị các biểu thức sau với 2 số lẻ: 
a. 333 ++ b. 
2
12
12
1
+
+
9. Nhập a, b, c là các số thực. In ra giá trị của các biểu thức sau với 3 số lẻ: 
a. a2 − 2b + ab/c c. 3a − b3 − 2 c 
b. 
a
acb
2
42 − d. 142 +− bc/ab/a 
10. In ra tổng, tích, hiệu và thương của 2 số được nhập vào từ bàn phím. 
11. In ra trung bình cộng, trung bình nhân của 3 số được nhập vào từ bàn phím. 
12. Viết chương trình nhập cạnh, bán kính và in ra diện tích, chu vi của các hình: 
vuông, chữ nhật, tròn. 
13. Nhập a, b, c là độ dài 3 cạnh của tam giác (chú ý đảm bảo tổng 2 cạnh phải lớn 
hơn cạnh còn lại). Tính chu vi, diện tích, độ dài 3 đường cao, 3 đường trung tuyến, 
3 đường phân giác, bán kính đường tròn nội tiếp, ngoại tiếp lần lượt theo các công 
thức sau: 
C = 2p = a + b + c ; S = )cp)(bp)(ap(p −−− ; 
a
Sha
2= ; ma = 222 22
2
1 acb −+ ; ga = )ap(bcp
cb
−+
2 ; 
p
Sr = ; 
S
abcR
4
= ; 
14. Tính diện tích và thể tích của hình cầu bán kính R theo công thức: 
S = 4πR2 ; V = RS/3 
15. Nhập vào 4 chữ số. In ra tổng của 4 chữ số này và chữ số hàng chục, hàng đơn vị 
của tổng (ví dụ 4 chữ số 3, 1, 8, 5 có tổng là 17 và chữ số hàng chục là 1 và hàng 
đơn vị là 7, cần in ra 17, 1, 7). 
16. Nhập vào một số nguyên (có 4 chữ số). In ra tổng của 4 chữ số này và chữ số đầu, 
chữ số cuối (ví dụ số 3185 có tổng các chữ số là 17, đầu và cuối là 3 và 5, kết quả 
 40
Chương 2. Kiểu dữ liệu, biểu thức và câu lệnh 
in ra là: 17, 3, 5). 
17. Hãy nhập 2 số a và b. Viết chương trình đổi giá trị của a và b theo 2 cách: 
− dùng biến phụ t: t = a; a = b; b = t; 
− không dùng biến phụ: a = a + b; b = a - b; a = a - b; 
In kết quả ra màn hình để kiểm tra. 
18. Viết chương trình đoán số của người chơi đang nghĩ, bằng cách yêu cầu người 
chơi nghĩ một số, sau đó thực hiện một loạt các tính toán trên số đã nghĩ rồi cho 
biết kết quả. Máy sẽ in ra số mà người chơi đã nghĩ. (ví dụ yêu cầu người chơi lấy 
số đã nghĩ nhân đôi, trừ 4, bình phương, chia 2 và trừ 7 rồi cho biết kết quả, máy 
sẽ in ra số người chơi đã nghĩ). 
19. Một sinh viên gồm có các thông tin: họ tên, tuổi, điểm toán (hệ số 2), điểm tin (hệ 
số 1). Hãy nhập các thông tin trên cho 2 sinh viên. In ra bảng điểm gồm các chi 
tiết nêu trên và điểm trung bình của mỗi sinh viên. 
20. Một nhân viên gồm có các thông tin: họ tên, hệ số lương, phần trăm phụ cấp (theo 
lưong) và phần trăm phải đóng BHXH. Hãy nhập các thông tin trên cho 2 nhân 
viên. In ra bảng lương gồm các chi tiết nêu trên và tổng số tiền cuối cùng mỗi 
nhân viên được nhận. 
 41

File đính kèm:

  • pdfGiáo trình Ngôn ngữ lập trình C++ - Chương 2 Kiểu dữ liệu, biểu thức và câu lệnh.pdf