If not(St[i] in a) then begin
Include(a,St[i]); Inc(m);
end;
Result:=m;
end;
FunctionFWrd(st : string) : string;
var n,i,nst: integer;
sl,srez : string;
Begin
Result:=''; srez:=''; n:=Length(st);
if n=0 then exit;
st:=st+' '; n:=n+1; sl:='';
for i:=1 to n do
if st[i]<>' ' then sl:=sl+st[i]
Else
If sl<>'' then begin
srez:=srez+' '+sl+'-'+IntTostr(Krz(sl)); sl:='';
end;
Result:=srez;
end; // Конец функции FWrd
procedure TForm1.FormCreate(Sender: TObject);
Begin
Edit1.Clear; Edit2.Clear;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Begin
if Key = #13 then Edit2.Text:=FWrd(Edit1.Text);
end;
End.
7.6. Выполнение индивидуального задания
По указанию преподавателя выберите вариант задачи. Для ввода строк и работы с ними использовать компонент TEdit. Ввод строки заканчивать нажатием клавиши Enter. Алогритм оформить в виде подпрограммы.
1. Дана строка символов, состоящая из групп нулей и единиц, разделенных пробелами. Найти количество групп с пятью символами.
2. Дана строка, представляющая собой запись числа в четырнадцачиричной системе счисления. Преобразовать ее в строку, представляющую собой запись числа в десятеричной системе счисления.
3. Дана строка, представляющая собой запись числа в десятеричной системе счисления. Преобразовать ее в строку, представляющую собой запись числа в восьмеричной системе счисления.
4. Дана строка, представляющая собой запись числа в восьмиричной системе счисления. Преобразовать ее в строку, представляющую собой запись числа в двоичной системе счисления.
5. Дана строка символов, состоящая из произвольных десятичных чисел, разделенных пробелами. Вывести на экран числа этой строки в порядке возрастания их значений.
6. Дана строка, состоящая из групп нулей и единиц, разделенных пробелами. Найти и вывести на экран самую короткую группу.
7. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется от другой одним или несколькими пробелами. Подсчитать количество символов в самой длинной группе.
8. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется от другой одним или несколькими пробелами. Найти и вывести на экран группы с четным количеством символов.
9. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется от другой одним или несколькими пробелами. Подсчитать количество посторяющихся символов в группах с нечетным количеством символов.
10. Дана строка символов, состоящая из произвольных десятичных чисел, разделенных пробелами. Вывести четные числа этой строки.
11. Дана строка, представляющая собой запись числа в двоичной системе счисления. Преобразовать ее в строку, представляющую собой запись числа в шестнадцатиричной системе счисления
12. Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Вывести на экран порядковый номер слова, накрывающего k-ю позицию (если на k-ю позицию попадает пробел, то номер предыдущего слова), и найти в нем количество посторяющихся символов.
13. Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Разбить исходную строку на две подстроки, причем первая длиной k-символов (если на k-ю позицию попадает слово, то его следует отнести ко второй строке, дополнив первую пробелами до k-позиций).
14. Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Вывести на экран порядковый номер слова максимальной длины и номер позиции строки с которой оно начинается.
15. Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Вывести на экран порядковый номер слова минимальной длины и количество непосторяющихся символов этом слове.
Тема 8. Программирование с использованием Записей и файлов
Цель лабораторной работы: изучить правила работы с компонентами TOpenDialog и TSaveDialog. Изучить правила работы с типом запись. Написать программу с использованием файлов.
8.1. Определение типа запись
Запись – это структура данных, объединяющая элементы одного или различных типов, называемые полями. Записи удобны для создания структурированных баз данных с разнотипными элементами, например:
Type TStudent = record // Объявление типа
Fio:string[30]; // Поле Ф.И.О.
Group:integer; // Поле номера студ. группы
Ocn:array[1..3] of integer; // Поле массива оценок
end;
Var Student: TStudent; // Объявление переменной типа запись
Доступ к каждому полю осуществляется указанием имени записи и поля, разделенных точкой, например:
Student.Fio:= ’Иванов А.И.’; // Внесение данных в поля записи
Student.Group:=720603;
Для сокращения текста доступ к полям осуществляется также при помощи оператора with:
With Student do begin
Fio:= ’Иванов А.И.’;
Group:=720603;
end;
8.2. Работа с файлами
Файл – это именованная область данных на внешнем физическом носителе. В Object Pascal различают три вида файлов в зависимости от способа их организации и доступа к элементам: текстовые, типизированные и нетипизированные.
Текстовой файл – это файл, состоящий из строк. Примером текстовогофайла может служить файл исходного текста программы в DELPHI (расширение pas). Для работы с текстовым файлом должна быть описана соответствующая файловая переменная: Var F: TextFile;.
Типизированные файлы имеют строго заданную их описанием структуру, когда все элементы имеют фиксированный и одинаковый размер. Это свойство типизированных файлов позволяет получить доступ к любому компоненту файла по его порядковому номеру. Элементами такого файла являются, как правило, записи. В описании файловой переменной указывается ее тип: Var F: TStudent;.
Нетипизированный файл – это файл, в котором данные не имеют определенного типа и рассматриваются как последовательность байт. Файловая переменная объявляется: Var F: File;.
Порядок работы с файлами следующий:
. . .
AssignFile(Fl, ‘Filenam1.txt’); // Связывание файловой переменной
AssignFile(Fw, ‘Filenam2.txt’); // с именем файла на диске
Rewrite(Fl); // Создание нового файла Fl
Reset(Fw);) // Открытие уже существующего файла Fw
. . .
Write(Fl, Stud); // Запись данных в файл Fl
Read(Fw, Stud); // Чтение данных из файла Fw
. . .
CloseFile(Fl); // Закрытие файла Fl
CloseFile(Fw); // Закрытие файла Fw
8.3. Подпрограммы работы с файлами
AssignFile(var F; FileName: string) - связывает файловую переменную F и файл с именем FileName.
Reset(var F[: File; RecSize: word]) - открывает существующий файл. При открытии нетипизированного файла RecSize задает размер элемента файла.
Rewrite(var F[: File; RecSize: word])- создает и открывает новый файл.
Append(var F: TextFile) - открывает текстовой файл для дописывания текста в конец файла.
Read(F,v1[,v2,…vn])- чтение значений переменных начиная с текущей позиции для типизированных файлов и строк для текстовых.
Write(F,v1[,v2,…vn])- запись значений переменных начиная с текущей позиции для типизированных файлов и строк для текстовых.
CloseFile(F)- закрывает ранее открытый файл.
Rename(var F; NewName: string) - переименовывает неоткрытый файл любого типа.
Erase(var F)- удаляет неоткрытый файл любого типа.
Seek(var F; NumRec: Longint)- для нетекстового файла устанавливает указатель на элемент с номером NumRec.
SetTextBuf(var F: TextFile; var Buf[;Size: word])- для текстового файла устанавливает новый буфер ввода-вывода объема Size.
Flush(var F: TextFile) - немедленная запись в файл содержимого буфера ввода-вывода.
Truncate(var F)- урезает файл, начиная с текущей позиции.
IoResult: integer- код результата последней операции ввода-вывода.
FilePos(var F): longint- для нетекстовых файлов возвращает номер текущей позиции. Отсчет ведется от нуля.
FileSize(var F): longint- для нетекстовых файлов возвращает количество компонентов в файле.
Eoln(var F: TextFile): boolean- возвращает True, если достигнут конец строки.
Eof(var F) ): boolean- возвращает True, если достигнут конец файла.
SeekEoln(var F: TextFile): boolean– возвращает True, если пройден последний значимый символ в строке или файле, отличный от пробела или знака табуляции.
SeekEof(var F: TextFile): boolean- то же, что и SeekEoln, но для всего файла.
BlockRead(var F: File; var Buf; Count: word[; Result: word]) , BlockWrite(var F: File; var Buf; Count: word[; Result: word]) - соответственно процедуры чтения и записи переменной Buf с количеством Count блоков.
8.4. Компоненты TOpenDialog и TSaveDialog
Компоненты TOpenDialog и TSaveDialog находятся на странице DIALOGS. Все компоненты этой страницы являются невизуальными, т.е. не видны в момент работы программы. Поэтому их можно разместить в любом удобном месте формы. Оба рассматриваемых компонента имеют идентичные свойства и отличаются только внешним видом. После вызова компонента появляется диалоговое окно, с помощью которого выбирается имя программы и путь к ней. В случае успешного завершения диалога имя выбранного файла и маршрут поиска содержaтся в свойстве FileName. Для фильтрации файлов, отображаемых в окне просмотра, используется свойство Filter, а для задания расширения файла, в случае, если оно не задано пользователем, – свойство DefaultExt. Если необходимо изменить заголовок диалогового окна, используется свойство Title.
8.5. Пример написания программы
Задание: написать программу, вводящую в файл или читающую из файла ведомость абитуриентов, сдавших вступительные экзамены. Каждая запись должна содержать фамилию, а также оценки по физике, математике и сочинению. Вывести список абитуриентов, отсортированный в порядке уменьшения их среднего балла в окно TMemo, и записать эту информацию в текстовой файл.
8.5.1. Настройка компонентов TOpenDialog и TSaveDialog
Для установки компонентов TOpenDialog и TSaveDialog на форму, необходимо на странице Dialogs меню компонентов щелкнуть мышью соответственно по пиктограммам или и поставить их в любое свободное место формы. Настройка фильтра производится следующим образом. Выбрав соответствующий компонент, дважды щелкнуть по правой части свойства Filter инспектора объектов. Появится окно Filter Editor, в левой части которого записывается текст, характеризующий соответствующий фильтр, а в правой части – маску. Для OpenDialod1 установим значения маски как показано на рис. 8.1. Формат *.dat означает что, будут видны все файлы с расширением dat, а формат *.* - что будут видны все файлы (с любым именем и с любым расширением).
Рис. 8.1.
Для того, чтобы файл автоматически записывался с расширением dat, в свойстве DefaultExt запишем требуемое расширение – .dat. Аналогичным образом настроим SaveDialog1 для текстового файла (с расширением txt).
Рис. 8.2.
8.5.2. Работа с программой
После запуска программы на выполнение появится диалоговое окно программы. Кнопка “Ввести запись” видна не будет. Необходимо создать новый файл записей, нажав на кнопку “Создать” или открыть ранее созданный, нажав кнопку “Открыть”. После этого станет видна кнопка “Ввести запись” и можно будет вводить записи. При нажатии на кнопку “Сортировка” будет проведена сортировка ведомости по убыванию среднего балла и диалоговое окно примет вид как на рис. 8.2. Затем при нажатии на кнопку “Сохранить” будет создан текстовой файл, содержащий отсортированную ведомость. Файл записей закрывается одновременно с программой при нажатии на кнопку “Close” или .
Текст программы приведен на Листинге 8.1.
Листинг 8.1.
unit unit8;
Interface
usesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
Type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Memo1: TMemo;
Button1: TButton;
Button3: TButton;
Splitter1: TSplitter;
Button5: TButton;
BitBtn1: TBitBtn;
SaveDialog1: TSaveDialog;
Button2: TButton;
OpenDialog1: TOpenDialog;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;
Type
TStudent = record
FIO: string[40]; // Поле ф.и.о.
otc: array[1..3] of word; // Поле массива оценок
sball : extended; // Поле среднего балла
end;
Var
Fz : file of Tstudent; // Файл типа запись
Ft : TextFile; // Текстовой файл
Stud : array[1..100] of Tstudent; // Массив записей
nzap : integer; // Номер записи
FileNameZ, FileNameT : string; // Имя файла
Var
Form1: TForm1;
Implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
Begin
Edit1.Clear; Edit2.Clear; Edit3.Clear; Edit4.Clear;
Memo1.Clear;
Button1.Hide; // Сделать невидимой кнопку “Ввести запись”
nzap:=0;
end;
procedure TForm1.Button1Click(Sender: TObject); // Ввести новую запись
Begin
nzap:=nzap+1;
with stud[nzap] do begin
FIO:=Edit1.Text;
otc[1]:=StrToInt(Edit2.Text);
otc[2]:=StrToInt(Edit3.Text);
otc[3]:=StrToInt(Edit4.Text);
sball:=(otc[1]+otc[2]+otc[3])/3;
Memo1.Lines.Add(fio+’ ‘+IntToStr(otc[1])+’ ‘+ IntToStr(otc[2])+
’ ‘+IntToStr(otc[3]));
end;
Write(fz,Stud[nzap]); // Запись в файл
Edit1.Clear; Edit2.Clear; Edit3.Clear; Edit4.Clear;
end;
procedure TForm1.Button2Click(Sender: TObject); //Создание нового
begin // файла записей
OpenDialog1.Title :=’Создать новый файл’; // Изменение заголовка
//окна диалога
if OpenDialog1.Execute then // Выполнение стандартного диалога
begin // выбора имени файла
FileNameZ:= OpenDialog1.FileName; // Возвращение имени
// дискового файла
AssignFile(Fz, FileNameZ); // Связывание файловой переменной Fz
// c именем файла
Rewrite(Fz); // Создание нового файла
end;
Button1.Show; // Сделать видимой кнопку “Ввести запись”
end;
procedure TForm1.Button3Click(Sender: TObject); // Открыть
begin // существующий файл
if OpenDialog1.Execute then // Выполнение стандартного диалога
begin // выбора имени файла
FileNameZ:= OpenDialog1.FileName; // Возвращение имени
дискового файла
AssignFile(Fz, FileNameZ); // Связывание файловой переменной Fz
// c именем файла
Reset(Fz); // Открытие существующего файла
end;
nzap:=0;
while not eof(fz) do begin
nzap:=nzap+1;
Read(fz,stud[nzap]); // Чтение записи из файла
with stud[nzap] do
Memo1.Lines.Add(fio+’ ‘+IntToStr(otc[1])+’ ‘+IntToStr(otc[2])+
’ ‘+IntToStr(otc[3]));
end;
Button1.Show; // Сделать видимой кнопку “Ввести запись”
end;
procedure TForm1.Button4Click(Sender: TObject); // Сортировка записей
var i,j : word;
st : TStudent;
Begin
for i:=1 to nzap-1 do // Сортировка массива записей
for j:=i+1 to nzap do