Доброго времени суток! Если кто может помогите с задачкой...:
Написать рекурсивную процедуру, которая считывает вводимые с клавиатуры числа до тех пор, пока не будет обнаружен 0.Затем введенные числа распечатываются в обратном порядке.0 Не печатать.
спасибо заранее!
Procedure ReadInt;
Var
X: Integer;
Begin
ReadLn (X);
If X <> 0
Then Begin
ReadInt;
WriteLn (X);
End;
End;
А можно для "тупых" с телом программы ?
begin ReadInt end.
В люом случае, это ведь не рекурсия...
Не хотел создавать новую тему, так что спрошу тута.
Вот задание:
Написать программу которая подсчитывает сумму и количество элементов в массиве до первого отрицательного элемента, и сделать это надо с помощью рекурсии . Не рекурсивным методом решить эту задачи не составляет и малейшего труда, а вот как рекурсией не понятно. Вот минут 15-20 сидел в поисковике но так и не нашел не че подходящего, связанного с моей задачей.
Подскажите пожалуйста что нужно делать =)
Вот задача без рекурсии =)
type vect=array[1..100] of real;
procedure Mat(const a:vect; var k:real);
var n,i:integer;
begin
i:=1;
while a[i]>0 do
begin
k:=k+a[i];
inc(i);
end;
end;
var a:vect; n,i:integer; k:real;
begin
read(n);
for i:=1 to n do
read(a[i]);
mat(a,k);
writeln(k,' ',i-1);
end.
Для начала вынеси собственно решение в отдельную процедуру, и тогда уже будем смотреть дальше...
ну воть
Забыл сказать, что нельзя использовать циклы. можно только в вводе и выводе массива и все =)
type vect=array[1..100] of real;
procedure Mat(const a:vect; var k:real);
var n,i:integer;
begin
i:=1;
while a[i]>0 do
begin
k:=k+a[i];
inc(i);
end;
end;
var a:vect; n,i:integer; k:real;
begin
read(n);
for i:=1 to n do
read(a[i]);
mat(a,k);
writeln(k,' ',i-1);
end
Вот написал но оно не пашет =). Пишет ошибку типа выход за границы изменения индекса =) Как исправить ?
type vect=array[1..100] of real;
function Mat(i:integer):real;
var n:integer; a:vect; k:real;
begin
if (a[i]<0) or (n=i) then
mat:=k
else
k:=k+a[i];
mat:=mat(i+1)+k;
end;
var a:vect; n,i:integer; k:real;
begin
read(n);
for i:=1 to n do
read(a[i]);
i:=1;
k:=mat(i);
writeln(k,' ',i-1);
end.
procedure Mat(const a: array of real; var k:real);
function mat(const a: array of real; n: integer;
var sum: real): integer;
begin
if (a[0] < 0) or (n = 0) then begin { или отр. элемент, или массив закончился }
mat := 0; exit
end;
sum := sum + a[0]; { нужно считать, до границы не добрались }
mat := 1 + mat(a[1], n - 1, sum); { вот, собственно, ради чего это начиналось }
end;
type
vect = array[1 .. 100] of real;
var
a: vect;
n, i: integer; s: real;
begin
readln(n);
for i := 1 to n do
readln(a[i]);
s := 0; { <--- никогда не лишнее действие }
i := mat(a, n, s);
writeln(s:8:4, ' ', i);
end.
Спасибо огромное, щас буду разбираться что да как =)
Уже появились вопросы =)
const a: array of real
выбивает ошибку =( пишет типа ожидался символ "[", тогда я поставил размер [1..100] и он опять выдает ошибку
Вот эту фразу не хочет читать потому как при вызове функциии вот здесь ругается mat(a[1], n - 1, sum) пишет "Нельзя приобразовать выражение типа real к выражению типа array[1..100] of real - воть так вот =(
И еще volvo наш учитель почему то не разрешает пользоваться "exit" говорит что должны учиться делать без неё так как это типа делает программиста более не опытным если ей пользуешься =(. Это не к кому конечно же тута не относится- просто мнение нашего учителя =). (хотя какой там из меня опытный программист =) ). А вот без exit я вот уже час думаю как сделать =)
З.ы. Может ошибка выбивает из за того что я работаю на Pascal ABC( нам пока на других запрещают работать ) ? а не на Turbo Pascal =)
begin
if statement then begin
something 1;
exit;
end;
something 2;
end;
begin
if statement then begin
something 1;
end else begin
something 2;
end;
end;
Да не выбивает оно ничего (если ты используешь TP, конечно) - я на TP7 проверял - все прекрасно работает. А вот если у тебя ABC - это надо говорить сразу. Этим поделием я не пользуюсь, и что там и как - не знаю... Можешь попробовать поменять Const на Var, если PascalABC вообще умеет работать с открытыми массивами.
function mat(const a: array of real; n: integer;, но в другом месте потребуется наворотить еще столько же кода. Это кому-то надо?
var sum: real): integer;
begin
if (a[0] < 0) or (n = 0) then mat := 0
else begin
sum := sum + a[0];
mat := 1 + mat(a[1], n - 1, sum);
end;
end;
Ясно =). Спасибо огромное. А на счет ABC - просто я учусь в РГУ(ростовский гос-во универ ) на мехмате и так как там глава кафедры программирование Михалкович (сделал PascalABC) то всем приходится работать на нем =), щаз попробую запустить в PascalABC.net , может заработает =) !
З.ы. У мя наверно ж поэтому и не работали многие программы которые ты мне помогал делать: с некоторыми модулями или еще с чем нить то что не поддерживает АBC =)
PascalABC workaround:
type arrtype = array[1 .. 100] of real;
function mat(const a: arrtype; i, n: integer;
var sum: real): integer;
begin
if (i > n) or (a[i] < 0) then mat := 0
else begin
sum := sum + a[i];
mat := 1 + mat(a, i + 1, n, sum);
end;
end;
var
a: arrtype;
n, i: integer; s: real;
begin
readln(n);
for i := 1 to n do
readln(a[i]);
i := mat(a, 1, n, s);
writeln(s:8:4, ' ', i);
end.