IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Функция, функция
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


Дан целочисленный массив с кол-вом элементов 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.

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

Сообщение отредактировано: Lesnik -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


 Function f(const c:mas):integer; 

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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


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

 Function f(const c:mas):integer; 

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

Если не тяжело, то исправьте в коде.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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 речь шла.

Сообщение отредактировано: мисс_граффити -


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


Не работает sad.gif
Программа просит ввести количество чисел, потом завершает работу и не выводит никаких индексов sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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

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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


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

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


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

Сообщение отредактировано: Lesnik -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


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

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

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


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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

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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


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

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

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

Теперь всё нормально. Огромное спасибо! rolleyes.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


Если не тяжело, можете ещё посмотреть задачу?
Сделать надо через процедуру.
Дана матрица А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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


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

Код

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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


ты вообще не читаешь, что я тебе пишу?
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) при выводе тоже работай с глобальной.

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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Функция возвращает 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;


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


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






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

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

FAQ для кого делается, хотелось бы узнать?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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

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

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

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


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 5:59
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name