🔙 Quay lại trang tải sách pdf ebook Giáo trình ngôn ngữ lập trình C++
Ebooks
Nhóm Zalo
T S . VŨ V IỆ T VŨ (C h ủ biên)
T h S . PH Ù N G TH Ị TH U H IỂN
Giáo trình
Ngôn ngữ lập trình
N
TN
\ _ H 7 NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT
TS. VŨ VIỆT VŨ (Chủ biên)
ThS. PHÙNG THỊ THU HIÈN
GIÁO TRÌNH
NGỔN NGff LẬP TRÌNH C++ ■ NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT
LỜI NÓI ĐẦU
Giáo trình Ngôn ngữ lập trình C++ được biên soạn nhằm mục đích phục vụ cho sinh viên các ngành kỹ thuật đồng thời là cuốn giáo trình tham khảo cho các giảng viên trong lĩnh vực Công nghệ thông tin. Mục đích cùa giáo trình này cung cấp đầy đủ các kiến thức về việc lập chương trình trên máy tính bằng ngôn ngữ C++, sau khi tìm hiếu xong giáo trình này độc giả có thế học tiếp các môn học về lập trình chuyên sâu trong các lĩnh vực chuyên ngành như Vi xử lý - Vi điều khiến, Lập trình Java, ASP, Lập trình phần mềm cho các thiết bị di động,... Nội dung giáo trình bao gồm 9 chương cụ thể như sau:
Chương ỉ trình bày tổng quan các khái niệm cơ bản ve việc lập trình trên máy tinh, các khái niệm về phần cúng, phần mềm cũng như các bước viết chương trình trên máy tính.
Chương 2 trình bày các khái niệm cơ bản cùa ngôn ngữ C++, cầu trúc chung của một chương trình C++, làm tiền đề cho việc chuẩn bị tìm hiểu cũng như viết chương trình ở các chương sau.
Chương 3 và Chương 4 trình bày về câu lệnh rẽ nhánh và câu lệnh lặp.
Chương 5 trình bày về khái niệm hàm trong C++, đây là khái niệm quan trọng cùa mỗi ngôn ngữ lập trình.
Chương 6 vò Chương 7 trình bày kiểu dữ liệu mảng, kiểu xâu kí tự đây là các kiểu dữ liệu có nhiều ứng dụng trong thực tế.
Chương 8 trình bày về lập trình hướng đoi tượng.
Cuối cưng, Chương 9 giới thiệu hai kiểu dữ liệu là kiểu con trỏ và kiểu cấu trúc.
Trong giáo trình này, hai phương pháp lập trình cơ bản là lập trình hướng thủ tục (hướng module) và lập trình hướng đối tượng sẽ được giói thiệu. Nội dung các chương từ 1 đến 7 sẽ tập trung vào cách viết chương trình theo hướng thủ tục, chương 8 và 9 sẽ giới thiệu đến độc già phương pháp lập trình hướng đối tượng. Trên thực tế hai phương pháp lập trình này vẫn
3
tôn tại song song, tùy theo mục đích ứng dụng, người thiết kế và xây dựng chương trình sẽ đưa ra các chiến lược phù hợp để giải quyết bài toán theo phương pháp thích hợp.
Với mỗi chương kiến thức về lý thuyết được trình bày ngan gọn, súc tích kèm theo nhiều ví dụ giúp sinh viên rèn luyện kỹ năng cũng như năm được nội dung kiến thức sau khi tìm hiểu và đi kèm là các bài tập tông hợp cuôi chương. Trong quá trình biên soạn giáo trình nhóm tác già đã nhận được nhiều ỷ kiến đóng góp cùa các đồng nghiệp và đặc biệt là cùa các phản biện cũng như những thành viên trong hội đong nghiệm thu, với tất cả những ỷ kiến quý báu đó chúng tôi xin chân thành cảm ơn. Cuối cùng mặc dù đã cố gang biên soạn nhưng nội dung giáo trình không tránh khỏi những hạn chế, chúng tôi rất mong nhận được những ý kiến đóng góp của độc giả đề tiếp tục bổ sung và hoàn thiện cho các lần tái bản tiếp theo.
VŨ VIỆT VŨ
Email: [email protected]
4
MỤC LỤC
Lời nói đ ầ u ........................................................................................................ 3 Chương 1. Tổng quan.......................................................................................9 1.1. Khái niệm về chương trình và ngôn ngữ lập trình..................................9 1.2. Ngôn ngữ lập trình C++............................................................................ 12 1.3. Phần mềm và phần cứng........................................................................... 13
1.3.1. Phần m ềm ....................................................................................... 13 1.3.2. Phần cúng....................................................................................... 14 1.4. Thuật toán................................................................................................... 15 Bài tập chương 1............................................................................................... 22 Chương 2. Các khái niệm cơ bản trong C + + ............................................24 2.1. Các thành phần cơ bản của C ++............................................................. 24 2.1.1. Bộ ký tự ...........................................................................................24 2.1.2. Định danh và từ khỏa...................................................................24 2.1.3. Câu lệnh..........................................................................................25 2.2. Cấu trúc của một chương trình trong C++.............................................27 2.3. Các kiểu dữ liệu và cách sử dụng...........................................................29 2.3.1. Khái niệm về kiểu dữ liệu............................................................ 29 2.3.2. Kiểu dữ liệu cơ sở......................................................................... 29 2.4. Biến và cách khai báo biến......................................................................32 2.4.1. Cách khai báo biến....................................................................... 32 2.4.2. Phạm vi hoạt động cùa các biến................................................. 33 2.5. Khai báo hằng trong C + + ........................................................................ 34 2.6. Biểu thức và các phép toán......................................................................36 2.6. ỉ. Các phép toán cơ bàn trong C++.......................................... 36 2.6.2. Biểu thức.........................................................................................38 2.6.3. Một số hàm toán học trong C + + ................................................ 39 Bài tập chương 2 ............................................................................................... 42
5
Chương 3. Các câu lệnh điều kiện...............................................................47 3.1. Giới th iệu .................................................................................................... 47 3.2. Câu lệnh i f ................................................................................................48 3.3. Một số ví dụ về câu lệnh if........................................................................51 3.4. Cấu trúc switch........................................................................................... 55 Bài tập chương 3................................................................................................ 57 Chương 4. Các câu lệnh lặ p ..........................................................................64
4.1. Giới thiệu.................................................................................................... 64 4.2. Câu lệnh w h i l e ........................................................................................64 4.3. Câu lệnh f o r ............................................................................................. 69 4.4. Câu lệnh d o - w h i l e ................................................................................ 73 4.5. Sự khác nhau giữa các câu lệnh lặp ........................................................ 79 Bài tập chương 4 ................................................................................................84 Chương 5. Hàm trong C + + ...........................................................................88
5.1. Giới thiệu.................................................................................................... 88 5.2. Khai báo và cách sử dụng hàm ................................................................89 5.3. Hàm đệ quy...............................................................................................102 Bài tập chương 5 ..............................................................................................106 Chương 6. Kiểu mảng...................................................................................115 6.1. Khái niệm m ảng....................................................................................... 115 6.2. Mảng một chiều.......................................................................................116
6.2.1. Khai báo mảng một chiều...........................................................116 6.2.2. Nhập xuất dữ liệu cho mảng một chiều.....................................117 6.2.3. Sắp xếp và tìm kiếm trên mảng một chiều................................124 6.2.4. Một số ví dụ khác.........................................................................128
6.3. Mảng hai chiều.........................................................................................134 6.4. Sử dụng mảng làm tham số trong h àm ................................................ 144 Bài tập chương 6 ..............................................................................................145 Chương 7. Xâu kí t ự .....................................................................................150 7.1. Khái niệm xâu và cách khai b áo ........................................................... 150 7.1.1. Khái niệm xâu kí tự ..................................................................... 150
6
7.1.2. Khai báo xâu kí tự....................................................................... 150 7.2. Nhập và xuất xâu ký tự ..........................................................................152 7.3. Một số hàm sù dụng trên xâu kí tự ....................................................... 158 Bài tập chương 7 ..............................................................................................168 Chương 8. Lập trình hướng đối tượng vói C + +.................................. 171 8.1. Giới thiệu.................................................................................................. 171 8.2. Hàm tạo (constructors ) ........................................................................ 173 8.3. Phép gán.....................................................................................................175 8.4. Hàm toán t ử ..............................................................................................178 8.5. Sự chuyển đổi kiều dữ liệu trong lớp....................................................180
8.5.1. Hàm toán tử chuyển đổi từ kiểu cơ sở sang kiểu lớp..181 8.5.2. Hàm toán từ chuyền đối từ kiểu lớp sang kiểu cơ sở..183 8.5.3. Hàm toán từ chuyển đổi từ kiểu lớp sang kiểu lớp.....184
8.6 Thừa kế và sự tương tác giữa các lớp....................................................186 8.6.1. Thừa k ế ......................................................................................... 186 8.6.2. Cách sử dụng các từ khóa public, private và
protected trong thừa kế lớ p ..................................................................188 8.7. Tính đa hình............................................................................................. 189 Bài tập chương 8 ..............................................................................................191 Chương 9. Kiểu con trỏ và kiểu cấu trúc.................................................193
9.1. Kiểu con trỏ ............................................................................................. 193 9.1.1. Khái niệm kiểu con trỏ................................................................ 193 9.1.2. Mối liên hệ giữa mảng và con trỏ............................................. 195 9.1.3. Truyền tham số là con trỏ cho hàm..........................................197 9.1.4. Cấp phát bộ nhớ động................................................................199
9.2. Kiểu cấu trúc............................................................................................201 9.2.1. Giới thiệu kiểu cấu trúc............................................................. 201 9.2.2. Mảng với các phần từ có kiểu cấu trúc...................................203 9.2.3. Danh sách liên kết trên cấu trúc...............................................204
Bài tập chương 9 .......................................................................................... 216 Tài liệu tham khảo......................................................................................... 219
Chương 1
TỔNG QUAN
N ộ i dung cùa chương này cung cấp cho độc giả kiến thức tổng quan về máy tính, phần mềm cũng như quy trình viêt chương trình trên máy tính. Điểm quan trọng cùa chương này là độc giả cần nắm được tong quan về việc viết chương trình trên máy tính và hiểu được khái niệm giải thuật cũng như cách biêu diên và xây dựng giải thuật.
1.1. Khái niệm về chương trình và ngôn ngữ lập trình
Ngày nay, rất nhiều hệ thống máy móc hiện đại hoạt động được đều cần có một hệ thống xử lý thông tin để điều khiển hoặc trợ giúp quá trình điều khiển. Hệ thống này gọi là chương trình. Một số ví dụ sử dụng chương trình để thực hiện việc điều khiển hệ thống có thề kể ra như người máy, robot, các hệ thống tự động hóa trong công nghiệp, các sản phẩm như tủ lạnh, máy giặt... Vậy chương trình máy tính là gì? Chương trình có thể hiểu là tập hợp hữu hạn các câu lệnh đuợc bố trí theo một trình tự xác định nhàm giải quyết yêu cầu của bài toán đặt ra, để thực hiện đuợc chương trình chúng ta phải có một hệ thống máy tính đi kèm với nó. Khái niệm hệ thống máy tính có thể là một máy vi tính đom chiếc, một nhóm các máy tính kết nối với nhau, một máy tính bỏ túi đơn giản, một hệ thống vi điều khiển, hay một hệ thống siêu máy tính... Khái niệm chuơng trình trên thực tế còn gọi là phần mềm. Chương trình được viết bởi một hoặc vài ngôn ngữ lập trình cụ thể nào đó. Trải qua quá trình phát triển gần một thế kỷ bắt đầu từ những năm 40 của thế kỷ XX, đã có rất nổiều ngôn ngữ lập trình ra đời nhằm mục đích viết chương trình cho các ứng dụng khác nhau. Có những ngôn ngữ lập trình đã không còn sử dụng nữa tuy nhiên sự ra đời của ngôn ngữ lập trình sau chính là sự kế thừa của các ngôn ngũ lập trình trước đó. Ngôn ngữ lập trình có thể chia thành hai loại: ngôn ngữ lập trình bậc thấp (ngôn ngữ máy, ngôn ngữ assembly) và ngôn ngữ lập trình bậc cao (C++, Java, Visual Basic, ASP,.. .)•
Ngôn ngữ máy
Chương trình viết trên ngôn ngữ máy bao gồm một dãy các lệnh máy mà CPU có thể thực hiện trực tiếp. Tuỳ theo thiết kế về phần cứng, mỗi loại
9
máy tính có một tập lệnh cho ngôn ngữ máy khác nhau. Các lệnh viêt băng ngôn ngữ máy nói chung ở dạng nhị phân hoặc biên thê của chúng trong hệ đếm 16. Ví dụ về các lệnh trong ngôn ngữ máy:
11000000 000000000001 OOOOŨOŨOŨŨIO
11110000 ŨOŨOŨOOOŨOIŨ 00ŨŨŨŨ000Ũ11
Mỗi lệnh của ngôn ngữ máy gồm hai phần: phần chi dẫn và phân địa chi. Phần chi dẫn là các số nằm bên trái, phần bên phải là địa chi sừ dụng. Chẳng hạn, dòng lệnh đầu tiên của ví dụ trên là câu lệnh cộng, giá trị của hai địa chỉ trong phần còn lại của câu lệnh trên sẽ được cộng vào với nhau. Ngôn ngữ máy có nhược điểm là khó học vì phải hiểu cấu trúc cùa hệ thống máy tính cũng như các câu lệnh ở dạng nhị phân.
Ngôn ngữ assembly
Để khắc phục nhược điểm của ngôn ngữ máy, người ta đề xuất một ngôn ngữ giao tiếp với máy ờ mức độ thân thiện với con người hơn gọi là hợp ngữ. v ề cơ bản, các câu lệnh của hợp ngữ có cấu trúc rất giống với ngôn ngữ máy, điểm khác là trong hợp ngữ có thể viết lệnh dưới dạng mã chữ. Mã chữ thể hiện mã lệnh hoặc các đối tượng trong lệnh (trong ngôn ngữ máy nó là mã lệnh và địa chỉ của đối tượng). Mã lệnh ở dạng chữ thường chính là những từ trong tiếng Anh có ý nghĩa rõ ràng, còn đối tượng do ta tự đặt tên phù họp với ý niệm về đối tượng đó. Ví dụ, nếu đoạn chương trình trên dùng để cộng chiều dài và chiều rộng của hình chữ nhật cho việc tính nửa chu vi thì trong hợp ngữ ta chỉ cần viết:
ADD 2, 5
Như vậy ngôn ngữ assembly cần một bộ chuyển đổi để chuyển các mã lệnh trên về dạng mã máy. Bộ chuyển đổi này trên thực tế gọi là assembler. Hạn chế của ngôn ngữ assembly là nó cũng phụ thuộc vào cấu trúc của các dòng máy tính, mỗi loại vi xử lý khác nhau sẽ có bộ lệnh khác nhau.
Ngôn ngữ lập trình bậc cao
Ngôn ngữ máy và ngôn ngữ assembly gọi là ngôn ngữ bậc thấp, các ngôn ngữ này có hạn chế là chỉ sử dụng được cho một loại máy hoặc một kiểu máy xác định. Ngược lại, ngôn ngữ lập trình bậc cao sử dụng các câu lệnh giống với ngôn ngữ thông thường, chẳng hạn như tiếng Anh, và có
10
thể chạy trên nhiều loại máy tính khác nhau. Hơn nữa, do các câu lệnh gần giống với ngôn ngữ thông thuờng nên chương trình sẽ dễ viết, dê đọc, dễ sửa lỗi. Hiện nay, các phần mềm ứng dụng đa số đều được viêt bởi ngôn ngữ lập trình bậc cao; các phần mềm dùng cho các mục đích chuyên biệt trong điều khiển, trong các hệ thống như robot, người máy có thể được viết bởi ngôn ngữ lập trình bậc thấp. Một số ngôn ngữ lập trình bậc cao đang được sừ dụng như C++, Java, Visual Basic, c#, ASP... Chẳng hạn, sừ dụng ngôn ngữ C++, câu lệnh tính tổng và tích hai sô nguyên a và b là:
tong = a + b;
tich = a * b;
Sau khi viết xong chương trình, chúng ta cần dịch chương trình sang ngôn ngữ máy. Việc thực hiện dịch chương trình sang ngôn ngữ máy có thể thực hiện bằng hai cách: thực hiện dịch và thi hành từng câu lệnh riêng rẽ gọi là trình thông dịch, hoặc dịch tất cả các câu lệnh sang ngôn ngữ máy rồi mới thực hiện - gọi là trình biên dịch. Với C++, trước tiên, chúng ta cần một trình soạn thào để soạn chương trình theo cú pháp của C++. Sau đó chương trình dịch (với C++ là trình biên dịch) sẽ chuyển chương trình này sang ngôn ngữ máy, tiếp theo sẽ liên kết chương trình với các tác nhân khác (mà chương trình yêu cầu) để được một chương trình hoàn chinh thực hiện trên máy tính. Chương trình này sẽ được nạp vào bộ nhớ của máy tính và thực hiện.
Lập trình hướng thủ tục và lập trình hướng đối tượng
Hiện nay, để viết chuơng trình, chúng ta có thể thiết kế các chương trình theo hai phương pháp chính là phương pháp hướng thù tục và phương pháp hướng đối tượng. Hiểu một cách đơn giàn phương pháp lập trình hướng thù tục là việc chia bài toán lớn thành các bài toán nhỏ hom và giải quyết từng bài toán con một, trong khi phương pháp hướng đối tượng giải quyết bài toán bàng cách chia bài toán thành các đối tượng trong đó chứa cà dữ liệu và các phương thức để xù lý dữ liệu đó. Ưu điểm của lập trình hướng đối tượng là tính kế thừa, tức là các đoạn mã có thể được kế thừa nhiều lần trong khi viết chương trình. Ngày nay, trên thực tế vẫn tồn tại hai chiến lược thiết kế chương trình như trên. Tùy theo mục đích của bài toán đối với các ứng dụng cụ thể, người thiết kế và xây dựng chương trình sẽ có những lựa chọn phù hợp.
11
1.2. Ngôn ngữ lập trình C++
Ngôn ngữ C++ được xây dựng dựa trên nền tảng của ngôn ngữ c . Nám 1970, ngôn ngữ c được giới thiệu bời Ken Thomson, Dennis Ritchie, và Brian Kemighan, nó trờ thành ngôn ngữ cho các bài toán khoa học kỹ thuật. Ngôn ngữ C++ được giới thiệu vào đầu những năm 80 của thê kỷ XX bời Bjame Stroustrop, đây là ngôn ngữ lập trình hướng đôi tượng. Trải qua nhiều năm phát triển và hoàn thiện, hiện nay C++ là ngôn ngữ phổ biến trên thế giới, nó được dùng trong hầu khắp các trường đại học và là ngôn ngữ phù hợp cho các bài toán trong khoa học kỹ thuật.
M ôi trường lập trình của C++
Hiện nay, có một số môi trường cho phép ta viết, dịch và thực hiện chương trình C++ như: Dev C++, Borland C++, Visual Studio... Hình 1- 1 là giao diện của phần mềm Dev C++, trong đó hệ thống giao diện bao gồm các chức năng như File, Edit... dùng để hỗ trợ các thao tác trong quá trình soạn thảo chương trình. Sau khi viết chương trình, chúng ta phải lưu lại tệp lên đĩa, dịch, kiểm tra lỗi sau đó thi hành chương trình. Hình 1-2 là một giao diện khi sử dụng Visual Studio C++, hệ thống phần mềm của hãng Microsoft cho chúng ta công cụ để lập trình với C++. Giao diện của Visual Studio C++ cũng tương tự như Dev C++.
H a Edt S m r* Vim m s a e ế t i 11 1 9 i j ũ w * w
PnnM Bwcua Tort* ASVâ v*tdm» Na*
ị • - ỉ ỉ 1 « ' « « 1 S Q t ! S V [ > ! | Ì i . t - L U M . . ! - . .1
iiH B a l cleHe l a í s d 1-M.q* Ị
1 •incluàt <Ì0ỉtreM>
2
3 Mlng Macspau Itdt
4
s lot Mln()
l ẹ {
7 cout « -Hello MorldlXn*)
• rrtara 8) ,
Ũ
- Output S ite : 1,30218029022217 H1B . 1 Abort Ccnp.lr.on _ ClmtílMtíoa 0.1 1 , 2
Hình 1-1. Giao diện của môi trưòrng lập trình với Dev C++ 12
Hình 1-2 Giao diện cùa Visual Studio 2012
1.3. Phần mềm và phần cứng
1.3.1. Phần mềm
Phần mềm (chương trình) là một tập hợp các câu lệnh được viết bởi một hay một vài ngôn ngữ lập trình nhằm mục đích giài quyết một bài toán cụ thể nào đó. Phần mềm hiện nay có ứng dụng rất rộng rãi và có thể sử dụng ở rất nhiều các lĩnh vực khác nhau:
Phần mềm ứng dụng: quàn lý hệ thống thông tin, tài nguyên, nguồn nhân lực, website, quản trị văn phòng, trò chơi...
Phần mềm trợ giúp: phục vụ quá trình học tập, giảng dạy, nghiên cứu, mô phỏng, già lập tình huống...
Phần mềm điều khiển: các phần mềm ứng dụng trong hệ thống tự động hóa, điều khiển trong công nghiệp, các thiết bị như máy giặt, tủ lạnh, ô tô, vũ trụ,...
Phần mềm thông minh: nhận dạng, tìm kiếm, phân loại, dự đoán, phân tích, khai phá dữ liệu, robot và nguời máy thông minh.
Việc xây dựng phần mềm được thực hiện qua các bước cơ bản sau: Phân tích để hiểu rõ yêu cầu bài toán: hiểu chính xác yêu cầu bài toán là nhiệm vụ đầu tiên của quá trình xây dựng chương trình. Trong bước này, chúng ta cần xác định rõ đầu vào (input) và đầu ra (output) của bài toán, các ràng buộc về dữ liệu, kiểu dữ liệu,...
13
Xây dựng và thiết kế giải thuật: Từ pha phân tích yêu cầu, chúng ta cần phải xác định chiến thuật để giải quyết bài toán, cân phải chi ra các bước xác định để biến input thành output.
Mã hóa: Giải thuật sẽ được chuyển sang mã lệnh băng ngôn ngữ lập trình cụ thể để thực hiện.
Kiểm thử: Sau khi viết xong chương trình, chúng ta cân phải kiểm tra (testing) chương trinh viết ra có đúng với yêu câu cùa bài toán hay không. Một chương trình cần tiến hành hàng loạt các bộ dữ liệu kiểm thừ để kiềm tra xem đầu ra có như mong muôn hay không.
Một cách trực quan, chúng ta có thể hình dung các bước xây dựng chương trình như trong hình 1-3.
Các
bước cùa quá trình viết
chương trình
Mã hóa Kiểm thử
■*-------------------►
Thiết kế thuật toán
Phân tích
Thời gian
Hình 1-3 Các bước của quá trình xây dựng chương trình trên máy tính
1.3.2. Phần cứng
Phần cứng được hiểu là toàn bộ các thiết bị máy tính cấu thành nên hệ thống máy tính để thực thi các phần mềm. Mỗi phần mềm phải được thực thi trên một môi trường phần cứng cụ thể. Neu như phần mềm được ví nhu phần hồn thì phần cứng được ví như phần xác của một hệ thống. Nếu chi có phần cứng mà không có phần mềm thì không thực hiện được và nói đến phần mềm thì cần có phần cứng đi kèm. Các phần mềm đều chạy trên một hệ thống gọi là hệ thống máy tính. Hệ thống này có các tính chất sau:
Phải có thiết bị nhập xuất dữ liệu.
Phải lưu trữ được thông tin.
14
Phải thực hiện được các thao tác toán học và logic.
Phải quản lý, điều khiển và ra lệnh cho toàn bộ hệ thông hoạt động.
Các máy tính bắt đầu được nghiên cứu, sản xuất và đưa vào sử dụng những năm 40 của thế kỷ XX. Ngày nay, với sự phát triển mạnh mẽ của khoa học công nghệ, máy tính không còn xa lạ với con người ở khăp nơi trên thế giới. Các thiết bị như máy tính để bàn, máy tính xách tay, hay điện thoại thế hệ mới đều được coi là các hệ thống máy tính. Hình 1-4 minh họa các khối cơ bản của một máy tính.
1.4. Thuật toán
Trước khi một chương trinh được viết, người lập trình (nhóm lập trình) phải hiểu rõ vấn đề cần giải quyết: dữ liệu đầu vào là gì, kết quả mong muốn đạt được những gì và phải có trình tự để biến dữ liệu đầu vào thành kết quà ra mong muốn. Trình tự hay lời giải dùng để giải quyết bài toán trong trường hợp này gọi là thuật toán (algorithm), v ề cơ bản, thuật toán được định nghĩa là một dãy hữu hạn các bước nhằm diễn tả quá trình xử lý dữ liệu đầu vào nhằm đưa ra kết quả của bài toán như mong muốn. Các tính chất của thuật toán bao gồm:
■ Đầu vào: Đầu vào của thuật toán là dữ liệu bài toán cung cấp cho chương trình.
15
* Đầu ra: Đầu ra cùa thuật toán là kết quả của yêu cầu cho bài toán đó.
■ Tinh chính xác\ Mỗi thuật toán phải đưa ra kết quà chính xác với mỗi đầu vào tương ứng.
■ Tính hữu hạn: Một thuật toán cần đưa ra kết quả sau một sô hữu hạn bước.
■ Tính phổ dụng-. Thuật toán phải giải quyết được một lớp các bài toán có cùng dạng, không đơn thuần chỉ là một bài toán đặc biệt.
Các phưong pháp biểu diễn thuật toán cơ bản
- Phương pháp liệt kê từng bước
Trong phương pháp này, các bước thực hiện ý tường giải quyêt bài toán sẽ được liệt kê theo trình tự tưng bước từ đầu đến cuối. Phương pháp này thực tế chi phù hợp cho các dự án nhỏ, với các dự án lớn sẽ rất khó áp dụng vì số lượng các bước nhiều, gây khó hiểu cho các công đoạn tiếp theo.
Ví dụ 1.1. Mô tả thuật toán tìm giá trị lớn nhất của một dãy hữu hạn các số nguyên.
Giải: Chúng ta thường gặp bài toán này trong thực tế chẳng hạn như tìm người có điểm cao nhất cùa kỳ thi tuyển sinh đại học, hay tìm kiếm mặt hàng có khách hàng mua nhiều nhất của một siêu thị... Thuật toán trên được minh họa theo phương pháp liệt kê từng bước nhu sau:
Bước 1: Giả định đặt giá trị lớn nhất max bằng giá trị cùa phần tử đầu tiên của dãy
Bước 2: So sánh phần từ thứ hai với giá trị max, nếu giá trị max nhỏ hơn thì đặt giá trị max bằng giá thị thứ hai
Bước 3: Neu vẫn còn các phần tò tiếp theo thì thực hiện lập lại giống như bước hai
Bước 4: Thuật toán sẽ dừng lại nếu không còn phần tử nào chưa được xét. Phần tử max cuối cùng sẽ là giá trị lớn nhất của dãy.
- Phương pháp sử dụng sơ đồ khối
16
Với phương pháp sừ dụng sơ đồ khối, mỗi thao tác của thuật toán sẽ đuợc minh họa bằng các khối điều này làm cho các công đoạn cùa thuật toán được trực quan, dễ hiểu cho nguời sừ dụng ở các công đoạn sau. Hình 1-5 mô tả các khối được sử dụng trong khi xây dựng sơ đồ khối.
Khối bắt đầu / kết thúc
Khối nhập, xuất dữ liệu
Khối thao tác
TRUỜNt$$fi?OằÌi!lặSCÔNG NGHỆ
r n u V I Ệ N
1 'H Ò N G M Ư Ợ N
Sử dụng các thao tác đã xây dựng trước
______________ ^ Kết nối giữa các khối
Hình 1-5. Các kí hiệu dùng trong sơ đồ khối
Ví dụ 1.2. Vẽ sơ đồ khối minh họa giải thuật giải phương trình bậc nhất ax + b = 0.
Giải: Đầu vào của thuật toán là hệ số a và b; đầu ra của thuật toán là nghiệm của phương trình: có thể có nghiệm, có vô số nghiệm, hoặc vô
17
nghiệm. Chúng ta đã biết cách giải trong toán học cùa phương trình này, sơ đồ khối biểu diễn giải thuật được trình bày trong hình 1-6.
Hình 1-6. Sff đồ khối biểu diễn thuật toán giải phương trình bậc nhất ax + b=0 18
Ví dụ o . Vẽ sơ đồ khối minh họa giải thuật tính tổng s - 1 + 1/2 + 1/3 +... + l/n với n nguyên dương.
Giải: Quá trình tính tổng s sẽ được thực hiện lặp đi lặp lại n bước, tại bước thứ i giá trị của s sẽ được cộng thêm một đại lượng là 1/i. Sơ đô khối được trình bày trong hình 1-7:
Hình 1-7. Sơ đồ khối của vi dụ 1.3
19
Trong sơ đồ hình 1-7, trước tiên chúng ta phải có thao tác nhận giá trị cùa n. Sau khi có n thì tổng s mới được xác định.
Ví dụ 1.4. Cho hai số a và b, vẽ sơ đồ khối minh họa giải thuật tìm số bé nhất trong hai số trên.
Giải: Sơ đồ khối này khá đơn giản (hình 1-8), chúng ta sẽ sử dụng khối điêu kiện để xác định a hay b nhỏ hơn và thông báo kết quả sau khi so sánh.
Hình 1-8. Sơ đồ khối cùa ví dụ 1.4
Ví dụ 1.5. Viết sơ đồ khối minh họa giải thuật phân tích một số nguyên n thành tích các số nguyên tố. Ví dụ: 8 = 2*2*2, 30 = 2*3*5.
20
Giải: Rõ ràng trong toán học chúng ta biết mọi sô nguyên n đêu có thê phân tích thành tích các số nguyên tố và chi có một cách phân tích duy nhât. Đê phân tách n thành tích các số nguyên tố chúng ta sẽ thực hiện chia n liên tiếp cho các số nguyên tố từ bé đến lớn và đến khi giá trị của n còn lại là 1. Số nguyên tố bé nhất là 2 và đây cũng là số chần duy nhất trong dãy nguyên tố, tiếp theo chúng ta sẽ có các số nguyên tố là số lẻ. Dựa trên nhận xét trên sơ đồ khối minh họa giài thuật được viết như hình 1-9.
zNhập n7
i = 2
i = i+2 i = 3Đúng
Hình 1-9. Sơ đồ khối phân tích mộI số thành tích các số nguyên lổ 21
Bài tập chương 1
Bài 1. Vẽ sơ đồ khối nhập vào 5 số a, b, c, d, và e. Tìm số lớn nhât và nhò nhất trong 5 số trên.
Bài 2. Vẽ sơ đồ khối tính giá trị của hàm f, với X là tham số.
0
f(x)=-x2-x
X 2 -sin ;z r
X <= 0
0 < X <= 2 x>2
Bài 3. Vẽ sơ đồ khối cho bài toán tính tiền điện với chi số mới và chi số cũ được được cung cấp để tính toán. Quy tắc tính nhu sau: 100 kWh đầu giá 550 đồng, từ kWh 101 - 150 giá 1.110 đồng, từ kWh 151 - 200 giá
1.470 đồng, từ kWh 201 - 300 giá 1.600 đồng, tò kWh 301 - 400 giá 1.720 đồng, từ kWh 401 trờ lên giá 1.780 đồng.
Bài 4. Cho số nguyên a, vẽ sơ đồ khối in ra tất cả các ước số của số đó.
Bài 5. Cho số nguyên a, vẽ sơ đồ khối kiểm tra xem số đó có phải là số nguyên tố hay không?
Bài 6. Vẽ sơ đồ khối giải hệ phương trình sau:
a^x + b^y = c,
a2x + b2y = c.
Bài 7. Vẽ sơ đồ khối giải phương trình bậc bốn sau:
ax4 + bx2 +c = 0
Bài 8. Cho 3 số thực a, b, c. Vẽ sơ đồ khối 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:
s - yịp * (p - a) * (p - b) * p - c ) , với p = (a + b + c )/2
Hướng dẫn: a, b, c là 3 cạnh cụa một tam giác khi thỏa mãn điều kiện sau: (a + b) > c và (a + c) > b và (b + c) > a.
22
Bài 9. Cho số nguyên a biểu diễn một năm nào đó. Vẽ sơ đồ khôi kiêm tra xem năm đó có phải là năm nhuận hay không.
Bài 10. Vẽ sơ đồ khối tính tổng sau với n nguyên dương:
s = 1 + r > v + í ' Ì \ . . . + L _ J _ -
U + 2 3J U + 34J { ( n - l ) + n
Bài 11. Vẽ sơ đồ khối tính tổng sau với n nguyên dương:
5 , m 2 + r i ± | V + ...+ r ( " - 2 ) ^ " _ - ^ 2
s { ì + 1 + 2 2 + T 2 j A 2 + 3J + '" + l ( » - í „ _ n + « 1) + «
Bài 12. Vẽ sơ đồ khối tính tổng sau với n nguyên dương:
C _ 1 1 1 1
s = 1 + 7 — r + 7-------T + — + T--- 1—-----
1 + 2 1 + 2 + 3 1 + 2 + ... + /7
Bài 13. Vẽ sơ đồ khối tính tổng sau với n nguyên dương: e _, 1 1 1 s — 1 H--T-----T + —5----5 7 + ... + —T----z---------T 1 + 2 1 +2+3 1 + 2 + ... + «
Bài 14. Vẽ sơ đồ khối tính tổng sau với n nguyên dương: 1 1 1 s — —:----T H—ĩ----;----r + ... H—r----T---------— 1 + 2 1 +2+3 1 + 2 + ... + M
23
Chương 2
CÁC k h a i n iệm cd BÀN TBONG C++
N ộ i dung chương này sẽ giới thiệu các khái niệm cơ bản cùa ngôn ngữ lập trình C++. Cụ thế, các khái niệm gồm bộ kí tự, từ khóa, biến, hằng, hàm và cấu trúc chung của một chương trình trên C++ sẽ được trình bày. Một số câu lệnh đơn giàn cũng như các hàm toán học cũng sẽ được giới thiệu trong chương này.
2.1. Các thành phần cơ bản của C++
2.1.1. Bộ kỷ tự
Để viết chương trình trên C++, chúng ta cần biết bộ kí tự để thực hiện nó. Giống như các ngôn ngữ lập trình khác, C++ sử dụng các chữ cái la tinh (a..z, A..Z), các chữ số (0..9), các phép toán (+, *, ỉ), các kí tự đặc biệt (%, $, #, &, II,...) và dấu cách để viết các đoạn mã cho chuơng trình. Trong khi viết chương trình, chúng ta sử dụng một số thành phần sau để tạo nên chương trình: định danh, biến, hằng, hàm, câu lệnh... Các khái niệm này sẽ được đề cập ờ các phần tiếp sau.
2.1.2. Định danh và từ khóa
Định danh dùng để phân biệt các thành phần khác nhau trong một chương trình. Định danh có thể là: tên hằng, tên biến, tên mảng, tên hàm, tên con trỏ, tên cấu trúc, tên nhãn... Định danh được đặt theo quy tắc sau:
- Kí tự đầu tiên cùa định đanh phải là một chữ cái hoặc kí tự gạch dưới (_). - Định danh chi chứa kí tự số, kí tự chữ cái La Tinh hoặc ki tự gạch dưới. - Không được trùng với từ khóa (bàng 2-1).
- Chiều dài tối đa là 1024 ký tự.
Chú ý ràng, C++ có phân biệt chữ hoa và chữ thường nên khi viết chương trình chúng ta phải chú ý về cách phân biệt này. Tất cả các từ khóa do C++ định nghĩa đều phải được viết bời chữ thường.
Từ khóa: là các từ được ngôn ngữ lập trình quy định sẵn và sử dụng vào một mục đích cụ thể trong quá trình viết chương trình. Gống như các ngôn
24
ngữ nói chung, từ khóa được tạo nên bởi bộ kí tự, các từ khóa đa phân xuât phát từ tiếng Anh. Bảng 2-1 liệt kê một số từ khoá cơ bản của C++.
Bảng 2-1. Một số từ khóa cơ bản của C++
auto delete friend private break do if protected case double inline public char else int return const float long short continue for new sizeof static switch void while
2.1.3. Câu lệnh
Giống như các ngôn ngữ lập trình khác, mỗi câu lệnh trong C++ nhằm thực hiện một mục đích cụ thể nào đó do C++ quy định. Thông thường các câu lệnh được viết dựa trên ngôn ngữ tiếng Anh, câu lệnh được tạo nên bởi các từ khóa. Một câu lệnh có thể được viết ừên một hoặc nhiều dòng. Trong C++, mỗi câu lệnh sẽ kết thúc bàng dấu chấm phẩy (;). Viết chương trình chính là viết các câu lệnh để nhàm mục đích giải quyết bài toán nào đó. Mỗi ngôn ngữ lập trình sẽ có một bộ câu lệnh phục vụ cho quá trinh viết các chương trình, chẳng hạn như câu lệnh nhập xuất dữ liệu, câu lệnh rẽ nhánh, câu lệnh lặp... Trong phần tiếp theo, chúng ta sẽ tìm hiểu một số câu lệnh đơn giản.
2.1.3.1. Cáu lệnh gán
Câu lệnh gán là câu lệnh đơn giản nhưng tần suất sử dụng nhiều nhất trong khi viết chương trinh; cú pháp lệnh nhu sau:
V = ;
trong đó V là một biến, giá trị của biểu thức phải có cùng kiểu với V. Khi gặp câu lệnh trên trình biên dịch sẽ tính giá trị của biểu thức và sau đó sẽ gán giá trị đó cho biến V. Ví dụ về một vài câu lệnh gán: X = 3 + X ;
y = sqrt(x*x) + 1;
chuvi = 3.14*r*r;
25
2.1.3.2. Câu lệnh nhập dữ liệu từ bàn phím
Cú pháp của câu lệnh như sau:
c i n » b i » b 2»...»bn;
trong đó b|, 02,...,b„ là tên các biến. Câu lệnh trên sẽ cho phép nhập giá trị từ bàn phím cho lần lượt các biến bi, bỉ,...,bn.
Khi chuẩn bị viết chương trình, người lập trình cần phải xác định đầu vào (input) cho mỗi bài toán. Và một trong những cách nhập các giá trị đầu vào là nhập từ bàn phím. Ví dụ, để viết chương trinh giải phương trình bậc hai ax2 + bx + c = 0, chúng ta phải nhập dữ liệu đầu vào cho 3 số a, b, c từ bàn phím, khi đó câu lệnh nhập sẽ là:
c i n » a ; cin>>b ; c i n » c ;
Để tính diện tích và chu vi của một hình chữ nhật, chúng ta phải nhập vào hai giá trị là chiều dài (kí hiệu là a) và chiều rộng (kí hiệu là b), câu lệnh như sau:
cin>>a ; cin>>b ;
2.1.3.3. Câu lệnh in dữ liệu lên màn hình
Cú pháp lệnh như sau:
cout< //su dung tep iostream using namespace std;
int main()
27
{
cout<<"Vi du dau tien ve C++";
return 0;
}
Chương trình trên đây là chương trình đầu tiên mà hầu hết những người học về lập trình viết và kết quà của nó là viết câu "Vi du d a u t i e n v e C++" lên màn hình. Đây là một trong những chương trình đơn giàn nhất có thể viết bằng C++ nhưng nó đã bao gồm những phần cơ bản mà mọi chuơng trình C++ có. Chúng ta hãy xem xét từng dòng một:
Dòng đầu tiên là câu lệnh #include báo cho trình dịch biết cần phải sử dụng tệp io s t r e a m . Trong tệp i o s t r e a m chứa hai lớp là i s t r e a m và i o s t r e a m , hai lớp này cung cấp các phương thức vào, ra tương ứng phục vụ cho việc viết chương trình. Các tệp khai báo sau # i n c l u d e được gọi là các tệp h e a d e r . Dòng tiếp theo cho chúng ta biết sử dụng n a m e s p a c e , đây là một không gian tên s t d . Câu lệnh này chỉ dẫn cho chương trình biết chỗ để lưa trù các tệp h e a d e r . Chi dẫn n a m e sp a c e là một cơ chế trong C++ cho phép chúng ta phân nhóm các thực thể như lớp ( c l a s s ) , đối tuợng ( o b j e c t ) , hàm ( f u n c t i o n ) thành những nhóm riêng biệt, mỗi nhóm đó được đặt một tên, gọi là không gian tên (namespace).
Theo sau hàm m a in 0 là một cặp ngoặc đom bởi vì nó là một hàm. Trong C++, tất cả các hàm mà sau đó là một cặp ngoặc đon 0 có nghĩa là nó có thể có hoặc không có tham số. Nội dung của hàm m a in () tiếp ngay sau phần khai báo chính thức được bao trong các ngoặc móc { }.
cout<<"Vi du dau tien ve C++";
Câu lệnh c o u t được định nghĩa trong thư viện i o s t r e a m dùng để in chuỗi kí tự "Vi du dau tien ve C++" ra màn hình. Với C++, nhiều câu lệnh có thể viết trên cùng một dòng. Giữa các câu lệnh cách nhau bởi dấu Câu lệnh r e t u r n 0 ; đặt trước dấu ngoặc móc cuối cùng của hàm m a in () báo hiệu kết thúc chucmg trình.
Cách chú thích trong chương trình C++
Trong chương trình, người viết đôi khi có các câu chú thích cho một đoạn câu lệnh nào đó để ghi nhớ hoặc để giải thích cho đoạn lệnh, phục vụ cho người đọc chương trình hoặc các lần chinh sửa chuơng trình lần
28
sau. Trong C++ có hai cách để chú thích gồm: chú thích trên một dòng và chú thích trên nhiều dòng:
Cách 1: Chú thích trên một dòng
// Dòng chú thích
Cách 2: Chú thích trên nhiều dòng
/*
Dòng chú thich 1
Dòng chú thích 2
* /
Chú thích trên một dòng bắt đầu từ cặp dấu xổ (//) cho đến cuối dòng. Chú thích trên nhiều dòng bắt đầu bằng / * và kết thúc bằng * /
2.3. Các kiểu dữ liệu và cách sử dụng
2.3.1. Khái niệm về kiểu dữ liệu
Mục tiêu của việc viết các chương trình là xử lý dữ liệu, lức là biến dữ liệu đầu vào thành kết quả ra mong muốn. Ví dụ, đầu vào có thể là các dữ liệu số (điểm thi, bàng số liệu về thuế,...), dữ liệu chữ hay kí tự, dữ liệu âm thanh, hình ảnh,... Đe biểu diễn và xử lý các dữ liệu này trên máy tính, chúng ta phải biết chúng sẽ được khai báo ra sao và kèm với các thao tác gì để xử lý chúng. C++ chia thành hai tập hợp kiểu dữ liệu chính: kiểu dữ liệu cơ sở (built - in) đây là kiểu mà ngôn ngữ cung cấp cho người lập trình và kiểu do người dùng định nghĩa (user - defined).
2.3.2. Kiểu dữ liệu cơ sở
Kiểu số nguyên
Trong C++, có 9 kiểu số nguyên được sử dụng bao gồm các kiểu: b o o l , char, short int, int, long int, unsigned char, u n s i g n e d s hort int, u n s i g n e d int và u n s i g n long
i n t . Sự khác nhau của các kiểu này phụ thuộc vào khả năng biểu diễn giá trị các số của nó. Bảng 2-2 mô tả phạm vi biểu diễn của từng loại kiểu dữ liệu. Khi viết chương trình chúng ta phải xác định các kiểu dữ
29
liệu phù hợp cho từng loại dữ liệu cần lưu trữ và xử lý đảm bảo tối ưu vê mặt không gian nhớ trong máy tính.
Bàng 2-2. Thông tin về các kiểu dữ liệu nguyên trong C++
Kiểu Phạm vi biểu diễn SỐ byte char 256 kí tự 1 bool true hoặc false 1 short int -32.768. .32.767 2 unsigned short int 0 ...65.535 2 int -2.147.483.648.. -2.147.483.647 4 unsigned int 0 ... 4.294.967.295 4 long int -2.147.483.648.. -2.147.483.647 4 unsigned long int 0 ... 4.294.967.295 4 long long -9,223,372,036,854,775,808
9,223,372,036,854,775,807 8
Dữ liệu kiểu char
Kiểu char dùng để lưu trữ các kí tự riêng rẽ. Kí tự bao gồm: các kí tự chữ, kí tự số, và các kí tự đặc biệt (tất cả có 256 kí tự). Một kí tự đom có thể là kí tự chữ (thường hay hoa), kí tự số, hoặc kí tự đặc biệt. Ví dụ các kí tự có thể là: ‘A ’, ‘b ’, ‘8’, ‘% ’, ‘0 ’, ‘ Giá trị tương úng của các
kí tự được biểu diễn trong máy tính dạng mã ASCII (American Standard Code for Information Interchange). Bàng 2.3 trình bày mã ASCII tương ứng với các kí tự hoa.
Bảng 2-3. Mã ASCII của cúc ki tự hoa
Kí tự Má ASCII Kí tự Mă ASCII A 01000001 N 01001111 B 01000010 0 01001110 c 01000011 p 01010000 D 01000100 Q 01010001 E 01000101 R 01010010 F 01000110 s 01010011 G 01000111 T 01010100 H 01001000 u 01010101 I 01001001 V 01010110 J 01001010 w 01010111
30
Kí tự Mã ASCII Kí tự Mã ASCII K 01001011 X 01011000 L 01001100 Y 01011001 M 01001101 z 01011010
Dữ liệu kiểu bool
Trong C++, kiểu bool được dùng để diễn tả giá trị logic đúng và sai và được định giá trị tương ứng là 1 và 0. Kiểu dữ liệu này thường được dùng trong các lệnh điều kiện hay biểu thức điều kiện mà kết quả trà về là đúng hoặc sai. Ngoài hai kiểu bool và char, các kiểu nguyên còn lại được phân biệt bởi khoảng giá trị của chúng.
Chú ý: Chúng ta có thể sử dụng hàm s i z e o f ( tê n _ k iể u _ d ữ _ liệ u ) để biết so byte lưu trữ của kiểu dữ liệu đó trên chương trình dịch của C++ đang dùng.
Ví dụ 2.2. Ví dụ về sử dụng hàm s i z e o f ()
Giải:
♦include
using namespace std;
int main()
{
cout « "\n So byte luu kieu int: " < tên_biến;
trong đó có thể là các kiểu có sẵn trong C++ hoặc có thể là các kiểu do người dùng định nghĩa. Khi viết chương trình, việc đầu tiên cân phải xác định các biến và kiểu của nó để phù hợp với bài toán. Ví dụ về một số khai báo biến sau đây:
float a, b, c;
double X, y, s;
char a, b;
32
Ví dụ 2.3. Viết chương trình nhập vào hai số a và b tương ứng là chiêu dài và chiều rộng của một hình chữ nhật. Tính diện tích và chu vi của hình chữ nhật đó rồi in kết quả lên màn hình.
Giải: Trước tiên, chúng ta phải xác định số lượng biến cần khai báo ở đây sẽ có: biến chứa chiều dài (a), biến chứa chiều rộng (b), biến chứa diện tích (dt) và chu vi (cv).
♦include
using namespace std;
int main 0
{
double a, b, dt, cv;
cout<<"Chuong trinh tinh dien tich,chu vi hinh chu nhat: \n";
cout<<"Nhap chieu dai a = cin>>a;
cout<<"Nhap chieu rong b = cin>>b;
dt = a*b;
cv= (a + b )* 2 ;
cout«"\n";
cout<<"Dien tich hinh chu nhat = "«dt<<"\n"; cout<<"Chu vi hinh chu nhat = "<
using namespace std;
int m a i n ()
{
float r;
float PI = 3.14;
cout<<"Tinh dien tich va he tich hinh cau: "<>r;
float s;
3 _ 4*pi*r*r;
c o u t « " D i e n tich mat cau = "<>ban_kinh; dien_tich=PI*ban_kinh*ban_kinh;
cout<<"Dien tich hinh tron: "<
using namespace std;
int main ()
{
// Khai bao hang
const float PI = 3.14;
float ban kinh, dien tich;
35
cout << "Chuong trinh tinh dien tich hinh
tron"<>ban_kinh; dien_tich=PI*ban_kinh*ban_kinh;
cout<<"Dien tich hinh tron: "<=,
sizeof()
Các phép toán số học bao gồm: cộng (+), trừ (-), nhân (*), chia (/), chia lấy phần dư (%). Các phép toán được gọi là phép toán hai ngôi vì cần phải có hai toán hạng để thực hiện phép toán. Chẳng hạn một số phép toán đơn giản như sau:
14 + 25
23.5 - 35.1
12.5 % 4
Ví dụ 2.7. Viết chương trình nhập vào hai số a và b kiểu thực từ bàn phím. Thực hiện việc tính rồi hiển thị kết quả tồng, hiệu, tích, thương của a và b lên màn hình
Giải:
♦include
using namespace std;
int main 0
36
{
float a, b;
cout<<"Nhap vao so thu nhat: cin>>a;
cout<<"Nhap vao so thu hai: c i n » b ;
cout<<"Tong cua "<< a « " va "<
using namespace std;
37
int main 0
{
int a, b;
c o u t « " N h a p so thu nhat: cin>>a;
cout<<"Nhap so thu hai: cin>>b;
cout<<"Thuong cua "<< a « " va "<, >=, != (phép so sánh khác), = (phép so sánh bằng), && (phép và), II (phép hoặc),... Kết quả cùa phép toán logic cho ta một trong hai giá trị đúng hoặc sai.
2.6.2. Biểu thức
Biêu thức được tạo thành bàng cách sử dụng các phép toán và các toán hạng để diễn đạt một công thức toán học nào đó. Chú ý rằng tên hàng, biến, phần tử mảng (chương 6) và hàm (chương 5) có vai trò như các toán hạng khi viết trong biểu thức. Việc xác định giá trị của biểu thức
38
được thực hiện nhu quy ước trong toán học. Khi viết biểu thức chúng ta chi sử dụng một kiểu dấu ngoặc duy nhất là ngoặc tròn. Ví dụ về một sô biểu thức như sau:
a+2*b;
b*b - 4*a*c;
(x-y)/ (2*z -5);
( ( a > 0) && (b>0) && (c>) )
2.6.3. Một số hàm toán học trong C++
C++ xây dựng sẵn một số hàm toán học thông dụng. Trong quá trình viết chương trình, chúng ta chỉ việc sử dụng các hàm này trong quá trình tính toán. Đe sử dụng các hàm toán học, chúng ta phải khai báo tệp nguyên mẫu m a th . h (hoặc cm ath). Một số hàm toàn học được liệt kê trong bảng 2-6.
Bảng 2-6. Một số hàm toán học trong C++
Tên hàm Ý nghĩa
C O S (x) Hàm tính COS (theo radial)
s i n ( x ) Hàm tính sin (theo radial)
tan(x) Hàm tinh tan
a c o s (x ) Hàm tính arc COS
a s in ( x ) Hàm tính arc sin
a t a n ( x ) Hàm tính arc tan
e x p (x ) Hàm số mũ, trả lại giá trị ex
l o g (x) Hàm tính logarithm
pow ( x ,n ) Hàm tính xn
s q r t ( x ) Hàm căn bậc hai của X
c e i l (x) Hàm làm tròn lên của số thực X
f l o o r (x) Hàm làm tròn xuống của số thực X
r o u n d (x) Hàm làm tròn s ố thực X
trunc(x) Hàm tính phần nguyên của s ố thực X
h y p o t ( X ,y ) Hàm tính độ dài cạnh huyền của tam giác
vuông khi biết độ dài hai cạnh góc vuông
là X và y.
39
Ví dụ 2.9. Viết chiromg trình nhập vào số nguyên a, tính a \ căn bậc hai của a6, và in lên màn hình các kết quả đó.
Giải:
#include
#include
using namespace std;
int main()
{
int a,b;
cout<<"a= cin>>a;
cout<<"aA5 = "<
tinclude
using namespace std;
int main 0
{
float a, b, c, d;
cout<<"Nhap do dai canh vuong 1: c i n » a ; cout<<"Nhap do dai canh vuong 2: cin>>b; c = hypot(a,b);
d = sqrt(a*a+b*b);
c o u t « " D o dai canh huyen (su dung ham) : " « c « e n d l ; cout<<"Do dai canh huyen (khong su dung ham ) : " « d « e n d l ;
return 0;
}
40
Ví dụ 2.11. Viết chương trình nhập vào hai số thực a và b. Sử dụng các hàm làm tròn ceil(), floor(), round() để hiển thị kết quả của a/b.
Giải:
♦include
♦ include ,
using namespace std;
int main 0
{
float a, b, c, d, e;
cout<<"Nhap so thu nhat: cin>>a;
cout<<"Nhap so thu hai: cin>>b;
c = c e i l ( a / b ) ;
d = f l o o r (a/b);
e = r o u n d (a/b);
cout<<"Ket qua a/b su dung ham c e i l O : "«c<
ệinclude
using namespace std;
int main 0
41
float a, b, c, d, e;
cout<<"Nhap so thu nhat: cin>>a;
cout<<"Nhap so thu hai: cin>>b;
c = fmod(a,b);
d = trunc(a/b);
c o u t « " K e t qua phan du cua a/b: "«c<
using namespace std;
int main()
{
c o u t « " Ket qua cua phep chia 13 cho 4 la " « 1 3 % 4; cout«"\n Ket qua cua phep chia 8 cho 3 la: " « 8 % 3; return 0;
}
Bài 4. Xác định giá trị các biểu thức thức sau:
a) 3.0 + 2.0*4.0;
b) 6.0 + 2.0/3.0 + 9.0;
c) 10.0*(1.0 + 3.0*7.0);
d) (20.0- 7.0) *(3.0- 1.0).
Bài 5. Xác định giá trị các biểu thức hỗn hợp sau đây:
a) 10.0+15/2 + 4.8;
b) 1 0 .0 -2 /6 + 8 ;
c) 3.9*4 % 6 +9;
c) 11 + 18/5+100.
Bài 6. Giải sử a lưu giữ giá trị 1, m lưu giữ giá trị 50, n lưu giữ giá trị 10, và p lưu giữ giá trị nguyên 5. Tính giá trị của các biểu thức sau: a) n/p +3;
b) m/p + n -1 0 * ạ;
c) m-3*n + 4*a;
d) (m+n)/(p + a);
e) m+n /p + a.
Bài 7. Các tên biến sau đây là đúng hay sai, tại sao?
a) chieu dai
b) abcl23
43
c) abed
d) %354dg
e) abcSde
f) do
g) abc def
Bài 8. Viết các khai báo biến cho các yêu cầu sau đây:
a) a và b dùng để lưu giữ các số nguyên;
b) c, d và e dùng để lưu giữ các số thực;
c) f dùng để lưu trữ giá trị ký tự.
Bài 9. Viết lại các khai báo sau đây bằng ba câu lệnh riêng rẽ cho mỗi ý. a) int thang= 12, ngay =30, nam=2016
b) double gio=24, phut, giay
c) double diem_toan, diem_ly, diem hoa
Bài 10. Viết chương trình C++ hiển thị các kết quả cùa biểu thức 3.0*5.0, 7.1*8.9 -5.5. Tính toán giá trị bàng máy tính cầm tay để đối chiếu với đầu ra của chương trình.
Bài 11. Viết chương trình nhập vào từ bàn phím hai biến X và y kiểu nguyên. Sừ dụng hàm abs() và pow(x,y) để hiển thị trị tuyệt đối của y và hiển thị xlyl.
Bài 12. Viết chương trình sử dụng hàm exp().
Bài 13. Viết chương trình sử dụng hàm log().
Bài 14. Viết chương trình sử dụng hàm sin(), cos(), tan().
Bài 15. Viết chương trình tính chu vi, diện tích hình tam giác có ba cạnh a, b, c nhập từ bàn phím.
Gọi ý: Diện tích tam giác được tính theo công thức: s=vp*(p-a)*(p-b)*(p-c), trong đó p = (a + b + c)/2.
Bài 17. Cho tam giác ABC, viết chương trình để thực hiện việc tính chu vi, diện tích và bán kính đường tròn nội tiếp, ngoại tiếp của nó.
Bài 18. Viết chương trình tính thể tích của một hình cầu bán kính r nhập ' . 4ot3
từ bàn phím. Biêt công thức tính thê tích là: v = ——
44
Bài 19. Viết chương trình tính thời gian đi tới đích của một chiêc ô tô biết độ dài quãng đuờng s và vận tốc trung bình của xe là V được nhập vào từ bàn phím.
Công thức tính thời gian: t = s/v
Bài 20. Viết chương trình tổng các số nguyên từ a tới b biết: s = (n/2) * (2*a + (n-1)* d )
Với n, a, d kiểu số nguyên, được nhập vào từ bàn phím; s: tổng tà a tới b;
n: số lượng số nguyên được thực hiện tính tổng;
a: giá trị của số nguyên đầu tiên;
d: độ lệch giữa hai số liên tiếp (cách đều nhau).
Bài 21. Công thức Newton tính trọng lượng của một vật như sau: F = M*Ae
Trong đó:
F: trọng lượng của vật;
M: khối lượng của vật;
A e: gia tốc gây ra bởi lực hấp dẫn cùa trái đất (9.82 m/s2).
Từ các thông tin trên, hãy viết chương trình tính trọng lượng của một vật với khối lượng của vật đuợc nhập vào từ bàn phím.
Bài 22. Viết chương trình chuyển đổi nhiệt độ từ độ F sang độ c rồi hiển thị kết quả ra màn hình với nhiệt độ F được nhập vào từ bàn phím. Công thức chuyển đổi giữa hai thang nhiệt độ như sau: c = 5.0/9.0(F-32.0).
Bài 23. Viết chương trình để tính động năng của một vật khi nó di chuyển biết khối lượng của vật và vận tốc di chuyển được nhập vào từ bàn phím.
Công thức Newton để tính động năng như sau:
E = Vi* m *v2
Với: E là động năng của vật, m là khối lượng của vật và V là vận tốc di chuyển của vật.
45
Bài 24. Cho mạch điện RC như hình sau; trong đó hiệu điện thế V được cho bởi công thức V = E (l- e_t/RC)/R, t là thời gian (tính theo giây) sau khi công tắc bật. Sừ dụng công thức trên tính hiệu điện thế qua tụ điện khi t có thời gian là 0.55 s.
R = 50 n
-A A A A A /V -
E = 60V-T- c = 220 X lO^F
Bài 25. Cho mạch điện nhu hình sau trong đó cường độ dòng điện i được tính theo công thức i = (E)e'ƯRC/R. Sử dụng công thức này, hãy viết chương trình tính hiệu điện thế của tụ điện khi t = 0.32 s.
-"WWW'-
R = 8100 í ỉ
E = 15V _ c = 17 X 10 F
Bài 26. Định luật làm lạnh của Newton áp dụng cho một vật thể với nhiệt độ ban đầu là T được đặt trong môi trường có nhiệt độ là A, vật đó sẽ có nhiệt độ là TFIN sau t phút được theo công thức TFIN = (T - A)e"kl + A. Trong đó e = 2.71828, k là hệ số nhiệt dựa vào chất liệu làm vật thể đó. Sử dụng công thức trên viết chương trình xác định nhiệt độ đạt tới của một vật thể sau 20 phút khi chúng được đặt trong nước với nhiệt độ 60 °c. Giả sử rằng nhiệt độ của vật thể lúc đầu là 150 °c và hệ số nhiệt k là 0.0367.
46
Chương 3
CÁC CÂU LỆNH ĐIÈU KIỆN
Trong chương này hai loại cáu lệnh điểu kiện là if và swich sẽ được trình bày. Sau khi tìm hiếu xong, độc giả cần năm chăc vê cấu trúc cũng như cách thức sử dụng chúng và việc chuyên từ sơ đồ khối sang chương trình sứ dụng các câu lệnh này.
3.1. Giói thiệu
Câu lệnh có điều kiện là một trong những câu lệnh phổ biến trong khi lập trình. Rất nhiều đoạn lệnh chì được thục hiện khi điều kiện nào đó xảy ra. Trong câu lệnh điều kiện có các biểu thức logic tức là các biểu thức trả về một trong hai giá trị đúng hoặc sai. Đe định giá và biểu diễn các biểu thức này chúng ta cần sử dụng các toán tử logic. Bảng 3-1 trình bày một số phép toán logic trong C++.
Bảng 3-1. Các toáũ tử quan hệ trong C++
Toán tử quan hệ Ngữ nghĩa Ví dụ < Nhỏ hơn diem < 7 .0
> Lớn hơn c h ie u d a i > 100.0 < = Nhỏ hơn hoặc bằng t u o i <=30
> = Lớn hơn hoặc bằng namsinh>=1980
= = Bằng a == 0
1 =Khác X !=0
Với các biểu thức logic phức tạp chứa các toán tử “và”, “hoặc” hay “phủ định”, trong C++ sẽ được dùng bời & &, I I , ! tương ứng. Giống nhu các biểu thúc thông thường, biểu thức logic trong C++ trà về giá trị 0 hoặc 1 trong đó 0 tương ứng với biểu thức có giá trị sai và 1 tương ứng với biểu thức có giá trị đúng. Ví dụ một số biểu thức logic như sau:
((a+b >c) && (b==0))
!(a + b>c)
( (a == 0) II (b ==0) II (c == 0))
47
Ví dụ 3.1. Viết chương trình in các giá trị của biểu thức sau lên màn hình: - 5 > 9
- 2 !=0
- ( 2 >3) & (9>8)
Chương trình như sau:
#include
using namespace std;
int m a i n O
{
cout<<"Gia tri cua bieu thuc 5>9 la:
"<<(5>9)<3) & (9>8) la: " « ( (2>3) & (9 > 8) ) ;
return 0;
}
Kết quả thực hiện chương trình như sau:
Gia t r i cua bieu thuc 5>9 la : 0
Gia t r i cua hỉeu t hue 2 ? =0 l a : 1
Gia t r i cua b ỉe u tim e <2>3> & <9>8> l a : 0
3.2. Câu lệnh i f
Dạng 1: cấu trúc i f dạng đầy đù:
Cấu trúc như sau:
if
;
else
;
Cách thục hiện câu lệnh if: khi gặp câu lệnh này máy tính sẽ xác định giá trị của biểu thức logic, nếu giá trị này là đúng thì khối lệnh 1 sẽ được thực hiện, nếu sai khối lệnh 2 sẽ được thực hiện. Sơ đồ thực hiện khối lệnh minh họa ở hình 3-1.
Chú ý rằng, sau e l s e không có dấu chấm phẩy, khối lệnh bao gồm một hoặc nhiều câu lệnh của C++ và khi khối lệnh có từ hai câu lệnh trở lên thì phải được đặt trong cặp {}.
48
Hình 3-1. Sơ đồ khối mô lả câu lệnh i f
Ví dụ 3.2. Viết chương trình nhập vào số nguyên a, kiểm tra xem a có phải là số chẵn hay không rồi in kết quả lên màn hình.
Giải:
♦include
using namespace std;
int main()
{
int a;
c o u t « " N h a p vao so can kiem tra: "; cin>>a; if (a % 2 == 0)
cout<<"a la so chan";
else
cout<<"a la so le";
return 0;
}
Ví dụ về kết quả thực hiện chương trinh như sau:
.n ap v a o s o c a n k ie m t r a : ã
a la so le
Trong ví dụ 3.1, số nguyên a được nhập vào từ bàn phím. Chương trinh sẽ kiểm tra xem a chia dư cho 2 có bằng 0 hay không, nếu bằng 0 thì hiển thị ra màn hình “a la so chan”, ngược lại hiển thị “a la so le”.
Dạng 2: cấu trúc if dạng khuyết
49
Cú pháp:
if ;
Khối lệnh 1 được thực hiện khi biểu thức logic có giá trị đúng. Sơ đô khối minh họa như trong hình 3-2.
Hình 3-2. Cấu trúc lệnh if dạng khuyết
Ví dụ 3.3. Viết chương trinh nhập hai số nguyên a, b từ bàn phím. In lên mà hình số lớn nhất của hai số đó.
Giải: Chúng ta sẽ sử dụng câu lệnh i f để giải bài toán trên. Chương trình như sau:
#include
using namespace std;
int main()
{
int a,b,max;
cout<<"Nhap so thu nhat: cin>>a;
cout<<"Nhap so thu hai: c i n » b ;
max=a;
if (max
#include
using namespace std;
int main()
{
int b;
c o u t « " n h a p vao so b ="; cin>>b;
if (b>0)
if (pow(floor(sqrt(b)),2) == b)
cout<<"b la so chinh phuong" ;
else
c o u t « " b khong la so chinh phuong";
return 0;
}
Số chính phuơng là số có căn bậc hai là một số nguyên. Câu lệnh if thứ nhất kiểm tra xem b có lớn hom 0 hay không. Nếu điều kiện này đúng, câu lệnh if thứ hai sử dụng hàm lũy thừa pow(), hàm lấy phần nguyên floor(), hàm căn bậc hai sqrt() để kiểm tra xem b có phải là số chính phương hay không. Chú ý rằng để sử dụng được các hàm toán học này ta phải sử dụng thư viện toán học cmath.
Trong ví dụ trên, chuơng trình có hai lệnh if và chi có một lệnh esle, khi đó trinh biên dịch sẽ nhận biết lệnh if gần nhất so với esle là if của esle đó, còn lệnh if đầu tiên là cấu trúc if khuyết (không có esle).
51
Ví dụ 3.6. Viết chương trình nhập vào hai số a và b tương ứng là hệ sô của phuơng trinh bậc nhất ax + b = 0, tính và in nghiệm của phương trinh lên màn hình.
Giải: Chúng ta đã biết sơ đồ khối minh họa giải thuật cùa bài toán như hình 3-3.
Chương trình như sau:
♦include
using namespace std;
int main()
{
float a, b, x;
cout<<"Giai phuong trinh bac nhat ax + b = 0"<>b;
52
i f (a != 0)
{
X = - b / a ;
cout<<"Nghiem cua pt: X =" « x;
}
else
if (b==0)
cout<<"Phuong trinh VO so nghiem";
else
cout<<"Phuong trinh VO nghiem";
return 0;
}
Ví dụ 3.6 thực hiện chương trình giải phương trình bậc nhất. Câu lệnh if thứ nhất cần thực hiện hai câu lệnh nên chúng được đưa vào trong khối lệnh {}. Trong phần else chúng ta cần tiếp tục kiểm tra điều kiện thứ hai nên sử dụng cấu trúc if - else thứ hai. cấu trúc if - else thứ hai được coi là một câu lệnh nên không cần sử dụng dấu mờ khối và đóng khối lệnh ờ đây. Ví dụ về kết quả thực hiện chương trình nhu sau:
G i a i p h u o n g t r i n h bac n ỉia t a x + b = 0
Nhap he so a - 4
Nhap hp s o b = 5 =
NgJiienf c u a p t : X = -1 .2 5 •
Ví dụ 3.7. Nhập vào 3 số thực a, b, và c tương ứng là các hệ số của phương trình bậc hai ax2 + bx +c = 0. Viết chương trình giải phương trình này.
Giải: Việc giải phương trình bậc hai được thực hiện từng bước một nhu trong toán học. Chúng ta sử dụng câu lệnh if để chia các tnrờng hợp tương ứng để tính nghiệm. Chương trình như sau:
#include
#include
using namespace std;
int m a i n O
{
float a, b, c, xl, x2, d;
cout<<"nhap a ="; cin>>a;
cout<<"nhap b ="; cin>>b;
c o u t « " n h a p c ="; cin>>c;
d=b*b-4*a*c;
53
i f (d > 0)
{
xl = (-b+ sqrt(d)) / (2*a);
x2 = (-b- sqrt(d)) / (2*a);
cout<<"Nghiem xl =" « x l « e n d l ;
cout<<"Nghiem x2 =" « x 2 ;
}
else
if (d==0)
cout<<"Phuong trinh CO mot nghiem x=
" « - b / (2*a) ;
else
cout«"Phuong trinh VO nghiem";
return 0;
}
Ví dụ 3.8. Nhập vào điểm toán, điểm lý, điểm hóa của một sinh viên. Tính điểm trung bình cùa sinh viên đó.
- Nếu điểm trung bình < 5: Hiền thị “Loai yeu”
- Nếu điểm trung bình < 7: Hiển thị “Loai trung binh"
- Neu điểm trung bình < 8.5: Hiển thị “Loa/ kha"
- Trái lại: hiển thị “Loai gioi'
Giải: Chúng ta sẽ sử dụng câu lện if dạng đầy đủ thực hiện việc chia các trường hợp của bài toán tương ứng. Chương trình như sau:
#include
using namespace std;
int main()
{
float diem_toan, diem_ly, diem_hoa, diem_tb; cout<<"Diem toan = cin>>diem_toan;
cout<<"Diem hoa = cin>>diem_hoa;
c o u t « ”Diem ly = " ỉ cin»diem_ly;
diem_tb=(diem_toan+diem_ly+diem_hoa)/3;
i f (diem_tb>=0&&diem_tb<=10)
i f (diem_tb<5)
cout<<"Loai ỵeu";
else i f (diem_tb<7)
cout«"Loai trung binh";
54
else if(diem_tb<8.5)
cout<<"Loai kha";
else
cout<<"Loai gioi";
else cout<<"Nhap lai diem";
return 0;
}
3.4. Cấu trúc switch
Câu lệnh s w i t c h cung cấp một sự lựa chọn cho việc viết các đoạn lệnh có nhiều lựa chọn mà giá trị điều kiện của nó là một tập hợp các số nguyên, cấu trúc câu lệnh s w i t c h như sau:
switch (biểu thức nguyên)
{
case giá_trị_l:
; break;
case giá_trị_2:
; break;
case giá_trị_n:
; break;
default:
;
}
Câu lệnh trên có bốn từ khóa là: s w i t c h , c a s e , b r e a k , và d e f a u l t . Khi gặp câu lệnh trên giá trị của biểu thức sẽ được xác định, nếu giá trị của biểu thức trùng với g i á _ t r ị _ i sau từ khóa c a s e thì < k h ố i l ệ n h i> sẽ được thực hiện. Neu không < k h ố i l ệ n h n + l>
sẽ được thực hiện. Máy sẽ thoát khỏi lệnh s w i t c h khi nó gặp câu lệnh b r e a k hoặc dấu ngoặc nhọn đóng cuối cùng của thân s w itc h . Ta cũng có thể dùng câu lệnh g o t o trong thân của toán tử s w i t c h để nhảy tới một câu lệnh bất kỳ bên ngoài s w it c h .
Ví dụ 3.9. Viết chương trình nhập vào một tháng của năm (tính theo dương lịch), tính xem tháng đó có bao nhiêu ngày rồi in kết quả lên màn hình. Giải:
#include
using namespace std;
55
int main()
{
int t, n;
c o u t « " n h a p thang t ="; c i n » t ;
cout<<"nhap nam ="; c i n » n ;
switch (t)
{
case 1:
case 3:
case 5:
c a s e 7:
case 8:
case 10:
case 12:
c o u t « " T h a n g ”« t « " nam " « n « " CO 31 ngay";
break;
case 4:
case 6:
case 9:
case 11:
c o u t « " T h a n g " « t « " nam " « n « " CO 30 ngay";
break;
case 2:
i f (((n%4==0)& & (n % 100 !=0)) I I (n%400 == 0))
cout<<"Thang 2 nam " « n « " CO 29
n g a y " ;
else
break;
}return 0;
}
c o u t« " T h a n g 2 nam CO 28 n gay" ;
Chú ý: Việc xác định số ngày của tháng 2 của năm nào đó theo hai trường hợp sau:
Nếu năm đó chia hết cho 4 và không chia hết cho 100 thì tháng 2 có 29 ngày;
Nếu năm đó chia hết cho 100 và nếu năm đó cũng chia hết cho 400 thì tháng 2 của năm đó có 29 ngày
Các trường hợp khác tháng 2 sẽ có 28 ngày.
Ví dụ 3.10. Viết chuơng trình nhập vào một ký tự. Nếu ký tự đó là a/e/o/u/i thì thông báo là nguyên âm, trái lại thông báo là phụ âm.
56
Giải: Đối với biến kiểu kí tự luôn được chuyển đồi sang dạng nguyên trong biểu thức nên chúng ta hoàn toàn có thể áp dụng câu lệnh s w itc h . Chương trình như sau:
#include
using namespace std;
int main()
{
char ky_tu;
cout<<"Nhap ky = cin»ky_tu;
i f (ky_tu>=1 a '&&ky_tu<=1z 1)
switch (ky_tu)
{
case 'a ':
case 'e ':
case 'i 1 :
case 'o':
case 'u ':
cout<<"Nguyen am";
break;
default:
c o u t « " P h u am";
}
else
cout<<"Nhap lai ky tu";
return 0;
}
Bài tập chương 3
Bài 1. Viết chương trình nhập vào số a kiểu nguyên. Kiểm tra xem a chẵn hay lè. Nếu a chẵn hiển thị “So chan”, trái lại hiển thị “So le”.
57
Bài 2. Viết đoạn lệnh tương ứng với các sơ đồ khối sau:
In lên màn hlnh giá trị của max
58 T
Bài 3. Thang điểm quy định việc xếp loại sinh viên được cho bời bảng sau:
Điểm trung bình xếp loại
Nhó hơn 5 Kém
Từ 5 tới nhỏ hơn 7 Trung bình
Từ 7 tới nhò hơn 8.5 Khá
Tù 8.5 tới 10 Giỏi
Sử dụng thông tin của bảng trên, viết chương trình bằng ngôn ngữ C++ thực hiện việc nhập vào điểm trung bình của một sinh viên bất kỳ, từ đó xác định xếp loại học lực của sinh viên đó và hiển thị kết quà xếp loại ra màn hình.
Bài 4. Việc quy đổi điểm số từ thang điểm 10 sang thang điểm chữ với sinh viên học theo tín chỉ được thực hiện theo bảng sau:
Điểm số Điểm chữ
Nhỏ hom 4 F
Từ 4 tới 5.4 D
Từ 5.5 tới 6.9 c
Từ 7 tới 8.4 B
Từ 8.5 tới 10 A
Sử dụng thông tin trong bảng trên, viết chương trình bằng ngôn ngữ C++ thực hiện việc nhập vào điểm số của một sinh viên bất kỳ, hiển thị kết quả điểm chữ của sinh viên đó ra màn hình.
Bài 5. Viết chương trình nhập vào một biến nhiệt độ. Nếu nhiệt độ nhỏ hơn 100 thông báo “Nho hon nhiet do soi cua nuoc”, nếu bàng 100 thông báo “Bang nhiet do soi cua nuoc”, trái lại thông báo “Lon hon nhiet do soi cua nuoc”.
Bài 6. Viết chương trình nhập vào một số. Nếu số đó âm hiển thị thông báo “So am”, nếu bằng 0 hiển thị thông báo “So 0”, trái lại hiển thị “So duong”.
60
Bài 7. Viết chương trình nhập vào hai số X, y. Nếu X lớn hon y và y khác 0 thì tính và hiển thị x/y, trái lại hiển thị x*y.
Bài 8. Viết chương trinh nhập so X từ bàn phím. Kiểm tra nếu X chăn thì hiển thị X2, trái lại hiển thị X3
Bài 9. Viết chương trình nhập vào hai số X, y. Nếu |x-y| < 0.00005 thì hiển thị sai số bằng 0, trái lại hiển thị sai số bằng Ịx-y|/2.
Bài 10. Viết chương trình nhập vào hai số a và b. Nếu a > b thì yêu cầu nhập c rồi hiển thị (a-b)*c, trái lại hiển thị a*b.
Bài 11. Viết chương trình nhập vào hai cạnh của hình chữ nhật a, b. Kiểm tra, nếu a, b dương thì tính diện tích hình chữ nhật, trái lại, thông báo “Du lieu nhap khong dung”.
Bài 12. Viết chương trình nhập vào hai số a và b. Thông báo lên màn hình số nào lớn nhất trong hai số trên.
Bài 13. Một góc là nhọn nếu nó nhò hơn 90 độ, là vuông nếu nó là 90 độ và là tù nếu nó lớn hơn 90 độ. Viết chương trình nhập vào số đo của một góc, hiển thị lên màn hình góc đó là góc loại gì?.
Bài 14. Viết chương trình nhập vào một số và theo sau là một dấu cách và tiếp theo là một kí tự. Nếu kí tự đó là f thì số đã nhập là nhiệt độ tính theo Fahrenheit và yêu cầu chuyển sang thang nhiệt độ Celsius, ngược lại nếu kí tự nhập vào là c thì ta sẽ chuyền từ Celsius sang Fehrenheit. Nếu kí tự không phải là f hoặc c thì thông báo lên màn hình nhập sai dữ liệu và kết thúc chương trình. Công thức chuyển đổi như sau:
Celsius = (5.0/9.0)*(Fahrenheit - 32.0)
Fahrenheit = (9.0/5.0) * Celsius + 32
Bài 15. Viết lại đoạn câu lệnh sau sừ dụng s w itc h
if (factor == 1)
p = 25.0;
e l s e
i f ( f a c t o r == 2)
61
p = 6.0;
else
if (factor ==3)
p = 100;
else
if ((factor ==4) II (factor ==6))
p = 200;
Bài 16. Phân biệt sự khác nhau giữa i f và s w ic h , cho ví dụ minh họa.
Bài 17. Viết chương trình nhập vào ba số a, b, c tương ứng là ngày, tháng năm nào đó. In lên màn hình xem đó có phải là ba số hợp lệ hay không.
Bài 18. Viết chương trình nhập vào một năm nào đó. In lên màn hình năm đó có phải là năm nhuận hay không.
Bài 19. Viết chương trình nhập vào 4 số thực a, b, c, d. Tìm và in ra số lớn nhất, sổ nhỏ nhất trong 4 số đó
Bài 20. Viết chương trình nhập vào 2 so X, y và 1 trong 4 toán từ +, *, /. Neu là + thì in ra kết quả X + y, nếu là - thì in ra X - y, nếu là * thì in ra X * y, nếu là / thì in ra X / y (nếu y = 0 thì thông báo không chia được).
Bài 21. Viết chuơng trình nhập vào 3 số thực dương a, b, c. Kiểm ứa 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:
s = y j p * ( p - a ) * ( p - b ) * p - c ) , \ ở i p = (a + b + c) / 2
Bài 22. Viết chương trình tính giá trị của hàm f, với X là số thực được nhập từ bàn phím.
0 x<=0
/(* ) = X 2 - X 0 < X <= 2
X2 -sin^x2 X > 2
62
Bài 23. Viết chương trình tính tiền điện với chi số mới và chi số cũ được nhập vào từ bàn phím. In ra màn hình chì số cũ, chi số mới, và sô tiên phải trả. Biết ràng 100 kWh đầu giá 550, tò kWh 101 - 150 giá 1.110, từ kWh 151 -2 0 0 giá 1.470, từ kWh 201 - 300 giá 1.600, từ kWh 301 - 400 giá 1.720, từ kWh 401 trờ lên giá 1.780.
Bài 24. Viết chương trình nhập vào các hệ số ai, bi, Cl, a2, b2, C2 để giải phương trình bậc nhất như sau:
ị a ]x + b]y = c]
\ a 2x + b2y = c2
63
C h ư ơ n g 4
CÁC CÂU LỆNH LẶP
Chương này sẽ giới thiệu ba cáu lệnh lặp trong C ++ gồm câu lệnh for, câu lệnh while và câu lệnh do...while. Mục đích cơ bàn cùa việc sử dụng câu lệnh lặp là giải quyết các đoạn công việc lặp đi lặp lại một số hữu hạn lần. Điểm quan trọng là độc giả
phải nắm được cấu trúc câu lệnh, cách sử dụng cũng như việc chuyển từ sơ đồ khối sang dạng câu lệnh này. vấn để phân biệt ba loại câu lệnh lặp cũng được trình bày và phân tích thông qua các ví dụ ở phần cuối cùa chương.
4.1. Giới thiệu
Trong khi thiết kế và xây dựng chương trình chúng ta thường gặp các đoạn công việc phải thực hiện lặp đi lặp lại nhiều lần theo một tiêu chuẩn nào đó. Chẳng hạn việc lặp đi lặp lại việc tính tổng một dãy số, lặp đi lặp lại việc tìm kiếm các giá trị thỏa mãn tiêu chuẩn nào đó lên màn hình... Các bài toán như vậy tương ứng với một chu trình lặp trong sơ đồ khối đã xét ở chương 1. Đe viết mã cho các chu trình lặp, ngôn ngữ C++ cung cấp cho chúng ta ba loại câu lệnh có thể sử dụng bao gồm:
- while
- for
- do while
v ề cơ bàn ba câu lệnh này là tương đương, tuy nhiên chúng có một số điểm khác nhau trong quá trình thực hiện. Khi viết chương trình, người lập trình cần phải vận dụng linh hoạt để chọn câu lệnh nào là phù hợp nhất với bài toán của mình. Chúng ta sẽ tìm hiểu từng loại câu lệnh trong các phần tiếp theo.
4.2. Câu lệnh w h ile
Cấu trúc của câu lệnh while như sau:
while (biểu thức logic)
;
64
trong đó w h i l e là tà khóa, quá trinh thực hiện cấu trúc w h i l e được mô tả như hình 4-1. Các bước thực hiện như sau:
Bước 1: < b iể u th ứ c l o g i o sẽ được định giá trị
Bước 2:
-N eu < b iểu thức logic> đúng thì sẽ thực thi khối lệnh và quay lại bước 1
-Neu sai, thoát khỏi vòng lặp.
Trong khối lệnh sẽ có một câu lệnh điều khiển giá trị của biểu thức logic sau mỗi lần lặp. Khi viết chương trình chúng ta phải chú ý xác định chính xác điều kiện lặp của biểu thức logic để tránh trường hợp vòng lặp của chúng ta thực hiện mãi mà không thoát khỏi để thực hiện các câu lệnh khác.
Hình 4-1. Sơ đồ khối biểu diễn câu lệnh while
Ví dụ 4.1. Viết chương trình hiển thị các số từ 1 đến n lên màn hình. Với n nhập từ bàn phím.
Giải:
#include
using namespace std;
int main()
{
int n;
cout<<"Nhap gia tri lon nhat can hien thi: cin>>n;
65
int i = 1; // Lenh khoi tao
while (i <= n)
{
cout « i « " ";
i++; // Thay doi bien dieu kien
}
return 0;
}
Chương trình trong ví dụ 4.1 thực thi việc hiển thị các số từ 1 tới n. Giả sử người sừ dụng nhập n = 5. Ban đầu i được gán giá trị bàng 1, điều kiện trong w h ile thôa mãn nên nó hiển thị giá trị 1 ra màn hình. Lệnh i++ giúp tăng giá trị i lên 2, khi đó điều kiện vẫn thỏa mãn nên số 2 được hiển thị. Cứ như vậy cho tới khi i lớn hơn 5, điều kiện không thỏa mãn nên vòng lặp dừng lại.
Vòng lặp như trong ví dụ trên được gọi là vòng lặp tiến. Chúng ta có thể tạo ra vòng lặp lùi như trong ví dụ sau:
Ví dụ 4.2. Viết chương trình hiển thị các số nguyên theo thứ tự từ n-> 1. Với n nhập vào từ bàn phím.
Giải:
♦include
using namespace std;
int m a i n ()
{
int n;
cout<<"Nhap gia tri lon nhat can hien thi: cin»n;
int i=n; I I Lenh khoi tao
while (i >= 1)
{
cout << i << "
i= i -1; // Thay doi bien dieu kien
}
return 0;
}
Trong cà hai ví dụ trên, biến i khi thay đổi điều kiện đều thay đổi 1 đơn vị, trong ví dụ tiếp theo, i sẽ thay đổi 2 đom vị.
66
Ví dụ 43. Viết chương trình tính và hiển thị tổng các số chẵn từ 1 tới 100.
Giải:
tinclude
using namespace std;
int main()
{
i n t i = 2 , to n g = 0 ; / / L enh k h o i t a o
w hile (i <= 100)
{
t ong = t ong + i;
i = i+ 2; // Thay doi b i e n d ieu kien } //Ket thuc lap
cout<<"Tong = " « t o n g ; // Lenh sau lap
r eturn 0;
Ví dụ 4.4. Viết chuơng trình tính tổng sau. Hiển thị kết quả ra màn hình. 5 = 1 +
Giải: Để tính tổng s thì quá trình sẽ lặp đi lặp lại n -1 lần, từ công thức tính s theo toán học ta có tại buớc thứ i giá trị của s sê được cộng thêm một luợng (l/l+ 2 1+1y. Giá trị của i sẽ đi từ 2 đến n. Biểu thức logic ừong trường hợp này là i < n. Chuơng trình như sau:
#include
#include
using namespace std;
int main()
{
int i ;
float s,n;
cout<<"Nhap n ="; c i n » n ;
s=l; i=2;
while (i <=n)
s= s + 1 / (pow(((i-1) + pow(i,i+l) ) ,2) ) ;
67
i = i + l ;
}
cout<<"Ket qua tong s = "<
#include
using namespace std;
int main()
{
float s,i,n;
cout<<"Nhap n ="; cin>>n;
s=0; i=2;
while (i <=n)
{
s= s + p o w ((2*i-3),2)/ p o w ((2*i -1),2);
i=i+l;
}
cout<<"Ket qua tong s = " « s ;
return 0;
}
Trong các ví dụ từ đầu tới giờ chúng ta đều dùng vòng lặp có số lần lặp xác định định. Tuy nhiên, vòng lặp w h ile còn cho phép xây dựng số lần lặp không biết tnrớc. Ví dụ 4.6 minh họa điều này. Trong ví dụ này, số lần lặp phụ thuộc vào số d ie m nhập vào, nếu d ie m > 100 thì vòng lặp sẽ dừng lại.
Ví dụ 4.6. Viết chương trình tính và hiển thị tổng điểm của một sinh viên với điểm số các môn học của sinh viên được nhập vào từ bàn phím. Việc nhập dữ liệu điểm dừng lại khi điểm > 100.
68
Giải:
♦include
using namespace std;
int main()
{
const int DIEM_MAX = 100;
double diem, tong;
diem = 0;
tong = 0;
cout « "Nhap n > 100 de dung"<> diem;
}
cout « "Tong diem = " « tong « endl;
return 0;
}
4.3. Câu lệnh f o r
Cấu trúc của câu lệnh f o r như sau:
f o r (khởi tạo biến đếm; biểu thức điều kiện; câu lệnh thay đổi biến đếm)
Trong đó f o r là từ khóa, câu lệnh f o r được thực hiện theo các bước như sau:
Bước 1: < K hời t ạ o b i ế n đếm> nhằm thiết lập giá trị ban đầu cho biến đếm;
Bước 2: Kiểm tra
Bước 3: Nếu biểu thức điều kiện có giá trị sai thì thoát khỏi câu lệnh f o r , nếu không:
< k h ố i lệ n h > sẽ được thực hiện;
Thực thi lệnh thay đổi biến điều kiện;
Quay lại thực hiện bước 2.
69
Sơ đồ khối của câu lệnh lặp f o r được minh họa như hình 4-2:
Hình 4-2. Sơ đồ khối biểu diễn câu lệnh f o r
Khi số lần lặp là cố định, câu lệnh f o r thực hiện các bước giống câu lệnh w h ile , chi khác về dạng cú pháp. Việc sử dụng f o r đơn giản và thường được sử dụng hom w h ile .
Ví dụ 4.7. Sử dụng cấu trúc f o r viết chương trình nhập vào một số n từ bàn phím. Hiển thị các giá trị nguyên tò 1 đến n ra màn hình.
Giải:
#include
using namespace std;
int main()
{
int i, n;
70
cout<<"Nhap gia tri lon nhat can hien thi: cin»n;
for(i = 1; i<=n; i++)
cout<
using namespace std;
int main()
{
int i, tong=0, dem=0;
float tbc;
for(i = 1; i<=10; i=i+2)
{
tong = tong + i;
d em = dem +1;
}
tbc=float(tong)/dem;
c o u t « " T r u n g binh cong cac so le tu 1 - 10 la: "«tbc;
return 0;
}
Chương trình trong ví dụ 4.8 thực hiện việc tính tổng các số lé từ 1 tới 10, đếm các số lẻ và sau đó tính trung bình của các số lè. Vòng lặp được khởi tạo với giá trị i = 1, lệnh tăng i được thực hiện với i =i+2 để tính giá trị lè tiếp theo.
71
Ví dụ 4.9. Viết chương trinh tính và hiển thị tổng sau ra màn hình. Với n nhập từ bàn phím.
s = 1 +1
l + 23y 2 + 34
1
ị n - l ) + n"+ì
Giải: Mấu chốt của việc sử dụng câu lệnh f o r là xác định giá trị đầu, giá trị cuối và điều kiện kết thúc của câu lệnh. Chương trình nhu sau: #include
#include
using namespace std;
int main()
{
float s,i,n;
cout<<"nhap n ="; c i n » n ;
s=l;
for (i=2; i<=n;i=i+l)
s= s + l/(pow(i-l + pow(i,i+1),2)) ;
cout<<"Tong s = " « s ;
return 0;
}
Ví dụ 4.10. Viết chương trình nhập n nguyên dương và số thực X từ bàn phím, tính và in lên màn hình tổng s được xác định bởi công thức sau: s = X - x 1/2 + x 1/3 + ... ( - l) n+V 'n
Giải: Trong ví dụ này, chúng ta thấy việc tính tổng được lặp đi lặp lại, chi khác là dãy đan dấu. Sử dụng vòng lặp f o r , chucmg trình như sau:
#include
#include
using namespace std;
int main()
{
double re
double i, X, s;
cout<<"nhap n ="; c i n » n ;
cout<<"Nhap X = c i n » x ;
s=0;
for (i=l; i<=n;i=i+l)
s= s + p o w (-1,i+1)*pow(x,1/i);
72
cout<<"Tong s = " « s ;
return 0;
}
Trong nhiều trường hợp ta can sừ dụng một vòng lặp nằm trong một vòng lặp khác hay còn gọi là vòng lặp lồng nhau. Ví dụ sau minh họa điều này:
Ví dụ 4.11. Viết chương trinh nhập vào số lượng sinh viên và số môn học của một sinh viên. Tính và hiển thị điểm trung bình của từng sinh viên.
Giải:
♦include
using namespace std;
int main()
<
int i, j, so_mon_hoc, so_sv;
double diem, tong_diem, diem_tb;
cout«"Nhap vao so sinh vien: cin>>so_sv;
cout<<"Nhap vao so mon hoc: cin>>so_mon_hoc; for (i = 1; i <= so_sv; i++)
{
tong_diem = 0; // Xoa tong_diem ve 0 de tinh cho tung sv
for (j = 1; j <= so_mon_hoc; j++)
{
cout « "Nhap diem mon hoc " « j « " cua sinh
v ie n : ";
c i n > > d ie m ;
tong_diem=tong_diem + diem;
}
diem_tb = tong_diem / so_mon_hoc;
cout « "\nDiem trung binh cua sinh vien " « i « ° la " « diem_tb « "\n\n";
}
return 0;
}
4.4. Câu lệnh d o - w h ile
Cấu trúc của câu lệnh d o - w h ile như sau:
do
< k h ố i lệ n h >
w h i l e (biểu thức logic) ;
73
Trong đó do và w h ile là từ khóa. Khi gặp câu lệnh trẽn < k h ố i lệ n h > sẽ được thực hiện chừng nào (b iể u th ứ c lo g i c ) còn có giá trị đúng. Sơ đồ khối minh họa cấu trúc d o - w h ile được mô tả trong hình 4-3.
Hình 4-3. Sơ đồ khối biểu diễn câu lệnh d o -while
Ví dụ 4.12. Viết lại ví Jụ 4.1 (w h ile ) và 4.7 ( f o r ) bằng câu lệnh d o - w h ile : Viết chương trình nhập một số nguyên n vào từ bàn phím. Yêu cầu hiển thị các giá trị nguyên từ 1 tới n.
Giải: Sử dụng câu lệnh d o - w h ile , chương trình như sau: ệinclude
using namespace std;
int main()
int i,n;
74
cout<<"Nhap gia tri lon nhat can hien thi: cin»n;
i = l ;
do
{
c o u t « i « "
i++;
}
while (i<=n);
return 0;
Trong ví dụ 4.12, giả sử ta nhập n = 5. Ban đầu i được khởi gán giá trị bằng 1, tiếp theo khối lệnh của vòng lặp d o - w h ile thực hiện việc hiển thị giá trị của i, rồi tăng i lên 1 bằng 2 rồi mới kiểm fra xem i có nhỏ hơn 5 không. Vì i bằng 2 nhỏ hơn 5 nên i tiếp tục được hiển thị và tăng lên 3. Tương tự tới khi i tăng lên 6, điều kiện trở thành sai và vòng lặp dừng lại.
Ví dụ 4 .13. Viết chương trình tính tổng sau, với n nhập tò bàn phím:
5 = { - Ĩ - Ỵ + Ị— T +. . . +í ; 2) + - i ì Ỵ
U + 2 ) I 2 + 3J [ (|»-1) + U
Chúng ta sẽ sử dụng cấu lệnh do - w h ile để viết chương trình sau.
Giải:
#include
#include
using namespace std;
int main()
{
int n;
float s,i;
cout<<"nhap n ="; c i n » n ;
s=0; i=2;
do
75
{
s= s + p o w ((2*i-3),2)/ p o w ((2*i -1),2);
i++;
}
while (i<=n);
cout<<"Tong s = " « s ;
return 0;
}
Sử dụng câu lệnh d o - w h ỉle để kiểm tra tính họp lệ của dữ liệu
Lệnh d o - w h i l e rất hữu ích khi dùng để kiểm fra dữ liệu do người dùng nhập vào có hợp lệ hay không. Ví dụ khi nhập vào số tháng của một năm thì tháng nằm trong khoảng 1 tới 12 là hợp lệ, ngoài khoảng này yêu cầu người dùng nhập lại.
Ví dụ 4.14a. Viết chương trình nhập vào số tháng, số năm rồi hiển thị số ngày của năm đó. Yêu cầu kiểm tra tháng từ tháng 1 tới 12, năm từ năm 1900 tới 3000.
Giải:
#include
using namespace std;
int main()
{
int t, n, i;
do
{
cout<<"nhap thang t ="; cin>>t;
cout<<"nhap nam ="; c i n » n ;
}
while ((t12) I I (n<1900) I I (n>3000)) ; switch (t)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
cout<<"Thang " « t « " nam " « n « " CO 31 n g a y " ;
76
break;
case 4 :
case 6:
case 9:
case 11:
co ut< <"T han g " << t « " nam " « n << " CO 30 n g a y " ;
break;
case 2:
if (((n % 4 == 0) && (n % 100 ! =0) ) II (n % 400 ==0))
cout<<"Thang 2 nam " « n << " CO 29 ngay";
else
cout<<"Thang 2 nam CO 28 ngay";
break;
}
return 0;
}
Trong ví dụ này, người sử dụng cần nhập đúng tháng nằm trong khoảng từ tháng 1 đến tháng 12 và năm nằm trong khoảng từ 1900 tới 3000 thì chương trình mới tính toán và hiển thị số ngày của tháng và năm đó. Trái lại, nếu tháng hoặc năm nhập không chính xác thì chương trình sẽ yêu cầu người sù dụng nhập lại cho đúng. Tuy nhiên chương trình trên có một nhược điểm là không báo cho người sử dụng chương trình có lỗi gì. Đe khắc phục điều này chúng ta xem ví dụ sau:
Ví dụ 4.14b. Viết chương trình nhập vào số tháng, số năm rồi hiển thị số ngày của năm đó. Yêu cầu kiểm tra tháng từ tháng 1 tới 12, năm từ năm 1900 tới 3000.
Giải:
#include
using namespace std;
int main()
{
int t, n, i;
do
{
cout<<"nhap thang t ="; c i n » t ;
cout<<"nhap nam ="; cin>>n;
i f ( ( t < l ) I I ( t> 1 2 ) I I (n<1900) I I ( n > 3 0 0 0 ) )
77
cout<<"Du lieu sai, xin moi nhap lai!"<