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

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

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

Автор: nadia 29.11.2006 21:44

Очень нужно решить контрольную в универ по турбо паскалю. Я его учила 2 года назад, но почти ничего не помню. Помоги пожалуйста. Буду очень презнательна.
Вот задачка:
Задана матрица А[M/M] действительных чисел. Поменять местами максимальный и минимальный элементы главной диагонали. Вывести преобразованную матрицу.

Автор: мисс_граффити 29.11.2006 23:30

1. найти минимум и максимум, запомнить их индексы. точнее, запомнить одно число, т.к. элементы на главной диагонали имеют индексы вида [1,1] [2,2] и т.д.
2. поменять местами.
на каком этапе проблемы?

Автор: nadia 29.11.2006 23:49

Минимум и максимум вроде нашла, а вот как поменять их местами возникла проблемка! Подскажи пожалуйста что делать?? [quote name='мисс_граффити' date='29.11.2006 20:30' post='81201']
give_rose.gif Буду очень благодарна!

Автор: мисс_граффити 29.11.2006 23:55

DopPerem:=a[mini,mini];
a[mini,mini]:=a[maxi,maxi];
a[maxi,maxi]:=DopPerem;

Автор: nadia 30.11.2006 1:48

Пыталась найти минимальный и максимальный, вроде написала, но ничего не получается. Не могу собрать все в кучу. Матрица не вводиться. Пишет введите 'n' а дальше данные вводятся в столбик. И все.
Что мне делать??? unsure.gif

Автор: YnickYM 30.11.2006 1:58

или можно без ввода доп. переменной:

a[max;max]:=a[max+min;max+min]
a[min;min]:=a[max-min;max-min]
a[max;max]:=a[max-min;max-min]

Цитата(nadia @ 29.11.2006 21:48) *

Пыталась найти минимальный и максимальный, вроде написала, но ничего не получается. Не могу собрать все в кучу. Матрица не вводиться. Пишет введите 'n' а дальше данные вводятся в столбик. И все.
Что мне делать??? unsure.gif


for i:=1 to M do
for j:=1 to M do
readln(a[i,j]);

Автор: nadia 30.11.2006 2:29

Написала вот такую программу:

Program xxx;
Uses crt;
Var a:array[1..10,1..10] of integer;
i,j,min,imin,jmin,max,n,m: integer;
BEGIN
ClrScr;
Write ('m=');
ReadLn (m);
Write ('n=');
ReadLn (n);
for i:= 1 to m do
for j:= 1 to n do
Read (a[i,j]);
begin
max:= a[1,1];
for i:= 1 to m do
for j:= 1 to n do
if (i=j) and (a[i,j]>max) then
max:= a[i,j];
end;
begin
min:=a[1,1]; imin:=1; jmin:=1;
for i:= 1 to m do
for j:= 1 to n do
if (i=j) and (a[i,j]<min) then
begin
min:=a[i,j];
imin:= i;
jmin:= j;
end;
end;
WriteLn ('max', max);
WriteLn ('min', min);
End.


А вот как сделать так чтоб она правильно работала не могу понять??? Подскажите пожалуйста в чем ошибка и как правильно вывести НОВУЮ ПРЕОБРАЗОВАННУЮ МАТРИЦУ! И как сделать чтоб матрица имела вид матрицы а не одного длинного столбца. Помогите очень прошу!!!! Заранее большое спасибо!
give_rose.gif

Теги !!!

Автор: nadia 30.11.2006 2:48

[quote name='мисс_граффити' date='29.11.2006 20:30' post='81201']
Теперь коечто изменила и получилось, что минимальный и максимальный элементы находятся правильно, а вот как поменять их местами - с этим большущая проблемка. Помогите пожалуйста, скажите где проблемка.

Program xxx;
Uses crt;
Var a:array[1..10,1..10] of integer;
i,j,min,imin,jmin,max,n: integer;
BEGIN
ClrScr;
Write ('n=');
ReadLn (n);
for i:= 1 to n do
for j:= 1 to n do
Read (a[i,j]);
begin
max:= a[1,1];
for i:= 1 to n do
for j:= 1 to n do
if (i=j) and (a[i,j]>max) then
max:= a[i,j];
end;
begin
min:=a[1,1]; imin:=1; jmin:=1;
for i:= 1 to n do
for j:= 1 to n do
if (i=j) and (a[i,j]<min) then
begin
min:=a[i,j];
imin:= i;
jmin:= j;
end;
end;
WriteLn ('max', max);
WriteLn ('min', min);
End.
no1.gif

