У меня проблема с назначением переменной и функцией while - PullRequest
0 голосов
/ 18 апреля 2019

это мой первый пост, очень рад стать частью этого сообщества.Я абсолютный новичок в этом вопросе, учусь на разных уроках, которые я нашел, и это моя первая «программа».Я иду к вам, ребята, так как у меня есть две проблемы в моем коде, на которые мой друг-программист не смог мне ответить (на самом деле, она сказала мне спросить это здесь):

ЯЯ уверен, что это простой ответ, но я просто понятия не имею, и я не смог найти правильный ответ в Интернете (или я не выглядел должным образом).

Спасибо всем!

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

int main()
{
// insert code here...
int num1;
int num3;
char ans[3];

printf("Enter first number: ");
scanf("%i", &num1);
printf("Enter second number: ");
scanf("%i", &num3);
while(!(strcmp(ans,"Sum") | (!(strcmp(ans,"Sub"))) | (!(strcmp(ans,"Mul"))) | (! 
(strcmp(ans,"Div"))) == 0));
printf("What kind of operation do you want to make? Type Sum, Sub, Mul or Div: 
");
scanf("%s", ans);
int Sum = num1 + num3;
int Sub = num1 - num3;
int Mul = num1 * num3;
//    int Div = num1 / num2;

if((strcmp(ans,"Sum") == 0))
{
    printf("The sum of both numbers give %d\n", Sum);
}
//    {printf("%d y %d\n", num1, num2);
//}
if((strcmp(ans,"Sub") == 0))
{
    printf("The substraction of both numbers give %d\n", Sub);
}
if((strcmp(ans,"Mul") == 0))
{
    printf("The multiplication of both numbers give %d\n", Mul);
}
if((strcmp(ans,"Div") == 0))
{
    printf("The division of both numbers give %d\n", num1 / num3);
}
{    if (!(strcmp(ans,"Sum") | (!(strcmp(ans,"Sub"))) | (!(strcmp(ans,"Mul"))) | 
(!(strcmp(ans,"Div"))) == 0))
{
    printf("This command does not apply, please type the correct option\n");
}
    //((strcmp(ans, "Sum")) | (strcmp(ans, "Sub")) | (strcmp(ans, "Mul")) | 
(strcmp(ans, "Div")) != 0) {



}
}
  • Когда я запускаю программу, она не присваивает никакому значению "num2", кроме 0.

  • Что я действительно хочу, пока "«Нужно сказать, что вы ввели неверный символ, и вернуться к основному вопросу, пока не введете его правильно.

PS: Теперь я отправил всекод, который я написал.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019
while(!(
          strcmp(ans,"Sum") | (!(
          strcmp(ans,"Sub"))) | (!(
          strcmp(ans,"Mul"))) | (!(
          strcmp(ans,"Div"))) == 0));

Это не имеет смысла.Прежде всего, логическое ИЛИ записывается как ||, а не |.Во-вторых, ; в конце означает цикл навсегда в этом случае, так как вход никогда не изменяется внутри цикла.Вы не должны были использовать ;, но { ... } и помещать его вокруг printf и scanf, чтобы создать вокруг них петлю.

Перепишите это примерно так:

do
{
  printf("What kind of operation do you want to make? Type Sum, Sub, 'Mul' or Div: ");
  scanf("%s", ans);
}while( strcmp(ans,"Sum") && 
        strcmp(ans,"Sub") &&
        strcmp(ans,"Mul") &&
        strcmp(ans,"Div") );

strcmp возвращает ненулевое значение, если строки не совпадают, что означает, что этот C можно прочитать на английском языке как:
"запрашивать ввод, когда ввод не Sum, а ввод не Sub, ввод не Mul и вводне Div ".

0 голосов
/ 18 апреля 2019

Вы не проверяете, вводите ли вы правильный номер для двух чисел, потому что вы не проверяете, возвращает ли scanf 1

Тест в , в то время как имеет '(' ')' неправильно и то же самое для , если

В , в то время как вы сравниваете и , прежде чем читать его, поэтому его использование является неопределенным поведением, , в то время как может циклически бесконечно

scanf для чтения операции не ограничивает количество прочитанных символов, вы можете записать из ans , и даже если введено правильное имя операции, вам некуда запомнить последний нулевой символ

Отсутствует конец программы, выполняющей операции


Предложение:

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

int main()
{
  int num1;
  int num2;
  char ans[4];

  printf("Enter first number: ");

  if (scanf("%i", &num1) != 1) {
    puts("invalid number");
    return -1;
  }

  printf("Enter second number: ");

  if (scanf("%i", &num2) != 1) {
    puts("invalid number");
    return -1;
  }

  for (;;) {
    printf("What kind of operation do you want to make? Type Sum, Sub, Mul or Div: ");
    if (scanf("%3s", ans) != 1)
      /* EOF */
      return -1;

    if (!strcmp(ans,"Sum")) {
      printf("%d+%d=%d\n", num1, num2, num1+num2);
      return 0;
    }
    if (!strcmp(ans,"Sub")) {
      printf("%d-%d=%d\n", num1, num2, num1-num2);
      return 0;
    }
    if (!strcmp(ans,"Mul")) {
      printf("%d*%d=%d\n", num1, num2, num1*num2);
      return 0;
    }
    if (!strcmp(ans,"Div")) {
      if (num2 == 0)
        puts("cannot divide by 0");
      else
        printf("%d/%d=%d\n", num1, num2, num1/num2);
      return 0;
    }
    puts("This command does not apply, please type the correct option");
  }
}

Как вы можете видеть, у меня нет разделенного , в то время как только для проверки правильности операции ввода, потому что после этого вы снова тестируете, какова операция ввода для управления ею.

Компиляция и исполнения:

/tmp % gcc -pedantic -Wall -Wextra o.c
/tmp % ./a.out
Enter first number: 12
Enter second number: 34
What kind of operation do you want to make? Type Sum, Sub, Mul or Div: aze
This command does not apply, please type the correct option
What kind of operation do you want to make? Type Sum, Sub, Mul or Div: Sum
12+34=46
/tmp % ./a.out
Enter first number: aze
invalid number
/tmp %
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...