Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.19;
Скачать: CL | DM;

Вниз

Turbo Pascal - Композиция Двух Двумерных Массивов 100x100   Найти похожие ветки 

 
Юлька ©   (2011-11-09 10:33) [0]

Доброго времени суток всем!
Дано: две квадратные матрицы (два двумерных массива) R и S. Требуется: сравнить первую строку массива R с первым столбцом массива S и выбрать из них минимумы. Затем сравнить первую строку массива R со вторым столбцом массива S и выбрать из них минимумы и т.д. сравнивать первую строку массива R со всеми столбцами массива S и выбирать минимумы. А потом сравнивать уже вторую строку массива R со всеми столбцами массива S и выбирать минимумы. Т.е. каждая строка массива R поочерёдно сравнивается со всеми столбцами массива S, выбираются минимумы. Потом из полученных минимумов выбрирается максимум - и он будет первым элементом нового массива RoS, который является композицией.
Пример:
массив R
1 0,8 0,7 0,5
0,8 1 0,9 0,6
0,7 0,9 1 0,8
0,5 0,6 0,8 1
массив S
1 0,9 0,7 0,3
0,9 1 0,3 0,2
0,7 0,3 1 0,4
0,5 0,2 0,1 0
1я строка с 1ым столбцом:
(1;1) (0,8;0,9) (0,7;0,7) (0,3;0,5)=1;0,8;0,7;0,3 - минимумы; 1 - максимум из минимумов
1я строка со 2ым столбцом:
(1;0,9) (0,8;1) (0,7;0,3) (0,5;0,2)=0,9;0,8;0,3;0,2 - минимумы; 0,9 - максимум из минимумов
1я строка с 3им столбцом:
(1;0,7) (0,8;0,3) (0,7;1) (0,5;0,1)=0,7;0,3;0,7;0,1 - минимумы; 0,7 - максимум из минимумов
1я строка с 4ым столбцом:
(1;0,3) (0,8;0,2) (0,7;0,4) (0,5;0)= 0,3;0,2;0,4;0 минимумы; 0,4 - максимум из минимумов
Т.о., 1ая строка искомого массива (композиции) будет выглядеть так:
RoS=1 0,9 0,7 0,4
Далее мы сравниваем 2ую строку массива R поочерёдно со всеми столбцами массива S и получаем 2ую строку искомого массива RoS и т.д....
Ну и самое интересное)))
Текст моей программы:
program laba_6;
uses crt;
const n=4;
const m=4;
var
S,R,RoS: array[1..n,1..m] of real;
K1,K2,K3,K4: array[1..n,1..m] of real; {vspomogatel`nye massivy dlya ras4etov}
i,j: integer;
begin
clrscr;

for i:=1 to n do begin
for j:=1 to m do begin
writeln("Vvedite massiv R=> ");
readln(R[i,j]);
end;
end;

for i:=1 to n do begin
for j:=1 to m do begin
writeln("Vvedite massiv S=> ");
readln(S[i,j]);
end;
end;

writeln("Isxodnyi massiv R=> ");
for i:=1 to n do begin
for j:=1 to m do begin
write(" ",R[i,j]:4:1);
end;
writeln;
end;

writeln("Isxodnyi massiv S=> ");
for i:=1 to n do begin
for j:=1 to m do begin
write(" ",S[i,j]:4:1);
end;
writeln;
end;

writeln("1-ya stroka massiva R sravnivaetsya so vsemi stolbcami massiva S");
for i:=1 to n do begin
for j:=1 to m do begin
if R[1,j]<=S[j,i] then
K1[i,j]:=R[1,j]
else
K1[i,j]:=S[j,i];
write(" ",K1[i,j]:4:1);
end;
writeln;
end;

writeln("2-ya stroka massiva R sravnivaetsya so vsemi stolbcami massiva S");
for i:=1 to n do begin
for j:=1 to m do begin
if R[2,j]<=S[j,i] then
K2[i,j]:=R[2,j]
else
K2[i,j]:=S[j,i];
write(" ",K2[i,j]:4:1);
end;
writeln;
end;

writeln("3-ya stroka massiva R sravnivaetsya so vsemi stolbcami massiva S");
for i:=1 to n do begin
for j:=1 to m do begin
if R[3,j]<=S[j,i] then
K3[i,j]:=R[3,j]
else
K3[i,j]:=S[j,i];
write(" ",K3[i,j]:4:1);
end;
writeln;
end;

writeln("4-ya stroka massiva R sravnivaetsya so vsemi stolbcami massiva S");
for i:=1 to n do begin
for j:=1 to m do begin
if R[4,j]<=S[j,i] then
K4[i,j]:=R[4,j]
else
K4[i,j]:=S[j,i];
write(" ",K4[i,j]:4:1);
end;
writeln;
end;

writeln("RoS=>");

for i:=1 to n do begin
for j:=1 to m do begin
if K1[1,j]>=K1[1,1] then
RoS[1,1]:=K1[1,j];

if K1[2,j]>=K1[2,1] then
RoS[1,2]:=K1[2,j];

if K1[3,j]>=K1[3,1] then
RoS[1,3]:=K1[3,j];

if K1[4,j]>=K1[4,1] then
RoS[1,4]:=K1[4,j];

if K2[1,j]>K2[1,1] then
RoS[2,1]:=K2[1,j];

if K2[2,j]>K2[2,1] then
RoS[2,2]:=K2[2,j];

if K2[3,j]>K2[3,1] then
RoS[2,3]:=K2[3,j];

if K2[4,j]>K2[4,1] then
RoS[2,4]:=K2[4,j];

if K3[1,j]>K3[1,1] then
RoS[3,1]:=K3[1,j];

if K3[2,j]>K3[2,1] then
RoS[3,2]:=K3[2,j];

if K3[3,j]>K3[3,1] then
RoS[3,3]:=K3[3,j];

if K3[4,j]>K3[4,1] then
RoS[3,4]:=K3[4,j];

if K4[1,j]>K4[1,1] then
RoS[4,1]:=K4[1,j];

if K4[2,j]>K4[2,1] then
RoS[4,2]:=K4[2,j];

if K4[3,j]>K4[3,1] then
RoS[4,3]:=K4[3,j];

if K4[4,j]>K4[4,1] then
RoS[4,4]:=K4[4,j];
write(" ", RoS[i,j]:4:1);
end;
writeln;
end;
readln;
end.

Т.е. хорошо конечно что я сравниваю 1ю строку, 2ю строку и т.д., прописывая номер строки прямо в коде. Но у меня массивы 4х4. А если они будут 100х100? Не прописывать же R[1,j]..R[100,j]! Короче, код у меня левый и "не универсальный" как скажет препод. Подскажите, пожалуйста, как сделать этот код подходящим для массивов любых размерностей от 2х2 до бесконечность х бесконечность? Заранее спасибо всем откликнувшимся! =)


 
Омлет ©   (2011-11-09 11:15) [1]

Ты же уже используешь циклы - используй их до конца.


 
Юлька ©   (2011-11-09 11:22) [2]

если я напишу
for i:=1 to n do begin
for j:=1 to m do begin
if R[i,j]<=S[j,i] then
K1[i,j]:=R[i,j]
else
K[i,j]:=S[j,i];
write(" ",K[i,j]:4:1);
end;
writeln;
end
;
Т.е. не буду указывать в коде номер строки, с которой сравниваются столбцы, то программа сравнивает 1ую строку с 1ым столбцом, 2ую строку со 2ым столбцом, 3ю строку с 3им столбцом и т.д. =(


 
Dennis I. Komarov ©   (2011-11-09 11:22) [3]

Красотищееее :)


 
Юлька ©   (2011-11-09 11:26) [4]

Да уж, да уж, но кроме "красоты" нужна универсальность=(
А может перед
for i:=1 to n do begin
for j:=1 to m do begin
if R[i,j]<=S[j,i] then
K1[i,j]:=R[i,j]
else
K[i,j]:=S[j,i];
write(" ",K[i,j]:4:1);
end;
writeln;
end;

поставить ещё один FOR? Напр., FOR k:=1 to i?


 
Dennis I. Komarov ©   (2011-11-09 11:38) [5]


> А может перед

Ромашки отцвели...


 
KilkennyCat ©   (2011-11-09 11:53) [6]


> Юлька ©   (09.11.11 11:26) [4]
>
> Да уж, да уж, но кроме "красоты" нужна универсальность=(

а чем этот не универсален? и потом, это справедливо лишь для квадратов, поэтому можно упростить
for i:=1 to N do
for j:=1 to N do begin


 
KilkennyCat ©   (2011-11-09 11:55) [7]

кстати, а в тупбопаскале индексация с 1? че-то я не помню уже


 
Ega23 ©   (2011-11-09 12:04) [8]


> кстати, а в тупбопаскале индексация с 1? че-то я не помню
> уже


Там динамических массивов в "нашем" понимании нет. Поэтому - как объявишь.
У ТС объявлено S,R,RoS: array[1..n,1..m] of real;
Значит с единицы.

А для дин.массива там хитрО надо было делать.
Навскидку могу ошибаться, но что-то типа:

var
 arr[0..0] of Integer;

Не, не помню. А вспоминать сейчас времени нет. Может быть вечером, если желание будет...


 
Омлет ©   (2011-11-09 12:06) [9]

Если я правильно понял задачу, заполнение RoS сводится к этому:

for i := 1 to n do
begin
 // Заполняем строку i массива RoS
 for j := 1 to n do
 begin
   RoS[i,j] := 2.9e-38; // Инициализируем ячейку
   for k := 1 to n do
   begin
     if S[i, j] < R[j, k] then
       x := S[i, j]
     else
       x := R[j, k];

     if x > RoS[i, j] then
       RoS[i, j] := x; // максимум среди минимумов
   end;
 end;
end;


 
Омлет ©   (2011-11-09 12:08) [10]

> Омлет ©   (09.11.11 12:06) [9]

Здесь только n, т.к. по условию матрицы все квадратные (m=n), т.е. m можно выкинуть.

var
 S, R, RoS: array[1..n, 1..n] of real;


 
Dennis I. Komarov ©   (2011-11-09 12:22) [11]

Э, "Студенты", дайте Юльке мозг немного напрячь...


 
Омлет ©   (2011-11-09 12:37) [12]

> Dennis I. Komarov ©   (09.11.11 12:22) [11]

Ага. Твои комменты, прямо, образец преподавания:

> Dennis I. Komarov ©   (09.11.11 11:22) [3]
> Красотищееее :)

> Dennis I. Komarov ©   (09.11.11 11:38) [5]
> Ромашки отцвели...


 
KilkennyCat ©   (2011-11-09 12:40) [13]


> Омлет ©   (09.11.11 12:37) [12]

может, он просто смотрит в окно, наблюдая приход осени :)


 
KilkennyCat ©   (2011-11-09 12:42) [14]


> ребуется: сравнить первую строку массива R с первым столбцом
> массива S и выбрать из них минимумы.

я вот этого не понял.
у меня один минимум получается :)


 
Омлет ©   (2011-11-09 13:24) [15]

> Омлет ©   (09.11.11 12:06) [9]

Неверно.. Строки же надо со столбцами сравнивать, поэтому j и k надо местами поменять:

for i := 1 to n do
begin
 for j := 1 to n do
 begin
   RoS[i, j] := 2.9e-39;
   for k := 1 to n do
   begin
     if S[i, j] < R[k, j] then
       x := S[i, j]
     else
       x := R[k, j];
     if x > RoS[i, j] then
       RoS[i, j] := x;
   end;
   Write(" ", RoS[i, j]:4:1);
 end;
 Writeln;
end;


И, подозреваю, код в [0] работает неправильно.

Если R =
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4


и S =
4 3 2 1
4 3 2 1
4 3 2 1
4 3 2 1
,

то RoS должна быть такой:
1 2 2 1
1 2 2 1
1 2 2 1
1 2 2 1


 
Омлет ©   (2011-11-09 13:41) [16]

Упс. Опять ошибка. Вот так надо

for i := 1 to n do
begin
 for j := 1 to n do
 begin
   RoS[i,j] := 2.9e-39;
   for k := 1 to n do
   begin
     if R[i, k] < S[k, j] then
       x := R[i, k]
     else
       x := S[k, j];
     if x > RoS[i, j] then
       RoS[i, j] := x;
   end;
   write(" ",RoS[i,j]:4:4);
 end;
 writeln;
end;


R[i, k] должен сравниваться с S[k, j].

Если R =
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4


и S =
4 3 2 1
4 3 2 1
4 3 2 1
4 3 2 1


то RoS должна быть такой:
4 3 2 1
4 3 2 1
4 3 2 1
4 3 2 1


Проверил на данных из [0] - теперь всё сошлось.


 
Dennis I. Komarov ©   (2011-11-09 13:58) [17]


> Омлет ©   (09.11.11 12:37) [12]

А что не так?
Начнет спрашивать по существу, тогда и будут ответы. А пока не осознанное гадание что бы куда прилепить...
Еще есть подозрение что код чужой, ибо ну слишком просто :)


 
Jeer ©   (2011-11-09 14:06) [18]


> Упс. Опять ошибка. Вот так надо


И кто кого тестирует ? :)


 
Jeer ©   (2011-11-09 14:09) [19]


> Упс. Опять ошибка. Вот так надо


А если область определений массивов - отрицательные числа ? :)


 
Омлет ©   (2011-11-09 14:32) [20]

> А если область определений массивов - отрицательные числа ? :)

Точно, надо же инициализировать минимальным отрицательным!

   RoS[i,j] := -1.7e38;

> И кто кого тестирует ? :)

Пора мне обратно, за парту :(


 
KilkennyCat ©   (2011-11-09 14:44) [21]


> Пора мне обратно, за парту :(

вместе пойдем. ты берешь пиво, я - сигареты.


 
Jeer ©   (2011-11-09 15:26) [22]

Из дидактических соображений я бы предложил такой вариант:

 Transpose(B);
 for k := 1 to N do begin
   C[k, 1] := Min(A[k, 1], B[k, 1]);
   for j := 1 to N do
     for i := 1 to N do
       C[k, j] := Max(C[k, j], Min(A[i, j], B[i, j]));
   end;

P.S.
Реализация Transpose(), Min(), Max() - тривиальна.


 
Юлька ©   (2011-11-09 15:47) [23]

Код не чужой, хотя кого это интересует) Потом у меня же вся группа и спишет. Отрицательных чисел препод не  требовал-значит обойдется без них. Всем неравнодушным  спасибо за отклики, удачи Вам!


 
Jeer ©   (2011-11-09 15:50) [24]


Отрицательных чисел препод не  требовал-
значит обойдется без них.


Так, кто-то хотел универсальности :)


 
Омлет ©   (2011-11-09 15:56) [25]

> Юлька ©   (09.11.11 15:47) [23]

Если возьмешь код из [16], поменяй 2.9e-39 на -1.7e38, чтобы корректно работало с числами <= 0.

> Отрицательных чисел препод не  требовал-значит обойдется без них.

Если не требовал именно неотрицательных, то имеет право проверять на отрицательных.


 
Юлька ©   (2011-11-09 15:57) [26]

Он хотел универсальности по размерам:) То ись чтоб можно было произвести композицию массивов размеров 1000*1000


 
Jeer ©   (2011-11-09 16:05) [27]


> композицию массивов размеров 1000*1000


Хорошо хоть на гугол не замахивался :)

P.S.

> Юлька ©   (09.11.11 15:57) [26]


Ну та как, появится тут от Вас окончательный код ?


 
Юлька ©   (2011-11-09 16:18) [28]

Не надо ругаться, я же пока что только учусь =( Куда ж мне до Вас-то =(
program laba_6;
uses crt;
const nmax=60;
var
S,R,RoS: array[1..nmax,1..nmax] of real;
i,j,ti,tj,n: integer;
min,max: real;

begin
clrscr;
write("Vvedite ra3mer massiva=> ");
readln(n);
for i:=1 to n do begin
for j:=1 to n do begin
writeln("Vvedite massiv R=> ");
readln(R[i,j]);
end;
end;

for i:=1 to n do begin
for j:=1 to n do begin
writeln("Vvedite massiv S=> ");
readln(S[i,j]);
end;
end;

writeln("Isxodnyi massiv R=> ");
for i:=1 to n do begin
for j:=1 to n do begin
write(" ",R[i,j]:4:1);
end;
writeln;
end;

writeln("Isxodnyi massiv S=> ");
for i:=1 to n do begin
for j:=1 to n do begin
write(" ",S[i,j]:4:1);
end;
writeln;
end;

for ti:=1 to n do
for tj:=1 to n do begin
max:=-maxint;{4islo, men`shee vsex 3na4eniy matric R i S}
for i:=1 to n do begin
if R[ti,i]<S[i,tj] then
min:=R[ti,i] else
min:=S[i,tj];
if min>max then max:=min;
end;
Ros[ti,tj]:=max;
end;
writeln("RoS=>");
for i:=1 to n do begin
for j:=1 to n do begin
write(" ", RoS[i,j]:4:1);
end;
writeln;
end;
readln;
end.


 
Юлька ©   (2011-11-09 16:21) [29]

