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:

STL

  • Stack (ngăn xếp)
  • Vector trong C++
  • Queue (hàng đợi)
  • Deque (hàng đợi hai đầu)
  • Priority queue (hàng đợi ưu tiên)
  • Set (tập hợp)
  • List (danh sách liên kết)
  • Multiset (tập hợp)
  • 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() ;

    }