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

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

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

> Функция, функция
Lesnik
сообщение 13.12.2006 21:43
Сообщение #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 - 13.12.2006 21:51
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 19)
мисс_граффити
сообщение 13.12.2006 22:08
Сообщение #2


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

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

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


 Function f(const c:mas):integer; 

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


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


Новичок
*

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

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


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

 Function f(const c:mas):integer; 

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

Если не тяжело, то исправьте в коде.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 13.12.2006 22:17
Сообщение #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 речь шла.

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


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


Новичок
*

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

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


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


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

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

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


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

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


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


Новичок
*

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

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


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

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


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

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


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

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

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


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


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


Новичок
*

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

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


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

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

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


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

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

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


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

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


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


Новичок
*

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

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


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

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

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

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


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

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

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


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lesnik
сообщение 14.12.2006 0:29
Сообщение #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.12.2006 10:09
Сообщение #14


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

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

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


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lesnik
сообщение 15.12.2006 10:50
Сообщение #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.12.2006 16:24
Сообщение #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 
 К началу страницы 
+ Ответить 
klem4
сообщение 16.12.2006 16:43
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.12.2006 16:50
Сообщение #18


Гость






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

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

FAQ для кого делается, хотелось бы узнать?
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 16.12.2006 16:58
Сообщение #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 
 К началу страницы 
+ Ответить 
klem4
сообщение 16.12.2006 17:08
Сообщение #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

 



- Текстовая версия 18.07.2025 13:54
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"