Итак, я изучаю информатику (поэтому я все еще учусь), и я пытаюсь запрограммировать автомат для напитков. Дело в том, что он выполняет только первый блок if-. Я не могу найти свою ошибку и был бы очень признателен за помощь, чтобы я мог исправить ошибку и узнать, что я сделал неправильно.
Я сделал некоторые комментарии в коде, чтобы он был лучше понятен для тех, кто не говорит по-немецки, поскольку основной текст (который в основном не важен) написан на немецком языке.
Вот полный код почтения
#include <stdlib.h>
#include <stdio.h>
void Fkt(int);
int main(void) {
int x; /*Not important in this part of code */
char G; /*The drink you choose will be G*/
float p; /* p = price */
printf("*** Getraenke Automat *** \n*W) Wasser (0.5 Euro)* \n*B) Bionade (1 Euro)*\n*O) Orangensaft (2 Euro)*\n***********************\n\nBitte ein Getränk auswaeheln "); /*Basically just asking what drink you want with the prices */
scanf("%c", &G); /* User picks drink*/
if ( G == 119 || 87) { /*This if block works perfectly fine */
printf("\n Bitte Zahlen Sie 0.5 Euro ");
scanf("%f", &p);
if ( p == 0.5) { /*If you pay the right amount of money */
printf("\n Entnehmen Sie Ihr Getränk \n");
}
else { /*For the wrong amount of money*/
printf("\nGeben Sie den richtigen Betrag ein!\n");
}
}
else if ( G == 66 || 98) { /* This one is stated as "Will never be executed */
printf("\n Bitte Zahlen Sie 1 Euro ");
scanf("%f", &p);
if ( p == 1) {
printf("\n Entnehmen Sie Ihr Getränk \n");
}
else {
printf("\nGeben Sie den richtigen Betrag ein!\n");
}
}
return 0;
}
void Fkt(int x){
printf("\n------------\n");
}
Я пытался давать каждому напитку разную цену (лимонад 1 евро, вода 0,5 цента), но независимо от того, какой вход дается, он всегда дает мне только цену первого напитка. Я не знаю, сделал ли я небольшую глупую ошибку или просто сделал это совершенно неправильно.
Итак, вот моя проблемная зона:
if ( G == 119 || 87) { /*This if block works perfectly fine */
printf("\n Bitte Zahlen Sie 0.5 Euro ");
scanf("%f", &p);
if ( p == 0.5) { /*If you pay the right amount of money */
printf("\n Entnehmen Sie Ihr Getränk \n");
}
else { /*For the wrong amount of money*/
printf("\nGeben Sie den richtigen Betrag ein!\n");
}
}
else if ( G == 66 || 98) { /* This one is stated as "Will never be executed */
printf("\n Bitte Zahlen Sie 1 Euro ");
scanf("%f", &p);
if ( p == 1) {
printf("\n Entnehmen Sie Ihr Getränk \n");
}
else {
printf("\nGeben Sie den richtigen Betrag ein!\n");
}
И используйте double вместо float.
Я думаю, вам могут понадобиться утверждения типа if ( G == 66 || G == 98) вместо того, что у вас есть. Я не думаю, что написанный код делает то, что вы думаете.
Когда вы делаете G == 66 || 98, он сначала оценивает G == 66 (который будет оцениваться как true или false), а затем применяет это значение к 98 с помощью оператора ||, который всегда возвращает true (|| обычно применяется к логическим значениям). Он не будет проверять, равно ли G 66 или 98...
Чего именно вы ожидаете от G == 119 || 87? Угадывать синтаксис — не лучший способ учиться. Подсказка: это то же самое, что и G == (119 || 87)
Не так, @klutt. Оператор == имеет более высокий приоритет, чем ||, поэтому G == 119 || 87 эквивалентен (G == 119) || 87. А так как 87 правдиво и выражение не имеет побочных эффектов, это также эквивалентно просто 1.
@klutt == имеет более высокий приоритет оператора, чем ||. Итак, вы получаете (G == 119) || 87... en.cppreference.com/w/c/language/operator_precedence
Хорошо, спасибо, ребята. Я вижу свою ошибку сейчас. Спасибо!
В C любое число, кроме 0, истинно, поэтому 87 истинно.
@ Рон Ха-ха, ты прав. И я разместил комментарий не в том месте. Предполагалось перейти к вопросу, а не к ответу. Моя главная мысль заключается в том, что он не делает того, что думает OP. :)
@JohnBollinger Да, это правильно. Виноват. См. выше.
Проблема у вас здесь в том, что вы говорите
If ( G == 119 || 87)
Здесь он проверяет, равно ли G 119 и не равно ли 87 0.
Следующий код может помочь вам понять, как работает C при использовании int как bool.
int a = 5;
if (a)
{
printf("Not zero\n");
} else {
printf("Zero\n");
}
a = 0;
if (a)
{
printf("Not zero\n");
} else {
printf("Zero\n");
}
Код выше будет печатать
Not zero
Zero
Вы, вероятно, должны попробовать
if ( G == 119 || G == 87) { /*This if block works perfectly fine */
printf("\n Bitte Zahlen Sie 0.5 Euro ");
scanf("%f", &p);
if ( p == 0.5) { /*If you pay the right amount of money */
printf("\n Entnehmen Sie Ihr Getränk \n");
}
else { /*For the wrong amount of money*/
printf("\nGeben Sie den richtigen Betrag ein!\n");
}
}
else if ( G == 66 || G == 98) { /* This one is stated as "Will never be executed */
printf("\n Bitte Zahlen Sie 1 Euro ");
scanf("%f", &p);
if ( p == 1) {
printf("\n Entnehmen Sie Ihr Getränk \n");
}
else {
printf("\nGeben Sie den richtigen Betrag ein!\n");
}
and if 87 is not null
null имеет особое значение в C. Вы должны сказать, что это не ноль.
Добро пожаловать в СО. В этом коде G == 119 || 87 а) Вы не должны использовать магические числа. Используйте символьные константы, такие как 'W' и т. д. б) Это выражение не делает того, что вы ожидаете. Вы хотите G=='w' || G=='W'