Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на двумерный массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
hardest
Здравствуйте!
Ни как не получается написать следующую программку:
Вставить нулевую строку и нулевой столбец перед строкой и столбцом, где находится первый минимальный элемент.
Получается, что вставляются лишние пропуски и т.д. blink.gif Помогите пожалуйста!
Заранее огромное спасибо за ответы! smile.gif
program mas2;
uses crt;
var
i,j,n,m,k,l,nach: integer;
mas:array[1..50,1..50] of integer;
begin
clrscr;
writeln('Введите размерность массива (число строк n и число столбцов m): ');
read(n,m);
randomize;
write('Данный массив:');
for i:=1 to n do
for j:=1 to m do
mas[i,j]:=-10+random(40);
for i:=1 to n do begin writeln;
for j:=1 to m do
write(mas[i,j]:5); end;

nach:=mas[1,1];
k:=1;l:=1;
for j:=1 to 1 do
for i:=1 to n do begin
if mas[i,j]<nach then begin
k:=j; l:=i;
nach:=mas[i,j]
end;
end;
writeln(k,' ',l);
for i:=l to n+1 do
for j:=k to m+1 do begin
mas[i,j+1]:=mas[i,j];
end;
write('Получился массив вида');
for i:=l to n do
for j:=k to m do begin
mas[l,j]:=0; mas[i,k]:=0;
end;

{for i:=1 to n do
for j:=1 to m do
begin writeln;
for j:=1 to m do
write(mas[i,j]:5);end; }

writeln;
writeln;
For i:=1 To n+1 Do
Begin
For j:=1 To m+1 Do Write (mas[i,j] : 5) ;
Writeln;
End;
readkey;
end.
Lapp
Вот:
program mas2;
var
i,j,n,m,k,l: integer;
mas: array[1..50,1..50] of integer;

begin
writeln('Введите размерность массива (число строк n и число столбцов m): ');
readLn(n,m);
{randomize;} { раскомментировать только после отладки!}
writeLn('Данный массив:');
for i:=1 to n do for j:=1 to m do mas[i,j]:=-10+random(40);
for i:=1 to n do begin
for j:=1 to m do write(mas[i,j]:5);
WriteLn
end;
{ поиск минимального элемента }
k:=1;
l:=1;
for i:=1 to n do for j:=1 to m do if mas[i,j]<mas[k,l] then begin
k:=i;
l:=j;
end;
writeln('Позиция минимального элемента: ',k,' ',l);
{ Раздвигаем .. }
for i:=n downto 1 do begin
for j:=m downto 1 do if j>=l then mas[i,j+1]:=mas[i,j]; { .. столбцы }
if i>=k then for j:=1 to m+1 do mas[i+1,j]:=mas[i,j] { .. строки }
end;
{ Записываем нули }
Inc(n);
Inc(m);
for i:=1 to n do mas[i,l]:=0;
for j:=1 to m do mas[k,j]:=0;

writeln('Результат: ');
For i:=1 To n Do Begin
For j:=1 To m Do Write(mas[i,j] : 5) ;
Writeln;
End;
readLn;
end.

Что непонятно - спрашивай.
hardest
Цитата(Lapp @ 4.01.2009 10:55) *

Вот:
program mas2;
var
i,j,n,m,k,l: integer;
mas: array[1..50,1..50] of integer;

begin
writeln('Введите размерность массива (число строк n и число столбцов m): ');
readLn(n,m);
{randomize;} { раскомментировать только после отладки!}
writeLn('Данный массив:');
for i:=1 to n do for j:=1 to m do mas[i,j]:=-10+random(40);
for i:=1 to n do begin
for j:=1 to m do write(mas[i,j]:5);
WriteLn
end;
{ поиск минимального элемента }
k:=1;
l:=1;
for i:=1 to n do for j:=1 to m do if mas[i,j]<mas[k,l] then begin
k:=i;
l:=j;
end;
writeln('Позиция минимального элемента: ',k,' ',l);
{ Раздвигаем .. }
for i:=n downto 1 do begin
for j:=m downto 1 do if j>=l then mas[i,j+1]:=mas[i,j]; { .. столбцы }
if i>=k then for j:=1 to m+1 do mas[i+1,j]:=mas[i,j] { .. строки }
end;
{ Записываем нули }
Inc(n);
Inc(m);
for i:=1 to n do mas[i,l]:=0;
for j:=1 to m do mas[k,j]:=0;

