Pascal. Ошибка в простой задаче: пишет ожидался оператор, а встретил else.
program MaxIn_3;
var
x, y, z, res: real;
begin
writeln('Введите целые числа: X, Y, Z');
readln(x, y, z);
res := x + y + z;
if (res < 1) then
begin
if (x > y) and (x <> y) then
begin
y := (y + z) / 2;
writeln('X=', x, ',', 'Y=', y, ',', 'Z=', z, '.');
end
else
begin
if (y > x) and (x <> y) then
begin
x := (y + z) / 2;
writeln('X=', x, ',', 'Y=', y, ',', 'Z=', z, '.');
end
else
begin
Writeln('X=Y,',x,'=',y);
end;
**end;// - если убрать здесь ; то пишет MaxIn_3.pas(29) : Встречено 'else', а ожидалось ';'**
**else** //вот здеся ошибка, видимо мне мозгов не хватает понять
begin
if (x>y) and (x <> y) then
begin
x:=x*y;
writeln('X=', x, ',', 'Y=', y, ',', 'Z=', z, '.');
end
else
begin
if (y>x) and (x <> y) then
begin
y:=x*y;
writeln('X=', x, ',', 'Y=', y, ',', 'Z=', z, '.');
end
else
begin
Writeln('X=Y,',x,'=',y);
end;
end;
end;
end;
end.
Среда программирования PascalABC.NET, по моей блок-схеме все верно, разделы операторов вроде все на месте, в чем может быть ошибка? Или у меня косоглазие просто?
FunduxYura 1 / 1 / 0 Регистрация: 31.07.2012 Сообщений: 32 |
||||
1 |
||||
14.09.2012, 09:10. Показов 10619. Ответов 11 Метки нет (Все метки)
Помогите! Не могу завершить прогу на Pascal ABC (да-да, тот самый). Делаю что-то вроде клавиатурного тренажёра… Код Паскаля АВС
Те символы-кракозябры — результат копирования Win1251 в UTF-8 форму, которые пропали на предварительном просмотре Код Program1.pas(46,1): Ожидался оператор Помогите, пожалуйста!
0 |
4 / 4 / 2 Регистрация: 27.07.2012 Сообщений: 59 |
|
14.09.2012, 09:20 |
2 |
Поставь ; после закрытой скобки.
0 |
1 / 1 / 0 Регистрация: 31.07.2012 Сообщений: 32 |
|
14.09.2012, 10:09 [ТС] |
3 |
Поставь ; после закрытой скобки. Строчку в исправленном виде покажи, а то я тебя не понял
0 |
vi fail 4 / 4 / 2 Регистрация: 27.07.2012 Сообщений: 59 |
||||
14.09.2012, 10:44 |
4 |
|||
0 |
Фрилансер 3417 / 2814 / 3000 Регистрация: 08.02.2012 Сообщений: 8,544 Записей в блоге: 1 |
|
14.09.2012, 13:03 |
5 |
FunduxYura, до else убери ;
0 |
FunduxYura 1 / 1 / 0 Регистрация: 31.07.2012 Сообщений: 32 |
||||||||
14.09.2012, 15:19 [ТС] |
6 |
|||||||
FunduxYura, до else убери ; Убрал, теперь этот кусок выглядит так:
Ошибка та же — 1 символ, строка 45, ожидается ; Добавлено через 5 минут
Это сама ошибка, так что — nice joke
0 |
CodeR Фрилансер 3417 / 2814 / 3000 Регистрация: 08.02.2012 Сообщений: 8,544 Записей в блоге: 1 |
||||
14.09.2012, 15:19 |
7 |
|||
FunduxYura, Да потому что если вы хотите использовать в условие больше одного оператора то надо использовать операторные скобки Begin End
0 |
FunduxYura 1 / 1 / 0 Регистрация: 31.07.2012 Сообщений: 32 |
||||||||
14.09.2012, 15:27 [ТС] |
8 |
|||||||
FunduxYura, Да потому что если вы хотите использовать в условие больше одного оператора то надо использовать операторные скобки Begin End Ой, совсем забыл про них, я просто раньше кодил на AS, JS, VB .NET, а с паскалем впервые встретился, вот и тупанул… Но теперь ругается на
Говорит, что ожидался оператор, но ругань идёт в самое начало строчки с else… Код функции, которая не должна ничего возвращать, и нужна для удобства
0 |
Фрилансер 3417 / 2814 / 3000 Регистрация: 08.02.2012 Сообщений: 8,544 Записей в блоге: 1 |
|
14.09.2012, 15:29 |
9 |
FunduxYura, ты посмотри на мой код а теперь на свой…
0 |
FunduxYura 1 / 1 / 0 Регистрация: 31.07.2012 Сообщений: 32 |
||||
14.09.2012, 15:42 [ТС] |
10 |
|||
FunduxYura, ты посмотри на мой код а теперь на свой… Спасибо, просто я уже жестоко туплю, теперь у меня ещё одна проблема… Не по теме: Я безнадёжен, да?
говорит, что = нельзя юзать с Text и string, но как мне ещё сравнивать?
0 |
Фрилансер 3417 / 2814 / 3000 Регистрация: 08.02.2012 Сообщений: 8,544 Записей в блоге: 1 |
|
14.09.2012, 16:03 |
11 |
FunduxYura, так потому что ты пытаешься переменную типа текстовый файл сравнить с типом string а чтобы понять как сравнивать надо понимать что ты хочешь сделать в проге…
0 |
1 / 1 / 0 Регистрация: 31.07.2012 Сообщений: 32 |
|
21.09.2012, 17:47 [ТС] |
12 |
Хм… Я решил проблему, но почему-то код работает ПОЛНОСТЬЮ только на PascalABC не .NET… В NET версии таймер не считает ничего…
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
21.09.2012, 17:47 |
Помогаю со студенческими работами здесь Ошибка в строке 97: «incompatible types», а в 99 ошибка: «identifier expected but ‘^’ found», как исправить? Вывести нечётные числа. Ошибка: оператор «%» невозможно применить к операнду типа «string» и «int» Поиск в массиве. Ошибка «Оператор «&&» не может применяться к операндам типа «bool» и «double»» Ошибка в коде «Ожидался оператор» Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 12 |
program ideal; uses crt; var k, n, m, t, p, x, y, z, s, l, q, a, b, c, e, i, TTT:real; d:char; soglasie, sogl, formuly, zzz:integer; function FF(a,l:real):real; Begin l:=t*100; a:=p/l; k:=a*2; FF:=k; end; Begin Write('Ваше имя и фамилия: '); readln(d); // Приветствие Writeln('Здравствуйте! Уважаемая ', d); writeln('Считаю нужным заострить ваше внимание на том, что все данные, которые вы получите при использовании этой программы являются примерными.'); Writeln('Если вы хотите пройти тест введите 1, если нет, то 0.'); write('Ваш ответ: '); readln(soglasie); if soglasie=0 then writeln('Тогда я вынужден попрощаться!'); if soglasie=1 then Write('Ваш возраст: '); readln(e); write('Обхват бюста: '); readln(k); write('Обхват талии: '); readln(n); write('Обхват бедер: '); readln(m); write('Рост: '); readln(t); write('Вес: '); readln(p); write('Размер груди: '); readln(s); write('Длинна ног: '); readln(l); write('Размер ноги: '); readln(q); x:=k*m*t; y:=n*n*p; z:=x/y; a:=s*k*p; b:=l*q; c:=a/b; i:=z/c*100; writeln('Оценка красоты: ', round(i)); write('Хотите ли узнать, какой вес и рост нормален в вашем возрасте? да = 1, нет = 0'); readln(sogl); if sogl=0 then writeln(' '); if sogl=1 then writeln('Каким способом подсчета вы хотите воспользоваться?'); writeln('"Индекс массы тела" = 1'); writeln('"При помощи таблиц" = 2'); writeln('"Рост+возраст" = 3'); writeln('Все варианты последовательно = 0'); writeln('Ваш ответ: '); readln(formuly); if formuly=1 then write('Введите данное (', k, ') число еще раз: '); readln(TTT); if TTT<=18 then writeln('Ваш вес является недостаточным.'); if (TTT>18) and (k<=25) then writeln('Ваш вес вполне нормальный. Это значит, что нет смысла его сбрасывать, но и набирать не нужно. Держите показатель на одном и том же <уровне>.'); if (TTT>25) and (k<35) then writeln('Пора уже поработать с фигуркой, так как возрастает риск появления ожирения. Худейте, но делайте это без особого фанатизма!'); if TTT>=35 then writeln('Очень жаль, но у вас:. Ожирение! Необходима помощь и консультация специалистов.'); //нормальный рост при данном возрасте writeln('Нормальный рост в вашем возрасте (', e, ') составляет: '); if e=0 then writeln('до 74 см'); if e=1 then writeln('до 86.4 см'); if e=2 then writeln('до 98 см'); if e=3 then writeln('до 101 см'); if e=4 then writeln('до 104 см'); if e=5 then writeln('до 110.5 см'); if e=6 then writeln('до 118 см'); if e=7 then writeln('до 125 см'); if e=8 then writeln('до 131.6 см'); if e=9 then writeln('до 136.5 см'); if e=10 then writeln('до 142.5 см'); if e=11 then writeln('до 148.6 см'); if e=12 then writeln('до 155 см'); if e=13 then writeln('до 160.5 см'); if e=14 then writeln('до 164 см'); if e=15 then writeln('до 167 см'); if e=16 then writeln('до 169 см'); if e=17 then writeln('до 170 см'); // Нормальный вес при данном возрасте writeln('Нормальный вес, при вашем возрасте (', e, ') '); if e=0 then writeln('до 7.9 кг'); if e=1 then writeln('до 10.2 кг'); if e=2 then writeln('до 12.2 кг'); if e=3 then writeln('до 14 кг'); if e=4 then writeln('до 18.2 кг'); if e=5 then writeln('до 20.2 кг'); if e=6 then writeln('до 22.4 кг'); if e=7 then writeln('до 25 кг'); if e=8 then writeln('до 28.2 кг'); if e=9 then writeln('до 31.9 кг'); if e=10 then writeln('до 34.9 кг'); if e=11 then writeln('до 38.9 кг'); if e=12 then writeln('до 45.4 кг'); if e=13 then writeln('до 52.5 кг'); if e=14 then writeln('до 58 кг'); if e=15 then writeln('до 60.4 кг'); if e=16 then writeln('до 61.3 кг'); if e=17 then writeln('до 61.9 кг'); // Прощание writeln('На этом вынужден проститься, в следующих версиях программы вы сможете получать советы по корректировке фигуры.'); writeln(''); writeln(' '); writeln('<br>'); writeln('Все данные не являются исключительно точными'); end.
Боюсь, вы совершенно неправильно поняли смысл логических операторов and
, or
, а not
. Они не используются со строками, но с булевыми (логическими значениями, которые являются true
или false
).
not
является унарным оператором, который возвращает true
если операнд является false
, и возвращает false
если операнд имеет значение true
. Таким образом, not true
доходность false
, а not false
доходность true
.
Например, если у вас есть логическая переменная PasswordTooSimple
(введенный пароль слишком прост), вы можете установить CanContinue := not PasswordTooSimple
где-то в вашей логике.
and
является двоичным оператором на booleans, который возвращает true
тогда и только тогда, когда оба его операнда true
. Например, CanContinue := ValidUser and not PasswordTooSimple
.
or
является двоичным оператором в буле, который возвращает true
тогда и только тогда, когда хотя бы один из его операндов истинен. Например, CanContinue := (PaymentComplete or NoncommersialVersion) and not PasswordTooSimple
.
Если PaymentComplete
, NoncommersialVersion
и PasswordTooSimple
являются false
, true
, и false
, соответственно, то, применяя эти правила, мы находим, что PaymentComplete or NoncommersialVersion
будет вычисляться true
, что not PasswordTooSimple
будет вычисляться true
, и — следовательно — все выражение (PaymentComplete or NoncommersialVersion) and not PasswordTooSimple = true and true = true
, так что CanContinue
будет true
. Например, у вас может быть btnContinue.Enabled := CanContinue
.
Кстати, теперь вы знаете, что означает компилятор, «Оператор не применим к этому типу операнда». Действительно, сообщение об ошибке пятна на: not
оператор не применит к строковым операндам.
Унарные арифметические операторы
Оператор Операция Тип операндов Тип результата
+ Подтверждение Integer Integer
знака Real Real
— Смена знака Integer Integer
Real Real
Обратите внимание: Любой операнд с типом поддиапазона или порядковым, обрабатывается, как будто он имеет перечислимый тип.
Если оба операнда операций +, -, *, Div или Mod имеют тип Integer, то результат имеет общий тип двух операндов.
Если один или оба операнда операций +, — или * имеют тип Real, то результат имеет тип Real в режиме {$N-} или Extended в режиме {$N+}.
Если операнд операторов + или — имеет целочисленный тип, то результат тоже имеет целочисленный тип. Если операнд имеет тип Real, то результат имеет тип Real или Extended.
Значение X/Y всегда имеет тип Real или Extended независимо от типов операндов. Если значение Y равно нулю, то происходит ошибка деления на нуль.
Значение I Div J — математическое частное от I / J, округленное до значения целочисленного типа. Если значение J равно нулю, то происходит ошибка деления на нуль.
Оператор Mod возвращает остаток, полученный от деления двух операндов:
I Mod J = I — (I Div J) * J
Знак результата Mod — такой же, как и знак I. Если значение J равно нулю, то происходит ошибка деления на нуль.
См. также
Лекция №2.2: Типы данных и операции