1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

Lập trình-Sự hứng thú của ngôn ngữ-Vào đây để được vote

Chủ đề trong '1981 - Hội Gà Sài Gòn' bởi xinchen, 21/05/2004.

  1. 0 người đang xem box này (Thành viên: 0, Khách: 0)
  1. xinchen

    xinchen Thành viên mới

    Tham gia ngày:
    21/04/2004
    Bài viết:
    87
    Đã được thích:
    0

    Để tạo một struct lưu thông tin về một điểm gồm có tung độ, hoành độ và màu sắc(256 màu)của điểm đó. Bạn chọn kiểu nào đây?
    Kiểu 1:
    struct MyPoint {
    int x,y;
    int c;
    };
    Kiểu 2:
    struct MyPoint {
    short x,y;
    unsigned char c;
    };
  2. xinchen

    xinchen Thành viên mới

    Tham gia ngày:
    21/04/2004
    Bài viết:
    87
    Đã được thích:
    0
    Kiểu 2 là các được chọn khi xinchen học cấp 3, khai báo vừa đủ xài thôi.
    Nhưng bây giờ phần mềm thường được chạy trên ít nhất là PII nên kiểu 2 chỉ có ý nghĩa về mặt tiết kiệm bộ nhớ hoặc khi viết trên các thiết bị bộ nhớ nhỏ. Kiểu 1 là lựa chọn đúng đắn khi Windows hỗ trợ số nguyên 4 byte cho CPU và BUS 32 bit, xử lí cũng nhanh hơn mà hao phí không đáng kể.
    Thậm chí còn có người đề nghị kiểu này cho kích thước MyPoint thành 4 byte chẵn.
    Kiểu 3:
    struct MyPoint {
    int x,y;
    int c;
    int notused;
    };
  3. fukutomi

    fukutomi Thành viên mới

    Tham gia ngày:
    17/02/2003
    Bài viết:
    511
    Đã được thích:
    0
    Đây không phải là một câu đố nữa mà là câu hỏi. Em hiện đang làm một bài lập trình C, yêu cầu là display một cái menu để user chọn (1, 2 hoặc 3). Em dùng function getchar() để lấy option mà user chọn nhưng không hiểu sao nó cứ lấy thêm một character là backspace (bởi thế nên sau khi enter một character, menu sẽ xuất hiện 2 lần vì nó nhận ký tự backspace!!). Đoạn code như sau:
    do
    {
    menu();
    ch = getchar();
    switch(ch)
    {
    case ''1'':
    IndexPrint(index);
    break;
    case ''2'':
    query(index);
    break;
    default:
    break;
    }
    } while (ch != ''3'');
    Xin chỉ giúp em với. Nếu được sẽ vote 5* Cám ơn trước!
  4. xinchen

    xinchen Thành viên mới

    Tham gia ngày:
    21/04/2004
    Bài viết:
    87
    Đã được thích:
    0
    Bạn viết như thế này thì hơi bị nguy hiểm đấy, xinchen sẽ làm một phân tích kĩ về đoạn code của bạn khi nào có thời gian.
    Bạn sửa lại như thế này thử nhé(xinchen chưa kiểm tra lại)
    int ch;
    do
    {
    menu();
    ch = getch();
    ch = toupper( ch); // Cho chắc ăn nếu dùng phím tắt là các kí tự
    switch(ch)
    {
    case ''1'': // Dùng 1 nháy đơn
    IndexPrint(index);
    break;
    case ''2'':
    query(index);
    break;
    default:
    break;
    }
    } while (ch != ''3'');
  5. fukutomi

    fukutomi Thành viên mới

    Tham gia ngày:
    17/02/2003
    Bài viết:
    511
    Đã được thích:
    0
    Cám ơn xinchen đã giúp! Nhưng cái function mà xinchen dùng là getch() hay là getchar() vậy (hình như là không có function getch() <-- fuku xem thử trong cplusplus.com rồi). fuku có dùng đoạn code của xinchen nhưng vẫn không giải quyết được vấn đề của mình. Để fuku nói rõ hơn về cái problem này:
    Menu có 3 option (Display, Query và Quit):
    - Display: hiện ra danh sách các từ, khi chọn 1 thì program sẽ display danh sách này ra và show menu lại để chọn tiếp
    - Query: cho user search 1 từ trong danh sách đó, menu option là 2
    - Quit: thoát khỏi chương trình
    Vấn đề là khi chọn một option (ngoại trừ option 3): thì chương trình sẽ chạy như ý muốn nhưng nó lại display menu đến 2 lần khi chọn option 2 (giống như từ menu mình không chọn gì cả mà enter luôn) hoặc là nó bảo từ mình tìm không có mặc dù mình chưa enter gì cả??
    Thêm một cái nữa là fuku làm bài này trên Linux.
    Nhờ xinchen giúp vậy, cám ơn nhé
  6. xinchen

    xinchen Thành viên mới

    Tham gia ngày:
    21/04/2004
    Bài viết:
    87
    Đã được thích:
    0
    Sozi nha. xinchen cứ tưởng bạn viết trên win nên hướng bạn sang dùng getch() cho giống với trong trường thôi.
    Kí tự dư không phải là kí tự Backspace mà là kí tự Enter. Viết lại như vầy nha.

    do
    {
    menu();
    ch = getchar();
    switch(ch)
    {
    case ''''1'''':
    IndexPrint(index);
    break;
    case ''''2'''':
    query(index);
    break;
    default:
    break;
    }
    _flushall(); // Vứt các kí tự điều khiển đi
    } while (ch != ''''3'''');
  7. fukutomi

    fukutomi Thành viên mới

    Tham gia ngày:
    17/02/2003
    Bài viết:
    511
    Đã được thích:
    0
    fuku tìm mãi mà không thấy function _flushall (hay flushall) trong trang cplusplus.com mà chỉ có fflush (và không xài được trong Linux) nhưng đó không phải là cái mà fuku cần. fuku đã đổi lại đoạn code của mình như sau và nó chạy tốt:
    char ch[MAX_WORD_LENGTH];
    do
    {
    menu();

    scanf("%s", ch);
    switch(ch[0])
    {
    case ''1'':
    IndexPrint(index);
    printf("
    There are %d words in the index", index->numWord);
    break;
    case ''2'':
    query(index);
    break;
    default:
    break;
    }
    } while (ch[0] != ''3'');
    Bây giờ câu hỏi của fuku là làm cách nào để loại bỏ kí tự thêm vào ở cuối string (
    và space gì đó) khi dùng function fgets hoặc gets?
    Dù sao cũng cám ơn xinchen vì đã tận tình giúp đỡ, vote cho xinchen nhé
  8. xinchen

    xinchen Thành viên mới

    Tham gia ngày:
    21/04/2004
    Bài viết:
    87
    Đã được thích:
    0
    Phải xin lỗi fukutomi , tớ đang kẹt chút chuyện nên không kịp thời trả lời nhanh được.
    Khi viết những chức năng tương tự trong window thì phải dùng những hàm flush để làm sạch bộ đệm như flushall chẳng hạn. xinchen chưa làm cái này trên linux nên không biết là không có hàm này có các thư viện chuẩn. Kì lạ là hàm này cũng khá quan trong mà sao trong thư viện của linux lại không có.
    xinchen đã thử viết trên linux và thấy đúng là nó bị y như trong win. xinchen cũng hỏi một số người nhưng chẳng ai biết cách solve cả. Giải quyết theo cách của cậu là thỏa về tính năng như không thỏa về thuật toán hoặc thiết kế ban đầu (lấy một kí tự chứ không lấy chuỗi rồi dùng kí tự đầu tiên từ bàn phím).
    Vấn đề tại sao khi dùng hàm getchar thì lại bị như vậy và hàm có tính năng tương tự như flushall bên linux là gì xinchen sẽ tìm hiểu lại, nó cũng khá thú vị đó. Tớ xin nợ cậu 5 sao vừa vote cho vấn đề này, chứ tớ có giúp gì được đâu mà vote cho tớ.
  9. xinchen

    xinchen Thành viên mới

    Tham gia ngày:
    21/04/2004
    Bài viết:
    87
    Đã được thích:
    0
  10. boysaigon

    boysaigon Thành viên rất tích cực

    Tham gia ngày:
    12/03/2003
    Bài viết:
    10.485
    Đã được thích:
    0
    Kêu gọi các thành viên nghiên cứu cách đưa 1 đoạn nhạc lên box.

Chia sẻ trang này