Средна стойност - средно хармонично, квадратично, геометрично
Съдържание
средна стойност с цикъл
средна стойност с рекурсия
средно хармонично, средно квадратично и средно геометрично
средна пpетеглена стойност
мода - статистика
средна стойност - средно аритметично с цикъл
Определение за средна стойност: сумата от всички стойности в дадена статистическа съвкупност от данни разделена на броя елементи, участващи в тази съвкупност.
Пример: 2,3,4,5 средна стойност = (2 + 3 + 4 + 5 )/4 = 3.5
Независимо дали се ползва итерация или рекурсия началната стойност на сумата се установява на 0.
Следващите две примерни програми илюстрират работата на този алгоритъм
Следва сорс код на примерна програма, даваща решена задача за средна стойност чрез итерация
#include <iostream>
using namespace std;
const int n=5;//obsh broj na elementite
int mas[n]={3,7,10,5,8};
int have_sredna_I( )
{ int i,sum=0;
for (i=0;i<n;i++) {sum+=mas[i];}
return sum;
}//funciq za izchislqwane na sredna stojnost
int main()
{ int i;
double sred;
cout<<"Da se systawi programa, izpolzwasha rekursiwna funkciq, koqto\n";
cout<<"izwevda w obratna posledowatelnost stojnostite na otdelnite elementi\n";
cout<<"ot daden ednomeren masiw (wektor).\n";
cout<<"Nachalni stojnosti na masiwa:\n";
for (i=0;i<n;i++) {cout<<mas[i]<<" ";}
cout<<endl;
sred=have_sredna_I();//obsha suma na elementite
cout<<" obsha suma na elementite: "<<sred<<endl;
cout<<" broj na elementite: "<<n<<endl;
cout<<" sredna stojnost na elementite: "<<sred/n<<endl;
system("pause");
return 0;//
}//kraj na programata sredna stojnost
Начало на страницата
средна стойност с рекурсия
Следва сорс код на примерна програма
(DEV C++), даваща решена задача за средна стойност чрез рекурсия
#include <iostream>
using namespace std;
const int n=5;//obsh broj na elementite
int mas[n]={3,7,10,5,8};
int have_sredna_R( int chis )
{if ( chis >=0 )
{ return have_sredna_R( chis-1 )+mas[chis];
} else return 0;
//inicializaciq nachalnata stojnost na sumata i dyno na rekursiqta
}//kraj na rekursiwnata funkciq za sredna stojnost
int main()
{ int i;
double sred;
cout<<"Da se systawi programa, izpolzwasha rekursiwna funkciq, koqto\n";
cout<<"izwevda w obratna posledowatelnost stojnostite na otdelnite elementi\n";
cout<<"ot daden ednomeren masiw (wektor).\n";
cout<<"Nachalni stojnosti na masiwa:\n";
for (i=0;i<n;i++) {cout<<mas[i]<<" ";}
cout<<endl;
sred=have_sredna_R(n-1);//rekursiwna funkcia
cout<<" obsha suma na elementite: "<<sred<<endl;
cout<<" broj na elementite: "<<n<<endl;
cout<<" sredna stojnost na elementite: "<<sred/n<<endl;
system("pause");
return 0;
}//kraj na programa sredna stojnost
Начало на страницата
средно хармонично, средно квадратично и средно геометрично
Нека е дадена числовата редица a1,a2,a3…an., където N е техния брой, а елементите a1,a2,...an са естествени числа .
а)
средно хармонично. Средно хармонично на редицата H представлява отношение между броя на
елементите N към сумата от реципрочните стойности на всички елементите от редицата:
H = N/(1/a1 + 1/a2 + ….+ 1/an)
б)
средно квадратично. Средно квадратично на редицата е корен квадратен от отношението между сумата на квадратите (втората степен на
елементите) разделен на N - броя на всички числа в редицата.
Ssk = sqrt((a1^2 +a2^2 +…..+an^2)/ N)
в)
средно геометрично. Средно геометрично на редицата е корен n-ти от произведението на всички елементи в
редицата - броят на елементите е N.
Ssg = (a1*a2*…an)^(1/n)
Алгоритъмът прилича на алгоритъма за средно аритметично с
тази разлика, че вместо да се събират, числата се умножават и вместо след това
да се разделят на N - броя числа, се изчислява n-тия корен на произведението им.
Имаме следната задача:
Предварително са въведени N цели числа. Трябва да се изчисли: средно хармонична, средно квадратична и средно геометрична стойност от най-голямата цифра за всяко от тези числа.
Алгоритъм:
Генерираме N броя цели случайни числа в едномерен масив - чрез цикъл.
В цикъл търсим най-голямата цифра на всяко от въведените числа. Алгоритъмът е както при търсене на максимална стойност.
Намираме най-дясната цифра и я приемаме за максимална. В цикъл делим числото на 10 и проверяваме дали последната му цифра е по-голяма от намерената до момента.
Цикълът продължава докато числото е по-голямо от 0.
В отделни променливи натрупваме последователно:
сумата от реципрочната стойност от най-голямата цифра за всяко от въведените числа;
сумата от квадрата (втората степен) от най-голямата цифра за всяко от числата;
произведението от най-голямата цифра за всяко от същите числа;
Следващата примерна програма дава решена задача за изчисляване на средно хармонично, средно квадратично и средно геометрично:
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <cmath>
using namespace std;
int const br=11, razmah=12345;//maksimalnoto chislo
void wywevda( int mas[])
{int i;
cout<<"Izbrani sa slednite chisla: \n";
for(i=0; i<br; i++) {mas[i]=rand () %razmah;cout<<mas[i]<<"; ";}
cout<<endl;
}
int max_cifra(int chislo)
{int rez;
rez = chislo%10;//priemame naj-dqsnata cifra za maksimalna
while (chislo>0)
{ chislo/=10;//mahame poslednata cifra
if (chislo%10>rez) rez = chislo%10;//otkrita e nowa maksimalna stojnost
}//while
return rez;
}// maksimalna cifra
int main ()
{int mas[br];
double sr_kwad,sr_geom,sr_harm,kor,proiz,znam,k ;
int i, j,suma_kwad;
char ose;
cout<<"Imate N - estestweno chislo ot interwala [5..105] i N na broj \n";
cout<<"celi chisla ot interwala [0..12345]. Tyrsim sredno harmonichnata \n";
cout<<"sredno geometrichnata i sredno kwadratichnata stojnost ot naj-golemite \n";
cout<<"cifri na tezi chisla.\n";
cout<<"Da se systawi programa, chrez koqto se wywevdat N chisla i se izwevda\n";
cout<<"credno harmonichnata, geometrichnata i kwadratichnata stojnosti ot cifrite.\n";
do {
wywevda( mas);//generira N broq celi chisla
znam=0;//inicializaciq na sumata ot reciprochnite stojnosti na maksimalnite cifri
proiz=1;//inicializaciq za natrupwane na proizwedenie ot maksimalnite cifri
suma_kwad=0;//sumata ot kwadratite na naj-golemite cifri
kor=(double)1/br;//kakyw koren she tyrsim pri sredno geometrichnata stojnost
for (i=0; i<br; i++)//broj chisla
{ j=max_cifra(mas[i]);//naj-golqmata cifra w porednoto chislo
k=(double) 1/j;//reciprochnata stojnost na maksimalnata cifra
znam+=k;//sumata ot reciprochnite stojnosti na maksimalnite cifri
suma_kwad+=j*j;//suma ot kwadrata na maksimalnata cifra
proiz*=j;//proizwedenie ot maksimalnite cifri
cout<<mas[i]<<" s maksimalna cifra: "<<j<<";1/"<<j<<" = "<<k<<endl;
}//for
sr_harm=br/znam;//broj / suma ot reciprochnite im stojnosti
cout<<" sredno harmonichna stojnost: "<<sr_harm<<endl;
sr_geom=pow(proiz,kor);//koren N-ti ot proizwedeieto
cout<<" sredno geometrichna stojnost: "<<sr_geom<<endl;
sr_kwad=sqrt(suma_kwad/br);//koren kwadraten ot otnoshenieto suma na kwadrati/broj
cout<<" sredno kwadratichna stojnost: "<<sr_kwad<<endl;
cout<<"Velaete li prowerka s drugi chisla <y/n>: ";cin>>ose;
} while (ose=='y');
system("pause");
return 0;
}//kraj na programa sredna stojnost
Начало на страницата
средна пpетеглена стойност
В следващите няколко реда ще направим съпоставка между средно аритметично и претеглена средна стойност.
Нека имаме редица от N елемента ( естествени числа ), в която участват M броя различни елементи.
Съществува релацията M<N, т.е. има повтарящи се елементи. Елементите са стойности измерени в определено изследване и представляват определен тип извадка.
Ако търсим средно аритметично: то е отношение между сумата на всичките N елемента към техния брой N.
Формулата би изглеждала: (а1 +а2 +...аn)/N, където а е стойността
на всеки отделен елемент. При пресмятането му участват всички стойности и
крайният резултат е чувствителен към всяка промяна на коя да е от
стойностите. Наличието на дори и една екстремална стойност в извадката оказва
влияние върху средната. Това е и един от най-съществените недостатъци на средно
аритметично (средна стойност), който води до деформиране на най-характерния
резултат в разпределението.
При претеглена средна стойност се отчитат
коефициенти на тежест за всяко отделно измерване и тя представлява отношение
между сбора от произведението на теглото на всеки елемент/член (броят на
срещанията му) и стойността му в дадена извадка към общия брои елементи. Ще
означаваме с p броят/тежестта на
всеки елемент, а с А стойността му. Формулата би изглеждала (p1*A1 + p2*A2 + pm*Am)/N, където N=p1+p2+…pm.
Задачата е следната: имаме N естествено число от интервала [3..103], както и въведени N двойки числа,
представляващи среден успех на група и брой човека във всяка от групите.
Трябва да се изчисли средна стойност на успеха (средно аритметично) и средна претеглена стойност.
Следващата примерна програма дава решена на задача за изчисляване на претеглена средна стойност:
#include <iostream>
using namespace std;
const int broi=3;
struct usp {int br; double stojn;}
uspeh[broi];
void wywevdane( )
{int i,br_u,br_uch;
double st_u,sr_uspeh,pret_uspeh;
br_uch=0;
sr_uspeh=pret_uspeh=0;
for (i=0;i<broi;i++)
{cout<<"Broj uchenici w grupa "<<i+1<<": ";cin>>br_u;
uspeh[i].br=br_u;//broj uchenici za grupata
br_uch+=br_u;//obsh broj uchenici
cout<<"Sreden uspeh za grupa "<<i+1<<": ";cin>>st_u;
uspeh[i].stojn=st_u;// stojnost za uspeh na grupata;
sr_uspeh+=st_u;
}
cout<<"Sredno aritmetichno - sredna stojnost za uspeha: "<<sr_uspeh/broi<<endl;
for (i=0;i<broi;i++)
{pret_uspeh+=uspeh[i].br*uspeh[i].stojn;}
cout<<"Sredna preteglena stojnost za uspeha: "<<pret_uspeh/br_uch<<endl;
} // sredna stojnost
int main ()
{char ose;
cout<<"Imate N - estestweno chislo ot interwala [5..10] i N na broj\n";
cout<<"dwojki chisla predstwlqwashi: broi uchenici w grupi [2..30], kakto i\n";
cout<<"sredniq uspeh za grupata [2.01..6.00].\n";
cout<<"Da se systawi programa, chrez koqto se wywevdat N dwojki chisla i se\n";
cout<<"izwevda sredna stojnost i sredna preteglena stojnost za tezt danni.\n";
cout<<"Primer: 3, 2.5; 4, 4.25; 5 5.25 Izhod: 4 4.22917\n";
do {
wywevdane( );
cout<<"Velaete li nowo mnovestwo ot chisla <y/n>: ";cin>>ose;
} while (ose=='y');
system("pause");
return 0;
}//kraj na programa sredna stojnost
Начало на страницата
мода - статистика
Мода е термин от математическата статистика. Тя
се определя като стойността с най-голяма честота на срещане в множеството от
данни. При групирани данни за мода се приема средата на класа с най-голяма
честота. Когато две несъседни стойности се наблюдават/срещат по-често от
останалите стойности тогава разпределението се нарича бимодално:
Задачата е следната:
Имате естествено число N от интервала [5..105], както и редица от N елемента, всички те цели числа от интервала [0..12345]. Числата не са непременно различни.
Да се състави програма, чрез която се проверява дали в множеството на всички цифри от тези числа се формира мода или множеството е бимодално.
Множеството на цифри в десетичната позиционна бройна система включва 0,1,2,3,4,5,6,7,8,9, т.е. 10 елемента.
Включени са следните алгоритми:
генериране на N броя цели случайни числа. Това е реализирано чрез функцията inicializacia.
намиране на всички цифри в цяло число - чрез последователно делене на 10. Използвана е рекурсивната функция br_cifri.
търсене на най-голяма стойност - цифрите са съхранени в едномерен масив и се отчита елемента с най-голяма стойност. Това е реализирано чрез функцията moda.
Следващата примерна програма дава решение на
задача от статистика за намиране на мода - стойност с най-голяма честота на срещане:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int const br=11, razmah=12345;//broj chisla i maksimalnoto chislo
int cifri[10];//obsh broj cifri w 10-ichna brojna sistema
void inicializacia( int mas[])
{int i;
for (i=0;i<10;i++) {cifri[i]=0;
}//nuilirane broj cifri w chgislata
cout<<"Izbrani sa slednite chisla: \n";
for(i=0; i<br; i++) {mas[i]=rand () %razmah;cout<<mas[i]<<"; ";}
cout<<endl;
}
int br_cifri(int a) //rekursiwna funkciq za opredelqne broj cifri w chisloto
{ if (a>0)//dokato ne e dostignata poslednata cifra (naj-lqwata) na chisloto
{ cifri[a%10]++;//poslednata cifra, najdqsna cifra - uwelichawa se broqt na sreshaniqta
return br_cifri(a/10)+1;//rekursiwno izwikwane kato a se deli celochisleno na 10
}
return 0;
}//int br_cifri(int a)
void moda ()
{int i,br,ma_x,nom;
br=nom=1;
ma_x=cifri[0];//maksimalen broj e pyrwiq element
for (i=1;i<10;i++)
{ if (ma_x==cifri[i]){ br++;nom=i;}
if (ma_x<cifri[i]) {br=1;ma_x=cifri[i];nom=i;}//now maksimalen element
}//for i
if (br==1) {cout<<"Cifrata "<<nom<<" e moda.\n";} //nalichie na moda
else cout<<"Ima "<<br<<" cifri s maksimalna chestota. Poslednata e "<<nom<<endl;
//bimodalno razpredelenie
}//void moda
int main ()
{int mas[br];
int i, obs_broi,broi;
char ose;
time_t t;
srand((unsigned) time(&t));//inicializira generator na suchajni chisla
cout<<"Imate N - estestweno chislo ot interwala [5..105] i N na broj estestweni chisla\n";
cout<<"ot interwala [0..12345]. Tyrsim cifrata s naj-golqma chestota na sreshane\n";
cout<<"Da se systawi programa, chrez koqto se wywevdat N sluchajni chisla i se\n";
cout<<"izwevda cifrata, formirasha moda.\n";
do {
inicializacia( mas);//generira sluchajni chisla
obs_broi=0;//obsh broj na cifrite wyw wsichki chisla
for (i=0; i<br; i++) //prowerqwa posledowatelno wsichki chisla
{ broi=br_cifri(mas[i]);//broj cifri w porednoto chislo
cout<<"Chislo: "<<mas[i]<<" ima broj cifri: "<<broi<<endl;
obs_broi+=broi;
}//for i
cout<<"Obsh broj na wsichki cifri w chislata: "<<obs_broi<<endl;
cout<<"Broj na wsichki sreshnati cifri w chislata po wid: \n";
for (i=0; i<10; i++)
{cout<<i<<":"<<cifri[i]<<"; ";}//for i
cout<<endl;
moda ();
cout<<"Velaete li nowo mnovestwo ot chisla <y/n>: ";cin>>ose;
} while (ose=='y');
system("pause");
return 0;
}//kraj na programa moda
Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.