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

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

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

 
 Ответить  Открыть новую тему 
> Преобразование матрицы, Сложная задача
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский

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


Я еще плохо разбираюсь в массивах и у меня не получается решить эту задачу, помогите пожалуйста.

Назовем допустимым преобразованием матрицы смещение строк матрицы на одну снизу вверх и столбцов на один справа налево, при этом первая строка опускается вниз, а первый столбец становится последним. Дана действительная квадратная матрица порядка n. С помощью допустимых преобразований добиться того, чтобы элемент матрицы, обладающий наименьшим значением, располагался в левом верхнем углу матрицы.

Заранее благодарна

Сообщение отредактировано: irena -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






irena

Уточнение: допустимая операция делает эти 2 действия сразу или можно по отдельности?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский

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


volvo по отдельности
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






const
 n = 5;
 maxValue = 150000.0;

 { С этой матрицей я тестировал программу
 matrix: array[1 .. n, 1 .. n] Of real =
   ((3, 5, 8, 2, 9),
    (2, 7, 9, 1, 4),
    (5, 3, 8, 6, 8),
    (7, 4, 6, 9, 2),
    (5, 2, 7, 8, 4));
 }

var
 matrix: array[1 .. n, 1 .. n] Of real;
 min: real;
 iRow, iColumn: Integer;
 count_col, count_row: Integer;

{ Процедура сдвигает матрицу вниз }
procedure moveRow;
 var
   i, j: integer;
   T: real;
 begin
   for i := 1 to n do
     begin
       T := matrix[1, i];
       for j := 2 to n do
         matrix[j - 1, i] := matrix[j, i];
       matrix[n, i] := T;
     end;
 end;

{ Процедура сдвигает матрицу влево }
procedure moveColumn;
 var
   i, j: integer;
   T: real;
 begin
   for i := 1 to n do
     begin
       T := matrix[i, 1];
       for j := 2 to n do
         matrix[i, j - 1] := matrix[i, j];
       matrix[i, n] := T;
     end;
 end;

begin
 writeln( 'Введите матрицу (построчно):' );
 for iRow := 1 to n do
   begin
   WriteLn( 'Строка #', iRow );
   for iColumn := 1 To n do
     begin
       write( 'matrix[', iRow, ',', iColumn, '] =' );
       readln(matrix[iRow, iColumn])
     End;
   writeln;
   end;

 { Находим минимальное значение в матрице ... }
 min := maxValue;
 for iRow := 1 to n do
   for iColumn := 1 To n do
     if min > matrix[iRow, iColumn] then
       begin
         min := matrix[iRow, iColumn];
         { ... и запоминаем его позицию }
         count_row := iRow;
         count_col := iColumn
       end;

 { распечатываем исходную матрицу }
 for iRow := 1 to n do
   begin
   for iColumn := 1 To n do
     write( matrix[iRow, iColumn]:5:2 );
   writeln;
   end;

 WriteLn;

 { сдвигаем нужное число раз }
 {(вниз)}
 for iRow := 1 to Pred(count_row) Do moveRow;
 {(влево)}
 for iColumn := 1 to Pred(count_col) Do moveColumn;

 { распечатываем полученную матрицу }
 for iRow := 1 to n do
   begin
   for iColumn := 1 To n do
     write( matrix[iRow, iColumn]:5:2 );
   writeln;
   end;
end.


Все работает...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский

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


Здорово!
Только не понятно что такое Pred(count_row)
Если тебя не затруднит, посмотри еще одну задачу:

Дана последовательность из 100 различных целых чисел. Найти сумму чисел этой последовательности, расположенных между максимальным и минимальным числами, в сумму включить и оба этих числа. Поиск максимального и минимального чисел организовать в подпрограмме.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
Pred(count_row)

это получить предыдущее значение ( = count_row - 1)

Задача нужна срочно ?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Я сделал для 10-ти элементов ... измени n на 100 и добавь недостающие значения в массив...

Код

const
 n = 10;

 arr: array[ 1 .. n ] of integer =
   (2, 5, 8, 3, 9, 42, 5, 6, 14, 28);

{ нам не нужно само мин. или макс. значение -
 ищем только его индекс }
function minIndex: integer;
 var
   i: integer;
   min: integer;
 begin
   min := maxInt;
   for i := 1 to n do
     if min > arr[i] then
       begin
         min := arr[i]; minIndex := i
       end;
 end;

function maxIndex: integer;
 var
   i: integer;
   max: integer;
 begin
   max := - maxInt;
   for i := 1 to n do
     if max < arr[i] then
       begin
         max := arr[i]; maxIndex := i
       end;
 end;

var
 start_count, stop_count: integer;
 T, i, s: integer;
