Ваша первая программа на Паскале

Вид материалаПрограмма

Содержание


Length, которая вычисляет длину строки. Разве не удобно ее использовать? По моему, вполне. Но хочется отметить, что по сути Leng
1. function Copy
Copy три. Разберем их по отдельности: S: String
Count: Integer
АБВГДЕ Допустим, мы хотим выделить три символа, начиная со второго, то есть получить такую строку: БВГ
S := 'абвгде'
S := 'абвгде'
Подобный материал:
1   ...   15   16   17   18   19   20   21   22   23

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. Итак, давате определимся с синтаксисом этой конструкции:
  1. Case _переменная_или_выражение_ of

Это - первая строка, показывающая начало конструкции case. Переменная, выражение или функция, которые могут стоять между case и of - это само условие, которое будет проверяться.
  1. Значение: 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.
  1. После всех условий ставится 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.