По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Работа со строками и записями
В этой главе мы познакомимся с двумя типами данных — строками и за-писями. Работа основных функций обработки строк будет показана на приме-рах, после чего читатель может познакомиться с записями. Запись (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.