C++ toàn tập

Đây là ngôn ngữ rất phổ biến được nhiều người lựa chọn và nó có cơ hội việc làm thu nhập rất cao nếu bạn thông thạo nó. Vì vậy Blog đã viết một loạt bài về C++ với mục đích giúp các bạn tiện tra cứu và học hỏi.

Cơ bản:

Các cấu trúc điều khiển trong C++

Cấu trúc lặp for

   for(biểu_thức_1; biểu_thức_2; biểu_thức_3)
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }
  • Ý nghĩa từng biểu thức:
  • biểu_thức_1: thường dùng khởi tạo biến đếm vòng lặp.
  • biểu_thức_2: thường dùng kiểm tra điều kiện vòng lặp.
  • biểu_thức_3: thường dùng điều khiển biến đếm của vòng lặp
  • Ví dụ: for(int i=0; i<10; i++)
  • Thứ tự thực hiện:
    • Bước 1: Xác định biểu_thức_1
    • Bước 2: Xác định biểu_thức_2
    • Bước 3: Nếu biểu_thức_2 đúng chương trình sẽ thực hiện khối lệnh trong vòng lặp for. Ngược lại thoát khỏi for.
    • Bước 4: Tính biểu_thức_3, sau đó quay lại bước 2 để bắt đầu vòng lặp mới.

Cấu trúc điều khiển rẽ nhánh if

   if(biểu_thức_điều_kiện)
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }

Cấu trúc điều khiển rẽ nhánh if…else

   if(biểu_thức_điều_kiện)
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }
   else
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }

Cấu trúc điều khiển switch

   switch(biều_thức_chọn)
   {
      case Giá_trị_1:
            Lệnh_1;
            Lệnh_2;
            ...
            break;
      case Giá_trị_2:
            Lệnh_1;
            Lệnh_2;
            ...
            break;
      default:
            Lệnh_1;
            Lệnh_2;
            ...
            break;
   }
  • biều_thức_chọn trong switch sẽ được so sánh với các giá trị trong tương ứng với các mệnh đề case.
  • Nếu giá trị biều_thức_chọn bằng Giá_trị_i thì khối lệnh của case i được thực hiện. Ngược lại thì khối lệnh tương ứng với khóa default được thực hiện.

Cấu trúc điều khiển lặp while

   while(<điều_kiện_lặp)
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }
  • Điều kiện lặp được kiểm tra trước khi thực hiện khối lệnh

Cấu trúc lặp while

   do
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;  
   }while(điều_kiện_lặp);
  • Điều kiện lặp được kiểm tra khi khối lệnh được thực hiện xong. Do đó khối lệnh trong vòng lặp được thực hiện ít nhất 1 lần

Chọn trình soạn thảo C++ nào?

Hiện tại có rất nhiều trình soạn thảo C++ nhưng để chọn được trình soạn thảo phủ hợp với đặc thù công việc thì cần thời gian dài trải nghiệm và học hỏi… Dưới đây là 9 trình soạn thảo C++ hay còn gọi là IDE tốt nhất do các chuyên gia trên thế giới đánh giá.

1. CLion

Platforms: Linux, Mac OS X, Windows

  • Soạn thảo thông minh
  • Hộ trợ lập trình nhúng
  • Hỗ trợ thêm nhiều ngôn ngữ: C++11, libc++, boost, JavaScript, XML, HTML and CSS
  • Phím tắt giúp tạo nhanh dự án
  • CMake hộ trợ
  • Thống kê

2. Visual Studio

 

Platforms: Windows
IDE này do gã khổng lồ Microsoft sản xuất. Một phần lý do trình soạn thảo này chỉ hoạt động trên Windows. Đây là một trong những trình soạn thảo tốt nhất không chỉ cho C/C++ developers mà còn cho nhiều ngôn ngữ khác. Nếu bạn làm việc team thì có thể bạn cần phiên bản Pro trả phí nhưng nếu bạn làm một mình thì bạn có thể sử dụng bản Express miễn phí.

3. XCode

 

