Компания ALT Linux
Опубликован: 10.04.2015 | Доступ: свободный | Студентов: 762 / 0 | Длительность: 14:03:00
Специальности: Программист, Преподаватель
Лекция 8:

Работа со строками и записями

< Лекция 7 || Лекция 8: 12 || Лекция 9 >

В этой главе мы познакомимся с двумя типами данных — строками и за-писями. Работа основных функций обработки строк будет показана на приме-рах, после чего читатель может познакомиться с записями. Запись (record ) — это сложная структура данных, состоящая из фиксированного количества объектов, называемых полями записи. В отличие от массивов, поля записи могут быть разного типа.

8.1 Обработка текста

Часто в задачах программирования приходится обрабатывать текст. Обработка текста в FreePascal состоит из обработки символов и обработки строк. Понятие строки уже было введено в главе 2, и там же рассмотрены основные функции работы со строками. Напомним основные моменты.

Символ — это буква, цифра или какой-либо знак. Кодовая таблица символов состоит из 256 позиций, т. е. каждый символ имеет свой уникальный код от 0 до 255. Так как код символа представляет собой число не более 255, то очевидно, что в памяти компьютера один символ занимает 1 байт. Для работы с символами существует тип данных char (1 байт).

Строка — это набор символов. Текстовая строка имеет определённую длину. Длина строки — это количество символов, которые она содержит. Если один символ занимает 1 байт, то строка из N символов занимает в памяти соответственно N байт. Для работы со строками существует тип данных string.

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

s := ’Q ’;

s1 := ’ Privet ’;

В программе можно ограничить длину текста, хранимого в строковой переменной. Для этого строковую переменную нужно объявить следующим образом (в скобках указывается максимальная длина строки):

var str : string [ 20 ];

Рассмотрим основные операции со строками.

Одной из основных операцией со строками является их объединение. Для этого их можно сложить подобно числам. Например:

var s : string;

begin

s := ’ text ’ + ’ ’ + ’ * 1 ’;

...

Результатом работы оператора будет строка text__*1.

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

Например:

var s : string; c : char;

begin

s := ’ Privet ’;

c := s [ 4 ];

...

Результатом работы будет символ v.

Теперь рассмотрим основные функции и процедуры обработки строк, приведённые в табл. 2.7, на примерах.

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

program Project1;
var
	Str1, Str2, Str3, Str4 : String;
	word : String;
	K, L : integer;
begin
	Str1 := ’ Ivanov ’;
	Str2 := ’ Sergey ’;
	Writeln ( ’ Stroka   Str1 - ’, Str1 );
	Writeln ( ’ Stroka   Str2 - ’, Str2 );
//объединение 1-й и 2-й строк
Str3 := Str1+ ’ _ ’+Str2;
//определение длины строки
L:= Length ( Str3 );
Writeln ( ’ Stroka _ Str1+Str2 _ _ ’, Str3 );
Writeln ( ’ Dlina _ s t r o k i= ’,L );
Str4 := ’ v ’;
//поиск вхождения буквы v в строке 3
K:=Pos ( Str4, Str3 );
Writeln ( ’ 1_ r a z _bukva_V_na_ p o z i c i i _ ’,K);
//копирование в переменную Str4 6 символов, начиная с 8-го, из строки
//Str3
Str4 :=copy ( Str3, 8, 6 );
Writeln ( ’ Str4= ’, Str4 );
//поиск первого слова - копирование в переменную word символов
//из строки Str3, начиная с первого символа и до пробела
word:=Copy( Str3, 1, Pos ( ’ _ ’, Str3 ) _ 1);
Writeln ( ’1_e _ s l o v o _ __ ’, word );
//удаление из строки Str3 2-х символов, начиная с 5-й позиции
d e l e t e ( Str3, 5, 2 );
Writeln ( ’ Str3 _ p o s l e _ u d a l e n i y a _ simvolov _ _ ’, Str3 );
Readln;
end.
Результаты работы программы обработки строк

Рис. 8.1. Результаты работы программы обработки строк

