Помощь - Поиск - Пользователи - Календарь
Полная версия: матрица MXN
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Svetlana
В заданной матрице сформированной случайно вставить второй столбец перед всеми стольбцами,в которых нет отричательных элементов. Не могу найти ошибку...логическая...

program Project4;

{$APPTYPE CONSOLE}

uses
SysUtils;
var n,m,i,j:integer; a,b:array of array of integer; flag:boolean;
begin
randomize;
writeln('vvedite razmernost matricy(lines):'); readln(n); //вводим размерность
writeln('vvedite razmernost matricy(columns):'); readln(m);
setlength(a,n,m); setlength(b,n,m);
writeln('Ischodnay matrica razmerom ',n,'X',m,':');
writeln;
for i:=0 to n-1 do begin
for j:=0 to m-1 do begin a[i,j]:=random(11)-5; write(a[i,j]:3,' ') end; writeln end; //заполняем



for j:=0 to m-1 do begin
flag:=true;i:=0;
while (i<=n-1)and(flag=true) do begin
if a[i,j]>0 then flag:=true else flag:=false;
i:=i+1
end;

if flag=true then begin m:=m+1; setlength(b,n,m);
for i:=0 to n-1 do begin
b[i,j]:=a[i,1];
b[i,j+1]:=a[i,j]
end;
end
else for i:=0 to n-1 do
b[i,j]:=a[i,j];end;
writeln('Konechnay matrica razmerom ',n,'X',m,':');
writeln;
for i:=0 to n-1 do begin // вывод
for j:=0 to m-1 do write(b[i,j]:3,' '); writeln end;
readln
{ TODO -oUser -cConsole Main : Insert code here }
end.
Lapp
Цитата(Svetlana @ 6.06.2009 1:04) *
Не могу найти ошибку...логическая...
А в чем она выражается? Симптомы какие?
Svetlana
Вставляет второй столбец не туда,куда надо.При этом пропадают некоторые столбцы из первоначальной матрицы. И откуда так получается,что последние столбцы становятся нулевыми...
Krjuger
Цитата
a,b:array of array of integer;

я думаю это не логическая ошибка,но ошибка....
Девушка,что за setlength??? вы работаете с матрицей,а не строкой.....

a: array[1..50,1..50] of integer;
b:array [1..50] of integer;


Я думаю вам больше матрица и не нужна,просо скажите,что если больше,то прога кукиш покажет.А еще нам надо запомнить вашу строку,а то вдруг там есть искомые елементы,тогда наша вторая строка тут же станет трьетьей и тд.


for i:=1 to n do begin

for j:=1 to m do begin
a[i,j]:=random(11)-5;
write(a[i,j]:3,' ')
end;

writeln;//точку с запятой забыли
end; //заполняем

for i:=1 to m do begin
b[i]:=a[i,2];
end;

for j:=1 to m do begin
flag:=false;
i:=1;
while (i<=n) or (flag=false) do begin//надо чтобы мы выходили при выполнении любого из условий,а то если у
//тебя флаг тру но не конец строки,ты не выйдеш из цикла,и если конец,но не флаг фалс,то опять таки из
//цикла ты не выходиш и у тебя зацикливание.
if a[i,j]>0 then flag:=true else flag:=false;
i:=i+1
end;

if flag=true then begin

for i:=1 to m do begin
a[i,j]:=b[i];
end;
end;
end;

writeln('Konechnay matrica razmerom ',n,'X',m,':');
writeln;
for i:=1 to n do begin // вывод
for j:=1 to m do
write(a[i,j]:3,' ');
writeln;//не забывай про точку с запятой
end;
readln;


Паскаля нету,сижу не с компа,а с ноута,если что то пропустил или ошибся,поправьте пожалуста.

А к тебе вопрос,ты ВСТАВЛЯЕШ строку,или заменяеш строку,по твоему коду я прихожу к выводу,что второе,потому,что если бы ты вставляла,то вторая матрица была бы жирнее первой.
volvo
Цитата
Девушка,что за setlength??? вы работаете с матрицей,а не строкой.....
SetLength - работа с дин. массивами... Тема уходит в Дельфи, поскольку используются специфические средства, отсутствующие в стандартном Паскале...

