Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Ступенчатая запись программы

Поиск

Обратите внимание на то, на что не обращает внимания компьютер, а именно на отступы от левого края листа в записи строк программы из 5.3. Строки VAR, BEGIN и END записаны без отступа. Между словами BEGIN и END записаны четыре оператора: WriteLn, ReadLn, if и WriteLn. Все они выполняются по порядку, один за другим, поэтому каждый из них записан с одинаковым отступом. Если оператор сложный, то есть включает в себя другие операторы (мы знаем пока два таких оператора - if и составной), то составляющие его операторы записываются еще правее. Слова, составляющие пару (then и else, begin и end) записываются друг под другом.

Сделано все это для удобства чтения программы, для того, чтобы глаз мог сразу же уловить структуру программы, а именно, из каких частей состоит как сама программа, так и каждый из элементов, ее составляющих. Впрочем, вам с первого взгляда может показаться, что такая запись, наоборот, неудобна для чтения. Однако, заметьте, что ступенчатая запись принята во всем мире и глаза профессиональных программистов привыкли именно к ней. Настолько привыкли, что программа, записанная без соблюдения ступенчатого стиля, вызывает раздражение.

Конечно, допустимы и некоторые отклонения от ступенчатого стиля. Например, несколько коротких похожих операторов вполне можно записать в одну строку:

a:=0; b:=0; c:=0; f:=4;

Этим мы экономим дефицитное место по вертикали экрана или листа бумаги.

Вложенные операторы if. Сложное условие в операторе if. Логические операции

Согласно синтаксической схеме оператора if, после then и else может стоять любой оператор Паскаля, в том числе и if.

Решим задачу: В компьютер вводится число (пусть для конкретности это будет дальность какого-нибудь выстрела). Если оно находится в интервале от 28 до 30, то напечатать текст ПОПАЛ, иначе - НЕ ПОПАЛ.

Сначала составим алгоритм: Введи число. Если оно больше 28, то надо еще подумать, в противном случае печатай НЕ ПОПАЛ. А о чем же думать? А вот о чем: Если число меньше 30, то печатай ПОПАЛ, иначе печатай НЕ ПОПАЛ.

А теперь по составленному алгоритму напишем программу:

VAR a: Real;
BEGIN
ReadLn (a);
if a>28 then if a<30 then WriteLn ('ПОПАЛ')
else WriteLn ('НЕ ПОПАЛ')
else WriteLn ('НЕ ПОПАЛ')
END.

Как компьютер не запутается в этих then и else? Если внимательно присмотреться, то можно увидеть, что двусмысленная ситуация получается только тогда, когда один из if записан без else, а другой - с else. Пример:

d:=3; v:=10; if v<6 then if v<20 then d:=1 else d:=2

Чему будет равняться d после выполнения этого фрагмента - 1, 2 или 3? Ответ зависит от того, какому if принадлежит else - if v<6 или if v<20? Чтобы ответить на этот вопрос, пойдем по тексту программы от интересующего нас else к началу и если по пути нам не встретится еще один else. то первый же if, на который мы наткнемся - наш. Если по пути нам встретится еще один else, забудем пока про наш else и найдем сначала if для нового else, а со старым разберемся потом.

Испытайте-ка этот способ в нашем фрагменте и в предыдущей программе. Получается, что else в нашем примере принадлежит if v<20 и значит, d будет равняться 3.

Задание 25: Усложним задание из 5.2: В компьютер вводятся длины трех отрезков. Компьютер должен ответить на вопрос, правда ли, что эти отрезки могут образовать треугольник.

Указание: Для этого каждый отрезок должен быть меньше суммы длин двух других отрезков.

 

_____________ _ _____________

 

На первый взгляд применение if внутри if создает громоздкую, трудную для понимания программу. Однако, если вы будете аккуратно использовать ступенчатую запись, то программа получится достаточно обозримой.

В Паскале, тем не менее, есть возможность записывать многие программы со вложенными друг в друга if короче и понятнее, используя только один if. Для этого используются логические операции.

 

Задача "Разборчивая принцесса". В прихожей у принцессы - длинная очередь женихов. Принцессе нравятся только голубоглазые маленького роста. Устав принимать женихов и отбирать из них подходящих, принцесса вместо себя поставила компьютер, написав для него программу, которая говорит ВЫ МНЕ ПОДОЙДЕТЕ тем, у кого цвет глаз голубой и рост меньше 140 см. Остальным программа говорит ДО СВИДАНИЯ.