Platforms: Mac OS X
This IDE is the best choice for Mac users. Probably there are so many programmers who prefer to use a Mac. And again this IDE like the previous one (Visual Studio) is not only for C/C++ developers, there are many other popular languages supported. It is completely free to use. So you get pretty cool features to develop your program with C/C++.
Đây là sự lựa chọn tốt nhất cho người dùng Mac. Nó hoàn toàn miễn phí cho bạn nhưng cũng rất nhiều tính năng hay danh cho C/C++ developers

4. Eclipse

 

Platforms: Linux, Mac OS X, Windows
Eclipse hỗ trợ đã nền tảng và nó có một kho mã nguồn mở lớn và miễn phí.
  • Công cụ phát triển C/C++
  • Cộng đồng hỗ trợ Eclipse Git Team
  • Danh sách task Mylyn
  • Khai thác từ xa

Xem thêm

5. NetBeans

 

Platforms: Linux, Mac OS X, Windows
  • Hỗ trợ C++11
  • Bộ công cụ hỗ trợ Qt
  • Phát triển từ xa
  • Tệp điều hướng
  • Cài đắt cấu hình trình biên dịch

Xem thêm

6. Code::Blocks

Platforms: Linux, Mac OS X, Windows

  • Đơn giản, dễ dùng
  • Viết bằng C++.
  • Có thể mớ rộng bằng plugins
  • Open Source! GPLv3 miễn phí
  • Hỗ trợ nhiều trình biên dịch
  • Interfaces GNU GDB
  • Hỗ trợ MS CDB
  • Xem thông kê sử dụng CPU
  • Chuyển đổi giữa các threads

Hướng dẫn học C++

Xem thêm

7. Qt Creator

Platforms: Linux, Mac OS X, Windows
Thư viện nguồn mở là một điểm cộng.
  • Biên dịch nhanh Qt
  • Khởi động Qt nhanh
  • Qt Quick 2D Renderer
  • Qt WebView
  • Qt Bàn phím ảo
IDE có phiên bản pro trả phí.

8. Geany

Platforms: Linux, Mac OS X, Windows
Nhẹ, dễ sử dụng
  • Syntax highlighting
  • Code folding
  • Tự động đóng thẻ XML và HTML
  • Xây dựng hệ thống để biên dịch và thực thi
  • Quản lý project đơn giản

Xem thêm

9. CodeLite

Platforms: Linux, Mac OS X, Windows
  • Hiển thị lỗi dễ hiểu
  • Hỗ trợ Built-in GDB
  • Hỗ trợ C++11 auto keyword, templates, inheritance etc.

Xem thêm

Tóm lại

Yêu cầu công việc khác nhau thì nên lựa chọn những trình soạn thảo khác nhau.

  • Nếu bạn yêu cầu làm những dự án nhỏ hay chỉ mới học lập trình C++ thì có thể lựa chọn những IDE nhẹ, dễ sử dụng như Code::Blocks, Geany
  • Nếu bạn đang làm dự án lớn thì nên chọn những IDE có nhiều công cụ có sẵn như: VLion, Visual Studio

Các hàm làm tròn số trong C++

value   round   floor   ceil    trunc
-----   -----   -----   ----    -----
2.3     2.0     2.0     3.0     2.0
3.8     4.0     3.0     4.0     3.0
5.5     6.0     5.0     6.0     5.0
-2.3    -2.0    -3.0    -2.0    -2.0
-3.8    -4.0    -4.0    -3.0    -3.0
-5.5    -6.0    -6.0    -5.0    -5.0

Hàm round(x)

Làm tròn về số nguyên gần nhất so với số thực x.

Hàm trunc(x)

Trả về số thực có giá trị bằng phần nguyên của x.

Hàm ceil(x)

Làm tròn lên số thực x. Trả về số thực có giá trị bằng số nguyên nhỏ nhất lớn hơn hoặc bằng x.

Hàm floor(x)

Làm tròn xuống số thực x. Trả về số thực có giá trị bằng số nguyên lớn nhất nhỏ hơn hoặc bằng x.

 

Chú ý: Tất cả các hàm trên đều thuộc thư viện cmath. Bạn phải khai báo thư viện này trước khi sử dụng các hàm trên.

Các hàm toán học có sẵn trong C++

