Основы программирования на языке Паскаль
|=(D1*(45-2)) |
| S<>'ABC' {Значение переменной S не равно строковой константе 'ABC'} |
| Приведем пример решения еще одной задачи: "Из двух чисел выбрать |
|наибольшее". |
| На первый взгляд решение очевидно, но оно не столь тривиально, как |
|кажется. |
|Program Example; |
|Var A,B,C : Real; {A,B - для хранения аргументов, C - результат} |
|Begin |
|Writeln('Введите два числа'); |
|Readln(A,B); {Вводим аргументы с клавиатуры} |
|If A>B Then C:=A Else C:=B; Если A>B, то результат - A, иначе результат - |
|Writeln(C); {Выводим результат на экран} |
|End. |
| Еще один классический пример: "По заданным коэффициентам решить |
|квадратное уравнение". Эта задача сложнее, поэтому перед тем как писать |
|программу составим алгоритм, записав его в виде блок-схемы. |
|Сначала вводим коэффициенты, затем вычисляем дискриминант. Теперь возникает|
|две возможности: либо отсутствие действительных корней в случае |
|отрицательного дискриминанта, либо эти корни можно все-таки вычислить и |
|вывести на экран в случае неотрицательного дискриминанта (случай равенства |
|дискриминанта нулю входит сюда же, корней - два, только они одинаковые J). |
| При записи алгоритма на языке программирования следует учесть, что в |
|ветви "нет" не одно действие, а три, поэтому следует применить составной |
|оператор. Арифметические выражения не забывайте записывать в соответствии с|
|правилами языка Паскаль. В остальном, эта программа не сложнее предыдущей. |
| |
| |
| |
|Program Sq1; |
|Var A, B, C, D, X1, X2 : Real; |
|Begin |
|Writeln ('Введите коэффициенты квадратного уравнения'); |
|Readln (A,B,C); |
|D:=B*B-4*A*C; |
|If D Do ; |
| Правда, лаконично? По-русски можно прочитать так: "Пока истинно |
|условие, выполнять оператор". Здесь, так же как в формате условного |
|оператора, подразумевается выполнение только одного оператора. Если |
|необходимо выполнить несколько действий, то может быть использован |
|составной оператор. Тогда формат оператора принимает такой вид: |
|While Do |
|Begin |
|; |
|; |
|; |
|. . . |
|End; |
| |
|Цикл "ДО" |
| Этот вид цикла отличается от предыдущего в основном тем, что проверка |
|условия повторения тела цикла находится не перед ним, а после. Поэтому цикл|
|"До" называют циклом "с постусловием", а "Пока" - "с предусловием". |
| Обратите также внимание на то, что новая итерация (повторное |
|выполнение тела цикла) происходит не тогда, когда условие справедливо, а |
|как раз тогда, когда оно ложно. Поэтому цикл и получил свое название |
|(выполнять тело цикла до выполнения соответствующего условия). |
| Интересно, что в случае, когда условие цикла изначально истинно, тело |
|цикла все равно будет выполнено хотя бы один раз. Именно это отличие "до" |
|от "пока" привело к тому, что в программировании они не подменяют друг |
|друга, а используются для решения задач, к которым они более подходят. |
| Формат цикла на языке Pascal: |
|Repeat |
|; |
|; |
|; |
|. . . |
|Until ; |
| Читается так: "Выполнять оператор #1, оператор #2. : до выполнения |
|условия". |
| Здесь не требуется использование составного оператора, потому, что |
|сами слова Repeat и Until являются операторными скобками. |
| |
|Цикл "С параметром". |
| В данном случае параметром будет являться целочисленная переменная, |
|которая будет изменяться на единицу при каждой итерации цикла. Таким |
|образом, задав начальное и конечное значения для такой переменной, можно |
|точно установить количество выполнений тела цикла. Нарисовать блок-схему |
|такой структуры вы сможете сами после некоторых пояснений. |
| Форматов у этого вида цикла предусмотрено два: |
| For := To Do ; |
| For := Downto Do ; |
| Здесь И.П. - имя переменной-параметра, Н.З. - его начальное значение, |
|К.З. - соответственно конечное значение параметра. В качестве начального и |
|конечного значений |
| Читается данная структура так: "Для переменной (далее следует ее имя) |
|от начального значения до конечного выполнять оператор (являющийся телом |
|цикла)". Иногда цикл с параметром даже называют "Для" или "For". В первом |
|случае параметр с каждой итерацией увеличивается на единицу, во втором - |
|уменьшается. |
| Выполняется этот цикл по следующему алгоритму: |
| 1. переменной-параметру присваивается начальное значение; |
| 2. выполняется тело цикла; |
| 3. переменная-параметр автоматически увеличивается на 1 (в первом |
|случае формата); |
| 4. если параметр превышает конечное значение, то происходит выход из |
|цикла, иначе - переход к пункту 2. |
| Примечание: при использовании Downto параметр автоматически |
|уменьшается на 1, а выход из цикла происходит тогда, когда параметр |
|становится меньше конечного значения. |
| Таким образом, в отличие от первых двух видов цикла, этот цикл |
|используется тогда, когда известно необходимое количество выполнений тела |
|цикла. |
| Вообще говоря, цикл "Пока" является универсальным, то есть любая |
|задача, требующая использования цикла, может быть решена с применением этой|
|структуры. Циклы "До" и "С параметром" созданы для удобства |
|программирования. |
| Пример. |
| Найти сумму квадратов всех натуральных чисел от 1 до 100. |
| Решим эту задачу с использованием всех трех видов циклов. |
|I. С использованием цикла "Пока". |
|Program Ex1; |
|Var |
| A : Integer; |
| S : Longint; |
|Begin |
|A:=1; S:=0; |
|While A100; |
|Writeln(S) |
|End. |
|III. С использованием цикла "С параметром". |
|Program Ex3; |
|Var |
| A : Integer; |
| S : Longint; |
|Begin |
|S:=0; |
|For A:=1 To 100 Do S:=S+A*A; |
|Writeln(S) |
|End. |
| Теперь вам известны все основные алгоритмические структуры языка |
|Паскаль. Комбинируя их, возможно запрограммировать решение любой задачи, |
|конечно, если таковое существует. Тем не менее, изучение языка на этом не |
|закачивается, так как для написания хороших программ по утверждению |
|уважаемого Никлауса Вирта (за время моей работы у меня не появилось |
|оснований в этом сомневаться) нужны кроме алгоритмических, еще удобные |
|структуры данных. В рассматриваемом языке таких структур множество, для |
|каждого вида определены свои команды и операции. К их рассмотрению мы и |
|переходим. |
| |
|Строковые операции |
| До сих пор мы с вами рассматривали программы, реализующие алгоритмы |
|обработки числовых данных. Однако хоть ЭВМ изначально и были созданы только|
|для этой цели, по мере развития аппаратной части появилась возможность |
|оцифровывать данные других типов, хранить их в памяти машины, |
|перерабатывать, выводить во внешний по отношению к компьютеру мир. Проще |
|всего можно было так поступить с текстовой информацией. Если не ставить |
|перед машиной задачу "понимания" смысла текста, то задача оцифровки |
|сводится к установлению правил замены символов (литер) при вводе в |
|компьютер на их коды и обратной замены при выводе информации на экран или |
|принтер. Такие правила, конечно же, были составлены. Как водится, сначала |
|их было множество (вспомните разнообразие таблиц кодировки), затем весь мир|
|остановился на ASCII. |
| Все языки программирования высокого уровня имеют средства работы с |
|литерными величинами. Паскаль - не исключение. Как вам уже известно, в |
|стандарте языка описаны два типа переменных для литерных величин. Это - |
|String и Char. Напомню - переменная типа Char может содержать в себе только|
|один единственный символ, тип String предназначен для хранения строковых |
|величин до 255 символов длиною. Кстати, вы знаете не все о типе String. При|
|описании переменной этого типа вы можете сами указать максимальное число |
|символов, которое можно занести в нее. Конечно же, это число не должно |
|превышать 255. Делается это так: |
|Var |
|S : String[30]; |
| Для чего это нужно? |
| Дело в том, что при компиляции для каждой переменной отводится свой |
|участок памяти. Если мы будем выделять для всех переменных типа String по |
|256 байт, то это приведет к тому, что при использовании достаточно большого|
|их количества, памяти может и не хватить? Но если в переменной мы |
|собираемся хранить, например, фамилию пользователя, то тридцати символов |
|(тридцати байт) для этого вполне достаточно. Таким образом, экономится |
|память и увеличивается быстродействие программ. |
| Переменным строкового типа можно присваивать строковые величины |
|(внутри программы они заключаются в апострофы), значения выражений, которые|
|приводят к строковым величинам. Значения можно также вводить с клавиатуры. |
|При этом апострофы не используются. Как вам известно, в числовую переменную|
|нельзя ввести строковую величину. Сделать наоборот - возможно, однако |
|число, находящееся в строковой переменной представляет собой просто |
|последовательность символов (цифр), поэтому в арифметических выражениях |
|участвовать не может. |
| Также, новым для вас явится то, что при использовании строковой |
|переменной, к каждому ее символу можно обратиться отдельно. Необходимо |
|только знать номер нужного символа от начала строки. Его достаточно |
|поставить после имени переменной типа String в квадратных скобках. |
| Пример: S[5] - пятый символ строки S. |
| С отдельным символом строки можно производить все действия, которые |
|можно производить с любой символьной переменной (ввод, присвоение, вывод на|
|экран, участие в выражениях и т.д.). |
| Обратите внимание на то, что нумерация символов в строке начинается с |
|единицы. Внутри квадратных скобок вместо числа может находиться выражение, |
|результатом которого является целое число. Главное чтобы символ с таким |
|номером в строке существовал. Но как же узнать, сколько символов в данный |
|момент находится в строковой переменной? Для этого существует специальная |
|функция, которая возвращает длину строковой переменной в символах. Это |
|функция Length. Ее формат: Length(S) |
| Здесь S - либо строковая величина, либо строковая переменная. |
| Приведенная далее программа выводит на экран длину введенной |
|пользователем строковой величины. |
|Program Str1; |
|Var |
|S : String; |
|Begin |
|Writeln('Введите последовательность символов'); |
|Readln(S); |
|Writeln('Вы ввели строку из ',Length(S), ' символов') |
|End. |
| Другой пример: |
|Решим задачу: "Введенную строку вывести на экран по одному символу в строке|
|экрана". |
|Program Str2; |
|Var |
|S : String; |
|I : Byte; |
|Begin |
|Writeln('Введите строку'); |
|Readln(S); |
|For I:=1 to Length(S) do {организуем цикл, начиная с первого символа} |
|Writeln(S[I]) {строки, до последнего (номер последнего} |
|{совпадает с количеством символов строки S) } |
|End. |
| Какие же еще действия можно выполнять с переменными строкового типа? |
| Две строковые величины можно состыковывать. Эта операция называется |
|конкатенацией и обозначается знаком "+". |
| Например, результатом выполнения следующих команд: |
| R:= 'kadabra'; |
| H:= 'abra'; |
| S:=H+R; |
|в переменной S будет значение 'abrakadabra'. |
| Для конкатенации результат зависит от порядка операндов (в отличие от |
|операции сложения). Следует помнить о том, какой максимальной длины может |
|быть результирующая переменная, так как в случае превышения значением |
|выражения числа, указанного после String в описании переменной, "лишние" |
|символы в переменную не попадут. |
| Строковые величины можно сравнивать между собой. Это относится также и|
|к строковым переменным. Но как же компьютер определяет, какая строка |
Страницы: 1, 2, 3, 4, 5
|