tình hình là môn này chẳng học hành gì ... hnay thi mà chưa biết gì nữa đề thầy ra dạng như là mô phỏng 1 trang web giống như vnexpress hay dantri , có thể copy mã nguồn bên trang kia rồi sửa thẻ gì gì đó để chạy được trên frontpage là được , thầy bảo dễ lắm mà mình ko biết làm ntn ... copy nguyên xi paste sang thì nó toàn báo lỗi ko hiển thị được hết ... chắc phải sửa thẻ gì đó mà mình ko biết là sửa chỗ nào ... có bác nào biết chỉ dùm mình với cảm ơn nhìu
giờ mình đang làm đồ án win form c# đang làm trên vs 2010 chung với bạn mình giờ mình cài lai win, xài vs 2012 có thể nào dùng cho project đó chung với bạn minh mà nó vs2010 vẫn chạy được không :) (cái project toàn code căn bản =.=) không liên quan vs2012
ta gu gồ thấy có cách: 1. mở file .sln bằng Notepad 2. sửa Format Version 12.00 thành Format Version 11.00 3. sửa # Visual Studio 2012 thành # Visual Studio 2010
hy vọng thành công, có cách là được, giờ xóa win cài lại, thế nào test rùi mình thông báo sau
mấy bạn ơi cho hỏi, tui cài Ilustrator CS6, crack xài vẫn bình thường nhưng được 1-2 ngày lại bị lỗi Error 16, nó kêu xóa và cài lại là làm sao??? cài lại 2-3 lần rồi mà nó vẫn bị :(, cần giúp đỡ gấp :(
cách đơn giản nhất dể check độ dài chuỗi là chỉ có vậy. còn double, int thì chỉ cần Mã: double f; while (true) { in >> f; if (in.fail()) //cin.fail() nghĩa là f nhập bị lỗi { in.clear(); //clear error flag while (!isspace(in.get())) { } //ăn hết ký tự ko phải ký tự trắng } else break; } return f; vậy cũng tạm được. Hoặc đọc hết vào chuỗi rồi chuyển thành double/int bằng atoi, atof Cách này thì ko check xem lỗi hay ko được. Còn tùy lỗi kiểu gì nữa a9.0 đương nhiên là lỗi 9.0a có phải là lỗi ko? với nhập int a9 đương nhiên là lỗi 9a có phải là lỗi ko?
Cũng chưa học luôn, C++ mới học có 5 tiết, đến phần dynamic memory với các biến private, public trong struct mà bả cho 1 bài chả liên quan T_T 9a cũng là lỗi, bài nó yêu cầu nhập toàn số, dính chữ vào là phải ra lỗi hết Đây, mời a thưởng lãm cái đề luôn View attachment 174732
thì chắc bả cho làm quen với input output Xử lý mấy cái này nếu hiểu thì dễ lắm. lúc nhập dữ liệu vào từ bàn phím / file / string v.v... thì dữ liệu được tải vào 1 buffer tạm thời. Với dữ liệu đọc từ bàn phím thì mỗi lần bấm enter dữ liệu sẽ được flush (như đi ị ị xong nhấn nút quặng cầu thì nó quặng đi hết =) ) vào buffer này. vd: nhập " a1 2ab 3" (8 ký tự) rồi enter thì buffer sẽ được đẩy vào 9 ký tự (8 ký tự + ký tự newline) " a1 2b 3\n", và con trỏ đọc của buffer trỏ vào ký tự đầu tiên ' ' bây giờ gọi std::cin >> n; sẽ peek() (đọc ký tự đó nhưng ko trích ra khỏi buffer) 1 ký tự trong buffer: - nếu ký tự đó là khoảng trắng: nếu chưa đọc được gì vào n thì gọi hàm get() để trích bỏ ký tự khoảng trắng đó đi, còn đọc số vào n rồi thì dừng - nếu ký tự đó là chữ số, gọi hàm get() để trích và chép vào n. - nếu ký tự đó là dấu trừ thì tùy vào dữ liệu của n có cho phép có dấu hay ko sẽ nhớ là bỏ dấu âm (nếu chưa đọc vào số nào) hoặc dừng và set error flag là failbit (nếu đã đọc vào số rồi mà gặp dấu '-' ngang xương). - còn lại thì nếu chưa đọc số nào vào n thì dừng và set error flag là failbit, còn đọc rồi thì chỉ dừng thôi ko báo lỗi. sơ sơ là vậy... " a1 2b 3\n" trong buffer sẽ được trích ra ' ' và dừng ở 'a', set failbit lên cin. Khi này muốn xài cin thì phải clear() flag lỗi của nó và ignore hết ký tự trừ khoảng trắng ra. Gọi while (!isspace(in.get())) { } sẽ làm: trích 'a', trích '1', trích ' ', dừng vì đã tìm được ký tự trắng. Tới dây thì con trỏ đọc của buffer trỏ vào '2'. Gọi cin >> n; lần nữa sẽ trích '2' vào n, rồi dừng tại 'b'. n có giá trị là 2 và cin state là good. Có xem đây là trường hợp lỗi ko thì tùy @.@ Ta xem là lỗi. Dùng peek() để nhòm vào ký tự hiện tại của cin, thấy nó là 'b' khác ký tự trắng nên ta sẽ xem là lỗi, đọc bỏ hết ký tự ko phải ký tự trắng: trích 'b', trích ' ', dừng vì đã tìm đc khoảng trắng (nhưng khoảng trắng này vẫn bị trích ra). Con trỏ đọc của buffer trỏ vào '3'. Gọi cin >> n; lần nữa sẽ trích '3' vào n, rồi dừng tại '\n'. n có giá trị là 3 và cin state là good. peek thấy ký tự con trỏ buffer đang trỏ vào là '\n' cũng là ký tự trắng ==> hợp lệ. Trả về giá trị của n. operator>> của std::istream được overload chỉ xài std::istreapeek(), std::istream::get() với hàm num_get::get (nếu là đọc số, hàm này phụ thuộc vào locale, nếu thích có thể chuyển locale để đọc 9,2 thay vì 9.2 cũng được) gì đó nữa. Chi tiết tại http://www.cplusplus.com/reference/istream/istream/operator>>/
Ko phải e ko hiểu code của a, chỉ là muốn sử dụng mấy lệnh cũ, tại bả đã dạy đâu =.= Thôi kệ để mai tính, vocaloid đã P/s: đọc code chay thì hiểu lờ mờ, giải thích xong lại mù như cũ
thích đơn giản hơn nữa thì cứ đọc tạm từng từ vào string rồi check trong string mà làm vậy khổ lắm. Hoặc sử dụng atoi atof lên string đó, nhưng ko check được hợp lệ hay ko. Hồi trước thì mấy bô lão bên cplusplus.com đọc string rồi load string đó vào istringstream rồi extract ra lại, làm vậy thà làm thẳng trên istream luôn, chỉ cần trick đơn giản là đọc tới khi nào gặp ký tự trắng thì dừng. Sửa lại là while (!isspace(in.peek())) { in.get(); } vậy thì đúng hơn. tại ta giải thích cách hoạt động của operator>> nên hơi phức tạp hơn 1 chút. opeartor>> nó check tùm lum hết đó nên khá chậm, nếu input bảo đảm toàn số thì viết fast i/o gì lại có thể nhanh hơn vài chục hay vài trăm lần. Cái này ta cũng mới biết gần đây mà ko ngờ nó chậm dữ vậy
e mới học cái dynaic memory có tý thắc mắc: Ví du mình cần khai 2 biến vào dynamic, đơn giản nhất là dùng 2 con trỏ khác nhau. Nhưng nếu cần khai 1 cơ số biến vào, vd như: Student* p = NULL; p = new Student [10]; Thế là con trỏ p trỏ vào 10 thằng Student khác nhau. vậy làm sao để can thiệp vào dữ liệu của từng thằng Student ?
dùng operator[] như mảng thôi @.@ Vd Student có cách dữ liệu là char name[20], double scores[3], và hàm double average() thì truy cập vào các dữ liệu/ hàm đó như sau: p[0].name //truy cập name thằng thứ 1 p[0].scores[0] //truy cập điểm thứ 1 của thằng thứ 1 p[0].scores[1] //truy cập điểm thứ 2 của thằng thứ 1 p[0].scores[2] //truy cập điểm thứ 3 của thằng thứ 1 p[0].average() //truy cập điểm trung bình của thằng thứ 1
đề của e là dùng dynamic, nhưng phải dùng đoạn main cho sẵn, trong đó có khai báo 2 biến riêng Student a, b; Vây nếu mình khai 1 mảng dynamic, rồi ngay sau đó khai như trên thì 2 thằng a, b có vào được dynamic như p[0] và p[1] ko ? Ak còn cái này nữa đoạn cin>>value nếu mình nhập abc hay 12a hay a12 là cái cin.fail() ở dòng dưới chuyển thành 0 đúng ko? và cái dòng cin.ignore (2000, '\n') để làm gì vậy?
Không. Khi khai báo ví dụ Student *pStudent = new Student[10]; là pStudent[0] và pStudent[1] đã được khởi tạo trên heap rồi. Khai báo Student a, b; thì a và b sẽ nằm trên stack, còn cái new kia thì 10 Student đều nằm trên heap. ta ko thấy link upanh được. lên imgur.com mà up @.@ *** Nếu cin >> value mà nhập vào 12a thì cin.fail() == false (hay 0). Còn nhập vào a12 thì cin.fail() == true hay 1. - Vì với 12a cin sẽ đọc giá trị 12 vào value và dừng tại ký tự bất hợp lệ là 'a', ko set fail flag, 'a' vẫn còn trên buffer của cin (nên phải ignore nó đi). - Còn a12 thì chưa đọc số nào vào value đã gặp phải ký tự ko hợp lệ là 'a' nên cin sẽ set fail flag. 'a12' vẫn còn y nguyên trên buffer nên cũng phải ignore hết tụi nó đi. *** cin.ignore(n, c) là trích ra và bỏ đi các ký tự còn sót trong buffer của cin cho tới khi gặp được ký tự c hoặc ko còn ký tự nào trong cin, bỏ đi tối đa là n ký tự. vd: trong cin còn 'abcdef,1234\n' có 11 ký tự - Nếu gọi cin.ignore(100, '\n') sẽ ignore hết 11 ký tự này. - Nếu gọi cin.ignore(100, ',') thì sẽ ignore đi 7 ký tự đầu 'abcdef,' (dừng ở ',') và trong buffer của cin còn '1234\n' - Nếu gọi cin.ignore(100, 'z') thì cũng sẽ ignore hết 11 ký tự. - Nếu gọi cin.ignore(10, '\n') thì sẽ ignore đi 10 ký tự và trong buffer của cin còn '\n' Biết trong cin còn bao nhiêu ký tự để đặt n? Nếu để 2000 vẫn có thể trong buffer còn 2001 ký tự và ko clear hết hoàn toàn buffer. Xài std::numeric_limits<std::streamsize>::max() cho n là chính xác nhất. (phải thêm header <limits>
Mảng thì ở đâu cũng là mảng, nghĩa là khi bạn khai báo mảng Student[10] thì bản thân cái Student đó đã là một con trỏ rồi, nghĩa là bây giờ cái biến p đang chỉ tới một mảng student 10 phần tử, giả sử bạn bạn khai báo thế này: Mã: class Student { int room; }; int main() { // làm gì ở khúc này thì làm Student* p = NULL; p = new Student [10]; //con trỏ p đang trỏ vào phần tử đầu tiên (p+0)->room = 1 // gán giá trị 1 cho thuộc tính room của con trỏ đầu tiên thực ra //cái này có thể viết là p->room=1; nhưng mình để thế cho dễ hiểu. (p+1)->room = 2;// gán giá trị 2 cho room của student thứ 2; //... (p+9)->room = 10; //gán giá trị 10 cho room của student thứ 10; getchar(); return 0; } Cứ như bình thường, khi cần giải phóng bộ nhớ cứ delete p như thường, không cần phải rườm rà gì cả. Cái a,b bạn nói gì mình không hiểu, phiền cậu đem yêu cầu lên đây cho mọi người đọc. Còn cái cin.ignore() thì bạn kia giải thích đúng rồi, nhưng nhắc bạn thêm một chút là đang học lập trình hiếm khi đặt trường hợp có 2001 ký tự trở lên vì về nguyên tắc thì bộ nhớ đệm hay buffer chỉ lưu được tối đa là 2000 kí tự, để 2000 là được rồi. Đệm mà. Đúng là trường hợp bạn đặt ra khá hay, nhưng khi học lập trình nên đi đôi với học một vài cấu trúc máy tính và phần cứng, vì không phải lập trình chỉ là thuật toán xuông, khi học tới lập trình đồ họa và lập trình ứng dụng các bạn sẽ biết nhiều mẹo người ta buộc phải dùng chỉ vì với thuật toán thuần túy thì không cách nào phần cứng đáp ứng nổi.
Nghĩa là bài yêu cầu phải dùng đoạn main này: Mã: int main() { Student a, b; a.accept(); b.set(222, "Mr.AA", 8.5); cout << endl << setw(10) << "ID" << setw(20) << "NAME" << setw(10) << right << "GRADE" << endl; a.display(); b.display(); system("pause"); return 0; } Và yêu cầu dùng dynamic memory Như bt thì em làm thế này: Mã: Student* a = NULL; a = new Student [1]; Student* b = NULL; b = new Student [1]; a->accept(); b->set(222, "Mr.AA", 8.5); a->display(); b->display(); delete [] a; delete [] b; Nhưng đoạn main trên kia lại khai báo biến a,b bình thường, vậy phải làm xao ?
với 1 phần tử ko thì chỉ cần Student *a = new Student; là đủ rồi. Khi nào a trỏ tới 1 mảng thì mới xài new []. Khi delete cũng tương tự: delete a; thay vì delete [] a; còn lại thì xài -> v.v.. đúng hết rồi. hoặc cho vào mảng Student *students = new Student[2]; students[0].accept(); students[1].set(...); ... for (int i = 0; i < 2; ++i) { students.display(); }