Консультация № 180312
14.10.2010, 13:40
39.87 руб.
15.10.2010, 05:14
0 22 1
Здраствуйте.
Помогите написать код програмы.
Имеются в memo1 вещественные числа в интервале ( от нуля до одного).
(0,6756
0,5555
0,2345
0,1287
0,5896)
нужно интервал делим на 10 частей
т.е.
0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,0
и найти количество цифр в каждом интервале.
напр. число 0,6756 находится в интервале от 0,6 до 0,7 и имеется таких чисел напр. 12
число 0,1255 находится в интервале оот 0,1 до 0,2 и таких чисел 5
и вывести в memo2
и построить гистограмму

Обсуждение

давно
Мастер-Эксперт
425
4118
14.10.2010, 13:55
общий
novij2011:
нужно интервал делим на 10 частей
т.е.
0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 0,10

0.1 и 0.10 - это одно и то же число. Не могли бы Вы изъясниться более понятно?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
14.10.2010, 14:15
общий
извиняюсь, ошибочка вышла. Вот правильный интервал
0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,0
давно
Академик
320937
2216
14.10.2010, 14:42
общий
novij2011:
Добрый день! В каком интервале находится число 0.3? (0.2; 0.3] или [0.3; 0.4)?
Неизвестный
14.10.2010, 15:21
общий
Цитата: lamed
в интервале [0.3;0.4]
Неизвестный
14.10.2010, 15:33
общий
забыл упомянуть [p] и найти количество цифр в каждом интервале[/p]
нужно еще количество цифр в каждом интервале разделить на 200
т.е. p1=(к-во цифр в каждом интервале)/200;
p2=(к-во цифр в каждом интервале)/200;
p3=(к-во цифр в каждом интервале)/200;
и по этим вероятностям построить гистограмму
давно
Академик
320937
2216
14.10.2010, 16:12
общий
novij2011:
Цитата: 324805
к-во цифр в каждом интервале
Может быть, все-таки количество чисел? (* В числе 123 три цифры *)

Цитата: 324805
и по этим вероятностям построить гистограмму
По вероятностям чего? Почему делите на 200? Всего 200 чисел?
Неизвестный
14.10.2010, 16:43
общий
да 200 чисел.
Под цифрами я подразумевал числа, стоящими по одному в каждой новой строке memo1
Неизвестный
14.10.2010, 16:43
общий
т.е. цифры это числа
давно
Академик
320937
2216
14.10.2010, 17:05
общий
novij2011:
Итак, уточним: в Memo имеется 200 вещественных чисел в диапазоне от 0.0 до 1.0 включительно. Нужно посчитать количество чисел в каждом из 10 подинервалов и построить диаграмму распределения вероятностей. Так?
Неизвестный
14.10.2010, 17:12
общий
совершенно верно
Неизвестный
14.10.2010, 23:05
общий
это ответ
Здравствуйте, novij2011!
Предлагаю следующий вариант решения задачи.
Код в приложении.
На форме - Button1 - расчет данных, Button2 - формирование массива
Memo1 - исходный массив Memo2 - результирующий
Chart1 - диаграмма
Stringgrid1 - отображение расчета для наглядности
Вопросы - пишите

Приложение:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DateUtils, OleServer, ExcelXP, Grids, ComCtrls, StdCtrls,
TeEngine, Series, ExtCtrls, TeeProcs, Chart;

type
TForm1 = class(TForm)
Memo1: TMemo;
Chart1: TChart;
Button1: TButton;
StringGrid1: TStringGrid;
Button2: TButton;
Series1: TPieSeries;
Memo2: TMemo;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
randomize;
Memo1.Clear; //очистка форм
Memo2.Clear;
for i:= 1 to 200 do // формирование массива
Memo1.Lines.Add(Format('%6.4f', [Random]));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
temp: integer;
mas: array of integer;

