Помощь - Поиск - Пользователи - Календарь
Полная версия: Все о матрице
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Edelana
объясните, пожалуйста, принцип перестановки и замены строки на строку, строки на столбец, как менять куски матрицы (подматрицы), как работать с диагоналями.

Я пробовала, но что то не очень получается. Немного с диагоналями вот только разобралась.

Код
program Z_8;
uses crt;
const n=10;
var a:array[1..n,1..n] of integer;
   g,p,i,j:integer;
begin
textbackground(0);
clrscr;
randomize;

for i:=1 to n do
 for j:=1 to n do
 a[i,j]:=random(2);
 for i:=1 to n do begin
 for j:=1 to n do
   begin
   if i=j then textcolor(10) else textcolor(7);
   if j=n+1-i then textcolor(12);
   write( a[i,j]:3);
   end;
   writeln;
end;

textcolor(7);
for i:=1 to n do begin p:=p+a[i,n+1-i]; end;
writeln('  summa pobochnoi diagonali= ',p);
for i:=1 to n-1 do begin g:=g+a[i,i]; end;
writeln('  summa glavnoi   daigonali= ',g);
readkey;
end.


Мне ничего решать не надо. Я хочу сама научиться, просто объясните, как делать(как и от чего зависит) и желательно на примерах, своих, но по теме.
Только не говорите чтоб по форуму искала и факи читала. Я там была. Это так сказать основы или готовые программы в которых не могу разобраться,а мне нужна практика и принцип решения.

Заранее всем огромное спасибо.
Код в теги...
volvo
Цитата(Edelana @ 11.03.05 12:56)
Только не говорите чтоб по форуму искала и факи читала. Я там была. Это так сказать основы или готовые программы в которых не могу разобраться,а мне нужна практика и принцип решения.


Тогда, извините, не совсем понятно, что от нас требуется... Где именно сложности? В чем не можете разобраться? Телепатов у нас тут маловато...

Кстати, Вы уверены, что "основы" Вам не нужны, и спрашиваете, как работать с диагоналями матриц? Что-то не связывается одно с другим. Или опять - очередное "изобретение велосипеда": Я не хочу, как там, я хочу по-своему?

Цитата(Edelana @ 11.03.05 12:56)
Я хочу сама научиться, просто объясните, как делать(как и от чего зависит) и желательно на примерах, своих, но по теме.
Вот это как раз и сделано в FAQ.
Guest
Цитата(volvo @ 11.03.05 14:10)
Тогда, извините, не совсем понятно, что от нас требуется... Где именно сложности? В чем не можете разобраться? Телепатов у нас тут маловато...

Кстати, Вы уверены, что "основы" Вам не нужны, и спрашиваете, как работать с диагоналями матриц? Что-то не связывается одно с другим. Или опять - очередное "изобретение велосипеда": Я не хочу, как там, я хочу по-своему?

Вот это как раз и сделано в FAQ.

я не очень понимаю как менять местами строку со столбцом, строку со стракой, диаогнали, пероворачивать. Тоесть как действовать, что делать.
Что с чем менять.

Если бы я не знала основы, то я бы даже задачку не написала там где находила суммы диагоналей.
hiv
Думаю здесь проблема не в матрицах и их диагоналях, а в том как обменять значениями две переменные A и B.
В общем на пальцах:
Переменная - это сосуд (пусть стеклянный для наглядности)
Ее значение - это сколько литров жидкости налито ( пусть в литрах измеряется) smile.gif
Итак:
У нас два сосуда ( две переменные ) А и Б. Чтобы перелить из одного в другой что нужно сделать?... Правильно! Взять третий сосуд!!! Пусть он называется С.
Тогда план действий:
1. Переливаем жидкость из сосуда А в сосуд С.
2. Переливаем жидкость из соуда Б в сосуд А.
3. Переливаем жидкость из сосуда С в сосуд Б.
ВСЕ - задача выполнена!

ЗЫ: Пива чето захотелось smile.gif
Altair
Edelana, ничего сложного нет, давайте вместе с вами посмотрим как это делается!
Цитата
менять местами строку со столбцом, строку со строкой, диаогнали, пероворачивать

Как было замеченно выше один из способов - использовать дополнительный массив - БУФЕР.

Хотя можно было обойтись и без дополнительного.

Итак, посмотрим как поменять местами две строки...
Код

{...}
var
a:array[1..N,1..N] of TTYPE;
buf :=array[1..N] of TTYPE;
{....}
i,j,ii:integer;
Begin
I:=2; {вторую строку меняем ...}
ii:=5 {на пятую}
For j:=1 to N do Buf[j]:=a[i,j]; {копируем строку в буфер}
For j:=1 to N do a[i,j]:=a[ii,j]; {переписывапем строку ii в i}
For j:=1 to N do a[ii,j]:=buf[j]; {переписываем из буфера в ii}

end.


Думаю принцип ясен.
Edelana
Цитата(Oleg_Z @ 11.03.05 17:50)
Edelana, ничего сложного нет, давайте вместе с вами посмотрим как это делается!
....