Теги !!!

Автор: nadia 30.11.2006 2:57

Program xxx;
Uses crt;
Var a:array[1..10,1..10] of integer;
i,j,min,imin,jmin,max,n: integer;
BEGIN
ClrScr;
Write ('n=');
ReadLn (n);
for i:= 1 to n do
for j:= 1 to n do
Read (a[i,j]);
begin
max:= a[1,1];
for i:= 1 to n do
for j:= 1 to n do
if (i=j) and (a[i,j]>max) then
max:= a[i,j];
end;
begin
min:=a[1,1]; imin:=1; jmin:=1;
for i:= 1 to n do
for j:= 1 to n do
if (i=j) and (a[i,j]<min) then
begin
min:=a[i,j];
imin:= i;
jmin:= j;
end;
end;
WriteLn ('max', max);
WriteLn ('min', min);
End.

Написала вот что. Максимальный и минимальный элементы находятся, а вот чтоб поменять их местами - с этим оказалась проблемка. Помогите кто нибудь пожалуйста!!!
М
nadia, при вставлении программных текстов, пожалуйста, используй теги!
Видишь над окном ввода окошко выбора со словом CODE? Выдели свою программу блоком, ткни туда и выбери, что надо. Lapp


Автор: мисс_граффити 30.11.2006 3:56

nadia, во-первых, правила форума к тебе тоже относятся.
Зачем создавать новую тему?
И при размещении программ пользуйся тэгами - невозможно же читать!
как менять местами элементы - я, по-моему, вполне четко написала. что непонятно?

Цитата
a[max;max]:=a[max+min;max+min]
a[min;min]:=a[max-min;max-min]
a[max;max]:=a[max-min;max-min]

blink.gif
допустим, максимальный элемент на позиции 1,1
минимальный на 3,3
a[3,3]:=a[4,4];
a[1,1]:=a[-2,-2]
a[3,3]:=a[-2,-2]
YnickYM, что ты этим хотел сказать?
или max - это не индекс максимального, а он сам? тогда еще интереснее...

Автор: lapp 30.11.2006 8:16

Я причесал твою прогу, чтоб читалась нормально.
Убрал несколько begin/end'ов.
При нахождении минимума ты запоминала индексы, а при нахождении максимума - нет sad.gif. Я добавил.
В конце два очевидных оператора решают твою проблему.. smile.gif
Все добавления снабжены комментариями.

Uses
crt;

Var
a:array[1..10,1..10] of integer;
i,j,min,imin,jmin,max,imax,jmax,n: integer; {imax and jmax added}

BEGIN
ClrScr;
Write ('n=');
ReadLn (n);
for i:=1 to n do for j:=1 to n do Read(a[i,j]);
max:=a[1,1]; imax:=1; jmax:=1; {2 statements added}
for i:=1 to n do for j:=1 to n do if (i=j)and(a[i,j]>max) then begin
max:=a[i,j];
imax:=i; {Added}
jmax:=j; {Added}
end;
min:=a[1,1]; imin:=1; jmin:=1;
for i:=1 to n do for j:=1 to n do if (i=j)and(a[i,j]<min) then begin
min:=a[i,j];
imin:=i;
jmin:=j;
end;
WriteLn ('max', max);
WriteLn ('min', min);
{Below the min and max interchange goes}
a[imin,jmin]:=max;
a[imax,jmax]:=min
End.

PS
В названии темы, пожалуйста, не пиши просьбы помочь - здесь 99.9% просьбы о помощи. Пиши краткое описание задачи. Успехов!

Автор: мисс_граффити 30.11.2006 14:36

lapp, а ничего, что в соседней теме мы решаем ЭТУ же задачу, выложенную nadia?

2 мисс_граффити: извини, не заметил. Спасибо за наводку. Объединяю темы.
2 nadia: предупреждение!! angry.gif

Автор: volvo 30.11.2006 15:43

Цитата(YnickYM @ 29.11.2006 20:58) *

или можно без ввода доп. переменной:

a[max;max]:=a[max+min;max+min]
a[min;min]:=a[max-min;max-min]
a[max;max]:=a[max-min;max-min]

А вылететь за границы матрицы не боишься? если max - min < 0, например?

Автор: nadia 30.11.2006 15:53

