В заданной матрице сформированной случайно вставить второй столбец перед всеми стольбцами,в которых нет отричательных элементов. Не могу найти ошибку...логическая...
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
Всё работает Спасибо!
Krjuger
7.06.2009 19:45
Цитата
Учись читать доки полностью, и на языке оригинала...
Обрати внимание на вторую половину фразы volvo, которую ты процитировал. Конечно, ребята молодцы, что перевели, но зря они обрезали . Уж лучше бы укоротили "длинну" .
Так что рекомендации остаются прежними .
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.