Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.02.19;
Скачать: [xml.tar.bz2];

Вниз

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]

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



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

Форум: "Начинающим";
Текущий архив: 2012.02.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.007 c
15-1319989105
Кто б сомневался
2011-10-30 18:38
2012.02.19
Кажись уже есть компилятор Delphi x64?


15-1318709342
Юрий Зотов
2011-10-16 00:09
2012.02.19
ММП 28-го ?


15-1320263467
GreyWolf83
2011-11-02 22:51
2012.02.19
UTF-8 сравнение строк без учета регистра???


9-1190241696
3DMax
2007-09-20 02:41
2012.02.19
Вопрос по кривым Безье


2-1320829589
RGV
2011-11-09 13:06
2012.02.19
Картотека - С чего начать?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский