30/09/2018, 16:12

Kiểm tra input nhập từ bàn phím

Em chào anh chị, em mới học lập trình c và em có 1 bài tập như sau.

Viết 1 chương trình mà khi chạy chương trình sẽ hiện dòng:

Input sequence:
Và đợi người dùng nhập 1 dãy số.

Em ví dụ là

1, 5, 19, 6, 8, 24, 135,-90, 230, 15

Người dùng nhập dấu “?” dùng để bảo với chương trình là họ đã nhập xong dãy số rồi.

Sau “?” người dùng tiếp tục nhập thêm 1 (hoặc nhiều số khác) mà họ muốn tìm xem trong dãy số trước dấu “?” có thể tìm đc 2 số mà tổng của nó là số sau dấu “?” hay không?

Như ở trên em ví dụ là: 6 39 3000 -400, sau đó EOF

Output sẽ là :

Sum 6 can be achieved. 
Sum 39 can be achieved.
Sum 3000 can not be achieved.
Sum -400 can not be achieved. 

Input sequence bắt buộc sau mỗi số phải có dấu “,” và sau dấu “?” là testing values, testing values thì ko cần “,” .

Em nghĩ ra cách là lập 2 array. 1 array lưu các số trước “?” và 1 array lưu các số sau “?”. Sau đó em sort lại và loại bỏ những số giống nhau.

Nhưng em đang gặp vấn đề với cách fill array. Cho em hỏi làm sao để khi nhập các số từ bán phím mà người dùng ko nhập dấu “,” sau các số thì sẽ hiện " Invalid input". Và làm cách nào để khi người dùng enter “?” thì các số tiếp theo sẽ lưu vào array thứ 2 ạ.

Hoặc anh chị nào có cách khác thì chỉ giúp em. Em cám ơn ạ.

Thực tế khắc nghiệt viết 18:22 ngày 30/09/2018

tạo mảng trong khi nhập mảng để duyệt chúng ta chèn điều kiện do while chẳng hạn với dấu mà bạn mong muốn
Bạn có thể làm như sau :
Bước 1 : khai báo 1 mảng
bước 2 : bạn sẽ tạo 1 hàm để nhập mảng với các điều kiện dấu, ký tự như bạn muốn
Bước 3 : bạn tạo 1 hàm xuất mảng với công thức xuất mảng

Nguyễn Minh Dũng viết 18:20 ngày 30/09/2018

Em chào anh chị, em mới học lập trình c và em có 1 bài tập như vậy. Viết 1 chương trình mà kết quả nó như vậy:

Em có thể nói rõ hơn “như vậy” là “như thế nào” không?

Input sequence:1, 5, 19, 6, 8, 24, 135,-90, 230, 15?Testing values:6Sum 6 can be achieved.39 Sum 39 can be achieved.3000 Sum 3000 can not be achieved.-400 Sum -400 can not be achieved.

Cụ thể là chỗ này, anh chưa rõ cái nào là input, cái nào là output

Nguyen Linh viết 18:18 ngày 30/09/2018

Dạ, khi chạy chương trình sẽ hiện dòng:
Input sequence:
Và đợi người dùng nhập 1 dãy số.

Như trên em ví dụ là

1, 5, 19, 6, 8, 24, 135,-90, 230, 15

Người dùng nhập dấu “?” dùng để bảo với chương trình là họ đã nhập xong dãy số rồi.

Sau “?” người dùng tiếp tục nhập thêm 1 (hoặc nhiều số khác) mà họ muốn tìm xem trong dãy số trước dấu “?” có thể tìm đc 2 số mà tổng của nó là số sau dấu “?” hay không?

Như ở trên em ví dụ là: 6 39 3000 -400, sau đó EOF

Output sẽ là :

Sum 6 can be achieved. 
Sum 39 can be achieved.
Sum 3000 can not be achieved.
Sum -400 can not be achieved. 

Em xin lỗi, tiếng việt em ko đc tốt lắm nên giải thích hơi lằng nhăng ạ.

Nguyễn Minh Dũng viết 18:14 ngày 30/09/2018

Em nghĩ ra cách là lập 2 array. 1 array lưu các số trước “?” và 1 array lưu các số sau “?”. Sau đó em sort lại và loại bỏ những số giống nhau.

ok

Nhưng em đang gặp vấn đề với cách fill array. Cho em hỏi làm sao để khi nhập các số từ bán phím mà người dùng ko nhập dấu “,” sau các số thì sẽ hiện " Invalid input". Và làm cách nào để khi người dùng enter “?” thì các số tiếp theo sẽ lưu vào array thứ 2 ạ.

