Бабалова Алгоритмизация задач и структурирование программ 2013
.pdf3.26.Вводятся две последовательности целых чисел A и B. С помощью процедуры обеспечить поиск элементов, не входящих в одну из последовательностей или A, или B. Вывести исходные последовательности и результаты поисков.
3.27.Дана последовательность слов B. С помощью процедуры создать новую последовательность, в которую элементы последовательности B входят только по одному разу.
3.28.Задана некоторая последовательность це-
лых чисел из 49 значений. Расположить эти числа в квадратной матрице по спирали с помощью процедуры. Вывести матрицу в обычном и преобразованном видах.
3.29. Задан некоторый текст, заканчивающийся точкой. Текст состоит из произвольного количества строк. Каждая
трока заканчивается “;”. Слова в тексте записаны не менее чем через один пробел. Подсчитать с помощью функции количество одинаковых букв в тексте и вывести результат обработки в виде:
<буква>. < количество >. <номер строки текста>.
3.30.Задана некоторая строка длины не более 80 символов. Описать функцию, определяющую количество вхождений подстроки SS
вту часть строки, которая начинается с K-й позиции. Вывести исходную строку, подстроку SS и результат обработки.
3.31.Заданную последовательность целых чисел проверить с помощью функции на характер последовательности: арифметическая прогрессия, геометрическая прогрессия или произвольная. Вывести заданные последовательности и результат их проверки.
3.32.Дана матрица размерности N*M целых чисел. Обеспечить с помощью процедуры K сдвигов вправо при вводе знака +K или влево при вводе –K. Обеспечить вывод исходной матрицы и результата ее преобразования.
3.33.Дана последовательность целых чисел. С помощью функции обеспечить запись этой последовательности в двоичной системе счисления. Вывести исходные числа и результат преобразования.
3.34.Дана последовательность целых чисел. С помощью функции обеспечить запись этой последовательности в шестнадцатеричной системе счисления. Вывести исходные числа и результат преобразования.
51
3.35.Дана последовательность слов A размерности n. Упорядочить последовательность методом вставки. С помощью процедуры создать новую последовательность, в которую элементы последовательности A входят только по одному разу. Вывести результаты.
3.36.Дана последовательность целых чисел длиной M. С помощью процедуры расположить последовательность в виде матрицы максимальной размерности n. Размерность матрицы n определяется количеством элементов в последовательности m=n*n. Матрица должна получиться квадратной. Дополнить строку нулями, если количество чисел будет меньше n.
3.37.Дана матрица размерности M*N. Упорядочить с помощью процедуры по возрастанию элементы первой строки матрицы, а во всех остальных строках расположить элементы в соответствии с исходными номерами элементов первой строки. Вывести исходную матрицу и результат преобразования с номерами элементов первой строки.
3.38.С помощью процедуры обеспечить заполнение матрицы размерности n*n числами 1, 2, 3, 4 таким образом, чтобы в строках, столбцах и на главной диагонали не было одинаковых рядом стоящих чисел. Вывести результирующую матрицу.
3.39.В каждой строке матрицы размерности M*N обеспечить поиск максимального и минимального элементов. Поменять их местами. Все действия по поиску значений и перестановке элементов матрицы записать в процедурах и функциях.
3.40.Вводится матрица из n*m значений. В матрице могут быть одинаковые строки. Обеспечить удаление лишних строк и вывести результирующую матрицу с указанием ее размерности. Все действия над матрицей описать процедурами. Выводить исходную и результирующую матрицы.
52
Тема 4. РАБОТА С ФАЙЛАМИ РАЗНЫХ ТИПОВ
Определение файла. Файл – это именованная последовательность данных одного типа на внешнем носителе. В языке программирования определение файла обеспечивается объявлением соответствующего типа данных.
Type <имя> = file of <типданных>; <имя> = textfile;
<имя> = file;
Файлы в программе обрабатываются методами операционной системы (типа Windows). Для работы с файлами всех типов в программе должны быть выполнены следующие действия.
1.Объявление типа файла.
2.Создание файловой переменной.
3.Связывание файловой переменной и файла в памяти.
4.Открытие файла на запись, чтение или запись/чтение.
5.Работа с файлами методами программы (запись или чтение данных).
6.Закрытие файла.
Файл в памяти связывается с данными программы с помощью файловой переменной. На рис. 23 это переменная ff. При прочтении или записи одного поля данных файловая переменная перемещается к следующей записи файла. Движение по файлу продолжается при чтении до конца файла. Конец файла имеет свой код, который в программе считывается функцией eof(ff).
Рис. 23. Структура файла в памяти
Файловая переменная ff при считывании одного значения из файла перемещается на позицию следующего значения, хранимого в файле. В файле все его компоненты пронумерованы. Нумерация всегда начинается со значения 0. В конце файла должен быть всегда признак конца файла (код #26).
53
Рассмотрим запись перечисленных действий на языке.
1.Объявление типа данных – файл: Type ss=string[20];
rec=record
name:ss;
mark:integer;
end; ff_s=file of ss;
//Это файл из строк конечной длины ff_rec=file of rec; //Это файл из записей
2.Объявление файловой переменной: Var fs:ff_s;
f_r:ff_rec; ft:textfile;
3.Связывание файловой переменной и файла в памяти: Assignfile(<имя файловой переменной>, <имя файла>);
Assignfile (fs,’My_file.dat’); Assignfile(f_r,’My_rec.dat’); Assignfile(ft,’My_text.txt’ );
4.Открытие файла для чтения данных:
Reset(fs);
read(fs, Mas_str [ i]) ;
5.Открытие файла только на запись: Rewrite (f_r);
write(f_r, aa_rec [i]) ;
6.Закрытие файла:
close(fs) ; closefile(f_r);
Перейдем к работе с типизированными файлами.
Пример 4.1. Ввести последовательность целых чисел, сохранить ее в файле и прочитать этот массив из файла.
Разработка программы должна начинаться с создания алгоритма программы. Для этого воспользуемся структурированием программы. Все действия по обработке данных с файлами представим простейшими методами: создание данных, запись данных в файл и чтение данных из файла.
Структура программы показан на рис. 24.
54
Рис. 24. Структура программы для обработки типизированных файлов
В структуре есть три процедуры для создания файла, записи чисел в файл и чтение записанного из файла с выводом на экран. program Project_file;
{$APPTYPE CONSOLE} uses
SysUtils; label 10;
type aa=array of integer; ff=file of integer;
var a:aa; n,i:integer; g:integer; f:ff;
Filename:string;
procedure Create_m(var b:aa;var k:integer); var i:integer;
begin Randomize;
n:=Random(10)+2;
Setlength(a,n);
//Обязательное действие по определению
//текущей длины динамического массива for i:=0 to n-1 do
55
b[i]:=random(30);
end;
procedure write_file(var f1:ff;var b:aa); var i:integer;
begin assignfile(f1,Filename); rewrite(f1);
for i:=0 to n-1 do write(f1,b[i]);
closefile(f1);
end;
procedure read_file(var f1:ff;var b:aa;var fn:string);
// Для поиска файла надо самому пользователю ввести имя файла label 10;
var i:integer; begin
Assignfile(f1,fn); {$I-}
reset(f1); //Файл открывается для чтения
{$I+}
if IOResult <> 0 then begin
writeln('File not found'); goto 10;
end;
i:=0;
while not eof(f1) do begin
writeln(' Array from file '); for i:=0 to n - 1 do
begin read(f1,b[i]);
writeln('**********',b[i]:5);
writeln;
end;
end;
closefile(f1);
10 : writeln('File new');
56
end; begin
writeln('Create data'); Create_m(a,n); writeln(' Result'); for i:=0 to n - 1 do
write( a[i]:5); writeln;
Filename:='My_file.dat'; write_file(f,a);
Writeln(' Enter the name of file'); Readln(Filename);
read_file (f,a,filename); readln;
{ TODO -oUser -cConsole Main : Insert code here } end.
Результаты работы программы приведены на рис. 25.
а
б
Рис. 25. Сгенерированная последовательность случайных чисел, считанная из файла (а) и ошибка чтения из файла (б)
57
Сгенерированные данные были записаны в файл и прочитаны из него. При попытке прочитать данные из другого файла вырабатывается ошибка чтения данных.
Работа со стандартными визуальными компонентами для обработки файлов в среде Delphi. На рис. 26 приведено окно формы для работы с файлами в среде Delphi. Окно для ввода данных – это компонент TStringGrid.
Рис. 26. Окна формы для ввода и вывода данных
Для вывода результата предложено окно TListBox. Все данные в этих окнах рассматриваются средой как строки.
Пример 4.2. Список из данных следующего формата: фамилия, группа – должен быть сохранен в файле и прочитан из файла.
Структура программы идентична структуре в примере 4.1. Приводим пример программы, обеспечивающей запись в типи-
зированный файл указанных сведений: unit Unit_open;
interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Buttons; type
TForm1 = class(TForm)
58
Edit1: TEdit; BitBtn1: TBitBtn; BitBtn2: TBitBtn; BitBtn3: TBitBtn; BitBtn4: TBitBtn;
StringGrid1: TStringGrid; Label1: TLabel; ListBox1: TListBox;
OpenDialog1: TOpenDialog;
procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure BitBtn3Click(Sender: TObject); procedure BitBtn4Click(Sender: TObject); procedure FormCreate(Sender: TObject); private
{Private declarations } public
{Public declarations } end;
type ss=string[30]; spisok=record
ffn:ss;
number:integer;
end; // Определение типа данных ff=file of spisok; // Файл из записей
aa=array of spisok;
//Массив записей для выполнения действий var
Form1: TForm1; f:ff;
a:aa;
n:integer; implementation {$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject); var i:integer;
begin
59
i:=1;
while Stringgrid1.cells[0,i]<> '' do begin
setlength(a,i); with a[i-1] do begin
ffn:= Stringgrid1.cells[0,i];
number:= strtoint(Stringgrid1.cells[1,i]); i:=i+1;
end; n:=i-1;
end; // Считываем данные из окна ввода в массив
end;
procedure TForm1.BitBtn2Click(Sender: TObject); var k:integer;
sp:spisok;
begin
if OpenDialog1.execute then assignfile(f,openDialog1.Filename) else
begin
Showmessage(' File not found'); exit;
end;
reset(f);
k:=filesize(f);
label1.caption:=' k=' +inttostr(k); Edit1.Text:= openDialog1.Filename;
while not eof(f ) do begin
read(f,sp); // Читаем данные для вывода в окно формы
ListBox1.items.add(sp.ffn +' '+inttostr(sp.number)); end;
closefile(f);
end;
procedure TForm1.BitBtn3Click(Sender: TObject); var i:integer;
begin
60