Рисовать карандашом винчестер

Вы можете не читать эту часть, если в общих чертах знаете следующие вещи:

·     Что такое программа, цикл, ветвление, процедура, и какая от них выгода.

·     Принцип действия компьютера и его устройств: оперативной памяти, принтера, винчестера и других.

·     Взаимодействие устройств во время работы компьютера.

·     Принципы кодирования информации в разных устройствах компьютера.

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

 

1.1. Что умеет делать компьютер

В начало страницы

Все вы видели компьютер - если не рядом с собой, то хотя бы по телевизору. Обычно он и сам напоминает телевизор, к которому присоединили клавиатуру от пишущей машинки. Только телевизор здесь особый и называется  монитором или  дисплеем.

 

Что же умеет делать компьютер:

 

·       Играть с вами в разные игры.

·       Выполнять сложные научные расчеты. Например, он может вычислить траекторию полета космического корабля на Марс.

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

·       Выполнять вместо человека несложную, но скучную и утомительную вычислительную и печатную работу. Рассмотрим, например, работу банка. Каждый день в любой банк стекаются со всех сторон тысячи денежных сумм, а другие тысячи денежных сумм забираются из банка. Директор банка должен каждый день точно знать, сколько денег находится у него в банке. Для этого каждый день приходится выполнять тысячи сложений и вычитаний, чтобы сложить все деньги, которые пришли в банк, и вычесть из них все деньги, которые ушли из банка. Кроме  этого ежедневно приходится печатать тысячи бумаг, в которых проставляются  суммы денег, вложенных в банк и взятых из банка. Ото всех этих обязанностей  человека освобождает компьютер.

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

·       Выполнять обязанности советчика. Например, если в компьютер вложить знания по медицине, а затем сообщить ему, какая у больного температура, анализ крови и пр., он может высказать свое мнение, чем болен пациент, и посоветовать лекарства.

·       В самое последнее время компьютер все шире используется, как средство связи со всем миром, гораздо лучшее, чем телефон.

·       А еще компьютер помогает инженеру конструировать дома, самолеты, машины, позволяет вам рисовать и делать собственные мультфильмы,  он сочиняет стихи и музыку, умеет играть в шахматы на уровне гроссмейстера,  может разговаривать человеческим голосом и исполнять музыкальные произведения, предсказывает погоду и делает многое другое.

1.2. Что такое компьютер. Первое  представление о программе.

Откуда в компьютере умение делать все описанные выше вещи? Нужно сказать, что когда-то компьютеры ничего такого делать не умели. И их приходилось учить. Как учат компьютер? Примерно так же, как учат людей, рассказывая им, как делать то-то и то-то. Пусть, например, вы живете на 17 этаже многоэтажного дома и к вам в гости приехал человек, никогда не бывавший в городе. Предположим, вы хотите научить его спускаться во двор на прогулку. Для этого вы даете ему такую инструкцию, состоящую из шести команд:

 

1.       Выйти из квартиры

2.       Подойти к двери лифта

3.       Нажать на кнопку

4.       Когда дверь откроется, войти

5.       Нажать на кнопку с цифрой 1

6.       Когда лифт спустится и дверь откроется, выйти во двор

 

Если ваш гость умеет ходить и нажимать на кнопки, то помня эту инструкцию, он отныне сможет самостоятельно спускаться во двор.

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

 

1.       Нарисовать в таком-то месте экрана одно колесо.

2.       Нарисовать в таком-то месте экрана другое колесо.

3.       Нарисовать в таком-то месте экрана корпус тележки.

4.       Покрасить корпус в синий цвет.

 

Если компьютер умеет рисовать колеса, корпуса и красить их, то он поймет эту инструкцию.

О том, что это за специальный язык, мы поговорим позже. Сейчас же мы скажем, что

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

если же она написана на обычном русском или другом человеческом языке в расчете на то, чтобы ее понял не компьютер, а человек, то она называется алгоритмом. Таким образом, мы только что написали алгоритм из четырех команд[1].

Поскольку у многих компьютеров нет ушей-микрофона (а если и есть, то компьютер неважно разбирает устную речь), программу вы ему не рассказываете вслух, а печатаете ее текст на клавиатуре (по-другому говоря  -  вводите с клавиатуры), откуда она тут же сама собой попадает внутрь компьютера. Отныне компьютер по первому вашему приказу сможет эту тележку рисовать.

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

Итак, вы должны запомнить, что

для того, чтобы компьютер что-нибудь умел, он должен иметь внутри себя программу этого умения

И наоборот, если компьютер что-нибудь умеет, это значит, что кто-то когда-то придумал программу этого умения и ввел ее в компьютер. Следовательно, если ваш компьютер умеет играть в игру «Quake», это значит, что внутри него находится программа этой игры, которую кто-то туда ввел. Разучится ваш компьютер играть в «Quake» только тогда, когда вы удалите программу этой игры из компьютера (или нечаянно, или чтобы освободить в компьютере место для других программ).

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

Именно работа по программе отличает компьютер от простого карманного калькулятора, который работает только по нажатию клавиш. (Правда, существуют так называемые программируемые калькуляторы, которые могут работать по программе, но раз так, то это уже не совсем калькуляторы, а немножко и компьютеры тоже.)

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

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

Есть еще два пути, при помощи которых программы могут попасть в ваш компьютер:

·         Вы можете купить компакт-диски с готовыми программами и, если ваш компьютер снабжен «проигрывателем» компакт-дисков, то вы вставляете в него компакт-диск и вводите программу в компьютер.

·         Если ваш компьютер связан с другими компьютерами при помощи так называемого модема или другими способами, то вы можете «перекачивать» программы с других компьютеров на ваш по линии связи.

1.3. Как человек общается с компьютером

Как я уже говорил, информацию, которую человек хочет сообщить компьютеру, он обычно вводит с клавиатуры, дискеты, компакт-диска или по линии связи. Есть и другие способы ввода информации, но о них позже.

Если же, наоборот, компьютер хочет сообщить человеку какую-то  информацию, то он обычно показывает ее на экране монитора. Такой  информацией могут быть числа, слова, тексты, картинки, мультипликация, видео. По желанию человека компьютер может печатать информацию на бумаге при помощи печатающего устройства, которое называется  принтером.  Кроме этого компьютер может исполнять музыкальные мелодии и даже разговаривать, правда не все компьютеры разговаривают разборчиво. Все это он умеет делать, напоминаем, не сам по себе, от рождения, а только по написанным человеком  программам.

 

Что же обычно делает человек, сидя за компьютером? Все зависит от  того, что ему от компьютера нужно. А нужно ему в большинстве случаев вот что:

 

·       Переписать программу с дискеты в компьютер или наоборот - с компьютера на дискету. В этом случае человек просто вставляет дискету в компьютер и нажимает на клавиатуре несколько определенных клавиш.

·       Ввести придуманную программу в компьютер с клавиатуры. В этом случае человеку достаточно набрать весь текст программы на клавиатуре.

·       Выполнить программу, уже имеющуюся внутри компьютера. Конечно, это нужно человеку чаще всего. Внутри компьютера (если только он не вчера куплен) обычно уже имеется очень много программ, поэтому человек сначала выбирает, какая программа ему нужна. Так, если ему нужна программа, показывающая мультфильмы, то он нажатием нескольких клавиш на клавиатуре выбирает именно ее и приказывает компьютеру ее выполнить (другими словами - запускает программу на выполнение). Компьютер выполняет программу, послушно делая все то, что в программе приказано, в результате чего на экране появляется мультик.

·       Отвечать на вопросы компьютера. Это происходит только тогда, когда в программе содержится команда компьютеру задать человеку какой-нибудь вопрос. Как видите, без программы компьютер не только ничего не делает, но даже и вопросов не задает. Обычно программа приказывает задать такой вопрос, без ответа на который компьютер не может дальше выполнять задание, данное ему человеком. Например, если компьютер вычисляет траекторию полета к Марсу, то где-то в начале счета он может задать вам вопрос, который вы увидите на мониторе: "Каков стартовый вес ракеты в тоннах?" В ответ вам нужно набрать на клавиатуре правильное число, скажем 2500. Если же вы с компьютером играете, то вам часто приходится отвечать на вопросы типа "Будете ли вы продолжать игру?" и т.п.

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

 

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

2.1. Список команд. Командный и программный режимы

В начало страницы

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

 

Список команд робота:

ШАГ ВПЕРЕД

НАЛЕВО

НАПРАВО

ВОЗЬМИ ПРЕДМЕТ

ОПУСТИ ПРЕДМЕТ

ПОВТОРИ несколько РАЗ выполнение одной из этих команд

СЛУШАЙ ПРОГРАММУ

ВЫПОЛНЯЙ ПРОГРАММУ

 

Запомните, что робот не умеет делать ничего, кроме того, что упомянуто в списке его команд.

Пусть ваш робот стоит в коридоре и вам нужно, чтобы он переставил стул в комнате на новое место.

Но в списке команд робота нет такой команды "Переставить стул в комнате".Что же делать? Можно идти рядом с роботом и в нужные моменты времени приказывать ему: ШАГ ВПЕРЕД, ШАГ ВПЕРЕД,..., НАЛЕВО,..., ВОЗЬМИ ПРЕДМЕТ... и так далее. В результате стул будет переставлен. Этот режим управления роботом (как, впрочем, и компьютером) называется командным режимом. Однако, совсем не обязательно сопровождать робота на каждом шагу. Пусть вы заранее измерили все необходимые расстояния. Тогда достаточно в тот момент, когда робот находится в исходной позиции, сообщить ему инструкцию по выполнению задания, то есть задать точный порядок его действий, приводящих к перестановке стула, а затем приказать выполнить ее. Конечно, инструкция должна состоять только из команд, которые робот понимает и умеет выполнять. Вы уже знаете, что называется такая инструкция программой. Вот она:

  

Программа для робота

Пояснения для нас с вами

1. ПОВТОРИ 5 РАЗ ШАГ ВПЕРЕД

Робот идет по коридору до дверей

2. НАЛЕВО

Робот поворачивается лицом к дверям

3. ПОВТОРИ 3 РАЗА ШАГ ВПЕРЕД

Робот подходит к стулу

4. ВОЗЬМИ ПРЕДМЕТ

Робот берет стул

5. НАПРАВО

Робот поворачивается к новому месту стула

6. ШАГ ВПЕРЕД

Робот подносит стул к новому месту

7. ОПУСТИ ПРЕДМЕТ  

Робот ставит стул на новое место

 

Очевидно, работая по этой программе, робот правильно переставит стул.

Итак, если вы решили не сопровождать робота на каждом шагу, а заставить его работать по программе, вы совершаете следующие действия:

 

Последовательность работы человека с роботом

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

2.    Подходите к роботу, стоящему в исходном положении, и отдаете ему команду СЛУШАЙ ПРОГРАММУ

3.    Сообщаете ему программу

4.    Отдаете роботу команду ВЫПОЛНЯЙ ПРОГРАММУ

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

Этот режим управления роботом называется программным режимом.

2.2. Что важно знать о программе

Чем хороша программа? Ее великое значение в том, что она заставляет робота делать вещи гораздо более сложные, чем те, которые перечислены в списке его команд. По программе робот делает то, что без программы делать не умеет.

Спрашивается, можно ли написать программу для гораздо более сложной задачи, например для перестановки всей мебели на этаже? Разумеется, можно, только программа для этого будет достаточно длинной.

Что требует от нас программа? Она требует абсолютной точности при ее составлении. Если, например, мы в первой команде самую чуточку ошибемся и скажем ПОВТОРИ 6 РАЗ ШАГ ВПЕРЕД (вместо 5 раз), робот проскочит мимо двери, на второй команде повернется и, добросовестно выполняя программу, на третьей команде проломит стену. Если мы перепутаем местами команды 6 и 7, то робот сначала поставит стул, а потом об него же и споткнется.

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

Сообщать роботу команды мы обязаны только теми словами, которые приведены в списке команд, потому что робот понимает только их. Если мы вместо команды ВОЗЬМИ ПРЕДМЕТ дадим команду БЕРИ ПРЕДМЕТ, робот нас не поймет и команду не выполнит.

Задание 1:  Напишите программу, по которой робот сходит в комнату за стулом и вернется с ним в коридор в исходное положение.

2.3. Понятие о процедуре. Может ли робот поумнеть?

Умен ли наш робот? Судя по его реакции на ошибки в программе, весьма глуп. Умный робот не стал бы проламывать стенку. Однако, наш робот не виноват в своей глупости. Ведь его умственные возможности исчерпываются списком его команд. А список этот очень бедный. Чем он беден?

Первое. В этом списке нет сложных команд, таких как "Наведи порядок в комнате", "Перенеси мебель к другой стенке" и даже такой сравнительно простой, как "Переставь стул". Можете ли вы дополнить список команд робота нужными вам командами? Можете, робот для этого приспособлен. Пусть вы хотите, чтобы робот выполнял команду на перестановку стула. Для этого вы придумываете программу перестановки стула (мы ее уже придумали в п.2.1), затем придумываете, как будет звучать сама новая команда, например ПЕРЕСТАВЬ СТУЛ, и наконец сообщаете роботу программу и говорите ему, что отныне он должен ее выполнять по команде ПЕРЕСТАВЬ СТУЛ. Такая программа называется процедурой, а новая команда ПЕРЕСТАВЬ СТУЛ – обращением к процедуре или вызовом процедуры.

Итак, мы дополнили список команд робота новой командой. Можно ли считать, что робот поумнел? Конечно. Но не очень. И вот почему. Пусть стул находится от дверей не в трех шагах, а в двух. Тогда наш робот, выполняя процедуру ПЕРЕСТАВЬ СТУЛ, как она написана в п.2.1, споткнется об него, а это, конечно, не говорит о его уме. Чтобы переставить стул, где бы он ни был в комнате, робот должен сначала его найти, но команды на поиск нет в списке его команд, а составить из команд этого списка процедуру поиска невозможно. Мы начинаем видеть, чем еще беден список команд робота:

Второе. Он беден не только количеством команд, но и их содержанием. Все его команды касаются только ходьбы и переноса предметов. Фактически, наш робот  очень мало умеет, он может только бездумно расхаживать и таскать с места на место мебель. Он не может включить телевизор, так как не имеет хотя бы команды нажатия на кнопку. Он не может сходить в магазин, так как не умеет считать деньги. Он не может поздороваться с вами, так как не имеет команды что-нибудь произнести. Можете ли вы что-нибудь с этим поделать? Ничего не можете, потому что таким его сделали на заводе. Вам нужен робот с гораздо более разнообразными командами. Кроме этого, хорошо было бы иметь команды для очень мелких движений, например "согнуть средний палец на правой руке". Тогда из таких команд можно было бы составить процедуры вроде "пожми руку" или "нажми кнопку" или "включи телевизор". Но воображаемый робот с такими умениями был бы очень сложным и очень дорого бы стоил.

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

Программа для робота

Пояснения для нас с вами

1.ПЕРЕСТАВЬ СТУЛ

Обращение к процедуре ПЕРЕСТАВЬ СТУЛ

2.НАЛЕВО

Робот поворачивается налево

3.ПЕРЕСТАВЬ СТУЛ

Обращение к процедуре ПЕРЕСТАВЬ СТУЛ

Ответ: Выполняя первую команду (обращение к процедуре ПЕРЕСТАВЬ СТУЛ), робот благополучно переставит стул. Выполняя вторую команду, он повернется лицом к дальней стенке. Выполняя третью команду (обращение к процедуре ПЕРЕСТАВЬ СТУЛ), он на первой же команде этой процедуры (ПОВТОРИ 5 РАЗ ШАГ ВПЕРЕД) врежется в дальнюю стенку.

2.4. Программа для компьютера на машинном языке

Теперь, когда вы понимаете, какую важную роль играет список команд, которые может выполнять робот, настало время вернуться обратно к компьютерам. Программа для компьютера тоже состоит из отдельных команд. Я уже говорил, что человек, который пишет программу для компьютера, называется программистом. Естественно, когда программист пишет программу, ему совершенно необходимо знать список команд, которые может выполнять компьютер. Мы еще поговорим подробнее об этом списке. Но сначала подумаем, а что вообще может компьютер. Вспомним все его умения, перечисленные в 1.1 и позже. Большинство из них сводится в конце концов к тому, что компьютер что-то изображает на экране монитора (числа, тексты, картинки, мультики) или же исполняет какую-нибудь музыкальную мелодию или обменивается информацией с дисками. Программы для всех этих умений состоят из команд компьютера.

