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

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

Форум «Всё о Паскале» _ Делфи _ матрица MXN

Автор: Svetlana 6.06.2009 4:04

В заданной матрице сформированной случайно вставить второй столбец перед всеми стольбцами,в которых нет отричательных элементов. Не могу найти ошибку...логическая...

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 6.06.2009 4:26

Цитата(Svetlana @ 6.06.2009 1:04) *
Не могу найти ошибку...логическая...
А в чем она выражается? Симптомы какие?

Автор: Svetlana 6.06.2009 4:47

Вставляет второй столбец не туда,куда надо.При этом пропадают некоторые столбцы из первоначальной матрицы. И откуда так получается,что последние столбцы становятся нулевыми...

Автор: Krjuger 6.06.2009 4:48

Цитата
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 6.06.2009 4:52

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

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

Автор: Krjuger 6.06.2009 4:59

Значит я не совсем коректно понимаю фразу

Цитата

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

Взято из FP.
Хотя для OP уже пишется про динамические массивы...

Автор: Svetlana 6.06.2009 5:10

Цитата(volvo @ 6.06.2009 0:52) *

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

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


Вот этого я и не знала...А почему нельзя?

Автор: Krjuger 6.06.2009 5:14

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

Автор: volvo 6.06.2009 5:30

Цитата
Взято из 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 6.06.2009 6:01

Всё работает good.gif Спасибо!

Автор: Krjuger 7.06.2009 19:45

Цитата

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

Извини,но я не доки читал,а взял с сайта free pascal,вот тебе даже ссылка,что там написано.
http://www.freepascal.ru/wiki/index.php?title=SetLength

Автор: Lapp 7.06.2009 22:45

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

Так что рекомендации остаются прежними smile.gif.