Вроде малость покороче стало=)


 
Юлька ©   (2011-11-09 16:22) [30]

Жду справедливой критики =)


 
RWolf ©   (2011-11-09 16:26) [31]

если использовать read вместо readln, можно будет вводить числа по несколько в одной строке.


 
Юлька ©   (2011-11-09 16:28) [32]

Ничего, пусть enter щёлкает, ему полезно пальчики размять


 
Юлька ©   (2011-11-09 16:28) [33]

а вообще спасибо за замечание, в дальнейшем обязательно пригодится =)


 
Dennis I. Komarov ©   (2011-11-09 16:40) [34]

Помогли?


 
Юлька ©   (2011-11-09 16:45) [35]


> Dennis I. Komarov ©   (09.11.11 16:40) [34]
>
> Помогли?

Что ж Вы так плохо обо мне думаете-то...


 
Dennis I. Komarov ©   (2011-11-09 16:47) [36]


> Юлька ©   (09.11.11 16:28) [32]
>
> Ничего, пусть enter щёлкает, ему полезно пальчики размять

А Read[ln](f, знакомо?


 
Юлька ©   (2011-11-09 16:49) [37]

Об этом нам пока что ничего не рассказывали =)


 
Dennis I. Komarov ©   (2011-11-09 16:49) [38]


