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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2013, 22:51   #1
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию Генерирование вещественных чисел

Здравствуйте! Пишу программу Генератор случайных вещественных чисел (от 0 до 1) Методом Середины Квадратов.
Есть некоторые затруднения при написании данной программы.
Код работает, но крайне нестабильно!!! Если в цикле for число N заменить на "3", то она ещё как-то работает (через раз), а если число циклов будет более "10", то уже не работает!
Поясню как должны получаться числа Методом Середины Квадратов.
Вот есть число х0, полученное Random-ом, допустим 0,32932786074033. Моя задача - сгенерировать 200 вещ. чисел приведенным ниже методом.
Для создания всех последующих элементов существует особое требование:
- отбрасывается нуль от этого Random-ного числа, затем оно обрезается справа до 8 цифр, полученное число возводится в квадрат.
- при этом получается 16-ти-значное число, которое необходимо также укоротить – обрезать по четыре цифры с обеих сторон, в результате чего оно опять получается 8-ми-значным, которое я «превращу» в вещественное, присоединив к нему слева нуль с запятой. И т.д. пока не получим 200 элементов.
Подскажите, как сделать чтобы прога не глючила ?

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo1: TMemo;
    Edit4: TEdit;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
    const
      N = 200; // Количество генерируемых чисел
var
  Form1: TForm1;
  //chisla: array [1..N] of Extended;
   //случайное число от 0 до 1
implementation
{$R *.dfm}
uses Math;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
stroka:string;
S1,S2:string;
x1:real;
x0: Extended;
x01:Extended;
x02:int64;
x:int64;
  begin
    Randomize; //Запускаем генератор случ. чисел
    for i:=1 to 3 do
    begin

      x0:= Random;
      Edit1.text:= floattostr(x0);     // Контролируем появление числа
      x01:=((x0*100000000));           // Избавляемся от нуля слева

      S1:= Copy(floattostr(x01),1,8);  // И урезаем число до 8 цифр
      x:= strtoint(S1); // Переприсваиваем значение промежуточной переменной
      x02:= x*x;         // Возводим в квадрат
      Edit2.Text:= inttostr(x02);      // Выводим 16-ти знач. число
      S2:= Copy((Edit2.Text),5,8);  // Подрезаем 16-ти знач. число до 8-ми знач.
      Edit3.Text:= S2; // Переприсваиваем значение промежуточной переменной
      x1:= strtoint(Edit3.Text)/100000000; //Получаем новое число от 0 до 1
      Edit4.Text:= floattostr(x1); //Выводим его на экран

      Memo1.Lines.Add(FloatToStr(x1));

   end;

