FOR ciklus

for petlja

Treba napisati program koji za proizvoljni prirodni broj n računa sumu

 

i ispisuje rezultat.

 

#include <stdio.h>

int main()

{

int n,i;

double suma;

printf(„Unesite broj n: n= „);

scanf(“ %d“,&n);

suma=0.0;

for(i=1;i<=n;i=i+1)

{

suma=suma+1.0/(i*(i+1));

}

printf(„Suma prvih %d clanova = %f\n“,n,suma);

}

 

Program započinje deklaracijama varijabli. Varijable n i i su celobrojne,

dok je suma realna varijabla tipa double (dvostruke preciznosi).

Naredba

 

printf(„Unesite broj n: n= „);

 

ispisuje znakovni niz „Unesite broj n: n= “ (bez prelaza u novi red).

Pozivom funkciji scanf čita se celi broj sa standardnog ulaza:

scanf(“ %d“,&n);

Program u ovom trenutku čeka da korisnik upiše jedan celi broj.

 

Funkcija scanf pripada standardnoj biblioteci i deklarirana je u standardnoj

datoteci zaglavlja <stdio.h>. Po strukturi je slična funkciji printf.

Njen prvi argument je niz znakova koji sadrži znakove konverzije. U našem

slučaju to je %d koji informiše scanf da se mora prčitati jedan broj tipa int i

smestiti ga u varijablu koja je sledeći argument funkcije (varijabla n).

Stvarni argument funkcije scanf je memorijska adresa varijable n, a ne

sama varijabla n. Adresa varijable dobiva se pomoću adresnog operatora &

(&n je adresa varijable n). Stoga svi argumenti funkcije scanf, osim prvog,

moraju imati znak & ispred sebe.

 

Naredba

for(i=1;i<=n;i=i+1)

{

….

}

je for petlja. Ona deluje na sledeći način:

Prvo se varijabla i inicira tako što joj se pridruži vrednost 1 (i=1).

Inicijalizacija se izvrši samo jednom.

Zatim se testira izraz

i<=n;

Ako je rezultat testa istinit izvršavaju se naredbe iz tela petlje (naredbe u

vitičastim zagradama).

Nakon toga se izvršava naredba

i=i+1;

i kontrola programa se vraća na testiranje istinitosti izraza i<=n.

Petlja se završava kad izraz koji se testira postane lažan.

Program se tada nastavlja prvom naredbom iza tela petlje.

 

for-petlja iz našeg primjera može se zapisati pomoću while-petlje na

ovaj način:

i=1;

while(i<=n)

{

suma=suma+1.0/(i*(i+1));

i=i+1;

}

Naredbe oblika i=i+1 i i=i-1 kojima se brojač povećava, odnosno smanjuje

za jedan sreću se vrlo često pa za njih postoji kraća notacija:

n=n+1 je ekvivalentno s n++,

n=n-1 je ekvivalentno s n–.

Operator ++ naziva se operator inkrementiranja i on povećava vrednost

varijable za 1; Operator — koji smanjuje vrednost varijable za 1 naziva se

operator dekrementiranja. Ti se operatori redovito koriste u for petljama pa

bismo gornju petlju pisali u obliku:

 

for(i=1;i<=n;i++)

suma=suma+1.0/(i*(i+1));

 

Operatore inkrementiranja i dekrementiranja možemo primeniti na celobrojne

i realne varijable.

 

Uočimo još da smo vitičaste zagrade oko tela for-petlje mogli ispustiti jer se telo sastoji samo od jedne naredbe. To važi  za sve vrste petlji.

 

Svaka petlja sadrži u sebi jedan ili više brojača kojim se kontroliše odvijanje

petlje. Brojač je potrebno na početku inicirati i zatim ga u svakom

prolazu petlje povećavati (ili smanjivati). Pelja se zaustavlja testiranjem

brojača.

U while petlji jedino testiranje brojača ulazi u zagrade nakon