YeuLapTrinh.pw xin được 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
  • atof(s_number) : trả lại số thực ứng với số viết dưới dạng xâu kí tự
  1. Các hàm lượng giác
  • sin(x), cos(x), tan(x) : trả lại các giá trị sinx, cosx,

 

Bạn nên tham khảo bài viết: Các hàm làm tròn số trong C++

 

Các kiểu dữ liệu trong C++

Có 4 kiểu dữ liệu cơ bản trong C++ là: char, int, float, double.

kieu-du-lieu-yeulaptrinh.pw

TT Kiểu dữ liệu Kích thước              Miền giá trị
(Type) (Length) (Range)
1 unsigned char 1 byte 0 đến 255
2 char 1 byte – 128 đến 127
3 enum 2 bytes – 32,768 đến 32,767
4 unsigned int 2 bytes 0 đến 65,535
5 short int 2 bytes – 32,768 đến 32,767
6 int 2 bytes – 32,768 đến 32,767
7 unsigned long 4 bytes 0 đến 4,294,967,295
8 long 4 bytes – 2,147,483,648 đến 2,147,483,647
9 float 4 bytes 3.4 * 10–38
đến 3.4 * 1038
10 double 8 bytes 1.7 * 10–308
đến 1.7 * 10308
11 long double 10 bytes 3.4 * 10–4932
đến 1.1 * 104932
Những bài viết có thể bạn thích:

Khái niệm về kiểu dữ liệu

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
  • Miền giá trị của kiểu: Cho biết một đơn vị dữ liệu thuộc kiểu này sẽ có thể lấy giá trị trong miền nào, ví dụ nhỏ nhất và lớn nhất là bao nhiêu. Hiển nhiên các giá trị này phụ thuộc vào số byte mà hệ thống máy qui định cho từng kiểu. NSD cần nhớ đến miền giá trị này để khai báo kiểu cho các biến cần sử dụng một cách thích hợp.

Dưới đây là bảng tóm tắt một số kiểu chuẩn đơn giản và các thông số của nó được sử dụng trong C++.

Loại dữ liệu Tên kiểu Số ô nhớ Miền giá trị
Kí tự char 1 byte – 128 .. 127
unsigned char 1 byte 0 .. 255
Số nguyên int 2 byte – 32768 .. 32767
unsigned int 2 byte 0 .. 65535
short long 2 byte

4 byte

– 32768 .. 32767

– 215 .. 215  – 1

Số thực float 4 byte ± 10 -37  . . ± 10 +38
double 8 byte ± 10 -307  . . ± 10 +308

Bảng 1. Các loại kiểu đơn giản

Trong chương này chúng ta chỉ xét các loại kiểu đơn giản trên đây. Các loại kiểu có cấu trúc do người dùng định nghĩa sẽ được trình bày trong các chương sau.

Kiểu ký tự

Một kí tự là một kí hiệu trong bảng mã ASCII. Như đã biết một số kí tự có mặt chữ trên bàn phím (ví dụ các chữ cái, chữ số) trong khi một số kí tự lại không (ví dụ kí tự biểu diễn việc lùi lại một ô trong văn bản, kí tự chỉ việc kết thúc một dòng hay kết thúc một văn bản). Do vậy để biểu diễn một kí tự người ta dùng chính mã ASCII của kí tự đó trong bảng mã ASCII và thường gọi là giá trị của kí tự. Ví dụ phát biểu “Cho kí  tự ‘A'” là cũng tương đương với phát biểu “Cho kí tự 65” (65 là mã ASCII của kí tự ‘A’), hoặc “Xoá kí tự xuống dòng” là cũng tương đương với phát biểu “Xoá kí tự 13” vì 13 là mã ASCII của kí tự xuống dòng.

Như vậy một biến kiểu kí tự có thể được nhận giá trị theo 2 cách tương đương – chữ hoặc giá trị số: ví dụ giả sử c là một biến kí tự thì câu lệnh gán c = ‘A’ cũng tương đương với câu lệnh gán c = 65. Tuy nhiên để sử dụng giá trị số của một kí tự c nào đó  ta phải yêu cầu đổi c sang giá trị số bằng câu lệnh int(c).

