Израчунавање просечне вредности

Ако желимо да пронађемо просек неког скупа елемената, биће нам потребна само једна for петља. Mожемо унети и сабрати вредности у једној итерацији, а затим добијену суму поделити бројем елемената из дате колекције. Као што примећујете, низ нам није био потребан! Све смо решили додавањем једног по једног елемента формирајући суму. Ово је могуће све док се не јави проблем који захтева два пролаза, где је већ неопходно искористити низ! У другој итерацији би могли да тражимо елемент који је испод или изнад просечне вредности.

Погледајмо следећи пример:

Хоћемо да напишемо програм који израчунава колики је натпросечан резултат постигнут на Олимпијским играма у Лондону 2012.године.
Како знамо да на оваквим спортским дешавањима учествује огроман број спортиста из целога света, било би незгодно формирати низ који би садржао освојене поене сваког од њих, зато ћемо се задовољити неким произвољно великим бројем уноса, нпр. да одредимо просек за првих 50 такмичара или више, што ће бити могуће. Затим ћемо приказати све учеснике који су освојили већи број поена од просечне вредности.

Упутство: Елементе уносити са стандардног улаза све док се не унесе одређена вредност нпр. 0 или наредба за прекид break.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class  Program
    {
        static void Main(string[] args)
        {	
            //Deklarisanje promenljivih
            int i;
            double prosek;
            //n evidentira broj unetih rezultata takmicara
            int n = 0;  
            //b cuva tekucu unetu vrednost
            int b;
            int suma = 0;
            int []a = new int[50];
  
            Console.WriteLine("Unesi elemente niza:");
           
	    //Sa standardnog ulaza se unosi broj poena prvog takmicara
            b = int.Parse(Console.ReadLine());
  
            while(b != 0)
            {
		/*Poene svakog takmicara smestamo u niz a, dok se promenljivom n izrazava
		pozicija takmicara u nizu*/
                a[n] = b;
                //Sve dok ne unesemo nulu, promenljiva n se uvecava
                n++;
	        //Unosimo poene sledeceg takmicara
                b = int.Parse(Console.ReadLine());
            }
  
            //Prikaz tacnog broja unetih elemenata niza
            Console.WriteLine("Uneli ste"+ n + "elemenata");
  
   
            for(i = 0;i < n;i++)
            {
	        //Sabiramo poene svih ucesnika takmicenja
                suma = suma + a[i];
            }
			
	    //Racunamo prosecnu vrednost na takmicenju
            prosek = suma / n;
  
           Console.WriteLine("Prosecan rezultat koji je postiglo"+ n +"takmicara je" + prosek);
    
	    //Proveravamo da li ima ucesnika sa vecim brojem poena od prosecnog
            for(i = 0;i < n;i++)
            {
                if(a[i] > prosek)
                {
                    Console.WriteLine("Poeni takmicara koji su iznad prosecnog rezultata:"
					                                    + a[i] + "/n");
                }
            }
	}
    }
}
   
  

Напомена: Да не би дошло до забуне, користили смо променљиву n као бројач у while петљи, пошто смо желели да она представља и тачан број унетих елемената у наставку задатка, где смо је у тој функцији и користили у for итерацији сабирања чланова низа.

Сазнај нешто више о Олимпијским играма:

Летње олимпијске игре 2012. одржане су у главном граду Уједињеног Краљевства Лондону од 27.јула до 12.августа.
Лондон је тако постао први град у историји модерног олимпизма који је три пута био домаћин игара, захваљујући претходним домаћинствима из 1908. и 1948. Већина спортских објеката смештена је у Олимпијском парку, који се налази у источном делу Лондона, где се налази и централни Олимпијски стадион.
На играма је учествовало 10.500 спортиста из 204 земље који су се такмичили у 36 спортова и 302 дисциплине.



Пример 2. Израчунати просечну висину ученика једног одељења као и висину ученика која је најближа просечној.