В следующем примере мы прочитаем из поля Edit формы массив чисел и найдём их сумму. Для этого создадим новый проект, на форме разместим поле Edit1, компонент ListBox1 для вывода результатов и кнопку Button1, как на рис. 8.2. Установим в качестве свойства Text компонента Edit1 следующую строку: 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0, в этом случае при запуске программы этот массив уже будет введён (при записи элементов массива между элементами можно вставлять любое количество пробелов, в дальнейшем в программе количество пробелов между элементами будет сокращено до одного).

Окно формы для считывания массива

Рис. 8.2. Окно формы для считывания массива

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

unit Unit1;
{$mode objfpc}{$H+}
interface
uses
	Classes, SysUtils, LResources, Forms, Controls, Graphics,
	Dialogs, StdCtrls;
type
	{ TForm1 }
	TForm1 = class (TForm)
	Button1 : TButton;
	Edit1 : TEdit;
	Label1 : TLabel;
	Label2 : TLabel;
	ListBox1 : TListBox;
	Memo1 : TMemo;
	procedure Button1Click ( Sender : TObject );
	private
		{ private declarations }
	public
		{ public declarations }
end;
var
	Form1 : TForm1;
implementation
	{ TForm1 }
procedure TForm1. Button1Click ( Sender : TObject );
var Str1, Str2, Str3 : String;
	i : integer;
	word : String;
	x : array [ 0.. 100 ] of real;
	Sum: real;
begin
//чтение строки с диалогового окна из поля Edit1
	Str1 := Edit1. text;
//вывод исходной строки в диалоговое окно
	Str2 := ’Исходная строка ’;
	ListBox1. Items. Add( Str2 );
	ListBox1. Items. Add( Str1 );
	//строку Str1 разобьем на подстроки,в которых
//хранятся считанные строки-числа
	//если первый символ - пробел, то удаляем его
	if Str1 [ 1 ] = ’   ’ then Delete ( Str1, 1, 1 );
	//проход по строке и замена двойного пробела одинарным
//для этого организовывается следующий цикл:
//пока в строке Str1 есть вхождение подстроки, состоящей из
//двух пробелов, удаляется один символ с начальной позиции
	//вхождения подстроки, т. е. удаляется первый пробел
	while Pos ( ’   ’, Str1 ) > 0 do
		Delete ( Str1, Pos ( ’   ’, Str1 ), 1 );
	//для корректной обработки текста сделаем последним
	//символом пробел
	if Str1 [ Length ( Str1 ) ] <> ’   ’ then
		Str1 := Str1+ ’   ’;
//вывод в диалоговое окно изменённой строки
//с одним пробелом между числами
	Str2 := ’Строка после удаления пробелов ’;
	ListBox1. Items. Add( Str2 );
	ListBox1. Items. Add( Str1 );
	i : = 0; Sum: = 0;
//организовываем цикл, в котором выделяем подстроку с числом
//затем запоминаем число в массив,
//а подстроку из строки удаляем
	repeat
//выделение строки-числа (до пробела)
	word:=Copy( Str1, 1, Pos ( ’   ’, Str1 ) - 1);
//преобразование строки в вещественное число и запись его
//в i-ый элемент массива
	x [ i ] : = StrToFloat (word);
	sum:=sum +x [ i ];
	inc ( i );
//удаление из строки Str1 найденной подстроки
	Delete ( Str1, 1, Length (word)+ 1);
//вывод в ListBox1 строки-числа
	ListBox1. Items. Add(word);
//делаем до тех пор, пока длина строки не будет равна 0
	until Length ( Str1 ) = 0;
//вывод рассчитанной суммы элементов массива и количества
	Str2 := ’Summa = ’+FloatToStr (sum );
	Str3 := ’ Kolichestvo elementov  = ’+IntToStr ( i );
	ListBox1. Items. Add( str2 );
	ListBox1. Items. Add( str3 );
end;
initialization
	{$I unit1.lrs}
end.
Результаты работы программы считывания массива из поля Edit

Рис. 8.3. Результаты работы программы считывания массива из поля Edit
< Лекция 7 || Лекция 8: 12 || Лекция 9 >
Юрий Шутиков
Юрий Шутиков

По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. 
 

Евгений Силуков
Евгений Силуков

Еще в декабре выполнил тест №1, а его все так и не проверили.