Взглянем на список команд новенького компьютера, только что покинувшего заводские стены. Внутри него нет почти никаких программ, поэтому умеет он выполнять только команды, заложенные в него на заводе. Каждая из этих команд заставляет компьютер выполнить какое-то одно простейшее очень маленькое действие, по своей незначительности подобное сгибанию пальца у робота. Отдавать эти команды компьютеру нужно на специальном языке, понятном компьютеру - машинном языке. Поскольку изучение машинного языка нам сейчас не нужно, я приведу только смысл некоторых задач, выполняемых командами машинного языка (на русском языке).

 

   Примеры задач, выполняемых командами  машинного языка:

Сложить два числа.

Определить, какое из двух чисел больше.

            Следующие задачи уже слишком трудны для одной команды машинного языка

и под силу только совокупности таких команд:

Изобразить на экране в заданном месте светящуюся точку заданного цвета.

Изобразить на экране заданную букву или цифру.

Включить звук заданной высоты.

Выключить звук.

Запомнить, какую клавишу нажал человек на клавиатуре.

 

В машинном языке еще много команд, и все они такие же "мелкие". Спрашивается, как же при помощи таких слабеньких команд заставить компьютер сделать хоть что-нибудь путное, скажем, написать слово "ЭВМ" или нарисовать кружочек? Я думаю, вы уже догадались, что нужно сделать - нужно написать программу и сделать ее процедурой. Вот, например, алгоритм программы, изображающей на экране слово "ЭВМ":

1.       Изобразить на экране букву "Э"

2.       Изобразить на экране букву "В"

3.       Изобразить на экране букву "М"

 

А вот алгоритм программы, вычисляющей выражение  (5‑7)/(10+40):

1.       Вычти 7 из 5

2.       Прибавь 40 к 10

3.       Раздели первый результат на второй

4.       Покажи результат деления на экране монитора

 

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

А как же нарисовать кружочек, если компьютер может нарисовать только точку? Если вы посмотрите на экран монитора в увеличительное стекло, то заметите, что изображение любого предмета состоит из маленьких светящихся точек (пикселов), которые расположены так близко друг к другу, что сливаются в единое изображение. Примерно то же самое вы видите на фотографии в газете. Вполне можно написать программу, которая рисует рядышком одну за другой множество точек так, чтобы они образовали окружность. Рисунок, поясняющий принцип получения изображения на экране, приведен в 3.4.

2.5. Языки программирования

В чем недостаток команд машинного языка? В том, что действия, вызываемые этими командами, очень мелки. Поэтому программа выполнения даже очень простого задания будет состоять из большого числа команд. Это все равно, что строить дом не из кирпичей, а из косточек домино, - построить можно, но слишком долго и утомительно (зато орнамент из кирпичей на этом доме получится плохой, грубый, из косточек домино – гораздо богаче и подробнее).

Поскольку этот недостаток машинного языка был давным-давно понятен всем программистам, то они составили из команд машинного языка процедуры[2] для выполнения наиболее популярных маленьких заданий, таких как:

·         Нарисовать кружочек заданного размера в заданном месте экрана

·         Нарисовать прямоугольник заданного размера и формы в заданном месте экрана

·         Нарисовать отрезок прямой

·         Покрасить заданным цветом определенную область экрана

·         Воспроизвести мелодию по заданным нотам

·         Написать на экране заданное слово, заданный текст

·         Запомнить слово или текст, введенные с клавиатуры

·         Вычислить математическую формулу

Как видите, действия, вызываемые этими процедурами, гораздо более крупные, чем у команд машинного языка. Поэтому эти процедуры более удобны для написания программ, хотя бы для таких, как программа, рисующая синюю тележку с надписью "Игрушки". Для ее написания достаточно согласиться с тем, что колесо - это кружочек, а корпус - прямоугольник.

Конечно, хотелось бы иметь все подобные процедуры внутри компьютера. Поэтому давным-давно существуют дискеты и компакт-диски, на которых записаны целые "сборники" таких процедур. И каждый желающий может взять дискету, переписать ее содержимое в компьютер и пользоваться им.

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

Называют такую комплексную программу сложно и по-разному, например, "Среда и компилятор языка программирования высокого уровня". Основное для нас в этом названии  - понятие "язык программирования" или будем говорить проще - "язык". Но если язык, то какой? У людей есть русский, английский, китайский языки. Что такое любой из этих языков общения людей? Грубо говоря, это набор букв, слов, знаков препинания и правил, по которым все эти элементы нужно выстроить в цепочку, чтобы получить правильное предложение. Язык программирования – примерно то же самое. Важнейшая часть языка программирования – набор правил, по которым различные объекты (в том числе и обращения к упомянутым процедурам) нужно выстроить в цепочку, чтобы получить правильную программу. Строго говоря, процедуры не являются составной частью языка, однако, вы должны знать, что держа в руках дискету или компакт-диск с надписью “Turbo Pascal” или «C++» или какой-либо другой язык, вы держите в руках целый комплекс программ, который содержит и большое количество этих самых процедур и средства для удобной разработки ваших программ с их использованием.

Языков программирования, как и человеческих языков, придумано много. Зачем? Причина - в разнообразии потребностей программистов, в разных уровнях их квалификации и во многом другом. Так, начинающим вряд ли стоит предлагать Ассемблер, а профессионалу не нужен Лого. Часто разные языки ориентированы на разные предметные области. Например, язык Пролог позволяет удобно описывать логические взаимосвязи в окружающем нас мире, Лого позволяет удобно рисовать фигуры и снабжен для этого соответствующим набором процедур, а вот решать сложные математические задачи с его помощью лучше и не пытаться.

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

 

Вот некоторые наиболее популярные языки программирования:

Лого 

Logo

язык, рассчитанный на детей, позволяющий просто и занимательно рисовать картинки и программировать простейшие игры

Бэйсик

Basic

язык как для начинающих, так и для профессиональных программистов

Паскаль

Pascal

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

Си

C

сложный, мощный язык для профессиональных программистов

Ассемблер

Assembler

сложный, мощный язык, с очень мелкими командами, близкими к командам машинного языка

Лисп, Пролог

LISP, Prolog

языки для создания искусственного интеллекта, роботов

 

Во всех человеческих языках есть слова «ходить», «есть», «спать», обозначающие понятия, общие для всех языков. Точно так же большинство языков программирования позволяет выполнять общепринятые процедуры, такие, например, как вывод информации на экран, только записываются обращения к этим процедурам по-разному. Прикажем, например, компьютеру к трем прибавить два и результат показать на экране монитора. Вот как эта процедура вызывается на языке Лого:

                           покажи 3 + 2

А вот как она вызывается на Паскале:

                           Write (3+2)

В языках программирования приказы, которые отдают на данном языке, называют не только обращениями к процедурам, но и командами (язык Лого и др.), и операторами(языки Бэйсик, Паскаль и др.). Между понятиями «обращение к процедуре» и «оператор» существует значительная разница, о которой вы узнаете позже, однако сейчас вам важно знать только одно – команда Лого, обращение к процедуре и оператор являются приказами. Не нужно их путать с командами машинного языка, так как они гораздо «крупнее». Так команда языка Лого   покажи 3 + 2   фактически является обращением к процедуре из нескольких команд машинного языка, которые сначала приказывают компьютеру вычислить сумму, а потом показать ее на экране. Нет команд более мелких, чем команды машинного языка, поэтому любая команда, оператор или процедура на любом другом языке (кроме Ассемблера) сводится в конце концов к выполнению набора команд машинного языка.

2.6. Пример настоящей программы для компьютера на языке Лого

Давайте напишем настоящую программу на настоящем языке программирования. Для этого выберем язык Лого. Он предназначен в основном для рисования. Напишем программу для рисования домика, вот такого:

 

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

С этого момента компьютер готов принимать нашу программу и выполнять ее. Занимательность и простота работы с Лого заключается в том, что многие его команды являются командами для черепашки нарисовать на экране те или иные разноцветные линии, что-нибудь покрасить и т.п. Передвигается черепашка по экрану маленькими шагами. Размер экрана по горизонтали и вертикали - несколько сотен шагов.

Из всего длинного списка команд Лого нам для рисования домика понадобятся только две. Приведем примеры их записи с пояснением:

ВПЕРЕД  28

По этой команде черепашка продвинется вперед на 28 шагов, оставляя за собой тонкий след, то есть фактически она нарисует отрезок прямой длиной в 28 шагов.

НАЛЕВО 60

По этой команде черепашка повернется на месте налево на 60 градусов.

 

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

Программа

Пояснения

ВПЕРЕД  40

Черепашка идет вверх и рисует правую стенку дома

НАЛЕВО  90

Собираемся рисовать не крышу, а потолок

ВПЕРЕД  50

Черепашка рисует потолок

НАЛЕВО  90

Собираемся рисовать левую стенку дома

ВПЕРЕД  40

Черепашка рисует  левую стенку дома

НАЛЕВО  90

Собираемся рисовать пол

ВПЕРЕД  50

Черепашка рисует пол

НАЛЕВО  90

Готовимся добраться до крыши по правой стене

ВПЕРЕД  40

Черепашка забирается на крышу по правой стене

НАЛЕВО  45

Собираемся рисовать правый скат крыши

ВПЕРЕД  36

Черепашка рисует правый скат крыши

НАЛЕВО  90

Собираемся рисовать левый скат крыши

ВПЕРЕД  36

Черепашка рисует левый скат крыши

 

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

 Так же, как и в случае с роботом, если мы в процессе выполнения программы увидим, что черепашка рисует что-то не то, у нас не будет возможности на ходу исправить программу. Нам или придется ждать, когда она дорисует все до конца или нажатием на клавиши все стереть с экрана и привести черепашку в исходное состояние. После этого программу можно исправлять.

Это я говорил о программном режиме. Лого допускает и командный режим, когда черепашка выполняет команду сразу же, как получит ее с клавиатуры.

Может ли черепашка поумнеть? Да. Объясните черепашке, что составленная программа есть процедура с именем ДОМИК – и отныне вам достаточно будет отдать команду ДОМИК – и черепашка его нарисует.

2.7. Последовательность работы программиста на компьютере

Запишем, в каком порядке проходит работа программиста на компьютере. Она практически копирует порядок работы с воображаемым роботом (см.2.1):

 

0.    Сначала программист получает задачу для компьютера, например, нарисовать домик или вычислить траекторию полета на Марс.

1.    Затем он думает, как из команд (операторов), которые ему предоставляет в распоряжение язык программирования, написать программу. На обдумывание и написание программы уходит от нескольких минут до нескольких лет в зависимости от сложности задачи. Почти всегда программист, чтобы не запутаться, пишет сначала алгоритм программы, а потом уже саму программу.

2.    Наконец программа написана. Теперь программист включает компьютер и нажатием нескольких клавиш приказывает ему приготовиться к приему программы.

3.    Программист набирает всю программу от первой до последней буквы на клавиатуре. При этом программа автоматически по проводу, соединяющему клавиатуру с компьютером, поступает в компьютер и запоминается в его памяти. Программа попала в память компьютера, но это не значит, что компьютер программу “узнал” и “понял”, как узнает и понимает человек. Человек, прочитав какую-нибудь программу, воспринимает ее целиком и хотя бы примерно представляет ее назначение, структуру и т.п. Компьютер же никогда программу у себя в памяти целиком не читает и никогда не понимает ее общего смысла и назначения.

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

5.    Все программисты допускают в программах ошибки. В результате почти никогда компьютер по только-что написанной программе не делает того, что нужно. Увидев на экране косой домик, программист начинает чесать в затылке и искать в программе команду, виновную в печальном исходе. Найдя ошибочную команду, он исправляет программу и вновь запускает ее на выполнение. Однако результаты снова обычно бывают плачевные. Это происходит потому, что часто программа содержит  сразу несколько ошибок. Исправив очередную ошибку, программист снова запускает программу и т.д. Этот захватывающий процесс называется отладкой. Отладка заканчивается, когда программист удовлетворен результатом работы программы (хотя, если программа сложная, это не всегда означает, что в ней ошибок больше нет!).

2.8. Основные приемы программирования

Сведение сложного к простому. Цикл.  Итак, чтобы заставить компьютер что-то сделать, нужно написать программу. И тут невольно возникает вопрос - неужели возможно, записывая одна за другой довольно примитивные команды языка программирования, написать программы для всех тех замечательных умений компьютера, некоторые из которых я привел в1.1? Возьмем, например, игру в воздушный бой. Ведь самолетик по экрану должен двигаться!  Но в списках команд большинства языков программирования, используемых профессиональными программистами для создания таких игр, нет команды движения. Или возьмем вычисление траектории полета к Марсу. Для ее вычисления нужно решать сложнейшие дифференциальные уравнения высшей математики. Но процедуры языков Фортран, Бэйсик, Паскаль, которые используются для этих целей, не могут ничего, что выходит за рамки школьного курса. И непонятно, в конце концов, как научить компьютер разговаривать, если в нашем распоряжении только команда извлечения из компьютера простого звука заданной высоты.

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

Возьмем воздушный бой. Здесь нужно задаться вопросом - а что такое движение? Рассмотрим иллюзию движения, возникающую на экране кинотеатра. Если вы держали в руках кинопленку фильма, изображающего, скажем, движение автомобиля, то должны были обратить внимание, что она состоит из множества неподвижных слайдов (кадров), на каждом следующем из которых автомобиль находится чуть-чуть в другом месте, чем на предыдущем. Показывая эти кадры один за другим с большой скоростью, мы создаем иллюзию движения автомобиля. Точно так же поступают с созданием движения на экране компьютера. Запишем алгоритм движения по экрану слева направо обыкновенного кружочка:

 

1.       Зададим позицию кружочка в левой части экрана. Перейдем к команде 2.

2.       Нарисуем кружочек. Перейдем к команде 3.

3.       Сотрем его. Перейдем к команде 4.

4.       Изменим (в уме компьютера) позицию кружочка на миллиметр правее. Перейдем к команде 5.

5.       Перейдем к команде 2.

 

Каждая из приведенных команд алгоритма легко программируется на большинстве языков. Кстати, любой компьютер, выполнив очередную команду, автоматически переходит к выполнению следующей (так что нам не обязательно было писать, скажем, во второй команде "Перейдем к команде 3."). Однако, если мы захотим, то можем заставить компьютер изменить этот порядок, что мы и сделали в команде 5, благодаря чему компьютер стал многократно выполнять последовательность команд 2-3-4-5. Такая многократно выполняемая  последовательность называется циклом. Цикл - основное средство заставить компьютер сделать много при помощи короткой программы.

В коротком промежутке времени после выполнения команды 2 кружок будет появляться на экране и на команде 3 исчезать, но этого достаточно, чтобы человеческий глаз его заметил. Благодаря циклу кружок будет мелькать каждый раз в новом месте, а поскольку смена “кадров” будет очень быстрой, нам будет казаться, что происходит плавное движение кружка.

Теперь перейдем к задаче о траектории. Существует наука - вычислительная математика - которая утверждает, что решение многих самых сложных и страшных математических уравнений можно свести к многократному выполнению четырех действий арифметики, и показывает, как это делать. Грубо говоря, вместо решения одного уравнения она предлагает выполнить пять миллионов сложений. Это как раз то, что нужно компьютеру. Пять миллионов сложений он выполнит за секунду.

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

 

Собственные процедуры.. Большую помощь в упрощении программирования сложных задач оказывает возможность, предоставляемая программисту большинством языков, составлять собственные процедуры[3] из команд и операторов языка. Составляется процедура точно так же, как в 2.3 для робота составлялась процедура ПЕРЕСТАВЬ СТУЛ. Пусть, например, вы хотите, чтобы компьютер изобразил на мониторе три поезда, каждый из которых состоит из одного паровоза и четырех вагонов. Сначала мы пишем программу для рисования вагона (прямоугольник и четыре кружочка). Сейчас мы не будем обсуждать, как правильно расположить на экране друг относительно друга прямоугольник, кружочки, вагоны и поезда. Вам остается поверить, что делается это довольно легко. Вот алгоритм программы из 5 команд для рисования вагона:

1.       Нарисовать прямоугольник.

2.       Нарисовать кружочек.

3.       Нарисовать кружочек.

4.       Нарисовать кружочек.

5.       Нарисовать кружочек.

