Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 12_Символьные и строковые переменные.doc
Скачиваний:
2
Добавлен:
24.08.2019
Размер:
1.2 Mб
Скачать

Insert(Slovo2, Text, p); {вставка подстроки Slovo2 }

{ в строку Text с позиции Р}

P:=Pos(Slovo1, Text); {номер позиции, с которой подстрока Slovo1} 

{встречается в строке Text в очередной раз}

end;

  WriteLn('Новый текст: ', Text); 

  ReadLn

END.

 

Пример 4. Заданную последовательность слов переупорядочить в алфавитном порядке (то есть выполнить лексикографическое упорядочение).

Тест

Данные

Результат

Words=(''стул'', ''гора'', ''яма'', ''стол'')

  Words=("гора", "стол", "стул",  "яма")

Program LexOrder;

  Uses Crt;

Var Words : Array[1..10] of String; {массив слов}

  Tmp   : String; {Tmp — вспомогательная переменная}

I, j, nWords : Integer; {nWords — количество слов}

BEGIN

  ClrScr;

  Write('Количество слов в тексте — ');

  ReadLn(NWords);

  For i := 1 to NWords do

  begin Write(i, '-ое слово : ');

  ReadLn(Words[i])

  end;

  For i := 1 to NWords-1 do {лексикографическое упорядочение слов}

  For j := i+1 to NWords do

  If Words[i]>Words[j] then

  begin

Tmp := Words[i]; Words[i]:=Words[j]; Words[j]:=Tmp

  end;

  WriteLn;  WriteLn('О т в е т');

  WriteLn('Лексикографически упорядоченный массив слов:');

  For i := 1 to NWords do Write(Words[i], ' ');

  WriteLn; ReadLn

END.

 

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

Система тестов

Номер

теста

Проверяемый случай

Данные

Результат

1

При просмотре линейной записи слева направо первой встречается закрывающая скобка

''a)b+1(''

''Нет баланса''

2

Первой встречается открывающая скобка, но число открывающих и закрывающих скобок не совпадает

''(a+b))''

''Нет баланса''

3

Есть баланс скобок

''(a+b/(c*d))''

''Есть баланс''

Program Balance;

  Uses Crt;

  Var S   : String;

  Dlina, Flag, i : Integer;

BEGIN ClrScr;

  GotoXY(15, 5);

  Write('Введите линейную запись математической формулы :'); 

  GotoXY(32,7); ReadLn(S);

  i:=1; Flag:=0; Dlina:=Length(S);

  While (Flag>=0) and (i<=Dlina) do

  begin

  If S[i] = '(' then Flag:=Flag + 1;

  If S[i] = ')' then Flag:=Flag - 1;

  i:=i+1

  end;

  GotoXY(32, 9); WriteLn('О т в е т');

  GotoXY(15,11);

  If Flag=0 then Write('Есть баланс ') else Write('Нет баланса ');

  WriteLn('открывающих и закрывающих скобок');

  ReadLn

END

Записи

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

Запись - это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов, называемых полями записи. Определение типа записи начинается идентификатором Record и заканчивается зарезервированным словом end. Между ними заключен список компонентов, называемых полями, с указанием имен полей и типа каждого поля. Структура объявления типа записи такова:

Type <имя типа> = Record

<имя поля1>: <тип компонентов>;

<имя поляN>: <тип компонентов>;

End;

VAR <имя переменной>: <имя типа>;

Пример описания записи:

Type Car=Record

Number:Integer;

Marka:String[20];

FIO:String[40];

Address:String[60];

End;

Var Mashina, Mash : Car;

В данном примере была объявлена запись с именем Car, у которой имеется 4 поля: номер, название марки машины, ФИО владельца и его адрес.

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

Например, доступ к полям записи Car осуществляется как: Mashina.Marka, Mashina.FIO, Mashina.Number. Составное имя можно использовать везде, где допустимо применение типа поля. Для присваивания полям значений используется оператор присваивания, например:

Mashina. Number:=1645365;

Mashina.Marka:=’Volvo’;

Mashina.FIO:=’Иванов И.И.’;

Mashina. Address:=’ул.Пушкина 12-30’;

Составные имена можно использовать в операторах ввода-вывода:

Read (Mashina. Number, Mashina. FIO, Mashina. Address);

Write(Mashina. Number:4, Mashina. FIO:12, Mashina. Address:25);

Допускается применение оператора присваивания и к записям в целом, если они имеют один и тот же тип. Например, Mash:=Mashina;

После выполнения этого оператора значения полей записи Mash станут равны значениям соответствующих полей записи Mashina.

В ряде задач удобно пользоваться массивами из записей. Их можно описать следующим образом:

Type Car=Record

Number:Integer;

Marka:String[20];

FIO:String[40];

Address:String[60];

End;

Var Mashins : array [1..20] of Car;

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

With <переменная типа запись> do <оператор>;

Один раз, указав переменную типа запись в операторе With, можно работать с именами полей как с обычными переменными,например:

With Mashina do

Begin

Number:=164536l;

Marka:=’Volvo’;;

FIO:=’Иванов И.И’;

Address:=’ул.Пушкина 12-30’;

End;