Pu
Большой босс
Offline
78
|
|
« Ответ #30 : 09-09-2003 09:55 » |
|
2Aleck D.Shadow - не за что , я просто использую эту формулу для получения среднего в RealTime мне на вход через произвольнойе время (1-60 сек)может попасть число и за смену 8 ч или там произвольное время надо получить среднее. (извини если не в тему - я подумал похоже)
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #31 : 09-09-2003 09:56 » |
|
Что??? Пространтсва? 4 элемента по 4 байта + 4 байта = 8 байт - максимум при 16 байт на unsigned long - содержимое + 16 байт при миллиардных индексах... Отрезая по 5 с каждого конца получится 5 * 32 * 2 = 320 БАЙТ это много :?:
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Aleck D.Shadow
|
|
« Ответ #32 : 09-09-2003 10:07 » |
|
Не вообще вроде как Гром прав нужно делать массив из структур типа индекс,мин,макс,сумма. Потом сумму поделить на индекс есть среднее.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #33 : 09-09-2003 10:08 » |
|
Естсественно
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Aleck D.Shadow
|
|
« Ответ #34 : 09-09-2003 10:13 » |
|
Что??? Пространтсва? Ну это если в байтах, а если в двойных словах, да еще компьютер из себя представляет наладонник? А вообще точно Гром ты меня навел на правильный путь.Thanx. :!:
|
|
|
Записан
|
|
|
|
Aleck D.Shadow
|
|
« Ответ #35 : 09-09-2003 10:18 » |
|
Кстати, хочу заметить(или отметить ради справедливости) что всё таки SlavaI был первее, я просто не до конца его мысль понял. Зато Гром доходчивее прояснил. Всем спасибо. Похоже, что лучше варианта решения проблемы всё равно нет.
|
|
|
Записан
|
|
|
|
Never
|
|
« Ответ #36 : 10-09-2003 10:54 » |
|
Люди, я не въехала: если вы принимаете из потока, из потока ввода? Тогда вы когда-нибудь да прекратите ввод. Например по Enter? Можно же привязать к этой клавише определение длины получившегося массива. Или из другого потока?
|
|
|
Записан
|
не умеете летать- не мучайте метлу!
|
|
|
Aleck D.Shadow
|
|
« Ответ #37 : 10-09-2003 12:04 » |
|
To Never: Можно. Но это мне не надо.
|
|
|
Записан
|
|
|
|
sh_m
Гость
|
|
« Ответ #38 : 10-09-2003 12:14 » |
|
to Aleck D.ShadowТы когда проблему добьешь, напиши как-именно. Интересно всетаки
|
|
|
Записан
|
|
|
|
Ане4ка
Гость
|
|
« Ответ #39 : 11-11-2007 18:00 » |
|
Может, неправильно поняла (да и тема давнишняя), но, кажется, всё просто: Первые Н отбрасываем, дальше бежим по массиву двумя указателями (помним 2 индекса) с разницей в К элементов между ними. На каждой итерации (при переходе к следующему элементу) двигаем оба указателя на единичку. Первый указатель следит, чтобы не появился конец массива, а второй обозначает то число, которое сейчас рассматривается. Ещё у нас есть 4 переменные: текущий максимум, минимум, набранная сумма и кол-во расмотренных элементов. Если текущий больше максимума, переприсваиваем максимум, если меньше минимума, изменяем минимум, в любом случае прибавляем элемент к сумме и увеличиваем кол-во рассмотренных. Когда первый указатель наткнулся на конец массива, делим сумму на кол-во рассмотренных. Всё, у нас есть все ответы.
|
|
« Последнее редактирование: 11-11-2007 18:05 от Ане4ка »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #40 : 11-11-2007 20:50 » |
|
Тему не помню, но щас прочитал...
Ане4ка, на первый взгляд всё верно говоришь, загвоздка в том (насколько я понял, поправьте если что) , что массив не лежит сразу в памяти, его вводят по циферке. И предлагается посчитать некоторые параметры в динамике. Конечно, можно брать текущий уже введённый отрезок и считать для него каждый раз по простому алгоритму - а почему бы, кстати, и нет ?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #41 : 12-11-2007 07:16 » |
|
Даже в динамике разницы особой нет - алгоритм один и тот же. int n, min, max, sum, cnt; float avg;
sum = cnt = 0;
while (....ввод в n...) { if (n < min) min = n; if (n > max) max = n; cnt++; sum += n; }
avg = ((float)sum)/cnt;
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #42 : 12-11-2007 07:23 » |
|
RXL, а первые N и последние M введённых не надо учитывать
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #43 : 12-11-2007 07:31 » |
|
Тогда два пути: 1. Буферизировать все и по окончанию ввода выбрать только нужный диапазон. 2. Пропустить N, а все последующее пропускать через FIFO глубиной M (буфер задержки). Что выходит из FIFO при переполнении пускать в расчет. #define N 5 #define M 4
int z[M]; int z_free = M; int z_pos = 0; int pass_free = N; int out_val, new_val; int min = 0, max = 0, sum = 0, cnt = 0; float avg = 0;
while (....ввод в new_val...) { if (pass_free) { pass_free--; } else if (z_free) { z[z_pos++] = new_val; z_free--; } else { if (z_pos >= M) z_pos = 0;
out_val = z[z_pos]; z[z_pos++] = new_val;
if (out_val < min) min = out_val;
if (out_val > max) max = out_val;
sum += out_val; cnt++; } }
avg = ((float)sum)/cnt;
|
|
« Последнее редактирование: 12-11-2007 07:43 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|