Для того, чтобы нарисовать четыре вагона, вам понадобилась бы программа из 20 команд. Писать их утомительно, поэтому программисты поступают по-другому. Программу рисования вагона они называют процедурой и придумывают ей имя, скажем, ВАГОН и сообщают его компьютеру. Аналогично процедуре ВАГОН они составляют процедуру ПАРОВОЗ (которую я не буду приводить). Из обращений к этим готовым процедурам они составляют процедуру ПОЕЗД, алгоритм которой будет выглядеть так:

1.       Выполни процедуру ПАРОВОЗ

2.       Выполни процедуру ВАГОН

3.       Выполни процедуру ВАГОН

4.       Выполни процедуру ВАГОН

5.       Выполни процедуру ВАГОН

И наконец, они пишут программу для рисования трех поездов, которая оказывается совсем короткой:

1.       Выполни процедуру ПОЕЗД

2.       Выполни процедуру ПОЕЗД

3.       Выполни процедуру ПОЕЗД

При отсутствии процедур пришлось бы писать программу из нескольких десятков команд. Выигрыш в объеме работы и в понятности записи программы очевиден.

 

Ветвление (выбор).  У начинающего программиста интерес должен вызвать такой вопрос: как компьютер принимает решения, как он выбирает, какое действие из нескольких возможных нужно выполнить в данный момент? Возьмем тот же воздушный бой. Предположим, при нажатии на клавишу R самолет летит вверх, при нажатии на клавишу V - вниз. Как компьютер чувствует нажатие на клавиши, откуда он знает, что нужно делать при нажатии на каждую из них? Естественно, этот выбор делает программа для игры в воздушный бой, сам по себе компьютер ничего выбрать не может. В программе заранее пишутся процедуры для полета вверх и для полета вниз, а выбор между ними делает специальная команда выбора, имеющаяся в каждом языке программирования. Вот алгоритм выбора между полетом вверх и вниз:

 

1.       Определи, нажата ли какая-нибудь клавиша.

2.       Если не нажата, то переходи к команде 5.

3.       Если нажата клавиша R, то выполняй процедуру ВВЕРХ.

4.       Если нажата клавиша V, то выполняй процедуру ВНИЗ.

5.       Продолжай полет.

 

Здесь команды 2,3,4 - команды выбора. В общем случае команда выбора содержит условие, от которого зависит, будет ли выполняться какая-нибудь команда или группа команд. Это условие может быть самым разным: нажата или нет любая клавиша, нажата или нет конкретная клавиша, больше ли одно число другого, правда ли, что с клавиатуры введено такое-то слово и т.д.

Напишем для примера примитивный алгоритм, позволяющий имитировать вежливое общение компьютера с человеком при включении компьютера:

1.       Покажи на мониторе текст "Здравствуйте, я - компьютер, а вас как зовут?"

2.       Жди ответа с клавиатуры.

3.       Если на клавиатуре человек набрал "Петя" или "Вася", то покажи на мониторе текст "Рад встретиться со старым другом!", иначе покажи на мониторе текст "Рад познакомиться!"

4.       Покажи на мониторе текст "Чем сегодня будем заниматься - программировать или играть?"

5.       Жди ответа с клавиатуры.

6.       Если..............

      .............

 

Выбор называют ветвлением по аналогии с разветвляющимся деревом (когда мы залезаем на дерево, мы время от времени делаем выбор, по какой из нескольких веток лезть дальше).

На этом мы завершим умозрительное рассмотрение основных идей программирования. Конкретное их воплощение отложим до изучения Паскаля. А сейчас пришла пора посмотреть на внутреннее устройство компьютера.

 

 

3.1. Как устроен и работает компьютер

В начало страницы

Для того, чтобы водить автомобиль, совсем не обязательно знать, как он устроен. Но чтобы быть хорошим водителем, устройство и взаимодействие отдельных частей автомобиля представлять все же необходимо. То же самое можно сказать и о компьютере: можно на нем работать, используя готовые программы, и даже самому программировать, не зная внутреннего устройства компьютера. Однако квалифицированным пользователем и программистом не станешь, не изучив устройство и взаимодействие отдельных его частей.

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 


На схеме изображено только семь самых необходимых устройств, хотя в компьютере их может быть гораздо больше. Внутри коробки, которая называется системный блок, находятся: центральный процессор (или просто процессор), оперативная память (или просто память), шина, а также почти всегда винчестер и устройство ввода-вывода на дискетах, названное так потому, что с его помощью информацию с дискеты можно в компьютер вводить, а можно и выводить информацию из компьютера на дискету. Кроме того, туда входит много вспомогательных электронных схем и устройств.

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

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

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

А вот оперативная память специально предназначена для того, чтобы быстро запоминать и быстро вспоминать большие объемы информации, больше ничего она делать не умеет. Короче, процессор и память - как слепой и глухой - по отдельности беспомощны, а вместе вполне способны существовать.

 

                                                      3.1.1.            Порядок обмена информацией между устройствами компьютера

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

1.       Ввести число с дискеты

2.       Ввести число с клавиатуры

3.       Перемножить эти числа

4.       Показать результат на мониторе

Пусть мы написали эту программу на языке Бэйсик и теперь хотим ее выполнить на компьютере. Для этого мы должны иметь дискету с этим языком. Мы включаем компьютер, он несколько секунд готовится к работе, после чего мы вставляем в устройство ввода-вывода на дискетах (дисковод) дискету с Бэйсиком и нажимаем несколько клавиш. Язык с дискеты через шину переписывается (загружается) в память. После этого компьютер сообщает, что готов принимать от нас программу на Бэйсике, и мы эту программу набираем на клавиатуре. (Дискета с Бэйсиком нам больше не нужна и мы вынимаем ее из дисковода.)

Все современные компьютеры могут выполнять программу только тогда, когда она находится в оперативной памяти.

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

Напомним, что на Бэйсике программа состоит из операторов, в нашем случае (допустим для простоты и для соответствия с алгоритмом) - из четырех операторов, хотя на самом деле их будет немного больше. Бэйсик выполняет эти операторы один за другим, по порядку. Вы также знаете, что при выполнении оператор языка программирования заменяется выполнением набора машинных команд. Мы, опять же, чтобы не затемнять изложение подробностями, допустим пока, что в нашей программе каждому оператору соответствует одна команда машинного языка.  

Итак, как только программа была запущена на выполнение, процессор прежде всего приказывает памяти послать ему по шине первую команду программы.  После того, как эта команда (ввод числа с дискеты) пришла в процессор, он "осознает" ее и отдает приказы устройствам компьютера на ее выполнение в соответствии с тем, как он ее осознал. В нашем случае он отдает приказ дисководу прочесть с дискеты число (пусть это было число 3) и направить его по шине в оперативную память, а оперативной памяти приказывает принять это число и запомнить. Как только число запомнилось, процессор считает команду выполненной и приказывает памяти послать ему вторую команду (которой оказался ввод числа с клавиатуры). Осознав ее, он приказывает компьютеру остановиться и ждать, когда человек введет с клавиатуры какое-нибудь число. Как только человек набрал число на клавиатуре (пусть он набрал  -0.25), клавиатура докладывает об этом процессору и тот приказывает ей направить число в память или, возможно, запоминает его сам. После этого он принимает из памяти третью команду (умножение). Внутри процессора имеется арифметическое устройство - своеобразный автоматический карманный калькулятор, способный выполнять четыре действия арифметики. Пусть второе число уже находится в процессоре, тогда он приказывает памяти послать ему по шине первое число, перемножает оба числа, после чего запоминает результат сам или отправляет его в память (предположим, он выбрал память). Наконец, он получает из памяти последнюю команду, согласно которой приказывает памяти же отправить результат (-0.75) на монитор, а тому - принять результат и изобразить его на экране. На этом выполнение программы заканчивается,  компьютер останавливается и ждет от человека ввода новой программы или исправления старой.

 

 

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

Работа оперативной памяти состоит в том, чтобы хранить программу во время ее выполнения, а также принимать от любых устройств, запоминать и отправлять в любые устройства любую информацию, с которой работает программа. Такая информация, в отличие от программы, называется данными. В нашем случае данными являются числа 3 и -0.25 (это исходные данные решения задачи), а также -0.75 (это данное является результатом). Программа - это предписание того, что нужно делать с исходными данными, чтобы получить результат, а данные - это информация, над которой производит действия программа и которая зачастую в программе не содержатся. Так. в нашей программе нигде не заданы значения перемножаемых чисел. Оба они находятся совсем в другом месте - одно на дискете, другое вводится с клавиатуры.

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

Взаимодействие различных устройств компьютера можно уподобить взаимодействию нескольких заводов, стоящих вдоль скоростного шоссе (шины) и производящих друг для друга различную продукцию (информацию). При этом память - это не завод, а большой перевалочный склад. А на заводах собственных складов нет или они маленькие. Пусть сегодня один завод произвел для другого большое количество деталей, которое другой завод будет использовать в течение целого месяца. Целиком все детали этот второй завод сегодня забирать не будет, потому что ему складывать их некуда. Первому заводу их тоже негде хранить. Тогда первый завод везет все детали на перевалочный склад, откуда второй завод будет их понемножку забирать по мере надобности.

Назначение других устройств компьютера, кроме процессора и памяти, рассмотрим в 3.4.

 

3.2. Устройство и размеры оперативной памяти

Представьте себе тетрадный листок в клеточку. В каждую клетку вы имеете право записать карандашом какую-нибудь букву или цифру или знак + или вообще любой символ, который можно найти на клавиатуре. А можете и стереть ластиком и записать другой символ. Много ли букв можно записать на листе? Ровно столько, сколько на нем клеток.

Оперативная память компьютера устроена аналогично этому листу. Только размер ее гораздо меньше, чем у тетрадного листа, а клеточек гораздо больше, и каждая клеточка называется байтом. Для запоминания слова КОШКА понадобится 5 байтов. На странице вашего учебника около 1000 букв и других символов (включая запятые, точки и пробелы), значит, для запоминания страницы текста нужно 1000 байтов. Вы можете сами подсчитать, сколько текста может запомнить современный компьютер, если я скажу, что его память редко бывает меньше миллиона байтов. (Если запоминаются не текст, а числа, то место в памяти отводится немножко по другим правилам.)

Оперативная память компьютера электронная. Информация хранится в ней в виде электрических импульсов или потенциалов в миниатюрных электронных схемах и передается из одного места в другое со скоростью близкой к скорости света. Запись, стирание, считывание информации из нее осуществляются по приказам процессора в соответствии с программой меньше чем за десятимиллионную долю секунды.

3.3. Взаимодействие программ в памяти

Этот параграф знать полезно, но пока не обязательно.

Важно помнить, что компьютер работает по программе не только тогда, когда выполняет нашу программу умножения из 3.1, но и до и после этого. Так уж он устроен. Спрашивается, по какой же программе он работает, когда не выполняет нашу. Рассмотрим поподробнее, что происходит в кратко описанный мной в 3.1 период между моментом включения компьютера и  моментом начала выполнения нашей программы.

Внутри компьютера в специальном постоянном запоминающем устройстве находится программа самопроверки компьютера. Как только вы включаете компьютер, он всегда начинает выполнять именно ее. Если в результате ее выполнения компьютер решит, что его здоровье в порядке, он продолжает работу и обязательно переписывает в память с винчестера (о котором подробнее - позже) основную часть так называемой операционной системы (ОС) - комплекса программ, предназначенного для того (скажем пока), чтобы обеспечить человеку и созданным им программам нормальную работу на компьютере. Переписав ОС, компьютер сразу же переходит к ее выполнению и в процессе выполнения останавливается на той ее команде, которая приказывает ему ждать указаний от человека, что ему делать дальше. Вы решаете, например, что вам нужно работать с Бэйсиком, вставляете в дисковод дискету с этим языком и нажатием нескольких клавиш указываете компьютеру запустить Бэйсик в работу. После этого процессор переходит к выполнению следующих команд ОС, которые “осознают” ваше указание и выполняют его, в результате чего переписывают (загружают) большую комплексную программу, которой является язык Бэйсик, с дискеты в память и запускают эту программу на выполнение.

Важно понимать, что запуск на выполнение целой программы - Бэйсика явился результатом выполнения очередной команды другой программы - ОС (говорят - ОС вызывает Бэйсик или управление передается Бэйсику). От того, что начал выполняться Бэйсик, ОС не ушла в небытие, она осталась в памяти, притаилась и ждет, когда Бэйсик, как и положено каждой порядочной программе, решив поставленные человеком задачи, закончит свою работу и уступит место. В этот момент ОС как ни в чем не бывало продолжит свою работу с команды, которая следует сразу же за той, что запускала Бэйсик (говорят - управление возвращается к ОС). Выполнив несколько следующих своих команд и поделав маленькие свои дела, ОС снова натыкается на свою команду, которая приказывает компьютеру ждать указаний от человека, что ему делать дальше. На этот раз человек может пожелать поиграть в какую-нибудь игру. ОС переписывает с дискеты или с винчестера в память и затем вызывает программу этой игры. После окончания игры управление снова возвращается ОС и т.д. Так и проходит с утра до вечера работа на компьютере: после выполнения очередного желания человека ОС получает управление, выполняет некоторую подготовительную работу (чистит память и т.п.) и снова ждет от человека новых пожеланий. Операционные системы бывают разные, самые популярные на персональных компьютерах - MS‑DOS и Windows.

А теперь рассмотрим подробнее период между запуском программы-Бэйсика и ее завершением. Получив управление, Бэйсик выполняет некоторые подготовительные действия и останавливается на той своей команде, которая ожидает ввода программы. Вы вводите с клавиатуры свою программу умножения, после чего Бэйсик продолжает работу и следующие его команды отправляют вашу программу с клавиатуры в память. Затем Бэйсик останавливается на другой своей команде, ждущей пожеланий человека. Здесь вы можете пожелать исправлять программу, запустить ее на выполнение, сохранить ее на диске и т.д. Предположим, вы приказываете выполнять программу. Тогда следующие команды Бэйсика, проанализировав ваш приказ, выполняют вашу программу, то есть происходит примерно то, что я подробно описал в 3.1.

Обратите внимание на то, сколько программ находится в этот момент в оперативной памяти. Во-первых, это ОС, которая ждет, когда вам надоест работать на Бэйсике. Во-вторых, это Бэйсик, который выполняет вашу программу, а выполнив, будет ждать от вас дальнейших приказов. И в-третьих, это сама ваша программа умножения. Это обычная практика работы всех компьютеров: в памяти может одновременно находиться от нескольких программ до нескольких десятков. Во многих из них есть команды, которые передают управление другим программам, а затем получают его обратно. Такая передача управления происходит очень часто и зачастую автоматически, без ведома человека. Начинающий программист может ничего этого и не знать. Ему достаточно знать те несколько клавиш, которые он должен нажать, и приказов, которые он должен отдать, чтобы добраться до своего языка программирования и производить там элементарные действия - ввод программы, ее исправление, запуск и т.п.

3.4. Внешние устройства компьютера

Как я уже говорил, процессор и оперативная память образуют "мозг" компьютера. Остальные устройства по отношению к ним являются внешними или периферийными. Мы рассмотрим назначение самых популярных из них, для чего не очень четко разобьем их на три класса:

 

·       Устройства ввода в компьютер информации, поступающей от человека, других компьютеров и аппаратов.

·       Устройства вывода из компьютера информации, предназначенной для человека, других компьютеров и аппаратов.

·       Внешняя память, то есть устройства памяти, дополняющие оперативную память.

 

Разбиение получилось не очень четким потому, что некоторые устройства можно отнести сразу к нескольким классам.

                                                                                                                                        3.4.1.            Устройства ввода

Первые три устройства предназначены для ввода информации в компьютер непосредственно от пальцев человека.

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

2. Мышь. Если вы играете с компьютером в "Зайца и волка" и управляете движением зайца на экране с помощью клавиатуры, у вас не слишком много шансов убежать от волка. И вот почему. Для управления движением объекта на экране используются обычно четыре клавиши: "вверх", "вниз", "налево", "направо". А если спасительный куст находится от зайца где-то наискосок, то вам придется сначала несколько раз нажать на клавишу, скажем, "вверх", а затем - несколько раз на клавишу, скажем, "налево". Пока вы нажимаете, волк до вас доберется.

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

Мышь чрезвычайно популярна не только в играх, но и в серьезных программах, так как позволяет быстро перемещать в любое место экрана маленькую фигурку-указатель, называемую курсором.

