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)
  • List (danh sách liên kết) trong C++

    • List được thực hiện như danh sách nối kép (doubly-linked list). Mỗi phần tử trong danh sách nối kép có liên kết đến một phần tử trước đó và một phần tử sau nó.
    • Do đó, list có các ưu điểm như sau:
      1. Chèn và loại bỏ phần tử ở bất cứ vị trí nào trong container. O(1).
    • Điểm yếu của list là khả năng truy cập tới phần tử thông qua vị trí. O(n).
    • Khai báo: #include <list>

    Các hàm thành viên:

    Capacity:

    • size : trả về số lượng phần tử của list. ĐPT O(1).
    • empty : trả về true(1) nếu list rỗng, ngược lại là false(0). ĐPT O(1).

     

    Truy cập phần tử:

    • front: trả về giá trị phần tử đầu tiên. ĐPT O(1).
    • back: trả về giá trị phần tử cuối cùng. ĐPT O(1).

     

    Chỉnh sửa:

    • push_back : thêm phần tử vào ở cuối list. ĐPT O(1).
    • push_front : thêm phần tử vào đầu list. ĐPT O(1).
    • pop_back : loại bỏ phần tử ở cuối list. ĐPT O(1).
    • pop_front : loại bỏ phần tử ở đầu list. ĐPT O(1).
    • insert (iterator,x): chèn “x” vào trước vị trí “iterator” ( x có thể là phần tử hay iterator của 1 đoạn phần tử…). ĐPT là số phần tử thêm vào.
    • erase : xóa phần tử ở vị trí iterator. ĐPT là số phần tử bị xóa đi.
    • swap : đổi 2 list cho nhau (ví dụ: first.swap(second);). ĐPT O(1).
    • clear: xóa list. ĐPT O(n).

     

    Operations:

    • splice : di chuyển phần tử từ list này sang list khác. ĐPT O(n).
    • remove (const) : loại bỏ tất cả phần tử trong list bằng const. ĐPT O(n).
    • remove_if (function) : loại bỏ tất các phần tử trong list nếu hàm function return true . ĐPT O(n).
    • unique : loại bỏ các phần tử bị trùng lặp hoặc thỏa mãn hàm nào đó. ĐPT O(n). Lưu ý: Các phần tử trong list phải được sắp xếp.
    • sort : sắp xếp các phần tử của list. O(NlogN)
    • reverse : đảo ngược lại các phần tử của list. O(n).

    Deque (hàng đợi hai đầu) trong C++

    Deque hay còn được gọi là hàng đợi hai đầu

    • Deque (thuờng được phát âm giống như “deck”) là từ viết tắt của double-ended queue (hàng đợi hai đầu).
    • Deque có các ưu điểm như:
    1. Các phần tử có thể truy cập thông cua chỉ số vị trí của nó. O(1)
    2. Chèn hoặc xóa phần tử ở cuối hoặc đầu của dãy. O(1)

    Khai báo: #include <deque>

     

    Capacity:

    • size : trả về số lượng phần tử của deque. ĐPT O(1).
    • empty : trả về true(1) nếu deque rỗng, ngược lại là false(0). ĐPT O(1).

    Truy cập phần tử:

    • operator [] : trả về giá trị phần tử thứ []. ĐPT O(1).
    • at : tương tự như trên. ĐPT O(1).
    • front: trả về giá trị phần tử đầu tiên. ĐPT O(1).
    • back: trả về giá trị phần tử cuối cùng. ĐPT O(1).

     

    Chỉnh sửa:

    • push_back : thêm phần tử vào ở cuối deque. ĐPT O(1).
    • push_front : thêm phần tử vào đầu deque. ĐPT O(1).
    • pop_back : loại bỏ phần tử ở cuối deque. ĐPT O(1).
    • pop_front : loại bỏ phần tử ở đầu deque. ĐPT O(1).
    • insert (iterator,x): chèn “x” vào trước vị trí “iterator” ( x có thể là phần tử hay iterator của 1 đoạn phần tử…). ĐPT O(n).
    • erase : xóa phần tử ở vị trí iterator. ĐPT O(n).
    • swap : đổi 2 deque cho nhau (ví dụ: first.swap(second);). ĐPT O(n). clear: xóa vector. ĐPT O(1).

    Điểm khác nhau giữa double và float

    Đối với các số thực, chúng ta thường sử dụng float, double và double double.

    floatdouble có gì khác nhau?

    double có độ chính xác gấp 2 lần float.

    float là 32 bit IEEE 754 single precision Floating Point Number, 1 bit cho dấu, (8 bit cho số mũ và 23 * cho giá trị), tức là float có 7 chữ số thập phân có độ chính xác.

    double là 64 bit IEEE 754 double precision Floating Point Number (1 bit cho dấu, 11 bit cho số mũ và 52 bit cho giá trị), nghĩa là double có 15 chữ số thập phân có độ chính xác.

    Hàm atoi trong C/C++ – chuyển xâu thành số nguyên

    Mô tả

    Chuyển chuỗi kí tự thành số nguyên

    Khai báo

    int atoi(const char *str)

    • str là chuỗi ký tự cần chuyển sang số nguyên. VD: str=”5678123″

    Ví dụ:

    • atoi(“101”);
    • atoi(‘5’);

    Cần khai báo thư viện stdlib.h trước khi sử dụng.

    Giá trị trả về

    Trả về số nguyên kiểu int. Nếu xâu không có dạng số nguyên thì trả về giá trị 0

    Ví dụ

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main () {
       int val;
       char str[20];
     
       strcpy(str, "98993489");
       val = atoi(str);
       printf("String value = %s, Int value = %d\n", str, val);
     
       strcpy(str, "tutorialspoint.com");
       val = atoi(str);
       printf("String value = %s, Int value = %d\n", str, val);
     
       return(0);
    }

    Kết quả:

    String value = 98993489, Int value = 98993489
    String value = tutorialspoint.com, Int value = 0
    

    Sự khác nhau giữa C và C++, chuyển nhanh từ C sang C++ và ngược lại

    Với mục đích tổng hợp toàn bộ sự biệt giữa C và C++ để mọi người có thể dễ dàng chuyển từ C sang C++ hoặc từ C++ sang C.
    C không có:

    • Ngoại lệ (exception)
    • Kiểm tra miền giá trị (range-checking)
    • Thu hồi bộ nhớ (garbage collection)
    • Lập trình hướng đối tượng (object-oriented programming)
    • Đa hình (polymorphism)
    • STD
    • . . .

    C là ngôn ngữ lập trình bậc thấp hơn C++, gần với ngôn ngữ máy hơn C++ => C ‘chạy nhanh’ hơn C++

    Nhập xuất dữ liệu

    C C++
    Nhập xuất từ bàn phím, màn hình printf(chuỗi định dạng, tham số 1, tham số 2, …)
    scanf(chuỗi định dạng, tham số 1, tham số 2, …)
    Xem cụ thể tại: http://yeulaptrinh.pw/1549/nhap-xuat-trong-c/
    cin >> biến
    cout << biến
    Xem cụ thể tại: http://yeulaptrinh.pw/1154/nhap-xuat-du-lieu-tu-ban-phim-trong-c/
    Nhập xuất từ file Chi tiết tại: Chi tiết tại: http://yeulaptrinh.pw/1236/nhap-xuat-du-lieu-tu-file-trong-c/

    Nhập, xuất dữ liệu từ file trong C++

    Tất cả các chương trình mà ta đã gặp trong cuốn sách này đều lấy dữ liệu vào từ bàn phím và in ra màn hình. Nếu chỉ dùng bàn phím và màn hình là các thiết bị vào ra dữ liệu thì chương trình của ta khó có thể xử lý được khối lượng lớn dữ liệu, và kết quả chạy chương trình sẽ bị mất ngay khi ta đóng cửa sổ màn hình output hoặc tắt máy. Để cải thiện tình trạng này, ta có thể lưu dữ liệu  tại  các thiết bị lưu trữ thứ cấp mà thông dụng nhất thường là ổ đĩa cứng. Khi đó dữ liệu tạo bởi một chương trình có thể được lưu lại để sau này được sử dụng bởi chính nó hoặc các chương trình khác. Dữ liệu lưu trữ như vậy được đóng gói tại các thiết bị lưu trữ thành các cấu trúc dữ liệu gọi là tp (file).

    Chương này sẽ giới thiệu về cách viết các chương trình lấy dữ liệu vào (từ bàn phím hoặc từ một tệp) và ghi dữ liệu ra (ra màn hình hoặc một  tệp).

    Khái niệm dòng dữ liệu

    Trong một số ngôn ngữ lập trình như C++ và Java, dữ liệu vào ra từ tệp, cũng  như từ bàn phím và màn hình, đều được vận hành thông qua các dòng dliu (stream). Ta có thể coi dòng dữ liệu là một kênh hoặc mạch dẫn  mà  dữ  liệu được truyền qua đó để chuyển từ nơi gửi đến nơi nhận.

    Dữ liệu được truyền từ chương trình ra ngoài theo một dòng ra (output stream). Đó có thể là dòng ra chuẩn nối và đưa dữ liệu ra màn hình, hoặc dòng ra nối với một tệp và đẩy dữ liệu ra tệp đó.

    Chương trình nhận dữ liệu vào qua một dòng vào (input stream). Dòng vào thì có thể là dòng vào chuẩn nối và đưa dữ liệu vào từ màn hình, hoặc dòng vào nối với một tệp và nhận dữ liệu vào từ tệp đó.

    Dữ liệu vào và ra có thể là các kí tự, số, hoặc các byte chứa các chữ số nhị  phân.

    Trong C++, các dòng vào ra được cài đặt bằng các đối tượng của các lớp dòng vào ra đặc biệt. Ví dụ, cout mà ta vẫn dùng để ghi ra màn hình chính là dòng ra chuẩn, còn cin là dòng vào chuẩn nối với bàn phím. Cả hai đều là các đối tượng dòng dữ liệu (khái niệm “đối tượng” này có liên quan đến tính năng hướng đối tượng của C++, khi nói về các dòng vào/ra của C++, ta sẽ phải đề cập nhiều đến tính năng này).

    Tp văn bn và tp nhphân

    Về bản chất, tất cả dữ liệu trong các tệp đều được lưu trữ dưới dạng một chuỗi các bit nhị phân 0 và 1. Tuy nhiên, trong một số hoàn cảnh, ta không  coi nội dung của một tệp là một chuỗi 0 và 1 mà coi tệp đó là một chuỗi các kí tự. Một   số tệp được xem như là các chuỗi kí tự và được xử lý bằng các dòng và hàm cho phép chương trình và hệ soạn thảo văn bản của bạn nhìn các chuỗi nhị phân như là các chuỗi kí tự. Chúng được gọi là các tp văn bn (text file). Những tệp không phải tệp văn bản là tp nhphân (binary file). Mỗi loại tệp được xử lý   bởi các dòng và hàm riêng.

    Chương trình C++ của bạn được lưu trữ trong tệp văn bản. Các tệp ảnh và nhạc  là các tệp nhị phân. Do tệp văn bản là chuỗi kí tự, chúng thường trông giống nhau tại các máy khác nhau, nên ta có thể chép chúng  từ  máy này sang  máy khác mà không gặp hoặc gặp phải rất ít rắc rối. Nội dung của các tệp nhị phân thường lấy cơ sở là các giá trị số, nên việc sao chép chúng giữa các máy có thể gặp rắc rối do các máy khác nhau có thể dùng các quy cách lưu trữ số không giống nhau. Cấu trúc của một số dạng tệp nhị phân đã được chuẩn hóa để chúng có thể được sử dụng thống nhất tại các platform khác nhau. Nhiều dạng tệp ảnh và âm thanh thuộc diện này.

    Mỗi kí tự trong một tệp văn bản được biểu diễn bằng 1 hoặc 2 byte, tùy theo đó  là kí tự ASCII hay Unicode. Khi một chương trình viết một giá trị vào một tệp văn bản, các kí tự được ghi ra tệp giống hệt như khi chúng được ghi ra màn hình bằng cách sử dụng cout. Ví dụ, hành động viết số 1 vào một tệp sẽ dẫn đến kết quả là 1 kí tự được ghi vào tệp, còn với số 1039582 là 7 kí tự được ghi vào  tệp.

    Các tệp nhị phân lưu tất cả các giá trị thuộc một kiểu dữ liệu cơ bản theo cùng một cách, giống như cách dữ liệu được lưu trong bộ nhớ máy tính. Ví dụ, mỗi  giá trị int bất kì, 1 hay 1039582 đều chiếm một chuỗi 4 byte.

     Vào ra tệp

    C++ cung cấp các lớp sau để thực hiện nhập và xuất dữ liệu đối với  tệp:

    • ofstream: lớp dành cho các dòng ghi dữ liệu ra tệp
    • ifstream: lớp dành cho các dòng đọc dữ liệu từ tệp
    • fstream: lớp dành cho các dòng vừa đọc vừa ghi dữ liệu ra tệp.

    Đối tượng thuộc các lớp này do quan hệ thừa kế nên cách sử dụng chúng khá giống với cin và cout – các đối tượng thuộc lớp istream và ostream – mà chúng ta đã dùng. Khác biệt chỉ là ở chỗ ta phải nối các dòng đó với các  tệp.

    c-p-yeulaptrinh.pw

    Hình 8.1: Các thao tác cơ bn vi tp văn bn.

    Chương trình trong Hình 8.1 tạo một tệp có tên hello.txt và ghi vào đó một câu “Hello!” theo cách mà ta thường làm đối với cout, chỉ khác ở chỗ thay cout bằng đối tượng dòng myfile đã được nối với một tệp. Sau đây là các bước thao tác với tệp.

    • Mở tệp

    Việc đầu tiên là nối đối tượng dòng với một tệp, hay nói cách khác là mở một  tệp. Kết quả là đối tượng dòng sẽ đại diện cho tệp, bất kì hoạt động đọc và ghi  đối với đối tượng đó sẽ được thực hiện đối với tệp mà nó đại diện. Để mở một  tệp từ một đối tượng dòng, ta dùng hàm open của nó:

    open (fileName, mode);


    Trong đó, fileName là một xâu kí tự thuộc loại const char * với kết thúc là kí tự null (hằng xâu kí tự cũng thuộc dạng này), là tên của tệp cần mở, và mode là tham số không bắt buộc và là một tổ hợp của các cờ  sau:

    ios::in     mở để đọc

    ios::out    mở để ghi

    ios::binary  mở ở dạng tệp nhị  phân

    ios::ate    đặt ví trí bắt đầu đọc/ghi tại cuối tệp. Nếu cờ này không được đặt giá trị gì, vị trí khởi đầu sẽ là đầu tệp.

    ios::app    mở để ghi tiếp vào cuối tệp. Cờ này chỉ được dùng  cho dòng mở tệp chỉ để ghi.

    ios::trunc   nếu tệp được mở để ghi đã có từ trước, nội dung cũ sẽ bị  xóa

    để ghi nội dung mới.
    Các cờ trên có thể được kết hợp với nhau bằng toán tử bit OR (|). Ví dụ, nếu ta muốn mở tệp people.dat theo dạng nhị phân để ghi bổ sung dữ liệu vào cuối tệp, ta dùng lời gọi hàm sau:

    ofstream myfile;
    myfile.open ("people.dat",
       ios::out | ios::app | ios::binary);
    
    Trong trường hợp lời gọi hàm open không cung cấp tham số mode, chẳng hạn Hình 8.1, chế độ mặc định cho dòng loại ostream là ios::out, cho dòng loại istream là ios::in, và cho dòng loại fstream là ios::in | ios::out.

    Cách thứ hai để nối một dòng với một tệp là khai báo tên tệp và kiểu mở tệp  ngay khi khai báo dòng, hàm open sẽ được gọi với các đối số tương ứng. Ví dụ:

    ofstream myfile ("hello.txt",
       ios::out | ios::app | ios::binary);
    

    Để kiểm tra xem một tệp có được mở thành công hay không, ta dùng hàm thành viên is_open(), hàm này không yêu cầu đối số và trả về một giá trị kiểu bool bằng true nếu thành công và bằng false nếu xảy ra trường hợp ngược lại

    
    if (myfile.is_open()) { /* file now open and ready */ }
    
    • Đóng tệp

    Khi ta hoàn thành các công việc đọc dữ liệu và ghi kết quả, ta cần đóng tệp để

    tài nguyên của nó trở về trạng thái sẵn sàng được sử dụng. Hàm thành viên này

     

    không có tham số, công việc của nó là xả các vùng bộ nhớ có liên quan và đóng tệp:

     

    Sau khi tệp được đóng, ta lại có thể dùng dòng myfile để mở tệp khác, còn tệp vừa đóng lại có thể được mở bởi các tiến trình  khác.

    Hàm close cũng được gọi tự động khi một đối tượng dòng bị hủy trong khi    nó

    đang nối với một tệp.

     

    • Xlý tp văn bn

    Chế độ dòng tệp văn bản được thiết lập nếu ta không dùng cờ ios::binary khi mở tệp. Các thao tác xuất và nhập dữ liệu đối với tệp văn bản được thực hiện tương tự như cách ta làm với cout và cin.

    #include <iostream>
    #include <fstream>
     
    using namespace std; 
     
    int main ()
    {
      ofstream courseFile (“courses.txt); if (courseFile.is_open())
      {
        courseFile <<1 Introduction to Programming\n”; courseFile <<2 Mathematics for Computer Science\n”; courseFile.close();
      }
      else cout << “Error: Cannot open file”;
      return 0;
    }

    Kết quả chạy chương trình [tệp courses.txt]

    • Introduction to Programming

     

    • Mathematics for Computer Science
    Hình 8.2: Ghi dliu ra tp văn bn.
    #include <iostream>
    #include <fstream>
    #include <string>
     
    using namespace std; 
     
    int main ()
    {
      ifstream file (“courses.txt); 
      if (file.is_open())
      {
        while (! file.eof())
        {
          string  line; getline (file,line);
          cout << line << endl;
        }
        file.close();
      }
      else cout << “Error! Cannot open file”;
      return 0;
    }

    Kết quả chạy chương trình

    • Introduction to Programming
    • Mathematics for Computer Science

    c-p-2-yeulaptrinh.pw

    Hình 8.3: Đọc dliu ttp văn bn.

     

    Chương trình ví dụ trong Hình 8.2 ghi hai dòng văn bản vào một tệp. Chương trình trong Hình 8.3 đọc nội dung tệp đó và ghi ra màn hình. Để ý rằng trong chương trình thứ hai, ta dùng một vòng lặp để đọc cho đến cuối tệp. Trong đó, myfile.eof() là hàm trả về giá trị true khi chạm đến cuối tệp, giá trị true mà myfile.eof() trả về đã được dùng làm điều kiện kết thúc vòng lặp đọc tệp.

    Kiểm tra trạng thái của dòng

    Bên cạnh hàm eof() có nhiệm vụ kiểm tra cuối tệp, còn có các hàm thành viên khác dùng để kiểm tra trạng thái của dòng:

    bad()  trả về true nếu một thao tác đọc hoặc ghi bị thất bại. Ví dụ khi ta cố viết vào một tệp không được  mở  để ghi hoặc khi thiết bị lưu  trữ không còn chỗ trống để ghi.

    fail() trả về true trong những trường hợp bad() trả về true và khi có lỗi định dạng, chẳng hạn như khi ta đang định đọc một số nguyên nhưng lại gặp phải dữ liệu là các chữ cái.

    eof()   trả về true nếu chạm đến cuối tệp

    good()    trả về false nếu xảy tình huống mà  một trong các hàm trên nếu được gọi thì sẽ trả về true.

    Để đặt lại cờ trạng thái mà một hàm thành viên nào đó đã đánh dấu trước đó, ta dùng hàm thành viên clear.

    Nhập, xuất dữ liệu trong C++

    Trong bài này, chúng ta sẽ học cách nhập vào từ bàn phím (stdin standard input device) và ghi ra màn hình (stdout standard output device).

    Ta cũng cần dùng đến thư viện iostream namespace std để hỗ trợ nhập xuất. Khi muốn dùng lệnh nào nằm trong namespace std, ta có 2 cách:

    • Khai báo using namespace std ở đầu chương trình, sau đó có thể dùng các lệnh này bình thường.
    • Thêm std:: vào trước lệnh ta muốn dùng. Ví dụ như std::cin, std::endl.

    Từ đây trở đi, khi gặp std:: trước một lệnh, chúng ta sẽ tự hiểu lệnh sau đó nằm trong namespace std và có 2 cách như trên để viết.

    std::cin

    Để nhập dữ liệu cho biến, ta dùng lệnh cin

    cin >> biến;

    Nếu có nhiều biến cần nhập vào, ta có thể viết liên tiếp như sau

    cin >> biến 1 >> biến 2 >> … >> biến n;

    Khi chạy đến lệnh cin, chương trình sẽ chờ người dùng nhập dữ liệu vào các biến tương ứng. Dữ liệu nhập vào được phân cách nhau bởi dấu cách hoặc tab hoặc enter, và luôn được hiển thị ra màn hình.

    Ví dụ

    int a, b;
    cin >> a >> b;

    Lệnh cin ở dòng 2 sẽ yêu cầu người dùng nhập vào 2 giá trị tương ứng với 2 biến số nguyên a và b.

    Lưu ý

    Khi nhập vào, các giá trị được phân tách nhau bởi space (dấu cách), tab (dấu tab) hay enter (dấu xuống dòng). Nếu không, mặc dù trong một số trường hợp chương trình vẫn chạy nhưng rất khó kiểm soát được giá trị các biến nhập vào.
    Ví dụ: đoạn mã sau

    int a,b,c;  
    cin>>a>>b>>c;  
    
    hoặc
    int a,b,c;
    cin>>a; cin>>b; cin>>c;
    
    khi thực hiện, ta nhập dữ liệu từ bàn phím: 3 4 5<enter> hoặc nhập:
    3<enter>
    4<enter>
    5<enter>
    
    Sau khi nhập xong biến a=3, b=4 và c=5.

    std::cout

    Để in dữ liệu ra màn hình, ta dùng lệnh cout

    cout << biểu thức;

    Ta cũng có thể in hàng loạt nhiều biểu thức liên tiếp nhau

    cout << biểu thức 1 << biểu thức 2 << … << biểu thức n;

    Biểu thức ở đây có thể hiểu là biểu thức toán học chứa biến, hằng, hay kết quả trả về của một hàm, …

    Ví dụ

    int a, b;
    cin >> a >> b;
    cout << a << ” + ” << b << ” = ” << a + b;

    Lệnh cout ở dòng 3 in ra lần lượt: giá trị biến a, chuỗi ” + “, giá trị biến b, chuỗi ” = ” và giá trị biểu thức a + b.

    Một số ký tự điều khiển

    • \a’ : tiếng chuông
    • \b’ : lùi lại một bước
    • \n’ : xuống dòng
    • \t’ : dấu tab
    • \\’ : dấu \
    • \?’ : dấu ?
    • \”‘ : dấu “

    Lưu ý

    std::endl cũng có chức năng tương tự ‘\n’ nhưng ngoài ra endl còn làm rỗng bộ đệm đầu ra.

    Ví dụ

    cout << ‘\t’ << “Hello World !\n” << 0;

    Kết quả:

    Hello World!
    0

    Lưu ý

    cin dùng toán tử >> còn cout dùng toán tử <<. Đừng nhầm lẫn!

    cout, cin nằm trong thư viện iostream

    Định dạng in

    Để dùng những lệnh định sau, ngoài thư viện iostream, ta còn phải dùng thư viện iomanip để định dạng. Các định dạng này cần được cout mới có tác dụng.

    std::setw(n): quy định khoảng không gian cho dữ liệu được in ra màn hình là n. Nếu dữ liệu chiếm ít không gian hơn, dữ liệu sẽ được căn  lề phải khi in ra. Ngược lại , lệnh này không có ảnh hưởng, tức dữ liệu vẫn in ra như bình thường.

    std::setprecision(n): quy định số chữ số được làm tròn khi in ra là n. Số chữ số được tính từ trái qua phải.

    std::fixed: lệnh này đi kèm với setprecision sẽ xác định chỉ làm tròn các chữ số ở phần thập phân.

    Ví dụ

    cout << 12.345 << ‘ ‘;
    cout << setprecision(2) << 12.345 << ‘ ‘;
    cout << fixed << setprecision(2) << 12.345;

    Kết quả:

    12.345 12 12.35

    Một số hàm khác liên quan đến nhập xuất

    std::cin.get(c): nhập 1 ký tự vào biến c.

    std::cin.getline(s, n): nhập tối đa n – 1 ký tự vào xâu s (ký tự thứ n là NULL).
    std::getline (cin,str): đọc xâu kí tự str, str kiểu dữ liệu string.
    std::cin.ignore(n): xóa n ký tự trong bộ đệm đầu vào.

    fflush(stdin): xóa toàn bộ bộ đệm đầu vào.

    Có thể bạn thích:
    Nhập, xuất dữ liệu từ file trong C++

    Bài tập mẫu

    Viết chương trình nhập vào 3 số a, b, c. In ra trung bình cộng của 3 số đó với giá trị làm tròn đến chữ số thập phân thứ 5.

    Code:

    #include <iostream>
    #include <iomanip>
     
    using namespace std;
     
    int main()
    {
         cout << "Nhap 3 so a, b, c: ";
         float a, b, c;
         cin >> a >> b >> c;
         float avr = (a + b + c) / 3;
         cout << fixed << setprecision(5) << avr << endl;
         system("pause"); // Tạm dừng màn hình chờ nhấn Enter
         return 0;
    }