Xem kết quả thăm dò: Các clip hướng dẫn có hữu ích không?

  • Hữu ích, dễ hiểu.

    26 92.86%
  • Nội dung đơn giản, nhàm chán.

    2 7.14%
  • Clips hướng dẫn có nhiều lỗi sai, cần sửa gấp.

    0 0%
  • Ý kiến khác, vui lòng cho ý kiến khác bên dưới.

    0 0%
Bạn không thể bỏ phiếu ở thăm dò này
Số người bỏ phiếu 28.
Trang 2 trên tổng số 2 Đầu tiênĐầu tiên 12
Từ 11 tới 13 trên tổng số 13 kết quả

Đề tài: Hướng dẫn học C++ qua clip (Tiếng Việt)

  1. #11
    Ngày gia nhập
    10 2013
    Bài viết
    7

    Mặc định Hướng dẫn học C++ qua clip (Tiếng Việt)

    Trích dẫn Nguyên bản được gửi bởi INTP Xem bài viết
    dài nhưng mà chắc ăn. Ví dụ như chương trình nhập vào số n và xuất ra số n đó:
    C++ Code:
    1. #include <iostream>
    2. int main()
    3. {
    4.   int n;
    5.   std::cout << "Nhap so n: ";
    6.   std::cin >> n;
    7.   std::cout << "n = " << n << "\n";
    8.   std::cin.get();
    9. }

    nếu người dùng nhập vào "123456" rồi enter thì std::cin.get() 2 lần sẽ làm dừng chương trình được. Vì sao 2 lần?
    nếu người dùng nhập vào "123 456" (1 dấu cách ở giữa) rồi enter thì std::cin.get() 2 lần sẽ không làm dừng chương trình được. Phải gọi thêm std::cin.get() 6 lần mới được. Vì sao 6 lần?
    nếu người dùng nhập vào "a" thì có cin.get() 19999 lần cũng ko dừng được. Vì sao?


    --- behavior của từng hàm operator>> thì đầu tiên sẽ đọc và bỏ qua kí tự khoảng trắng cho hết, rồi đọc kí tự hợp lệ cho vào biến cho tới khi nào gặp kí tự không hợp lệ và không trích bỏ kí tự này, tức là vẫn để lại kí tự này trong bộ đệm. Nếu đọc phải kí tự không hợp lệ thì cin sẽ bị set flag là fail.
    - Với trường hợp enter "123456" thì thật ra trong bộ đệm chứa 7 ký tự thay vì 6. Ký tự cuối cùng là kí tự newline ('\n'). cin >> n sẽ đọc hết 6 kí tự số hợp lệ vào n, và chừa lại kí tự '\n' trong bộ đệm. Khi gọi cin.get() lần thứ nhất kí tự '\n' này sẽ bị bóc ra khỏi bộ đệm, nên chương trình không đòi hỏi người dùng nhập vào thứ gì. Phải gọi cin.get() lần 2 thì bộ đệm lúc này ko còn kí tự nào nên chương trình sẽ đòi người dùng nhập vào kí tự nào đó.
    - Với trường hợp enter "123 456" thì tương tự bộ đệm chứa 8 kí tự kể cả '\n'. cin>>n chỉ trích 3 kí tự 123 vào và dừng ở khoảng trắng đầu tiên là kí tự thứ 4. Như vậy bộ đệm còn chứa 5 kí tự, và phải cin.get() 6 lần mới "dừng" chương trình lại được.
    - trường hợp "a" thì cin nhập vào n ko được vì gặp kí tự không hợp lệ a, cin sẽ bị flag fail. Phải cin.clear(); rồi cin.get() 3 lần (1 cho 'a', 1 cho '\n' và 1 để dừng) mới "dừng" được.

    1 code khác:
    C++ Code:
    1. #include <iostream>
    2. int main()
    3. {
    4.   char s[20];
    5.   std::cout << "Nhap chuoi s: ";
    6.   std::cin.getline(s,20);
    7.   std::cout << "s = " << s << "\n";
    8.   std::cin.get();
    9. }

    nếu người dùng nhập vào "123456789 123456789" rồi enter thì std::cin.get() 1 lần sẽ làm dừng chương trình được. Vì sao 1 lần?
    nếu người dùng nhập vào "123456789 123456789 " rồi enter thì std::cin.get() 1000 lần cũng không làm dừng chương trình được. Vì sao?


    --- behavior của từng hàm istream::getline(char* s, int n) thì ẽ đọc và kí tự trong bộ đệm và cho vào mảng kí tự s cho tới khi gặp kí tự newline '\n', hoặc đã đọc được n kí tự vào s. Nếu gặp '\n' trước, kí tự '\n' sẽ được trích khỏi bộ đệm, và kí tự null '\0' sẽ được thêm vào s. Nếu đã đọc n-1 kí tự vào s và kí tự thứ n khác '\n', thì kí tự thứ n được viết vào s sẽ là '\0', còn kí tự thứ n trong bộ đệm đó vẫn nằm lại bộ đệm, ko được trích ra. Ngoài ra cin còn bị set flag thành fail. Không
    - trường hợp "123456789 123456789": đọc được 19 kí tự vào s. Kí tự thứ 20 là '\n', như vậy '\n' sẽ bị trích ra khỏi bộ đệm. Sau đó chỉ cần 1 lần gọi cin.get() là dừng được chương trình.
    - trường hợp "123456789 123456789 ": đọc được 19 kí tự vào s. Kí tự thứ 20 là' ', như vậy ' ' sẽ ko bị trích khỏi bộ đệm, và bộ đệm còn 2 kí tự là ' ' và '\n'. Cần 3 lần gọi cin.get() mới dừng được chương trình.


    Cách tốt nhất để bảo đảm bộ đệm luôn luôn trống trước khi gọi cin.get() để dừng chương trình là bỏ qua tất cả các kí tự cho tới khi gặp '\n' và bỏ qua cả nó xài cin.ignore(); để thực hiện điều này. Nhưng trước khi ignore thì phải đảm bảo cin ko bị fail => clear trước. Cái này ta cũng thiếu :">
    numeric_limits<streamsize>::max() là lấy max kí tự mà bộ đệm có thể chứa được. ignore(100,'\n') cũng được nhưng nếu bộ đệm còn dư 101 kí tự thì cin.get() cũng bị bỏ qua. 1000 thì lỡ 1001, v.v.. nên numeric_limits<streamsize>::max() là chắc ăn nhất.


    Vậy thì chính xác phải là:
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsiz e>::max(), '\n');
    std::cout << "Press ENTER to continue . . . ";
    std::cin.get();
    nếu dùng fflush(stdin) thì có đc ko a nhỉ? và nó khác cách của a ntn?

  2. #12
    Ngày gia nhập
    07 2011
    Bài viết
    465

    cũng được, nhưng ko bảo đảm đúng với mọi trình dịch

    The behavior is undefined if the given stream is of the input type or if the given stream is of the update type, but the last I/O operation was not an output operation.


    VC++ thì có lẽ đúng:

    The fflush function flushes a stream. If the file associated with stream is open for output, fflush writes to that file the contents of the buffer associated with the stream. If the stream is open for input, fflush clears the contents of the buffer.


    viết cho gọn thì ok fflush(stdin), nhưng khi chuyển sang trình dịch khác input vào mà nó đọc ko đúng thì phải biết lỗi ở đâu, vd 1 trình dịch ko flush ký tự thừa trong buffer thì phải biết cách xử lý (C++ xài ignore, C thì có lẽ cần 2 dòng:
    C Code:
    1. char ignore = '\0';
    2. while (c != '\n' && c != EOF) c = getc(stdin);




    - 2 cái ko khác là bao nhiêu, chỉ là 1 cái gọn hơn nhưng phải phụ thuộc trình dịch @_@

  3. #13
    Ngày gia nhập
    01 2013
    Bài viết
    1,479

    Nói chung là nên tránh xa lệnh nào phụ thuộc vào undefined behavior như:
    - a[i++] = i, hay x=x+(x++)
    - deref, delete/delete[] bad pointer; deref NULL
    - y = f(f1(x), f2(x)): Hàm f1 hay f2 sẽ đc gọi trước? (Nếu f1 và f2 cùng sử dụng resource)

    Còn implementation-defined thì có ví dụ là sizeof(char), sizeof(short), sizeof(int), sizeof(long), sizeof(long long).
    Đã được chỉnh sửa lần cuối bởi prog10 : 22-03-2016 lúc 10:58 AM.

Các đề tài tương tự

  1. Clip hài - Không dành cho người yếu tim
    Gửi bởi mico123 trong diễn đàn Giải trí - Thư giãn
    Trả lời: 1
    Bài viết cuối: 17-09-2013, 01:48 PM
  2. Lồng tiếng clip phóng sự video giới thiệu quảng cáo giá rẻ
    Gửi bởi quocquang356 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 22-12-2012, 11:08 PM
  3. Hoàng Yến, Ngọc Trinh lên tiếng về clip!
    Gửi bởi vietlongs2012 trong diễn đàn Giải trí - Thư giãn
    Trả lời: 0
    Bài viết cuối: 17-02-2012, 08:57 PM
  4. Clip hài hay và hài hước
    Gửi bởi oanhnn trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 24-02-2011, 10:07 AM

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn