Member 14010405 Ответов: 4

Else if оператор не работает C++


Я новичок в кодировании, я не понимаю, почему еще оператор if отображает выходные данные из оператора if, несмотря на то, что он не ошибается. Если выписка должна вычесть %50, когда телефонный звонок происходит в определенное время дня, и вычесть дополнительные %15, когда телефонный звонок превышает 60. Второе утверждение должно принимать только %50, потому что условие истинно, после слишком большого количества изменений, если выход отображает обе скидки, несмотря на то, что они ниже 60.

Большое вам спасибо.

    cout << "Enter start time: ";
    cin >> startcall;
    cout << "Enter length of call in minutes: ";
    cin >>  duration;
    
    if (duration > 60 || startcall >=1800 || startcall < 800) {
       discount = (duration * rate /2)*0.15;
       grosscost = ((((duration * rate/2)-discount)) * 0.40) + (((duration * rate/2)-discount));
       netcost = grosscost;
        
    }else if(duration <60 || startcall >=1800 ||startcall <800){
        grosscost = ((duration *rate /2)*0.40) + (duration *rate/2);
        netcost = grosscost;
    }
    
    cout <<"Gross Cost: $ " <<grosscost <<endl;
    cout <<"Net cost: $ " <<netcost <<endl;
    

    return 0;

}


Что я уже пробовал:

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

спасибо

Member 14010405

s не работает после нескольких изменений

если (длительность >60 || startcall >=1800 || startcall < 800) {
скидка = (продолжительность * ставка /2)*0,15;
grosscost = ((((продолжительность * скорость/2)-скидка)) * 0.40) + (((время * скорость/2)-скидка));
netcost = grosscost;
}
иначе{если( startcall &ГТ;=1800 ||startcall &ЛТ;800 ||продолжительность &ЛТ;60){
grosscost = ((продолжительность *скорость /2)*0.40) + (продолжительность *скорость/2);
netcost = grosscost;
}
}

соиь <&ЛТ;"общая стоимость: $" &ЛТ;&ЛТ;grosscost на <<епси;
cout <<"чистая стоимость: $" <<netcost <<endl;


возвращает 0;

Введите продолжительность звонка в минутах :40
Валовая Стоимость: $ 9.52
Чистая стоимость: $ 9.52

Вот этого я и не понимаю. Он продолжает вычитать %15, несмотря на то, что он ниже 60.

Результат должен быть $11.20

11.20 - 9.52 = 1.68 (что составляет %15 при звонке более 60 минут)

спасибо за любую помощь

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

4 Ответов

Рейтинг:
36

CPallini

То, как вы написали if утверждения неверны.
Ты наверное имел ввиду (обратите внимание, вы можете с пользой для себя рефакторить такой код)

if (duration > 60 && (startcall >=1800 || startcall < 800) )
{
  discount = (duration * rate /2)*0.15;
  grosscost = ((((duration * rate/2)-discount)) * 0.40) + (((duration * rate/2)-discount));
  netcost = grosscost;

}
else if(duration < 60 && ( startcall >=1800 ||startcall <800) )
{
  grosscost = ((duration *rate /2)*0.40) + (duration *rate/2);
  netcost = grosscost;
}

Однако это всего лишь предположение, потому что вы не предоставили достаточно подробностей.


Рейтинг:
2

KarstenK

Когда вы используете отладчик, вы узнаете, что делает ваш код.

Совет: напишите какой-нибудь другой код для случая, когда else if не является истинным.

else if(duration <60 || startcall >=1800 ||startcall <800){
        grosscost = ((duration *rate /2)*0.40) + (duration *rate/2);
        netcost = grosscost;
    } else {
      //some code 
    }


Рейтинг:
1

Member 14010405

Большое спасибо, что уделили мне время. Программа работает исправно.
У меня были некоторые отсутствующие фигурные скобки, и некоторые утверждения также не были в логическом порядке. например, я вычислял grosscost и вычитал значение скидки перед вычислением скидки.

if(duration >60 && (startcall >=1800 || startcall < 800)) {
    discount = (duration * rate /2)*0.15;
    grosscost = ((((duration * rate/2)-discount)) * 0.040) + (((duration * rate/2)-discount));
    netcost = grosscost;


Рейтинг:
0

OriginalGriff

Посмотрите, что вы делаете. Я немного укорочу его, чтобы идентичные биты были более очевидны:

if (a || b || c)
   x;
else if ( d || b || c)
   y;

Вот рефакторы - просто чтобы было более очевидно, что происходит - к этому:
if (a || b || c)
   x;
else 
   if ( d || b || c)
      y;
И "||" означает "или" - если одно из условий слева или справа истинно, то все выражение истинно.
Так что если либо b или c если они истинны, то все первое условие автоматически истинно. Что означает, что если либо b или c если это правда, то условие else всегда будет ложным, и они вообще никогда не будут вносить свой вклад в это условие: код в блоке else будет выполняться только is d правдивый.

В вашем случае, единственный раз, когда else if выражение может быть выполнено, если оба b и c являются ложными: если startcall находится между 1800 и 800 годами, и это остается верным для второго теста, поэтому второй тест всегда будет справедливым duration < 60

Я бы посоветовал вам начать с повторного прочтения вопроса и применения скидки в отдельных тестах:
if (right time of day)
   {
   apply 50% discount;
   if (call is long enough)
      {
      apply extra discount;
      }
   }