Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

четные элементы кратные чемуто

21K
03 декабря 2006 года
HEBMEH9IEMbIu
8 / / 02.12.2006
вот помогите разобраться в честь чего и откудова вдруг изменяется значение kolvo при больших значениях N...

Цитата:
{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;

11K
03 декабря 2006 года
Salamansar
83 / / 29.11.2006
У меня к тебе есть 2 вопроса:

1. что обычно пишет на выходе

2.
Цитата:
(((A[i,j])/2)=((A[i,j]) Div 2)) and (((A[i,j])/3)=((A[i,j])Div 3))

ты уверен, что скобки должны стоять именно так?

21K
04 декабря 2006 года
HEBMEH9IEMbIu
8 / / 02.12.2006
1) при N=10 на выходе kolvo получается равно -972 с копейками
При 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 ) только суть не меняется :(
547
04 декабря 2006 года
Hydra
488 / / 20.06.2006
Усли у тебя массив B объявлен как array[1..], то надо kolvo=1
11K
04 декабря 2006 года
Salamansar
83 / / 29.11.2006
Честно говоря я очень удивился, когда оказалось, что эта программа вообще что-то выводит. Если я не ошибаюсь, то у тебя неправильно написано условие:
Цитата:
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...


А для вещественных проще:
 
Код:
if (frac(a[i,j]/3)=0 then...
21K
05 декабря 2006 года
HEBMEH9IEMbIu
8 / / 02.12.2006
ага, не применимы если деление пытаться приравнять целому типу, а так условие проверяется, он же результат в память временно помещает.. поделил, проверил забыл.. :rolleyes:

если набрать скажем
 
Код:
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 уже не ноль
274
05 декабря 2006 года
Lone Wolf
1.3K / / 26.11.2006
Ну, отрицательное, это значит, что оно непроиницилизировано.
И еще, кинь сюда обьявления своих масивов
21K
05 декабря 2006 года
HEBMEH9IEMbIu
8 / / 02.12.2006
там в проге вообще есть еще и другие действа но я их не выкладываю...
значит в этом куске, прога должна найти количество элементов и их индексы в матрице расположенные ниже главной диагонали, на пересечении четных строк и четных столбцов, и эти элементы должны быть кратным 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.


я собственно нашел ошибку иззак которой прога летела ко всем чертям:)

вот в этом куске было вот так
 
Код:
{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;


это и давало сий не приятный глюкан!
кстати может кто подскажет почему все время формируется одинаковая матрица? и почему если сделать размерность 100х100 то выдается сцмма 0 а индексов элементов не выводит... и к расчету суммы приходит прога с kolvo<0
а при размерности 10х10 дважды выдает элемент с одними и темеже индексами
547
05 декабря 2006 года
Hydra
488 / / 20.06.2006
Цитата:

кстати может кто подскажет почему все время формируется одинаковая матрица?


randomize перед random нужен.

21K
05 декабря 2006 года
HEBMEH9IEMbIu
8 / / 02.12.2006
Цитата: 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.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог