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

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

Форум «Всё о Паскале» _ Задачи _ Функция

Автор: Lesnik 14.12.2006 1:43

Дан целочисленный массив с кол-вом элементов N. Напечатать те его элементы, индексы которых являются степенью двойки (2,4,8,16 итд)

Код

program ggg;
uses crt;
var
mas:array[1..30000] of integer;
i,index:integer;
begin
clrscr;
Writeln('Vvedite koli4estvo 4isel');
Readln(n);
randomize;
for i:=1 to n do
  begin
  mas[i]:=random(99);
  writeln(mas[i],' ');
  end;
index:=2;
writeln;
writeln('Vivod');
for i:=1 to n do
  begin
  if(i=index) then
    begin
    index:=index*2;
    writeln(i,' = ',mas[i]);
    end;
  end;
readln;
end.


Как это можно сделать через функцию?

Пытался передалать, получилось вот это:
Код

program COK;
uses crt;
type
mas=array[1..30000]of integer;
var
a:mas;
i,n:integer;
   Function f(c:mas):integer;
   var
   index,i1:integer;
   begin
   index:=2;
   for i1:=1 to n do
   begin
   If i=index then
      begin
      index:=index*2;
      writeln(index);
      end;
   end;
end;
begin
clrscr;
Writeln('Vvedite koli4estvo');
readln(n);
For i:=1 to n do
    begin
    a[i]:=random(99);
    end;
f(a);
end.

Но не работает, помогите отредактировать.
Спасибо.

Автор: мисс_граффити 14.12.2006 2:08

 Function f(const c:mas):integer; 

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

Автор: Lesnik 14.12.2006 2:15

Цитата(мисс_граффити @ 13.12.2006 22:08) *

 Function f(const c:mas):integer; 

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

Если не тяжело, то исправьте в коде.

Автор: мисс_граффити 14.12.2006 2:17

blink.gif

program COK;
uses crt;
type
mas=array[1..30000]of integer;
var
a:mas;
i,n:integer;
Function f(const c:mas):integer;
var
index,i1:integer;
begin
index:=2;
for i1:=1 to n do
begin
If i=index then
begin
index:=index*2;
writeln(index);
end;
end;
end;
begin
clrscr;
Writeln('Vvedite koli4estvo');
readln(n);
For i:=1 to n do
begin
a[i]:=random(99);
end;
f(a);
end.

насколько я вижу, выводить он будет индексы, а не элементы...
и не совсем поняла, зачем внутри ф-ции использовать глобальную переменную i... вроде про i1 речь шла.

Автор: Lesnik 14.12.2006 2:54

Не работает sad.gif
Программа просит ввести количество чисел, потом завершает работу и не выводит никаких индексов sad.gif

Автор: мисс_граффити 14.12.2006 3:17

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

если исправить ошибку, о которой я тебе написала в сообщении 4, то прога делает вот что:
вводим 4
выводит 4,8
вводим 8
выводит 4,8,16

Автор: Lesnik 14.12.2006 3:38

Цитата(мисс_граффити @ 13.12.2006 23:17) *

а отлаживай уж ты сам...


В том и дело, что я не понял тему функция/процедура, а завтра надо сдать задачи sad.gif

Автор: мисс_граффити 14.12.2006 3:45

а что ты хочешь получить в итоге?
я бы сказала, что степени двойки - это 1,2,4...
но тогда и твоя первая прога работает неправильно.

Автор: Lesnik 14.12.2006 3:51

Цитата(мисс_граффити @ 13.12.2006 23:45) *

а что ты хочешь получить в итоге?
я бы сказала, что степени двойки - это 1,2,4...
но тогда и твоя первая прога работает неправильно.

Первая прога работает правильно. Она выводит все степени двойки (до определённого момента).
Как сделать через функцию незнаю unsure.gif

Автор: мисс_граффити 14.12.2006 3:54

я же тебе сказала: исправь

If i=index then

там i1 должно быть!

Автор: Lesnik 14.12.2006 4:02

Цитата(мисс_граффити @ 13.12.2006 23:54) *

я же тебе сказала: исправь
If i=index then

там i1 должно быть!

Теперь всё нормально. Огромное спасибо! rolleyes.gif

Автор: мисс_граффити 14.12.2006 4:07

ну так... относительно нормально. dry.gif
но лишь бы тебе нравилось...

Автор: Lesnik 14.12.2006 4:29

Если не тяжело, можете ещё посмотреть задачу?
Сделать надо через процедуру.
Дана матрица Аmxn. Исключить строки, содержащие хотябы один нулевой элемент.

Код без процедуры:

Код

Program BAJEHOK;
uses crt;
var
mas:array[1..8,1..8] of real;
n,i,j: integer;
no_null: boolean;
begin
clrscr;
n:=8;
randomize;
for i := 1 to n-1 do
    for j := 1 to n-1 do
    mas[i, j] := random(10);
    writeln('Matrix');
    writeln;
for i := 1 to n-1 do
    begin
    for j := 1 to n-1 do
    write(mas[i, j]:5:0);
    writeln;

end;
writeln;
writeln('Bez nulei...');
writeln;
for i := 1 to n-1 do
begin
no_null := true;
for j := 1 to n-1 do
no_null := no_null and (mas[i, j] <> 0);
if no_null then
     begin
     for j := 1 to n-1 do
     write(mas[i, j]:5:0);
     writeln
     end;
end;
readln;
end.


А теперь то убожество, которое я попытался сделать через процедуру:
Код