3. Джойстик. Предназначен примерно для того же, что и мышь. Обычно представляет собой коробочку с торчащим из нее рычагом. Коробочка стоит на месте, а рычаг вы можете наклонять в любую сторону, управляя движением объекта на экране.

4. Сканер. Если вы литературовед, то вас вполне могут интересовать вопросы такого типа: "Сколько раз встречается имя "Наполеон" в романе Льва Толстого "Война и мир"?". Поскольку сам роман очень большой, то хотелось бы ответ на этот вопрос поручить компьютеру. Однако тут возникает трудность: чтобы компьютер мог решить эту задачу, текст романа должен оказаться у него в памяти. Для этого вы должны весь текст набрать на клавиатуре - работа на несколько месяцев. Есть способ быстро ввести печатный текст с листа в компьютер. Для этого используется сканер - прибор, главной составной частью которого является специальное считывающее устройство наподобие телекамеры, передающее изображение листа бумаги с текстом в компьютер.

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

Вы спросите, а как же компьютер различает буквы, вводимые с клавиатуры"? А он различает совсем не буквы, а нажимаемые клавиши.

Сканером можно вводить с листа не только текст, но и картинки. Но для распознавания картинок нужны программы еще более сложные, чем для распознавания текста. Так, в мире пока не существует программы, которая бы могла по фотографии отличить собаку от кошки.

5. Микрофон. Предназначен для того, чтобы вы могли что-нибудь сказать компьютеру.

6. Ввод с дискеты. Вы уже знаете, что с дискеты можно вводить (загружать) в компьютер программы и другую информацию. Более подробно с дискетами вы познакомитесь чуть ниже.

 

Устройства вывода

1. Монитор (дисплей). Компьютер не умеет рисовать на экране монитора ничего, кроме светящихся точек (пикселов). Однако, расположив несколько светящихся точек в ряд вплотную друг к другу, получим линию, а сплошь заполнив ими некоторую область экрана, получим изображение фигуры. Пикселы расположены на экране стройными рядами. Каждый пиксел по указанию программы может быть потухшим или гореть заданным цветом (см. рисунок).

 

Принцип создания изображения на экране монитора

На рисунке вы видите, что на экране умещается 640 столбцов и 480 строк пикселов. Общее количество пикселов получается равным 640х480=307200. Минимальный различимый размер пиксела зависит от качества монитора. Чем больше различимых пикселов умещается на экране, тем размер этих пикселов меньше - и тем тоньше и правдоподобнее рисунки на экране. Общим количеством пикселов управляете вы через специальную электронную схему, находящуюся в компьютере – видеоадаптер (видеокарту). Если вы заставите видеоадаптер разбить экран на слишком большое количество пикселов, они перестанут быть различимыми и качество изображения не улучшится, а на деле и ухудшится. Количество цветов, которое могут использовать разные видеоадаптеры, тоже разное - от 4 у видеоадаптеров типа CGA до многих тысяч у видеоадаптеров типа SVGA. Вот несколько самых распространенных типов видеоадаптеров, расположенные в порядке возрастания количества пикселов и цветов : CGA, EGA, VGA, SVGA. Последние лет пять в магазинах продают только SVGA.

2.Принтер. Если мы хотим, чтобы числа, текст, рисунки, полученные компьютером, оказались не на экране, а на листе бумаги, мы предусматриваем в программе команду печати их на принтере. Принтер - это, попросту говоря, автоматическая пишущая машинка, подключенная к компьютеру и печатающая по командам программы. Изображение на листе получается из отдельных точек примерно по такому же принципу, как и изображение на экране. По физическому способу получения точек на листе принтеры делятся в основном на матричные, струйные и лазерные. Матричный принтер получает черные точки на листе ударами маленьких штырьков (игл) по красящей ленте, которая оставляет след на бумаге. Матричные принтеры самые дешевые и цветными быть не могут. Струйный принтер впрыскивает на лист мельчайшие капельки разноцветных чернил из специальных шприцев (сопел), поэтому изображение на листе может быть цветным. Лазерный принтер при помощи лазерного луча электризует в нужных точках специальный барабан, после чего тот входит в контакт с красящим порошком. Порошок пристает к барабану только там, где позволяет электрический потенциал, в результате чего на барабане  получается изображение. Затем барабан прокатывается по листу бумаги и отдает изображение ему. Качество печати у лазерного принтера самое высокое. Лазерные принтеры самые дорогие, они бывают и цветные.

3.Плоттер - это подсоединенное к компьютеру автоматическое чертежное устройство, которое чертит пером на бумаге чертежи, графики и другие изображения под управлением программы.

4.Звук. Если вы наблюдали, как работает персональный компьютер, то обратили внимание, что во время работы он издает звуки. Это могут быть отдельные редкие попискивания, простенькие мелодии. Их издает устройство, которым снабжаются все компьютеры и которое называется PC Speaker. Вы можете купить качественное звуковое устройство, которое называется звуковая карта, и тогда вы сможете услышать целый симфонический оркестр и даже внятную человеческую речь. Подробно о программировании мелодий вы прочтете в 8.1.

5.Вывод на дискету. Вы знаете, что на дискеты можно записывать из компьютера программы и другую информацию. Более подробно с дискетами вы познакомитесь чуть ниже.

 

Внешняя память

Мы рассмотрим три самых распространенных типа внешней памяти.

1. Винчестер (жесткий диск). У оперативной памяти есть два существенных недостатка:  1) Когда вы вечером выключаете компьютер, все содержимое оперативной памяти стирается. Электронная оперативная память не может что-то помнить, если к ней постоянно не подведен электрический ток.    2) Оперативная память сравнительно дорога, много ее не купишь, поэтому на большинстве персональных компьютеров сегодня установлено от 128 до 1024 миллионов байтов (сокращенно и приблизительно 1 миллион байтов называют мегабайтом) оперативной памяти. Однако некоторые программы, например, игровые, настолько велики, что требуют для своего запоминания больше 1000 мегабайтов. Это значит, что в компьютеры с маленькой памятью они просто не уместятся, а следовательно, не могут быть выполнены.

Для преодоления этих двух недостатков большинство современных персональных компьютеров снабжаются "винчестером" - устройством памяти на жестких магнитных дисках. Запись информации в нем производится на быстро вращающийся диск, покрытый магнитным веществом (см. рисунок). Принцип записи и считывания тот же, что и при записи и воспроизведении песенки на магнитофоне. Цена одного мегабайта памяти винчестера гораздо меньше, чем цена одного мегабайта оперативной памяти, поэтому сегодня на большинстве персональных компьютеров она имеет размер от 40000 до 200000 мегабайтов.

Схема работы памяти на магнитном диске

 

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

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

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

2. Дискета. Часто одним персональным компьютером пользуются по очереди несколько человек. Небрежный пользователь случайным нажатием на клавиши может стереть с винчестера нужную информацию, свою или чужую. В этой ситуациии помогает дискета. Это небольшой гибкий магнитный диск, упакованный в квадратный пластиковый или бумажный конверт. В системном блоке компьютера расположено устройство для считывания и записи информации на дискету - дисковод.  У дискет есть огромное преимущество перед винчестером - они съемные, а это значит, что важную информацию вы всегда можете переписать с винчестера на дискету, вынуть дискету из дисковода и унести домой, где с нее никто ничего не сотрет. Если с вашей информацией на винчестере что-нибудь случилось, вы приносите из дома дискету, вставляете ее в дисковод и переписываете с нее информацию обратно на винчестер. Вместимость одной дискеты - порядка полутора мегабайтов.

Дискеты имеют еще одно важное применение - с их помощью вы можете переносить понравившиеся вам программы и другую информацию с одного компьютера на другой.

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

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

3. Компакт-диски (CD-ROM). Компакт-диски в основном штампуются на заводе, как грампластинки. Информация на них хранится в виде микроскопических бугорков и бороздок под стекловидной поверхностью диска и считывается лазерным лучом.

Компакт-диски сменяемы, надежны, долговечны, вместительны (порядка 600 мегабайтов). На них обычно находятся большие коммерческие программы, изображения, аудиозаписи, видеофильмы для просмотра на компьютере.

 

Связь компьютеров между собой. Модем. Сети

Для переноса информации с одного компьютера на другой не обязательно использовать дискеты. Если два компьютера расположены рядом на соседних столах, то в простейшем случае их достаточно соединить коротким проводом, и при помощи простенькой программы (которая, кстати, есть в Нортоне) любая информация с винчестера одного компьютера по проводу небыстро переписывается на винчестер другого.

Теперь поговорим о соединении нескольких компьютеров. Группу компьютеров, постоянно соединенных друг с другом каким-нибудь способом для обмена информацией, называют компьютерной сетью.

Когда эти компьютеры расположены в пределах одного здания, их соединяют специальным кабелем и при помощи мощной операционной системы они могут удобно и с высокой скоростью обмениваться между собой любой информацией. Такая компьютерная сеть называется локальной.

А что делать, если компьютеры находятся в разных концах города или земного шара? В этом случае для связи компьютеров используют обычную телефонную сеть. Люди, чтобы переговариваться по телефонной сети, используют телефоны; компьютеры же вместо телефонов используют специальные устройства - модемы. Сигналы, посылаемые друг другу компьютерами без модемов, плохо передаются на большие расстояния,  модемы же преобразуют эти сигналы в удобный для дальней передачи вид. Такая компьютерная сеть называется глобальной. Самый известный пример всемирной глобальной компьютерной сети – Internet.

3.5. Кодирование информации в компьютере

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

Прежде всего заметим, что информация в компьютере - это программы или данные, с которыми эти программы работают.

Из чего состоит программа? Программа на языке программирования  состоит из команд, записанных при помощи букв, цифр, знаков математических действий, знаков препинания и других символов[4]. Будем понимать под символом любой знак (букву, цифру, знак математического действия, знак препинания и др.), который понимает компьютер. Большинство символов вы можете видеть на клавиатуре.

Из чего состоят данные? Если это числовые или текстовые данные, то они тоже состоят из символов[5]. О графических данных (изображениях) и звуке поговорим чуть ниже.

Таким образом, значительная часть информации в компьютере состоит из символов. Посмотрим, как в компьютере представлены символы. Для этого вспомним, как кодируются символы в азбуке Морзе, активно использовавшейся не так давно для передачи сообщений на расстояние. Каждый символ (буква, цифра) представлен в ней цепочкой точек и тире. Например, буква А представлена, как .-, буква Ч - как ---.. В компьютере каждый символ тоже кодируется, но по-другому – цепочкой из восьми единиц и ноликов. Например, буква А представлена, как 10000000, буква Ч - как 10010111, а цифра 7, как 00110111.

Кстати, вот полезная задачка для будущего программиста: Сколько всего символов можно закодировать цепочкой из восьми единиц и ноликов?

Пока мы с вами говорили о символах и их кодировании безотносительно к тому, какими физическими процессами они представлены в компьютере. Мы были на так называемом «логическом» уровне. Теперь перейдем на физический уровень. Пусть память передает на принтер букву Ч. В этом случае она посылает по шине в течение, скажем, восьми микросекунд,  серию из восьми электрических импульсов или промежутков между импульсами:

Первая микросекунда              -           импульс

Вторая микросекунда              -           промежуток

Третья микросекунда               -           промежуток

Четвертая микросекунда         -           импульс

Пятая микросекунда                -           промежуток

Шестая микросекунда              -           импульс

Седьмая микросекунда            -           импульс

Восьмая микросекунда                        -           импульс

Как видите, последовательность импульсов и промежутков в серии соответствует последовательности единиц и ноликов в коде буквы Ч. Величина импульса не играет никакой роли, все импульсы в микросхемах компьютера имеют обычно одну и ту же величину, скажем 3 вольта.

Таким же примерно образом обмениваются группами из 8 импульсов все устройства компьютера. В памяти эти группы живут в "замороженном" виде. В каждом байте оперативной памяти или памяти на диске умещается ровно одна такая группа, поэтому говорят, что устройства обмениваются байтами информации.

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

Когда кодируется изображение, то кодируется информация о каждом пикселе изображения (в виде группы единиц и ноликов). Например,

            Код 111            -           пиксел горит белым цветом

            Код 100            -           пиксел горит синим цветом

            Код 010            -           пиксел горит красным цветом

            Код 001            -           пиксел горит зеленым цветом

           . . . . . . . . . . . . . . . . . . . . 

            Код 000            -           пиксел не горит (черный)

Если программа предназначена для распечатки изображения с экрана монитора на цветном принтере, то она просто посылает на принтер по очереди коды информации о каждом пикселе изображения.

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

В заключение отмечу две неточности в моем изложении материала этого пункта. Я говорил, что единички в разных устройствах компьютера представляются наличием потенциала или намагниченности или бороздок и т.д., а вот нолики - их отсутствием. На самом деле в отдельных устройствах может быть и наоборот - единички это отсутствие, а нолики - наличие. Это не принципиально.

Второе: коды чисел в компьютере часто не являются совокупностью кодов цифр, эти числа образующих. Так, число 88 часто не представляется цепочкой 00111000  00111000, а для кодирования чисел используется другой, более экономный способ.

Вывод – любая информация в компьютере закодирована в виде цепочек, состоящих из единиц и нулей, и в таком закодированном виде передается внутри устройств и между устройствами компьютера. Обычно длина цепочки равна 8 и тогда такая цепочка называется байтом, а каждый из восьми ноликов или единичек называется битом. Таким образом, 1 байт = 8 битов.

________   _   _________

 

 

 

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

 

Цель этой части – научить вас составлять программы, сначала простые, затем все более сложные. А главная цель – добиться у вас ощущения того, что теперь вы можете самостоятельно писать программы любой сложности. По пути вы узнаете все необходимые для этого средства Паскаля. Причем в этой части я попытался обойтись простыми средствами. Если какое-то средство не казалось мне необходимым для достижения главной цели или было слишком сложным, я его откладывал на следующую часть. Таким образом, если эта часть посвящена простым средствам Паскаля, то следующая – более сложным.

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

Программа состоит из команд, как дом из кирпичей. Прежде, чем строить дом, нам, конечно, нужно узнать, как выглядят кирпичи. Команды, из которых состоит программа на Паскале и многих других языках, называются операторами (см. 2.5). Многие операторы на Паскале являются обращениями к процедурам (см. 2.3). Более подробно о смысле этих названий поговорим позже (8.3), а пока не будем делать между ними различия и все подряд будем называть операторами. Каждый новый изученный оператор будет открывать перед нами новые возможности Паскаля, поэтому поставим задачу для начала изучить побольше операторов на примерах их работы в простых программах и только затем перейдем к более сложным программам. 

4.1. Процедура вывода Write

В начало страницы

Первый оператор, с которым мы познакомимся, занимается исключительно тем, что приказывает компьютеру изобразить на экране монитора ту или иную информацию, состоящую из букв (символов) и чисел. Пусть мы хотим, чтобы компьютер изобразил на экране число 1999. Эту задачу выполняет процедура Write. К ней обратимся так -  Write(1999).  То, что нужно изобразить, положено заключать в круглые скобки. По-английски слово Write  означает "пиши". Для тех, кто плохо разбирается в английской транскрипции, я возьму грех на душу и приведу примерное произношение русскими буквами – «райт». Перевод и произношение всех нужных вам слов Паскаля вы найдете в приложении П3 и П4. Сам я настаиваю на умеренно правильном произношении с тех пор, как одна студенточка, указуя перстом на оператор Write, мило сказала: «Здесь  врите, Сергей Николаевич».

Говорят, что процедура Write выводит на экран число 1999, или (по традиции), что процедура Write печатаетчисло 1999, хотя, конечно, печатать на экране нельзя. (Правда, Паскаль всегда легко настроить так, чтобы Write выполнялся не на мониторе, а на принтере.)

А теперь поучимся на примерах:

 

КАК  ПИШЕМ ОБРАЩЕНИЕ К ПРОЦЕДУРЕ      ЧТО  ВИДИМ В РЕЗУЛЬТАТЕ  НА  ЭКРАНЕ

Write( -500)                                                         -500

Write(3 + 2)                                                         5

Пояснения: Можно печатать не только числа, но и результаты вычисления арифметических выражений

Write(3 2)                                                          6

   Знак    обозначает умножение

Write(2 2 - 1)                                                     3

Write( 'Хорошо!' )                                               Хорошо!

   Текст, в отличие от чисел и выражений, нужно брать в одинарные кавычки

Write( 'Я изучаю Паскаль' )                                Я изучаю Паскаль

