3
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)
– Lập trình C được giảng dạy ở Việt Nam một cách rất “hỗn tạp” – Vì chỉ được coi là một môn học “nhập môn” nên giảng dạy khá “cẩu thả” – C không xứng đáng là để dạy nhập môn, hãy dạy nó chuyên sâu: Vì sao lại khiến một người chưa biết nhiều về lập trình phải đau đầu về con trỏ, cấp phát động, … để rồi họ không có thời gian tập trung vào tư duy lập trình ngay từ lúc đầu? Hãy dạy python, java, javascript, … cho người mới học lập trình thay vì C. 2. Hỗn tạpChúng ta được học một thứ ngôn ngữ C pha thêm C++, chỉ đến khi bạn phải làm việc với ngôn ngữ C thực sự (ví dụ sau này đi làm) bạn mới nhận ra điều đó. a. Lưu tên file thành .cpp sẽ khiến IDE gọi trình dịch của C++ – Ngôn ngữ C không có truyền bằng tham chiếu, nó chỉ có truyền tham trị và truyền con trỏ. – struct của C khác với C++. Ở C++ struct chính là class, struct của C hoàn toàn khác, nó chỉ trùng tên để tương thích với C. Ngôn ngữ C không có class. Mình từng thấy có bạn cho luôn cả function vào struct và bảo đó là code C, chạy vèo vèo. … và có vài thứ khác nữa, bạn sẽ cứ nghiễm nhiên dùng như không có chuyện gì xảy ra và quen với nó – tất nhiên sẽ may mắn cho bạn nếu không bao giờ gặp lại C sau này. Tốt nhất là bạn nên biết mình đang code cái gì, hơn là viết code thụ động. b. Tài liệu lập trình C tiếng việt: – Quá cũ, không được ai kiểm chứng nhưng được share tràn lan – Nhiều code ví dụ chỉ chạy được trên trình dịch cũ – Được viết ra bởi “kinh nghiệm” của chính người viết, không theo tiêu chuẩn của ngôn ngữ C – Khái niệm Standard không hề được nhắc đến. c. Bài tập : Bị phức tạp hóa để cố tình khiến người học phải suy nghĩ, nhưng kết quả đạt được của sự phức tạp hóa đó thì chẳng có gì cả. Lập trình C có nhiều trò khá dị, nhưng quan trọng học nó để làm gì và có ích gì cho tư duy lập trình, hay chỉ đơn giản là nó “hay và lạ”. 3. StandardTầm quan trọng của “tiêu chuẩn”: – Được trình bày rõ ràng, có thể tra cứu. – Sử dụng tốt hơn vì bạn sẽ biết được nó sẽ hoạt động như thế nào, khác với nghe người ta truyền miệng về các chức năng, các hàm nhưng vẫn khó áp dụng vì trình dịch của bạn không hỗ trợ, thay vì đó bạn sẽ luôn biết chắc chắn hành vi của một lệnh Standard. Vậy nên, hãy học theo “tiêu chuẩn”, và biết được cái nào chuẩn, cái nào không theo chuẩn để tránh bị đau đầu về những thứ không cần thiết phải đau đầu khi lập trình C và cũng như với các ngôn ngữ khác. Standard là thứ phải nghiên cứu đầu tiên và phải thường tra cứu để sử dụng. Tương tự với Java, nếu không quen với việc học theo Standard, bạn sẽ chẳng biết mình đang học Java gì và sử dụng các công cụ, thư viện Java thì nó là Java gì. (Ví dụ bạn dùng Java 8 cho Android trước API N). Mọi ngôn ngữ đều có Standard. 4. fflush(stdin) không được định nghĩa trong thư viện C Standardhttp://en.cppreference.com/w/c/io/fflush (Trang web này được các người lập trình cùng nhau xây dựng để tra cứu, dựa trên các tài liệu chính thống của ngôn ngữ C/C++ – Community Wiki) Đối với dòng nhập, hành vi của fflush là không cố định, và nó sẽ hoàn toàn phụ thuộc vào trình biên dịch. Mình sẽ không thuyết phục người đọc rằng fflush(stdin) là sai như thế nào và tại sao không nên dùng nó. fflush(stdin) chỉ là một ví dụ điển hình trong hàng loạt những vấn đề chưa hay đối với người học lập trình C, một bài viết không thể chỉ ra hết được. Ở trong bài viết này mình nói lên quan điểm về Standard, về ngôn ngữ C (bởi nó hay được dạy nhập môn) và thói quen tra cứu Standard liên quan đến việc học lập trình như thế nào, mà không chỉ nói riêng về lập trình C. Cuối cùng, lựa chọn dùng fflush(stdin) hay không thì cũng không thể cưỡng ép được, tùy vào những gì bạn đang thấy. Ít nhất, mong rằng bạn sẽ thử tìm hiểu Standard là gì. Bài viết tham khảo: cprogramming.com: Why fflush(stdin) is wrong? fflush(stdin) Replacement Commentscomments #include using namespace std;int main(int argc, char **argv){int soA, soB, tong;binladen:cout > soA >> soB;tong = soA + soB;cout > c;if (c == "t"|| c=="T"){goto binladen;}return 0;} Trong bài em đâu có fflush(stdin) đâu? Cái fflush(stdin) đúng là để xóa bộ đệm. Khi em nhập vào thì bao nhiêu ký tự cũng chui vào bộ đệm cho tới khi bộ đệm tràn. Bạn đang xem: Việc sử dụng fflush (stdin) trong lập trình c là gì Giả dụ em muốn nhập a b c vào. Nhưng em chỉ muốn lấy a và b #include #include int main(){ int a,b=0,c; std::cin >> a; fflush(stdin); std::cin >> c; std::cout Bây giờ anh nhập vào như sau 1 23thì kết quả anh nhận được là 103Lý do là fflush(stdin) đã bỏ đi số 2. Vậy dùng fflush(stdin) làm gì? Trong một số trường hợp, nhất là khi nhập chuỗi, thì stdin (tức là standard input nhận vào từ bàn phím) nhận thừa một số ký tự. Ví dụ dấu enter xuống hàng. Ký tự enter nếu không được xử lý bằng fflush(stdin) thì sẽ ngay lập tực bị nhập vào chuỗi tiếp theo. Dẫn đến kết quả cho chuỗi tiếp theo bị lỗi. Thường là chuỗi thứ 2 sẽ chỉ chứa một dấu enter. Em có thể bỏ fflush(stdin) ở ví dụ trên, và nhập lại tương tự như ví dụ trên sẽ thấy kết quả ngay. 10 Likes Bài tập về nhập xuất chuỗi. mọi người sửa lỗi sai giúp m Honey_moon (Thực tế khắc nghiệt) November 24, 2014, 2:28pm #3ý anh là ví dụ e nhập : 1 2 enterthì đặt fflush(stdin) ở dưới cin sẽ loại bỏ ký tự cuối đúng k a? 1 Like minhdiem (Onethingisforever!) November 24, 2014, 2:32pm #4hehee đúng cái em đang cần đây 1 Like Honey_moon (Thực tế khắc nghiệt) November 24, 2014, 2:36pm #5#include using namespace std;int main(int argc, char **argv){int n;nhaplain:cout > n;while (ncái này nhập lại cũng đc 1 Like ltd (Lê Trần Đạt) November 24, 2014, 3:29pm #6Không phải em, stdin có vào thì cũng có ra. Vào là lúc mình nhập số vào, ra là lúc mình cin. Xem thêm: Lí Giải Tại Sao Samsung S7 Edge Hao Pin S7 Edge Tụt Nhanh, Lí Giải Tại Sao Samsung S7 Edge Hao Pin Nhanh giả dụ như mình nhập vào 1 2 nhưng mình chỉ cin một lần. thì khi đó stdin vẫn còn một số, là số 2. Có lẽ anh sẽ kéo hết tất cả những bài này sang topic khác để thảo luận cho dễ. 2 Likes Honey_moon (Thực tế khắc nghiệt) November 24, 2014, 3:30pm #7ok e hiểu r! tại e chưa code trên máy! bt k xài ! tks a! ltd (Lê Trần Đạt) November 25, 2014, 9:24am #8Thêm một ví dụ nữa nhé. Bài này mục tiêu là nhập chữ g thì yêu cầu nhập lại. Code thì như thế này, nhưng khi nhập g tới lần thứ 2 thì không được nữa. Tại sao? #include int main(){ char x;nhaplai: printf("\n\n\t\t *A*"); printf("\n\n\t\t *B*"); printf("nhap gia tri "); scanf("%c", &x); if(x =="g") { goto nhaplai; } getchar();} Honey_moon (Thực tế khắc nghiệt) November 25, 2014, 3:07pm #9 ltd:printf("\n\n\t\t A");printf("\n\n\t\t B"); a đạt chơi trò j đây>? cái này là bắt nạt nhỏ à nha 1 Like ltd (Lê Trần Đạt) November 25, 2014, 3:08pm #10Haha, cái này là anh copy từ facebook, người ta viết sao anh viết thế thôi ^^ Honey_moon (Thực tế khắc nghiệt) November 25, 2014, 3:10pm #11a đạt giải thích e 2 dòng print đó coi! ngao ngán quá! chứ code bỏ 2 dòng đó đi thì bt e vẫn làm ltd (Lê Trần Đạt) November 25, 2014, 3:13pm #12\n là xuống hàng\t là tabcó nghĩa là xuống hàng xuống hàng tab tab đấy ý e là A vs B chứ này e bik r ! đố ác nhé! chẳng lẽ bắt e lên google ông anh chơi kỳ! lớn rồi còn ham khoe khoang 1 Like ltd (Lê Trần Đạt) November 25, 2014, 3:16pm #14À, A với B thì là chữ bình thường thôi. Chắc người làm bài đó họ viết ví dụ thôi. hehehe Honey_moon (Thực tế khắc nghiệt) November 25, 2014, 3:52pm #15e trả lời theo suy đoán của e! a khai báo kiểu char! sau đó a tới địa chỉ với & vì thế nó đã xác định địa chỉ trên thanh ram rồi cho nên ko thể nhập lại 1 biến nữa vs cùng địa chỉ cấp phát 1 Like ltd (Lê Trần Đạt) November 25, 2014, 3:54pm #16Nó có liên quan đến fflush đó Cách giải quyết là thêm fflush(stdin) vào sau scanf #include int main(){ char x;nhaplai: printf("\n\n\t\t *A*"); printf("\n\n\t\t *B*"); printf("nhap gia tri "); scanf("%c", &x); fflush(stdin); if(x =="g") { goto nhaplai; } getchar();}Tuy nhiên dây cũng không phải là cách tốt nhất. Cách tốt nhất là dùng getchar() để nhập 1 ký tự. #include int main(){ char x;nhaplai: printf("\n\n\t\t *A*"); printf("\n\n\t\t *B*"); printf("nhap gia tri "); x = getchar(); if(x =="g") { goto nhaplai; } getchar();}Như thế này mình không cần fflush(stdin) Code không cho nhập chuỗi Honey_moon (Thực tế khắc nghiệt) November 25, 2014, 3:58pm #17ý anh là dùng do while rồi getchar thôi! đk là !=g ; có clip a hướng dẫn nhập trong mảng ký tự rồi ! thế e cứ tưởng cao siêu lắm! làm nghĩ mún nát óc! hại não về đêm. 1 Like Xuan_Tung_Nguyen (Xuân Tùng Nguyễn) May 15, 2016, 2:09pm #18Nếu đặt getchar() ở cuối thì chưa kịp thi hành đã bị goto nhập lại rồi. getchar() phải đặt ngay dưới x=getchar() phamphuc6122002 (Phúc) July 22, 2016, 2:45pm #19Anh Đạt cho em hỏi /t dùng làm gì ạ?Hi vọng em lấy mấy topic cũ ra không làm phiền mọi người ạ! tankhoa0000 (Nguyễn Tấn Khoa) July 22, 2016, 2:53pm #20\t là ký tự tab ngang. Nó sẽ cách ra giống như là 1 khoảng trắng bự vậy đó. 1 Like next page → Home Categories FAQ/Guidelines Terms of Service Privacy PolicyPowered by Discourse, best viewed with JavaScript enabled |