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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 11.11.2007, 21:57   #1
Mr.User
Пользователь
 
Аватар для Mr.User
 
Регистрация: 11.11.2007
Сообщений: 45
По умолчанию Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until)

Всем привет! Вот обычно всегда сам помогаю другим, но на этот раз попал в ситуацию, когда помощь нужна мне!
Суть помощи заключается в следующем: Необходимо В среде Delphi, на языке Object Pascal написать программу, которая будет решать ниже изложенную задачу! Программы необходимо написать в VCL коде!
Вот собственно и сама задача:

Вводится точность e. Вычислить сумму ряда
Вычисления продолжать до тех пор, пока очередное слагаемое не станет меньше e.
Вывести рядом и сравнить с полученной суммой.

Думаю моя просьба не отнимет много времени!
Спасибо!
end;
end.

Mr.User вне форума
Старый 11.11.2007, 22:11   #2
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию WHILE консоль

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
ac=0.0005; {точность}

var

  sum:real;
  i:integer;

{функция очередного члена}
function F(x:real):real;
begin
  f:=1/((x*2+1)*exp(ln(3)*i));
end;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  sum:=0;
  i:=1;
  while f(i)>ac do
  begin
    sum:=sum+f(i);
    i:=i+1;
  end;
  writeln('i = ',i);
  writeln('sum = ',sum:6:6);
{вывод условия больше 2корня из трех?}
  if sum>(Pi/(2*sqrt(3))) then Writeln('sum > 2sqrt(3)')else
  if sum<(Pi/(2*sqrt(3))) then Writeln('sum < 2sqrt(3)') else
  Writeln('sum = 2sqrt(3)');
  readln;
end.

Последний раз редактировалось Alex21; 11.11.2007 в 22:21.
Alex21 вне форума
Старый 11.11.2007, 22:12   #3
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию REPEAT (консоль)

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
ac=0.0005;

var

  sum:real;
  i:integer;

function F(x:real):real;
begin
  f:=1/((x*2+1)*exp(ln(3)*i));
end;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  sum:=0;
  i:=1;
  repeat
  begin
    sum:=sum+f(i);
    i:=i+1;
  end;
  until f(i)<ac;
  writeln('i = ',i);
  writeln('sum = ',sum:6:6);
  if sum>(Pi/(2*sqrt(3))) then Writeln('sum > 2sqrt(3)')else
  if sum<(Pi/(2*sqrt(3))) then Writeln('sum < 2sqrt(3)') else
  Writeln('sum = 2sqrt(3)');
  readln;
end.

Последний раз редактировалось Alex21; 11.11.2007 в 22:21.
Alex21 вне форума
Старый 12.11.2007, 02:02   #4
Mr.User
Пользователь
 
Аватар для Mr.User
 
Регистрация: 11.11.2007
Сообщений: 45
По умолчанию

Спасибо! Но в этой задаче суть дела такова, что точность "е", - не может быть константой! Пользователь сам вводит через поле Edit своё число (например 0,00004) и должен получить соответствующий результат!



Код:
procedure TForm1.Button1Click(Sender: TObject);
var a, b, znak: integer;
    e, sum, drobj: extended;
begin
drobj:=0;
sum:=0;
znak:=1;
a:=1;
b:=1;
e:=StrToFloat(Edit1.Text);
   while drobj>e do
        begin
        drobj:=1/(a*b);
        a:=a+2;
        b:=b*3;
        sum:=sum+znak*drobj;
        znak:=-znak;
        end;
   Label1.Caption:=FloatToStr(Sum);
end;

end.
Вот что получилось у меня! Программа запускается, но какое бы значение я не вводил, - результат всегда равен нулю!
Может лучше найти и исправить логические ошибки в моём коде?!
Буду очень благодарен!
end;
end.

Mr.User вне форума
Старый 12.11.2007, 11:47   #5
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

А где у вас функция?
Приведите весь код.
Alex21 вне форума
Старый 12.11.2007, 15:08   #6
Mr.User
Пользователь
 
Аватар для Mr.User
 
Регистрация: 11.11.2007
Сообщений: 45
По умолчанию

Вот на счёт функции честно сказать не знаю!
Весь программный код выглядит следующим образом:

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var a, b, znak: integer;
    e, sum, drobj: extended;
begin
drobj:=0;
sum:=0;
znak:=1;
a:=1;
b:=1;
e:=StrToFloat(Edit1.Text);
   while drobj>e do
        begin
        drobj:=1/(a*b);
        a:=a+2;
        b:=b*3;
        sum:=sum+znak*drobj;
        znak:=-znak;
        end;
   Label1.Caption:=FloatToStr(Sum);
end;

end.
end;
end.

Mr.User вне форума
Старый 12.11.2007, 16:33   #7
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Когда запускаете цикл drobj=0, e=0.001<>0, поэтому цикл не выполняется ни разу. Измени процедуру так
Код:
procedure TForm1.Button1Click(Sender: TObject);
var a, b, znak: integer;
    e, sum, drobj: extended;
begin
  drobj:=0;
  sum:=0;
  znak:=1;
  a:=1;
  b:=1;
  e:=StrToFloat(Edit1.Text);
  repeat
    drobj:=1/(a*b);
    a:=a+2;
    b:=b*3;
    sum:=sum+znak*drobj;
    znak:=-znak;
  until drobj<=e;
  Label1.Caption:=FloatToStr(Sum);
end;
Либо перед циклом замени drobj:=0; на drobj:=1; будет еще один вариант программы с while

Последний раз редактировалось _Dmitry; 12.11.2007 в 20:23.
_Dmitry вне форума
Старый 12.11.2007, 22:59   #8
Mr.User
Пользователь
 
Аватар для Mr.User
 
Регистрация: 11.11.2007
Сообщений: 45
По умолчанию

Спасибо!

Вот сейчас проверял как работает исправленая программа. Выявился такой казус, что программа работает только в том случае, если вводимое число делиться на два! Например 0,00002 0,00004 0,00006 и т.д. а если вводить другие числа, то изменения в строке Label не происходят, т.е. результат не выводится! А с чем это может быть связанно!
end;
end.


Последний раз редактировалось Mr.User; 12.11.2007 в 23:13.
Mr.User вне форума
Старый 13.11.2007, 08:43   #9
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Цитата:
Сообщение от Mr.User Посмотреть сообщение
программа работает только в том случае, если вводимое число делиться на два
Программа работает в любом случае. Если введем e=0,00001 то последняя дробь равна 0,00000897, а предпоследняя 0,0000305, поэтому сумма будет одна и та же при е=0,00001 0,00002 0,00003, если е=0,00004 то суммируется уже на одну дробь меньше
_Dmitry вне форума
Старый 23.11.2007, 01:34   #10
Mr.User
Пользователь
 
Аватар для Mr.User
 
Регистрация: 11.11.2007
Сообщений: 45
По умолчанию

Вот хотелось бы получить помощь по решению вот такой вот задачки:

Вводятся начальный член и шаг арифметической прогрессии. Вводится также число. Определить, принадлежит ли введенное число арифметической прогрессии с введенными начальным членом и шагом.

Один вопрос - одна тема. Тема закрыта. Модератор.
end;
end.


Последний раз редактировалось AlDelta; 23.11.2007 в 01:44.
Mr.User вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл Sota Паскаль, Turbo Pascal, PascalABC.NET 1 24.03.2008 19:50
Цикл... Лёка PHP 5 03.02.2008 21:38
3-ой цикл LeoN Общие вопросы Delphi 5 12.06.2007 14:15