Write( 3+2,  4+4)                                                 58

Это не пятьдесят восемь, а два числа: пять и восемь. “К сожалению”, они расположены вплотную друг к другу. Чуть ниже вам станет ясно, как преодолеть этот “недостаток” оператора Write.

Write( 'Это'  ,    4+4  ,  'кошек' )                                    Это8кошек

Как видите, один оператор Write может выводить сразу несколько элементов. Элементы нужно отделять друг от друга запятыми. В этом примере - три элемента:    1)текст  'Это'    2)выражение  4+4    3)текст 'кошек'. Все элементы выводятся в одну строку вплотную друг к другу. Если вся информация, выводимая оператором Write, не умещается в одну строку, то не уместившаяся часть автоматически выводится с начала следующей строки. 

Самое трудное для новичка – не путать запятые и кавычки, находить элементы и отличать текстовые элементы от чисел и выражений. Совет: сначала  найдите внутри скобок запятые. Рассмотрим пример:

Write     ( 8, 'котят',33,'щенят' )                         8котят9щенят

Здесь запятых три, значит элементов четыре. Вы легко заметите эти элементы, если представите себе, что запятые - это стены, разделяющие элементы.

8                          'котят'                       33         'щенят'

Теперь, чтобы отличить текстовые элементы от прочих, обратим внимание, что они заключены в кавычки.

                           'котят'                                      'щенят'

Еще пример: 

 Write     ( 'Это',4        +4,       'кошек' )               Это8кошек

Как видите, результат не зависит от количества  пробелов (пропусков, пустых мест) снаружи от текстовых элементов, взятых в кавычки. Но пробелы, встретившиеся внутри кавычек, отображаются на экране:

Write( 'Это',4+4,'ко  шек' )                                  Это8ко  шек

Write( 'Это   ',4+4,'   кошек' )                              Это   8   кошек

Write( '16+16=' ,  16+16)                                     16+16=32

Здесь два элемента : текст '16+16='  и выражение 16+16.  Несмотря на то, что текст очень похож на выражение, компьютер узнает его по кавычкам и не вычисляет, а просто воспроизводит, как записано -    16+16=  .  Любой элемент, заключенный в кавычки, Паскаль считает текстом.    

Write( 3+2,   '  '  , 4+4)                                       5  8

Здесь три элемента. Второй элемент - текст, состоящий из двух пробелов - '  '. В тексте можно использовать любые символы, имеющиеся на клавиатуре. 

Задание 2:  Изобразите на листке бумаги в клетку (один символ – одна клетка), что напечатает оператор   Write(‘12’, ‘5 + 1’, 5 + 1, ‘=’, 120+21)

 

4.2. Первая программа на Паскале

Конечно, кроме оператора Write в Паскале есть еще много операторов. Но для начального понимания того, как устроена программа на Паскале, достаточно и его. Вот пример программы:

BEGIN
     Write('Начали!');
     Write(8+1);
     Write(5-2)

END.

Вы видите, что программа состоит из трех операторов Write, записанных друг за другом. Кроме них, программы на Паскале содержат "знаки препинания" -  в нашем случае это служебные слова BEGIN и END, точка с запятой и точка. Слова BEGIN и END в нашей программе не являются, в отличие от Write, приказами на выполнение каких-либо действий по выполнению задания.

 Пока примем такие правила расстановки "знаков препинания":

1.    BEGIN будем ставить в начале программы, чтобы компьютеру было видно, откуда она начинается. (Это правило мы очень скоро уточним). BEGIN переводится НАЧАЛО, читается "би'гин".

2.    END с точкой ставится в конце программы, чтобы компьютеру было видно, где она кончается. END переводится КОНЕЦ, читается "энд".

3.    Точкой с запятой необходимо отделять операторы друг от друга. Служебные слова BEGIN и END от операторов точкой с запятой отделять не нужно.

 Итак, программа на Паскале, как и на многих языках, состоит из последовательности операторов, выполняемых компьютером в порядке записи. Так, выполняя нашу программу, компьютер сначала выведет на экран слово Начали!, затем число 9, затем число 3. На этом работа программы завершится. На экране мы увидим   Начали!93

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

                   BEGIN                              Write(    'Начали!')    ;
           Write( 8  +1               )         ;Write( 5

-2) END.

Эта программа записана правильно и, с точки зрения компьютера, не менее изящно, чем предыдущая.

Неважно также, какими буквами - заглавными или строчными, полужирным шрифтом или обычным - записаны названия служебных слов и операторов.

bEgin   WriTe( 'Начали!') ;   write( 8+1) ;  WRITE( 5-2)    enD.

Я  для более легкого чтения программ буду выделять полужирным шрифтом некоторые из служебных слов (список всех служебных слов вы найдете в 11.2) и другие общеупотребительные слова Паскаля.

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

BEGIN

     Write('Начали!');    {Это приказ напечатать слово «Начали!»}
     Write( 8+1) ;
     Write( 5-2)             {А здесь компьютер из 5 вычтет 2 и напечатает результат}
END.                        {Не забыть бы точку}

Не забывайте брать комментарии в фигурные скобки, иначе компьютер подумает, что это операторы, не поймет их и сообщит вам, что у вас в программе ошибка. Правда, есть одно исключение, когда компьютер воспринимает заключенную в фигурные скобки информацию, как директиву на выполнение кое-каких действий, но об этом поговорим позже, в 15.2.

4.3. Выполняем первую программу на компьютере

Если у вас под рукой есть компьютер, то сейчас вам совершенно необходимо вашу программу на компьютере выполнить и посмотреть на результаты. (Если же до компьютера в ближайшем будущем не добраться, смело переходите к следующему параграфу.) Сейчас я вкратце поясню, в каком порядке и какие кнопки нужно нажимать на компьютере, чтобы это сделать. Пояснение рассчитано на тех, кому не терпится поскорее сесть за компьютер и кто уже имеет небольшой опыт работы на нем, в частности умеет вводить в компьютер две-три строчки текста и запускать, например, нужную игру. Остальным же нужно немедленно приступить к изучению части IV, где вас ждет то же пояснение, но уже основательное и подробное, рассчитанное на тех, кто начинает с нуля.

Торопыжкам все равно придется изучать часть IV, но, возможно, попозже. Основательным же скажу, что пока при последовательном изучении части IV вам достаточно остановиться на «Сообщениях об ошибках». «Пошаговый режим» и прочее оставьте на потом.

 

Итак, вот последовательность действий для опытных по выполнению первой программы на компьютере:

 

1)       Запустите Паскаль. (файл turbo.exe). Наверху экрана возникнет меню, а под ним синее (обычно) окно во весь экран с мигающим курсором. Можно вводить программу. Если окно не появилось, то нажмите клавишу F10, а затем в меню слово File и New. (В дальнейшем для краткости я просто напишу File ® New).

2)       Введите в это окно программу, как обычный текст в обычном текстовом редакторе.

3)       Если получится, сохраните программу на жесткий диск. Для этого File ® Save, а затем в открывшемся диалоговом окне выберите каталог и введите имя файла, в который сохраните программу. 

4)       Выполните программу. Для этого выполните Run® Run, а чтобы увидеть результаты, нажмите Alt-F5, что означает: удерживая нажатой клавишу Alt, щелкните по клавише F5. Выполнив программу в первый раз, поэкспериментируйте – измените содержимое операторов Write – и выполните программу еще раз.

5)       Если в вашей программе Паскаль заметил ошибку, он ставит на нее (или недалеко от нее) курсор и сообщает о ней золотыми буквами на красном фоне. Наиболее распространенные для начинающих сообщения об ошибках вы найдете несколькими строками ниже. Более полный список – в части IV. Исправьте ошибку и вернитесь к пункту 3.

 

Распознаем сообщения компьютера об ошибках

 

Итак, вы добились того, чтобы ваша программа печатала нужный результат – Начали!93. Теперь давайте поэкспериментируем. Цель эксперимента – научить вас правильно реагировать на сообщения об ошибках, которые выдает Паскаль. Поскольку нужный результат напечатан, то в вашей программе ошибок нет. Придется нам намеренно вводить ошибки и наблюдать за реакцией Паскаля.

 

6.    Сотрите точку после END. Теперь запустите программу. На экране появится сообщение Unexpected end of file,  которое переводится Неожиданный конец файла. Паскаль нашел эту ошибку в программе и сообщает нам о ней, поставив курсор в строку, содержащую ошибку. Уберите сообщение компьютера клавишей Esc.

7.    Исправьте эту ошибку и введите другую – сотрите точку с запятой после Write(‘Начали!’). На этот раз сообщение такое –   “;” expected,  что значит – Ждал точку с запятой. Однако курсор стоит совсем не в том месте, где ошибка, а в начале следующего оператора. Вам придется привыкнуть к тому, что Паскаль не всегда точно определяет место ошибки.

8.    Исправьте эту ошибку и введите другую – напишите само имя оператора с ошибкой - Wite(‘Начали!’).  Реакция Паскаля – Unknown identifier, что означает - Неизвестное имя. Имеется в виду имя процедуры Write.

9.    Исправьте эту ошибку и введите другую - сотрите правую кавычку в операторе  Write(‘Начали!’), чтобы получилось  Write(‘Начали!). Реакция Паскаля – String constant exeeds line. Перевод вы пока не поймете, но в общем это намек на то, что раз кавычку открыли, то надо ее закрывать.

10. Теперь сотрите левую кавычку. Реакция Паскаля – Syntax error, что значит Синтаксическая ошибка. Паскаль в затруднении – он знает, где ошибка, но в чем она состоит – не знает.

11. Исправьте ошибки и введите другую - сотрите правую скобку в операторе  Write(‘Начали!’), чтобы получилось  Write (‘Начали!’.    Реакция Паскаля  –   “)” expected,  что значит – Ждал скобку.

12. Исправьте ошибку и введите другую - сотрите левую скобку в операторе  Write(‘Начали!’), чтобы получилось  Write ‘Начали!’). Реакция Паскаля  –   “;” expected,  что значит – Ждал точку с запятой, причем курсор стоит на букве Н. Вот здесь Паскаль неправ (это не значит, что он глупый, просто невозможно учесть все возможные причины ошибки). Вам придется привыкнуть и к тому, что Паскаль иногда неправильно определяет характер ошибки.

4.4. Процедура вывода WriteLn. Курсор

Оператор WriteLn  -  читается "райт 'лайн", переводится - ПИШИ СТРОКУ. Правила его записи и выполнения те же, что и у Write, с одним исключением - после выполнения оператора Write следующий оператор Write или WriteLn печатает свою информацию в той же строке, а после выполнения оператора WriteLn - с начала следующей. Примеры:

ПРОГРАММА

ЧТО  ВИДИМ НА  ЭКРАНЕ

BEGIN  Write    ( 'Ама' ); Write    ( 'зонка' ) END.

Амазонка

BEGIN  Write    ( 'Ама' ); WriteLn( 'зонка' ) END.

Амазонка

BEGIN  WriteLn( 'Ама' ); Write    ( 'зонка' ) END.

Ама

зонка

BEGIN  WriteLn( 'Ама' ); WriteLn( 'зонка' ) END.

Ама

зонка

Все вышесказанное можно более точно описать с помощью понятия курсора. Если вы когда-нибудь вводили текст в компьютер с клавиатуры, то знаете, что вводимый вами текст для вашего удобства автоматически появляется на экране монитора. Вы также, вероятно, обратили внимание на короткую светлую черточку или прямоугольное пятнышко, которое "бежит" на экране перед вводимым текстом.  Так, если вы вводите с клавиатуры слово BEGIN, то:

   после нажатия на клавишу B на экране вы увидите     B_ 

   после нажатия на клавишу E на экране вы увидите     BE_

   после нажатия на клавишу G на экране вы увидите     BEG_                           и т.д.

Курсор предназначен для того, чтобы показывать пользователю, где на экране появится следующий символ, который он введет с клавиатуры. Курсор точно так же бежит по экрану впереди текста и тогда, когда информация появляется на мониторе не при вводе с клавиатуры, а во время исполнения программы в результате выполнения операторов Write или WriteLn,

Так вот. Разница между процедурами Write и WriteLn в том, что после выполнения Write курсор остается в той же строке, а после выполнения WriteLn курсор прыгает в начало следующей строки, а значит и все следующие символы волей-неволей будут выводиться в следующей строке.

Оператор WriteLn можно использовать просто для перевода курсора в начало следующей строки. Для этого достаточно написать одно слово WriteLn без скобок. 

Задание 3:  Определите без компьютера и изобразите на листке бумаги в клетку (один символ – одна клетка), что напечатает программа:

BEGIN
     Write (1992);
     WriteLn ( '          Mы начинаем!' );
     WriteLn (68);
     WriteLn;
     WriteLn ('Шестью шесть    ',                   66,      '.  Арифметика:', (6+4)3)
END.

Пояснение: Значок    обозначает умножение. Выполнив задание на бумаге, выполните программу на компьютере и сверьте результаты. Совпадает ли число пробелов между символами? Если не совпадает, еще раз прочтите материал, чтобы понять, почему. Измените число пробелов в разных местах последнего WriteLn. Как изменилась картинка на экране? Почему? Добавте рядом с пустым WriteLn еще один. Что изменилось? Почему?

 

4.5. Переменные величины. Оператор присваивания

Понятие переменной величины вам известно из школьной математики. Пусть несколько лет назад ваш рост равнялся 130 см. Обозначим этот факт так: r=130. Теперь он равен 140 см, то есть r=140. Получается, что величина r изменилась.Поэтому она называется переменной величиной. Числа 130 и 140 называются  значениями переменной величины r.

Любой язык программирования умеет обращаться с переменными величинами. Без них он был бы очень слаб и смог бы извлечь из компьютера только возможности карманного калькулятора. Точно так же алгебра без переменной величины превратилась бы в арифметику. Однако, преимущества применения переменных величин нам откроются позже, а пока наша задача - к ним привыкнуть.

Что же мы можем делать с переменными величинами, программируя на Паскале? Прежде всего, мы можем задавать компьютеру значение той или иной переменной величины. Это мы можем сделать при помощи нового оператора, который называется оператором присваивания. Так, если мы хотим сказать, что а имеет значение 6, то должны записать   а := 6.  Как видите, вместо значка  =  употребляется значок   :=   .  Он называется знаком присваивания ,  а сама запись   а:=6  называется оператором присваивания.  Говорят, что величине а присваивается значение 6. С момента выполнения оператора а:=6 компьютер будет помнить, что а равно шести.

Справа от значка := в операторе присваивания можно писать не только числа, но и переменные величины, и выражения. Выражение пока будем понимать так, как его понимает школьная математика. Например, после выполнения следующего фрагмента программы:        ....  a:=23+4;   b:=a;   y:=a+b+1....    компьютер будет знать, что a равно 10, b равно 10, y равно 21. Еще несколько примеров:

ФРАГМЕНТ  ПРОГРАММЫ

ЧТО ЗАПОМНИТ КОМПЬЮТЕР

v := -2+10;  h := 10v;  s := v+h

v=8       h=80     s=88

t := 0;   n := 2t+40;    z := -n

t=0       n=40     z= -40

Необходимо помнить, что компьютер выполняет оператор присваивания "в уме", то есть результат его выполнения не отображается на экране. Если мы хотим видеть результат выполнения оператора присваивания, используем WriteLn. Примеры:

ФРАГМЕНТ   ПРОГРАММЫ

ЧТО  ВИДИМ НА  ЭКРАНЕ

v := -2+10;  h := 10v;  s := v+h;  WriteLn (s)

88

v := -2+10;  h := 10v;  s := v+h;  WriteLn ( 's' )

s

v := -2+10;  h := 10v;  WriteLn (v+h)

88

v := -2+10;  WriteLn (v+10v)

88

v := -2+10;  h := 10v;  s := v+h;  WriteLn (v, '   ',h,  '   ',s)

8   80   88

v := -2+10;  h := 10v;  s := v+h;  WriteLn (v+1000, '   ',10h, '   ',s)

1008   800   88

Нужно иметь в виду, что слева от знака := может стоять только переменная величина, но не число и не  выражение. Можно писать с:=34, но нельзя писать 34:=с. Можно писать  z:=f-v+990, но нельзя писать  f-v+990:=z. Правило это принято потому, что оператор присваивания сначала смотрит или вычисляет, какое значение имеет правая часть, а затем присваивает это значение переменной, стоящей в левой части. Нет смысла присваивать значение числу или  выражению.