begin
 start_count := minIndex;
 stop_count := maxIndex;

 { если макс. число стояло перед мин. числом - меняем индексы местами }
 if start_count > stop_count then
   begin
     T := start_count;
     start_count := stop_count;
     stop_count := T;
   end;

 s := 0;
 for i := start_count to stop_count do
   s := s + arr[i];

 writeln( 's = ', s );
end.


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





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

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


А чё нужно поменять чтоб максимальный элемент был в верхнем левом углу а не минимальный?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Вот тут:
 { Находим минимальное значение в матрице ... }
min := maxValue;
for iRow := 1 to n do
for iColumn := 1 To n do
if min > matrix[iRow, iColumn] then
begin
min := matrix[iRow, iColumn];
{ ... и запоминаем его позицию }
count_row := iRow;
count_col := iColumn
end;
Нужно находить не минимальное значение, а максимальное. И запоминать, соответственно, его позицию...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





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

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


Цитата(volvo @ 8.05.2006 13:55)
Нужно находить не минимальное значение, а максимальное. И запоминать, соответственно, его позицию...

я плохо в этом разбираюсь не мог бы ты сам написать как должно быть.Зарание благодарен.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Да что ты говоришь? До какой же степени нужно "плохо разбираться", чтобы не уметь добавить один минус и сменить знак с ">" на "<" ???

Название переменной MIN можно не менять - на правильность выполнения программы оно не влияет... Хотя можешь и поменять его на MAX...

 min := - maxValue; { <--- Здесь добавить минус }
for iRow := 1 to n do
for iColumn := 1 To n do
if min < matrix[iRow, iColumn] then { <--- А здесь изменить знак }
begin
min := matrix[iRow, iColumn];
{ ... и запоминаем его позицию }
count_row := iRow;
count_col := iColumn
end;
Сильно изменилось, правда? dry.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





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

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


вот ещё один последний вопрос по этой программе.
Если матрица не квадратная а на пример 5 на 9,или 11 на 6.Нужно ввести ещё одну константу m.Тогда матрица будет выгледить так: matrix: array[1 .. n, 1 .. m] Of real;
И вот сам вопрос : что нужно поменять и добавить в коде программы в связи с заменой n на m?
Если не затруднит пожалуйста объесните.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13





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

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


Пожалуйста посмотрите что у меня в коде программы неправельно:

const
n = 3;
m = 2;
maxValue = 150000.0;

var
matrix: array[1 .. n, 1 .. m] Of real;
min: real;
iRow, iColumn: Integer;
count_col, count_row: Integer;

{Процедура сдвигает матрицу вниз}
procedure moveRow;
var
i, j: integer;
T: real;
begin
for i := 1 to n do
begin
T := matrix[1, i];
for j := 2 to n do
matrix[j - 1, i] := matrix[j, i];
matrix[n, i] := T;
end;
end;

{Процедура сдвигает матрицу влево}
procedure moveColumn;
var
i, j: integer;
T: real;
begin
for i := 1 to m do
begin
T := matrix[i, 1];
for j := 2 to m do
matrix[i, j - 1] := matrix[i, j];
matrix[i, m] := T;
end;
end;

begin
writeln( 'Введите матрицу (построчно):' );
for iRow := 1 to n do
begin
WriteLn( 'Строка #', iRow );
for iColumn := 1 To m do
begin
write( 'matrix[', iRow, ',', iColumn, '] =' );
readln(matrix[iRow, iColumn])
End;
writeln;
end;

{Находим максимальное значение в матрице ... }
min := -maxValue;
for iRow := 1 to n do
for iColumn := 1 To m do
if min < matrix[iRow, iColumn] then
begin
min := matrix[iRow, iColumn];
{ ... и запоминаем его позицию }
count_row := iRow;
count_col := iColumn
end;

{ распечатываем исходную матрицу }
for iRow := 1 to n do
begin
for iColumn := 1 To m do
write( matrix[iRow, iColumn]:5:2 );
writeln;
end;

WriteLn;

{ сдвигаем нужное число раз }
{(тэшч)}
for iRow := 1 to Pred(count_row) Do moveRow;
{(тыхтю)}
for iColumn := 1 to Pred(count_col) Do moveColumn;

{распечатываем полученую матрицу }
for iRow := 1 to n do
begin
for iColumn := 1 To m do
write( matrix[iRow, iColumn]:5:2 );
writeln;
end;
end.


Мне нужно ч тоб максимальный элемент находился в верхнем левом углу.А у меня это не выходит.

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Профи
****

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

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


Цитата(loko @ 9.05.2006 10:47) *

Пожалуйста посмотрите что у меня в коде программы неправельно:
Мне нужно ч тоб максимальный элемент находился в верхнем левом углу.А у меня это не выходит.


На вскидку: у тебя не правильно работают процедуры moveRow и moveColumn. В первой циклы n на n, во второй m на m, это будет работать только на квадратных матрицах. Поменяй в moveRow первый цикл до m, в moveColumn 1-ый до n.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 17.04.2024 0:21
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name