помогите уменьшить код на си
Написать логическое выражение для определения стоимости переговоров, если стоимость с 22 часов до 8 часов на 20% ниже, а в субботу и воскресенье дополнительно предоставляется скидка 10% (в сумме 30%). Использовать данные – t (время начала разговора от 0 до 23 часов), dt (продолжительность разговора в минутах), s (стоимость минуты разговора), d (день недели от 1 до 7). Примечание. Продолжительность разговора может быть сколь угодно большой. Допустим, разговор начался в пятницу в 15:00, а закончился в субботу в 23:00. Тогда во время разговора скидка менялась несколько раз: день буднего дня – нет скидки, ночь буднего – скидка 20%, ночь выходного – скидка 30%, потом день выходного – скидка 10%, потом ночь выходного – скидка 30%. Программа должна это учитывать.
Написала такой код, он работает, но как его уменьшить?
#include <stdio.h>
int main(void)
{
int s,dt,t,d;
float sum;
printf("введите время начала разговора от 0 до 23 часов \n");
scanf("%d", &t);
printf("введите продолжительность разговора в минутах \n");
scanf("%d", &dt);
printf("стоимость минуты разговора \n");
scanf("%d", &s);
printf("день недели от 1 до 7 \n");
scanf("%d", &d);
sum=0;
while (dt!=0)
{
if (((t>=9) && (t<22)) && (d<6))
{
if (dt>60)
{
sum=sum+(60*s);
dt=dt-60;
}
else if (dt<=60)
{
sum=sum+(s*dt);
dt=0;
}
if (t!=23) ++t;
else
{
d=d+1;
t=0;
}
}
if (((t>=22) || (t<9)) && (d<6))
{
if (dt>60)
{
sum=sum+(60*s*0.8);
dt=dt-60;
}
else if (dt<=60)
{
sum=sum+(s*dt*0.8);
dt=0;
}
if (t!=23) ++t;
else {d=d+1;
t=0;
}
}
if (((t>=22) || (t<9)) && (d>5))
{
if (dt>60)
{
sum=sum+(60*s*0.7);
dt=dt-60;
}
else if (dt<=60)
{
sum=sum+(s*dt*0.7);
dt=0;
}
if (t!=23) ++t;
else
{
d=d+1;
t=0;
}
}
if (((t>=9) && (t<22)) && (d>5))
{
if (dt>60)
{
sum=sum+(60*s*0.9);
dt=dt-60;
}
else if (dt<=60)
{
sum=sum+(s*dt*0.9);
dt=0;
}
if (t!=23) ++t;
else {d=d+1;
t=0;
}
}
}
printf("sum= %f \n",sum);
return 0;
}
Ответы (1 шт):
хм, тут 2 пути.. или функции делать или переменную добавить
чтоб уйти от повторений участка кода...
а переменную назовем, например, ДельтаСуммы DS или прирост...
можно еще контролировать правильность ввода переменных, но такой задачи не было
вот Вам для примера код, проверяйте на разных исходных данных
#include <stdio.h>
int main(void)
{
int s,dt,t,d;
float sum,ds;
printf("Введите время начала разговора от 0 до 23 часов \n");
scanf("%d", &t);
printf("Введите продолжительность разговора в минутах \n");
scanf("%d", &dt);
printf("Введите стоимость минуты разговора \n");
scanf("%d", &s);
printf("Введите день недели от 1 до 7 \n");
scanf("%d", &d);
sum=0;
for(;dt > 0;dt -= 60)
{
ds = 1; // день будни, полный тариф
if ((t >= 22) || (t < 8))
ds -= 0.2; // ночная скидка 20%
if ( d > 5 )
ds -= 0.1; // скидка выходного дня 10%
if (dt > 60)
{
ds *= 60 * s; //Дельта суммы = коэф. * полный час * стоимость
if ( ++t == 24 ) //Переход на сл. сутки
{
t = 0;
if (++d == 8)
d = 1; //Переход на сл. неделю
}
}
else
ds *= dt * s; //Дельта суммы = коэф. * остаток часа * стоимость
sum += ds;
}
printf("Стоимость разговора: %.2f \n",sum);
return 0;
}
Пример тут: IDEONE