Обратите внимание на один важный момент. Когда школьник видит  выражение (например, d+2d), он не обязательно его вычисляет. Он может его преобразовать или, скажем, упростить (получив 3d). Компьютер же, видя  выражение, сначала его, может быть, и упростит, но затем обязательно вычислит. А для этого он должен знать численные значения входящих в него величин (в нашем случае это величина d). Таким образом, вычисляя правую часть оператора присваивания (например, y:=a+b+1), компьютер должен обязательно заранее знать, чему равны переменные, из которых эта правая часть состоит (в нашем случае это a и b). Ответственность за это знание лежит  полностью на программисте. Пусть забывчивый программист записал такой фрагмент:... а:=10; y:=a+b+1..., нигде в программе не придав b никакого значения. Естественно, при вычислении  выражения a+b+1 компьютер не будет знать, чему равно b. В такой ситуации разные языки программирования поступают по-разному.  Некоторые просто отказываются вычислять  выражения, некоторые подставляют вместо b нуль, Паскаль же иногда может поступить довольно вредно: вместо b он подставит, что бог на душу положит, и получит сногсшибательный результат, например, игрек становится равным  -8904.

Подведем предварительные итоги обсуждения очень важного оператора присваивания:

            Оператор присваивания состоит из знака присваивания :=, слева от которого пишется переменная, а справа - число, переменная или  выражение. При выполнении оператора присваивания компьютер "в уме" (то есть ничего не показывая на мониторе) вычисляет правую часть и присваивает вычисленное значение переменной, стоящей в левой части.

Задание 4:   Какое значение будет присвоено переменной t после выполнения фрагмента:   k:=1+2;  s:=2k;  t:=6-s ?

4.6. Описания переменных (VAR)

В 4.5 я писал фрагменты программ, содержащих переменные величины. А  теперь пришло время писать такие программы целиком. Но для этого я должен написать кое-что выше begin, чего раньше не делал. Вот пример программы:

VAR  a,b : Integer;
BEGIN
     a:=100;
     b:=20;
     WriteLn (a + b)
END.

Очевидно, эта программа напечатает число 120. В программе новостью для нас является только первая строка. Называется она  описанием  переменных величин а и b. Я пока не буду излагать правила составления описаний переменных. Скажу только, что описание начинается со служебного слова var (читается ВАР, это сокращение от английского variable - переменная). После него записываются имена всех переменных, встречающихся в программе с указанием через двоеточие типа значений, которые каждая переменная имеет право принимать. В нашем случае я записал имена переменных а и b, так как только они встречаются между BEGIN и END. Слово Integer (читается " 'интеджер", переводится ЦЕЛЫЙ)  указывает, что а и b имеют право быть целыми числами, а не дробными. Смысл подобного ограничения в том, что Паскаль по-разному работает с целыми и дробными числами, а поскольку он язык строгий, то требует, чтобы программист точно указал, к какому из этих двух типов относятся числа.

Зачем нужно описание? Для понимания этого сначала нужно вспомнить, для чего нужна компьютеру память и как она устроена (см.3.2), а также порядок работы человека на компьютере (см.2.7).

После того, как программист ввел программу в память, он приказывает компьютеру ее исполнить. Но компьютер при этом не сразу принимается выполнять программу, а сначала совершает компиляцию, то есть перевод программы с Паскаля на собственный машинный язык. (Часто вместо термина «компиляция» употребляют более общий термин «трансляция»). Во время компиляции компьютер производит некоторые подготовительные действия, одним из которых является отведение в памяти места под переменные величины, упомянутые в программе. При этом компьютер "рассуждает" так: Раз в программе упомянута переменная величина, значит она в каждый момент времени будет иметь какое-то значение, которое, хочешь не хочешь, надо помнить. Лучше, чтобы не спутаться, заранее отвести в памяти определенное место для запоминания текущего значения каждой переменной величины и только потом уже выполнять программу.  Будем называть место, отведенное в памяти под данную переменную, ячейкой.

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

Итак, при решении задачи в памяти компьютера находится программа решения задачи, а в другом месте памяти - значения переменных, описанных  в программе. Кстати, вы можете узнать, сколько байтов в памяти займет текст программы, если посчитаете, сколько в ней букв и других символов (включая пробелы).     

Вы можете сказать: Зачем хранить значения 100 и 20 в каком-то другом месте, если они содержатся прямо в тексте программы, которая и без того хранится в памяти? Получается, что эти числа хранятся в двух разных местах памяти. Ответ на этот вопрос выходит за рамки книги.

                                                                                                                                        4.6.1.            Integer   и   LongInt

Итак, в Паскале принято правило, что если человек описал переменную, как Integer, то он разрешает ей принимать значения только целого числа. Число типа Integer занимает в памяти два байта. Значит, под переменные а и b компьютер отводит в памяти ячейки по два байта каждая. Два байта - это маленький объем памяти и уместиться в него может лишь небольшое целое число, а именно - число в диапазоне от   -32768  до 32767. Если бы в предыдущем примере вам понадобилось взять а=40000, то Паскаль получил бы неправильную сумму.

Для того, чтобы переменная имела право принимать значения больших целых чисел, она должна быть описана не как Integer, а как LongInt (сокращение от Long Integer - Длинное Целое, читается “лонг’инт”). Под переменную типа LongInt компьютер отводит в памяти 4 байта и она может принимать значения в диапазоне от  ‑2147483648 до 2147483647.

Задание 5:   Население Москвы равняется  а=9000000 жителей. Население Нью-Васюков равняется b=1000 жителей. Напишите программу, которая определяет разницу в числе жителей между двумя городами. Используйте переменные величины.

Задание 6:   Попробуйте ввести ошибку. Опишите переменные величины не как LongInt, а как Integer. Какова реакция Паскаля?

 

4.7. Что делает оператор присваивания с памятью

Рассмотрим пример программы:

VAR  a,b,y : Integer;
BEGIN
     a:= 10;
     b:= 6;
     y:= a+b+1;
     WriteLn (y+200)
END.

В программе между BEGIN и END встречаются три переменные, поэтому все они перечислены в описании    VAR  a,b,y : Integer .   Компьютер отведет для них в памяти три двухбайтовые ячейки.

В 4.5 я рассказывал о работе оператора присваивания, используя такие выражения, как "компьютер знает",  "компьютер помнит".  Но нам необходимо более строгое понимание работы этого оператора, понимание "ближе к железу":

Выполняя оператор присваивания (например, y:=a+b+1), компьютер сначала смотрит на его правую часть (a+b+1). Если в ней встречаются переменные (в нашем случае это a и b ), то компьютер перед вычислением ищет их значения в отведенных под них ячейках памяти (и находит там 10 и 6), подставляет эти значения в правую часть и вычисляет ее. Затем вычисленное значение (17) компьютер записывает в ячейку памяти, отведенную под переменную, поставленную в левой части (y).  

Таким образом, когда мы говорим "Компьютер запомнил, что а равно 2", мы подразумеваем "Компьютер записал в ячейку памяти, предназначенную для а, число 2".

А теперь рассмотрим, как будут заполняться информацией ячейки a,b,y   в процессе выполнения нашей программы. В самом начале выполнения паскалевской программы в них находится неизвестно что. Первым выполняется оператор  a:=10. Согласно только что приведенному определению оператора присваивания в ячейку a будет записано число 10. Затем выполняется оператор  b:= 6 и в ячейке b появляется шестерка. Затем выполняется оператор  y:= a+b+1. Компьютер смотрит, что находится в ячейках a и b, видит там 10 и 6, подставляет их в выражение a+b+1, получает 17 и записывает в ячейку y. Наконец выполняется оператор  WriteLn (y+200). Компьютер заглядывает в ячейку y, видит там 17, вычисляет  17+200 и выводит 217 на экран.

Схематически этот процесс можно изобразить так:

ПОРЯДОК  ИСПОЛНЕНИЯ ОПЕРАТОРОВ

ЧТО НАХОДИТСЯ В ЯЧЕЙКАХ ПАМЯТИ

ЧТО ВИДИМ НА ЭКРАНЕ

a

b

y

a:= 10

10

?

?

 

b:= 6   

10

6

?

 

y:= a+b+1        

10

6

17

 

WriteLn (y+200)

10

6

17

217

Теперь мы можем также уточнить работу оператора WriteLn:

Если в скобках оператора WriteLn встречаются выражения с переменными величинами, то Паскаль находит в памяти значения этих величин, подставляет их в выражения, вычисляет выражения и результат выводит на экран.

Задание 7: Поменяйте местами операторы b:= 6   и   y:= a+b+1. Что произойдет?

 

                                                          4.7.1.            Оператор присваивания меняет значение переменной величины

Пока я не рассматривал программы, в которых переменные меняют свою величину. Теперь настало время такую программу рассмотреть:

VAR k : Integer;
BEGIN
     k:=10;  WriteLn (k);   k:=25;   WriteLn (k);   k:=4;   WriteLn (k)
END.

 

Запишем схематически процесс изменения информации в ячейке k:

ПОРЯДОК  ИСПОЛНЕНИЯ ОПЕРАТОРОВ

ЧТО НАХОДИТСЯ В ЯЧЕЙКЕ ПАМЯТИ k

ЧТО ВИДИМ НА ЭКРАНЕ

k:=10   

10

 

WriteLn (k)

10

10

k:=25   

25

 

WriteLn (k)

25

25

k:=4

4

 

WriteLn (k)

4

4

Как видите, в процессе работы программы содержимое ячейки k меняется.  Так, при выполнении оператора k:=25 там вместо значения 10 появляется 25. А куда же девается десятка? Она стирается, рисовать карандашом винчестер то есть компьютер забывает ее безвозвратно. Здесь действует общий принцип работы всех компьютеров:

Если в какое-нибудь место памяти или диска записывается новая информация, то старая информация, записанная там раньше, автоматически стирается, даже если она кому-то и нужна.

Раз теперь вместо 10 в ячейке k находится 25, то оператор WriteLn (k) печатает уже 25. Следующий оператор   k:=4   запишет на место 25 четверку, а   WriteLn (k)   ее напечатает.

А что напечатает следующая программа?

VAR f : Integer;
BEGIN
     f:=30;
     f:=f+4;
     WriteLn (f)
END.

Оператор   f:=30  запишет в ячейку  f  число 30.  А что сделает странный оператор f:=f+4?  По определению оператора присваивания он сначала вычислит правую часть  f+4, подставив туда вместо f  его значение, взятое из ячейки, и получит 34. Затем число 34 будет записано в ячейку, отведенную под переменную, обозначенную в левой части, то есть опять в ячейку  f. При этом старое значение 30 будет стерто.

Таким образом, оператор f:=f+4 просто увеличивает число в ячейке f  на четверку или, другими словами, увеличивает  f  на 4.

Задания 8-10:

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

8)       a:=100;  a:=10a+1;  WriteLn (a)

9)       a:=100;  a:=-a;  WriteLn (a)

10)   a:=10;  b:=25;  a:=b-a;  b:=a-b;  WriteLn (a,' ',b)

4.8. Имена переменных

Мы привыкли переменные величины обозначать буквами (a, s, d ... ). Большинство языков программирования, в том числе и Паскаль, позволяет обозначать переменные не только буквами, но и целыми словами. Вот два равносильных фрагмента программы:         

a:=3;

Summa:=3;

b:=4-a;

ROBBY:=4-Summa;

WriteLn (a,b+50)

WriteLn (Summa,ROBBY+50)

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

Будем называть обозначение переменной именем или идентификатором этой переменной.

Правило:

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

Примеры правильной записи имен:

a     

x     

velichina     

zzz       

polnaja_summa    

tri_plus_dva   

s25   

k1   

_k1     

___

a1b88qq     

oshibka     

Примеры неправильной записи имен:

ж                                  - буква не латинского алфавита
polnaja  summa           - содержится символ (пробел), не являющийся буквой, цифрой или знаком подчеркивания
2as                               - начинается с цифры

Domby&Son                 - содержится символ &, не являющийся буквой, цифрой или знаком подчеркивания

4.9. Математика. Запись арифметических выражений

Если вы - школьник не самых старших классов, то не все, что здесь написано, будет вам понятно. Не огорчайтесь, при дальнейшем чтении непонятные вещи вам не понадобятся.

В правой части оператора присваивания и в операторе WriteLn мы записывали выражения, имеющие численное значение (например, a+b-8). Такие выражения называются арифметическими. В будущем мы увидим, что выражения могут быть не только арифметическими.  А сейчас рассмотрим математические возможности Паскаля.

Четыре действия арифметики (и еще два) обозначаются в Паскале следующим образом:

ДЕЙСТВИЕ

РЕЗУЛЬТАТ

СМЫСЛ

2    +   3

5

плюс

4    -    1

3

минус

2        3

6

умножить

10  /    5

2

разделить

17  div  5

3

целочисленное деление

17  mod  5

2

остаток от целочисленного деления

На уроках математики мы привыкли писать   ab+cd , подразумевая:  a умножить на b плюс c умножить на d.   В Паскале это выражение мы обязаны писать так:  ab+cd.  Иначе компьютер подумает, что нужно к переменной, имеющей имя ab, прибавить переменную, имеющую имя cd. Во избежание двусмысленности знак умножения положено писать всегда. Например,    a  (b+c).

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

       ,

очень затруднен. Поэтому для обозначения деления и выбрана косая черта. Это выражение на Паскале положено записывать так:     (a+1)/(b+1).  Если бы мы не поставили скобок, то выражение получилось бы таким    a+1/b+1, а это неправильно, так как компьютер, как и мы, всегда перед сложением и вычитанием выполняет умножение и деление, поэтому в последнем случае он бы сначала разделил  1  на  b, а затем к результату  прибавил  a  и 1.

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

Его можно было бы записать так:    (1 + a / (2+ab)) / (3+a)    b .  Однако, при такой записи мы не знаем, что Паскаль будет делать раньше - делить   (1 + a / (2+ab))   на  (3+a)  или умножать (3+a)  на b.  А от этого зависит результат. Добавим для верности пару скобок: ((1 + a / (2+ab)) / (3+a))    b.  Теперь все в порядке.

К сожалению, в выражениях разрешается писать только круглые скобки. Квадратные и фигурные запрещены. От этого сложные выражения с большим количеством скобок на глаз воспринимаются с трудом, так как трудно для конкретной скобки увидеть ее законную пару. В этом случае я могу посоветовать идти "от малого к большому", то есть сначала заметить самые малые из взятых в скобки фрагменты выражения (у нас это  3+a  и  2+ab). После этого будет уже легче заметить более крупные фрагменты, такие как 1 + a / (2+ab), и т.д.

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

Математические функции.  Кроме четырех действий арифметики Паскаль может выполнять и другие математические действия, например, возведение в квадрат, для чего имеется специальная функция - Sqr. На уроке математики мы обозначаем показатели степени маленькими цифрами и буквами. На компьютере такие цифры и буквы вводить не всегда возможно, поэтому в Паскале принято другое обозначение. Например, пять в квадрате обозначается так -   Sqr(5),   a+b  в квадрате так  -   Sqr(a+b). Здесь Sqr  -  сокращение от английского слова square -  квадрат. То, что нужно возвести в квадрат, записывается в скобках.

Приведу неполный список математических функций Паскаля:

ДЕЙСТВИЕ

РЕЗУЛЬТАТ

СМЫСЛ

Sqr (5)       

25           

возведение в квадрат

Sqrt (25)     

5            

корень квадратный 

Pi            

3.1415...   

число пи

Frac (23.192) 

0.192        

дробная часть числа

Int (3.98)    

3.0            

целая часть числа

Round (5.8)   

6             

округление

Abs ( -20)

20

абсолютная величина (модуль) числа

Random        

0.73088    

случайное число из диапазона (0 - 1)

Random (200)

106          

случайное целое число из диапазона (0 - 199)

Кроме этого, имеются функции   sin, cos, arctan, exp, ln и процедура Randomize. К сожалению, в Паскале нет специальной функции для возведения в произвольную степень.

Примеры:

Выражение       Sqr(2+1)                                   при вычислении даст 9
Выражение       10+Sqr(2+1)                              при вычислении даст 19
Выражение       1+Abs(5-8)                                при вычислении даст 4
Выражение       Sqr(2)+Sqrt(35+1)                     при вычислении даст 10
Выражение       Sqrt(8+Int(41.5))                        при вычислении даст 7
Выражение       21 div (Round(Pi+1))                 при вычислении даст 5

