четные элементы кратные чемуто
Цитата:
{perebor elementov pod glavnoy diagonal'yu}
kolvo:=0;
for i:=1 to N do {naxojdenie elementov}
begin
for j:=1 to i-1 do {nije glsvnoy diagonali}
begin
{proverka 4etnisti & kratnosti 3 elementa}
if (((A[i,j])/2)=((A[i,j]) Div 2)) and (((A[i,j])/3)=((A[i,j])Div 3)) then
begin
{pods4et & zapominanie nadennyx elementov}
kolvo:=kolvo+1;
B[kolvo]:=A[i,j];
end;
writeln('KOLVO=',kolvo); {tut neponiatno kak kolvo meniaet svoe zna4enie}
end;
end;
kolvo:=0;
for i:=1 to N do {naxojdenie elementov}
begin
for j:=1 to i-1 do {nije glsvnoy diagonali}
begin
{proverka 4etnisti & kratnosti 3 elementa}
if (((A[i,j])/2)=((A[i,j]) Div 2)) and (((A[i,j])/3)=((A[i,j])Div 3)) then
begin
{pods4et & zapominanie nadennyx elementov}
kolvo:=kolvo+1;
B[kolvo]:=A[i,j];
end;
writeln('KOLVO=',kolvo); {tut neponiatno kak kolvo meniaet svoe zna4enie}
end;
end;
1. что обычно пишет на выходе
2.
Цитата:
(((A[i,j])/2)=((A[i,j]) Div 2)) and (((A[i,j])/3)=((A[i,j])Div 3))
ты уверен, что скобки должны стоять именно так?
При N=100 программа вылетает с ошибкой
"Turbo Pascal
препроцессор NTVDM обнаружил недопустимую инструкцию.
CS:0552 IP:47b2 OP:ff ff 00 00 00"
2) ну можно так ( (A[i,j])/2=(A[i,j]) Div 2 ) and ( (A[i,j])/3=(A[i,j]) Div 3 ) только суть не меняется :(
Усли у тебя массив B объявлен как array[1..], то надо kolvo=1
Цитата:
if (((A[i,j])/2)=((A[i,j]) Div 2)) and (((A[i,j])/3)=((A[i,j])Div 3)) then
Такие операции как div и mod не применимы к вещественному типу, а делить нельзя целые типы.
Условие четности можно проверить так(если это целый тип):
Код:
if (A[i,j] mod 2)=0 then ...
или(если вещественный тип):
Код:
if (frac(A[i,j]/2)=0 then ...
Условие деления на 3 можно проверить, сложив все цифры в числе и разделив на 3(предворительно правда надо вычленить эти цифры):
Код:
str(a[i,j],st,);
l:=lenght(st);
for p:=1 to l do val(st,c,' ');
if (c mod 3)=0 then...
l:=lenght(st);
for p:=1 to l do val(st,c,' ');
if (c mod 3)=0 then...
А для вещественных проще:
Код:
if (frac(a[i,j]/3)=0 then...
если набрать скажем
Код:
write('3/2= ', 3/2:2:2,' 3 div 2 = ', 3 div 2);
то увидим на экране 3/2= 1,5 3 div 2 = 1
а массив у меня типа целого,
и проверка условия набрана верно, проверял проваливаюсь на выполнение кода после условия, но не всегда...
проблема не в этом! проблема в том что после проверки условия, и выполнения кода после условия, должен начаться новый цикл, и вот перед этим началом необъяснимым образом меняется значение kolvo,
хотя с данной переменной никаких операций непроизводится по коду
кстати после написания кода дальше, в этой части проблема исчезла
но все равно kolvo какимто образом становится отрицательным значением -720 или -1002 если перезапустить комп
to Hydra
kolvo =1 становится когда выполнится условие, так что когда идет обращение к элементу массива Б kolvo уже не ноль
И еще, кинь сюда обьявления своих масивов
значит в этом куске, прога должна найти количество элементов и их индексы в матрице расположенные ниже главной диагонали, на пересечении четных строк и четных столбцов, и эти элементы должны быть кратным 3, вывести сумму первых 5ти минимальных и их индексы
Код:
program labuda;
const N=10; {razmernost matricy}
var i,j,k: integer; {registriruem peremennye}
A:array[1..N, 1..N] of integer; {osnovnoy massiv}
B:array[1..(2*N)] of integer; {dopolnitelnyy massiv}
min, max, kolvo, sumAij: integer;
sg, sa, sk: real;
{--------------------------------}
begin {main}
for i:=1 to N do
begin
for j:=1 to N do A[i,j]:=1234-2*Random(1234);
end;
{poisk 4etnyx elementov nije glavnoy diagonali na perese4enii 4etnyx strok &
stolbcov, kratnyx 3m}
kolvo:=0;
for i:=1 to N do
begin
for j:=1 to (i-1) do
begin
{proverka perese4eniya 4etnyx strok & 4etnyx stolbcov}
if ((i/2)=(i Div 2)) and ((j/2)=(j Div 2)) then
begin
{proverka 4etnosti & kratnosti 3m}
if ((A[i,j]/2)=(A[i,j] div 2)) and ((A[i,j]/3)=(A[i,j] div 3)) then
begin
{proverka dopolnitelnogo usloviya}
if (Abs(A[i,j]))<=1111 then
begin
{soxranenie naydennyx elementov & indeksov}
kolvo:=kolvo+1;
B[kolvo]:=A[i,j];
B[kolvo+1]:=i;
B[kolvo+2]:=j;
end;
end;
end;
end;
end;
{uporiado4ivaem naydennye elementy po vozrastaniyu}
if kolvo>0 then
begin
for i:=1 to (3*kolvo) do
begin
for j:=1 to (3*kolvo) do
begin
if (B)>=(B[j]) then
begin
k:=B;
B:=B[j];
B[j]:=k;
k:=B[i+1];
B[i+1]:=B[j+1];
B[j+1]:=k;
k:=B[i+2];
B[i+2]:=B[j+2];
B[j+2]:=k;
end;
j:=j+2;
end;
i:=i+2;
end;
{ras4et summy y vyvod na ekran}
sumAij:=0;
writeln('kolvo=',kolvo);
for i:=1 to (3*kolvo) do
begin
{ writeln('kolvo=',kolvo);}
if i<=12 then
begin
sumAij:=sumAij+B;
writeln('i=',i);
if i=1 then
begin
writeln('index ',i,'-go elementa [',B[i+1],',',B[i+2],'] ');
end
else
begin
writeln('index ',(i div 3)+1,'-go elementa [',B[i+1],',',B[i+2],'] ');
end;
end;
i:=i+2;
end;
writeln('suuma 4etnyx kratnyx 3m =', sumAij);
end
else
begin
writeln('net 4etnyx kratnyx 3m');
end;
readln;
end.
const N=10; {razmernost matricy}
var i,j,k: integer; {registriruem peremennye}
A:array[1..N, 1..N] of integer; {osnovnoy massiv}
B:array[1..(2*N)] of integer; {dopolnitelnyy massiv}
min, max, kolvo, sumAij: integer;
sg, sa, sk: real;
{--------------------------------}
begin {main}
for i:=1 to N do
begin
for j:=1 to N do A[i,j]:=1234-2*Random(1234);
end;
{poisk 4etnyx elementov nije glavnoy diagonali na perese4enii 4etnyx strok &
stolbcov, kratnyx 3m}
kolvo:=0;
for i:=1 to N do
begin
for j:=1 to (i-1) do
begin
{proverka perese4eniya 4etnyx strok & 4etnyx stolbcov}
if ((i/2)=(i Div 2)) and ((j/2)=(j Div 2)) then
begin
{proverka 4etnosti & kratnosti 3m}
if ((A[i,j]/2)=(A[i,j] div 2)) and ((A[i,j]/3)=(A[i,j] div 3)) then
begin
{proverka dopolnitelnogo usloviya}
if (Abs(A[i,j]))<=1111 then
begin
{soxranenie naydennyx elementov & indeksov}
kolvo:=kolvo+1;
B[kolvo]:=A[i,j];
B[kolvo+1]:=i;
B[kolvo+2]:=j;
end;
end;
end;
end;
end;
{uporiado4ivaem naydennye elementy po vozrastaniyu}
if kolvo>0 then
begin
for i:=1 to (3*kolvo) do
begin
for j:=1 to (3*kolvo) do
begin
if (B)>=(B[j]) then
begin
k:=B;
B:=B[j];
B[j]:=k;
k:=B[i+1];
B[i+1]:=B[j+1];
B[j+1]:=k;
k:=B[i+2];
B[i+2]:=B[j+2];
B[j+2]:=k;
end;
j:=j+2;
end;
i:=i+2;
end;
{ras4et summy y vyvod na ekran}
sumAij:=0;
writeln('kolvo=',kolvo);
for i:=1 to (3*kolvo) do
begin
{ writeln('kolvo=',kolvo);}
if i<=12 then
begin
sumAij:=sumAij+B;
writeln('i=',i);
if i=1 then
begin
writeln('index ',i,'-go elementa [',B[i+1],',',B[i+2],'] ');
end
else
begin
writeln('index ',(i div 3)+1,'-go elementa [',B[i+1],',',B[i+2],'] ');
end;
end;
i:=i+2;
end;
writeln('suuma 4etnyx kratnyx 3m =', sumAij);
end
else
begin
writeln('net 4etnyx kratnyx 3m');
end;
readln;
end.
я собственно нашел ошибку иззак которой прога летела ко всем чертям:)
вот в этом куске было вот так
Код:
{ras4et summy y vyvod na ekran}
for i:=1 to (kolvo) do
begin
if i<=5 then
begin
sumAij:=sumAij+B;
writeln('index ',i,'-go elementa [',B[i+1],',',B[i+2],'] ');
i:=i+2;
end;
end;
for i:=1 to (kolvo) do
begin
if i<=5 then
begin
sumAij:=sumAij+B;
writeln('index ',i,'-go elementa [',B[i+1],',',B[i+2],'] ');
i:=i+2;
end;
end;
это и давало сий не приятный глюкан!
кстати может кто подскажет почему все время формируется одинаковая матрица? и почему если сделать размерность 100х100 то выдается сцмма 0 а индексов элементов не выводит... и к расчету суммы приходит прога с kolvo<0
а при размерности 10х10 дважды выдает элемент с одними и темеже индексами
Цитата:
кстати может кто подскажет почему все время формируется одинаковая матрица?
randomize перед random нужен.
Цитата: Hydra
randomize перед random нужен.
а, все! понял :) спс
вот.. вроде нашел где косячит... после нахождения нужных элементов и сохранения их индексов, должна произойти сортировка...
так вот перед сортировкой массив Б сбивается! некоторые значения в нем меняются метсами а некоторые просто теряются! исчезают в неизвестность! а вместо них появляются нули.. вот от чего это может быть?
Код:
program labuda;
const N=10; {razmernost matricy}
var i,j,k: integer; {registriruem peremennye}
A:array[1..N, 1..N] of integer; {osnovnoy massiv}
B:array[1..(2*N)] of integer; {dopolnitelnyy massiv}
min, max, kolvo, sumAij: integer;
sg, sa, sk: real;
{--------------------------------}
begin {main}
Randomize;
for i:=1 to N do
begin
for j:=1 to N do A[i,j]:=1234-2*Random(1234);
end;
{poisk 4etnyx elementov nije glavnoy diagonali na perese4enii 4etnyx strok &
stolbcov, kratnyx 3m}
kolvo:=0;
for i:=1 to N do
begin
for j:=1 to (i-1) do
begin
{proverka perese4eniya 4etnyx strok & 4etnyx stolbcov}
if ((i/2)=(i Div 2)) and ((j/2)=(j Div 2)) then
begin
{proverka 4etnosti & kratnosti 3m}
if ((A[i,j]/2)=(A[i,j] div 2)) and ((A[i,j]/3)=(A[i,j] div 3)) then
begin
{proverka dopolnitelnogo usloviya}
if (Abs(A[i,j]))<=1111 then
begin
{soxranenie naydennyx elementov & indeksov}
kolvo:=kolvo+1;
B[kolvo]:=A[i,j];
B[kolvo+1]:=i;
B[kolvo+2]:=j;
writeln('B[',kolvo,']=', B[kolvo], ' i=',B[kolvo+1], ' j=',B[kolvo+2]);
end;
end;
end;
end;
end;
[COLOR="Red"]ВОТ ТУТ УМИРАЕТ МАССИВ Б! ОТ ЧЕГО???[/COLOR]
его же еще не трогали...
writeln('kolvo=',kolvo);
for i:=1 to (3*kolvo) do
begin
writeln('B[',i,']=', B, ' i=',B[i+1], ' j=',B[i+2]);
i:=i+2;
end;
{uporiado4ivaem naydennye elementy po vozrastaniyu}
if kolvo>0 then
begin
for i:=1 to (3*kolvo) do
begin
for j:=1 to (3*kolvo) do
begin
if (B)<=(B[j]) then
begin
k:=B;
B:=B[j];
B[j]:=k;
k:=B[i+1];
B[i+1]:=B[j+1];
B[j+1]:=k;
k:=B[i+2];
B[i+2]:=B[j+2];
B[j+2]:=k;
end;
j:=j+2;
end;
i:=i+2;
end;
{ras4et summy y vyvod na ekran}
sumAij:=0;
writeln('kolvo=',kolvo);
for i:=1 to (3*kolvo) do
begin
{ writeln('kolvo=',kolvo);}
if i<=12 then
begin
sumAij:=sumAij+B;
writeln('i=',i);
if i=1 then
begin
writeln('index ',i,'-go elementa [',B[i+1],',',B[i+2],'] ');
end
else
begin
writeln('index ',(i div 3)+1,'-go elementa [',B[i+1],',',B[i+2],'] ');
end;
end;
i:=i+2;
end;
writeln('summa 4etnyx kratnyx 3m =', sumAij);
end
else
begin
writeln('net 4etnyx kratnyx 3m');
end;
for i:=1 to (3*kolvo) do
begin
writeln('B[',i,']=', B, ' i=',B[i+1], ' j=',B[i+2]);
i:=i+2;
end;
readln;
end.
const N=10; {razmernost matricy}
var i,j,k: integer; {registriruem peremennye}
A:array[1..N, 1..N] of integer; {osnovnoy massiv}
B:array[1..(2*N)] of integer; {dopolnitelnyy massiv}
min, max, kolvo, sumAij: integer;
sg, sa, sk: real;
{--------------------------------}
begin {main}
Randomize;
for i:=1 to N do
begin
for j:=1 to N do A[i,j]:=1234-2*Random(1234);
end;
{poisk 4etnyx elementov nije glavnoy diagonali na perese4enii 4etnyx strok &
stolbcov, kratnyx 3m}
kolvo:=0;
for i:=1 to N do
begin
for j:=1 to (i-1) do
begin
{proverka perese4eniya 4etnyx strok & 4etnyx stolbcov}
if ((i/2)=(i Div 2)) and ((j/2)=(j Div 2)) then
begin
{proverka 4etnosti & kratnosti 3m}
if ((A[i,j]/2)=(A[i,j] div 2)) and ((A[i,j]/3)=(A[i,j] div 3)) then
begin
{proverka dopolnitelnogo usloviya}
if (Abs(A[i,j]))<=1111 then
begin
{soxranenie naydennyx elementov & indeksov}
kolvo:=kolvo+1;
B[kolvo]:=A[i,j];
B[kolvo+1]:=i;
B[kolvo+2]:=j;
writeln('B[',kolvo,']=', B[kolvo], ' i=',B[kolvo+1], ' j=',B[kolvo+2]);
end;
end;
end;
end;
end;
[COLOR="Red"]ВОТ ТУТ УМИРАЕТ МАССИВ Б! ОТ ЧЕГО???[/COLOR]
его же еще не трогали...
writeln('kolvo=',kolvo);
for i:=1 to (3*kolvo) do
begin
writeln('B[',i,']=', B, ' i=',B[i+1], ' j=',B[i+2]);
i:=i+2;
end;
{uporiado4ivaem naydennye elementy po vozrastaniyu}
if kolvo>0 then
begin
for i:=1 to (3*kolvo) do
begin
for j:=1 to (3*kolvo) do
begin
if (B)<=(B[j]) then
begin
k:=B;
B:=B[j];
B[j]:=k;
k:=B[i+1];
B[i+1]:=B[j+1];
B[j+1]:=k;
k:=B[i+2];
B[i+2]:=B[j+2];
B[j+2]:=k;
end;
j:=j+2;
end;
i:=i+2;
end;
{ras4et summy y vyvod na ekran}
sumAij:=0;
writeln('kolvo=',kolvo);
for i:=1 to (3*kolvo) do
begin
{ writeln('kolvo=',kolvo);}
if i<=12 then
begin
sumAij:=sumAij+B;
writeln('i=',i);
if i=1 then
begin
writeln('index ',i,'-go elementa [',B[i+1],',',B[i+2],'] ');
end
else
begin
writeln('index ',(i div 3)+1,'-go elementa [',B[i+1],',',B[i+2],'] ');
end;
end;
i:=i+2;
end;
writeln('summa 4etnyx kratnyx 3m =', sumAij);
end
else
begin
writeln('net 4etnyx kratnyx 3m');
end;
for i:=1 to (3*kolvo) do
begin
writeln('B[',i,']=', B, ' i=',B[i+1], ' j=',B[i+2]);
i:=i+2;
end;
readln;
end.