Program BAJEHOK;
uses crt;
type
mas=array[1..8,1..8]of integer;
var
a,b:mas;
n,i,j: integer;
no_null: boolean;
procedure P(c:mas; str,stb:byte;var kol:byte);
var
i1,j1:integer;
begin
for i1 := 1 to n-1 do
    begin
    no_null := true;
    for j1 := 1 to n-1 do
    no_null := no_null and (c[i, j] <> 0);
    if no_null then
       begin
        for j1 := 1 to n-1 do
        write(c[i, j]);
        writeln
        end;
    end;


end;

begin
clrscr;
n:=8;
randomize;
for i := 1 to n-1 do
    for j := 1 to n-1 do
    a[i, j] := random(10);
    writeln('Matrix');
    writeln;
for i := 1 to n-1 do
    begin
    for j := 1 to n-1 do
    write(a[i, j]);
    writeln;

end;

writeln;
writeln('Bez nulei...');
writeln;
readln;
P({не знаю, что выводить});

end.

Автор: мисс_граффити 14.12.2006 14:09

такая маленькая матрица переполнение стека не вызовет, но все равно - зачем его забивать всякой ерундой?
напиши const, если не хочешь менять матрицу, и var - если хочешь, как я тебе показывала в прошлой задаче.
замени в подпрограмее i,j на i1, j1 (тоже обсуждали в прошлой задаче).
и сделай нормальное форматирование! сложно читать, когда под begin нет соответствующего ему end!

Автор: Lesnik 15.12.2006 14:50

Вот то, что пока получается.
Начальную матрица строится, а строки не удаляются (сама подпрограмма не работает).

Код

Program BAJEHOK;
uses crt;
type
matr=array[1..8,1..8]of integer;
var
mas:matr;
n,i,j: integer;
no_null: boolean;

Procedure P(m:matr;x,y:integer);
var
i1,j1:integer;
begin
for i1:= 1 to n-1 do
begin
no_null := true;
for j1:= 1 to n-1 do
no_null := no_null and (mas[i, j] <> 0);
if no_null then
     begin
     for j1:= 1 to n-1 do
     write(m[i, j]);
     writeln
     end;
end;
end;

begin
clrscr;
n:=8;
randomize;
for i := 1 to n-1 do
    for j := 1 to n-1 do
    mas[i, j] := random(10);
    writeln('Matrix');
    writeln;
for i := 1 to n-1 do
    begin
    for j := 1 to n-1 do
    write(mas[i, j],'  ');
    writeln;
end;
writeln;
writeln('Bez nulei...');
P(mas,n,n);
writeln;
readln;
end.

Вроде надо ещё передовать строки со столбцами, но не могу понять как sad.gif

Автор: мисс_граффити 16.12.2006 20:24

ты вообще не читаешь, что я тебе пишу?

Procedure P(m:matr;x,y:integer);

выдели, пожалуйста, в этой строке слова var и const
ладно, не критично. поместится в стек маленькая матрица.
зачем здесь x,y - не понимаю. все равно ты не физически удаляешь строки, а просто не выводишь. ну ладно, тоже никому жить не мешает.
Но дальше!!!
(Админы, простите, теги не использовала, чтобы выделить жирным)
Цитата
Procedure P(m:matr;x,y:integer);
var
i1,j1:integer;
begin
for i1:= 1 to n-1 do
begin
no_null := true;
for j1:= 1 to n-1 do
no_null := no_null and (mas[i, j] <> 0);
if no_null then
begin
for j1:= 1 to n-1 do
write(m[i, j]);
writeln
end;
end;
end;

ОПЯТЬ i,j!!!!
ну неужели так сложно исправить?!
кроме того, забудь ты про mas. Он - для основной программы! в процедуре ты работаешь ТОЛЬКО с m, раз уж решил передавать как параметр!

Хочешь работать с глобальной переменной - вперед. Но тогда:
1) не передавай никаких m
2) при выводе тоже работай с глобальной.

В общем, если исправить то, о чем я тебе пишу с первого моего сообщения в этой теме - все будет работать.

Автор: klem4 16.12.2006 20:43

Функция возвращает true если ее входной параметр X - степень двойки:

function IsTwoPower(X: LongInt): Boolean;
var
i, count: Byte;
begin

i := 0; count := 0;

while (i < 32) and (count < 2) do begin
if ((X shl i) shr 31) = 1 then inc(count);
inc(i);
end;

IsTwoPower := (count = 1);

end;


Кстати единица - тоже степень двойки ...

Автор: volvo 16.12.2006 20:50

Цитата
Функция возвращает true если ее входной параметр X - степень двойки:
blink.gif Вообще-то эта функция пишется в одну строку:

http://forum.pascal.net.ru/index.php?s=&showtopic=4535&view=findpost&p=38227
("Является ли число степенью двойки?")

FAQ для кого делается, хотелось бы узнать?

Автор: мисс_граффити 16.12.2006 20:58

Цитата(klem4 @ 16.12.2006 16:43) *

Кстати единица - тоже степень двойки ...

см. сообщения 8-9

...а зачем здесь вообще эта ф-ция? предлагаете делать так:
 for i:=1 to n do
if (i - степень двойки) then
write(ar[i]);


?
что-то не поняла замысел.

Автор: klem4 16.12.2006 21:08

Замысел не понял я smile.gif Мало того что в faq не посмотрел так еще и задание неправильно понял smile.gif) Естественно так как речь идет об индексах, никакие функции ненужны ...