ključne reči while. Inicijalizaciju moramo staviti izvan petlje, a promjenu

brojača negde unutar petlje.

U for petlji sva tri elementa dolaze u zagradama iza ključne reči for, u obliku:

 

for(inicijalizacija brojaca; test; promena brojaca)

{

………

}

Inicijalizacija, test i promena brojača odvajaju se znakom točka-zarez (;).

 

Petlja for ima oblik

 

for(izraz_1; izraz_2; izraz_3) naredba;

 

i ekvivalentna je konstrukciji

izraz_1;

while (izraz_2){

naredba;

izraz_3;

}

izraz 1 inicijalizira parametre koji kontrlišu petlju, izraz 2 predstavlja

uslove koji moraju biti zadovoljeni da bi se petlja nastavila izvršavati, a

izraz 3 menja parametre koje je izraz 1 inicirao.

 

for petlja započinje inicijalizacijom kontrolnih parametara. izraz 2 se

izračunava na početku svakog prolaza kroz petlju, a izraz 3 se izračunava

na kraju svakog prolaza kroz petlju.

Ako nema srednjeg izraza pretpostavlja se da je njegova vrijednost 1. Stoga je for(;;); beskonačna petlja koja ne radi ništa.

 

Primeri 1.

#include <stdio.h>

 

int main()

{

int x;

for (x = 1; x < 10; x++)

printf(„x = %d\n“,x);

 

}

Primeri 2.

/* Konverzija centimetara u ince – for petlja */

#include <stdio.h>

#define POCETAK 0

#define KRAJ 100

#define KORAK 10

 

 

int main()

{

int a;

for  (a = POCETAK; a <= KRAJ; a += KORAK)

printf(„%4d cm = %4.2f in\n“, a, a/2.54);

 

}

Primeri 3.Program koji će ispisati engleski alfabet (a,b,c,d…z).

#include <stdio.h>

main() {

char ch;

for(ch=’A’;ch<=’Z’;ch++)

printf(„ASCII kod za %c je %d\n“, ch, ch);

}

Kao sto vidimo, koristili smo promenljivu tipa char i kroz FOR petlju izredjali

sve kombinacije počevši od A pa sve do Z tako što smo promenljivoj ch dali početnu

vrednost ‘A’, uslov je bio sve dok ch nije manje ili jednako sa ‘Z’ (ch<=’Z’) i

nakon svakog prolaza kroz petlju, ch smo uvećavali za 1 (ch++).

 

Primeri 4.

Program koji racuna zbir brojeva koje korisnik unosi:

 

#include <stdio.h>

main() {

int n, broj, i, suma=0;

printf(„koliko brojeva zelis da saberes?\n“);

scanf(„%d“,&n);

for(i=1;i<=n;i++) {

printf(„Unesi %d. broj\n“, i);

scanf(„%d“, &broj);

suma=suma+broj;

}

printf(„suma unetih brojeva je: %d“, suma);

}

 

 

Primeri 5.

Program koji ispisuje sve brojeve od 0 do 99 korišćenjem

FOR petlje.

 

#include <stdio.h>

main() {

int jedinica, desetica;

for(desetica=0;desetica<10;desetica++)

for(jedinica=0;jedinica<=9;jedinica++)

printf(„%d\n“,10*desetica+jedinica);

}

 

Primeri 5.

Program koji ispisuje sve trocifrene brojeve kod kojih je cifra

desetica manja od 5, a cifra jedinica neparna(1,3,5,7,9).

 

#include <stdio.h>

main() {

int i,j,k;

for(i=0;i<10;i++)

for(j=0;j<5;j++)

for(k=1;k<10;k+=2)

printf(„%d\n“,100*i+10*j+k);

}

 

DO WHILE ciklus

DO WHILE ciklus

 

Sintaksa za ciklus DO WHILE:

 

do {

naredba1;

naredba2;

naredba3;

} while(uslov);

 

Kao što vidimo razlika je što kod WHILE ciklusa upisujemo prvo uslov pa zatim naredbe

