Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Как найти макс мин средн в массиве неизвестной длины?  (Прочитано 41981 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Pu
Большой босс

ru
Offline Offline
78


« Ответ #30 : 09-09-2003 09:55 » 

2Aleck D.Shadow - не за что , я просто использую эту формулу для получения среднего в RealTime мне на вход через произвольнойе время (1-60 сек)может попасть число  и за смену 8 ч или там произвольное время надо получить среднее. (извини если не в тему - я подумал похоже) Жаль
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #31 : 09-09-2003 09:56 » new

Что???
Пространтсва?Не понял
 4 элемента по 4 байта + 4 байта = 8 байт - максимум при 16 байт на unsigned long - содержимое + 16 байт при миллиардных индексах...

Отрезая по 5 с каждого конца получится 5 * 32 * 2 = 320 БАЙТ  Я шокирован! это много  :?:
Записан

А птичку нашу прошу не обижать!!!
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #32 : 09-09-2003 10:07 » 

Не вообще вроде как Гром прав нужно делать массив из структур типа
индекс,мин,макс,сумма.
Потом сумму поделить на индекс есть среднее.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #33 : 09-09-2003 10:08 » 

Естсественно Улыбаюсь
Записан

А птичку нашу прошу не обижать!!!
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #34 : 09-09-2003 10:13 » 

Цитата

Что???
Пространтсва?Не понял

Ну это если в байтах, а если в двойных словах, да еще компьютер из себя представляет наладонник?   Улыбаюсь
А вообще точно Гром ты меня навел на правильный путь.Thanx. :!:
Записан
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #35 : 09-09-2003 10:18 » 

Кстати, хочу заметить(или отметить ради справедливости) что всё таки SlavaI был первее, я просто не до конца его мысль понял. Зато Гром доходчивее прояснил.
Всем спасибо.
Похоже, что лучше варианта решения проблемы всё равно нет.
Записан
Never
Команда клуба

ua
Offline Offline
Пол: Женский

« Ответ #36 : 10-09-2003 10:54 » 

Люди, я не въехала: если вы принимаете из потока, из потока ввода? Тогда вы когда-нибудь да прекратите ввод. Например по Enter? Можно же привязать к этой клавише определение длины получившегося массива. Или из другого потока?  Вот такой я вот
Записан

не умеете летать- не мучайте метлу!
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #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ка » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #40 : 11-11-2007 20:50 » 

Тему не помню, но щас прочитал...

Ане4ка, на первый взгляд всё верно говоришь, загвоздка в том (насколько я понял, поправьте если что) , что массив не лежит сразу в памяти, его вводят по циферке. И предлагается посчитать некоторые параметры в динамике.
Конечно, можно брать текущий уже введённый отрезок и считать для него каждый раз по простому алгоритму - а почему бы, кстати, и нет ?
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #41 : 12-11-2007 07:16 » 

Даже в динамике разницы особой нет - алгоритм один и тот же.

Код: (C)
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;
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #42 : 12-11-2007 07:23 » 

RXL, а первые N и последние M введённых не надо учитывать
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #43 : 12-11-2007 07:31 » 

Тогда два пути:
1. Буферизировать все и по окончанию ввода выбрать только нужный диапазон.
2. Пропустить N, а все последующее пропускать через FIFO глубиной M (буфер задержки). Что выходит из FIFO при переполнении пускать в расчет.

Код: (C)
#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 » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines