Hosted by uCoz

Уроки от Дмитриева Эдуарда - Урок 4 !!!

Сайт 'Всё о Паскале'


* Итак, что же про Паскаль? По вашим советам и просьбам я сегодня уточню одну важную вещь - структуру программы, т.е. размещение разделов var, begin, порядок их размещения и функциональные особенности. Читать про это стоит подписчикам не подготовленным, то есть тому, кто понимает, что не знает как оформлять программу.

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

*И после всего этого мы с вами освоим новую вещь, невероятно полезную и довольно простую. Это будет возможность сравнения, так называемая конструкция If...then.....else, но обо всем по порядку, читайте рассылку....

Структура программы

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

Эти разные части оформляются в различных разделах отдельно друг то друга. То есть переменные находяться отдельно, тело программы - отдельно. Я думаю, Вы это знаете. Заметьте, я не говорю, что это все части, есть и другие, но об этом будем говорить позже. Итак, решили мы писать программу. Она будет использовать какие-нибудь данные, так ведь? Складывать числа, выводить строки. Для этого заводим переменные, чтобы хранить все эти значения.

  1. Все переменные должны быть в разделе var, который всегда идет до раздела begin. Запомните это.

  2. Все поцедуры, выражения, структуры и почее что взбредет в голову программисту - только в разделе begin, который соответсвенно заканчивается словом end. (с точкой на конце).

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

Итак, схема программы на Паскале:

Program Program_name;
var
-
-
описание_переменных
-
-
begin
-
-
тело_программы
-
-
end.

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

А нам пора двигаться дальше...

Новые типы данных

