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