Помощь - Поиск - Пользователи - Календарь
Полная версия: Обьясните в чем ошибка?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
adrin
Помогите разобратся где ошибка и как её решить?

Есть задача: Человек работает на работе в 3 смены, и получает з/п по бонусной системе в зависимости от того какой обьем работы он сделал за данную смену (обьем работы измеряется в метрах), оплата в укр. гривнах.
Тоисть: если он сделал до 649 метров - ему считают по 0,2 грн., если от 650-829, считают по 0,45 грн., свыше 830 по 0,6 грн. (это за смену), при чем только для 1 и 2 смены. Для 3й смены расчет должен быть таким 0-749м по 0,2 грн., 750-949 по 0,45 грн., свыше 950 по 0,6 грн. Программа должна пока что правильно считать з/п за смену путем ввода метража смены и номера смены.
Я начинаю изучать Паскаль и применил: для выбора расчета 'по какой тарифной сетке расчитывать' заработок за данную смену => оператор выбота if...then...else. Зависимость выбора расчета смены реализована оператором варианта case.

 
uses crt;

label m1,m2,m3,m4;
VAR d,a,sm: Integer; {d-день месяца, а-метраж смены,sm-# смены}
b1,b2,b3,c : Real; {Фиксированая константа оплаты,с-результат за смену}

BEGIN
clrscr;
b1:=0.2;
b2:=0.45;
b3:=0.6;
d:=1;
write (d, ' число ’);
m1: if d<=31 then goto m3 {цикл для месяца}
else goto m2;
write (’Введите метраж ’);
m3: Read (a);
m4: write ('# смены (1. .3) ’);
Readln (sm);
case sm of 1,2:
begin
if a>=650 then if a<=831 then c:=a*b2
else c:=a*b3
else c:=a*b1 end;
3:
begin
if a>=750 then if a<=951 then c:=a*b2
else c:=a*b3
else c:=a*b1 end;
else Writeln (’ Ошибка ввода смены !!! (всего 3)’);
goto m4;
end;
writeln ('Заработок за смену ',c :15:2,' грн.');
writeln;

d:=d+1;
write (d,' число');
goto m1;

m2: readln;
END.



Программа неправильно делает расчет для 3й смены 950м считает по 0,45, подозреваю что в работу не включается реализация расчета для 3й смены, непойму только почему, неправильно записал синтаксис оператора? Спасибо.
adrin
Цитата(adrin @ 13.05.2012 12:36) *


 
uses crt;

label m1,m2,m3,m4;
VAR d,a,sm: Integer; {d-день месяца, а-метраж смены,sm-# смены}
b1,b2,b3,c : Real; {Фиксированая константа оплаты,с-результат за смену}

BEGIN
clrscr;
b1:=0.2;
b2:=0.45;
b3:=0.6;
d:=1;
write (d, ' число ’);
m1: if d<=31 then goto m3 {цикл для месяца}
else goto m2;
write (’Введите метраж ’);
m3: Read (a);
m4: write ('# смены (1. .3) ’);
Readln (sm);
case sm of 1,2:
begin
if a>=650 then if a<=831 then c:=a*b2
else c:=a*b3
else c:=a*b1 end;
3:
begin
if a>=750 then if a<=951 then c:=a*b2
else c:=a*b3
else c:=a*b1 end;
else Writeln (’ Ошибка ввода смены !!! (всего 3)’);
goto m4;
end;
writeln ('Заработок за смену ',c :15:2,' грн.');
writeln;

d:=d+1;
write (d,' число');
goto m1;

m2: readln;
END.





Проблема решена путем записи в коде вместо а<=831 --> a<831, и аналогично а<=950 --> a<950, непонятно только - почему так?
IUnknown
Цитата
непонятно только - почему так?
В условии есть неоднозначность:
Цитата
если он сделал до 649 метров - ему считают по 0,2 грн., если от 650-829, считают по 0,45 грн., свыше 830 по 0,6 грн. (это за смену), при чем только для 1 и 2 смены. Для 3й смены расчет должен быть таким 0-749м по 0,2 грн., 750-949 по 0,45 грн., свыше 950 по 0,6 грн.
Ну хорошо, от 650 до 829 - по 0.45, договорились. Больше 830 - по 0.6, понятно. А если ровно 830? Ни в один ни в другой интервал не попадает, тогда как начислять? Надо быть более внимательным при выставлении подобного рода условий, и уточнять их, когда есть неоднозначные толкования.

В твоем случае имелось в виду одно из двух: или
Цитата
если он сделал до 649 метров - ему считают по 0,2 грн., если от 650-829, считают по 0,45 грн., 830 и выше по 0,6 грн. (это за смену), при чем только для 1 и 2 смены. Для 3й смены расчет должен быть таким 0-749м по 0,2 грн., 750-949 по 0,45 грн., 950 и выше по 0,6 грн.
или
Цитата
если он сделал до 649 метров - ему считают по 0,2 грн., если от 650-830, считают по 0,45 грн., свыше 830 по 0,6 грн. (это за смену), при чем только для 1 и 2 смены. Для 3й смены расчет должен быть таким 0-749м по 0,2 грн., 750-950 по 0,45 грн., свыше 950 по 0,6 грн.
, тогда условия становятся однозначными.

Выбирай, по какому из этих вариантов должна начисляться з/п
adrin
По твоему 1-ому варианту, например так:

begin
if a>=650 then if a<=829 then c:=a*b2
else c:=a*b3
else c:=a*b1 end;
3:
begin
if a>=750 then if a<=949 then c:=a*b2
else c:=a*b3
else c:=a*b1 end;



Пасиб, разобрался.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.