Вот эта программа:

VAR Tsvet:String; {Цвет}

Rost:Integer; {Рост}

BEGIN

WriteLn ('Каков цвет ваших глаз?');

ReadLn (Tsvet);

WriteLn ('Введите ваш рост в сантиметрах');

ReadLn (Rost);

if (Tsvet ='Голубой') AND (Rost<140) {Если цвет голубой И рост<140}

then WriteLn ('ВЫ МНЕ ПОДОЙДЕТЕ')

else WriteLn ('ДО СВИДАНИЯ')

END.

Мы видим, что условие в операторе if уже не такое простое, как мы описывали раньше, а сложное, то есть состоящее из двух взятых в скобки условий[6], соединенных знаком логической операции AND (читается "энд", переводится "и"). Весь оператор if можно прочесть так - если цвет глаз голубой И рост меньше 140 сантиметров, то печатай ВЫ МНЕ ПОДОЙДЕТЕ, иначе печатай ДО СВИДАНИЯ.

Знак логической операции AND, поставленный между двумя условиями, говорит о том, что должны выполняться сразу оба эти условия.

Поэтому наш оператор if ответит ДО СВИДАНИЯ и высоким голубоглазым и высоким неголубоглазым и маленьким неголубоглазым. И лишь маленьким голубоглазым он ответит ВЫ МНЕ ПОДОЙДЕТЕ.

 

Программа для задачи ПОПАЛ - НЕ ПОПАЛ при использовании логических операций значительно упростится:

VAR a:Real;
BEGIN
ReadLn (a);
if (a>28) AND (a<30) then WriteLn ('ПОПАЛ')
else WriteLn ('НЕ ПОПАЛ')
END.

Задача "Неразборчивая принцесса". Неразборчивой принцессе нравятся все маленькие независимо от цвета глаз и все голубоглазые независимо от роста. Программа неразборчивой принцессы будет отличаться от программы разборчивой одним единственным знаком логической операции:

if (Tsvet ='Голубой') OR(Rost<140) {Если цвет голубой ИЛИрост<140}

Знак логической операции OR читается "о", переводится "или".

Поставленный между двумя условиями, знак OR говорит о том, что достаточно, если будет выполняться хотя бы одно из них.

Поэтому теперь оператор if ответит ВЫ МНЕ ПОДОЙДЕТЕ и высоким голубоглазым и маленьким голубоглазым и маленьким неголубоглазым. И лишь высоким неголубоглазым он ответит ДО СВИДАНИЯ.

Знаками AND и OR можно объединять сколько угодно условий. Например:

if (a>2) OR (x=b) OR (c<>1) then k:=99 else k:=33

Здесь выполнится оператор k:=99, если верно хотя бы одно из трех условий, и лишь когда все три неверны, будет выполняться оператор k:=33.

Кроме логических операций AND и OR применяется еще логическая операция NOT (читается "нот", переводится "не"). Запись if NOT(a>b) then... переводится так - ЕСЛИ НЕПРАВДА, ЧТО a больше b, ТО.... Вот фрагмент:

a:=2; b:=3; if NOT(a>b) then k:=1 else k:=0

Здесь выполнится оператор k:=1, так как неправда, что 2>3.

 

Для простоты примем правило, что условия, к которым применяются логические операции, заключаются в круглые скобки, хотя это не всегда обязательно.

Внутри скобок можно писать не только простые, но и сложные условия. Например, фрагмент if NOT ((a>2) AND (b>3)) AND (s>8)) then... можно перевести так - если неправда, что одновременно верны три условия - a>2, b>3, s>8, то...

Примеры:

ФРАГМЕНТ РЕЗУЛЬТАТ
a:=8; b:=6; if (a>b) AND (b>7) then k:=1 else k:=0 k=0
a:=8; b:=6; if (a>b) OR (b>7) then k:=1 else k:=0 k=1
a:=8; b:=6; if (a<b) OR (b>7) then k:=1 else k:=0 k=0
a:=8; b:=6; if NOT (a=8) then k:=1 else k:=0 k=0

Задание 26: "Замысловатая принцесса". Определите, кто нравится принцессе, по фрагменту из ее программы:

if (Tsvet ='Черный') AND ((Rost<180) OR (Rost>184))

then WriteLn ('ВЫ МНЕ ПОДОЙДЕТЕ')

