- съставно условие
- алгоритъм на Евклид
- естествено число - прости делители
- решето на Ератостен
- цифри и числа
- побитови операции
- точност при извеждане
- проверка на входни данни
- наредба - сортиране
- сортиране - пряк избор
- сортиране - вмъкване
- сортиране размяна
- сливане на редици
- вмъкване на елемент
- двумерен масив
- диагонал в матрица
- матрица
- матрица - транспониране
- матрица - събиране
- матрица - умножение
- множество - елементи
- множество - допълнение
- множества - обединение
- множества - разлика
- множества - сечение
- линейно уравнение
- квадратно уравнение
- полином
- рекурсия - итерация
- числов триъгълник
- минимална стойност
- средна стойност
- факториел
- числа на Фибоначи
- Питагорова тройка числа
- палиндром - решена задача
- алчен алгоритъм
- египетски дроби
- комбинации
средна стойност - средно хармонично, квадратично, геометрично
Съдържание
средна стойност с цикъл
средна стойност с рекурсия
средно хармонично, средно квадратично и средно геометрично
средна пpетеглена стойност
мода - статистика
Определение за средна стойност: сумата от всички стойности в дадена статистическа съвкупност от данни разделена на броя елементи, участващи в тази съвкупност.
Пример: 2,3,4,5 средна стойност = (2 + 3 + 4 + 5 )/4 = 3.5Независимо дали се ползва итерация или рекурсия началната стойност на сумата се установява на 0.
Следващата блок схема илюстрира изчисляване на средна стойност:
средна стойност - средно аритметично с цикъл
Реално първият елемент от масива има индекс 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 programa 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/(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 preteglena 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
Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.