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

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

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

 
 Ответить  Открыть новую тему 
> Обьясните в чем ошибка?
adrin
сообщение 13.05.2012 12:36
Сообщение #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 
 К началу страницы 
+ Ответить 
adrin
сообщение 13.05.2012 13:11
Сообщение #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 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 13.05.2012 20:07
Сообщение #3


a.k.a. volvo877
*****

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

Репутация: -  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 
 К началу страницы 
+ Ответить 
adrin
сообщение 13.05.2012 21:16
Сообщение #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 - 13.05.2012 21:18
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 20.07.2025 18:42
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"