Ваша первая программа на Паскале
Вид материала | Программа |
- Тема урока: Программирование ветвлений на Паскале, 61.32kb.
- Программирование ветвлений на Паскале Оператор ветвления на Паскале, 166.05kb.
- А. В. Розина программирование на паскале методическое пособие, 480.71kb.
- Агенство ваша бухгалтерия, 168.25kb.
- Книга Первая, 7751.74kb.
- Где и кто должен встречать посетителя, 1789.68kb.
- Первая. Новое восприятие проблемы рождаемости глава первая, 1589.66kb.
- Первая. Новое восприятие проблемы рождаемости глава первая, 5106.96kb.
- Кормление среднеазиатских овчарок: слагаемые рациона Чтобы Ваша собака была здоровой, 257.42kb.
- С. В. Элективный курс «Программируем на Паскале» общие вопросы самылкина Н. Н. Программа, 503.53kb.
If A = 10 then ..... else
If A = 20 then .... else
If A = 30 then ....; )
Для таких ситуаций и предназначена конструкция case, которая позволяет очень удобно проверять переменную на заранее определенные значения и выполнять различные действия, в зависимости от того, чему эта переменная равна.
Итак, решая приведенную задачу, мы напишем следующее:
|
Program N1; |
uses Crt; |
var |
C, C1: Char; |
I: Integer; |
S: String; |
Q: Boolean; |
begin |
repeat |
ClrScr; |
Writeln('1 - Ввести число;'); |
Writeln('2 - Ввести символ;'); |
Writeln('3 - Ввести строку;'); |
Writeln('4 - Выход.'); |
Writeln; |
Write('Ваш выбор: '); |
Readln(C); |
case C of |
'1': Readln(I); |
'2': Readln(C1); |
'3': Readln(S); |
'4': Q: true; |
end; |
until Q; |
end. |
Программа сама по себе мало работоспособная конечно :)), зато демонстрирует использование case. Итак, давате определимся с синтаксисом этой конструкции:
- Case _переменная_или_выражение_ of
Это - первая строка, показывающая начало конструкции case. Переменная, выражение или функция, которые могут стоять между case и of - это само условие, которое будет проверяться.
- Значение: begin ... действия ... end;
Это - пара "значение-действие" и является содержимым конструкции. Количество таких пар практически неограничено. Работает это так:
- Если выражение в заголовке case удовлетворяет какому-то значению в паре "значение-действие", то выполняется действие (действия), которые определены для этого значения.
При этом обратите внимание, что если действий для конкретного значения несколько, то все они ограждаются служебными словами begin - end; Если действие одно, то это совсем необязательно, хотя и ошибки тоже не вызовет. Пример:
|
Program N1; |
uses Crt; |
var |
C, C1: Char; |
I: Integer; |
S: String; |
Q: Boolean; |
begin |
repeat |
ClrScr; |
Writeln('1 - Ввести число (100 - выход);'); |
Writeln('2 - Ввести символ;'); |
Writeln('3 - Ввести строку;'); |
Writeln('4 - Выход.'); |
Writeln; |
Write('Ваш выбор: '); |
Readln(C); |
case C of |
'1': begin |
Readln(I); |
if I = 100 then |
begin |
Write('Число равно 100!'); |
Q := true; |
end |
else Write('Число не равно 100!'); |
end; |
'2': Readln(C1); |
'3': Readln(S); |
'4': Q := true; |
end; |
until Q; |
end. |
- После всех условий ставится end; - то есть конструкция case имеет собственный закрывающий end, который должен присутсвовать обязательно.
Также конструкция case позволяет использовать внутри себя кроме пар "значение: действие" еще одну интересную возможность, а именно употребление служебного слова else. Раобта его точно такая, как и в случае с if...then...else, то есть формулируется след. образом: "если ничего не совпало, то выполни то, что после else".
Иначе говоря, в случае, если значение выражения или переменной не совпало ни с каким из указанных значений, то выполнится все, что указано после else. Вот модифицированный пример:
|
............ |
|
|
case C of |
'1': begin |
Readln(I); |
if I = 100 then |
begin |
Write('Число равно 100!'); |
Q := true; |
end |
else Write('Число не равно 100!'); |
end; |
'2': Readln(C1); |
'3': Readln(S); |
'4': Q := true; |
else |
begin |
Write('Нет такого значения!'); |
Readln; |
end; |
end. |
Отмечу, что использование else в конструкции case соверешенно не обязательно и зачастую не используется. Чаще всего case создается затем, чтобы действия выполнялись только при соответсвии условия какому-нибудь значению, или не выполнялись совсем. Else наоборот, превращает case в подобие if - то есть получается, что какие-то действия выполняться в любом случае. Однако, это довольно спорный вопрос - на примере вы и сами видите, что else иногда совсем не лишнее. Так что знать и помнить об этой возможности обязательно.
Методы и процедуры работы со строками
Вы уже давно знаете, что к строке можно ображаться как к массиву, работать с отдельными ее символами. Но это далеко не единственная возможность Паскаля по обработке строк. На самом деле существует достаточное количество стандартных процедур, чтобы разрешить практически любую проблему с манипуляцией со строками. А такие проблемы иногда возникают.
К примеру, известная нам функция Length, которая вычисляет длину строки. Разве не удобно ее использовать? По моему, вполне. Но хочется отметить, что по сути Length даже и не относиться к функциям работы со строками (точнее, к функциям по обработке строк), так как она не манипулирует со строкой непосредственно. Вычисление размера, на мой взгляд, это не прямая работа... хотя у каждого есть на этот счет свое мнение, а я должен придержиться сути нашего урока.
Итак, для начала я перечислю все процедуры и функции, имеющиеся в языке Turbo Pascal 7.0, которые служат для обработки строк:
- function Copy (S: String; Index: Integer; Count: Integer): String;
- procedure Delete (S: String; Index: Integer; Count: Integer);
- procedure Insert (Source: string; S: string; Index: Integer);
- function Pos (Substr, S: String): Byte;
- function Concat (S1, S2, ....., Sx: String): String;
Из не так уж и много, как видите. Кстати, обратите внимание: начиная с прошлого выпуска вы знакомы с понятием процедуры и функции, поэтому я записываю их с параметрами и указанием типа для функций.
Ну а теперь давайте рассмотрим все эти процедуры в отдельности и заоодно немного с ними попрактикуемся. Найдутся и примеры создания собственных функций.
1. function Copy (S: String; Index: Integer; Count: Integer): String;
Начнем с функции Copy. Эта функция создает из имеющейся строки подстроку. Проще говоря, выделяет какой-то кусок имеющейся строки и возвращает его как результат своей работы. Результат этот как всегда (помните, определение функций?) может быть присвоен переменной, использован в выражении, в процедуре (например, выведен на экран).
Теперь о параметрах. Как вы видите, их у Copy три. Разберем их по отдельности:
- S: String;
Этот параметр - исходная строка, то есть та строка, из которой мы будем "вырезать кусок".
- Index: Integer;
Номер первого символа, начиная с которого начнется выделение строки. При этом если этот параметр больше реальной длины строки, то функция возвратит пустую строку.
- Count: Integer;
Количество символов, которые будут выделены, начиная с номера, задаваемого параметром Index: Integer;
Чтобы показать наглядно работу функции Copy, представьте себе такую строку:
АБВГДЕ
Допустим, мы хотим выделить три символа, начиная со второго, то есть получить такую строку:
БВГ
При использовании Copy для реализации такой задачи давайте напишет следующую программу:
|
Program N2; |
|
var |
S, S1: String; |
|
begin |
S := 'АБВГДЕ'; |
S1 := Copy(S, 2, 3); |
Write(S1); |
Readln; |
end. |
Эта программа делает именно то, что нам нужно. Думаю, здесь все понятно и двигаемся дальше.
А дальше, в качестве практики, да и для лучшего восприятия работы этой фукнции я предлагаю самим написать функцию Copy. Разве не интересно иногда задуматься, что там - внутри Turbo PASCAL'я?
Итак, если вы не возражаете, начнем. Что же мы будем делать? Во-первых, задумаемся что представляет собой "выделение подстроки из строки". А это не что иное, как:
- Вычисление размера исходной строки;
- Если параметр Index больше, чем длина заданной строки, то возвращаем пустую строку - ''; иначе переходим на следующий пункт.
- Начиная с символа под номером, задаваемым параметром Index мы будем дополнять временную строку символами из заданной строки, выполняя это столько раз, сколько задано в параметре Count.
- В качестве возвращаемого значения присвоим имени функции новую, временную строку.
Что скажете? Ведь действительно, все очень просто. Но однажды написав самостоятельно такую процедуру, вы сразу и до конца поймете работу со строками и их организацию, что, поверьте мне, далеко немаловажно.
Итак, текст программы (назовем новую, нашу функцию My_Copy;):
|
Program N3; |
function My_Copy(S: String; Index: Integer; Count: Integer): String; |
|
var |
Temp_S: String; |
I: Byte; |
|
begin |
Temp_S := ''; |
{ Проверяем на длину - иначе может получится белиберда } |
If Count > Length(S)-2 then Count := Length(S)-2; |
|
{ Если номер меньше, чем длина, то выполняем. |
иначе Temp_S так и остается пустой, ее и возвращаем } |
|
If Index < Length(S) then |
For I := 1 to Count do |
Temp_S := Temp_S + S[Index+I]; |
|
My_Copy := Temp_S; |
end; |
|
var |
S, S1: String; |
|
begin |
S := 'АБВГДЕ'; |
S1 := My_Copy(S, 2, 3); |
Writeln(S1); |
S := '123456789'; |
Write(My_Copy(S, 5, 1)); |
Readln; |
end. |