IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Двумерный массив и процедуры. Преобразования двумерного массива.
DarkGhost
сообщение 9.05.2011 20:11
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Мужской
Реальное имя: Максим

Репутация: -  0  +


Дан двумерный массив размером MxN. Преобразовать его по правилу – все элементы каждого столбца матрицы умножить на элемент этого столбца. Из первых четырех строк массива сформировать четыре новых вектора (одномерные массивы). Упорядочить каждый вектор по убыванию.
Исходные данные:
- число строк и столбцов M и N;
- двумерный массив действительных чисел размерностью MхN.
Выходные данные:
- минимальный элемент каждого столбца;
- матрица, полученная делением каждого столбца на минимальный элемент в этом столбце;
- четыре упорядоченных вектора по убыванию, полученные из первых строк матрицы;

Всё это нужно сделать в простейшей графической оболочке с использованием процедур.
Вот то, что я попробовал/смог сделать сам.

Program DivMax;
Uses Graph, Crt;
const
Nmax = 10; {максимальная размерность матрицы}
type
Matrix = array [1..Nmax, 1..Nmax] of real;
Vector = array [1..Nmax] of real;
Vecint = array [1..Nmax] of integer;
var
G: Matrix;
q: vecint;
a, b, c, d, x: Vector;
MaxX, MaxY, Driver, Regim,
font, i, j, M, N: integer;
ch: char;
s: string;
sv: boolean;
f: text;
Procedure POLE; {Вывод фона программы}
begin
SetFillStyle(1, 15);
Bar(0, 0, MaxX, MaxY);
SetFillStyle(1, 1);
Bar(0, 0, MaxX, 25);
Bar(0, MaxY - 25, MaxX, MaxY);
SetLineStyle(0, 0, 1);
SetTextStyle(font, 0, 5);
SetTextJustify(0, 0);
SetColor(15);
OutTextXY(300, 20, 'Вариант 1');
SetTextStyle(1, 0, 1);
SetColor(12);
OutTextXY(10, MaxY - 7, 'F1');
OutTextXY(130, MaxY - 7, 'F2');
OutTextXY(240, MaxY - 7, 'F3');
OutTextXY(390, MaxY - 7, 'F4');
OutTextXY(550, MaxY - 7, 'Esc');
SetColor(15);
SetTextStyle(font, 0, 5);
OutTextXY(40, MaxY - 8, 'Клавиатура');
OutTextXY(160, MaxY - 8, 'Сохранить');
OutTextXY(270, MaxY - 8, 'Загрузить');
OutTextXY(420, MaxY - 8, 'Преобразовать');
OutTextXY(590, MaxY - 8, 'Выход');
end;
Procedure INPUT; {ввод матрицы}
var
i, j: integer;
begin
Write('Введите размерность матрицы (M*N, M>3): ');
ReadLn(M, N);
WriteLn('Ввод матрицы');
for i := 1 to M do
for j := 1 to N do
begin
Write('G(', i, ',', j, ')=');
ReadLn(G[i, j]);
end;
end;
Function DivAMin(var A: Matrix; M, N: integer): real;
{Вычисление минимального элемента каждого столбца и умножение на
этот элемент текущий столбец}
var
min: real;
i, j: integer;
begin
DivAMin := 0;
for j:=1 to N do
begin
A[1,j]:=min;
for i:=1 to M do
if A[i,j]<min
then min:=A[i,j];
if min=0
then Exit;
x[j]:=min;
for i:=1 to M do
A[i,j]:=A[i,j]*min;
end;
end;
Procedure swap(var x,y: integer);
{Процедура обмена}
var
t:integer;
begin
t:=x;
x:=y;
y:=t;
end;
procedure Ypor;
{Упорядочивание строк элементов методом вставки}
begin
for j:=1 to N-1 do
for i:=1 to M-1 do
if Q[i] < Q[i+1]
then swap (Q[i],Q[i+1]);
end;
begin
font := InstallUserFont('smal');
Driver := VGA; Regim := VGAHi;
InitGraph(Driver, Regim, '');
MaxX := GetMaxX; MaxY := GetMaxY;
POLE;
sv := False;
DirectVideo := False;
repeat
ch := ReadKey;
case ch of
#59: begin {клавиатура}
RestoreCRTMode;
INPUT;
sv := True;
SetGraphMode(VGAHi);
POLE;
SetColor(0);
end;
#60: begin {сохранить}
if not sv then Continue;
SetFillStyle(1, 15);
Bar(0, 26, MaxX, MaxY - 26);
Window(2, 4, 78, 24);
Write('Имя файла: ');
Readln(s);
Assign(f, s); Rewrite(f);
WriteLn(f, M, ' ', N);
for i := 1 to M do
begin
for j := 1 to N - 1 do
Write(f, G[i, j]2.gif1,' ');
WriteLn(f, G[i, N]2.gif1);
end;
Close(f);
SetFillStyle(1, 15);
Bar(0, 26, MaxX, MaxY - 26);
end;
#61: begin {загрузить}
SetFillStyle(1, 15);
Bar(0, 26, MaxX, MaxY - 26);
Window(2, 4, 78, 24);
Write('Имя файла: ');
Readln(s);
{$I-} Assign(f, s); Reset(f); {$I+}
if IOResult <> 0 then Continue;
ReadLn(f, M, N);
for i := 1 to M do
begin
for j := 1 to N do
Read(f, G[i, j]);
ReadLn(f);
end;
Close(f);
sv := True;
SetFillStyle(1, 15);
Bar(0, 26, MaxX, MaxY - 26);
end;
#62: begin {Преобразовать}
if not sv then Continue;
SetColor(0);
SetFillStyle(1, 15);
Bar(0, 26, MaxX, MaxY - 26);
Assign(f, 'v12'); Rewrite(f);
WriteLn(f, 'Исходная матрица');
for i := 1 to M do
begin
for j := 1 to N do
Write(f, G[i, j]:8:1);
WriteLn(f);
end;
writeln(f, 'Минимумы');
Write(f,DivAMin(G, M, N)2.gif1,' ');
writeln(f);
WriteLn(f, 'Преобразованная матрица');
for i := 1 to M do
begin
for j := 1 to N do
Write(f, G[i, j]:8:2);
WriteLn(f);
end;
for i := 1 to N do
begin
a[i] := G[1, i]; b[i] := G[2, i];
c[i] := G[3, i]; d[i] := G[4, i];
end;
WriteLn(f, 'Вектор из 1-й строки');
for j := 1 to N do
Write(f, a[j]:8:2);
WriteLn(f);
WriteLn(f, 'Вектор из 2-й строки');
for j := 1 to N do
Write(f, b[j]:8:2);
WriteLn(f);
WriteLn(f, 'Вектор из 3-й строки');
for j := 1 to N do
Write(f, c[j]:8:2);
WriteLn(f);
WriteLn(f, 'Вектор из 4-й строки');
for j := 1 to N do
Write(f, d[j]:8:2);
WriteLn(f);
Close(f);
Reset(f);
j := 40;
while not EOF(f) do
begin
ReadLn(f, s);
OutTextXY(10, j, s);
j := j + 11;
end;
Close(f);
end;
end;
until ch = #27;
CloseGraph;
end.