Решење:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class  Program
    {
        static void Main(string[] args)
        {		
	    int i,n;
            double prosek;
	   //Promenljiva najblizi ce cuvati visinu ucenika najblizu prosecnoj visini svih ucenika	
	    int najblizi;
	    int suma = 0;
  
            //Pretpostavimo da odeljenje nema vise od 30 ucenika
            double[] a = new double[30];

	    //Sa standardnog ulaza unosimo broj ucenika
	    Console.WriteLine("Unesi broj ucenika datog odeljenja:");

	    n = int.Parse(Console.ReadLine());

	    //Unosimo visine ucenika(mogu biti realnog tipa double) i smestamo ih u niz a[]
	    Console.WriteLine("Unesi visine ucenika: ");
			   
	    for (int i = 0; i < n; i++)
            {
                a[i] =Double.Parse(Console.ReadLine());
            }
            //Racunamo sumu visina svih ucenika
            for(i = 0;i < n;i++)
            {
                suma = suma + a[i];
            }
            prosek = suma / n;
   
            //Postavljamo prvi elemenat niza da bude najblizi proseku
            najblizi = a[0];
            /*Kako smo pretpostavili da je visina pravog ucenika najbliza proseku, 
	    razmatramo visine pocev od drugog elemnta u nizu - i=1*/ 
            for(i = 1;i < n;i++) 
            {
                //Math.Abs() vraca apsolutnu vrednost broja u zagradi
                /*Ako je razlika izmedju tekuce visine i prosecne manja od razlike tekuce najblize 
		visine prosecnoj i prosecne, onda takuca visina a[i] postaje najbliza prosecnoj*/
                if(Math.Abs(a[i]-prosek) < Math.Abs(najblizi-prosek)) 
                {
                    najblizi=a[i];
                }
            }
            //Ispisujemo visinu ucenika koja je najbliza prosecnoj visini celog odeljenja
  
            Console.WriteLine("Visina ucenika najbliza prosecnoj visini je:"+ najblizi); 
        }   
    }
}



Пример 3. Написати програм који учитава низ бројева типа double и рачуна аритметичку, геометријску и хармонијску средину унетих бројева.


Решење:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
    class  Program
    {
        //Definisemo funkciju koja racuna aritmeticku sredinu n clanova niza niz[]
        static double aritmeticka_sredina( double[] niz, double n) 
        {
            int i;
            double sredina, suma = 0;
            for (i = 0; i < n; i++)
            { 
                //Racunamo sumu svih elemenata niza
                suma+=niz[i];
            }
			
            //Aritmeticka sredina je jednaka kolicniku sume svih clanova i broja clanova
            sredina = suma / n;
            return sredina;
        }
        //Definisemo funkciju koja racuna geometrijsku sredinu n clanova niza niz[]
        static double geometrijska_sredina( double[] niz,  double n)
        {
            int i;
            double sredina = 0.0;
            double proizvod = 1;
            for (i = 0; i < n; i++)
            {
                //Racunamo proizvod svih clanova niza niz[]
                proizvod *= niz[i]; 
            } 
			
            //1/n*exp(x) je n-ti koren iz x
            //Math.Exp i Math.Log definisane funkcije u C#
            sredina = Math.Exp(1/n*Math.Log(proizvod)); 
            return sredina;
        }
        //Definisemo funkciju koja racuna harmonijsku sredinu n clanova niza niz[]
        static double harmonijska_sredina( double[] niz,  double n)
        {
            int i;
            double sredina;
	    //Promenljiva rsuma predstavljace zbir reciprocnih vrednosti clanova niza niz[]
            double rsuma = 0;
			
            for (i = 0; i < n; i++)
            {
                //rsuma = 1/niz[0] + 1/niz[1] +....+ 1/niz[n-1]
                rsuma += (1 / niz[i]);                   
            }
	    /*Harmonijsku sredinu dobijamo kao kolicnik broja elemenata niza i sume 
	    reciprocnih vrednosti elemenata*/
            sredina = n / rsuma;
            return sredina;
        }
        static void Main(string[] args)
        {
            double[] a = new double[50];
            double dim;
            int i;
            double a_sredina, h_sredina, g_sredina;
			
            Console.WriteLine("Unesite broj clanova niza");
            dim = double.Parse(Console.ReadLine());
			
            Console.WriteLine("Unesite clanove niza");
            for (i = 0; i < dim; i++) 
            {
                a[i] = double.Parse(Console.ReadLine());
            }
			
            /*Pozivamo funkcije koje ce nam izracunati aritmeticku, geometrijsku
            i harmonijsku sredinu elemenata niza a*/
            a_sredina = aritmeticka_sredina(a,dim);
            g_sredina = geometrijska_sredina(a,dim);
            h_sredina = harmonijska_sredina(a, dim);

            Console.WriteLine("Aritmeticka sredina unetih brojeva je:", a_sredina);
            Console.WriteLine("Geometrijska sredina unetih brojeva je:", g_sredina);
            Console.WriteLine("Harmonijska sredina unetih brojeva je:", h_sredina);
        }
    }
}