i zbog ovoga se zove ciklus sa preduslovom, dok se kod DO WHILE ciklusa prvo napise

DO pa naredba ili niz naredbi, a zatim se ispisuje uslov ciklusa i zato se zove

ciklus sa poduslovom.

 

Programeri u vecini slucajeva koriste WHILE ciklus , ali princip rada je isti:

Ciklus se ponavlja sve dok uslov ima vrednost tačno(eng. TRUE) odnosno, dok je različit od 0.

 

Treba paziti da je uvek moguc izlaz iz ciklusa da on ne bi postao beskonacan. Evo primera

WHILE ciklusa. Napisacemo program koji nam omogucava da unosimo brojeve sa tastature

sve dok ne unesemo 0 ili negativan broj, odnosno, program koji nam omogućava

unošenje samo pozitivnih brojeva (brojeva vecih od 0).

——————————————————————————-

#include <stdio.h>

main() {

int broj=1;

while(broj>0) {

printf(„unesi neki broj ili 0 za izlaz: „);

scanf(„%d“, &broj);

printf(„uneli ste %d\n“, broj);

}}

——————————————————————————-

Kada pokrenemo program, ispisace nam se na ekranu poruka „unesi neki broj ili 0 za

izlaz“ nakon cega program ceka za unos sa tastature. Unesemo neki broj, npr. 5 i

pritisnemo enter. Na ekranu nam je ispisana poruka „uneli ste 5“ i ponovo poruka

za unosenje broja. Posto smo videli da program radi, unesimo 0, program ispisuje

poruku „uneli ste 0“ i zavrsava se.

Na početku smo definisali da je varijabla broj=1 da ne bi došlo do zabune i uzimanja

bilo koje vrednosti iz memorije.

Evo istog programa samo napisanog korišćenjem DO WHILE ciklusa:

——————————————————————————-

#include <stdio.h>

main() {

int broj=1;

do {

printf(„unesi neki broj ili 0 za izlaz: „);

scanf(„%d“, &broj);

printf(„uneli ste %d\n“, broj);

} while(broj>0);

}

——————————————————————————-

Kao sto vidimo, razlika je minimalna.

Treba napomenuti da kod DO WHILE ciklusa nakon komande while(uslov) moramo staviti ; dok kod WHILE ciklusa ne stavljamo ;

 

Za razliku od while petlje vrednost izraza se kontroliše na kraju prolaza kroz petlju.

Petlja se stoga izvršava barem jednom.

 

 

 

Primer: 

Napisimo program koji će od korisnika traziti da unese broj veci od 500; ako korisnik unese manji broj program će mu traziti da ponovo unese broj. Evo kako bi izgledao primer ako koristimo while petlju.

 

/*  PROGRAM broj_veci_od_500_while_nacin */

#include <stdio.h>

 

main()

{

//deklaracija promenljive

int n;

 

//uzmi broj od korisnika

printf(„Unesite broj veci od 500 -> „);

scanf(„%d“, &n);

 

//dok je god vrednost N-a manja od 500 trazi novi broj

while( n <= 500 )

scanf(„%d“, &n);

 

//prikazi poruku o uspehu

printf(„Uneli ste ispravan broj! Svaka cast.\n“);

 

}

Evo kao bi rešenje istog zadatka izgledalo ako koristimo petlju do while:

 

/*  PROGRAM broj_veci_od_500_do_while_nacin */

#include <stdio.h>

void main(void)

{

//deklaracija promenljive

int n;

 

//uzmi broj od korisnika preko do while petlje

printf(„Unesite broj veci od 500 -> „);

do {

scanf(„%d“, &n);

} while( n <= 500 );

 

//prikazi poruku o uspehu

printf(„Uneli ste ispravan broj! Svaka cast.\n“);

}

Oba nacina su ispravna ali drugi je bolji jer je kraci i pregledniji.

