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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2013, 22:48   #21
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Потому, что более эффективно с точки зрения реализации сложить все счетчики в один массив.
s-andriano вне форума Ответить с цитированием
Старый 15.04.2013, 23:10   #22
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Цитата:
сложить все счетчики в один массив.
Вы знаете, я наверно неправильно изначально задала свой вопрос. Под этим
Цитата:
Очень хочется узнать, как правильно подсчитать количество получившихся вещественных чисел в следующих диапазонах:
я подразумевала подсчет количества чисел в каждом их десяти диапазонах. Просто я потом должна буду по этим счетчикам составить диаграмму примерно такого характера:
Изображения
Тип файла: jpg bdiag.jpg (175.7 Кб, 145 просмотров)
Оль4ик вне форума Ответить с цитированием
Старый 16.04.2013, 13:26   #23
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Оль4ик Посмотреть сообщение
Вы знаете, я наверно неправильно изначально задала свой вопрос. Под этим
я подразумевала подсчет количества чисел в каждом их десяти диапазонах. Просто я потом должна буду по этим счетчикам составить диаграмму примерно такого характера:
Оля, Вы правильно задали вопрос (впрочем, по вашему коду
который
Цитата:
Код:
if x1 < 0.1  then inc(n1) ;
      if (x1 > 0.1) and (x1 < 0.2) then inc(n2);
      if (x1 > 0.2) and (x1 < 0.3) then inc(n3);
      if (x1 > 0.3) and (x1 < 0.4) then inc(n4);
      if (x1 > 0.4) and (x1 < 0.5) then inc(n5);
      if (x1 > 0.5) and (x1 < 0.6) then inc(n6);
      if (x1 > 0.6) and (x1 < 0.7) then inc(n7);
      if (x1 > 0.7) and (x1 < 0.8) then inc(n8);
      if (x1 > 0.8) and (x1 < 0.9) then inc(n9);
      if (x1 > 0.9) and (x1 < 1) then inc(n10);
это и так было видно.
но, НАМНОГО удобнее, хранить не десять переменных, а ОДИН массив.
Что Вам и предложено было в реализации.
вместо n1 берётся элемент массива A[1]
вместо n2 берётся элемент массива A[2] и т.д.
и чтобы нарастить счётчик уже не нужно преверять условие - по величине X1 вычисляется номер диапазона, в какой попадает данный X1.

теперь идея более понятна?


p.s. только для счётчика я бы взял массив от 0 до 9 и тогда вычисление номера диапазона (индекса массива) я бы записал чуть-чуть по другому:
Код:
var NShet : array[0..9] of integer; 
  i, NomerDiapazona : integer;
....
{сначала, до начала подсчёта надо обязательно обнулить массив счётчиков}
for i:=0 to 9 do NShet[i] := 0;
........


{теперь, собственно вычиление по X1 номера диапазона и увеличение счётчика}
  NomerDiapazona  := trunc(abs(x1)*10);
  if NomerDiapazona>9 then NomerDiapazona := 9; {всё, что больше 1.0 кидаем в последний диапазон}
  inc(  NShet[NomerDiapazona] );
всё. в массиве NShet КОЛИЧЕСТВО чисел по диазпазонам...
можно рисовать диаграмму.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2013, 22:30   #24
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Я почти поняла смысл этой идеи. (Правда иногда мне кажется что я сошла с ума, что это самообман)
Боюсь оказаться навязчивой, но хотелось бы до конца вникнуть в суть вышеприведенного кода. По моим соображениям любому из индексов массива NShet может соответствовать число не более чем "200" (т.к. массив N=200). Попробовав работу кода уважаемого Stilet у меня программа вроде заработала, но при этом в Эдитах выводились слишком огромные числа. В случае вашего кода я что-то не так видимо сделала (наверное цикл "for" не туда прописала) в Эдит выводится просто "1".
Если не трудно, подскажите где нужно прописать цикл
Код:
for i:=0 to 9 do NShet[i] := 0;
и так ли должно быть:
Код:
Edit10.Text:=  inttostr(NShet[NomerDiapazona]);inc(NomerDiapazona);
Просто очень хочется наблюдать результат вычисления
Оль4ик вне форума Ответить с цитированием
Старый 17.04.2013, 09:49   #25
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

сорри, только сегодня утром увидел ваш вопрос...

ну, что-то работает не так. (ваш кэп)
выложите код обработки целиком. Посмотрим, куда и как Вы поместили код.

кстати, выводить содержимое массива (да и не только массива) удобно в Memo
Кидайте на форму TMemo (ну, для пример, пусть этот контрол будет иметь имя Memo2 )
тогда, чтобы вывести содержимое массива NShet нужно записать всего лишь пару строк:
Код:
Memo2.Lines.Clear; {стёрли всё, что было в Мемо, чтобы мусор не мешал наблюдать результаты}
Memo2.Lines.Append('Массив счетчиков диапазонов: '); {вывели заголовок в мемо}
for i:=0 to 9 do 
  Memo2.Lines.Append(' диапазон номер '+ IntToStr(i)+' : счётчик = '+IntToStr(NShet[i]) );
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.04.2013, 16:11   #26
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Вот выкладываю то что получилось, но уже соответственно, вместо Эдитов - Memo (а из-за этого мне не будет сложней строить диаграмму?).
Не знаю как вам удобней смотреть, решила проект прикрепить, но если нужно прямо на страницу код выложу. (Не хотела много места занимать)
Вложения
Тип файла: rar Лаба 2.rar (244.3 Кб, 5 просмотров)

Последний раз редактировалось Оль4ик; 17.04.2013 в 16:18.
Оль4ик вне форума Ответить с цитированием
Старый 17.04.2013, 16:43   #27
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну ясное дело - вы же забыли подсчёт взять в цикл и пройтись в цикле ПО ВСЕМ числам.
это можно сделать в цикле от 1 до N по массиву chisla

А можно и прямо во время генерации случайного подсчитывать.
вот код процедуры на кнопку генерации массива:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  j: integer;
  stroka: string;
  S1, S2: string;
  x1: real;
  x0: Extended;
  x01: Extended;
  x02: int64;
  x: int64;
  n1, n2, n3, n4, n5, n6, n7, n8, n9, n10: integer; // счетчики попаданий в интервал
  nn, mm: integer;
  NShet: array[0..9] of integer;
  NomerDiapazona: integer;
begin

    //сначала, до начала подсчёта надо обязательно обнулить массив счётчиков
  for i := 0 to 9 do NShet[i] := 0;

  Memo1.Lines.Add('Сгенерированный массив:');
  Randomize; //Запускаем генератор случ. чисел
  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); //Выводим новое число на экран
    Memo1.Lines.Add(FloatToStr(x1)); // Выводим на экран все числа
    chisla[i] := x1; // Присвоим каждому индексу определенное значение вещ.числа

      //теперь, собственно вычиление по X1 номера диапазона и увеличение счётчика
    NomerDiapazona := trunc(abs(x1) * 10);
    if NomerDiapazona > 9 then NomerDiapazona := 9; {всё, что больше 1.0 кидаем в последний диапазон}
    inc(NShet[NomerDiapazona]);

  end;