Помните, мы с вами разговаривали о типах переменных? О том, как присвоить какой-либо тип и зачем это делается? Тогда мы с вами обсуждали всего лишь типы-числа, причем целые числа, дробные значения им присвоить нальзя. Основные из тех типов были Integer, Byte, Word и LongInt, имеющие замый разный диапазон значений (не пишите мне, что вам не ясно, см. выпуск #3), в которых вам нужно научиться ориентироваться.

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

Program_name;
var
A: Integer;
B: Word;
C: Byte;
begin
A := B - C;
B := C + A;
C := B * A;
end.
* Обращайте внимание на синтаксис! Не забывайте!

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

Вот, смотрите: Если имеем два числа, A: Integer; B: Word;.

Определимся, что они могут?

Переменная А - может хранить значения от -32000 до +32000 (я примерно пишу)

Переменная В - может хранить значания от 0 до 65500 (тоже не точно, см. зеленую таблицу в 3)

А теперь представьте, число А = 12, а число В = 15. Ну как, мы разве не сможем их сложить? Еще как. А вычесть? Тоже. А умножить? И это у нас выйдет.

Теперь такая ситуация - если результат помещается в переменную В (тип Word), но он отрицательный? (Следите за ходом моих мыслей). Что выйдет? Ведь тип Word не может хранить отрицательные числа, а я только что вел разговор о совместимости.

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

Нормально напомнил, вспомнили?

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

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

Итак, зачем же нам иметь переменные, позволяющие хранить символы?

Давайте вспомним приводимый мной как-то пример программы, выводящей Hello, world!, написанной для демонстрации работы процедуры Write. Помните? Она печатала строку, которая как бы слита с программой и не может быть изменена во время ее работы. Давайте перестроим эту программу и напишем ее модифицированный вариант. Действовать будем так (напоминаю, последовательность действий называется алгоритм):

  1. Выведем на экран строку "Введите Ваше имя: "

  2. Прочитаем имя с клавиатуры

  3. Выведем на экран строку "Привет, ИМЯ!"

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

  1. Для того, чтобы вывести строки будем просто использовать Write.

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

Тип "строка" изображается так: String.

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

var
Name: String;

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

Program Ask_name;
var
Name: String;
begin
Write('Введите Ваше имя: ');
Readln(Name);
Write('Привет, ',Name,'!');
Readln;
end.

Откройте Турбо Паскаль и напечатайте эту программу. Запустите ее и посмотрите, как она работает. Все нормально? Действительно, она выводит имя, введенное при запросе. Это вам конкретный пример использвания типа String. На самом деле возможности использования строк невероятно высоки, вы это дальше поймете.

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

Но хоть разбирать каждую строку и я не буду, все же один прием требует комментариев:

Write('Привет, ',Name,'!');

Эта строка выводит именно "Привет, ИМЯ!". Заметили, восклицательный знак находиться после переменной? То есть переменная получается как бы внутри выводимой строки. Именно для того, чтобы это сделать я использовал несколько параметров процедуры Write; - т.е. чередовал символы с переменной. Так можно напечатать любой текст, содержащий где угодно в себе переменные. Запомните этот прием, а то некоторые ломают голову над этим - используют несколько процедур Write для вывода всех частей строки отдельно и т.д.

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

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

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

IF…THEN…ELSE - Важная конструкция языка

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

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

Нам нужно написать программу, которая:

  1. Запрашиват два числа;

  2. Далее проверяет, если 1-е число больше второго, выводит: "1-е больше, чем второе"; если 2- больше 1-го, то выводит: "2-е больше, чем первое";

В программе явно нет ничего сложного. Но есть одна деталь - как мы проверим эти числа на БОЛЬШЕ/МЕНЬШЕ? Вот здесь нам и понадобиться конструкция If...Then...Else, о которой я вам сейчас и расскажу.

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

> Больше
< Меньше
>= Больше или равно
<= Меньше или равно
<> Не равно

Запомните эти знаки, они вам дальше очень понадобятся. И не пугайтесь, если что-то не понятно. Сейчас все разъясниться, как только я приведу пример и сделаю к нему комментарий.

Итак, как же оформить конструкцию if...then...else? Для начала давайте запишем словами сравнение двух чисел А и В:

1. Если А > B То Write(A,' больше чем ',B,'!')

2. Иначе Write(B,' больше чем ',A,'!');

Посмотрите внимательней на приведенный пример. Разобрались? Теперь посмотрим, как выглядит эта конструкция на Паскале:

If A > B Then Write(A,' больше чем ',B,'!')

else Write(B,' больше чем ',A,'!');

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

  1. Сначала идет служебное слово If

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

  3. Если эта проверка выполняется верно, то есть A > B, то выполняется действие, указанное после слова Then. Обратите внимание, что после действия (процедуры Write) нет точки с запятой - ";". Она не ставиться перед словом Else.

  4. Если же проверка не верна, то есть A < B то выполняется действие, указанное после слова Else. После этого действия уже ставиться точка с запятой.

Замечание. Слова Else может и не быть. Это используется тогда, когда нужно выполнить всего одно условие и не делать ничего, если оно не верно. В таком случае после действия, указанного за словом Then ставиться ";". Вот такой пример:

If A > B Then Write(A,' больше чем ',B,'!');

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

Program Primer;
var
A,B: Integer;
begin
Write('Введите A: ');
Readln(A);
Write('Введите B: ');
Readln(B);
If A > B Then Write(A,' больше чем ',B,'!')
else Write(B,' больше чем ',A,'!');
Readln;
end.

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

Program Primer;
var
S1,S2: String;
begin
Write('Введите 1-ю строку: ');
Readln(S1);
Write('Введите 2-ю строку: ');
Readln(S2);
If S1 <> S2 Then Write('Строки не равны!')
else Write('Строки равны!');
Readln;
end.

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

Program Primer;
var
A: Integer;
begin
Write('Введите число: ');
Readln(А);
If А < 0 Then Write('Число отрицательное!')
else Write('Вы ввели число: ',A);
Readln;
end.

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

1 Напишите программу, умеющую проверять положительно ли введенное число и выводить ответ на экран.
2 Вводятся два числа, после чего проверяется, больше ли сумма 1-го с самим собой, чем второе. Ответ как обычно на экран.
3 Читаются два числа, после чего из 1-го вычитается 2-е и если результат отрицательный, пишется, что он отрицателен. Иначе ответ выводиться на экран.
4 Прочитайте три числа А, В, С и одну строку. После чего проверьте, больше ли сумма А и В числа С. Если да, то выводите прочитанную строку иначе сумму всех 3-х чисел.

Ну вот и все на сегодня про Паскаль. Этот урок получился довольно большим, но вы узнали достаточно нового. Хочу вам напомнить, что нужно разобраться во всем, о чем я говорю - иначе вы не добьетесь больших результатов. Осваивайте, пишите свои программы - и обязательно решайте мое домашнее задание! Если оно вам покажется довольно нудным, не обращайте внимания и сделайте просто для закрепления пройденного. Далее придется очень часто и развернуто использовать if...then...else, поэтому добейтесь уверенности в своих знаниях этой конструкции.

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

Вопросы - ответы

Можно ли программу, напечатанную в текстовом файле скопировать в Turbo Pascal? Если можно то как?

Можно только сохранить текстовый файл с расшрирением PAS и открыть в Паскале. Скопировать же через буфер (как в WINDOWS) нельзя, программы DOS не держат буфер друг между другом.