else WriteLn ('ДО СВИДАНИЯ')

 

До сих пор мы применяли оператор if для выбора одной из двух возможностей. Покажем, как применять его для выбора одной из нескольких. Усложним нашу задачу про ПОПАЛ - НЕ ПОПАЛ:

Человек вводит в компьютер число. Если оно находится в интервале от 28 до 30, то нужно напечатать текст ПОПАЛ, если оно больше или равно 30 - то ПЕРЕЛЕТ, если оно находится на отрезке от 0 до 28, то НЕДОЛЕТ, если число меньше нуля - НЕ БЕЙ ПО СВОИМ.

Вот программа:

VAR a: Real;

BEGIN

ReadLn (a);

if (a>28) AND (a<30) then WriteLn ('ПОПАЛ');

if a>=30 then WriteLn ('ПЕРЕЛЕТ');

if (a>=0) AND (a<=28) then WriteLn ('НЕДОЛЕТ');

if a<0 then WriteLn ('НЕ БЕЙ ПО СВОИМ')

END.

Необходимо обращать внимание на аккуратную расстановку знаков сравнения и числовых границ диапазонов. Если во втором if вместо a>=30 мы напишем a>=20, то при вводе числа 25 компьютер даст нам двусмыс­ленный ответ:

ПЕРЕЛЕТ
НЕДОЛЕТ

Если же мы вместо a>=30 напишем a>30, то при вводе числа 30 мы вообще не получим от компьютера никакого ответа.

Задание 27:

Человек вводит с клавиатуры строку, смысл которой - приветствие при встрече. Компьютер тоже должен ответить приветствием. Отвечать нужно в соответствии со следующей таблицей:

ПРИВЕТСТВИЕ ЧЕЛОВЕКА ОТВЕТ КОМПЬЮТЕРА
Привет Привет
Здравствуйте Здравствуйте
Здорово Здравствуйте
Добрый день Салют
Приветик Салют
Салют Салют
Здравия желаю Вольно

 

Символьный тип данныхChar

Для того, чтобы получить более полное представление о возможностях оператора варианта case, который нам предстоит изучить, познакомимся сначала с новым типом данных. Мы с вами уже познакомились с четырьмя типами данных в Паскале: Integer и LongInt (целые числа), Real (вещественные числа) и String (строки символов). Введем еще один тип - Char(символьный). По-английски Char читается - "кэр", это сокращение от Character - "символ".

Описание VAR a,b: Char означает, что переменные a иbимеют право принимать значения любых символов, с которыми может работать компьютер. (О символах мы говорили в 3.5) Мы можем записать a:='Л'; b:='+', что означает приказ присвоить переменной a значение символа Л, а переменной b- значение символа +. Мы можем записать ReadLn (a), что означает приказ компьютеру ждать ввода с клавиатуры любого одного символа и присвоить его значение переменной a. Мы можем записать WriteLn (b) и на экране появится плюсик.

Вот программа, переворачивающая любое трехбуквенное слово, введенное человеком с клавиатуры:

VAR c1,c2,c3: Char;
BEGIN
ReadLn (c1,c2,c3);
WriteLn (c3,c2,c1)
END.

Если мы по оператору ReadLn введем символы ТОК, то оператор WriteLn напечатает КОТ. При вводе нескольких символов одним оператором ReadLn, все символы набираются на клавиатуре подряд, без пробелов, которыми мы привыкли разделять при вводе числовые данные. После ввода последнего символа нажимаем клавишу Enter. Таким образом, ввод трех символов одним оператором ReadLn не отличается от ввода одной трехсимвольной строки. Вообще, тип Char похож на тип String. Строка состоит из символов, да и сам символ - это как бы очень короткая строка длиной в один символ.

5.7. Оператор вариантаcase

В Паскале есть специальный оператор, который позволяет делать выбор одной из нескольких возможностей. Рассмотрим программу, спрашивающую у ученика его отметку по чистописанию и реагирующую на нее подходящим текстом:

VAR Otmetka: Integer;

Begin

WriteLn ('Какую отметку ты получил по чистописанию?');

ReadLn (Otmetka);

CASE otmetka OF {Перевод: В СЛУЧАЕ ЕСЛИ отметка РАВНА...}

1,2:WriteLn('Кошмар!');
3:WriteLn('Неважно');

4:WriteLn('Неплохо');
5:WriteLn('Молодец!');

