Ако желимо да пронађемо просек неког скупа елемената, биће нам потребна само једна for петља. Унећемо и сабраћемо вредности у једној итерацији, па ћемо добијену суму поделити бројем елемената. Као што примећујете нигде нема низа! Све смо решили једним пролазом кроз колекцију елемената. И то је могуће све док се не јави проблем који захтева два пролаза, где је већ неопходно искористити низ! Друга итерација ће нам тражити елеменат који је испод или изнад просечне вредности.
|
Погледајмо следећи пример: Хоћемо да напишемо програм који израчунава колики је натпросечан резултат постигнут на Олимпијским играма у Лондону 2012.године. |
|
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 итерацији сабирања чланова низа. | ![]() |
Сазнај нешто више о Олимпијским играма:
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);
}
}
}
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);
}
}
}