КР№2 обр данных
.docКонтрольная работа
Вариант 2
Задача 1. «Обработка строк»
Задана строка символов. Группы символов, разделенные пробелом и не содержащие пробелов внутри себя, будем называть словами. Ввести самое длинное слово в строке и его длину.
procedure Count(S,W:string; var i:integer);
begin
if Pos(W,S)<>0 then
begin
inc(i);
Count(Copy(S,Pos(W,S)+Length(W),Length(S)),W,i)
end
end;
var
s,max,temp:string;
i:integer;
begin
writeln('Введите строку...');
readln(s);
temp:='';
max:='';
for i:=1 to length(s) do
begin
if not (s[i] in [' ',',','.']) then
temp:=temp+s[i];
if ((s[i] in [' ',',','.']) or (i=length(s))) and (temp<>'') then
begin
if length(temp)>length(max) then
max:=temp;
temp:=''
end
end;
i:=0;
Count(S,max,i);
writeln('Самое длинное слово: ',max,'. Их в строке: ',i)
end.
Задача 2. «Обработка матриц»
Задана матрица вещественных чисел размерности m x n. Упорядочить строки матрицы по возрастанию элементов первого столбца (считать, что в столбце нет одинаковых элементов). Размерность матрицы и значения ее элементов ввести с клавиатуры.
program MaxInMatrix;
const
MAXCOUNT = 20; {максимальная размерность матрицы}
type
{вектор}
Vector = array [1..MAXCOUNT] of real;
{прямоугольная матрица}
Matrix = array [1..MAXCOUNT, 1..MAXCOUNT] of real;
var
matr: Matrix;
n, m: integer; {реальные размерности матрицы}
min, max: real; {границы диапазона случайных чисел}
ask: char; {для ввода режима}
(*---------------------------------------Ввод размерностей матрицы-----------------------------------*)
procedure EnterMatrixSize(var x,y: integer);
begin
{строки}
repeat
write('Введите количество строк матрицы (1..',MAXCOUNT,') ');
readln(x);
if (x<1) then
writeln('Ошибка! Размерность матрицы не может быть '+ 'меньшей единицы. Повторите ввод.');
if (x>MAXCOUNT) then
writeln('Ошибка! Размерность матрицы не должна быть '+'большей ',MAXCOUNT,'. Повторите ввод.');
until (x>0)and(x<=MAXCOUNT);
{столбцы}
repeat
write('Введите количество столбцов матрицы (1..',MAXCOUNT,') ');
readln(y);
if (y<1) then
writeln('Ошибка! Размерность матрицы не может быть '+'меньшей единицы. Повторите ввод.');
if (y>MAXCOUNT) then
writeln('Ошибка! Размерность матрицы не должна быть '+'большей ',MAXCOUNT,'. Повторите ввод.');
until (y>0)and(y<=MAXCOUNT);
end;
(*------------------Поэлементный ввод прямоугольной матрицы с клавиатуры-----------------*)
procedure EnterMatrix (x,y: integer; var M: Matrix);
var
i,j: integer;
begin
writeln('Введите элементы прямоугольной матрицы:');
for i:=1 to x do
for j:=1 to y do begin
write('M[',i,',',j,'] = ');
readln(M[i,j]);
end;
end;
(*----------------Генерация случайных элементов матрицы в заданном диапазоне--------*)
procedure GenerateMatrix (x,y: integer; var M: Matrix);
var
i,j: integer;
begin
for i:=1 to x do
for j:=1 to y do
M[i,j] := random*(max-min)+min;
end;
(*----Поэлементный вывод матрицы на экран в "естественном" виде (т.е. по строкам) ----*)
procedure PrintMatrix(x,y: integer; M: Matrix);
var
i,j: integer;
begin
for i:=1 to x do begin
for j:=1 to y do
write(M[i,j]:6:2);
writeln;
end;
end;
(*-------------Поэлементный вывод вектора на экран (без учета длины вектора)-------------*)
procedure PrintVector(n: integer; V: Vector);
var
i: integer;
begin
for i:=1 to n do
write(V[i]:6:2);
writeln;
end;
(*------------Процедура меняет местами элементы вектора с заданными индексами---------*)
procedure Change(k,l: integer; var V: Vector);
var
tmp: real;
begin
tmp := V[k];
V[k] := V[l];
V[l] := tmp;
end;
(*---------Процедура меняет местами строки матрицы с заданными индексами-------------*)
procedure ChangeStrings (k,l: integer; m: integer; var matr: Matrix);
var
j: integer;
tmp: real;
begin
for j:=1 to m do begin
tmp:=matr[k,j];
matr[k,j]:=matr[l,j];
matr[l,j]:=tmp;
end;
end;
(*-----------Функция возвращает индекс минимального элемента массива в интервале индексов от i1 до i2 ----------------------------------------*)
function GetMinInPart (V: Vector; i1, i2 : integer) : integer;
var
j, jmin : integer;
min: real;
begin
min := V[i1];
jmin := i1;
for j:=i1+1 to i2 do
if V[j] < min then begin
min := V[j];
jmin := j;
end;
GetMinInPart := jmin;
end;
(*--------Процедура сортирует строки матрицы по возрастанию сумм их элементов при помощи вспомогательного вектора----------------------------------------*)
procedure SortMatrixStr (var matr: Matrix; n, m: integer);
var
vec: Vector; {вспомогательный вектор}
i, j, k: integer;
begin
{формируем вспомогательный вектор из сумм элементов строк}
for i:=1 to n do begin
vec[i]:=0;
for j:=1 to m do
vec[i]:=vec[i]+matr[i,j];
end;
{вывод вектора после отладки можно удалить}
writeln('Вспомогательный вектор:');
PrintVector(n,vec);
{сортируем вектор; при перестановке элементов вектора
переставляем строки матрицы}
for i:=1 to n-1 do begin
k := GetMinInPart (vec,i,n);
if k <> i then begin
Change(k,i,vec);
ChangeStrings(k,i,n,matr);
end;
end;
{вывод вектора после отладки можно удалить}
writeln('Отсортированный вспомогательный вектор:');
PrintVector(n,vec);
end;
{основная программа}
begin
writeln('Программа сортирует строки матрицы по возрастанию '+ 'сумм их элементов');
EnterMatrixSize(n,m);
{меню режимов}
writeln('Выберите вариант заполнения матрицы:');
writeln('1 - с клавиатуры');
writeln('2 - случайными числами');
repeat
readln(ask);
if (ask<>'1')and(ask<>'2') then
writeln('Выберите режим 1 или 2, пожалуйста');
until (ask='1')or(ask='2');
case (ask) of
'1': EnterMatrix(n, m, matr);
'2': begin
randomize;
write('Введите нижнюю границу диапазона случайных чисел: ');
readln(min);
write('Введите верхнюю границу диапазона случайных чисел: ');
readln(max);
GenerateMatrix(n, m, matr);
end;
end;
writeln('Исходная матрица матрица:');
PrintMatrix (n, m, matr);
SortMatrixStr (matr, n, m);
writeln('Матрица с отсортированными строками:');
PrintMatrix (n, m, matr);
writeln('Нажмите [Enter] для завершения программы');
readln;
end.