Огромное Вам человеческое спасибо!!! give_rose.gif Благодаря Вам я сделала свою контрольную в универ. Классно когда есть умные люди, которые разбираются в программировании. И что я нашла ваш сайт!!! Я от всей души вам благодарна. Еще раз БОЛЬШОЕ СПАСИБО!!!!!!!!! good.gif

Автор: YnickYM 1.12.2006 0:43

Извиняюсь, чушь написал.

Вот мой вариант программы

Цитата

Uses
crt;

Var
a:array[1..10,1..10] of integer;
i,j,min,max,n: integer;
BEGIN
ClrScr;
Write ('n=');
ReadLn (n);
for i:=1 to n do for j:=1 to n do
begin
Read(a[i,j]);
if j=n then writeln; end;
max:=1;
for i:=1 to n do for j:=1 to n do if a[i,i]>a[max,max] then max:=i;
min:=1;
for i:=1 to n do for j:=1 to n do if a[i,i]<a[min,min] then min:=i;
i:=a[min,min];
a[min,min]:=a[max,max];
a[max,max]:=i;
for i:=1 to n do //вывод преобразованной матрицы
for j:=1 to n do
begin
write(a[i,j],' ');
if j=n then writeln;
end;
readln;
End.

Автор: мисс_граффити 1.12.2006 1:29

замечательная программка.
скажи мне честно, ты ее ПОТЕСТИРОВАТЬ не пробовал?
как думаешь, имеет ли смысл строчка:

 if a[i,i]<a[max,max] then min:=i;

понимаешь, что меньше максимального элемента не только минимальный, но и многие другие?
a[max,max]:=a[min;min];
a[max,max]:=a[min,min];

пишем сценарий для мультфильма про Телепузиков? Это они все по два раза повторяют...
for i:=1 to n do for j:=1 to n do Read(a[i,j]);
for i:=1 to n do //вывод заданной матрицы
for j:=1 to n do
begin
write(a[i,j],' ');
if j=n then writeln;
end;

Сразу при вводе выводить нельзя? Или тоже принципиально отделяешь ввод от вывода -чтобы не запутаться?
i:=a[min,min];

и зачем ты это делаешь? потом же все равно затираешь значение, хранящееся в i
продолжить или хватит?

Автор: YnickYM 1.12.2006 2:04

Цитата(мисс_граффити @ 30.11.2006 21:29) *

замечательная программка.
скажи мне честно, ты ее ПОТЕСТИРОВАТЬ не пробовал?

Честно говоря, нет.
Цитата
как думаешь, имеет ли смысл строчка:
 if a[i,i]<a[max,max] then min:=i;

понимаешь, что меньше максимального элемента не только минимальный, но и многие другие?

Исправлено
Цитата
a[max,max]:=a[min;min];
a[max,max]:=a[min,min];

пишем сценарий для мультфильма про Телепузиков? Это они все по два раза повторяют...

Пардон, опечатка. Имелось ввиду:
i:=a[min,min];
a[min,min]:=a[max,max];
a[max,max]:=i;
Цитата
for i:=1 to n do for j:=1 to n do Read(a[i,j]);
for i:=1 to n do //вывод заданной матрицы
for j:=1 to n do
begin
write(a[i,j],' ');
if j=n then writeln;
end;

Сразу при вводе выводить нельзя? Или тоже принципиально отделяешь ввод от вывода -чтобы не запутаться?
Исправлено.
Цитата

продолжить?

Если вас не затруднит

Автор: мисс_граффити 1.12.2006 2:45

так... вывод массива ты вообще убрал - ну правильно, пусть пользователь тренирует память. подумаешь, 100 чисел запомнить.

зачем 4 цикла:

max:=1; 
for i:=1 to n do for j:=1 to n do if a[i,i]>a[max,max] then max:=i;
min:=1;
for i:=1 to n do for j:=1 to n do if a[i,i]<a[min,min] then min:=i;

, когда достаточно 1?
и зачем начинать с 1, если можно с 2?

в общем, Правила:
Цитата
7. Проверяйте программы перед тем, как разместить их на форуме!!!


З.Ы. На будущее - делай человеческие отступы. Невозможно ж читать код!

Автор: YnickYM 1.12.2006 3:02

Цитата
так... вывод массива ты вообще убрал - ну правильно, пусть пользователь тренирует память. подумаешь, 100 чисел запомнить.

for i:=1 to n do for j:=1 to n do
begin
Read(a[i,j]);
if j=n then writeln; end;

какой вывод?

del