//=========== Проверяем генератор на равномерность распределения====================
  j := 1;
  sum := 0;
  sum2 := 0;
  sum3 := 0;
  nn := 0; mm := 0;

  while j <= High(chisla) do // Перебираем массив из 200 чисел
  begin
    sum := sum + chisla[j];
    sum2 := sum2 + sqr(chisla[j] - 0.5);
    sum3 := sum3 + sqr(chisla[j]);
    inc(j, 1);
    Edit5.Text := floattostr((1 / N) * sum); // Мат.ожидание (~0,5)
    Edit6.Text := floattostr((1 / N) * sum2); // Дисперсия (~0,33)
    Edit7.Text := floattostr((1 / N) * sum3); // Сумма квадратов (~0,083)
  end;

  for j := Low(chisla) to High(chisla) - 1 do
  begin
    if (sqr(chisla[j]) + sqr(chisla[j + 1])) < 1 then inc(nn) else inc(mm);
    Edit8.Text := floattostr(nn / (nn + mm)); // P = n/(n+mm) (~0,785)
  end;

  x := 0; {воспользуемся переменной x для подсчёта общего количества (для проверки) }
  Memo2.Lines.Clear; {стёрли всё, что было в Мемо, чтобы мусор не мешал наблюдать результаты}
  Memo2.Lines.Append('Массив счетчиков диапазонов: '); {вывели заголовок в мемо}
  for i := 0 to 9 do begin
    Memo2.Lines.Append('диапазон номер ' + IntToStr(i) + ' : счётчик = ' + IntToStr(NShet[i]));
    x := x + NShet[i]; {одновременно подсчитаем сумму == общее количество,
                                сколько всего значений во всех счётчиках!}
  end;
  Memo2.Lines.Append('-------------------');
  Memo2.Lines.Append('Итого: ' + IntToStr(x));
end;

p.s.
1) я позволил себе чуть-чуть отформатировать код.
2) обратите внимание на опечатку, должно быть:
"Содержимое массива"
3) на построение диаграммы массив счётчиков вообще никак не повлияет!
4) очень рекомендую давать контролам (и кнопкам, в частности) давать "говорящие" имена.
Например, что делает кнопка Button1 ?! Никому не ясно. А если Вы её переименуете в btGenerateRandomNumbers - то уже любой сможет догадаться, что как-то эта кнопка связана с генерацией случайных чисел
кстати, вместо Memo1 можно дать имя memoChisla, вместо Memo2 - memoShetchikiDiapazonov и т.д. и т.п.

Последний раз редактировалось Serge_Bliznykov; 17.04.2013 в 16:51.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.04.2013, 20:44   #28
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Как я вам благодарна! Глазам своим не верю, что всё работает!
СПАСИБО ОГРОМНОЕ!!!
Оль4ик вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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