Не могу найти правильный вывод в этом коде - PullRequest
0 голосов
/ 10 ноября 2018

Меня попросили написать программу о путешествующем человеке. Направление программы:


  1. Предположим, что человек (скажем, A) стоит в точке (0, 0) и ждет, пока пользователь укажет ему направление и расстояние, по которому он должен идти.

  2. Пользователь может ввести N E W S для севера, востока, запада, юга и любое значение для расстояния.

  3. Когда пользователь вводит 0 в качестве направления, остановитесь и распечатайте место, где остановился человек

Мой код:

#include <stdio.h>

int main() {
float x=0,y=0;
char dir;
float mile;

while(1){

    printf("Enter input direction as N,S,E,W (0 to exit): ");
    scanf("%c",&dir); 

    if(dir == '0')
        break;
    if(dir != 'N' && dir != 'S' && dir != 'E' && dir != 'W'){

        printf("Invalid Direction, re-enter \n");
        continue;
    }

    printf("Input mile in %c dir: ",dir);
    scanf("%f",&mile);
    if(dir == 'N'){
        y+=mile;
    }
    else if(dir == 'S'){
        y-=mile;
    }
    else if(dir == 'E'){
        x+=mile;
    }
    else if(dir == 'W'){
        x-=mile;
    }
}
 printf("\nCurrent position of A: (%4.2f,%4.2f)\n",x,y);
return 0;
}

Но когда я запускаю программу после первых двух входов, она печатает недопустимые выходы на допустимых входах.

вывод: enter image description here

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Итак, я нашел вашу проблему: когда вы нажимали «Enter» после ввода «миль», это «Enter» регистрировалось как ввод, как символ «\ n». У меня есть решение для вас, но если вы не предпочитаете его, просто создайте особый случай, в котором вы игнорируете символ '\ n'. Что-то вроде else if (dir == '\n') continue;. Я подозревал, что это может быть проблемой, но подтвердил это, напечатав этот «недопустимый символ».

int main() 
{

    float x = 0, y = 0;
    char dir;
    float mile;

    do 
    {

        printf("Enter input direction as N,S,E,W (0 to exit): ");
        scanf("%c", &dir);

        switch (dir)
        {

        case 'N':
            printf("Input mile in %c dir: ", dir);
            scanf("%f", &mile);
            y += mile;
            break;
        case 'S':
            printf("Input mile in %c dir: ", dir);
            scanf("%f", &mile);
            y -= mile;
            break;
        case 'E':
            printf("Input mile in %c dir: ", dir);
            scanf("%f", &mile);
            x += mile;
            break;
        case 'W':
            printf("Input mile in %c dir: ", dir);
            scanf("%f", &mile);
            x -= mile;
            break;
        case '\n':
            break;
        case '0':
            break;
        default:
            printf("Invalid Direction, re-enter; You entered: %c \n", dir);
            break;
        }

    }while (dir != '0');

    printf("\nCurrent position of A: (%4.2f, %4.2f)\n", x, y);

    return 0;
}
0 голосов
/ 10 ноября 2018

Это классическая ошибка ИЛИ против И. Должно быть

if(dir != 'N' && dir != 'S' && dir != 'E' && dir != 'W') . 

Например, если пользователь вводит 'N', в этом случае оператор if все равно будет возвращать успех, потому что его! = 'S' и условие if имеет ИЛИ.

Редактировать: (Следуя советам @ usr2564301.)

Добавить пробел перед входом scanf %c.

scanf(" %c",&dir);

Проверьте ссылку для более подробного объяснения.

...