Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2013, 14:13   #1
lialia
Форумчанин
 
Регистрация: 08.12.2012
Сообщений: 116
По умолчанию Нужно исправить ошибку(рекурсия)

здрастуйте,помогите пожалуйста исправить ошибку,у меня переполняется стек при массиве когда n> 7,когда выбираю операцию с рекурсией.Я так понимаю что ошибка в том что я объявляю массив в каждой ф-ции (в рекурсии) подскажите пожалуйста ,как мне правильно исправить и вообще ошибка в этом или нет.(программа заключается в том,что нужно оформить как процедуры сумму элементов матрицы,произведение элементов и поиск элемента с заданным значением итерационно и рекурсивно)

Код:
const n=7;
ae=15;
type mas=array[1..n,1..n] of integer;
var A:mas; m:integer; i,j:integer;
    c:byte;
procedure output_matrix(ty:mas);
var i,j:integer;
begin
for i:=1 to n do begin
for j:=1 to n do write(ty[i,j],' ');
writeln;
end;
end;
  function summa(ty:mas):integer;
  var i,j,sum:integer;
  begin
   sum:=0;
   for i:=1 to n do
   for j:=1 to n do
   write(ty[i,j]:3);
   sum:=sum+ty[i,j];
   end;
function product(ty:mas):longint;
var i,j:integer; product:longint;
begin
product:=1;
for i:=1 to n do
for j:=1 to n do
product:=product*ty[i,j];
product:=product;
end;
  procedure Poisk(ty:mas;f:integer);
  var i,j:integer;
  begin
  for i:=1 to n do
  for j:=1 to n do
  if ty[i,j]=f then 
  writeln('line ',i,', column ',j);
  end;
function Summa_a(ty:mas;i,j:integer):integer;
begin
if (i=1) and (j=1) then 
Summa_a:=ty[i,j]
else if (j=1) then 
Summa_a:=ty[i,j]+Summa_a(ty,i-1,n)
else Summa_a:=ty[i,j]+Summa_a(ty,i,j-1);
end;
  function product_a(ty:mas; i,j:integer):longint;
  begin
  if(i=1) and (j=1) then 
  product_a:=ty[i,j]
  else if (j=1) then 
   product_a:=ty[i,j]*product_a(ty,i-1,n)
  else product_a:=ty[i,j]*product_a(ty,i,j-1);
  end;
procedure Poisk_a(ty:mas; z,v:integer);
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do if ty[i,j]=v then 
writeln('Stroka ',i,', stolbec ',j);
end;
begin
randomize;
for i:=1 to n do
for j:=1 to n do
a[i,j]:=random(ae)+1;
output_matrix(A);
repeat
writeln('**********************');
output_matrix(A);
writeln('Select the method(i:iteracia r:rekurcia) :');
writeln(' 1-summa i , 2-product i, 3-poisk i');
writeln('4-summa r,5-product r,6-poisk r');
writeln('0-exit');
readln(c);
case c of
1:writeln(Summa(A));
2:writeln(product(A));
3:begin
write('Enter the number to search:');
readln(m);
Poisk(A,m);
end;
4:writeln(Summa_a(A,n,n));
5:writeln(product_a(A,n,n));
6:begin
write('Enter the number to search:');
readln(m);
Poisk_a(A,n,m);
end;
end;
until c=0;
end.
lialia вне форума Ответить с цитированием
Старый 21.04.2013, 14:30   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вам нужно иметь собственную копию массива внутри каждого экземпляра функции?
Если нет, то передавайте массив по ссылке (var параметр).
s-andriano вне форума Ответить с цитированием
Старый 21.04.2013, 15:40   #3
lialia
Форумчанин
 
Регистрация: 08.12.2012
Сообщений: 116
По умолчанию

оо ,получилось спасибо)скажите пожалуйста,если не сложно,а как сделать так,чтобы пользователь сам мог выбрать размерность массива (до определенного числа)
lialia вне форума Ответить с цитированием
Старый 21.04.2013, 15:45   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
const max=100;
type mas=array[1..max,1..max] of integer;
У пользователя запрашивать n (проверять, что оно не больше max) и передавать его во все процедуры и функции, где используется размер массива.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 21.04.2013, 15:57   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,378
По умолчанию

Цитата:
скажите пожалуйста,если не сложно,а как сделать так,чтобы пользователь сам мог выбрать размерность массива (до определенного числа)
Как вариант:
1. Запросить размерность массива у пользователя и проверить введенное значение на ограничения.
2. Разместить массив нужного размера в динамической памяти.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 21.04.2013, 18:30   #6
lialia
Форумчанин
 
Регистрация: 08.12.2012
Сообщений: 116
По умолчанию

спасибо)
lialia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно исправить ошибку kg250493 Помощь студентам 6 25.10.2012 22:57
Нужно исправить ошибку onliner PHP 1 13.06.2012 00:49
нужно исправить ошибку Ania Lunee Помощь студентам 4 18.05.2012 01:23
нужно исправить ошибку marina_sergina Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 16.12.2010 01:07
нужно исправить ошибку TheVenny Помощь студентам 17 06.11.2008 16:26