Сообщение отредактировано: DarkGhost - 9.05.2011 20:12
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 10.05.2011 2:03
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(DarkGhost @ 9.05.2011 21:11) *
Вот то, что я попробовал/смог сделать сам.

Хорошо.
А в чем, собственно, состоит вопрос?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DarkGhost
сообщение 10.05.2011 13:15
Сообщение #3





Группа: Пользователи
Сообщений: 9
Пол: Мужской
Реальное имя: Максим

Репутация: -  0  +


Вопросов несколько)))
1) как правильно вставить процедуру DivAMin...
Чтобы она исполнялась, а после сначала выводились минимальные значения строк, а после формирующиеся векторы...
Write(f,DivAMin(G, M, N) - это видимо не верно.
возможно
DivAMin;
for i:=1 to N do
write(f,x,' ');
end;


но почему то не получается, как не пытался.
2) пытаюсь описать кнопку F5 выход из программы, но выдает тоже ошибку...
#63: begin {Выход}
closegraph;
end;


пока вроде бы всё...Эти ошибки уже мешают нормально протестировать программу)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 10.05.2011 13:52
Сообщение #4


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


1. Ну может добавить вывод в саму DivAMin? Правда, это антиструктурно. Ну добавь тогда в неё var-параметр строкового типа, чтобы она выводила информацию в него. А потом

DivAMin(G,M,N,S);
Write(f,S);

2. Ошибку при компиляции или при выполнении?
Кстати, ты учёл, что F5 - это сканкод?
То есть надо выбор по readKey делать так:


case ReadKey of
{всё, что относится к нескан-кодам}
#0: case ReadKey of {пришёл ноль, значит это скан-код}
{всё про скан-коды}
end;
end;



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DarkGhost
сообщение 10.05.2011 15:20
Сообщение #5





Группа: Пользователи
Сообщений: 9
Пол: Мужской
Реальное имя: Максим

Репутация: -  0  +


при компиляции.
Спасибо, с этим разобрался.
А вот с процедурой DivAMin безуспешно.
т.е. как переделать?
Function DivAMin(var A: Matrix; M, N: integer;st:string): real;
{Вычисление минимального элемента каждого столбца и умножение на
этот элемент текущий столбец}
var
min: real;
i, j: integer;
begin
DivAMin := 0;
for j:=1 to N do
begin
A[1,j]:=min;
for i:=1 to M do
if A[i,j]<min
then min:=A[i,j];
if min=0
then Exit;
write(f,st,' ');
for i:=1 to M do
A[i,j]:=A[i,j]*min;
end;
end;

и потом
DivAMin(G,M,N,S);


так?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 10.05.2011 15:42
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Почти:

Function DivAMin(var A: Matrix; M, N: integer;var st:string): real;


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DarkGhost
сообщение 10.05.2011 16:17
Сообщение #7





Группа: Пользователи
Сообщений: 9
Пол: Мужской
Реальное имя: Максим

Репутация: -  0  +


спасибо, заработало, но выводит некорректные значения, видимо в самом алгоритме уже ошибся...
Ещё появился вопрос
при запуске программы отображение надписей F1,F2,F3, ESC нормальное, после выполнения любой процедуры становится некорректным (уменьшается до нечитаемого).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 10.05.2011 17:16
Сообщение #8


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


В самом конце
Код

while not EOF(f) do
               begin
                 ReadLn(f, s);
                 OutTextXY(10, j, s);
                 j := j + 11;
               end;

У тебя каким шрифтом делается это самое OutTextXY?
Ведь перед тем, как попасть сюда, программа могла побывать в ветке, что сворачивает граф.режим, снова его возвращает и шрифт при этом становится тем, который по умолчанию.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DarkGhost
сообщение 10.05.2011 17:45
Сообщение #9





Группа: Пользователи
Сообщений: 9
Пол: Мужской
Реальное имя: Максим

Репутация: -  0  +


Так этот текст правильно выводится, вроде бы.
Спасибо, проблему решил.
Проблема была в этом,
SetTextStyle(1, 0, 1);
...
Осталось решить проблему с расчетом/выводом значений и похоже всё сделано...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 17.07.2025 18:02
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"