Код C- не будет выполнен, может кто-нибудь мне помочь?

Итак, я изучаю информатику (поэтому я все еще учусь), и я пытаюсь запрограммировать автомат для напитков. Дело в том, что он выполняет только первый блок 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");
        }

Добро пожаловать в СО. В этом коде G == 119 || 87 а) Вы не должны использовать магические числа. Используйте символьные константы, такие как 'W' и т. д. б) Это выражение не делает того, что вы ожидаете. Вы хотите G=='w' || G=='W'

Gerhardh 16.02.2023 15:26

И используйте double вместо float.

i486 16.02.2023 15:35
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
0
2
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, вам могут понадобиться утверждения типа if ( G == 66 || G == 98) вместо того, что у вас есть. Я не думаю, что написанный код делает то, что вы думаете.

Когда вы делаете G == 66 || 98, он сначала оценивает G == 66 (который будет оцениваться как true или false), а затем применяет это значение к 98 с помощью оператора ||, который всегда возвращает true (|| обычно применяется к логическим значениям). Он не будет проверять, равно ли G 66 или 98...

Чего именно вы ожидаете от G == 119 || 87? Угадывать синтаксис — не лучший способ учиться. Подсказка: это то же самое, что и G == (119 || 87)

klutt 16.02.2023 15:27

Не так, @klutt. Оператор == имеет более высокий приоритет, чем ||, поэтому G == 119 || 87 эквивалентен (G == 119) || 87. А так как 87 правдиво и выражение не имеет побочных эффектов, это также эквивалентно просто 1.

John Bollinger 16.02.2023 15:32

@klutt == имеет более высокий приоритет оператора, чем ||. Итак, вы получаете (G == 119) || 87... en.cppreference.com/w/c/language/operator_precedence

Ron 16.02.2023 15:36

Хорошо, спасибо, ребята. Я вижу свою ошибку сейчас. Спасибо!

HueyDuck22 16.02.2023 15:39

В C любое число, кроме 0, истинно, поэтому 87 истинно.

user253751 16.02.2023 15:48

@ Рон Ха-ха, ты прав. И я разместил комментарий не в том месте. Предполагалось перейти к вопросу, а не к ответу. Моя главная мысль заключается в том, что он не делает того, что думает OP. :)

klutt 16.02.2023 16:51

@JohnBollinger Да, это правильно. Виноват. См. выше.

klutt 16.02.2023 16:53

Проблема у вас здесь в том, что вы говорите

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. Вы должны сказать, что это не ноль.
0___________ 16.02.2023 15:38

Другие вопросы по теме