Thứ Hai, 26 tháng 6, 2017

[C++] Bài 2: Vào ra cơ bản trong C++

1. Hàm ra cout

Trong C++, để hiện thị một nội dung trên DOS, ta cử dụng câu lệnh:
cout<<"Nội dung cần in ra";
Nội dung trong dấu nháy kép là một chuỗi ký tự mà người dùng muốn in ra trên giao diện DOS.
Ví dụ:
cout<<"Hello World!!";
Để sử dụng câu lệnh cout  ta cần khai báo các thư viện chuẩn sau:
#include<iostream>  //thư viện vào ra chuẩn
using namespace std;//không gian tên chuẩn (nếu không sử dụng câu lệnh này, ta cần viết std::cout)
Trong hàm ra chuẩn của C++ ta có các điều cần lưu ý như:
"\t" tương đương với việc sử dụng phím "tab" trong word.
"\n" tương đương với việc xuống dòng (enter) trong word, nhìn chung ta có thể coi "\n""endl" là như nhau. Cả hai đều hiển thị xuống dòng trong khi thực hiện lệnh, điểm khác nhau đó là cout<<endl thì tương đương với câu lệnh cout<<"\n"<<flush; Trong khuôn khổ bài học thứ 2 căn bản về C++, tác giả chỉ giải thích đơn giản như sau: "\n" chịu trách nhiệm xuống dòng còn "endl" sẽ xoá các thứ không cần thiết để xuống dòng in ra. Nói cách khác, ta có thể sử dụng "\n" trong các dòng và sử dụng "endl" ở cuối đoạn. Về sự khác nhau như thế nào và cụ thể ra sao, tác giả sẽ dành cho các bài viết sau nếu có liên quan.
Việc in một giá trị cụ thể (Không phải là xâu kí tự alphabet) ta có thể in trực tiếp giá trị đó ra màn hình mà không cần đặt trong dấu nháy.
Ví dụ:
cout<<2017;
Khi không sử dụng dấu nháy kép để in ra, C++ ngầm hiểu đó là biến có mang giá trị và sẽ in giá trị của biến có tên đó ra màn hình.
Ví dụ:
cout<<"Hello"; //kết quả in ra màn hình sẽ là Hello
cout<<Hello: //Kết quả in ra màn hình sẽ là giá trị được lưu trong biến có tên Hello.
Chương trình mẫu:
#include <iostream>

int main()
{
        int Hello = 2017;//Khai báo biến Hello (sẽ nói ở bài hằng và biến)
        std::cout<<"Hello\n";//in ra màn hình chữ Hello
        std::cout<<Hello<<"\n";//in ra màn hình giá trị của biến Hello (2017)
        std::cout<<2018<<std::endl;//in ra màn hình số 2018
        return 0;
 }

Kết quả thu được trên Console như sau:



2. Hàm vào cin

Để nhập vào một giá trị, một ký tự hoặc một chuỗi ký tự nào đó ta có thể sử dụng hàm vào chuẩn trong C++ đó là cin. Cũng như cout, cin được khai báo bởi câu lệnh #include<iostream> và using namespace std;
cin nhập giá trị thông qua một biến được khai báo trước đó.
Ví dụ:
int tuoi;
cin>>tuoi;

cin cũng có thể nhập được nhiều giá trị cùng một lúc tương tự như cout xuất nhiều giá trị cùng lúc.
Ví dụ:
int tuoi,ngay,thang;
cin>>tuoi>>ngay>>thang;

Việc nhập giữa các biến có thể kết thúc bằng phím SPACE hoặc ENTER. Và ENTER là kết thúc nhập.
Với việc nhập xâu ký tự, ta có thể gặp một vài vấn đề chính như sau:
Ví dụ:
string ten;
cout<<"ho va ten"<<endl;
cin>>ten;
cout<<"Xin chao "<<ten;

Với việc sử dụng code như trên hình, tác giả đã nhập vào tên của mình được phân cách với nhau bởi dấu cách. Tuy nhiên kết quả nhận được là:


Ta có thể thấy ở đây kết quả in ra màn hình chỉ là "Tran", hoàn toàn không giống như những gì mà ta mong đợi. Điều này là do cin bị phân cách bởi các khoảng trắng nên nó chỉ lấy được các ký tự gần nhất trước khoảng trắng.
Để giải quyết vấn đề này, trong C++ ta có thể sử dụng hàm getline như sau:
getline(cin,ten);
Nhờ có hàm getline này mà sau khi bị phân cách bởi khoảng trắng, ta vẫn có thể lấy được toàn bộ dữ liệu từ cin ra màn hình:



Tuy nhiên bên cạnh đó thì getline vẫn tỏ ra khá "NGU", thật ra là nó nhiệt tình quá nên nó sẽ làm những việc không cần thiết.
Ví dụ:
int tuoi;
string ten;
cout<<"ban bao nhieu tuoi"<<endl;
cin>>tuoi;
cout<<"ho va ten"<<endl;
cin>>ten;
cout<<"Xin chao "<<ten;

 Và kết quả là:
 


Ta  có thể thấy kết quả lại không như mong muốn. Để giải thích điều này ta lại "đổ tội" cho thằng getline thôi :)))
Khi ta nhập tuổi vào và kết thúc bằng phím ENTER thì mặc định trong bộ đệm của cin nó đã mang ký tự ENTER rồi. Do đó, nhờ sự nhiệt tình không cần thiết của thanh niên getline mà ở cin tiếp theo ta nhận ngay ký tự ENTER vào và quá trình nhập kết thúc ở đây.
Để giải quyết vấn đề này, ta lại cần một hàm nữa đó là fflush(stdin); Hàm này có chức năng xoá đi bộ đệm đã có của cin và đưa cho ta một bộ đệm trống trước khi thực hiện câu lệnh getline(cin,ten);.



Về các vấn đề khác của xâu, tác giả sẽ đề cập thêm ở các phần sau. Trong khuôn khổ bài này, tác giả chỉ muốn đưa ra những điều căn bản nhất về cin và cout, các lỗi hay gặp với cin mà thôi.

0 nhận xét:

Đăng nhận xét