Đề có bắt buộc phải nhập dấu , không? Anh thấy bỏ công làm cái đó ko đáng. Nhưng cái này làm được.

Đang có hứng, đã làm

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN 1000
#define MAX_NUM 1000

/* delete the following line to disable debugging */
#define DEBUG

#ifdef DEBUG
#define DEBUG_TEST 1
#else
#define DEBUG_TEST 0
#endif

#define debug_print(fmt, ...) \
            do { if (DEBUG_TEST) fprintf(stderr, fmt, __VA_ARGS__); } while (0)

void get_lists(char ** first, char ** second, char * line)
{
    /* get the first list */
    *first = strtok(line, "?");
    debug_print("\nfirst %s\n", *first);

    /* get the second list */
    *second = strtok(NULL, "?");
    debug_print("\nsecond %s\n", *second);
}

int get_array(int * array, char * str)
{
    char *num;
    /* get the first number */
    num = strtok(str, ",");
    /* get other numbers */
    int array_idx = 0;
    while(num)
    {
        array[array_idx++] = atoi(num);
        num = strtok(NULL, ",");
    }

    debug_print("\narray: %s", "");
    for(int i = 0; i < array_idx; ++i)
        debug_print("%d ", array[i]);

    return array_idx;
}

void remove_duplicate(int * array, int len)
{
}
int main()
{
    char line[MAX_LEN+1] = "";
    fgets (line, MAX_LEN, stdin);

    // check if there is no ? or ,
    if (!strstr(line,"?") || !strstr(line,","))
    {
        goto bad;
    }

    char *first;
    char *second;
    get_lists(&first, &second, line);

    int first_array[MAX_NUM] = {};
    int len_fa = get_array(first_array, first);
    remove_duplicate(first_array, len_fa);

    int second_array[MAX_NUM] = {};
    int len_sa = get_array(second_array, second);
    remove_duplicate(first_array, len_sa);

    return 0;
bad:
    printf("\nInvalid input\n");
    return 1;
}
Phạm Hoàng Tuấn viết 18:29 ngày 30/09/2018

Cho em hỏi làm sao để khi nhập các số từ bán phím mà người dùng ko nhập dấu “,” sau các số thì sẽ hiện " Invalid input"

e đưa tất cả số dấu ',' người dùng nhập vào 1 mảng, e để ý sẽ thấy tất cả phần tử chứa dấu ',' sẽ có chỉ số lẻ (mảng chạy từ 0 nhé). Nếu có cái nào k fair dấu ',' thì e báo lỗi.

Thực tế khắc nghiệt viết 18:24 ngày 30/09/2018

e đưa tất cả số dấu ‘,’ người dùng nhập vào 1 mảng, e để ý sẽ thấy tất cả phần tử chứa dấu ‘,’ sẽ có chỉ số lẻ (mảng chạy từ 0 nhé). Nếu có cái nào k fair dấu ‘,’ thì e báo lỗi.

ý em như này a xem đc k? tạo 1 hàm bool để duyệt mảng đó . Sau đó cứ thấy ko phải dấu ‘,’ dùng lặp kiểm tra if nếu sai thì mình cout "invalid number "

Phạm Hoàng Tuấn viết 18:20 ngày 30/09/2018

Sau đó cứ thấy ko phải dấu ‘,’

Cứ thấy không phải dấu , ở vị trí nào trong mảng em ?

Thực tế khắc nghiệt viết 18:22 ngày 30/09/2018

Cứ thấy không phải dấu , ở vị trí nào trong mảng em ?

cái này em hiểu lầm ý rồi! phải là trong lúc nhập nếu gặp số ko có dấu ‘,’ thì báo nhập lại luôn cho dễ

Nguyen Linh viết 18:19 ngày 30/09/2018

Dạ, em cảm ơn rất nhiều ạ.

Nguyen Linh viết 18:13 ngày 30/09/2018

Anh Đạt khi nào rảnh làm video về pointer và malloc trong C nhé ^^ Anh giải thích rất dễ hiểu ạ.

Nguyễn Minh Dũng viết 18:13 ngày 30/09/2018

À, anh đã khỏe lại rồi, cổ họng hết ho. Sắp có videos mới rồi đấy. Nếu khỏe thì anh sẽ quay videos múa lửa để câu views. Nhớ ủng hộ

Nguyễn Minh Dũng viết 18:20 ngày 30/09/2018

Sau này các posts được coi là off-topics sẽ được move vào đây
I moved 4 posts to a new topic: Off-topics will be moved here

Bài liên quan
0