Hỏi & đáp lập trình

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi canh en buon, 23/5/07.

  1. Assasin_Cruz

    Assasin_Cruz Thành viên cấp 5

    Tham gia ngày:
    14/3/08
    Bài viết:
    1,498
    Nơi ở:
    hà nội
    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
     
  2. Black99vn

    Black99vn Thành viên cấp 5

    Tham gia ngày:
    5/7/04
    Bài viết:
    427
    Nơi ở:
    Nơi không thể đến
    Tớ tìm ra lỗi rồi :D
    ...
    Thanks
     
    Chỉnh sửa cuối: 11/4/13
  3. King War

    King War <table width="150"><tr><td><img src="http://forum.

    Tham gia ngày:
    23/7/10
    Bài viết:
    2,136
    Nơi ở:
    kw_corp@yh
    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
     
  4. INTP

    INTP Thành viên cấp 5

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    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
     
  5. King War

    King War <table width="150"><tr><td><img src="http://forum.

    Tham gia ngày:
    23/7/10
    Bài viết:
    2,136
    Nơi ở:
    kw_corp@yh
    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 :6cool_smile:
     
  6. norulesvn

    norulesvn Thành viên cấp 5

    Tham gia ngày:
    31/5/08
    Bài viết:
    203
    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 :(
     
  7. BadBoy199x

    BadBoy199x Thành viên cấp 5

    Tham gia ngày:
    12/6/12
    Bài viết:
    556
    Nơi ở:
    Hà Giang Cỉty
    Alo INTP
    Cái vd a đưa e nhiều lệnh mới quá, chưa học, có cách nào đơn giản hơn ko?
     
  8. INTP

    INTP Thành viên cấp 5

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    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?
     
    Chỉnh sửa cuối: 21/9/13
  9. BadBoy199x

    BadBoy199x Thành viên cấp 5

    Tham gia ngày:
    12/6/12
    Bài viết:
    556
    Nơi ở:
    Hà Giang Cỉty
    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
     
    Chỉnh sửa cuối: 21/9/13
  10. INTP

    INTP Thành viên cấp 5

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    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>>/
     
    Chỉnh sửa cuối: 21/9/13
  11. BadBoy199x

    BadBoy199x Thành viên cấp 5

    Tham gia ngày:
    12/6/12
    Bài viết:
    556
    Nơi ở:
    Hà Giang Cỉty
    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 đã :2cool_sexy_girl:

    P/s: đọc code chay thì hiểu lờ mờ, giải thích xong lại mù như cũ :))
     
  12. INTP

    INTP Thành viên cấp 5

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    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 :-"
     
    Chỉnh sửa cuối: 21/9/13
  13. BadBoy199x

    BadBoy199x Thành viên cấp 5

    Tham gia ngày:
    12/6/12
    Bài viết:
    556
    Nơi ở:
    Hà Giang Cỉty
    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 ?
     
  14. INTP

    INTP Thành viên cấp 5

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    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
     
  15. BadBoy199x

    BadBoy199x Thành viên cấp 5

    Tham gia ngày:
    12/6/12
    Bài viết:
    556
    Nơi ở:
    Hà Giang Cỉty
    đề 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
    [​IMG]
    đ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?
     
    Chỉnh sửa cuối: 26/9/13
  16. INTP

    INTP Thành viên cấp 5

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    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>
     
    Chỉnh sửa cuối: 26/9/13
  17. golemsmk

    golemsmk Thành viên mới

    Tham gia ngày:
    27/9/13
    Bài viết:
    1
    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.
     
  18. INTP

    INTP Thành viên cấp 5

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    buffer của cin nhiều hơn 2000 nhiều mà @.@ Ở đâu ra số 2000 là tối đa :-?
     
  19. BadBoy199x

    BadBoy199x Thành viên cấp 5

    Tham gia ngày:
    12/6/12
    Bài viết:
    556
    Nơi ở:
    Hà Giang Cỉty
    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;
    }
    
    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 ?
     
  20. INTP

    INTP Thành viên cấp 5

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    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(); }
     
    Chỉnh sửa cuối: 27/9/13

Chia sẻ trang này