подскажите, есть ли способ считать сабж не сложением элементов и итоговым делением на количество, а каким-либо другим способом?
Black_mirror А скобочки зачем стоят Код (Text): //WATCOM 1.8 #include <windows> void average(long& a, unsigned long& n, long x) { a=((a*n++)+x)/n; } /* 00401010 /$ 68 0C000000 PUSH 0C 00401015 |. E8 8F010000 CALL test.004011A9 0040101A |. 51 PUSH ECX 0040101B |. 56 PUSH ESI 0040101C |. 89C1 MOV ECX,EAX 0040101E |. 8B02 MOV EAX,DWORD PTR DS:[EDX] 00401020 |. 8D70 01 LEA ESI,DWORD PTR DS:[EAX+1] 00401023 |. 8932 MOV DWORD PTR DS:[EDX],ESI 00401025 |. 0FAF01 IMUL EAX,DWORD PTR DS:[ECX] 00401028 |. 01D8 ADD EAX,EBX 0040102A |. 31D2 XOR EDX,EDX 0040102C |. F7F6 DIV ESI 0040102E |. 8901 MOV DWORD PTR DS:[ECX],EAX 00401030 |. 5E POP ESI 00401031 |. 59 POP ECX 00401032 \. C3 RETN */ int main() { char g[1024]; long a=0; unsigned long n=0; average(a,n,100); average(a,n,200); average(a,n,300); average(a,n,10); average(a,n,20); average(a,n,30); average(a,n,1); average(a,n,2); average(a,n,3); AllocConsole(); WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), g, wsprintfA(g,"%u of %u",a,n), &n, NULL); ReadFile(GetStdHandle(STD_INPUT_HANDLE), g, 1, &n, NULL); return 0; }
max7C4 под рукой только BC31 сейчас есть: Код (Text): ; ; for(int i=0;i<5;i++) ; ?debug L 11 xor si,si jmp short @1@114 @1@58: ; ; { ; av=av=((av*n++)+x[i])/n; ; ?debug L 13 mov bx,si shl bx,1 lea ax,word ptr [bp-10] add bx,ax mov ax,word ptr [bp-14] imul word ptr [bp-12] add ax,word ptr [bx] cwd idiv word ptr [bp-12] mov word ptr [bp-14],ax mov word ptr [bp-14],ax inc word ptr [bp-12] ?debug L 11 inc si @1@114: cmp si,5 jl short @1@58 Так что видимо нужно смотреть стандарт.
мм, если считать в целых числах под сумму одинаково придёться выделить переменную большей размерности
Между прочим, n++ != n. З.Ы. Кста, метод вполне рабочий и в некоторых случаях (если можно закрыть глаза на накопление ошибки) - крайне рекомендуемый.