ShowMessage('x0= '+FloatToStr(x0)+#13+'x01= '+FloatToStr(x01)+ #13 +'x02= '+FloatToStr(x02));

  end;
end.
Вложения
Тип файла: rar Лаба 2.rar (239.9 Кб, 10 просмотров)
Оль4ик вне форума Ответить с цитированием
Старый 19.03.2013, 09:26   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Вот есть число х0, полученное Random-ом, допустим 0,32932786074033
а теперь есть число 0,0032932786074033 (floattostr выдает число именно в таком виде)
x01:=00329327,86074033
но первых нулей-то ведь нет.
после урезания имеем 329327,8607
а это вовсе не целое число.
inttostr(x02); не сработает =>программа работает не стабильно!
Код:
x0:=random;
x:=trunc(x0*100000000); // trunc - целая часть от указанного числа
другой способ (хотя в этом способе я не уверен как будет работать floattostr )
Код:
x0:=random +1; // теперь у нас 1,0032932786074033
s:=floattostr(x0*100000000); // 100329327,86074033 
r:=copy(s,2,8); // берем нужную часть (_)

Цитата:
trunc
fxd
P.S. поправку принимаю.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.03.2013 в 09:43.
evg_m вне форума Ответить с цитированием
Старый 19.03.2013, 09:39   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

trunc
fxd
phomm вне форума Ответить с цитированием
Старый 19.03.2013, 21:49   #4
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Хочу сказать всем ОГРОМНОЕ СПАСИБО!!! Теперь программа работает стабильно!
Всего-то делов - изменила строку x01:=(x0*100000000);
на x01:=trunc(x0*100000000);
Даже стыдно, что не смогла это сама сделать.
Не поняла только что имелось ввиду под этим
Цитата:
trunc
fxd
Ещё прошу совет, как правильно прописать цикл for ... to... чтобы в поле Мемо числа отображались не в один столбец как у меня, а так: 20 строк по 10 чисел в каждой?
Спасибо!
Оль4ик вне форума Ответить с цитированием
Старый 19.03.2013, 22:46   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

fxd это "Fixed", по буржуински - исправленно.
Т.е. предидущим постом она была написана по другому "tranc" например.
Цитата:
Ещё прошу совет
Код:
for i... to do ... begin
 if (i mod 10)=0 then Memo.Lines.Text:=Memo.Lines.Text+IntToStr(число)+' '
 else Memo.Lines.Append('');
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2013, 22:46   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Не поняла только что имелось ввиду под этим
это была фиксация моей опечатки tranc -> trunc
Цитата:
P.S. поправку принимаю.
Код:
MAXM:=10; столько чисел в строке выводим
m:=0; // здесь будем считать сколько чисел вывели в строке
laststr:=0; //а это будет номер(индекс) текущей(последней) строки в Мemo
for i:=1 to ... ..наш исходный цикл
....
  if m=0 then laststr:=Memo.Lines.Add('');
  s:=memo.lines.Strings[laststr];
  s:=s+'; '+FloatToStr(x1);
  memo.Lines.strings[laststr]:=s;
  m:=(m+1) mod MAXM;
end;
P.S. код from Strilet лаконичнее +1
но
Код:
if (i mod 10)=0 then memo.Lines.append('');  //добавляем строку через каждые десять шагов
//else 
memo.Text:=memoText+';  '+ floattostr(...); //число надо выводить всегда (а не только при mod 10=0| mod  10<>0)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.03.2013 в 23:00.
evg_m вне форума Ответить с цитированием
Старый 19.03.2013, 22:58   #7
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

О-ей-ей! Пытаюсь сообразить какой из этих способов внедрить. Если правильно поняла это:
Цитата:
P.S. код from Strilet лаконичнее +1
, то от Stilet.
Усиленно соображаю.
Оль4ик вне форума Ответить с цитированием
Старый 19.03.2013, 23:12   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
+1
Пожалуй в случае с первой строкой в мемо могут быть проблемы...
Цитата:
Пытаюсь сообразить какой из этих способов внедрить
Не стесняйся - проверь на практике.
Только в моем случае цикл начни с единицы а не с нуля.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2013, 23:20   #9
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Своими действиями я кажется свела с ума свою программу. Всё завертелось, закрутилось, но пока не так как надо. Пока что бьюсь...

Не судите меня строго, но получилось пока только так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
stroka:string;
S1,S2:string;
x1:real;
x0: Extended;
x01:Extended;
x02:int64;
x:int64;
m,MAXM,laststr: integer;
  begin
    Memo1.Lines.Add('Сгенерированный массив:');
    Randomize; //Запускаем генератор случ. чисел
    MAXM:=10; //столько чисел в строке выводим
  m:=0; // здесь будем считать сколько чисел вывели в строке
laststr:=0; //а это будет номер(индекс) текущей(последней) строки в Мemo

    for i:=1 to N do
    begin
      x0:= Random;
      Edit1.text:= floattostr(x0);     // Контролируем появление числа
      x01:=trunc(x0*100000000);        // Избавляемся от нуля слева
      S1:= Copy(floattostr(x01),1,8);  // И урезаем число до 8 цифр
      x:= strtoint(S1);           // Переприсваиваем значение промежуточной переменной
      x02:= x*x;                  // Возводим в квадрат
      Edit2.Text:= inttostr(x02);    // Выводим 16-ти знач. число
      S2:= Copy(inttostr(x02),5,8);  // Подрезаем 16-ти знач. число до 8-ми знач.
      Edit3.Text:= S2;              // Показываем вырезку
      x1:= strtoint(S2)/100000000;  //Получение нового числа от 0 до 1
      Edit4.Text:= floattostr(x1);  //Выводим новое число на экран

  if m=0 then laststr:=Memo1.Lines.Add('');
  s2:=memo1.lines.Strings[laststr];
  s2:=s2+'; '+FloatToStr(x1);
  memo1.Lines.strings[laststr]:=s2;
  m:=(m+1) mod MAXM;
end;
      Memo1.Lines.Add(FloatToStr(x1));
   end;
//ShowMessage('x0= '+FloatToStr(x0)+#13+'x01= '+FloatToStr(x01)+ #13 +'x02= '+FloatToStr(x02));
 // end;
end.
И Showmessagе пришлось отключить, а то прога ругается
Изображения
Тип файла: jpg androm.jpg (364.1 Кб, 113 просмотров)

Последний раз редактировалось Stilet; 20.03.2013 в 00:18.
Оль4ик вне форума Ответить с цитированием
Старый 20.03.2013, 00:20   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но получилось пока только так
Ну в теории неплохо.
1) Может лучше на ListView заменить твое Мемо?
2) Для мемо wordwrap убери и поставь scrolbars в both в свойствах - тогда хоть похоже будет (но лучше первое)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана последовательность вещественных чисел. каждая пара чисел задает границы отрезка. Найти количество целых чисел на отрезках 'studentka' Помощь студентам 6 30.11.2011 18:35
Дано n вещественных чисел а1, а2,…,аn. Определите число соседств двух чисел разного знака (Паскаль) bambam Помощь студентам 1 29.11.2011 11:36
Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных максимумов в порядке возрастания zzz6 Помощь студентам 1 04.07.2011 12:59
генерирование массива случайных чисел Якъ Помощь студентам 3 14.11.2010 11:38
Файл вещественных чисел bullvinkle Общие вопросы C/C++ 1 18.06.2009 01:31