ELSE WriteLn('Таких отметок не бывает')

END {Конец оператора CASE}

End.

Основой программы является оператор варианта CASE (читается "кэйс", переводится "случай"). Предлог OF читается "эв". Весь оператор CASE нужно понимать так:

В СЛУЧАЕ ЕСЛИ отметка РАВНА

1 или 2 печатай 'Кошмар!'

3 печатай 'Неважно'

4 печатай 'Неплохо'

5 печатай 'Молодец!'

ИНАЧЕ печатай 'Таких отметок не бывает'

КОНЕЦ оператора case

В процессе исполнения оператора case компьютер сравнивает значение переменной Otmetka по очереди со всеми значениями, перечисленными перед двоеточиями. Наткнувшись на совпадающее значение, он выполняет оператор, стоящий после двоеточия. На этом исполнение оператора case завершается. Если же совпадающего значения так и не нашлось, то выполняется оператор, стоящий после слова else (в нашей программе он полезен на тот случай, если ученик болен манией величия и вводит число 6). После else может стоять и цепочка операторов, записанных через точку с запятой.

Если вы еще недостаточно хорошо поняли логику оператора case, то обратите внимание на то, что в нашей программе он работает так же, как следующий оператор if:

if (Otmetka=1) OR (Otmetka=2)
then WriteLn('Кошмар!')
else if Otmetka=3
then WriteLn('Неважно')
else if Otmetka=4
then WriteLn('Неплохо')
else if Otmetka=5
then WriteLn('Молодец!')
else WriteLn('Таких отметок не бывает')

У оператора case есть существенное ограничение - переменная, стоящая после слова case, должна быть так называемого порядкового типа. Подробно о порядковых типах мы поговорим в Глава 12, пока же мы знаем три типа, относящиеся к порядковым - это Integer, LongInt и Char. Порядковыми они называются потому, что все их возможные значения можно выстроить по порядку и перечислить с начала до конца: -32768,....4,5,6,7,8... 32767 для Integer,.....'д','е','ж','з','и'.... для Char. Получается, что значения типов Real и String применять в операторе case нельзя, так как совершенно непонятно, как их перечислять по порядку.

Таким образом, задачу про ПОПАЛ-НЕ ПОПАЛ в принципе невозможно решить при помощи case. И этому две причины: 1)переменная имеет тип Real, 2)перед двоеточием в операторе case нельзя писать условия со знаками >, < и т.п.

Вот еще пример программы с оператором case:

VAR a,k: Integer;

Begin

a:=3;

case a*a+1 of {В СЛУЧАЕ ЕСЛИ a*a+1 РАВНО...}

8,3,20:k:=0;

7,10: begin k:=1; WriteLn(k) end;

12..18:k:=3

end {Конец оператора CASE}

End.

Эта программа напечатает 1. Здесь мы видим несколько новых для нас элементов:

Во-первых, после слова case стоит не переменная, а выражение, поэтому с перечисленными перед двоеточиями значениями будет сравниваться число 10, полученное как 3*3+1. Кстати, выражение тоже обязано быть порядкового типа (о том, что такое тип выражения, мы строго поговорим в 14.4, а сейчас скажем только, что это выражение, имеющее значения порядкового типа).

Во-вторых, один из операторов, стоящих после двоеточий, составной. Это begin k:=1; WriteLn(k) end

В-третьих - конструкция 12..18. Она обозначает то же, что и 12,13,14,15,16,17,18. Она служит в нашем случае для сокращения записи и называется диапазоном.

В-четвертых, здесь отсутствует конструкция else. Это значит, что если бы в нашей программе мы вместо a:=3 написали a:=0, то оператор case, не найдя совпадения, не выбрал бы ни один из трех своих вариантов и, не найдя также else, завершил бы свою работу, так ничего и не сделав.

Задание 28:

Ученик вводит с клавиатуры букву русского алфавита. Компьютер должен сказать, какая это буква - гласная, согласная звонкая, согласная глухая или другая какая-нибудь (можно и НЕ ЗНАЮ).

Задание 29: «Калькулятор». Ученик вводит с клавиатуры число, символ арифметического действия (+, -, *, /) и еще одно число. Компьютер должен напечатать результат. Указание: Используйте три оператора ReadLn.



Поделиться:


Последнее изменение этой страницы: 2016-07-11; просмотров: 332; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.106.30 (0.008 с.)