Ошибка в простой задаче: пишет ожидался оператор, а встретил else
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, по моей блок-схеме все верно, разделы операторов вроде все на месте, в чем может быть ошибка? Или у меня косоглазие просто?
Отслеживать
81.4k 9 9 золотых знаков 78 78 серебряных знаков 136 136 бронзовых знаков
Условное ветвление: if, ‘?’
Иногда нам нужно выполнить различные действия в зависимости от условий.
Для этого мы можем использовать инструкцию if и условный оператор ? , который также называют оператором «вопросительный знак».
Инструкция «if»
Инструкция if(. ) вычисляет условие в скобках и, если результат true , то выполняет блок кода.
let year = prompt('В каком году была опубликована спецификация ECMAScript-2015?', ''); if (year == 2015) alert( 'Вы правы!' );
В примере выше, условие – это простая проверка на равенство ( year == 2015 ), но оно может быть и гораздо более сложным.
Если мы хотим выполнить более одной инструкции, то нужно заключить блок кода в фигурные скобки:
if (year == 2015)
Мы рекомендуем использовать фигурные скобки <> всегда, когда вы используете инструкцию if , даже если выполняется только одна команда. Это улучшает читаемость кода.
Преобразование к логическому типу
Инструкция if (…) вычисляет выражение в скобках и преобразует результат к логическому типу.
Давайте вспомним правила преобразования типов из главы Преобразование типов:
- Число 0 , пустая строка «» , null , undefined и NaN становятся false . Из-за этого их называют «ложными» («falsy») значениями.
- Остальные значения становятся true , поэтому их называют «правдивыми» («truthy»).
Таким образом, код при таком условии никогда не выполнится:
if (0) < // 0 is falsy . >
…а при таком – выполнится всегда:
if (1) < // 1 is truthy . >
Мы также можем передать заранее вычисленное в переменной логическое значение в if , например так:
let condition = (year == 2015); // преобразуется к true или false if (condition)
Блок «else»
Инструкция if может содержать необязательный блок «else» («иначе»). Он выполняется, когда условие ложно.
let year = prompt('В каком году была опубликована спецификация ECMAScript-2015?', ''); if (year == 2015) < alert( 'Да вы знаток!' ); >else < alert( 'А вот и неправильно!' ); // любое значение, кроме 2015 >
Несколько условий: «else if»
Иногда нужно проверить несколько вариантов условия. Для этого используется блок else if .
let year = prompt('В каком году была опубликована спецификация ECMAScript-2015?', ''); if (year < 2015) < alert( 'Это слишком рано. ' ); >else if (year > 2015) < alert( 'Это поздновато' ); >else
В приведённом выше коде JavaScript сначала проверит year < 2015 . Если это неверно, он переходит к следующему условию year >2015 . Если оно тоже ложно, тогда сработает последний alert .
Блоков else if может быть и больше. Присутствие блока else не является обязательным.
Условный оператор „?“
Иногда нам нужно определить переменную в зависимости от условия.
let accessAllowed; let age = prompt('Сколько вам лет?', ''); if (age > 18) < accessAllowed = true; >else < accessAllowed = false; >alert(accessAllowed);
Так называемый «условный» оператор «вопросительный знак» позволяет нам сделать это более коротким и простым способом.
Оператор представлен знаком вопроса ? . Его также называют «тернарный», так как этот оператор, единственный в своём роде, имеет три аргумента.
let result = условие ? значение1 : значение2;
Сначала вычисляется условие : если оно истинно, тогда возвращается значение1 , в противном случае – значение2 .
let accessAllowed = (age > 18) ? true : false;
Технически, мы можем опустить круглые скобки вокруг age > 18 . Оператор вопросительного знака имеет низкий приоритет, поэтому он выполняется после сравнения > .
Этот пример будет делать то же самое, что и предыдущий:
// оператор сравнения "age > 18" выполняется первым в любом случае // (нет необходимости заключать его в скобки) let accessAllowed = age > 18 ? true : false;
Но скобки делают код более простым для восприятия, поэтому мы рекомендуем их использовать.
На заметку:
В примере выше вы можете избежать использования оператора вопросительного знака ? , т.к. сравнение само по себе уже возвращает true/false :
// то же самое let accessAllowed = age > 18;
Несколько операторов „?“
Последовательность операторов вопросительного знака ? позволяет вернуть значение, которое зависит от более чем одного условия.
let age = prompt('Возраст?', 18); let message = (age < 3) ? 'Здравствуй, малыш!' : (age < 18) ? 'Привет!' : (age < 100) ? 'Здравствуйте!' : 'Какой необычный возраст!'; alert( message );
Поначалу может быть сложно понять, что происходит. Но при ближайшем рассмотрении мы видим, что это обычная последовательная проверка:
- Первый знак вопроса проверяет age < 3 .
- Если верно – возвращает 'Здравствуй, малыш!' . В противном случае, проверяет выражение после двоеточия „:“, вычисляет age < 18 .
- Если это верно – возвращает 'Привет!' . В противном случае, проверяет выражение после следующего двоеточия „:“, вычисляет age < 100 .
- Если это верно – возвращает 'Здравствуйте!' . В противном случае, возвращает выражение после последнего двоеточия – 'Какой необычный возраст!' .
Вот как это выглядит при использовании if..else :
if (age < 3) < message = 'Здравствуй, малыш!'; >else if (age < 18) < message = 'Привет!'; >else if (age < 100) < message = 'Здравствуйте!'; >else
Нетрадиционное использование „?“
Иногда оператор «вопросительный знак» ? используется в качестве замены if :
let company = prompt('Какая компания создала JavaScript?', ''); (company == 'Netscape') ? alert('Верно!') : alert('Неправильно.');
В зависимости от условия company == 'Netscape' , будет выполнена либо первая, либо вторая часть после ? .
Здесь мы не присваиваем результат переменной. Вместо этого мы выполняем различный код в зависимости от условия.
Не рекомендуется использовать оператор вопросительного знака таким образом.
Несмотря на то, что такая запись короче, чем эквивалентная инструкция if , она хуже читается.
Вот, для сравнения, тот же код, использующий if :
let company = prompt('Какая компания создала JavaScript?', ''); if (company == 'Netscape') < alert('Верно!'); >else
При чтении глаза сканируют код по вертикали. Блоки кода, занимающие несколько строк, воспринимаются гораздо легче, чем длинный горизонтальный набор инструкций.
Смысл оператора «вопросительный знак» ? – вернуть то или иное значение, в зависимости от условия. Пожалуйста, используйте его именно для этого. Когда вам нужно выполнить разные ветви кода – используйте if .
Задачи
if (строка с нулём)
важность: 5
Выведется ли alert ?
if ("0")
Да, выведется.
Любая строка, кроме пустой (а строка "0" – не пустая), в логическом контексте становится true .
Можно запустить и проверить:
if ("0")
Название JavaScript
важность: 2
Используя конструкцию if..else , напишите код, который будет спрашивать: „Какое «официальное» название JavaScript?“
Если пользователь вводит «ECMAScript», то показать: «Верно!», в противном случае – отобразить: «Не знаете? ECMAScript!»
Перед инструкциями Else If, Else или End должен быть соответствующий оператор If
Else If, Else и End If являются директивами условной компиляции. Эта ошибка имеет следующие причину и решение:
#elseif Обнаружен объект , #else или #endif , которому не предшествует соответствующее #if предложение. Проверьте, отделен ли предполагаемый #if объект от соответствующего предложения промежуточным блоком или перед предполагаемым #if знаком ( # ). Если все остальное в порядке, поместите #if предложение в соответствующее положение.
Для получения дополнительной информации выберите необходимый элемент и нажмите клавишу F1 (для Windows) или HELP (для Macintosh).
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Обратная связь
Были ли сведения на этой странице полезными?
Обратная связь
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.
Отправить и просмотреть отзыв по
Когда перед else не ставится знак
страницы: 1 2 3
Операторы ветвления: if и case. Массивы: описание и использование. Операторы цикла: for, while и repeat. Прерывание циклов: break, continue и goto.
Операторы ветвления
К операторам, позволяющим из нескольких возможных вариантов выполнения программы (ветвей) выбрать только один, относятся if и case .
Условный оператор if
Оператор if выбирает между двумя вариантами развития событий:
if then [else ];
Обратите внимание, что перед словом else (когда оно присутствует, конечно же) символ «;» не ставится — ведь это разорвало бы оператор на две части.
Условный оператор if работает следующим образом:
- Сначала вычисляется значение — это может быть любое выражение, возвращающее значение типа Boolean .
- Затем, если в результате получена «истина» (True), то выполняется оператор, стоящий после ключевого слова then, а если «ложь» (False) — без дополнительных проверок выполняется оператор, стоящий после ключевого слова else . Если же else –ветвь отсутствует, то не выполняется ничего.
Что же произойдёт, если написать несколько вложенных операторов if ?
В случае, когда каждый оператор if имеет собственную else –ветвь, всё будет в порядке. А вот если некоторые из них этой ветви не имеют, может возникнуть ошибка. Компилятор языка Pascal всегда считает, что else относится к самому ближнему оператору if . Таким образом, если написать
if i > 0 then
if s > 2 then
s := 1
else
s := - 1 ;
подразумевая, что else –ветвь относится к внешнему оператору if , то компилятор всё равно воспримет эту запись как
if i > 0 then
if s > 2 then
s := 1
else s := - 1 ;
Ясно, что таким образом правильного результата получить не удастся.
Для того чтобы избежать подобных ошибок, стоит всегда (или, по крайней мере, при наличии нескольких вложенных условных операторов) вкладывать внутренние операторы в блок begin .. end . Так вы застрахуетесь от одной из частых «ошибок по невнимательности», которые очень сложно найти в процессе отладки программы.
Итак, исходный вариант нужно переписать следующим образом:
if i > 0 then
begin
if s > 2 then
s := 1 ;
end
else
s := - 1 ;
Вообще же, если есть возможность переписать несколько вложенных условных операторов как один оператор выбора , это стоит сделать.
Оператор выбора case
Оператор case позволяет сделать выбор между несколькими вариантами:
case of : ; [ : ;] [ : ;] [else ;] end;
Замечание: Обратите внимание, что после else двоеточие не ставится.
Существуют дополнительные правила, относящиеся к структуре этого оператора:
- Переключатель должен относиться только к порядковому типу данных , но не к типу LongInt .
- Переключатель может быть переменной или выражением.
- Список констант может задаваться как явным перечислением, так и интервалом или их объединением.
- Повторение констант не допускается.
- Тип переключателя и типы всех констант должны быть совместимыми 1 .
Пример оператора выбора:
case symbol (* : Char *) of
'a' .. 'z' , 'A' .. 'Z' : WriteLn ( 'Это латинская буква' ) ;
'а' .. 'я' , 'А' .. 'Я' : WriteLn ( 'Это русская буква' ) ;
'0' .. '9' : WriteLn ( 'Это цифра' ) ;
' ' , #10 , #13 , #26 : WriteLn ( 'Это пробельный символ' ) ;
else WriteLn ( 'Это служебный символ' ) ;
end ;
Выполнение оператора case происходит следующим образом:
- вычисляется значение переключателя;
- полученный результат проверяется на принадлежность к тому или иному списку констант;
- если такой список найден, то дальнейшие проверки уже не производятся, а выполняется оператор, соответствующий выбранной ветви, после чего управление передаётся оператору, следующему за ключевым словом end , которое закрывает всю конструкцию case .
- если подходящего списка констант нет, то выполняется оператор, стоящий за ключевым словом else . Если else –ветви нет, то не выполняется ничего.
Иллюстрация if и case
В качестве примера, иллюстрирующего использование операторов ветвления , приведём несколько различных реализаций функции Sgn(x) 2 — знак числа х. Из математики известно, что эта функция имеет следующие значения:
Sgn(x) = -1, если x < 0; Sgn(x) = 0, если x = 0; Sgn(x) = 1, если x >0.
Реализовать эту функцию для случая, когда х вещественное, можно следующими способами (при условии, что x : Real ; Sgn : -1 .. 1;):