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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2010, 11:34   #1
Anton5
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 18
По умолчанию Рекурсия в Delphi!

Помогите найти ошибку в программе!
Вот задание:
Написать рекурсивную программу вычисления суммы N первых членов арифметической прогрессии.
А вот моя программа:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    procedure N6Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    function progress(x:word):extended;
    procedure N2Click(Sender: TObject);
        procedure Edit3KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a1,d,S:Extended;
  N:Word;
implementation

{$R *.dfm}

procedure TForm1.N6Click(Sender: TObject);
begin
MessageDlg('33.Написать рекурсивную программу вычисления суммы N первых членов арифметической прогрессии.',mtInformation,[mbok],0);
end;

procedure TForm1.N4Click(Sender: TObject);
Var
 Err:Boolean;
  text:PChar;
begin
  if (Edit1.Text='') or (Edit2.Text='') or (Edit3.Text='') then
Showmessage('Заполните все поля!'); exit;
  end
else
      a1:=StrToFloat(Edit1.text);
       d:=StrToFloat(Edit2.text);
      n:=StrToInt(Edit3.text);

    Begin
    s:=progress(n);   text:=PChar(IntToStr(n)+' член прогресии равен: '+FloatToStr(s));
    Application.MessageBox(text,'Результат!!!',MB_IconExclamation+MB_OK);
  End;
end;


Function TForm1.progress(x:Word):Extended;
Begin
 If x=1  Then progress :=1 Else progress:=a1+progress(x-1)+d*(x-1); 
End;

procedure TForm1.N2Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
 Case key of
 #8, #32, '0'..'9':;
 else Key:=chr(0);
 end;
end;



procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
 Case key of
 #8, #32, '0'..'9':;
 else Key:=chr(0);
 end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
Case key of
 #8, #32, '0'..'9':;
 else Key:=chr(0);
 end;
end;

end.

Она работает, только считает через раз правильно!!! Я думаю, может где выделено там ошибка какая-то? Подскажите...

Последний раз редактировалось Stilet; 25.06.2010 в 11:50.
Anton5 вне форума Ответить с цитированием
Старый 25.06.2010, 11:54   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По-моему достаточно Else progress:=a1+progress(x-1)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.06.2010, 14:14   #3
Anton5
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 18
По умолчанию

Нет, так она вообще выдает результат, далекий от правильного ....
Anton5 вне форума Ответить с цитированием
Старый 25.06.2010, 14:38   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я кнечно не силен в матике-матике, но предполагаю что тебе нужно вот что-то:
Код:
 function prog(a,n,d:integer):integer;
 begin
  if n<=0 then exit;
  Result:=a+prog(a,n-1,d);
 end;
begin
 write(prog(1,10,1));readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.06.2010, 14:57   #5
Anton5
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 18
По умолчанию

То есть я должен вставить эту функцию в свою программу?
Я попробовал изменить => куча ошибок.... Объясните как
Anton5 вне форума Ответить с цитированием
Старый 25.06.2010, 15:25   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну вот у тебя есть function progress(x:word):extended;
Меняешь ее на function TForm1.prog(a,n,d:integer):integer;
И в коде
Код:
 function prog(a,n,d:integer):integer;
 begin
  if n<=0 then exit;
  Result:=a+prog(a,n-1,d);
 end;
Только учти я не знаю насколько правильно она считать будет, я не математик.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.06.2010, 22:15   #7
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Не будет правильно считать.
Причина: на каждом шаге прогрессии будет добавляться величина a, которая, как я понимаю, должна являться первым элементом прогрессии.
Решение: при n=1 присвоить величину, равную первому элементу прогрессии. Результатом работы функции может быть текущий элемент. А сумма должна передаваться в качестве параметра.
Код получится вот такой:
Код:
Function TForm1.progress(x:Word, var s: Extended):Extended;
Begin
 If x=1  Then begin progress :=a1; s := a1; end Else begin  progress := progress(x-1, s)+d; inc(s, progress); end;
End;
Не, я уже ничего не понимаю в этой жизни.
Вот самый первый код по идее должен быть рабочим, если написать вот так:
Код:
Function TForm1.progress(x:Word):Extended;
Begin
 If x=1  Then progress :=a1 Else progress:=a1+progress(x-1)+d*x;
(первый элемент обязан быть a1, а сумма рассчитывается как текущая сумма плюс
текущий! элемент, а не предыдущий., поэтому отнимать 1 не нужно) 
End;
Ну и эт. Насчёт не будет правильно считать беру свои слова обратно. Хотя... всё-таки не будет )

Последний раз редактировалось mMAg; 25.06.2010 в 22:24.
mMAg вне форума Ответить с цитированием
Старый 26.06.2010, 08:58   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Anton5,
формулу прогрессии приведите, пожалуйста!

p.s. И ещё, когда речь идёт о том, что работает, но неправильно считает, хорошим тоном было бы сообщить исходные данные и полученный Вами результат. А иначе — всё что угодно может быть. Может Вы в расчётах ошибаетесь.. Или очередной член прогрессии неверно подсчитываете!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.06.2010, 14:50   #9
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Да он, наверно, уже исправил и вряд ли в скором времени появится.
Арифметические прогрессии все в школе учили, в классе эдак 6-7. Вот формула для нахождения n-ного члена:
a(n) = a(n-1) + d;откуда легко находится, что:
a(n) = a(0) + d*n;
a(0) и d должны быть заранее известны.
Обозначения, насколько я знаю, общепринятые. Хотя... мало ли чего там могут преподаватели на уроках или парах начитать.
mMAg вне форума Ответить с цитированием
Старый 26.06.2010, 15:06   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

mMAg, спасибо за ответ.
я проглядел слово "арифметическая"...

Цитата:
a(n) = a(n-1) + d;
вот. это точно!

ну тогда Ваш пример код выше неверен
Решение будет выглядеть как-то так:
Код:
Function TForm1.progress(x:Word):Extended;
Begin
 If x=0  Then progress :=a1 
 Else progress:=progress(x-1)+d;
End;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия DrDre9991 Паскаль, Turbo Pascal, PascalABC.NET 4 22.05.2010 15:00
Рекурсия в Delphi Ericnex Помощь студентам 2 05.05.2010 19:34
Delphi, рекурсия, как сделать все возможные N-ки чисел (сколько столбцов такая N-ка,в данном случае 3)? domik Помощь студентам 5 26.09.2007 16:43