Программа не делает то, что должна - C - PullRequest
1 голос
/ 14 апреля 2011

Я написал программу, которая получает от пользователя серию чисел (<= 20), в то время как последний «0» означает конец серии (не включается в сохранение серии).2 массива (x, y) размером 20 (0-19 + 1 для '0') должны быть нулями, а m означает количество органов в массиве Y. </p>

Пользователь должен вводить числа по возрастанию (этоок 4ex 1,2,2,3,7,8, ..., 0) и заканчиваются на '0', конечно, если нет, появится соответствующее сообщение об ошибке, и программа отключится.

Мы можем быть уверены, что пользователь сохранит введенные цифры <= 20. </p>

Массив Y будет (если все было в порядке с массивом X) отсортированным массивом X, но без дубликатов.'m' будет числом органов в Y, за исключением, конечно, '0.

Функция SIFT должна организовывать массив Y только для печати из main ().

Пример:

Если пользователь сохранит в X: 1,1,2,3,5,5,5,6

На экране появится: m = 5 Y = 1,2, 3,5,6

Мой код:

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

void SIFT(int x_arr[ ], int y_arr[]);

int main ()
{
    int x[20] = {0} , y[20] = {0};
    int m=0,temp=0,curr=0,i=0,j=0;

    printf("Please enter your numbers now:\n\n");

    /*enter numbers one by one. if x[i+1] value < x[i] value, err msg.
      when user want to end the series he must enter '0' which means end of string (it wont       included in x[]) */
    while ( ( temp = getchar() ) != '0' )
    {
        if (temp >= curr)
        {
            x[i] = temp;
            curr = temp;
            i++;
        }
        else
        {
            printf("The numbers are not at the right order !\n\nProgram will now terminate...\n\n");
        }
    }

    SIFT(x,y);

    for (i=0 ; y[i]=='0' ; i++) /*strlen(y) without ('0')'s includes*/
        m++;

    /*Prints  m , y's organs*/
    printf("\n\nm = %d",m);
    printf("Y = ");
    while (y[j]!='0')
    {
        printf ("%d ,",y[j]);
        j++;
    }

return 0;
}

void SIFT(int x_arr[ ], int y_arr[])
{
    int i=0,j=0;

    while (x_arr[i] != '0')
    {
        if (x_arr[i] == x_arr[i+1]) /*if current val. equals next val. -> jump dbl at x_arr*/
        {
            y_arr[j] = x_arr[i];
            i+=2;
            j++;
        }
        else
        {
            y_arr[j]=x_arr[i];
            i++;
            j++;
        }
    }    

}

По какой-то неизвестной причине, для любого легального ввода я получаю "Числане в правильном порядке ... "сообщение об ошибке ...

Я буду более чем счастлив, если кто-то сможет это исправить, поэтому он должен работать должным образом, потому что до сих пор я вижу, что все в порядке.....

Спасибо :( ...

Ответы [ 6 ]

3 голосов
/ 14 апреля 2011

getchar() не делает то, что вы думаете, что делает. Прочитайте его описание (http://pubs.opengroup.org/onlinepubs/9699919799/functions/getchar.html).

Вы можете попробовать scanf() вместо (http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html) или лучше, fgets() и sscanf().

1 голос
/ 14 апреля 2011

Исправляя синтаксический анализ ввода (например, с scanf), ваш код все еще имеет некоторые проблемы:

1) Вы предполагаете, что ввод упорядочен (но не строго). Поэтому вам не нужно хранить все в x, вы можете во время ввода сравнивать только предыдущий номер и текущий номер. если текущий номер БОЛЬШЕ, чем предыдущий (строго), вы сохраняете его и увеличиваете m. Если он МЕНЬШЕ, чем предыдущий, вы должны выйти. Если они равны, ничего не делать:

while ( scanf("%d",&temp) == 1 && temp != 0 && m < 20) {
    if (temp > curr) {
        y[m++] = temp;
    }
    else if (temp < curr) {
        printf("The numbers are not at the right order !\n\nProgram will now terminate...\n\n");
        exit(0);
    }
    curr = temp;
}

(поэтому вам больше не нужны SIFT и массив x).

2) Вы не выходите из программы при условии завершения, вы просто печатаете сообщение! (исправлено выше).

3) Я поставил условие m < 20 в цикле, просто чтобы убедиться, что на неправильно введенных входах не возникнет ошибка.

Это должно поставить вас на путь. Заметьте, что теперь, когда вы используете scanf, условие завершения больше не символ ('0'), а число (0). И не забудьте #include <stdlib.h> наверху (для exit())

0 голосов
/ 14 апреля 2011

Кроме того,

Если я правильно понял, я думаю, что вы имеете в виду

for (i=0 ; y[i] != '0' ; i++) /* strlen */
    m++;
0 голосов
/ 14 апреля 2011

Во-первых, было бы очень полезно, если бы вы включили в свой оператор Error Print значения temp и curr.

Поскольку другие сказали это, вы не хотите читать символ, выхочу прочитать номер.Ссылки, которые предоставил pmg в своем ответе, помогут вам найти решение.Кроме того, отладка с использованием точек останова, возможно, помогла бы вам быстро выявить эту проблему, я призываю вас изучить некоторые базовые навыки отладки. Ошибки печати могут помочь вам только до сих пор:)

0 голосов
/ 14 апреля 2011

Вы не используете getchar() для чтения числа, его цель - прочитать один символ из входного буфера!

Вам нужно, например, вызвать scanf() или fgets().

0 голосов
/ 14 апреля 2011

Скорее всего, вы используете getchar() вместо чего-то вроде fgets().Вы нажимаете новую строку после ввода чисел?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...