Demonstrirana je upotreba do while petlje. Dakle prvo se pise kljucna rec „do“ zatim ide telo petlje( u ovom slucaju viticaste zagrade smo mogli da izostavimo jer se izvrsava samo jedna naredba) i na kraju se proverava uslov unutar zagrada.

 

 

SWITCH naredba

switch naredba

Naredba switch slična je nizu ugnježdenih if-else naredbi.

Ona nam omogućava da selektujemo kod koji će se izvršiti na osnovu nekog uslova.

 

Naredba ima sljedeći oblik:

 

switch(izraz) {

case konstanta_1:

naredba_1;

…….

break;

case konstanta_2:

naredba_2;

…….

break;

.

.

.

case konstanta_n:

naredba_n;

…..

break;

default:

naredba;

…..

}

  • Izraz u switch naredbi mora imati celobrojnu vrednost (char, int ili enum).
  • Nakon ključne reči case pojavljuju se celobrojne konstante ili konstantni

izrazi.

  • Pri izvršavanju switch naredbe prvo se testira vrednost izraza -izraz.

Zatim se proverava da li se dobivena vrednost podudara s jednom

od konstanti: konstanta 1, konstanta 2, . . . ,konstanta n.

Ukoliko je izraz = konstanta i program se nastavlja naredbom naredba i i

svim naredbama koje dolaze nakon nje, sve do break naredbe. Nakon

toga program se nastavlja prvom naredbom iza switch naredbe.

  • Ako izraz nije jednak niti jednoj konstanti, onda se izvršava samo

naredba koja dolazi nakon ključne reči default i sve naredbe iza nje,

sve od vitičaste zagrade koja omeduje switch naredbu.

  • Slučaj default ne mora nužno biti prisutan u switch naredbi. Ako

nije i ako nema podudaranja izaza i konstanti, program se nastavlja

prvom naredbom iza switch naredbe.

 

Naredba switch je često jasnija od niza if-else naredbi.

Primer:

#include <stdio.h>

int main()

{

float a,b;

char operacija;

printf(„Upisati prvi broj: „);

scanf(“ %f“,&a);

printf(„Upisati drugi broj: „);

scanf(“ %f“,&b);

printf(„Upisati operaciju: zbrajanje(z), oduzimanje(o),\n“);

printf(“ mnozenje(m),deljenje(d) :“);

scanf(“ %c“,&operacija);

switch(operacija){

case ‘z’:

printf(„%f\n“,a+b);

break;

case ‘o’:

printf(„%f\n“,a-b);

break;

case ‘m’:

printf(„%f\n“,a*b);

break;

case ‘d’:

printf(„%f\n“,a/b);

break;

default:

printf(„Nedopustena operacija!\n“);

}

return 0;

}

Namera programera je sada jasnije izražena nego s nizom if-else naredbi.

 

Naredba break može se ispustiti na jednom ili više mesta. Efekt ispuštanja

naredbe break je \propadanje k^oda“ u niži case blok. Na primjer, ako bismo

u gornjem k^odu ispustili sve break narebe i ako bi operacija bila jednaka

‘o’, onda bi bilo ispisano oduzimanje, množenje, deljenje i poruka

„Nedopustena operacija!nn“. Selektovani case je stoga ulazna tačka od

koje počinjae izvršavanje k^oda. Izvršavanje se nastavlja do prve break naredbe

ili sve do kraja switch naredbe, ako nema break naredbi.

 

Pogledajmo sledeći primer:

 

int i;

…..

switch(i) {

case 1:

case 2:

case 3:

case 4:

case 5: printf(„i < 6\n“);

break;

case 6: printf(„i = 6\n“);

break;

default: printf(„i > 6\n“);

}

Propadanje“ kroz case blokove omogućava da se u slučajevima i=1,2,3,4,5

izvrši naredba printf(„i < 6nn“). Kako se ne bi izvršila naredba printf(„i

= 6nn“) morali smo staviti break nakon printf(„i < 6nn“).