Theo bảng trên ta thấy có  2 loại kí tự là char với miền giá trị từ -128 đến   127 và unsigned char (kí tự không dấu) với miền giá trị từ 0 đến 255. Trường hợp một biến được gán giá trị vượt ra ngoài miền giá trị của kiểu thì giá trị của biến sẽ được tính theo mã bù – (256 – c). Ví dụ nếu gán cho char c giá trị 179 (vượt khỏi miền giá trị đã được qui định của char) thì giá trị thực sự được lưu trong máy sẽ là – (256 – 179) = -77.

Ví dụ 1 :

char c, d ;                                       // c, d được phép gán giá trị từ -128 đến 127

unsigned e ;                                   // e được phép gán giá trị từ 0 đến 255

c = 65 ; d = 179 ;                           // d có giá trị ngoài miền cho phép

e = 179; f = 330 ;                           // f có giá trị ngoài miền cho phép

cout << c << int(c) ;                                        // in ra chữ cái ‘A’ và giá trị số 65

cout << d << int(d) ;                                        // in ra là kí tự ‘|’ và giá trị số -77

cout << e << int(e)                                          // in ra là kí tự ‘|’ và giá trị số 179

cout << f << int(f)                          // in ra là kí tự ‘J’ và giá trị số 74

Chú ý: Qua ví dụ trên ta thấy một biến nếu được gán giá trị ngoài miền cho phép sẽ dẫn đến kết quả không theo suy nghĩ thông thường. Do vậy nên tuân thủ qui tắc chỉ gán giá trị cho biến thuộc miền giá trị mà kiểu của biến đó qui định. Ví dụ nếu muốn sử dụng biến có giá trị từ 128 .. 255 ta nên khai báo biến dưới dạng kí tự không dấu (unsigned char), còn nếu giá trị vượt quá 255 ta nên chuyển sang kiểu nguyên (int) chẳng hạn.

Kiểu số nguyên

Các số nguyên được phân chia thành 4 loại kiểu khác nhau với các miền giá trị tương ứng được cho trong bảng 1. Đó là kiểu số nguyên ngắn (short) tương đương với kiểu số nguyên (int) sử dụng 2 byte và số nguyên dài (long int) sử dụng 4 byte. Kiểu số nguyên thường được chia làm 2 loại có dấu (int) và không dấu (unsigned int hoặc có thể viết gọn hơn là unsigned). Qui tắc mã bù cũng được áp dụng nếu giá trị của biến vượt ra ngoài miền giá trị cho phép, vì vậy cần cân nhắc khi khai báo kiểu cho các  biến. Ta thường sử dụng kiểu int cho các số nguyên trong các bài toán với miền giá trị vừa phải (có giá trị tuyệt đối bé hơn 32767), chẳng hạn các biến đếm trong các vòng lặp, …

Kiểu số thực

Để sử dụng số thực ta cần khai báo kiểu float hoặc double mà miền giá trị của chúng được cho trong bảng 1. Các giá trị số kiểu double được gọi là số thực với độ chính xác gấp đôi vì với kiểu dữ liệu này máy tính có cách biểu diễn khác so với kiểu float để đảm bảo số số lẻ sau một số thực có thể tăng lên đảm bảo tính chính xác cao hơn so với số kiểu float. Tuy nhiên, trong các bài toán thông dụng thường ngày độ chính xác của số kiểu float là đủ dùng.

Như đã nhắc đến trong phần các lệnh vào/ra ở chương 1, liên quan đến việc in ấn số thực ta có một vài cách thiết đặt dạng in theo ý muốn, ví dụ độ rộng tối thiểu để in một số hay số số lẻ thập phân cần in …

Ví dụ 2 : Chương trình sau đây sẽ in diện tích và chu vi của một hình tròn có bán kính 2cm với 3 số lẻ.

#include <iostream.h>

#include <iomanip.h> void main()

{

float r = 2 ;                            // r là tên biến dùng để chứa bán kính

cout << “Diện tích = ” << setiosflags(ios::showpoint) ;

cout << setprecision(3) << r * r * 3.1416 ; getch() ;

}