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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 12.02.2014, 21:22   #1
лололо
 
Регистрация: 06.02.2014
Сообщений: 8
По умолчанию списки, паскаль

Задано односвязный список, элементами которого есть действительные числа. Описать рекурсивную функцию, которая считает среднее арифметическое всех элементов непустого списка.
Помогите пожалуйста найти ошибку в коде
Код:
program laba12_12;
uses crt;
type ukazatel=^s;
     s=record
             data:integer;
             next:ukazatel;
     end;
var u,x:ukazatel;
    digit,c:integer;

function found(u:ukazatel;c:integer):real;
         begin
         if u<>nil  then
         found:=found(u^.next,c)+u^.data/c;
         end;

begin
clrscr;
     u:=nil;
     writeln('enter elements. end=> press 0');
     read(digit);
     if digit<>0
        then
            begin
                 new(x);
                 x^.next:=nil;
                 x^.data:=digit;
                 u:=x;
                 read(digit);
                 while digit<>0 do
                  begin
                   new(x^.next);
                   x:=x^.next;
                   x^.next:=nil;
                   x^.data:=digit;
                   read(digit);
                  end;
            end;

     writeln;    {
     sum:=0;  c:=1;
     while u<> nil do
     begin
          inc(c);
          sum:=sum+u^.data;
          u:=u^.next;
     end;          }
     begin
   while u<>nil do
   begin          inc(c);
        write(u^.data,' ');
        u:=u^.next;
   end;      end;
     write(found(u,c):2);
end.
лололо вне форума
Старый 12.02.2014, 22:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Первая крамолка в стиле Дали:
Код:
function found(u:ukazatel;var c:integer):real;
         begin
         inc(c);
         if u<>nil  then     found:=found(u^.next,c)+u^.data;
         else found:=0;
         end;
и
Код:
 c:=1;
 write(found(u,c)/c:2);
Хотя не проверял.
I'm learning to live...
Stilet вне форума
Старый 12.02.2014, 22:21   #3
лололо
 
Регистрация: 06.02.2014
Сообщений: 8
По умолчанию

неправильно выдает, пишет на все ноль
лололо вне форума
Старый 12.02.2014, 22:35   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
неправильно выдает
Ошибаешся. Все правильно. Дело в том что ты перед вызовом функции по списку проходишся циклом. У тебя u после цикла уже становится равным nil, потому рекурсия и не выполняется. Убери цикл вывода списка совсем, он не нужен.
I'm learning to live...
Stilet вне форума
Старый 12.02.2014, 22:51   #5
лололо
 
Регистрация: 06.02.2014
Сообщений: 8
По умолчанию

ok работает, спасибо

Последний раз редактировалось лололо; 12.02.2014 в 23:57.
лололо вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Списки. zmey1 Паскаль, Turbo Pascal, PascalABC.NET 0 12.12.2011 17:44
Паскаль списки ownemall Помощь студентам 1 10.10.2011 11:31
Паскаль. Списки Freem Паскаль, Turbo Pascal, PascalABC.NET 2 11.05.2007 14:22