Помощь - Поиск - Пользователи - Календарь
Полная версия: Функция
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Lesnik
Дан целочисленный массив с кол-вом элементов 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.

Но не работает, помогите отредактировать.
Спасибо.
мисс_граффити
 Function f(const c:mas):integer; 

вот... иначе переполнение стека получишь.
или, если массив собираешься менять, пиши var
Lesnik
Цитата(мисс_граффити @ 13.12.2006 22:08) *

 Function f(const c:mas):integer; 

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

Если не тяжело, то исправьте в коде.
мисс_граффити
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
Не работает sad.gif
Программа просит ввести количество чисел, потом завершает работу и не выводит никаких индексов sad.gif
мисс_граффити
так я и не обещала, что будет работать правильно.
я показала, где ошибка, из-за которой не компилируется... а отлаживай уж ты сам...

если исправить ошибку, о которой я тебе написала в сообщении 4, то прога делает вот что:
вводим 4
выводит 4,8
вводим 8
выводит 4,8,16
Lesnik
Цитата(мисс_граффити @ 13.12.2006 23:17) *

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


В том и дело, что я не понял тему функция/процедура, а завтра надо сдать задачи sad.gif
мисс_граффити
а что ты хочешь получить в итоге?
я бы сказала, что степени двойки - это 1,2,4...
но тогда и твоя первая прога работает неправильно.
Lesnik
Цитата(мисс_граффити @ 13.12.2006 23:45) *

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

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

там i1 должно быть!
Lesnik
Цитата(мисс_граффити @ 13.12.2006 23:54) *

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

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

Теперь всё нормально. Огромное спасибо! rolleyes.gif
мисс_граффити
ну так... относительно нормально. dry.gif
но лишь бы тебе нравилось...
Lesnik
Если не тяжело, можете ещё посмотреть задачу?
Сделать надо через процедуру.
Дана матрица А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.
мисс_граффити
такая маленькая матрица переполнение стека не вызовет, но все равно - зачем его забивать всякой ерундой?
напиши const, если не хочешь менять матрицу, и var - если хочешь, как я тебе показывала в прошлой задаче.
замени в подпрограмее i,j на i1, j1 (тоже обсуждали в прошлой задаче).
и сделай нормальное форматирование! сложно читать, когда под begin нет соответствующего ему end!
Lesnik
Вот то, что пока получается.
Начальную матрица строится, а строки не удаляются (сама подпрограмма не работает).

Код

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
мисс_граффити
ты вообще не читаешь, что я тебе пишу?
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
Функция возвращает 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
Цитата
Функция возвращает true если ее входной параметр X - степень двойки:
blink.gif Вообще-то эта функция пишется в одну строку:

Общие вопросы по математике.
("Является ли число степенью двойки?")

FAQ для кого делается, хотелось бы узнать?
мисс_граффити
Цитата(klem4 @ 16.12.2006 16:43) *

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

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

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


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