Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Обработка массивов. Матрицы

Автор: maximmax 30.12.2007 17:06

Входной массив А 6Х6
формируемый B 6Х6 где b[i,j]=i*cos(i+j) i:=1..6, j:=1..6
для каждой из матриц вычислить число элементов меньших 0.5(NA и NB) Переставить строчки местами в маттрице А, если NA>NB и в матрице B если NA<=NB(матрица C)
вывести A,B, NA, NB, C.

текст проги.

М
используй теги



program matrix;
Var a: array[1..6, 1..6] of real;
b: array[1..6, 1..6] of real;
c: array[1..6, 1..6] of real;
i, j, n, m, q, p, o, l, g, h: integer;
t, s:real;
begin
g:=1;{ne4etnie stroki}
h:=1;{4etnie stroki}
t:=0.5;{4islo, iz DANO dla opredelenia <>}
Write('CTPOKI'); Readln(m);
Write('STOLBCI'); Readln(n);
writeln('vvedite massiv A:');
o:=0;
For i:=1 to m do{Cikl zapolnenija matrici}
For j:=1 to n do
begin
write('a[',i: 2,',',j: 2,']', '=');
read(a[i, j]);
if a[i,j]<t then o:=o+1{s4etcik elementov<0,5 dla A}
end;
For i:=1 to m do {vivod matrici A}
begin
writeln;
For j:=1 to n do
begin
write(a[i,j] :7,' ');
if b[i,j]<t then l:=l+1 {s4etcik elementov<0,5 dla B}
end;
end;
writeln;
writeln;
For i:=1 to m do {vivod matrici B}
begin
writeln;
For j:=1 to n do
begin
b[i,j]:=i*cos(i+j);
write(b[i,j] :7,' ');
end;
end;
writeln;
writeln;
writeln('oPABHO=',o);{vivod kolicestva elementov<0,5 A}
writeln('lPABHO=',l);{vivod kolicestva elementov<0,5 B}
for i:=1 to m do{cikl zameni 4etnih strok na ne 4etnie}
begin
g:=(i*2)-1;{ne4etnie stroki}
h:=2*i;{4etnie stroki}
s:=a[g,i];
a[g,i]:=a[h,i];
a[h,i]:=s;
end;
For i:=1 to m do
begin
writeln;
For j:=1 to n do
begin
write(a[i,j] :7);{vivod matrici A s zamenoi strok}
end;
end;
writeln;
readln(q);{readkey ne rabotaet(( sdelal tak vihod}
end.
end.
end.


написал не правильно. т.к не считает у меня элементы матрици А и B..вот это я и не понимаю как сделать...
помогите плз!


Прикрепленные файлы
Прикрепленный файл  ___MATRIX.pas ( 1.5 килобайт ) Кол-во скачиваний: 255

Автор: andriano 30.12.2007 17:50

1. Неужели трудно заглянуть в соседнюю тему и посмотреть, как принято оформлять исходик?
2. Если я правильно понял, программа делает то, чего нет в условии, а именно - запрос размеров матриц.
3. Для начала я бы попытался заменть read на readln.
4. В условии, если я его правильно понял, требуется сформировать НОВУЮ матрицу С из переставленных элементов А или В в зависимости от условия, у тебя же всегда обрабатывается А и записывается в нее же. И она же распечатывается.
5. Проверь индексацию в том месте, где ты пытаешься переставить местами элементы. Собственно, лучше сначала поправь программу в соответствии с 4, а когда распечатаешь матрицу С, сам поймешь в чем дело.
6. По поводу readln(q);{readkey ne rabotaet(( sdelal tak vihod} - оно работает, ждет от тебя ввода числа q, но т.к. ты, скорее всего, нажимаешь на ввод, ничего не вводя, то оно снова и снова просит тебя ввести число. Просто ожидание нажатия на enter - readln без параметров. Если же хочешь чтобы работало именно readkey, а не readln, нужно подключать crt.

Автор: sweet dew 30.12.2007 18:14

Ну, во-первых, ты элементы (,0.5) матрицы В считаешь до того, как собственно задашь эти элементы!!!Так что писать нужно


For i:=1 to m do {vivod matrici B}
begin
writeln;
For j:=1 to n do
begin
b[i,j]:=i*cos(i+j);
write(b[i,j] :7,' ');
if b[i,j]<t then l:=l+1 {s4etcik elementov<0,5 dla B}
end;
end;



Автор: maximmax 30.12.2007 21:20

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


program matrix;
Var a: array[1..6, 1..6] of real;
b: array[1..6, 1..6] of real;
c: array[1..6, 1..6] of real;
i, j, n, m, q, p, o, l, g, h: integer;
t, s:real;
begin
g:=1;{ne4etnie stroki}
h:=1;{4etnie stroki}
t:=0.5;{4islo, iz DANO dla opredeleniz <>}
Write('CTPOKI'); Readln(m);
Write('STOLBCI'); Readln(n);
writeln('vvedite massiv A:');
o:=0;
For i:=1 to m do{Cikl zapolnenija matrici}
For j:=1 to n do
begin
write('a[',i: 2,',',j: 2,']', '=');
read(a[i, j]);
if a[i,j]<t then o:=o+1{s4etcik elementov<0,5 dla A}
end;
For i:=1 to m do {vivod matrici A}
begin
writeln;
For j:=1 to n do
begin
write(a[i,j] :7,' ');
end;
end;
writeln;
writeln;
For i:=1 to m do {vivod matrici B}
begin
writeln;
For j:=1 to n do
begin
b[i,j]:=i*cos(i+j);
write(b[i,j] :7,' ');
if b[i,j]<t then l:=l+1 {s4etcik elementov<0,5 dla B}
end;
end;
writeln;
writeln;
writeln('oPABHO=',o);{vivod kolicestva elementov<0,5 A}
writeln('lPABHO=',l);{vivod kolicestva elementov<0,5 B}
if a[i,j]> b[i,j] then
begin
for i:=1 to m do{cikl zameni 4etnih strok na ne 4etnie}
for j:=1 to n do
begin
g:=(i*2)-1;{ne4etnie stroki}
h:=2*i;{4etnie stroki}
s:=a[g,j];
a[g,j]:=a[h,j];
a[h,j]:=s;
c[g,j]:=a[g,j];
c[h,j]:=s;
end;
For i:=1 to m do
begin
writeln;
For j:=1 to n do
begin
write(c[i,j] :7);{vivod matrici A s zamenoi strok}
end;
end;
end
else
begin
for i:=1 to m do{cikl zameni 4etnih strok na ne 4etnie}
for j:=1 to n do
begin
g:=(i*2)-1;{ne4etnie stroki}
h:=2*i;{4etnie stroki}
s:=b[g,j];
b[g,j]:=b[h,j];
b[h,j]:=s;
c[g,j]:=b[g,j];
c[h,j]:=s;
end;
For i:=1 to m do
begin
writeln;
For j:=1 to n do
begin
write(c[i,j] :7);{vivod matrici A s zamenoi strok}
end;
end;
end;
writeln;
readln(q);{readkey ne rabotaet(( sdelal tak vihod}
end.
end.
end.




Прикрепленные файлы
Прикрепленный файл  __MAXMAT.PAS ( 2 килобайт ) Кол-во скачиваний: 246

Автор: andriano 30.12.2007 21:40

У меня несколько вопросов по приведенному фрагменту кода:


if a[i,j]> b[i,j] then
begin
for i:=1 to m do{cikl zameni 4etnih strok na ne 4etnie}
for j:=1 to n do
begin
g:=(i*2)-1;{ne4etnie stroki}
h:=2*i;{4etnie stroki}
s:=a[g,j];
a[g,j]:=a[h,j];
a[h,j]:=s;

в первой стоке для адресации используются переменные цикла, но ВНЕ циклов. К каким элементам массивов a и b осуществляется доступ?
в 3-й строке у тебя перебор до m. Максимальное значение m, насколько понимаю, 6. Вопрос: к какому элементу массива будет обращение в 8-10 строках? Посчитай значения индексов.

Автор: maximmax 30.12.2007 22:31

Цитата(andriano @ 30.12.2007 17:40) *

У меня несколько вопросов по приведенному фрагменту кода:

if a[i,j]> b[i,j] then
begin
for i:=1 to m do{cikl zameni 4etnih strok na ne 4etnie}
for j:=1 to n do
begin
g:=(i*2)-1;{ne4etnie stroki}
h:=2*i;{4etnie stroki}
s:=a[g,j];
a[g,j]:=a[h,j];
a[h,j]:=s;

в первой стоке для адресации используются переменные цикла, но ВНЕ циклов. К каким элементам массивов a и b осуществляется доступ?
в 3-й строке у тебя перебор до m. Максимальное значение m, насколько понимаю, 6. Вопрос: к какому элементу массива будет обращение в 8-10 строках? Посчитай значения индексов.


так а к каким надо обращаться?
если как у меня то будет
i,j=1 => g=1 h=2
i,j=2 => g=3 h=4
i,j=3 => g=5 h=6
i,j=4 => g=7 h=8
i,j=5 => g=9 h=10
i,j=6 => g=11 h=12

Автор: andriano 30.12.2007 23:25

Цитата(maximmax @ 30.12.2007 18:31) *

так а к каким надо обращаться?
Сравнивать надо было КОЛИЧЕТВО элементов подсчитанное для каждой из матриц (число целое), а не величину отдельных элементов матрицы.
В условии они называются NA и NB, а у тебя в прогамме o и l.
Цитата

если как у меня то будет
i,j=1 => g=1 h=2
i,j=2 => g=3 h=4
i,j=3 => g=5 h=6
i,j=4 => g=7 h=8
i,j=5 => g=9 h=10
i,j=6 => g=11 h=12

Ну и что, в твоих матрицах есть элементы с такими индексами?
Вклюыи в компиляторе проверки выход из диапазона.

Автор: maximmax 30.12.2007 23:45

Цитата(andriano @ 30.12.2007 19:25) *

Сравнивать надо было КОЛИЧЕТВО элементов подсчитанное для каждой из матриц (число целое), а не величину отдельных элементов матрицы.
В условии они называются NA и NB, а у тебя в прогамме o и l.
Ну и что, в твоих матрицах есть элементы с такими индексами?
Вклюыи в компиляторе проверки выход из диапазона.

тоесть так надо..

if o> l then
begin
for i:=1 to m do{cikl zameni 4etnih strok na ne 4etnie}
for j:=1 to n do
begin
g:=(i*2)-1;{ne4etnie stroki}
h:=2*i;{4etnie stroki}
s:=a[g,j];
a[g,j]:=a[h,j];
a[h,j]:=s;



я в паскале то первый раз и не понимаю....что за проверки выхода диапазона...
и я не понимаю вот этих строчек....я просто по подобию делал....а как что для чего что мне никто не обьяснял..


s:=a[g,j];
a[g,j]:=a[h,j];
a[h,j]:=s;


сдесь можно как нибудь сделать чтоб не по элементно было а сразу строчка.....? там например 1 я строчка со всеми элементами в s записывалась и менялась со второй....потом 3 я срочка так же с 4й...5 я с 6й...

я еще попробовал сделать вот так(ведь матрица 6Х6 так и задасть так перемену строк)

for i:=1 to m do{cikl zameni 4etnih strok na ne 4etnie}
for j:=1 to n do
begin
s:=a[1,j];
g:=a[3,j];
h:=a[5,j];
a[1,j]:=a[2,j];
a[3,j]:=a[4,j];
a[5,j]:=a[6,j];
a[2,j]:=s;
a[4,j]:=g;
a[6,j]:=h;
с[1,j]:=a[1,j];
с[3,j]:=a[3,j];
с[5,j]:=a[5,j];
с[2,j]:=s;
с[4,j]:=g;
с[6,j]:=h;



но что то не прожевал паскаль((((((((((((((((((((((((99
может эту запись можно подправить и он будет по элементно перемещать строчки?

Автор: andriano 31.12.2007 0:10

Цитата(maximmax @ 30.12.2007 19:45) *
я в паскале то первый раз и не понимаю....что за проверки выхода диапазона...
и я не понимаю вот этих строчек....я просто по подобию делал....а как что для чего что мне никто не обьяснял..
У тебя в массиве 6 элементов, а ты пытаешься обратиться к 12-му. Так онятнее?
Цитата


s:=a[g,j];
a[g,j]:=a[h,j];
a[h,j]:=s;


сдесь можно как нибудь сделать чтоб не по элементно было а сразу строчка.....? там например 1 я строчка со всеми элементами в s записывалась и менялась со второй....потом 3 я срочка так же с 4й...5 я с 6й...

Можно.
Двумерный массив можно представить как массив одномерных массивов. Т.е. a[i,j] то же самое, что a[i][j], т.е. строка массива записывается так: a[i].

Автор: maximmax 31.12.2007 1:10

я еще попробовал сделать вот так(ведь матрица 6Х6 так и задасть так перемену строк)


for i:=1 to m do{cikl zameni 4etnih strok na ne 4etnie}
for j:=1 to n do
begin
s:=a[1,j];
g:=a[3,j];
h:=a[5,j];
a[1,j]:=a[2,j];
a[3,j]:=a[4,j];
a[5,j]:=a[6,j];
a[2,j]:=s;
a[4,j]:=g;
a[6,j]:=h;
с[1,j]:=a[1,j];
с[3,j]:=a[3,j];
с[5,j]:=a[5,j];
с[2,j]:=s;
с[4,j]:=g;
с[6,j]:=h;




но что то не прожевал паскаль((((((((((((((((((((((((99
может эту запись можно подправить и он будет по элементно перемещать строчки?

Автор: andriano 31.12.2007 3:05

Это что, шутка такая?
В общем, соображения такие: за один проход цикла ты обрабатываешь по две строки матрицы. Значит, длина цикла должна быть в 2 раза меньше (если бы обрабатывал по 3 строки - то в 3 раза меньше).
Откуда:

  for i:=1 to m div 2 do begin {cikl zameni 4etnih strok na ne 4etnie}
g:=(i*2)-1;{ne4etnie stroki}
h:=2*i;{4etnie stroki}
c[h]:=a[g];
c[g]:=a[h];
end;

Для b, естественно, следать аналогично.

Автор: maximmax 31.12.2007 3:21

Цитата(andriano @ 30.12.2007 23:05) *

Это что, шутка такая?
В общем, соображения такие: за один проход цикла ты обрабатываешь по две строки матрицы. Значит, длина цикла должна быть в 2 раза меньше (если бы обрабатывал по 3 строки - то в 3 раза меньше).
Откуда:
  for i:=1 to m div 2 do begin {cikl zameni 4etnih strok na ne 4etnie}
g:=(i*2)-1;{ne4etnie stroki}
h:=2*i;{4etnie stroki}
c[h]:=a[g];
c[g]:=a[h];
end;

Для b, естественно, следать аналогично.


чего то пишет Types Mishmatch...... хотя integer с real менял и так и так.....и сяк.... все равно..

а моя фигулинка вроде считает....ненаю тока..я ошибок не нашел....


program matrix;
uses crt;
Var a: array[1..6, 1..6] of real;
b: array[1..6, 1..6] of real;
c: array[1..6, 1..6] of real;
i, j, n, m, q, p, o, l, g, h: integer;
t, s:real;
begin
clrscr;
{g:=1;{ne4etnie stroki}
{h:=1;{4etnie stroki}
t:=0.5;{4islo, iz DANO dla opredeleniz <>}
textcolor(red);
Write('CTPOKI'); Readln(m);
Write('STOLBCI'); Readln(n);
textcolor(blue);
writeln('vvedite massiv A:');
o:=0;
For i:=1 to m do{Cikl zapolnenija matrici}
For j:=1 to n do
begin
write('a[',i: 2,',',j: 2,']', '=');
read(a[i, j]);
if a[i,j]<t then o:=o+1{s4etcik elementov<0,5 dla A}
end;
For i:=1 to m do {vivod matrici A}
begin
writeln;
For j:=1 to n do
begin
write(a[i,j] :7,' ');
end;
end;
writeln;
writeln;
For i:=1 to m do {vivod matrici B}
begin
writeln;
For j:=1 to n do
begin
b[i,j]:=i*cos(i+j);
textcolor(yellow);
write(b[i,j] :7,' ');
if b[i,j]<t then l:=l+1 {s4etcik elementov<0,5 dla B}
end;
end;
writeln;
writeln;
textcolor(blue);
writeln('elementov< 0.5 V A=',o);{vivod kolicestva elementov<0,5 A}
writeln('elementov< 0.5 V B=',l);{vivod kolicestva elementov<0,5 B}
if l>=o then
begin
for i:=1 to m do{cikl zameni 4etnih strok na ne 4etnie}
begin
{ g:=(i*2)-1;{ne4etnie stroki}
{h:=2*i;{4etnie stroki}
s:=b[1,i];
b[1,i]:=b[2,i];
b[2,i]:=s;
c[1,i]:=b[1,i];
c[2,i]:=s;
s:=b[3,i];
b[3,i]:=b[4,i];
b[4,i]:=s;
c[3,i]:=b[3,i];
c[4,i]:=s;
s:=b[5,i];
b[5,i]:=b[6,i];
b[6,i]:=s;
c[5,i]:=b[5,i];
c[6,i]:=s;
end;
For i:=1 to m do
begin
writeln;
For j:=1 to n do
begin
textcolor(green);
write(c[i,j] :7);{vivod matrici C s zamenoi strok}
end;
end;
end
else
begin
for i:=1 to m do{cikl zameni 4etnih strok na ne 4etnie}
{for j:=1 to n do}
begin
{g:=(i*2)-1;{ne4etnie stroki}
{h:=2*i;{4etnie stroki}
s:=a[1,i];
a[1,i]:=a[2,i];
a[2,i]:=s;
c[1,i]:=a[1,i];
c[2,i]:=s;
s:=a[3,i];
a[3,i]:=a[4,i];
a[4,i]:=s;
c[3,i]:=a[3,i];
c[4,i]:=s;
s:=a[5,i];
a[5,i]:=a[6,i];
a[6,i]:=s;
c[5,i]:=a[5,i];
c[6,i]:=s;
end;
For i:=1 to m do
begin
writeln;
For j:=1 to n do
begin
textcolor(green);
write(c[i,j] :7);{vivod matrici C s zamenoi strok}
end;
end;
end;
writeln;
readkey;
end.
end.
end.




Прикрепленные файлы
Прикрепленный файл  __MAXMAT.PAS ( 2.44 килобайт ) Кол-во скачиваний: 239