begin
Memo2.Clear;
Chart1.Series[0].Clear; // очистка форм
StringGrid1.Cells[0,0]:= 'Интервал';
StringGrid1.Cells[1,0]:= 'Частота';
setlength(mas, 0);
setlength(mas, 10); //установка массива
for i:=0 to Memo1.Lines.Count - 1 do
begin
temp:= Trunc(StrToFloat(Memo1.Lines.Strings[i]) * 10); // определение принадлежности к интервалу
if temp = 10 then // при попадании числа 1.0000 присоединяем его к последнему интервалу
temp:= 9;
mas[temp]:= mas[temp] + 1;
end;

for i:= 1 to 10 do //вывод в диаграмму, Memo2 и StringGrid1
begin
Chart1.Series[0].AddXY(i, mas[i-1] / 200, Format('%3.1f', [(i - 1) / 10]) + ' - ' + Format('%3.1f', [i / 10]));
Memo2.Lines.Add('Интервал:' + Format('%3.1f', [(i - 1) / 10]) + ' - ' + Format('%3.1f', [i / 10]) + ' Вероятность: ' + Format('%5.3f', [mas[i-1] / 200]));
StringGrid1.Cells[0,i]:= Format('%3.1f', [(i - 1) / 10]) + ' - ' + Format('%3.1f', [i / 10]);
StringGrid1.Cells[1,i]:= IntToStr(mas[i-1]);
end;
end;

end.
5
5
Неизвестный
15.10.2010, 14:10
общий
У меня при нажатии на кнопку button1 выдает ошибку
First chance exception at $7C812AFB. Exception class EAccessViolation with message 'Access violation at address 0045AB0C in module 'Project1.exe'. Write of address 20000000'. Process Project1.exe (4052)
Неизвестный
15.10.2010, 14:53
общий
novij2011:
First chance exception at $7C812AFB. Exception class EAccessViolation with message 'Access violation at address 0045AB0C in module 'Project1.exe'. Write of address 20000000'. Process Project1.exe (4052)

Из какого ответа программу Вы используете? Т.е. к кому адресован вопрос?
Неизвестный
15.10.2010, 14:58
общий
Извиняюсь, перепутал вопросы.
На каком этапе выдает ошибку?
Неизвестный
15.10.2010, 15:10
общий
novij2011:
При нажатии на кнопку Button2 формируем массив в Memo1
При нажатии на кнопку Button1 формируем массив результата и выводим в Chart1 и Memo2
Если не получится, напишите. Вечером выложу весь проект в виде файла.
Неизвестный
15.10.2010, 15:38
общий
При нажатии на button2 он записывает массив чисел в memo1 (сдесь все нормально).
При нажатии на button1 сразу же вылетает ошибка Access violation at address ( memo2 и chart1 остаются пустыми)
а в stringgrid успеваются записаться слова интервал и частота(но остальные ячейки остаются пустыми)

Неизвестный
15.10.2010, 16:34
общий
Поставьте свойство StringGrid1 FixedCols равное 0
Неизвестный
15.10.2010, 16:53
общий
novij2011:
Ближайшие 2 часа буду ехать домой. Просьба сообщить результат.
Если что из дома выложу свой контрольный экземпляр
Неизвестный
15.10.2010, 17:33
общий
все нормально заработало. Спасибо.
Неизвестный
15.10.2010, 17:40
общий
А вы можите объяснить эту строчку
Memo2.Lines.Add('Интервал:' + Format('%3.1f', [(i - 1) / 10]) + ' - ' + Format('%3.1f', [i / 10]) + ' Вероятность: ' + Format('%5.3f', [mas[i-1] / 200]));

что означает %3.1f ?
%5.3f?
количество символов после запятой?
давно
Мастер-Эксперт
425
4118
15.10.2010, 18:17
общий
novij2011:
Цитата: 324805
что означает %3.1f ?

Это формат вывода числа:
- 3 - это в числе будет только три цифры,
- .1 - после запятой один знак,
- f - число не целое ( ), от слова float, первая буква.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
15.10.2010, 18:41
общий
спасибо
Форма ответа