> Что ж Вы так плохо обо мне думаете-то...

Это когда же?
Очень даже хорошо думаю и уверен, что такую задачку могла бы и сама решить, только лень мешается...


 
Юлька ©   (2011-11-09 16:51) [39]

Да, лень очень мешается... нашему преподу =) Ибо во время семинара он бегает в буфет и в курилку, и как говорят другие преподы, в программировании он ни бум-бум...


 
Юлька ©   (2011-11-09 17:03) [40]

Но я не буду обвинять препода =) Он тут абсолютно ни при чём, он нам, тупорылым студентам, вообще ничего не должен, мы самостоятельно должны обучаться, это же уже не школа! Это вуз! Не маленькие уже! А препод замечательный человек, анекдоты классно рассказывает =)


 
Dennis I. Komarov ©   (2011-11-09 17:12) [41]


> Да, лень очень мешается... нашему преподу =) Ибо во время
> семинара он бегает в буфет и в курилку, и как говорят другие
> преподы, в программировании он ни бум-бум...

Что мешает читать книжки?
И потом, исходя из того что код в [0] - написан самостоятельно, знаний вполне должно хватить для решения задачи...


 
Dennis I. Komarov ©   (2011-11-09 17:20) [42]


> Jeer ©   (09.11.11 15:26) [22]
>
> Из дидактических соображений я бы предложил такой вариант:
>
>
>  Transpose(B);
>  for k := 1 to N do begin
>    C[k, 1] := Min(A[k, 1], B[k, 1]);
>    for j := 1 to N do
>      for i := 1 to N do
>        C[k, j] := Max(C[k, j], Min(A[i, j], B[i, j]));
>    end;
>
> P.S.
> Реализация Transpose(), Min(), Max() - тривиальна.

