Средна стойност - средно хармонично, квадратично, геометрично

Съдържание

средна стойност с цикъл
средна стойност с рекурсия
средно хармонично, средно квадратично и средно геометрично
средна п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

Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.

 
Размер на шрифта
Increase Font Size Option 3 Reset Font Size Option 3 Decrease Font Size Option 3
Bulgarian Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Търсене в сайта: