Санкт-Петербургский политехнический университет Петра Великого
Институт Металлургии, Машиностроения и Транспорта
Кафедра «Компьютерные Технологии и Машиностроения»
Отчет
По лабораторной работе №10
Дисциплина: «Информатика»
Тема: «Внешние файлы» Вариант - 8
Студент гр. 13332/1 А. Р. Алимов
Преподаватель Ю. В. Кожанова
«__»______________2018
Санкт-Петербург
2018г.
Цель работы
Цель работы приобретение умений построения конструкций контроля вводимых числовых данных пользователем.
Задание Дополнить проекты предыдущей лабораторной работы конструкциями контроля синтаксиса вводимых данных.
Ход работы
Алгоритм программы
Рис.1 – Блок-схема
Программный код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
btn1: TBitBtn;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var f1,f2:textfile; i, j, m, k:byte; x:array of array of Integer; y:array of byte;
BEGIN
If OpenDialog1.Execute Then //если файл выбран в окне открытия файла
Begin
AssignFile(f1, OpenDialog1.FileName); //связать его с переменной f1
{$I-} Reset(f1); {$I+} //открыть файл, связанный с f1 для чтения
if IOresult <>0 then begin ShowMessage('Файл не найден'); Exit; end;
End
Else Begin ShowMessage('файл для чтения не выбран'); Exit; End;
if eof(f1) then begin ShowMessage(' файл пуст'); Closefile(f1); Exit; end;
i:=0; //начальное значение номера строки
while not eof(f1) do //пока не достигнут конец файла
Begin //начало тела внешнего цикла
SetLength(x, i+1); //выделение (добавл.) памяти под одну строку массива x
SetLength(y, i+1); //выделение (добавл.) памяти под один элемент массива y
j:=0; //начальное значение номера столбца (номера элемента в строке)
while not eoln(f1) do //пока не достигнут конец строки
begin //начало тела вложенного цикла
SetLength(x[i], j+1); //выделение памяти под один эл-нт в i-ой строке
{$I-} Read(f1, x[i,j]); {$I+} //чтение (ввод) xij элемента из файла
if IOResult <>0 then begin
ShowMessage('Ошибка син-са'); CloseFile(f1);
SetLength(x, 0, 0); SetLength(y, 0); Exit;
end;
j:=j+1; //переход к следующему столбцу в i-ой строке
end; //конец тела вложенного цикла
y[i]:=j; //запись в массив y длины i-ой строки
i:=i+1; //переход к следующей строке
Readln(f1); //перевод строки чтения в файле чтения
End; //конец тела внешнего цикла
CloseFile(f1); //закрытие файла чтения
m:=i; //число строк получает значение числа итераций внешнего цикла
If SaveDialog1.Execute Then //если файл выбран в окне сохранения
Begin
AssignFile(f2,SaveDialog1.FileName); //связать его с переменной f2
{$I-} Rewrite(f2); {$I+} //открыть файл, связанный с f2 для записи
if IOResult <>0 then begin ShowMessage('Ошибка доступа'); Exit; end;
End
Else Begin ShowMessage('Файл записи не выбран'); Exit; End;
i:=0; //начальное значение номера строки135
Begin //начало тела внешнего цикла
k:=0;
j:=0; //начальное значение номера столбца (номера элемента в строке)
while j <= y[i]-1 do //пока не исчерпаны все элементы i-ой строки
begin //начало тела вложенного цикла
k:=k+1; //запись в файл квадрата элемента в формате
j:=j+1; //переход к следующему столбцу 5:2 с пробелом
end; //конец тела вложенного цикла
i:=i+1; //переход к следующей строке вывода
Write(f2, k,' ');
Writeln(f2); //перевод строки записи в файле
End; //конец тела внешнего цикла
CloseFile(f2); //закрытие файла записи
SetLength(x, 0, 0); //высвоб. памяти из-под двумерного массива элементов
SetLength(y, 0); //высвоб. памяти из-под одномерного массива длин строк
END; //конец процедуры
Файл записи и вывода представлены на рисунке 2.1 и 2.2.
Рис 2.1 – файл записи Рис 2.2 – файл вывода