writeln('Результат: ');
For i:=1 To n Do Begin
For j:=1 To m Do Write(mas[i,j] : 5) ;
Writeln;
End;
readLn;
end.

Что непонятно - спрашивай.

Lapp, спасибо огромное. yes2.gif yahoo!.gif Всё работает как часы. good.gif Ещё раз спасибо!
Удачи и всего самого лучшего!
Lapp
Подумавши немного, я пришел к выводу, что основной цикл можно существенно сократить, а также вставить туда запись нулей. Вот:
var
i,j,n,m,k,l: integer;
mas: array[1..50,1..50] of integer;

begin
writeln('Введите размерность массива (число строк n и число столбцов m): ');
readLn(n,m);
{randomize;} { раскомментировать только после отладки!}
writeLn('Данный массив:');
for i:=1 to n do for j:=1 to m do mas[i,j]:=-10+random(40);
for i:=1 to n do begin
for j:=1 to m do write(mas[i,j]:5);
WriteLn
end;
{ поиск минимального элемента }
k:=1;
l:=1;
for i:=1 to n do for j:=1 to m do if mas[i,j]<mas[k,l] then begin
k:=i;
l:=j;
end;
writeln('Позиция минимального элемента: ',k,' ',l);

Inc(n);
Inc(m);
for i:=n downto 1 do for j:=m downto 1 do
mas[i,j]:=byte(i<>k)*byte(j<>l)*mas[i-byte(i>k),j-byte(j>l)];

writeln('Результат: ');
For i:=1 To n Do Begin
For j:=1 To m Do Write(mas[i,j] : 5) ;
Writeln;
End;
readLn;
end.

Разберешься? smile.gif
hardest
Цитата(Lapp @ 4.01.2009 13:35) *

Подумавши немного, я пришел к выводу, что основной цикл можно существенно сократить, а также вставить туда запись нулей. Вот:
var
i,j,n,m,k,l: integer;
mas: array[1..50,1..50] of integer;

begin
writeln('Введите размерность массива (число строк n и число столбцов m): ');
readLn(n,m);
{randomize;} { раскомментировать только после отладки!}
writeLn('Данный массив:');
for i:=1 to n do for j:=1 to m do mas[i,j]:=-10+random(40);
for i:=1 to n do begin
for j:=1 to m do write(mas[i,j]:5);
WriteLn
end;
{ поиск минимального элемента }
k:=1;
l:=1;
for i:=1 to n do for j:=1 to m do if mas[i,j]<mas[k,l] then begin
k:=i;
l:=j;
end;
writeln('Позиция минимального элемента: ',k,' ',l);

Inc(n);
Inc(m);
for i:=n downto 1 do for j:=m downto 1 do
mas[i,j]:=byte(i<>k)*byte(j<>l)*mas[i-byte(i>k),j-byte(j>l)];

writeln('Результат: ');
For i:=1 To n Do Begin
For j:=1 To m Do Write(mas[i,j] : 5) ;
Writeln;
End;
readLn;
end.

Разберешься? smile.gif

Да, разберусь. Спасибо Вам огромное! smile.gif
Удачи Вам!
Гость
mas[i,j]:=-10+random(40);{что за конструкция, можно подробнее почему именно -10}
for i:=1 to n do begin
for j:=1 to m do write(mas[i,j]:5);
volvo
Цитата
{что за конструкция, можно подробнее почему именно -10}
Чтобы в результате получались числа в интервале -10 .. 29,, а не от 0, как при обычном использовании Random(). Если тебе нужен другой интервал - поставь другие значения...

