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.
) / 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:
- 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.pdf