IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Обьясните в чем ошибка?
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Помогите разобратся где ошибка и как её решить?

Есть задача: Человек работает на работе в 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й смены, непойму только почему, неправильно записал синтаксис оператора? Спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Цитата(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, непонятно только - почему так?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
непонятно только - почему так?
В условии есть неоднозначность:
Цитата
если он сделал до 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 грн.
, тогда условия становятся однозначными.

Выбирай, по какому из этих вариантов должна начисляться з/п
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


По твоему 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;



Пасиб, разобрался.


Сообщение отредактировано: adrin -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 30.07.2025 7:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name