спасибо за участие, ....

Код
program Z_8;
uses crt;
const n=10;
type mas=array[1..n,1..n] of integer;
var s,a:mas;
     g,p,i,j:integer;
.....
 for i:=1 to n do
 for j:=1 to n do
   begin
   if i=j then begin
   s[i,j]:=a[i,j];
   a[i,j]:=a[i,n-i+1];
   a[i,n-i+1]:=s[i,j];
   end;
end;
.....

А как сделать то же самое только с типизированным файлом?
Что посоветуете?
hiv
Так можно, но зачем использовать целый массив s, если мы переливаем значения массива поэлементно? Ведь значение переменной s нужно сохранять только при неизменных i и j, а если они изменяются, то старое значение s просто не нужно.
Это можно сделать так:
Код
program Z_8;
uses crt;
const n=10;
type mas=array[1..n,1..n] of integer;
var a:mas;
    s,g,p,i,j:integer;
.....
for i:=1 to n do
for j:=1 to n do
  begin
  if i=j then begin
  s:=a[i,j];
  a[i,j]:=a[i,n-i+1];
  a[i,n-i+1]:=s;
  end;
end;
.....


Чтобы было понятно - выполните программу пошагово...
volvo
Edelana
hiv
Можно маленький вопрос? зачем здесь вообще 2 вложенных цикла? Все равно что-то выполняется только если i = j ... Тогда вот так:

Код
for i:=1 to n do
 begin
   s:=a[i,i];
   a[i,i]:=a[i,n-i+1];
   a[i,n-i+1]:=s;
 end;
hiv
:yes: Прошу прощения у всех! :yes: Лоханулся я однако... Старый стал...
Edelana
Цитата(hiv @ 11.03.05 18:33)
:yes:  Прошу прощения у всех!  :yes: Лоханулся я однако... Старый стал...

j:=2;
jj:=5;
for i:=1 to n do buf[i]:=a[i,j];
for i:=1 to n do a[i,j]:=a[i,jj];
for i:=1 to n do a[j,jj]:=buf[i];

меняю столбцы, с 5-ым что тo не то
в чем ошибка и почему?

volvo
только там не просто s, а s[i,j] т.к.
type mas=array[1..n,1..n] of integer;
var s:mas; smile.gif

а если nXm и m кратно n, то есть есть массив
1 2 3 4 5 6 7 8
2 2 2 2 6 6 6 6
3 3 3 3 7 7 7 7
4 4 4 4 8 8 8 8

нуно поменять следущие диагонали:
1 2 3 4 с 4 2 3 4
5 6 7 8 с 8 6 7 8

как тут лучше и проще поступить?
volvo
Цитата(Edelana @ 11.03.05 18:16)
только там не просто s, а s[i,j] т.к.
type mas=array[1..n,1..n] of integer;
var s:mas; smile.gif

Вот именно это hiv и попытался объяснить smile.gif зачем там массив? Он просто не нужен, Вам же надо просто поменять 2 значения местами... А значит, хватит и одного числа...

Код
j:=2;
jj:=5;
for i:=1 to n do buf[i]:=a[i,j];
for i:=1 to n do a[i,j]:=a[i,jj];
for i:=1 to n do a[i,jj]:=buf[i];
(* внимательнее с индексами !!! раньше было a[J,jj]:=buf[i] *)
Edelana
Цитата(volvo @ 11.03.05 19:27)
Вот именно это hiv и попытался объяснить smile.gif зачем там массив? Он просто не нужен, Вам же надо просто поменять 2 значения местами... А значит, хватит и одного числа...

а как на счет задачи от 07:16 PM ?

то есть как тут переходить на следущие диагонали
а менять диагонали одинаковым методом
volvo
Цитата(Edelana @ 11.03.05 18:31)
а как на счет задачи от 07:16 PM ? то есть как тут переходить на следущие диагонали а менять диагонали одинаковым методом

Я бы делал вот так:
Код
const
 size_y = 4;
 size_x = 8;
var a: array[1..size_y, 1..size_x] of integer;
 i, j, s, _add_: integer;
begin ...
 for j := 1 to (size_x div size_y) do
   for i := 1 to size_y do
     begin
       _add_ := (j - 1) * size_y;

       s := a[i, _add_ + i];
       a[i, _add_ + i] := a[i, _add_ + (size_y - i + 1)];
       a[i, _add_ + (size_y - i + 1)] := s;
     end;
end.
volvo
Ну конечно в процедуре вывода... Дело не в том, что "проще", по другому просто невозможно. Я надеюсь, Вы не собираетесь хранить вместе с матрицей еще и такую же по размеру матрицу с цветами элементов? :no:
Так что - в процедуре вывода...
Edelana
а как работать с матрицами в файлах?
как выше или там другие методы?
volvo
А с матрицами в файлах работать не нужно. Нужно матрицу из файла прочитать, обработать (теми методами, что были рассмотрены выше), и вернуть назад в файл (если это необходимо)...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.