Задание 11:   Определите без компьютера, что напечатает данная программа:

VAR a,b: Integer;
BEGIN
     a:=(Sqr(2)+1)(20- Sqr(22))-11;
     b:=11 div (a-4);
     WriteLn (Sqr(a)+b-1)
END.

4.10. Вещественные числа в Паскале

Вот ошибочная программа:

VAR a,b,y : Integer;
BEGIN
    a:=10;   b:=6;
    y:= a / b;
    WriteLn (y)
END.

Паскаль откажется выполнять эту программу, так как знает, что при делении целого на целое результат может получиться дробный, а это значит, что в ячейку  y  придется записывать дробное число. Но описание      VAR a,b,y : Integer      запрещает это делать. Вот вам еще один пример придирчивости Паскаля. Если бы мы даже вместо   b:=6   написали  b:=2, все равно Паскаль отказался бы делить.

Что же делать? Конечно же, Паскаль предлагает простой выход. Программист имеет право любую переменную описать не как целую (Integer), а как вещественную (Real). В этом случае переменная имеет право принимать любые целые и дробные значения. Вот правильная программа:

VAR   a,b     :Integer;

          y        :Real;

BEGIN

     a:=10;   b:=6; 

     y:=a / b;

     WriteLn (y)

END.

По-английски Real читается   " 'риэл", переводится "вещественный". Под переменную типа Real Паскаль отводит в памяти ячейку размером в 6 байтов.

Что мы увидим на экране в результате выполния оператора WriteLn (y)?  Если вы думаете, что 1.666666, то ошибаетесь. Переменные, описанные как Real, Паскаль выводит на экран в так называемом экспоненциальном  формате (виде), с первого взгляда непонятном. Более подробно об этом и других форматах мы поговорим в 14.5, а пока, чтобы заставить Паскаль выводить вещественные числа в обычном, понятном виде, допишем кое-что в оператор вывода -  WriteLn (y  :8:3).  Это значит, что мы хотим численное значение переменной  y  типа Real  видеть на экране в привычном виде с 3 знаками после десятичной точки, а всё изображение числа не должно занимать больше 8 символов, включая целую часть, дробную часть, знак и десятичную точку. Этот оператор напечатает на экране      1.667. Здесь напечатано действительно 8 символов (три пробела, предшествующие единице, видны вам, как пустое место). Вместо 8 и 3 в операторе программист может писать любые имеющие смысл числа.              

Поэкспериментируйте: (y  :38:3),     (y  :20:10),     (‘Результат равен’, y  :8:3).

Три совета

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

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

2. В каждой из этих программ экспериментируйте, то есть разными способами изменяйте в них то, что я как раз в этот момент объясняю. Например, если я объясняю оператор    for i:=1 to 5,  пробуйте    for i:=1 to 10.

3. Выполняйте и сверяйте с ответом все задания. Это, конечно, главный совет из трех. Учтите, что сверенная с ответом правильно работающая программа – ваша победа, сверенная с ответом неправильно работающая программа – временное поражение, отказ от сверки - разгром.

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

4.11. Порядок составления простой программы

Задача:

Известны размеры спичечной коробки: высота - 12.41 см., ширина - 8 см., толщина - 5 см.  Вычислить площадь основания коробки и ее объем.

 

Порядок составления программы:

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

В нашем случае программист должен знать формулы для вычисления площади основания коробки и ее объема :   площадь = ширина х толщина,  объем = площадь х высота.

2. Нужно придумать имена переменным.  Имя переменной должно говорить о ее смысле. Если смыслом является ширина коробки, то не ленитесь и не называйте ее а, потому что через полгода, разбираясь в своей полузабытой программе, вы будете долго тереть лоб и думать – Что, черт возьми, я обозначил через а? Называйте ее shirina (если вы не знаете английского) или, к примеру, width (если знаете). Так делают все профессиональные программисты (а они, как известно, терпеть не могут трудиться зря, значит, зачем-то это им нужно).

Удовлетворимся такими именами:

shirina               -           ширина
tol                    -           толщина
visota               -           высота
pl                     -           площадь
V                      -           объем

3. Нужно определить, какого типа будут переменные. Поскольку ширина и толщина - целые, то и площадь будет целой. Высота и, следовательно, объем - вещественные. Первые две строки программы будут такими:

VAR        shirina,tol,pl : Integer;    

               visota,V        : Real;

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

BEGIN

               shirina:=8;   tol:=5;   visota:=12.41;

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

               pl := shirina tol;

               V  := pl visota;

6. После получения результата его нужно напечатать.   Действительно, все операторы присваивания компьютер выполняет "в уме". После их выполнения в ячейках памяти pl и V  будут находиться числовые результаты решения задачи. Чтобы их узнать, человек в нашем случае может использовать оператор WriteLn, после чего программу можно заканчивать:

               WriteLn (pl,'    ', V  :10:3)

END.

 

Обратите внимание, что поскольку переменная V имеет тип Real, для ее вывода мы использовали формат (см.4.10).

Вот как будет выглядеть наша программа целиком:

VAR   shirina,tol,pl          :Integer;

          visota,V                :Real;

BEGIN

          shirina:=8;   tol:=5;   visota:=12.41;

          pl := shirina tol;

          V  := pl visota;

          WriteLn (pl,'    ', V  :10:3)

END.

Программа напечатает два числа:   40 и 496.400. 

Эту задачу можно было бы решить и гораздо более короткой программой:

BEGIN     WriteLn (8 5, '     ', 8 5 12.41 :10:3)     END.

 

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

 

Задания 12-14:

Написать программы для решения следующих задач:

12)   В углу прямоугольного двора размером 50х30 стоит прямоугольный дом размером 20х10. Подсчитать площадь дома, свободную площадь двора и длину забора. Примечание: в углу, где дом, забора нет.

13)   Радиус окружности равен 800. Вычислить длину окружности и площадь круга. Результаты печатать с 5 знаками после десятичной точки.

14)   Автомобиль 3 часа ехал со скоростью 80 км/час и 2 часа со скоростью 90 км/час. Вычислить среднюю скорость автомобиля (она равна суммарному пути, деленному на суммарное время).

4.12. Операторы ввода данных ReadLn  и  Read.

Задача: Сложить два числа  -    20 и 16.

Сравним две программы решения этой задачи:

VAR a,b : Integer;
BEGIN             
  a:=20;   b:=16;           
  WriteLn (a+b) 

END.

VAR a,b : Integer;
BEGIN 
  ReadLn (a,b);
  WriteLn (a+b)
END.

Программы отличаются только одной строкой. Первая программа не требует пояснений - она печатает число 36. Во второй программе нигде не сказано, чему равны a и b,   а вместо этого включен оператор ReadLn. Поговорим о нем.

ReadLn  читается "рид'лайн", переводится "читай строку". Он приказывает компьютеру остановиться и ждать, когда человек введет с клавиатуры определенную информацию, после чего продолжить работу. В частности, ReadLn (a,b) будет ждать ввода двух целых чисел.

Таким образом, если первая программа после запуска будет работать без остановки до самого конца и без хлопот выдаст результат, то вторая программа на операторе ReadLn остановится и будет ждать. Во время этого ожидания человек должен на клавиатуре набрать число 20 (так как первым в списке оператора ReadLn стоит a), затем нажать клавишу пробела, затем набрать 16 и нажать клавишу Enter. Паскаль воспринимает нажатие пробела, как сигнал человека о том, что закончен набор на клавиатуре одного числа и сейчас начнется набор другого. После набора на клавиатуре последнего числа необходимо нажать клавишу Enter  в знак того, что ввод чисел для данного оператора ReadLn закончен  и компьютер может продолжать работу. В соответствии с этим компьютер сразу же после нажатия Enter прекращает ожидание и прежде всего направляет число 20 в память, в ячейку a, число же 16 - в ячейку b. На этом он считает выполнение оператора ReadLn законченным и переходит к следующему оператору - WriteLn. В результате будет напечатано число 36.

Таким образом, обе программы делают одно и то же. Зачем же тогда применять ReadLn  вместо оператора присваивания? Ведь первая программа понятней, да и работает без остановки. Одна из причин в том, что программа с ReadLn гораздо универсальнее, "свободнее": если первая программа решает задачу сложения только двух конкретных чисел, то вторая программа складывает два любых числа. Вторая причина в том, что программа с ReadLn позволяет программисту во время написания программы не задумываться над конкретными значениями исходных данных, оставляя эту головную боль на момент выполнения программы. Но самая главная причина в том, что ReadLn позволяет человеку общаться с компьютером, вести с ним диалог во время выполнения программы.

 

В подтверждение важности первой причины напишем программу для решения следующей задачи: В зоопарке три слона и довольно много кроликов, причем количество кроликов часто меняется. Слону положено съедать в сутки сто морковок, а кролику - две. Каждое утро служитель зоопарка сообщает компьютеру количество кроликов. Компьютер в ответ на это должен сообщить служителю общее количество морковок, которые сегодня нужно скормить кроликам и слонам.

Придумаем имена переменным величинам:

kol_krol               -           количество кроликов в зоопарке

kol_slon              -           количество слонов в зоопарке

norma_krol          -           сколько морковок в день положено кролику

norma_slon         -           сколько морковок в день положено слону

vsego                 -           сколько всего требуется морковок

 

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

VAR kol_krol,kol_slon,norma_krol,norma_slon,vsego   :Integer;

BEGIN

     norma_krol:=2;

     norma_slon:=100;

     ReadLn (kol_krol);

     kol_slon:=3;

     vsego := norma_krol kol_krol  +  norma_slon kol_slon;

     WriteLn (vsego)

END.

Написав программу, программист вводит ее в компьютер, отлаживает и записывает на диск. На этом его миссия закончена. Утром служитель, пересчитав кроликов и найдя, что их 60 штук, подходит к компьютеру и запускает программу на выполнение.

Компьютер, выполнив автоматически первые два оператора (norma_krol:=2 и norma_slon:=100), останавливается на операторе ReadLn. Служитель вводит число 60, после чего компьютер посылает это число в ячейку  kol_krol  и переходит к выполнению следующего оператора ( kol_slon:=3 ). В конце концов на мониторе появится ответ: 420.

Вот схематическое изображение процесса выполнения программы:

ПОРЯДОК  ИСПОЛНЕНИЯ ОПЕРАТОРОВ

ЧТО НАХОДИТСЯ В ЯЧЕЙКАХ ПАМЯТИ

kol_krol

kol_slon

norma_krol

norma_slon

vsego

norma_krol:=2  

?

?

2

?

?

norma_slon:=100

?

?

2

100

?

ReadLn (kol_krol)

60

?

2

100

?

kol_slon:=3

60

3

2

100

?

vsego:=norma_krol

60

3

2

100

420

WriteLn (vsego)

60

3

2

100

420

На следующее утро, обнаружив, что 5 кроликов продано другому зоопарку, служитель запускает ту же самую программу, вводит число 55 и получает ответ -  410.

На этом несколько фантастичном примере я хотел показать, что применение ReadLn позволяет создавать программы, которые, оставаясь приятно неизменными, позволяют легко решать задачу в любое время для любых значений исходных данных. Можно было бы пойти по другому пути - вместо ReadLn использовать оператор присваивания, например   kol_krol:=60. Но в этом случае программист каждое утро должен был бы бежать в зоопарк, чтобы исправлять в программе этот оператор присваивания.

Оператор ReadLn можно писать и без скобок, просто так:   ReadLn.  Выполняя оператор в такой записи, компьютер остановится и будет ждать, но не ввода какой-то информации, а просто нажатия на клавишу Enter. Таким образом, это просто оператор создания паузы в процессе выполнения программы. О том, зачем нужны паузы, поговорим чуть ниже.

Кроме оператора ReadLn для ввода данных применяется также оператор Read. Для начинающего программиста различия в их применении несущественны. Мы будем пока употреблять только ReadLn. Оператор Read без скобок паузу не создает.

4.13. Интерфейс пользователя

Когда служитель запускает программу и она делает паузу на операторе ReadLn(kol_krol), служитель видит перед собой пустой экран монитора, на котором нет никаких намеков на приглашение вводить какую-либо информацию. Посторонний человек ни за что и не догадается, что компьютер чего-то ждет. Это не очень удобно. Было бы гораздо лучше, если бы на экране все-таки можно было в нужный момент видеть подходящее приглашение, чтобы служитель с раннего утра чего-нибудь не перепутал.

Это же касается и выдачи результатов. На пустом экране появляется сухое число 420. Посторонний человек ни за что не поймет, какой оно имеет смысл: то ли это 420 рублей, то ли 420 зоопарков. Говорят, что у нашей программы неудобный интерфейс пользователя, то есть человеку, использующему нашу программу, неудобно с ней общаться. Слово "интерфейс" можно перевести, как "взаимодействие", в данном случае взаимодействие человека с компьютером.

Дополним чуть-чуть нашу программу, чтобы интерфейс стал более удобным:

VAR  kol_krol,kol_slon,norma_krol,norma_slon,vsego : Integer;

BEGIN

     norma_krol:=2;

     norma_slon:=100;

     WriteLn ( 'Введите, пожалуйста, количество кроликов' );

     ReadLn ( kol_krol);

     kol_slon:=3;

     vsego := norma_krol   kol_krol  +  norma_slon   kol_slon;

     WriteLn( 'Вам всего понадобится  ',vsego, '  морковок' );

     ReadLn

END.

Эта программа будет работать точно так же, как и предыдущая, с тем отличием, что во время паузы, вызванной оператором ReadLn ( kol_krol), на экране будет гореть удобная надпись -

               Введите, пожалуйста, количество кроликов

а результат будет выведен на экран в виде  -   

               Вам всего понадобится  420  морковок

Оператор ReadLn без скобок в конце программы нужен для нейтрализации одной неприятной особенности в работе Паскаля. Дело в том, что выполнив программу, Паскаль торопится погасить экран с результатами решения задачи и делает это так быстро, что человек просто не успевает эти результаты разглядеть. Оператор ReadLn, поставленный после оператора WriteLn, выводящего результаты на экран, задает паузу. Во время этой паузы экран не гаснет, так как программа еще не выполнилась до конца, и человек может спокойно разглядеть результаты. После этого он нажатием клавиши Enter позволит компьютеру продолжить выполнение программы (в нашем случае после ReadLn стоит END с точкой, поэтому программа завершится).

Часто, впрочем, можно обойтись и без ReadLn. Нажав пару клавиш на клавиатуре (Alt-F5), мы можем снова зажечь погасший экран с результатами. В дальнейших примерах я буду для экономии места и "смысла" обходиться без ReadLn.

               Задания 15-16:

Написать с использованием интерфейса программы решения задач:

15)   Длина одной стороны треугольника равна 20. Длины двух других сторон будут известны только после запуска программы на выполнение. Вычислить периметр треугольника.

16)   В компьютер вводятся путь, пройденный телом, и скорость тела. Найти время движения тела.

4.14. Строковые переменные

Сравним две программы:

VAR a : Integer;
BEGIN
  a:=98;
  WriteLn (a)
END.

VAR a : String; 

BEGIN             

  a:='Привет всем!';

  WriteLn (a)     

END.

В первой программе описание   VAR a : Integer   говорит о том, что переменная a обязана иметь числовое значение, а оператор  a:=98  записывает в ячейку  a  число 98.

