Текст книги "Песни о Паскале (СИ)"
Автор книги: Олег Деревенец
Жанр:
Драматургия
сообщить о нарушении
Текущая страница: 3 (всего у книги 29 страниц)
Рис.20 – Сообщение о синтаксической ошибке
В чем дело? Компилятор утверждает, что где-то пропущена точка с запятой. В скобках указано место ошибки: третья строка, первый символ. Значит, точку с запятой надо ставить здесь? И зачем она нужна?
Познакомьтесь с важным понятием языка – оператором. Оператор – это наименьший смысловой «кусочек» программы. Он заключает в себе либо небольшое действие – шаг программы, либо описание каких-то данных. В Паскале есть много разных операторов, процедура печати – один из них. В целом программа – это последовательность операторов и ключевых слов. Читая программу, компилятор должен уяснить, где кончается один оператор и начинается следующий. И здесь он нуждается в вашей помощи! Ему нужна подсказка – разделитель операторов, которым служит точка с запятой (;).
Вернемся к нашей программе. Хотя процедуры печати расположены в разных строках, этого мало, чтобы компилятор воспринял их как отдельные операторы. Порой длинный оператор не помещается в одной строке и пишется на нескольких. А бывает наоборот – в одной строке пишут несколько операторов. Вот почему нужен разделитель.
Итак, между операторами надо поставить точку с запятой, программисты обычно ставят разделитель после оператора. Теперь наша программа станет такой.
begin
Writeln(’–’);
Writeln(’Мой повелитель!’);
Writeln(’Поздравляю тебя с первой программой!’);
Writeln(’Твой верный слуга Паскаль’);
Writeln(’–’)
end.
А где разделитель за последним оператором, то есть перед словом END? Здесь он не нужен, поскольку END – не оператор, а ключевое слово. Но, если вы поставите лишнюю точку с запятой или даже несколько подряд, в этом не будет ошибки. Теперь можно запустить программу нажатием Ctrl+F9 и полюбоваться на результат её работы, нажав Alt+F5.
Программа, стой!
Как хотите, а мне надоело всякий раз нажимать сочетание Alt+F5 для того лишь, чтобы увидеть результат. Пора избавиться от этого неудобства.
Познакомьтесь с новой процедурой, она называется ReadLn. Это слово, как и слово Writeln, тоже состоит из двух: Read – «чтение», Line – «линия, строка», что значит «чтение строки». Действует процедура ReadLn очень просто: дойдя до её исполнения, компьютер остановится в ожидании, пока вы не нажмете клавишу Enter. Вот и все. И пока он ждет, вы спокойно разглядываете консольное окно. Ясно? Тогда подскажите, где поместить эту процедуру? Ну, очевидно же – самым последним оператором! В результате получим новый вариант программы.
begin
Writeln(’–’);
Writeln(’Мой повелитель!’);
Writeln(’Поздравляю тебя с написанием первой программы!’);
Writeln(’Твой верный слуга Паскаль’);
Writeln(’–’);
Readln
end.
Про точку с запятой не забыли? Отлично! Запускаем программу и убеждаемся, что Паскаль нас снова не подвел (не забудьте нажать Enter!).
Алгоритмы
Взгляните на программу ещё разок: печатая строки, компьютер выполняет отдельные действия – шаги программы. Такую последовательность шагов называют алгоритмом. Вам следует привыкнуть к этому слову, ведь алгоритм – основное понятие в программировании. Вот слегка упрощенное определение алгоритма, запишите: «Алгоритм – это точное предписание исполнителю совершить определенную последовательность действий для достижения поставленной цели за конечное число шагов». Под исполнителем мы понимаем компьютер.
В этом определении угадывается что-то знакомое, не так ли? Ещё бы! То и дело мы получаем указания: сделай то, да сделай это. За что ни возьмись, надо выполнять некий алгоритм. Так, например, одеваясь на улицу, вы соображаете, что и за чем следует напялить на себя: сначала белье, затем рубашку, брюки, носки и ботинки. Даже при ходьбе выполняем простейший алгоритм: левой, правой, левой, правой…
Разбивая сложное действие на ряд простых шагов, вы создаете алгоритм. Алгоритм нашей программы состоит из шагов, выполняемых друг за другом, последовательно. Линейная последовательность – это одна из трех базовых управляющих структур, на которых строится вся гигантски сложная архитектура современных программ (о двух других базовых управляющих структурах я расскажу позднее).
Блок-схемы
Как видите, с алгоритмами связан любой из нас, а не только программисты. Создание напичканных компьютерами сложных систем – заводов, электростанций и тому подобного – требует согласованных усилий специалистов разных профессий. Они объясняют программистам требования к создаваемым системам. Иными словами, эти специалисты заказывают алгоритмы. Увы, не все они владеют программированием. Как быть?
Кто-то догадался изображать алгоритмы графическими схемами, картинками. Этот прием оказался наглядным и понятным даже людям, далеким от программирования. Блок-схемы – так называют эти картинки – стали средством общения между специалистами разных профессий с одной стороны, и программистами с другой.
Впрочем, программисты и между собой общаются посредством блок-схем. Эти схемы помогают обнаружить ошибки в программах. В чем отличие блок-схемы программы от её текста? Текст показывает то, что фактически делает программа, а блок-схема – то, что она должна делать. Сравнивая одно с другим, можно найти ошибки в программном воплощении алгоритма.
Перед вами блок-схемы трех созданных нами программ (рис. 21).
Рис.21 – Блок-схемы программ
Скругленные прямоугольники означают начало и конец алгоритма, – они соответствуют ключевым словам BEGIN и END. Исполняемые операторы – это прямоугольники с пояснениями внутри, а стрелки показывают порядок выполнения операторов. Все просто! Скоро мы изучим другие базовые управляющие структуры, и вы увидите их блок-схемы.
Итоги
• Наименьшая смысловая часть программы называется оператором. Процедура печати Writeln и процедура ввода Readln – это операторы.
• Программа – это последовательность ключевых слов и операторов.
• Для разделения операторов используют точку с запятой.
• Точное предписание порядка выполняемых действий называется алгоритмом.
• Линейная последовательность – это один из трех базовых алгоритмов.
• Алгоритм может быть представлен словесным описанием, рисунком (блок-схемой), или текстом программы.
А слабо?
А) В нашей программе остался маленький изъян. Со временем вы забудете о том, что для завершения программы надо нажать клавишу Enter. Пусть программа сама напомнит об этом, печатая после приветствия напоминание:
Для завершения программы нажмите Enter
Внесите это изменение в программу. Или слабо?
Б) Измените программу так, чтобы в каждой строке разместилось по два оператора. Откомпилируйте и проверьте программу в действии. Изменилось ли что-то в её поведении?
В) Нарисуйте две блок-схемы, поясняющие, как вы обычно проводите свой будний и выходной день.
Глава 8
Постоянные и переменные
Знаком ли вам Эдсон Арантес ду Насименту? Неужто не слышали о великом Пеле? Ведь оба имени принадлежат одному человеку! В Бразилии полно отменных футболистов, и у всех – пышные имена. Но от футбольных комментаторов вы их не услышите. Бразильцы – а все они фанаты – дали своим любимцам короткие клички. Так на весь мир прославились Пеле, Зико, Ривалдо…
Константы
Придумка бразильских фанатов напомнила решение сходной проблемы программистами. В разных частях программы нередко попадаются одни и те же данные – строчки текста или числа. Взять хотя бы предыдущую программу, где в начале и в конце приветствия печатаются две горизонтальные черты. Если в этих операторах задать линии разной длины, то красота слегка пострадает. Пустяки? Конечно. Но в иных случаях ошибочка обойдется втридорога, например, в программе управления ракетой.
Предположим, что в расчете полета ракеты учитывается масса её полезной нагрузки, и это число разбросано по всем частям программы. Вы должны указать его везде одинаково, без ошибки, иначе ракета улетит «за бугор». А если переделка ракеты повлечет изменение этого числа? Тогда доведется тщательно «прочесать» программу в поисках всех исправляемых операторов.
Проблема очевидна, но Паскаль даёт средство её решения – это символические константы. «Константа» в переводе на русский означает «постоянный», «неизменный». Константа подобна кличке бразильского футболиста: любому элементу данных – числу или строке – вы можете назначить удобное имя, а затем подставлять это имя вместо самих данных. Покажем это на примере нашей программы.
Прежде, чем применить символическую константу, её надо объявить, то есть дать ей имя и значение. Для объявления используют ключевое слово CONST, за которым следует нечто, похожее на простую формулу.
const Имя_константы = Значение_константы;
Слева от знака равенства указывают имя константы, а справа – её значение. Предположим, что длинный прочерк я обозначил словом Line – «линия». Тогда объявление константы для линии будет таким.
const Line = ’–’;
Обратите внимание, что объявление константы – это оператор, и после него следует точка с запятой! Теперь в любом месте программы я могу напечатать прочерк, пользуясь именем этой константы.
Writeln(Line);
Параметром процедуры печати Writeln здесь по-прежнему является всё та же строковая константа, только теперь она обозначена через свое имя Line.
Слово CONST открывает секцию объявления констант, внутри которой надо объявить хотя бы одну константу, – секция не терпит пустоты! Вот объявление двух констант, где для наглядности слово CONST записано в отдельной строке.
Const
C1 = ’Мой повелитель!’;
Pele = ’Эдсон Арантес ду Насименту’;
Секцию констант располагают до слова BEGIN перед началом выполняемых операторов. Следовательно, новый вариант нашей программы будет таким.
const
Line = ’–’;
begin
Writeln(Line);
Writeln(’Мой повелитель!’);
Writeln(’Поздравляю тебя с написанием первой программы!’);
Writeln(’Твой верный слуга Паскаль’);
Writeln(Line);
Readln
end.
Программа будет работать точь-в-точь, как и раньше. Но теперь мы уверены, что линии будут одинаковыми. А если потребуется изменить линию и составить её из звездочек? Тогда исправим лишь объявление константы:
const Line = ’***************************’;
и после повторной компиляции программа заработает по-новому.
Константы облегчают жизнь программиста и повышают надежность программ. Но, повторяю, после изменения константы вы должны повторно откомпилировать программу!
Идентификаторы
Для констант придумывают подходящие имена. Впрочем, это касается и других объектов программы, о которых вы скоро узнаете. Выдуманные программистом имена называют идентификаторами (IDENTIFIER). Запомните это словцо, оно ещё «намозолит» вам глаза. Изобретатель идентификаторов ограничен следующими рамками.
• В идентификаторах допустимы лишь латинские буквы, знак подчеркивания и цифры.
• Идентификатор начинают либо с буквы, либо с подчеркивания (но только не с цифры!).
• Идентификатор может содержать до 127 символов, (в Borland Pascal учитываются только первые 63 из них).
• Не допускается совпадение идентификатора с ключевым словом.
Русские буквы и знаки препинания в именах запрещены. Большие и маленькие латинские буквы равнозначны (регистр букв не учитывается), поэтому идентификаторы Pascal и PASCAL считаются одинаковыми.
Вот примеры правильных идентификаторов:
A, b, C – однобуквенные имена
R1, U28, _13_ – имена с цифрами и подчеркиванием
Cosmos, ABBA – однословные имена
NextStep, Next_Step – имена, составленные из двух слов
А это ошибочные имена:
7Up – начинается с цифры
End – совпадает с ключевым словом
Изобретая имена, мы будем придерживаться некоторой системы с тем, чтобы меньше путаться в своих придумках. Так, имена констант условимся начинать с латинской буквы «C» (например, CLine).
Переменные
Согласитесь, наш последний шедевр – программа P_07_1 – пока не слишком умна, при каждом запуске она тупо твердит одно и то же. Сотворим нечто поумней: пусть наша следующая программа сначала спросит имя пользователя, а затем обратится к нему по этому имени. На экране это будет выглядеть так:
Как тебя зовут?
Антон
Здравствуй, Антон
Нажми Enter
Здесь выделенное курсивом слово «Антон» во второй строке ввёл пользователь. Такие программы называют диалоговыми.
Ясно, что неизвестное имя собеседника в программу заранее не вставишь. Константа тут бесполезна, – ведь она вбивается в программу заранее и не меняется после компиляции. Если данные вводятся пользователем в ходе выполнения программы, им нужно нечто иное, – этим данным надо отвести место для хранения их в памяти. И тогда мы сможем как-то работать с этими сохраненными данными (например, печатать).
Где хранят предметы? В ящиках, карманах, кошельках. Для хранения данных в памяти используют переменные (VARIABLE). Переменная – это своего рода «карман» с именем, данным ему программистом. В ходе работы программа может «укладывать» в переменную данные, и затем обращаться с ними по своему усмотрению. Этот «карман» действует по принципу: что положил, то и взял. Иначе говоря, в переменной хранится то, что было положено последним. Но, в отличие от кошелька, единожды положенное в переменную можно извлекать многократно, – этот «карман» никогда не опустеет!
Прежде, чем пользоваться переменной, её, как и константу, надо объявить. Для этого служит секция объявления переменных, которую открывают ключевым словом VAR (сокращение от VARIABLE), секцию помещают до исполняемых операторов – перед словом BEGIN. Внутри секции объявляют одну или несколько переменных. Каждое такое объявление содержит два элемента: имя переменной и её тип, разделяемые двоеточием:
var Имя_переменной : Тип_переменной;
Ну, с именем все ясно – это обычный идентификатор, который вы изобретаете сами. А что такое тип, и в чем его смысл? В этой обширной теме мы со временем разберемся основательно, а сейчас затронем лишь слегка.
Укладывая предметы, вы учитываете их размеры, вес и назначение. Пылесосу удобно в своей коробке, а монете – в кошельке. «Каждый сверчок – знай свой шесток». Встретив в программе объявление переменной, компилятор отводит ей место в оперативной памяти с тем, чтобы хранимые данные поместились там. То есть, кроит «карман» подходящего размера. Это первое.
А ещё компилятору надо знать набор допустимых действий с теми данными, что «лежат» в переменной: можно ли их складывать и умножать? Или это строка текста, предназначенная для вывода на экран? Ответ на эти вопросы заключен в типе переменной. По нему компилятор определяет и размер переменной, и набор допустимых операций с нею.
Паскаль содержит ряд встроенных типов данных, со временем вы познакомитесь с ними, но сейчас нам позарез нужен только один из них. Это тип STRING, что в переводе значит «строка» – это ключевое слово языка. Переменная этого типа может хранить в себе строчку какого-нибудь текста.
Объявим переменную для хранения в ней имени пользователя. Как назовем её? Да так и назовем – Name, что переводится как «имя». Итак, объявление переменной Name строкового типа STRING выглядит так:
var Name : string;
Напомню, что имя и тип переменной разделяются двоеточием, а завершается оператор точкой с запятой.
Ввод и вывод данных
Теперь, когда мы объявили переменную, попробуем ввести в неё данные, а затем вывести данные на экран.
Ввод данных в переменную выполняется знакомой вам процедурой Readln. Мы уже пользовались ею, чтобы заставить компьютер ждать нажатия Enter. Но процедура придумана в основном не для этого, а для ввода разнообразных данных, в том числе строк. С этой целью процедуре передают параметры – переменные, куда вводятся данные. В нашем случае оператор ввода имени будет таким:
Readln(Name);
Выполняя этот оператор, компьютер тоже остановится в ожидании нажатия Enter. Но символы, которые пользователь напечатает до этого нажатия, попадут в переменную Name и сохранятся там. Так в строковую переменную можно ввести слово, и даже целое предложение, завершив ввод нажатием Enter.
А как напечатать содержимое переменной? Справится ли с этим процедура Writeln? Без сомнения! Ведь нечто подобное мы уже проделывали с константой. Вот оператор печати для этого случая:
Writeln(Name);
Все хорошо, да вот незадача! Этот оператор напечатает имя в отдельной строке, а нам хочется объединить его со словом «Привет» в одной строчке. Как это сделать? Очень просто! Ведь в процедуре печати можно указать несколько параметров, разделяя их запятыми, и тогда все они напечатаются в одной строке. В нашем случае через запятую укажем два параметра:
Writeln(’Здравствуй, ’, Name);
Здесь первый параметр – строковая константа «Здравствуй,» (с пробелом в конце), а второй – переменная Name.
Теперь все готово для рождения новой программы. Создайте пустой файл с именем «P_08_1.PAS», а затем введите в него плод наших размышлений.
var Name : string;
begin
Writeln(’Как тебя зовут?’);
Readln(Name);
Writeln(’Здравствуй, ’, Name);
Writeln(’Нажми Enter’); Readln;
end.
Откомпилируйте программу и проверьте, работает ли она.
Итоги
• Константы полезны для именования неизменяемых данных. Они облегчают работу и повышают надежность программ. Но константы не могут изменяться в ходе выполнения программы.
• Переменные предназначены для хранения в оперативной памяти компьютера изменяемых данных. Переменные могут изменяться в ходе выполнения программы.
• Каждая переменная относится к некоторому типу данных, который определяет и объём занимаемой ею памяти и правила действия с переменной.
• Ввод данных в переменные выполняется оператором Readln, а вывод – оператором Writeln.
• Процедура Writeln может напечатать в одной строке несколько параметров – констант и переменных, разделенных запятыми.
• Имена констант и переменных – это идентификаторы. Программист составляет их по своему усмотрению из латинских букв, цифр и знака подчеркивания.
А слабо?
А) Что напечатает следующая программа, если ваша любимая команда – «Спартак»?
const
Champ = ’ – чемпион!';
var
Team : string;
begin
Writeln(’Ваша любимая команда?’);
Readln(Team);
Writeln(Team, Champ);
Readln
end.
Б) Найдите (и исправьте, если можно) ошибки в следующих программах.
begin
const Pele = ’Эдсон Арантес ду Насименту’;
Writeln(’Лучший футболист мира – ’, Pele);
Readln
end.
begin
Writeln(’Как тебя зовут?’);
var Name : string;
Readln(Name);
Writeln(’Здравствуй, ’, Name);
Writeln(’Нажми Enter’); Readln;
end.
const Pele = ’Эдсон Арантес ду Насименту’;
begin
Writeln(’Лучший футболист мира’);
Readln(Pele);
Writeln(Pele);
Readln
end.
Глава 9
Переменные: продолжение знакомства
Теперь, после знакомства с переменными, вы умеете объявлять их, вводить в переменные данные и печатать. Отныне мы не расстанемся с ними.
Представьтесь, пожалуйста!
Наша следующая программа «P_09_1» спросит у пользователя имя и фамилию, после чего обратится к нему уважительно, как следует. Вот пример такой «беседы» (выделенное курсивом печатал пользователь).
Фамилия?
Скотинин
Имя?
Тарас
Здравствуй, Тарас Скотинин!
Нажми Enter
Примечание. Тарас Скотинин – персонаж комедии Д.И. Фонвизина «Недоросль».
Очевидно, что для хранения имени и фамилии одной переменной мало, нужны две. Памятуя о том, что секция объявления переменных допускает несколько операторов, объявим там парочку переменных.
var N : string;
S : string;
Здесь переменные N и S названы мною по первым буквам слов Name (имя) и Surname (фамилия). Объявить несколько переменных одного типа можно и в одной строке, перечислив их через запятую.
var N, S : string;
Тут две переменные объявлены одним оператором, – этот способ ничуть не хуже.
Далее, после ввода данных, надо напечатать в одной строке несколько параметров: приветствие, имя, фамилию, и восклицательный знак в конце, чтобы обратиться к Тарасу Скотинину так:
Здравствуй, Тарас Скотинин!
Достаточно ли здесь одного оператора печати? Конечно! Вот он.
Writeln(’Здравствуй, ’, N, ’ ’, S, ’!’);
Тут мы втиснули в процедуру Writeln аж пять параметров! Обратите внимание: в конце добавлен восклицательный знак, а между именем и фамилией печатается пробел, иначе эти слова слипнутся на экране.
После всех пояснений следующая программа должна быть вполне ясной.
var N, S : string;
begin
Writeln(’Фамилия?’); Readln(S);
Writeln(’Имя?’); Readln(N);
Writeln(’Здравствуй, ’, N, ’ ’, S,’!’);
Writeln(’Нажми Enter’); Readln;
end.
Обязательно скомпилируйте её и проверьте в действии.
Из пустого в порожнее
Итак, нам удалось скроить уже два «кармана» для хранения данных. Действительно, переменные сродни карманам, здесь можно и хранить данные, и копировать из одного «кармана» в другой. Для копирования данных в Паскале применяют оператор присваивания, вот примеры копирования данных.
A := 'Привет, Мартышка!'; <– копирование строковой константы
B := A; <– копирование из переменной A в переменную B
Пара символов «:=» – «двоеточие» и «равно» – означают операцию присваивания. Слева от знака операции указывают переменную, в которую будут помещены данные, а справа можно указать переменную или константу. Что, по вашему мнению, напечатает следующая программа?
var A, B : string;
begin
A:= 'Первая строка';
B:= 'Вторая строка';
Writeln(A); Writeln(B);
B:= A;
Writeln(B); Readln
end.
Очевидно, что на экране появятся следующие строки.
Первая строка
Вторая строка
Первая строка
Первые два оператора заносят в переменные A и B две строковые константы, которые затем печатаются. Третий оператор присваивания B:=A скопирует в переменную B значение переменной A, где уже содержится «Первая строка», – она и будет напечатана последней.
Но, к чему здесь было копировать данные из одной переменной в другую? Сейчас это не имело смысла, согласен. Но последнее слово ещё не сказано!
Сцепление строк
Спросите у любого: для чего нужны компьютеры? Для вычислений, для чего ж еще? – ответят некоторые. Другие скажут, что для обработки данных. В самом деле, обработка данных – нечто более общее, чем вычисление. Не пора ли и нам приступить к обработке данных? Познакомимся с простейшей операцией обработки строк, которую называют сцеплением или конкатенацией.
Не пугайтесь этого заумного слова, сцепление строк – простейшее дело! Руками это делается так: берете несколько полос бумаги и пишите что-либо, – это ваши строки, – а затем склеиваете полоски. Это и есть конкатенация строк.
Рис.22 – «Склеивание» отдельных строк оператором сцепления «+»
На рис. 22 представлено строковое выражение. Знаки «+» здесь обозначают операцию сцепления строк, – точно так же она обозначается и в Паскале. Показанный ниже оператор присваивания занесет в переменную R строку, «склеенную» из пяти других строк (здесь N и S – это переменные, содержащие имя и фамилию человека).
R:= ’Здравствуй, ’ + N + ’ ’ + S + ’!’;
Стало быть, справа от операции присваивания «:=» может быть не только константа или переменная, но и строковое выражение.
Испытайте теперь второй вариант приветствующей программы с тремя строковыми переменными.
var N, S, R : string;
begin
Writeln(’Фамилия?’); Readln(S);
Writeln(’Имя?’); Readln(N);
R := ’Здравствуй, ’ + N + ’ ’ + S +’!’;
Writeln(R);
Writeln(’Нажми Enter’); Readln;
end.
Инициализация переменных
Если найдете силы, испытайте и эту программку (в ней есть ошибка!).
var S : string;
begin
Writeln(S);
S:= ’Спартак’;
Writeln(S);
S:= S + ’ – чемпион!’;
Writeln(S);
Writeln(’Нажми Enter’); Readln;
end.
Здесь переменная S будет напечатана трижды. Но что, по вашему мнению, выведет первый оператор Writeln(S)? Ни за что не угадаете! Этого даже я не знаю. Все потому, что при старте программы содержимое всех её переменных не определено, – в этих «карманчиках» может валяться что угодно. Обычно там остаются следы от деятельности предыдущих программ – так называемый мусор. Не пытайтесь напечатать такие переменные или извлечь из них данные, – порой это может вызвать даже аварию программы.
Запомните: прежде, чем взять из «карманчика», туда следует что-либо положить! Надо, как говорят программисты, инициализировать переменную. Это можно сделать двояко: либо вводом данных процедурой Readln, либо оператором присваивания.
В последующих операторах этого примера переменная S инициализируется, и здесь результат вывода на экран очевиден. А в операторе
S:= S + ’ – чемпион!’;
предыдущее значение переменной S взято для формирования её нового значения. Теперь там окажется строка «Спартак минус чемпион!». Не обижайтесь, спартаковцы, – пошутил. Обязательно проверьте эту программу!
Типизированные константы
Всем данным в программе свойственен какой-либо тип. Это может быть строка, число или другой тип данных, с которыми вы скоро познакомитесь. То же касается и констант, например:
const Pele = ’Эдсон Арантес ду Насименту’; <– это строка (string)
Number = 12; <– это число
Здесь тип сам собой определяется тем значением, что дано константе.
Но существует и другая разновидность констант – типизированные константы, которые объявляются с явным указанием типа:
const Pele : string = ’Эдсон Арантес ду Насименту’; <– это строка (string)
Number : integer = 12; <– это число (integer)
В действительности это тоже переменные, и они могут изменяться в ходе выполнения программы. Но этим переменным изначально присвоены нужные значения, поэтому при запуске программы инициализация их через присваивание уже не требуется.
В Delphi разрешено инициализировать переменные при объявлении:
var Pele : string = ’Эдсон Арантес ду Насименту’;
Но этот способ не совместим с Borland Pascal, и в данной книге не применяется.
Итоги
• В одном операторе можно объявить несколько переменных одного типа.
• Процедура Writeln способна напечатать в одной строке несколько параметров. Параметры в списке разделяются запятыми.
• Операция присваивания «:=» помещает в переменную данные, представленные константой, переменной, или их комбинацией – выражением.
• Конкатенация – это объединение нескольких строк в одну.
• Для инициализации переменной необходимо либо ввести в неё данные процедурой Readln, либо заполнить оператором присваивания.
• Извлечение данных из переменных, которые не были инициализированы, бессмысленно и нередко вызывает крушение программы.
А слабо?
А) Что напечатает следующая программа?
const Pele = ’Эдсон Арантес ду Насименту’;
begin
Writeln(’Pele = ’ + Pele); Readln;
end.
Б) А эта программа что напечатает?
var A, B : string;
begin
A:=’123’; B:=’456’;
Writeln(’A+B= ’ + A + B); Readln;
end.
В) Является ли следующий оператор оператором присваивания?
const Pele = ’Эдсон Арантес ду Насименту’;
Г) Пусть ваша программа запросит у пользователя его адрес, а именно: город, улицу, номер дома и номер квартиры. А затем напечатает адрес одной строкой в таком виде:
Город: ГГГ Улица: УУУ Дом: ДДД Квартира: ККК
Сделайте два варианта программы: один – с печатью нескольких параметров оператором Writeln, другой – с объединением строк.
Д) Какие из следующих операторов забракует компилятор?
const
Pele = ’Эдсон Арантес ду Насименту’;
ABBA : string = ’Музыкальный шедевр из Швеции’;
var
Moscow : string;
begin
Pele := ’Лучший футболист мира’;
ABBA := ’Распевают частушки’;
Moscow:= ’Столица олимпиады’;
end.
Глава 10
Условный оператор
Согласитесь, наши последние программы слегка поумнели, догнав по интеллекту попугая. Но негоже на лаврах почивать, – научим компьютер принимать осмысленные решения.
Стой! Кто идет?
Вот секретное учреждение, вход в него строго ограничен. А вы – часовой, и пропускаете лишь тех, кто назовет пароль – слово «pascal». Наскучив на посту, вы задумали приспособить вместо себя компьютер. Ваша новая программа «P_10_1» должна запросить у пользователя пароль и решить, пропускать ли этого человека.
Вопрос ребром
Что проще должности часового? Пускать или не пускать? Подобные вопросы решаются поминутно: свернуть направо или налево? орел или решка? быть или не быть? От полученного ответа зависят дальнейшие действия.
Обычно мы рассуждаем так: ЕСЛИ некоторое утверждение верно, ТО делаем одно, а ИНАЧЕ делаем другое. Например, ЕСЛИ на улице жарко, ТО наденем футболку, а ИНАЧЕ – свитер. Выделенные мною слова – ключевые в этом рассуждении. Переведя их на английский, получим условный оператор языка Паскаль.
Существуют два варианта условного оператора – полный и неполный. Полный оператор выражается тремя ключевыми словами: IF – «если», THEN – «то» и ELSE – «иначе», и записывается он так:
IF <условие> THEN <Оператор_1> ELSE <Оператор_2>
Первый оператор выполняется, если условие верно, а второй – если ложно. Стало быть, условный оператор – это сложная конструкция, которая включает в себя другие операторы.
Теперь обратимся к условию, что это такое? Если я скажу, что это логическое выражение, вы ничего не поймете. С логическими выражениями мы скоро разберемся досконально, а здесь ограничимся лишь примером. Воспользуемся простейшим логическим выражением, которое заключается в сравнении двух строк. Предположим, что переменная S содержит введенный пользователем пароль, тогда условный оператор проверки пароля будет таким.
if S = ’pascal’ then Writeln(’Проходите!’) else Writeln (’Стойте!’)
Здесь логическое выражение выделено курсивом. То же самое можно записать чуть иначе.
if ’pascal’ = S
then Writeln(’Проходите!’)
else Writeln (’Стойте!’)
Теперь переменная S и константа «pascal» поменялись местами, и это никак не сказалось на условном операторе, поскольку знак равенства в логических выражениях означает сравнение (а не присваивание!).
Части условного оператора THEN и ELSE называют ветвями (положительной и отрицательной соответственно). Стало быть, и условие, и ветви оператора можно размещать в нескольких строках – это удобно как для чтения, так и для отладки программ.
В главе 7 мы познакомились с графическим изображением алгоритмов. Существуют лишь три базовые управляющие конструкции, из которых вяжется хитроумная паутина современных программ: 1) линейная последовательность, 2) условный переход и 3) цикл. Условный оператор Паскаля – это и есть один из вариантов условного перехода. На блок-схемах его изображают так (рис. 23).
Рис.23 – Блок схема полного условного оператора
Внутри ромбика или рядом с ним обычно показывают проверяемое условие, а положительную и отрицательную ветви располагают слева и справа от него.
Пост номер один
Вам понятен условный оператор? Тогда обратимся к программе-часовому. Вероятно, вы написали её раньше меня, и нам осталось лишь сверить варианты.
var S : string;
begin
Writeln(’Пароль?’); Readln(S);
if S = ’pascal’
then Writeln(’Проходите!’)