Дан целочисленный массив с кол-вом элементов 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
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
Не работает Программа просит ввести количество чисел, потом завершает работу и не выводит никаких индексов
Автор: мисс_граффити 14.12.2006 3:17
так я и не обещала, что будет работать правильно. я показала, где ошибка, из-за которой не компилируется... а отлаживай уж ты сам...
если исправить ошибку, о которой я тебе написала в сообщении 4, то прога делает вот что: вводим 4 выводит 4,8 вводим 8 выводит 4,8,16
Автор: Lesnik 14.12.2006 3:38
Цитата(мисс_граффити @ 13.12.2006 23:17)
а отлаживай уж ты сам...
В том и дело, что я не понял тему функция/процедура, а завтра надо сдать задачи
Автор: мисс_граффити 14.12.2006 3:45
а что ты хочешь получить в итоге? я бы сказала, что степени двойки - это 1,2,4... но тогда и твоя первая прога работает неправильно.
Автор: Lesnik 14.12.2006 3:51
Цитата(мисс_граффити @ 13.12.2006 23:45)
а что ты хочешь получить в итоге? я бы сказала, что степени двойки - это 1,2,4... но тогда и твоя первая прога работает неправильно.
Первая прога работает правильно. Она выводит все степени двойки (до определённого момента). Как сделать через функцию незнаю
Автор: мисс_граффити 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 должно быть!
Теперь всё нормально. Огромное спасибо!
Автор: мисс_граффити 14.12.2006 4:07
ну так... относительно нормально. но лишь бы тебе нравилось...
Автор: 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.
Вроде надо ещё передовать строки со столбцами, но не могу понять как
Автор: мисс_граффити 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 - степень двойки:
Вообще-то эта функция пишется в одну строку:
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
Замысел не понял я Мало того что в faq не посмотрел так еще и задание неправильно понял ) Естественно так как речь идет об индексах, никакие функции ненужны ...