Во второй программе описание   VAR a : String  говорит о том, что переменная a обязана иметь строковое (текстовое) значение, то есть ее значением будет не число, а произвольная цепочка символов, например,       Привет всем!     или    рпН2Н(fD6:u  .   Оператор  a:='Привет всем!'  записывает в ячейку  a  строку  Привет всем!. Оператор WriteLn (a), поскольку он обязан всегда выводить на экран содержимое ячейки  a, выведет  на экран текст    Привет всем!

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

Слово   String   читается "стринг", переводится "строка".

Какой смысл переменным иметь текстовое значение, выяснится в следующем параграфе.

Информация в ячейке памяти под строковую переменную может в процессе выполнения программы меняться точно так же, как и в ячейке для числовой переменной. Например, при выполнении фрагмента

a:='Минуточку!';  WriteLn(a);  a:='Здравствуйте!';  a:='До свидания!';  WriteLn (a)

в ячейке a будут по очереди появляться строки

                           Минуточку!     Здравствуйте!     До свидания!

а на экран будут выведены строки 

                           Минуточку!     До свидания!

Строковую переменную можно задавать не только оператором присваивания, но и оператором ReadLn. Пример:

VAR a : String; 

BEGIN

     WriteLn ('Введите какое-нибудь слово');

     ReadLn (a);

     WriteLn ('Вы ввели слово   ',a)

END.

Во время паузы, вызванной оператором ReadLn, вы должны ввести какой-нибудь набор символов, например    Изнакурнож,  и затем нажать клавишу Enter  в знак того, что ввод закончен. В результате на экране будет напечатан текст:

               Вы ввели слово   Изнакурнож

4.15. Диалог с компьютером

Напишем программу, которая осуществляла бы такой диалог человека с компьютером:

КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН:              Здравствуй, я компьютер, а тебя как зовут?

ЧЕЛОВЕК ВВОДИТ С КЛАВИАТУРЫ:  Коля

КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН:              Очень приятно, Коля..Сколько тебе лет?

ЧЕЛОВЕК ВВОДИТ С КЛАВИАТУРЫ:  16

КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН:              Ого!Целых 16 лет!Ты уже совсем взрослый!

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

VAR   imya       :String;
          vozrast    :Integer;
BEGIN
     WriteLn ('Здравствуй, я компьютер, а тебя как зовут?');
     ReadLn (imya);
     WriteLn ('Очень приятно, ', imya, '. Сколько тебе лет?');
     ReadLn (vozrast);
     WriteLn ('Ого! Целых ',vozrast, ' лет! Ты уже совсем взрослый!')
END.

Диалог будет отличаться только той информацией, которую вводит человек. Так, в другой раз по этой же программе будет осуществлен следующий диалог:

КОМПЬЮТЕР:              Здравствуй, я компьютер, а тебя как зовут?
ЧЕЛОВЕК :                  Фантомас!
КОМПЬЮТЕР:              Очень приятно, Фантомас!. Сколько тебе лет?
ЧЕЛОВЕК:                   100
КОМПЬЮТЕР:              Ого! Целых 100 лет! Ты уже совсем взрослый!

Не подумайте, что эта программа очень умная. Она совершенно не анализирует, какую информацию человек ввел с клавиатуры. Поэтому с ней возможен и такой диалог:

КОМПЬЮТЕР:              Здравствуй, я компьютер, а тебя как зовут?
ЧЕЛОВЕК:                   Сгинь с моих глаз!
КОМПЬЮТЕР:              Очень приятно, Сгинь с моих глаз!. Сколько тебе лет?
ЧЕЛОВЕК:                   -2
КОМПЬЮТЕР:              Ого! Целых -2 лет! Ты уже совсем взрослый!

Задание 17:  Напишите программу для следующей задачи: Компьютер спрашивает названия двух планет, радиусы их орбит (в миллионах километров) и скорости движения по орбите (в миллионах километров в сутки). Компьютер вычисляет продолжительность года на планетах и выдает результат в таком виде: Продолжительность года на планете Земля – 365 суток, а на планете Эоэлла – 12 суток.

4.16. Константы

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

x:=25                                          здесь числовая константа -      25

slovo:=’Волга’                             здесь строковая константа -    Волга

simvol:=’!’                                   здесь символьная константа -!

y:=(x+1) / (200x - 0.3)                  здесь числовые константы -     1 и 200 и 0.3

5.1. Условный оператор IF  или  как компьютер делает выбор

В начало страницы

Идею разветвления в программе я изложил в 2.8. Сейчас добавлю только, что вся мыслительная деятельность во всех программах (в том числе и той, что выиграла в шахматы у Каспарова) осуществляется только при помощи ветвления (выбора).

 Теперь посмотрим, как писать разветвляющиеся программы на Паскале.

Выучим сначала три английских слова:

if

читается "иф"

переводится  "если"

then

читается "зэн"

переводится  "то"

else

читается "элз"

переводится  "иначе"

Теперь приведем пример нового для вас оператора:

IF           a=28   THEN  WriteLn (f)       ELSE               k:=44

Переводится он так:

ЕСЛИ    a=28   ТО       печатай f       ИНАЧЕ          присвой переменной k значение 44.

Другими словами, мы предлагаем компьютеру сначала подумать, правда ли, что  a=28, и если правда, то выполнить оператор WriteLn (f), в противном случае выполнить оператор k:=44. Таким образом, мы с вами впервые написали оператор, при выполнении которого компьютер не просто выполняет, что приказано, а сначала думает и делает выбор (пока одного из двух).

Мы видим, что оператор if включает в себя другие операторы, которые выполняются или не выполняются в зависимости от какого-то условия. Чтобы понять, зачем может пригодиться оператор if, рассмотрим следующую задачу.

Задача 1. Компьютер должен перемножить два числа -  167 и 121. Если их произведение превышает 2000, то компьютер должен напечатать текст ПРОИЗВЕДЕНИЕ БОЛЬШОЕ, иначе текст ПРОИЗВЕДЕНИЕ МАЛЕНЬКОЕ. После этого компьютер в любом случае должен напечатать само произведение.

Программа:

VAR a,b,y :Integer;

BEGIN
     a:=167; 

     b:=121;

     y:=ab;

     if   y>20000      then WriteLn ('ПРОИЗВЕДЕНИЕ  БОЛЬШОЕ')

                            else  WriteLn ('ПРОИЗВЕДЕНИЕ МАЛЕНЬКОЕ');

     WriteLn (y)

END.

Пояснение: В программе 5 операторов, последний – WriteLn (y). Поскольку эти 5 операторов выполняются по порядку, то он выполнится обязательно.

 

Задача 2. В компьютер вводятся два произвольных положительных числа - длины сторон двух кубиков. Компьютер должен подсчитать объем одного кубика - большего по размеру. 

Обозначим a1 - сторону одного кубика, a2 - сторону другого, bol - сторону большего кубика, V - объем кубика. Приведем три варианта программы:

 

ВАРИАНТ 1

 

VAR a1,a2 : Real;

BEGIN

   ReadLn (a1,a2);

   if a1>a2 then WriteLn (a1a1a1  : 15:5)

                 else WriteLn (a2a2a2  : 15:5)

END.

ВАРИАНТ 2

 

VAR a1,a2,V : Real;

BEGIN

   ReadLn (a1,a2);

   if a1>a2 then V:=a1a1a1

                 else V:=a2a2a2;

   WriteLn (V  : 15:5)

END.

ВАРИАНТ 3

 

VAR a1,a2,bol,V : Real;

BEGIN                         

   ReadLn (a1,a2);

   if  a1>a2 then  bol:=a1

                  else  bol:=a2; 

   V:=bolbolbol;         

   WriteLn (V  : 15:5)

END.

 

Поясним последний вариант. Программа состоит из четырех операторов, которые выполняются в порядке записи. Первым после запуска выполняется оператор ReadLn (a1,a2), который ждет от нас ввода двух чисел. Пусть мы сегодня ввели числа 3 и 2. Компьютер понимает, что a1 равно 3, a2 равно 2, и переходит к выполнению оператора if. Он видит, что 3>2, и поэтому выполняет оператор bol:=a1, а оператор bol:=a2 не выполняет. В результате в ячейке bol оказывается число 3. Затем компьютер переходит к следующему оператору  -  V:=bolbolbol  и вычисляет V=333=27. Следующий оператор  WriteLn (V  : 15:5)  печатает число 27.00000.

Если завтра мы запустим эту же программу и введем числа 6 и 10, то компьютер увидит, что утверждение 6>10 ложно, и поэтому выполнит оператор bol:=a2, а оператор bol:=a1 выполнять не станет. В результате  в ячейке bol окажется число 10 и будет напечатано число 1000.00000.

А теперь, дорогой читатель, вам пришла пора освоить пошаговый режим выполнения программы на компьютере. В обычном режиме компьютер выполняет программу настолько быстро, что вы не успеваете заметить, в каком порядке он выполняет отдельные операторы программы, а без этого часто невозможно понять ее логику. Пошаговый режим заставляет компьютер при выполнении программы задерживаться на каждой строке программы столько, сколько нужно человеку. Сейчас вам необходимо проделать то, что сказано в части IV в пункте «Пошаговый режим» параграфа «Исправление ошибок. Отладка программы».

 

Итак, если паровая машина избавила человека от тяжелого физического труда, то оператор if избавил человека от тяжелого умственного труда, в нашем случае - от необходимости решать, какое из двух чисел больше другого.

Оператор if можно записывать и без части else. Например,  if s<t then w:=a+1. Это означает, что если s<t, то нужно выполнить оператор w:=a+1, в противном случае ничего не делать, а просто перейти к следующему оператору.

Для примера рассмотрим простейшую задачу: В компьютер вводится слово. Компьютер должен просто распечатать его. Однако, если введенным словом будет "колхозник", то компьютер должен напечатать вместо него слово "фермер".

Вот как будет выглядеть наша программа-"цензор":

VAR  Slovo : String;
BEGIN
     ReadLn (Slovo);    { переменная Slovo будет иметь  значением строку символов, введенных с клавиатуры }
     if  Slovo = 'колхозник'  then  Slovo := 'фермер';
     WriteLn (Slovo)
END.

5.2. Правила записи оператора IF

 

 

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

Пока мы не готовы воспринять полный синтаксис оператора if Паскаля (вы найдете его в 14.8), однако уже сейчас нам хотелось бы писать без ошибок. Для этого, скрепя сердце, будем использовать сокращенный синтаксис. Поясним его в виде синтаксической схемы:

            IF условие     THEN оператор     ELSE оператор

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

оператор

любой оператор Паскаля

условие

пока под условием будем понимать два арифметических  выражения, соединенных  знаком сравнения, или условие равенства или неравенства строк, как это показано на примере в 5.1

выражение

что такое выражение, было пояснено в 4.9

знак сравнения           

знаков сравнения шесть:

>  больше        >=  больше или равно             =  равно

<  меньше        <=  меньше или равно              <> не равно

 

Пример:              if   5a+4 <= ab   then WriteLn (b)   elsea:=b+5                                    Здесь 

 

WriteLn (b)           - один оператор,   

a:=b+5                - другой оператор,   

5a+4 <= ab       - условие,   

5a+4                  - одно выражение,   

ab                      -  другое выражение,    

<=                        - знак сравнения.

 

Вспомним правило расстановки точек с запятыми. Они применяются для того, чтобы отделять друг от друга операторы, выполняющиеся друг за другом. Поэтому и после оператора if мы тоже ставили точку с запятой, если после него шел какой-нибудь оператор. Распространенная привычка начинающих программистов - автоматически ставить точку с запятой после любого оператора, независимо от того, что после него стоит - другой оператор или же служебное слово, например else или end. Так вот, перед end точку с запятой ставить не возбраняется, а

перед ELSE точку с запятой ставить запрещено.

В п.5.1 вы уже видели, что оператор if можно записывать в краткой форме:

IF    условие   THEN   оператор

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

      IF условие       THEN оператор       [ ELSE оператор ]

Квадратные скобки здесь означают, что их содержимое можно писать, а можно и не писать в операторе.

Полезное замечание: Вычисляя выражения, стоящие в условии оператора if, Паскаль не записывает их значения в память. Например, после выполнения фрагмента  -    b:=6; if b+1>0 then s:=20   -   в ячейке b будет храниться 6, а не 7. То же относится и к выражениям из оператора WriteLn. Например:   b:=6; WriteLn (b+1). И здесь тоже в ячейке b останется храниться 6, а не 7. И вообще, информация в ячейках памяти не меняется при вычислении выражений.

Примеры работы оператора if:

ФРАГМЕНТ ПРОГРАММЫ

ЧТО НА ЭКРАНЕ

a:=10; if a>2 then WriteLn ('!!!') else WriteLn ('!')

!!!

a:=4;   if a>5 then a:=a+10 else a:=a-1;    WriteLn (a)

3

s:=6;   if s-8<0 then s:=s+10;    WriteLn (s)

16

s:=6;   if s<0 then s:=s+10; s:=s+1;   WriteLn (s)

7

Пояснение: Обратите внимание, что в последнем примере оператор if кончается оператором s:=s+10, а не s:=s+1. Поэтому оператор s:=s+1 будет выполняться всегда, независимо от величины s.

Задания 18-20:

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

18.  k:=20; k:=k+10; if k+10<>30 then k:=8 else k:=k-1; WriteLn (k)                       

19.  k:=20; k:=k+10; if k+10 = 30 then k:=8 else k:=k-1; WriteLn (k)                       

20.  p:=1; if p>0 then p:=p+5; Write (p); if p>10 then p:=p+1; Write (p)     

Задания 21-23:

21. В компьютер вводятся два числа. Если первое больше второго, то вычислить их сумму, иначе - произведение. После этого компьютер должен напечатать текст ЗАДАЧА РЕШЕНА.

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

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

23. Дракон каждый год отращивает по три головы, но после того, как ему исполнится 100 лет - только по две. Сколько голов и глаз у дракона, которому N лет?

5.3. Составной оператор

Вот фрагмент программы, которая складывает два числа:

WriteLn ('Введите два числа');
ReadLn (a,b); 
WriteLn ('Сумма равна ',a+b)

Вот фрагмент программы, которая возводит число в квадрат:

WriteLn ('Введите число');  
ReadLn (a);   
WriteLn ('Квадрат числа равен ',aa)

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

Начинаться наша программа могла бы примерно так:

VAR  Otvet : String;  .....     

BEGIN

     WriteLn ('Чем займемся – сложением или возведением в квадрат?');

     ReadLn (Otvet);

     if  Otvet = 'сложением'  then ....  else....

Здесь после then мы должны бы вставить первый фрагмент, а после else второй. Однако, тут возникает проблема. Каждый из фрагментов состоит из нескольких операторов, а синтаксис оператора if разрешает ставить после then и  else только по одному оператору. Чтобы преодолеть эту трудность, в Паскале есть средство превратить последовательность записанных друг за другом операторов формально в один оператор. Для этого  последовательность заключается между словами begin и end и получившаяся конструкция называется составным оператором.

Вот первый фрагмент в виде составного оператора:

begin 
     WriteLn ('Введите два числа');  
     ReadLn (a,b);   
     WriteLn ('Сумма равна ',a+b) 
end

Компьютер выполняет составной оператор неотличимо от последова­тельности опера­торов, из которых он состоит, однако титул составного оператора позволяет ему считаться одним оператором и поэтому быть вхожим в те места программы, в которые разрешен вход только единичным операторам, а не их после­до­вательностям, как, например, имеет место в нашем случае с оператором if.

Вот какая получится программа для нашей задачи:

VAR   Otvet  :String;

          a,b          :Integer;

BEGIN             

     WriteLn ('Чем займемся - сложением или возведением в квадрат?');

     ReadLn (Otvet);

     if  Otvet = 'сложением'  

          then            

              begin WriteLn ('Введите два числа');     

                        ReadLn (a,b);                 

                        WriteLn ('Сумма равна ',a+b)      

              end            

          else       

              begin WriteLn ('Введите число');       

                        ReadLn (a);               

                        WriteLn ('Квадрат числа равен ',aa)    

               end;

     WriteLn ('Счет завершен')

END.

У нашей программы есть недостаток. Если при ответе на вопрос компьютера мы чуть-чуть ошибемся, например, ответим не "сложением", а "сложение", компьютер будет выполнять возведение в квадрат, так как в условии оператора if сравниваемые строки должны совпадать полностью. Научившись выполнять операции над строками, вы научитесь избегать таких ситуаций.

Задание 24: Видоизменить диалог с компьютером, начатый в 4.15. Пусть компьютер, узнав возраст человека, дальнейшую беседу ведет по двум вариантам. Если возраст больше 17, то компьютер должен задать вопрос: "В каком институте ты учишься?" и получив ответ, глубокомысленно заметить "Хороший институт". Если же возраст меньше или равен 17, то соответственно - "В какой школе ты учишься?" и "Неплохая школа". После этого, каков бы ни был вариант, компьютер должен попрощаться: "До следующей встречи!".

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

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

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

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

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

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

5.5. Вложенные операторы 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, то...

Примеры:

ФРАГМЕНТ


Источник: http://www.raaar.ru/unix/pascal/samouch_pascal.html



Рекомендуем посмотреть ещё:


Закрыть ... [X]

Самоучитель Pascal Виноград плетение из резинок


Рисовать карандашом винчестер Рисовать карандашом винчестер Рисовать карандашом винчестер Рисовать карандашом винчестер Рисовать карандашом винчестер Рисовать карандашом винчестер Рисовать карандашом винчестер Рисовать карандашом винчестер Рисовать карандашом винчестер