|
По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Работа со строками и записями
В этой главе мы познакомимся с двумя типами данных — строками и за-писями. Работа основных функций обработки строк будет показана на приме-рах, после чего читатель может познакомиться с записями. Запись (record ) — это сложная структура данных, состоящая из фиксированного количества объектов, называемых полями записи. В отличие от массивов, поля записи могут быть разного типа.
8.1 Обработка текста
Часто в задачах программирования приходится обрабатывать текст. Обработка текста в FreePascal состоит из обработки символов и обработки строк. Понятие строки уже было введено в главе 2, и там же рассмотрены основные функции работы со строками. Напомним основные моменты.
Символ — это буква, цифра или какой-либо знак. Кодовая таблица символов состоит из 256 позиций, т. е. каждый символ имеет свой уникальный код от 0 до 255. Так как код символа представляет собой число не более 255, то очевидно, что в памяти компьютера один символ занимает 1 байт. Для работы с символами существует тип данных char (1 байт).
Строка — это набор символов. Текстовая строка имеет определённую длину. Длина строки — это количество символов, которые она содержит. Если один символ занимает 1 байт, то строка из
символов занимает в памяти соответственно
байт. Для работы со строками существует тип данных string.
Для задания в программе символьной или строковой переменной используются одинарные кавычки, например:
s := ’Q ’;
s1 := ’ Privet ’;
В программе можно ограничить длину текста, хранимого в строковой переменной. Для этого строковую переменную нужно объявить следующим образом (в скобках указывается максимальная длина строки):
var str : string [ 20 ];
Рассмотрим основные операции со строками.
Одной из основных операцией со строками является их объединение. Для этого их можно сложить подобно числам. Например:
var s : string;
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.
В следующем примере мы прочитаем из поля 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.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.