А зачем? Только лишние тики тратить...


 
Jeer ©   (2011-11-09 17:26) [43]


> А зачем? Только лишние тики тратить...


"Многомерность не сразу и не всем дается." (С)

Если есть способ привести задачу к более простому виду, хотя бы для учебных целей - грех этим не воспользоваться.
К тому же "засвечиваем" одну из стандартных матрчиных операций - транспонирование.


 
Jeer ©   (2011-11-09 17:32) [44]


> Юлька ©   (09.11.11 16:22) [30]
>
> Жду справедливой критики =)
>


1.Научитесь форматировать код, тогда его кто-то будет читать.

2. min и max - стандартные функции из Math в более высоких версиях Pascal.
Следует избегать таких наименований.


 
Dennis I. Komarov ©   (2011-11-09 17:34) [45]

Ну, не знаю на сколько она стала проще, спорить не буду...
Но объяснить это преподавателю будет сложнее, ибо в условии строки и столбцы. Кроме того, если транспонирование как таковое ей не известно, тогда вообще чума :) Хотя вроде на I-курсе дают...


 
Юлька ©   (2011-11-09 17:37) [46]

Всем спасибо, все замечания непременно учту =)


 
Омлет ©   (2011-11-09 17:38) [47]

> Юлька ©   (09.11.11 16:18) [28]
> max:=-maxint;