В общем случае, чтобы сгенерировать случайное число X в интервале [A .. B] нужно написать:
X := A + Random(B - A + 1);
Гость
mas[i,j]:5);{а это?}
Гость
{что за конструкция, можно подробнее почему именно -10}
Чтобы в результате получались числа в интервале -10 .. 29,, а не от 0, как при обычном использовании Random(). Если тебе нужен другой интервал - поставь другие значения...

у меня выводит блин одним из элементов массива 89 почему?
volvo
Цитата
{а это?}
А это - форматирование при выводе на печать, чтоб аккуратно печатать в столбик числа. Под каждое число выделится 5 позиций...

Цитата
у меня выводит блин одним из элементов массива 89 почему?
Приведи полностью свою программу, название компилятора и скриншот, показывающий вывод программы.
Гость
Спасибо.
Вот программа
Требуеться определить:
1)Способ заполнения массива
2)Что именно делает прога
3)Результат выполнения проги, если массив после заполнения имеет вид:{19,21,17,25,87,1,13,4}


const n=8
Type is=array[1..n] of integer;
var
a:is;
b,i,k:integer;
s:string;
Begin
Randomize;
for i:=1 to n do begin
a[i]:=-10+random(40);
write(a[i]:5);
end;
s:='задача не решена';
k:=0;
b:=a[1];
i:=1;
while i<=n do begin
if b<=a[i] then
begin
b:=a[i];
k:=i;
end;
i:=i+2;
end;
if (i>n) or (b<=a[i]) then
s= 'задача решена';
writeln(k,' ',s);
end.


Используем подсветку синтаксиса
volvo
Цитата
у меня выводит блин одним из элементов массива 89 почему?
Это не один из элементов массива равен 89, а два числа сливаются. Сделай так:

{ ... }
if (i>n) or (b<=a[i]) then
s := 'задача решена';
writeln(k:5,' ',s); { <--- Здесь тоже зададим формат для вывода }
end.
, и ты увидишь...

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

Тем более, что я просил не набирать программу здесь, а показать (скопировать или приаттачить) ГОТОВУЮ, работающую программу. Твой код из сообщения №11 даже не компилируется. Ты думаешь, мне больше делать нечего, кроме как исправлять ошибки у тебя в коде? Да кто еще знает, может там еще какие символы перепутаны, и программа вообще не будет делать того, что подразумевалось тобой. Нет рабочей программы - извини, я ничем помочь больше не могу...
Гость
Спасибо большое и на этом.
К сожалению посмотрел задание - 87 это один из 8 элементов массива {19,21,17,25,87,1,13,4}
Это кстати задание из ЕГЭ по информатике, вот не могу детям объяснить.
Lapp
Цитата(Гость @ 27.01.2010 14:30) *
К сожалению посмотрел задание - 87 это один из 8 элементов массива {19,21,17,25,87,1,13,4}
Это кстати задание из ЕГЭ по информатике, вот не могу детям объяснить.
Этого не может быть. Точка.

Гость, так не хорошо. По-видимому, ты не вьюнош, чтоб тобой понукать - но зачем нарушать правила? Зарегистрируйся, как нормальный человек, и создавай свои темы, как положено, а не флуди в чужих. Кстати, чтение Правил обязательно и для гостей..

Еще раз по теме: появление значения 87 (89) в элементах массива a в приведенном выше коде невозможно. Я, конечно, говорю про нормальный компилятор (Borland, FPC..) - за всякие ABC я не отвечаю..
Как показывает опыт, в большинстве случаев "невозможных" ошибок оказывается, что реально запускаемый код на самом деле отличается от приведенного ранее в теме. Пожалуйста, приведи текущий вариант кода - тот, в котором получается вот такая петрушка - а также свой компилятор. Тогда будем выяснять.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.