Помощь - Поиск - Пользователи - Календарь
Полная версия: Обьясните в чем ошибка?
Форум «Всё о Паскале» > 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;



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