Не путай вещественные и натуральные числа.
maxint - это всего лишь 32767 (в 16-ричном паскале).


 
Омлет ©   (2011-11-09 17:40) [48]

> в 16-ричном паскале

16-битном )


 
Dennis I. Komarov ©   (2011-11-09 17:48) [49]


> > max:=-maxint;

возьми соответствующее значение из массива и не надо выдумывать...


 
KilkennyCat ©   (2011-11-09 21:40) [50]


>  и как говорят другие преподы, в программировании он ни
> бум-бум...
>

тогда я бы ему другой код бы подсунул... позаумней.


 
KilkennyCat ©   (2011-11-09 21:41) [51]


> Jeer ©   (09.11.11 17:32) [44]

> 1.Научитесь форматировать код, тогда его кто-то будет читать.
>

ставь расширение от Керка - читать легко.


 
Jeer ©   (2011-11-09 21:45) [52]


> ставь расширение от Керка - читать легко.
>


Offtop:

Кого читать-то легко ?
Расширение или Керка ? :)
Или расширенного Керка ?


 
Омлет ©   (2011-11-10 08:35) [53]

> KilkennyCat ©   (09.11.11 21:41) [51]
>ставь расширение от Керка - читать легко.


Не, без отступов, даже с подсветкой тяжело читать.



Страницы: 1 2 вся ветка

Текущий архив: 2012.02.19;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.012 c
2-1320878543
DolboBoB
2011-11-10 02:42
2012.02.19
Как правильно вывести в DBGrid таблицу? BDE.


15-1320179402
Юрий
2011-11-01 23:30
2012.02.19
С днем рождения ! 2 ноября 2011 среда


1-1286340346
aha
2010-10-06 08:45
2012.02.19
вывод данных в XLS виде. Есть необходимость вывода данных


15-1319710006
Torry
2011-10-27 14:06
2012.02.19
А вы знаете что...?


15-1319915898
DVM
2011-10-29 23:18
2012.02.19
Забавная картинка