| 
			| 
					
						| 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 » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	|  |