Оператор null не является унарным оператором как исправить pascal

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 (да-да, тот самый). Делаю что-то вроде клавиатурного тренажёра…

Код Паскаля АВС

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
uses Timers,Events;
var tickers: real;
 
function GiveErrorBad(lolikon:Boolean):boolean;
begin
writeLn('-----------------');
writeLn('Íåñîâïàäåíèå ñ òåêñòîì! Âîçìîæíûå ïðè÷èíû:');
writeLn(' - Åñòü ãðàììàòè÷åñêèå, ïóíêòóàöèîííûå îøèáêè (òîãäà âàø IQ íå âûøå êàìíÿ, èáî òåêñò áûë ïîä ãëàçàìè...)');
writeLn(' - Åñòü ëèøíèå ïðîáåëû (ñ êåì íå áûâàåò...)');
writeLn(' - Áûëà ïîïûòêà ïîñòàâèòü àáçàö. Ýòî íå àâòîð íåãðàìîòíûé, ýòî îñîáåííîñòü Pascal ABC...');
writeLn(' - Âû íå ââîäèëè íè÷åãî, èëè ââîäèëè, íî ñîâñåì íå òî');
writeLn('Çàêðîéòå ïðîãðàììó è íà÷èíàéòå ñíà÷àëà... :(');
readLn();
end;
 
procedure f;
begin
tickers:=tickers+0.5
end;
 
var t: Timer;
 
const
  tekst='не волнует';
var
 whaticrar:Text;
 
begin
  writeLn('Ââåäè òåêñò áåç îøèáîê!');
  writeLn('Òåêñò íàõîäèòñÿ â ðàñïå÷àòàííîì âèäå ïîä âàøèì íîñîì...');
  writeLn('Ïîåõàëè? Íàæìè Enter');
  readLn();
  writeLn('Âðåìÿ ïîøëî!');
  writeLn('--------------');
  t:=Timer.Create(500,f);
  readLn(whaticrar);
  t.Stop();
  
if whaticrar=tekst then
  writeLn('-----------------');
  writeLn('Âû ïðîøëè òåñò!');
  writeLn('------------------');
  writeLn('Âðåìÿ ïðîõîæäåíèÿ:');
  writeLn(tickers + ' ñåêóíä');
else GiveErrorBad();
end.

Те символы-кракозябры — результат копирования Win1251 в UTF-8 форму, которые пропали на предварительном просмотре
Компилятор PABC.NET(решил прогнать код через него) ругается:

Код

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

Цитата
Сообщение от vi fail
Посмотреть сообщение

Поставь ; после закрытой скобки.

Строчку в исправленном виде покажи, а то я тебя не понял



0



vi fail

4 / 4 / 2

Регистрация: 27.07.2012

Сообщений: 59

14.09.2012, 10:44

4

Pascal
1
Program1.pas(46,1);



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

Цитата
Сообщение от Artem7
Посмотреть сообщение

FunduxYura, до else убери ;

Убрал, теперь этот кусок выглядит так:

Pascal
1
2
3
4
5
6
7
8
if whaticrar=tekst then
  writeLn('-----------------');
  writeLn('Вы прошли тест!');
  writeLn('------------------');
  writeLn('Время прохождения:');
  writeLn(tickers + ' секунд')
else GiveErrorBad()
end.

Ошибка та же — 1 символ, строка 45, ожидается ;

Добавлено через 5 минут

Цитата
Сообщение от vi fail
Посмотреть сообщение

Pascal
1
Program1.pas(46,1);

Это сама ошибка, так что — nice joke



0



CodeR

Фрилансер

3417 / 2814 / 3000

Регистрация: 08.02.2012

Сообщений: 8,544

Записей в блоге: 1

14.09.2012, 15:19

7

FunduxYura, Да потому что если вы хотите использовать в условие больше одного оператора то надо использовать операторные скобки Begin End

Pascal
1
2
3
4
5
6
7
8
9
10
if whaticrar=tekst then
 Begin
  writeLn('-----------------');
  writeLn('Вы прошли тест!');
  writeLn('------------------');
  writeLn('Время прохождения:');
  writeLn(tickers + ' секунд');
 End
else GiveErrorBad()
end.



0



FunduxYura

1 / 1 / 0

Регистрация: 31.07.2012

Сообщений: 32

14.09.2012, 15:27

 [ТС]

8

Цитата
Сообщение от Artem7
Посмотреть сообщение

FunduxYura, Да потому что если вы хотите использовать в условие больше одного оператора то надо использовать операторные скобки Begin End

Ой, совсем забыл про них, я просто раньше кодил на AS, JS, VB .NET, а с паскалем впервые встретился, вот и тупанул…

Но теперь ругается на

Pascal
1
2
3
4
5
6
7
8
9
10
if whaticrar=tekst then
begin
  writeLn('-----------------');
  writeLn('Вы прошли тест!');
  writeLn('------------------');
  writeLn('Время прохождения:');
  writeLn(tickers + ' секунд');
end;
else GiveErrorBad();
end.

Говорит, что ожидался оператор, но ругань идёт в самое начало строчки с else…

Код функции, которая не должна ничего возвращать, и нужна для удобства

Pascal
1
2
3
4
5
6
7
8
9
10
11
function GiveErrorBad(lolikon:Boolean):boolean;
begin
writeLn('-----------------');
writeLn('Несовпадение с текстом! Возможные причины:');
writeLn(' - Есть грамматические, пунктуационные ошибки (тогда ваш IQ не выше камня, ибо текст был под глазами...)');
writeLn(' - Есть лишние пробелы (с кем не бывает...)');
writeLn(' - Была попытка поставить абзац. Это не автор неграмотный, это особенность Pascal ABC...');
writeLn(' - Вы не вводили ничего, или вводили, но совсем не то');
writeLn('Закройте программу и начинайте сначала... :(');
readLn();
end;



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

Цитата
Сообщение от Artem7
Посмотреть сообщение

FunduxYura, ты посмотри на мой код а теперь на свой…

Спасибо, просто я уже жестоко туплю, теперь у меня ещё одна проблема…

Не по теме:

Я безнадёжен, да?

Pascal
1
2
3
if whaticrar=tekst then
 Begin
  writeLn('-----------------');

говорит, что = нельзя юзать с 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», как исправить?
var
tmp,tmp1,tmp2:point;
begin
tmp:=head;
while tmp &lt;&gt; nil do
begin
tmp1:=…

Вывести нечётные числа. Ошибка: оператор «%» невозможно применить к операнду типа «string» и «int»
Я новичок в программировании, поэтому не судите строго если тут всё говно. Нужно сделать, чтобы код…

Поиск в массиве. Ошибка «Оператор «&&» не может применяться к операндам типа «bool» и «double»»
Найти номер последнего минимального элемента среди положительных четных элементов, лежащих правее…

Ошибка в коде «Ожидался оператор»
Program gKKMMf;
var b,s,x,h:real;
begin
repeat
Write(‘Vvedite konez otrezka b’);
Read(b);…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

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: Типы данных и операции

Понравилась статья? Поделить с друзьями:
  • Как составить программу для микроконтроллера
  • Как найти playstation network
  • Как правильно составить проект бизнеса
  • Как на компьютере найти символы на клавиатуре
  • Как мне найти покупателя на сахар