Добавлено через 4 мин.
Цитата
Не могу найти ошибку...логическая...
Угу... Ты внутри цикла, перебирающего столбцы, меняешь их количество. Этого делать нельзя (по крайней мере - не циклом For)...
Krjuger
Значит я не совсем коректно понимаю фразу
Цитата

SetLength устанавливает длинну строки S в Len. S может быть типа AnsiString, ShortString или WideString. Для ShortString Len может быть максимум 255. Для AnsiString может быть любое значение. Для AnsiString только SetLength должно использоваться для установки длинны

Взято из FP.
Хотя для OP уже пишется про динамические массивы...
Svetlana
Цитата(volvo @ 6.06.2009 0:52) *

SetLength - работа с дин. массивами... Тема уходит в Дельфи, поскольку используются специфические средства, отсутствующие в стандартном Паскале...

Добавлено через 4 мин.
Угу... Ты внутри цикла, перебирающего столбцы, меняешь их количество. Этого делать нельзя (по крайней мере - не циклом For)...


Вот этого я и не знала...А почему нельзя?
Krjuger
А потому что их нумирация сбивается,и тебе надо принудительно после каждой операции заново нумеровать каждый столбец.
volvo
Цитата
Взято из FP.
Не вырывай фразы из контекста...

Цитата(rtl.pdf Параграф 36.9.278)
Description: SetLength sets the length of the string S to Len. S can be an ansistring, a short string or a widestring. For ShortStrings, Len can maximally be 255. For AnsiStrings it can have any value. For AnsiString strings, SetLength {nem must} be used to set the length of the string.
In the case of a dynamical array A, setlength sets the number of elements. The elements are numbered from index 0, so the count runs from 0 to Len-1. If Zero is specified, the array is cleared.
Учись читать доки полностью, и на языке оригинала...

Цитата
от этого я и не знала...А почему нельзя?
На самом деле у тебя все гораздо больше намудрено... Проблема - в том, что когда ты вставляешь столбец в массив B, он должен вставляться не как J-ый, а как последний (или 2 последних), иначе нумерация собьется. Смотри, насколько все проще:
program Project4;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
n, m, i, j: integer;
a, b:array of array of integer;
flag:boolean;
len: integer;
begin
randomize;
writeln('vvedite razmernost matricy(lines):'); readln(n);
writeln('vvedite razmernost matricy(columns):'); readln(m);
setlength(a,n,m);
setlength(b,n,0); // <---

writeln('Ischodnay matrica razmerom ',n,'X',m,':');
writeln;
for i:=0 to n-1 do begin
for j:=0 to m-1 do begin
a[i,j]:=random(51)-5; write(a[i,j]:3,' ')
end;
writeln
end;

len := 0;
for j := 0 to m - 1 do begin
flag := true;
for i := 0 to n - 1 do flag := flag and (a[i, j] > 0);

if flag then begin
writeln('#', j);
Len := Len + 1;
setlength(b, n, Len);
for i := 0 to n - 1 do b[i, len-1] := a[i, 1];
end;
Len := Len + 1;
setlength(b, n, Len);
for i := 0 to n - 1 do b[i, len-1] := a[i, j];
end;

writeln('Konechnay matrica razmerom ',n,'X',len,':');
writeln;
for i:=0 to n-1 do begin
for j:=0 to len-1 do write(b[i,j]:3,' ');
writeln
end;
setlength(a, 0, 0); setlength(b, 0, 0); // <---
readln
end.
Тестировалось в FPC, могут быть несоответствия в обработке Дельфями, говори, если что...
Svetlana
Всё работает good.gif Спасибо!
Krjuger
Цитата

Учись читать доки полностью, и на языке оригинала...

Извини,но я не доки читал,а взял с сайта free pascal,вот тебе даже ссылка,что там написано.
http://www.freepascal.ru/wiki/index.php?title=SetLength
Lapp
Цитата(Krjuger @ 7.06.2009 16:45) *
Извини,но я не доки читал,а взял с сайта free pascal,вот тебе даже ссылка,что там написано.
http://www.freepascal.ru/wiki/index.php?title=SetLength
Обрати внимание на вторую половину фразы volvo, которую ты процитировал. Конечно, ребята молодцы, что перевели, но зря они обрезали norespect.gif. Уж лучше бы укоротили "длинну" smile.gif.

Так что рекомендации остаются прежними smile.gif.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.