Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

КР№2 обр данных

.doc
Скачиваний:
23
Добавлен:
22.06.2014
Размер:
44.03 Кб
Скачать

Контрольная работа

Вариант 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.