programiranje zadaci

21
atci za vežbu iz programskog jezika C I kolokvijum IZVOD IZ ZBIRKE ZADATAKA „UVOD U PROGRAMIRANJEM. ŠKARIĆ, V. RADOVIĆ

Upload: vojislav-mirovic

Post on 07-Aug-2015

521 views

Category:

Documents


13 download

DESCRIPTION

programiranje zadaci

TRANSCRIPT

Page 1: programiranje zadaci

Zadatci za vežbu iz programskog jezika C – I kolokvijum

IZVOD IZ ZBIRKE ZADATAKA „UVOD U PROGRAMIRANJE“ –– M. ŠKARIĆ, V. RADOVIĆ –

Page 2: programiranje zadaci

Osnovi programskog jezikta C

P o d a t a k i n j e g o v t i p

22, 1963, "Beograd", 'A', 3.1415, ...

Svi navedeni primeri su podaci tj. vrednosti. Njihov smisao možemo da naslutimo, ali pravi smisao svakog podatka zavisi od toga kako ga upotrebimo.

Podatak može biti unesen u program kao fiksna, nepromenljiva vrednost; takve podatke zovemo konstante. Međutim, podatke češće unosi korisnik tokom izvršašvanja programa i oni se čuvaju u posebnim smeštajnim jedinicama koje zovemo promenijive. j

Ime promenljive se sastoji od slova ili brojeva. Počinje obavezno slovom i ne može imati razmak (osim donje crte, tj. _ ) ili druge znakove (!#$%&,. .). Jako je bitno voditi računa o malim velikim slovima jer promenljive Skola i skola nisu iste — štaviše, obe paralelno mogu da postoje u programu!

Tokom izrade programa moramo znati nešto o prirodi podatka koje korisnik treba da unese tj. moramo znati da li unosi broj (ceo ili realan), slovo ili npr. reč, jer je neophodno rezervisati odgovarajući memorijski prostor računara za tu vrednost. Prirodu podatka nazvaćemo tip podatka.

Osnovni tipovi podataka u programskom jeziku C su:

char jedno slovo, cifra ili znak

int ceo (pozitivan ili negativan) broj

float realanbroj (npr. 3.1415)

double kao float, ali dvostruke preciznosti

Na osnovne tipove se mogu primeniti i određeni kvalifikatori (short, long, unsigned...), a rezultati zavise od tipa računara (C postoji za različite računare)

Kada u programu napišemo int visina time programu saopštavamo da je visina promenljiva i da će u vreme izvršavanja sadržati neki ceo broj (eng. integer). Time smo deklarisali promenljivu. Sve naredbe, pa i deklaracije, moraju da se završe znakom tačka zarez ( ; )U programiranju je veoma bitno pisanje komentara. Komentari se u programskom jeziku C pišu između znakova /* i */ i mogu sadržati više redova teksta. Često se koristi i jednoredni komentar koji počinje sa / / i završava se na kraju reda, ali moramo imati na umu da je to „pozajmljeno" iz jezika C++

Z n a k o v i i t e k s t

Pre svega moramo da usvojimo da 1 i 'l' nije isto. Čak kada bismo ih sabrali ne bismo dobili 2 već 50! Zašto? 1 je broj ili tzv. brojevna konstanta dok je 'l' znak ili tzv. znakovna konstanta. Vrednost znaka je redni broj u tabeli znakova (tzv. ASCII tabeli), tako da 'l' ima vrednost 49 što daje odgovarajući rezultat pri sabiranju. Tu se i krije odgovor kako računarkoji “razume” samo brojeve može da radi sa slovima znakovima.

Dakle, znakovne konstante pišemo između polunavodnika, npr. 'A', 'a', '7', '+' i za kompjuter one predstavljaj odgovarajući znak u tabeli.

Znak '\n' nije ni '\' ni 'n' već specijalni znak za novi red, tj. instrukcija računaru da pređe u novi red. Pošto je \ pomoćni znak, da bismo zaista napisali znak \ moramo da napišemo '\\'.

"Beograd", "danas je lep dan","l + 1 je 7", …

Navedeni primeri su tekstualne konstante, to jest string konstante i koristićemo ih najviše za poruke koje korisniku programa kompjuter ispisuje na ekranu. Primer: "unesi udaljenost u kilometrima". Iako su stringovi sastavljeni od znakova, " 1" nije isto što i 'l'.

U l a z i i z l a z

Osnovna naredba je noredba dodele i izvršava se pomoću operatora jednako (tj. =) na primer: A=B+2 ; To znači da leva strana postaje jednak desnoj nakon izvršenja date naredbe i ne mora da znači da su bile jednake pre toga. Rezultat te naredbe je sledeći: promenljiva A dobija trenutnu vrednost promenljive B uvećanu za 2 to jest dobija vrednost B+2.

Page 3: programiranje zadaci

Najviše zbunjuje izraz A=A+2 koji, ako ga protumacimo shodno prethodnoj definiciji, dodeljuje A novu vrednost koja je nastala od predhodne vrednosti A uvećane za 2; ili kažemo da A dobija vrednost izraza A+2.

Sa leve strane operatora dodele mora da bude isključivo promenljiva, tj. ne mogu biti konstante ili izraz!

Moramo voditi računa o tome da se u pnmeru A=2. 5 3 ; odseca decimalan deo broja ukoliko je A deklarisano sa int A; jer 53 nema gde da stane u celobrojnu promenljivu. Ako želimo da sačuvamo i decimale, moramo da deklarišemo A sa float A; ili double A;.Kada se pozove funkcija printf (" %d" , visina); na korisnikovom ekranu se ispisuje trenutna vrednost promenljive visina. Pomoću znakova "%d" računaru se saopštava da visinu mora da ispiše kao ceo broj.

Kada u programu napišemo scanf (" %d" , &visina), tražimo od korisnika programa da unese celobrojnu vrednost (%d) u promenljivu visina. Znak & ispred visina mora da stoji u funkciji scanf i za sada ga nećemo tumačiti, ali on ima svo- j' značenje koje je objašnjeno kasnije.

Funkcije printf i Scanf mogu da rade sa više promenljivih odjednom, kao u primeru scanf("%d %d", &visina, &tezina); Takođe je moguće u funkciji printf umesto promenljive staviti ceo izraz.

Promenljive u C-u nemaju inicijalnu (početnu vrednost, pa im pre upotrebe u okviru izraza ili pre ispisa na ekran moramo dodeliti vrednost (naredbom dodele), ili omogućiti da korisnik unese početnu vrednost (pomoću funkci scanf). To je kao kada bismo pokušali da izračunamo izraz koji konvertuje evre u dinare, a da korisnik prethodno nije uneo kurs ili iznos u evrima!

Formatiranje ispisa

Prikaz upotrebe kontrolnih znakova % i / za formatiranje pri korišćenju funkcije printf:

printf("%5.2 f " , 8 . 7 )

U prethodnom primeru, broj 5 označava minimalan broj znakova koji treba ispisati. U našem primeru ispisuju se četiri znaka (8.70), pa je potrebno dodati još jedan razmak na početku. Broj 2 označava da treba ispisati dve decimale, a pošto imamo samo jednu, neophodno je dodati 0 na kraj. Da smo imali više decimala, prilikom ispisivanja broj bi bio zaokružen na 2 decimale.

P r e t p r o c e s o r s k e d i r e k t i v e

Da bismo mogli koristiti funkcije printf i scanf, moramo da napišemo #incluđe <stdio.h> na početku programa (videti primere). To j pretprocesorska đirektiva koja uključuje biblioteku stdio.h u naš program - omogućava nam da koristimo njene funkcije.

Ako bismo želeli da umesto konstante 3.1415 u programu koristimo PI, to možemo učiniti pomoću direktive #define na sledeći način: #define PI 3.1415. Pretprocesorske direktive nemaju tačku i zapetu ( ; ) na kraju reda!

F u n k c i j e i o p e r a t o r i

Sasvim je logično da u okviru izraza koristimo uobičajene matematičke operatore: +, -, *, /, ali moramo voditi računa o tome da se pri deljenju dva cela broja uvek odseca decimalan deo! Ako želimo da to izbegnemo, moramo napisati ovako: A= (double) B/C. Tako eksplicitno konvertujemo B u realan broj (konkretno, double), pa se pri deljenju neće odseći ceo deo broja.

Ostatak pri deljenju možemo dobiti pomoću operatora %. Primer: 5%2 je 1, tj. najbliži deljiv broj je 4, a razlika do 5 je 1, i to je deo broja 5 koji se ne može podeliti sa 2.

Postoje operatori koji skraćuju zapis nekih dužih izraza i oni se često koriste u programskom jeziku C:

% d ili %i za unos/ispis celog broja \n novi red

%f za unos/ispis realnog broja \t tabulator

%c za unos/ispis znaka

\\ znak\

%s za unos/ispis teksta (stringova)\% znak%

Page 4: programiranje zadaci

operator primei značenje

++ A++ ili ++A A=A+1

A-- ili -A A=A-1

+ = A+=2 A=A+2

A -=2 A=A-2

*= A*=2 A=A*2

/= A/=2 A=A/2

Kao što se vidi u tabeli, za prva dva operatora postoji prefiksni i postfiksni oblik. Postfiksni oblik označava da će se prvo upotrebiti vrednost promenljive u izrazu, a tek onda promeniti njena vrednost, dok je za prefiksni operator obmuto.

Postoji veiiki broj ugrađenih matematičkih funkcija u biblioteci math.h, a možemo da ih upotrebimo ako napišemo #include <math. h> na početku programa. Sve funkcije u math.h vraćaju rezultat tipa double, a apsolutna vrednost celih brojeva nalazi se u stdlib.h. Primeri su dati u sledećoj tabeli:

Funkcija znacenje primer . fabs(x) apsolutna vrednost fabs (-5)je 5

sqrt(x) kvadratni koren od x sqrt (4) je -2

sin(x),cos(x) sinus i kosinus (x je u radijanima) sin (M_P1") je 1

pow(a,n) stepenovanje an pow (2,3) je 8

log(x) prirodni logaritam lnx log(M_E)je 1

ceil(x) zaokruživanje na veći broj ceil (3.2) je 4

floor(x) zaokruživanje na manji broj floor(3.8)je 3

Da bismo dobili neku nasumično odabranu vrednost, potrebno je da uključimo biblioteke stdlib.h (zbog fuinkcija rand srand) i time.h (zbog fimkcije time). Funkcija srand služi da inicijalizuje generator pseudoslučajnih brojeva (tj. da mu dodeli početnu vrednost) i bitno je da ta vrednost uvek bude drugačija (tu pomaže finkcija time). Funkcija rand daje nasumično odabran ceo broj Kada napišemo izraz rand()%10, dobićemo broj u intervalu od 0 do 9.

P r i m e r i

1. Napisati program koji na standardni izlaz ispisuje poruku Zdravo, svete!#include <stdio.h>int main() {

printf ( " Zdrava, svete! \n") ;return 0;

}

2. Napisati program koji prevodi dužinu datu u stopama u centimetre (1 stopa = 30.48 cm).#include <stdio.h>#define STOPA 30.48 int main () {

float st;printf("Unesite duzinu u stopama ); scanf("%f",&st);printf("%f stopa u cm iznosi: %f \n",st,st*STOPA); return 0;

}

3. Napisati program koji na standardni izlaz ispisuje veliko slovo A u polju širine četiri, a u novom redu malo slovo A u polju širine šest.

#include <stdio.h>int main() {

printf("Slova \n%4c\n%6c\n" A a ); return 0;

}

4. Napiši program koji vremenski interval dat u minutima izražava u satima i minutima.#include <stdio.h>int main()

Page 5: programiranje zadaci

{ int min;printf "Uneti vremenski interval u minutima :"); scanf("%d" &min);print ("Interval %d minuta ima %d sati i %d minuta\n", min,min/60,min%60);return 0;

}

5. Napisati program koji generiše slučajan ceo broj iz intervala [1,10].#include <stdio.h#include <stdlib.h> #include <time.h>int main(){

srand(time;0));printf("Broj : %dr randf()%10+1);return 0;

}

6. Program prikazuje upotrebu prefiksnog i postfiksnog operatora ++ (identično je i za operator --).#include <stđio.h> int main() {

int a=5; printf("a=%d\n",a); // a=5 printf("a++=%d\n",a++); //a++=5 printf("a=%d\n",a); // a=6 printf("++a=%d\n",++a); //++a=7 printf("a=%d\n",a) // a=7 return 0;

}

Z a d a c i

1. Napisati program koji na standardni izlaz ispisuje poruku Zdravo, svete, štampa prazan red i u narednom redu ispisuje poruku Hello, world.

2. Napisati program koji omogućava prevođenje temperature date u Kelvinima u temperaturu u Celzijusima.

Napomena : Tc = Tk - 273.15, gde je Tk - temperatura u Kelvinima, a Tc - temperatura u Celzijusima.

3. Napisati program koji pomaže menjaču u radu, tako što od njega traži da unese dnevni kurs evra i sumu u evrima koju treba pretvoriti u dinare. Program ispisuje protivvrednost u polju širine pet.

4. Napisati program koji za dve zadate celobrojne promenljive na standardni izlaz ispisuje redom njihov zbir, razliku, proizvod, količnik, kvadratni koren.

5. Napisati program koji izračunava aritmetičku i geometrijsku sredinu dva broja.6. Za dati poluprečnik kruga ispisati njegovu površinu.

Z a d a c i z a v e ž b u

1. Napisati program koji prevodi kilograme u funte (1 kilogram = 2.2 fiinte).

2. Napisati program koji pretvara centimetre u kilometre.3. Napisati program koji obračunava popust P za proizvod cene C.4. Izračunati koliko je vremena potrebno svetlosti sa Sunca da stigne na Zemlju, ako je brzina svetlosti 300 000 m/s, a srednje rastojanje između Zemlie i Sunca 149 600 000 km.

5. Napisati program kojim se anosi ugao dat stepenima, minutima sekundama (posebno se unosi svaki deo stepena). Program treba da kao rezultat ispiše dati ugao u časovnim jedinicama (360° = 241' odnosno i = 15° ).

R e š e n j a

1. #incluđe <stdio h> int main() {

printf("Zdravo svete\nHello world"); return 0;

}

2. #include <stdio.h> int main()

Page 6: programiranje zadaci

{float kl;printf("Unesite temperaturu u Kelvinima:");scanf(*%f",&kl);printf("Temperatura od %f Kelvina ",kl);printf("u Celzijusima iznosi: %f \n",kl-273.15);return 0;

}3.

#include <stdio.h> int main() {

float eur, kurs;printf("Menjacnica\nEDR = ");scanf("%f",&kurs);printf("Iznos u evrima = ");scanf("%f", &eur);printf("Iznos : %5f DIN\n" eur*kurs);return 0;

}

4.#include <stdio.h>#include <math.h> //Koristi se zbog ugrađjene funkcije sqrt int main(){ int a,b

printf("Uneti brojeve ");scanf("%d%d",&a,&b);printf("Zbir: %d\n",a+b);printf("Razlika: %đ\n", a-b);printf("Proizvod: %d\n",a*b); printf("Kolicnik: %f\n",(double)a/b);printf ("Kvadratni koren ođ broja %d je %f \n",a,sqrt(a));printf("Kvađratni koren ođ broja %d je %f\n",b,sqrt(b));return 0;

}

5. #include <stdio.h>#include <math.h> int main(){

float a,b;printf("Uneti brojeve :"); scanf("%f%f",&a,sb);printi ("Aritmeticka sredina je %f \n", (a+b)/2);printf ("Geometrijska sredina je %f \n",sqrt(a*b));return 0;

}

6. #incluđe <stdio.h> #define PI 3.14int main()

{float r;printf("Uneti poluprecnik kruga: “);scanf("%f",&r); printf("Povrsina kruga poluprecnika %f iznosi: %f",r,r*r*PI);

return 0;}

Page 7: programiranje zadaci

Uslovne naredbe logički operatori

N a r e d b a i f

if (uslov) naredba1;

else naredba2;

Naredba if omogućava da u zavisnosti od toga da li je uslov tačan ili ne, izvršimo neke naredbe. U gore prikazanom slučaju, ako je uslov tačan izvršiće se riaredb1l, a ako nije tačan izvršiće se naredba2;Naredbu if možemo napisati i bez else i naredbe2 ali, za razliku od programskcg jezika Pascal, neophodno ie uvek pisati ; posle naredbe, pa čak i ispred else!Kada bismo želeli da se umesto samo jedne naredbe izvrši više njih, moramo da ih grupišemo. Naredbe se grupišu pomoću vitičastih zagrada, { i } Takva grupa naredaba se zove blok.

L o g i č k i o p e r a t o r i

Uslov može da bude bilo koja relacija tipa A>B ili A==B (ne sme da se koristi =) ili celobrojna promenljiva (vrednost 0 je netačno, a sve ostale vrednosti su tačne). Logički operatori se pišu slično kao i u matematici, a neki od njih su prikazani u tabeli. Poslednja dva logička operatora omogućavaju da spojimo dva ili više uslova.

operator značenje primer .

== jednakost 2==2

!= različito (nije jednako) 1!=2! negacija !A je isto što i A==0< manje A<B

> veće A>B

<= manje ili jednako X<=Y

>= veće ili jednako X>=Y

&& logičko i (konjunkcija) A==B && B==C

|| logičko ili (disjunkcija) A==B || B==C

U s l o v n i o p e r a t o r ? :

if (a>b) max=a; else max=b;

ili:

max = a>b ? a:b ;

Osim što mu je zapis kraći, uslovni operator vraća vrednost, pa se rezultat može dodeliti (u našem slučaju) promenljivoj max. Vrednost operatora zavisi od uslova a>b. Ukoliko je uslov tačan, vrednost je a, inače je b. U ovom slučaju ne možemo izostaviti vrednost b.

N a r e d b a s w i t c h

switch (promenljiva) {case vrednost1: naredbal; break;case vrednost2: naredba2; break;case vrednost3:case vrednost4: naredba34; break;default naređbadef;}

Naredba switch je korisna kada imamo mnogo veći izbor. Tada se ne ispituje tačno/netačno, već se u zavisnosti od konkretne vrednosti date promenljive izvršavaju odgovarajuće naredbe. Promenljiva čije vrednosti ispitujemo u okviru naredbe switch može biti celobrojnog tipa (int) ili znakovnog tipa (char).

Page 8: programiranje zadaci

Konstante (vrednost1,…, vrednost4) označavaju gde treba krenuti sa izvršavanjem naredaba u slučaju da promenljiva ima upravo tu vrednost. Naredba break služi za prekidanje izvršavanja (izlazak iz naredbe switch) i ako se ne navede, nastavlja se izvršavanje naredaba bez obzira na to što počinju nove oznake!

Oznaka default označava naredbu koju treba izvršiti ako promenljiva nije jednaka nijednoj navedenoj oznaci (slično kao else u naredbi if).Moramo voditi računa o tome da li smo napisali break svuda gde treba, jer je to česta greška!

P r i m e r i

1. Napisati program koji ispisuje manji od dva uneta cela broja.I način: II način:iinclude <stdio.h> #include <stdio h>int main() { int main() {

int a,b int a,b;scanf("%d%d", &a,&b) scanf("%d%d" &a,&b)printf("Manji je:"); printf("Manji je:%d",(a<b)?a:b);if (a<b) printf ("%d",a); return 0;else printf("%d",b); }return 0;

}

2. Napisati program koj proverava da li je uneti broj P paran i na ekran ispisuje odgovarajuću poruku.#include <stdio h.> int main () {

int P;scanf ("%d" ,&P);if(P%2==0) printf ("Paran\n"); // Broj je paran ako je ostatak

else printf ("Neparan\n"); // pri deljenju sa đva 0return 0;

}

3. Za uneto x izračunati y po formuli:#include <stdio.h> int main(){

float x,y scanf("%f" &x) if(x<0) y=-2*x; else if (x<l) y=x; else y=x*x; printf("Y = %f\n",y), return 0;

}

4. Napisati program koji ispisuje ime dana u nedelji čiji je redni broj unet. Npr. za uneti broj 1 ispisuje Ponedeljak,#include <stdio.h> int main()

{ int br;scanf("%d", &br);switch(br)

{case 1: printf l "Ponedeljak\n"); break;case 2 printf ("Utorak\n"); break,case 3: printf ("Sreda\n"); break;case 4: printf("Cetvrtak\n"); break;case 5 printf ("Petak\n"); break;case 6 printf("Subota\n"); break;case 7: printf ("Nedelja\n"); break;default printf ("Uneta je pogresna vrednost!\n"); }

return 0;}

Z a d a c i

1. Ispisati najveći od uneta tri cela broja.

2. Napisati program koji implementira funkciju abs (x).

3. Napisati program koji izračunava kvadratni koren imetog broja. Ukoliko je ulazni podatak manji od 0, ispisuje se poruka o grešci.

- 2 x , x < 0

x, 0 < x < 1

x2, x>1

Page 9: programiranje zadaci

z=sqrt

4. Napisati program koji proverava da li je uneta godina prestupna.

5. Napisati program koji ispituje da li je broj K deljiv brojem L .

6. Napisati program koji za uneti redni broj meseca (1 = Januar) ispisuje njegov broj dana. Ako je u pitanju Februar,

pitati korisnika da li je godina prestupna.

7. Unese se katete dava pravougla trougla, a1, a2, b1 i b2. Ispitati koji od njih ima veću površinu.

8. Napisati program koji za uneto x izračunava y po formuli:

-5, x < 0

x + 2 0 < x < 1 y = 3x – 2 1 < x < 1

2x x > 5

9. Napisati program koji za uneto x i y izračunava z po formuli:

min(x,y)+sin(x+0.5) max2(x,y)-1

10. Napisati program koji rešava jedančinu ax+b=0. Ispisati sva moguća rešenja jedančine.

Z a d a c i z a v e ž b u

15. Napisati program koji izračunava najveći od četiri zadata broja.16. Napisati program koji određuje razliku između dva najveća cela broja od uneta tri.

17. Napisati program koji izračunava zbir unetih brojeva a, b, c ukoliko je najveći broj paran, a razliku ako je najveći broj neparan.

18. Napisati program koji za unetu cenu nekog proizvoda obračunava porez od 8% ako je cena manja od 10000 din, a ako nije, porez je 18%.

19.Napisati program koji proverava da li od tri unete duži može da se napravi trougao.Napomena Zbir bilo koje dve stranice trougla mora da bude veći od treće stranice (nejednakost trougla).

20.Na osnovu poena koje je student osvojio na ispitu, ispisati ocenu.21. Za uneti redni broj meseca u godini, ispisati njegovo ime.

R e š e n j a1.

#include <stdio.h> int main () {int max,a,b,cscanf ("%d%d%d" &a,&b,&c);max=a; //Postavimo da prvi broj ima maksimalnu vrednostif(max<b)max=b;if(max<c)max=c;printf ("Najveci broj je %d\n",max)retum 0;}

2.

#include <stdio.h> int main(){int x;scanf("%d" &x);

printf("abs(%d)=%d\n",x, (x<0)?-x:x); return 0;}

3. #include <stdio h> #include <math.h> int main () { float x; scanf ("%f " &x); if(x<0) {Printf('Broj ne moze da bude manj od 0!"); return 1; //prekida izvrsavanje prograraa. 1 oznacava da je

//doslo do greske, a 0 da je program //normalno zavrsio rad.

Page 10: programiranje zadaci

}printf("Koren od %f je %f",x,sqrt(x)); returni 0;}

4.#include <stdio.h> int main(){ int god;scanf("%d" &god);if((god%4==0 && god%100!=0) || god%400==0)

printf (" Prestupna \n");else printf("Nije prestupna\n");return 0;}

5.#incluđe <stdio.h>

int main () { int k,l;scanf(“%d%d" &k,&l)if(k%l==0) printf("Broj %d je deljiv brojem %d",k,l); else printf("Broj %d nije deljiv brojem %d",k,l); return 0;}

17.#include <stdio h> int main() { int mes;char c;scanf("%d",&mes);switch(mes)

{case 1:case 3:case 5:case 7:case 8:case 10:case 12:

printf ("Mesec ima 31 dan"); break;

case 4:case 6:case 9: case 11:printf("Mesec ima 30 dana');break;

case 2:printf('Da li je godina prestupna (D/N)");fflush(stdin);/ Koristi se da bi se ispraznio bafer ulaznog toka // podataka, inace bi se ucitalo '\n' a ne 'D' ili 'N' . // Bice objasnjeno nahnadnoscanf("%c",&c);if(c!= 'D' && c!='N1) {

printf("Unet je pogresan znak: %c!",c); return 1;

}if(c=='D') printf("Mesec ima 29 dana");else printf ("Mesec ima 28 dana");break;

default : printf ( "Uneta je nedozvoljena vrednost!");return 0;}

2.

3.

Page 11: programiranje zadaci

Ciklusi i bitovni operatoriC i k l u s w h i l e

while (uslov ponavljanja)naredba ili blok;

Ciklus ili petlja je programska struktura koju koristimo kad želimo da se naredba ili blok ponove više puta. Ponavljanje (ili iteracija) traje dok je uslov ponavljanja ispunjen (tačan). Ako uslov u startu nije tačan, naredba ili blok se neće nijednomizvršiti i zato se while zove ciklusom sa preduslovom.

C i k l u s d o … w h l e

do

naredba ili blok;

while (uslov ponavljanja) ;

Ciklus do...while je ciklus sa postuslovom, što znači sledeće: pošto se uslov ponavljanja proverava na kraju, naredba ili blok se moraju izvršiti makar jednom. Izbor između ove dve vrste ciklusa zavisi isključivo od načina pisanja programa, tj. nema veze sa uslovom zadatka.

C i k l u s f o r

for (inicijalizacija; uslovponavljanja; inkrementacija) naredba ili blok;

Ciklus for se često zove i brojački ciklus jer je podesan u slučajevima kad znamo tačan broj ponavljanja.

Promenljivu čiju vrednost menjamo nakon svakog ponavljanja nazvaćemo brojač- kapromenljiva. Njena početna vrednost se postavlja u delu inicijalizacija, dok se njena vrednost modifikuje (uvećava, umanjuje .) u delu inkrementacija. Uslov ponavljanja ima isti smisao kao u ciklusu while.

Ako bismo izostavili delove inicijalizacija i inkrementacija, imali bismo identično ponašanje kao u ciklusu whi

N a r e d b e b e a k i c o n t i n u e

Ovim naredbama utičemo na izvršavanje petlje tako što naredba break prekida izvršavanje petlje (kao i u naredbi switch), a naredba continue prelazi na sledeću iteraciju preskačući ostatak naredaba u bloku. Ove naredbe se mogu koristiti u bilo kom ciklusu.

U slučaju da imamo ciklus u ciklusu, break continue utiču na unutrašnji ciklus.

O b r a d a t e k s t a

Koristeći ciklus while možemo na efikasan način raditi sa tekstom koji korisnik unosi sa tastature ili iz fajla. Tada koristimc sledeće funkcije:

funkcija značenje primer .

getchar() funkcija koja čita znak sa tastature x=getchar();

putchar(x) funkcija koja ispisuje znak na ekran putchar ( 'A' ) ;

Prilikom učitavanja podataka sa tastature, moramo na neki način da znamo kada je kraj tih podataka. Jedan od načina je da taster Enter predstavlja kraj učitavanja i tada učitavamo sve dok funkcija getchar ne vrati vrednost '\n' (novi red).

Problem nastaje kada želimo da učitavamo tekst koji ima više redova; tada je najbolje da učitavamo dok ne dobijemo vrednost EOF (End of File, vrednost je -1). U tom slučaju korisnik završava unos pomoću tastera CTRL+Z (u Linuxu je CTRL+D).

Page 12: programiranje zadaci

B i t o v n i o p e r a t o r i

Svaki broj je u računaru zapisan kao niz bitova (173= 10101101) Nekada se javlja potreba da pročitamo ili postavimo neki bit na određenu poziciju u broju ili da pomerimo sve bitove ulevo ili udesno (tako gubimo prvi ili poslednji bit). To nam omogućavaju operatori nad bitovma ili bitovni operatori.

oper. zna čenje primer dekadno primer binarno

& logičko I nad bitovima 5 & 3 je 1 101 & 011 je 001| logičko ILI nad bitovima 5 | 3 je 7 101 | 011 je 111^ ekskluzivno IL I(netačno 5 ^ 3 je 6 101 ^ 011 je 110

za obe nule i jedinice)<< pomeranje ulevo 3 << 1 je 6 011 << l je ll0>> pomeranje udesno 3 >> l je l 011 >> l je 001

~ Complement za tip char: ~00000101 je(jedinice postaju nule i obmuto) ~5 je 250 11111010

P r i m e r i

1. Napisati program koji izračunava zbir rvih pet prirodnih brojeva.

I način:

#include <stdio.h> int main() {

int i,zbir = 0;//Postavljamo zbir na 0 jer 0 ne utice na sabiranje for(i=l;i<6;i++)

zbir+=i; printf("Zbir = %đ", zbir) ; return 0;}

II način:

#include <stdio.h> int main() {

int i=l,zbir= 0; while(i<=5) {

zbir+=i;zbir+=i++;

}printf("Zbir = %d"7zbir); return 0;

}

III način:

#include <stdio.h> int main()

{int i-1,zbir= 0; do

zbir+=i++; while (i<=5); printf("Zbir = %d",zbir); return 0;

}

llb način:

#include <stdio.h> int main() {

int i=l,zbir=0; while(i<=5) zbir+=i++; printf("Zbir=%d",zbir);

return 0;}

Page 13: programiranje zadaci

2. Napisati program koji sabira brojeve koje unosi korisnik sve dok suma brojeva ne pređe n..

#include <stdio.h> int main()

{int suma=0,n,br;scanf("%d",&n);while(n>=suma)

{printf("Unesite broj :");scanf("%d",&br);suma+=br;}

printf("Suma je %d",suma);return 0;

}

3. Napisati program kojim se ispisuje tabela celih brojeva od 1 do učitanog broja n, njihovih kubova, kvadrata korena.

#include <stdio.h>#include <math.h> int main() { int i,n; scanf ("%d",&n); for(i=l;i<=n;i++)printf("%4d %7d %7d %7.3f\n",i,i*i*i,i*i, sqrt(i)); return 0;}

4. Napišati program koji ispisuje sve trocifrne brojeve čija je cifra desetica manja od 5 a cifra jedinica neparna.#include<stdio.h>

int main () {int i,j,k; for(i=l;i<=9;i++)

for(j=0;j<5;j++)for(k=l;k<=9;k+=2)

printf("%d\n",100*i+10*j+k)retum 0;

}

5. Za uneto N iscrtati piramidu na prikazani način. Npr. za N = 3

* *** *****

#include <stdio.h> int main ()

{int i,j,k,n;scanf("%d",&n);for(i=l ; i<=n ; i++) {

for(k=l ; k<=n-i ; k++); printf(" ");for (j =1 ; j<2*i ; j++) printf ("*");printf("\n");

}return 0;

}

6. Napisati program koji određuje broi redova u ulaznom tekstu.

#include <stdio.h> int main()

{ int ch;int br_redova=0;

while((ch=getchar())!=EOF)if(ch==`\n`) br_redova++;

printf ("Broj redova je %d",br_redova);return 0;

}

Page 14: programiranje zadaci

7. Napisati program koji ulaz sa tastature kopira na ekran zamenjujući svaku seriju belina jednom belinom.#include <stdio.h>

int main(){

int pch=EOF,ch;

while((ch=getchar())!=EOF) {

if(!((ch==` ` && pch==` `) || (ch==`\t' && pch==`\t')))putchar(ch);

pch=ch;}return 0;

}

8. Pomnožiti uneti broj sa 2n bez korišćenja operacije množenja.#include <stdio.h> int main() {

int a=0,n;printf ("Unesite broj : "); scanf("%d",&a);printf ("Unesite stepen broja 2:"); scanf("%d",&n);printf("Broj %d*2^%d=%d",a,n, a<<n);

9. Napisati program koji dati broj N pretvaia u njegov binarm ekvivalent.#include <stdio.h>int main() {

int a,x=128; //za 8-bit scanf("%d",&a);while(x>0) { printf("%d", (a&x)>0?1:0); X=X>>1

}}

Z a d a c i :

1. Napisati program koji izračunava zbir brojeva od 1 do n.

2. Napisati program koj izračunava proizvod brojeva od 1 do. n.

3. Napisati program koji računa zbir neparnih, pnrodnih brojeva u intervalu od 1 do n.

4. Napisati program koji izračunava n-ti stepen broja 2, tj 2n.

5. Napisati program koji računa n!.

Napomena: n!= 1,n=0 n(n-1)...1,n>1

6. Napisati program kojim se izračunava zbir prvih n članova reda

1+1/2+1/3+1/4+…

7. Napisati program kojim se izračunava zbir prvih n članova reda

1-1/2+1/3-1/4+…

8. Za zadato n izračunati zbir elemenata niza : 1, x, x2, x3,..., xn.

9. Napisati program koji ispisuje tabelu vrednosti funkcije sqrt(x) u intervalu od M do N sa korakom K.

10. Napisati program koji ispisuje tablicu vrednosti funkcije X3 pri promeni X od 2 do N sa korakom 2.

11. Korisnik unosi brojeve sve dok ne unese broj 0. Program treba da ispiše aritmetičku sredinu tako unetih brojeva.

12. Korisnik unosi brojeve različite od nule (0 je oznaka kraja unosa). Napisati program koji određuje najmanji od unetih brojeva.

13. Ispisati prvih N brojeva koji imaju svojstvo da pri deljenju sa 2 ili 6 daju osta- tak 1 a da su deljivi sa 7.

1' . Napisati program koji ispisuje zbir cifara unetog broja.

15. Napisati program koji ispisuje najveću cifru u datom broju N.

16. Napisati program kojim se izbacuje svako pojavljivanje cifre CF iz datog bro- ja-17. Napisati program kojim se ispituje da Ii je dati prirodan broj prost.

{

Page 15: programiranje zadaci

Napomena: Broj je prost ako je delji ' samo sa sobom x sa I Proveru možemo ubrzati tako što ćemo proveravati da Ii je deljiv sa brojevima od 1 do njegovog korena.

18. Za dati broj N ispisati sve Pitagorine brojeve a,b i t, gde a i b idu od 1 do N. Napomena: Brojevi su Pitag^rini ako važi

a2+b =c2

19. Napisati program koji za uneto N iscrtava odgovarajuću figuru

a) N=4 b) N=4 c) N=4* * *** ** ****** *** ********* **** *******

Z a d a c i z a v e ž b u

20. Napisati program koji implementira funkciju pow(a,n), to jest računa vrednost izraza an.

21. Napisati program koji određuje sumu S kvadrata pamih i kubova nepamih brojeva od N do M.

22. Ispitati da li je uneti prirodan broj N stepen broja 3.

23. Napisati program kojim se pravi tabela.prevođenja iz temperature u Celzijusima u temperaturu u Farenhajtima za vrednosti od vr, do vr2 stepeni sa korakom m.

24. Koristeći Ajnštajnovu formulu E = mc2, ispisati tablicu koja pokazuje kako se energija menja ako se masa menja od m1 do m2.

25. Odrediti najmanji broj pamih brojeva, počevši od 2, čija je suma veća od zadate vrednosti.

26. Napisati program koj i izračunava n!!

1*3*5*...*(n-2)* n,n = 2k+1

2*4*6*…*(n-2)*2n,n = 2k

27. Napisati program kojim se izračunava zbii prvih N članova reda1+1/3+1/5+…+1/2n-1

28. Ispisati zbir najveće najmanje cifre unetog broja N.29. Napisati program kojim se izbacuje prvo pojavljivanje cifre C F iz datog broja.

R e š e n j a

1.#include <stdio.h> int main() {

int n,suma=0,i; printf("Unesite n : "); scanf("%d",&n);for(i=l i<=n;i++)

suma+=i; printf("Suma je %đ",suma);return 0;

}

2.#include <stdio.h> int main() {

int n,p=l,i; printf("Unesite n : "); scanf("%d",&n);for(i=l;i<=n;i++)

P*=i;printf("Proizvod je %đ",p); return 0;

}

3.#include <stdio.h> int main() {

Napomena: n!!=

Page 16: programiranje zadaci

int n,i,suma=0;scanf("%d",&n); for(i=l;i<=n;i+=2)suma+=i;

printf("Suma je %d",suma); retum 0;

}

4.

#include <stdio.h>int main() { int n,i;

double st=l; //ako je n nula, ostaje ova vrednost! printf("Unesite n : "); scanf("%d",&n) for(i=l,i<=abs(n);i++) st*=2; if(n<0) st=l/st; //ako je n negativno printf("Rez je %.41f",st); return 0; }

5.

include <stdio.h>int main () {

int n,fakt=l,i;scanf("%d",&n);for(i=l;i<=n;i++) fakt*=i;

printf(“%d! = %d",n,fakt);return 0;

}6.

#include <stdio.h>int main() { int n,idouble suma=0.0;scanf("%d",&n);for(i=l;i<=n;i++)suma+=l.0/i

printf("Suma je %f",suma);return 0;}

7.#include <stdio.h>int main(){

double suma=0.0;int n,i;scanf("%d",&n);for (i=l;i<=n;i++) if(i%2==0) suma-=l.0/i; else suma+=l.0/i; printf(“Suma je %f", suma);return 0;

}

8.

I Način (razumljivije rešenje):#include <stdio.h>int main(){

int i,j,x,n,suma=0,p;scanf ("%d",&n);scanf("%d",&x);for(i=0;i<=n;i++) { p=1; for(j=l;j<=i;j++) p*=x; suma+=p; s}

printf("Suma: %d",suma); return 0;}

II način (efikasnije rešenje):

Page 17: programiranje zadaci

#include <stdio.h> int main () {

int i,j,x,n,suma=l,p=l;scanf("%d",&n);scanf("%d",&x);for(i=l;i<=n;i++){ p=p*X; suma+=p;}printf("Suma: %d",suma);

return 0;}

Page 18: programiranje zadaci

9.#include <stdio.h> #include <math,h> int main() {

double m,n,k,i;printf("Unesite granice intervala [M,N] : “];scanf("%lf%lf",&m,&n);printf("Unesite korak k :");scanf("%lf",&k);for(i=m;i<=n;i=i+k) printf ("%3.2f %7.2f\n",i,sqrt (i)); return 0;

}10.

#include <stdio.h> int main() {

int i,n; scanf("%d",&n;for(i=2;i<=n;i=i+2) printf (" %3d %7d\n", i, i*i*i);

return 0;

}

11.

#include <stdio.h> int main() {

int sum=0,brojac=0,br;while(1) {printf("Unesite broj : "); scanf("%d",&br)if(br==0) break;sum+=br; brojac++;}if (brojac==0) printf ("Niste uneli brojeve");else printf("Aritmeticka sredina je %f",(float)sum/brojac);

return 0;}

12.#include <stdio.h> int main() {

int min,br;printf("Uneti broj: ");scanf("%d",&br);min=br;while{1) {

printf("Uneti broj : ");scanf ("%d",&br);if(br==0) break;if(br<min) min=br;

}printf{"Minimum je %d",min);return 0;

}

13.#include <stdio.h>int main() {

int i,n; scanf("%d",&n);

for(i=l;i<=n;i++)if((i%2==l || i%6==1 && i%7==0);printf("Broj: %5d\n”,i);

return 0;}

14.#include <stdio.h>

" ;

==1) && i%7==0) : %5d\n",i);

}

'^oglavlje J: Ciklusi i brtovni operatori 18

Page 19: programiranje zadaci

int main(){int broj,suma_cif=0;

scanf(“%d”,&broj);while(broj!=0){ //Moze id a se napise while(broj) int cf; cf=broj%10; sum_cif+=cf; broj/=10; }printf(“Suma cifara unetog broja je %d,suma_cif);return 0;}

15.#include <stdio.h>int main(){

int broj,max,cf;

scanf(“%d”,&broj);

cf=broj%10;

broj/=10;

max=cf;

while(broj) {

cf=broj%10;

if(cf>max) max=cf;

broj/=cf=10;

}prinf(Najveca cifra u unetom broju je %d,max);

return 0;

}

16.#include <stdio.h>int main(){int i,n=0,broj,cf,c,p=l;scanf("%d%d",&broj,&cf);do

if((c=broj%10)!=cf) { n+=p*c; p*=10;

}while (broj/=10);printf("Izmenjeni broj je %d",n);return 0;}

17.

#include <stdio.h> #include <math.h> int main() {

int i,br,prost=l; scanf ("%d",&br); for(i=2;i<=sqrt(br);i++)if(br%i==0) {

prost=0; break;}if(prost && br!=l) printf("Broj je prost"); else printf("Broj nije prost");return 0;

}

18.#include <stdio h>#include <math.h> int main(){

int i,n,j; float c;scanf("%d",&n);printf("%5c %5c %5c\n",[a','b',c');for(i=l;i<=n;i++)

for(j=l;j<=n;j++) { c=sqrt(i*i+j*j);

Page 20: programiranje zadaci

if(ceil(c)==c) printf("%5d %5d %5d\n",i,j,(int)c);}

return 0;}

19.

a.#include <stdio.h> int main {) {

int i,j,n; scanf("%d",&n); for(i=0;i<n;i++) {

for(j=0;j<=i;j++) printf ("*");printf("\n");

}return 0;

}b.

#include <stdio.h> int main(){

int i,j,k,n; scanf(“%d",&n); for(i=l;i<=n,i++) {

for(j=0;j<=n-i;j++) printf ( " ");for(k=0;k<i,k++) printf("*"); printf("\n");

}return 0;

}

c.#incluđe <stdio.h>int main{){

int n,i j,k; scanf(“%6d”,&n);for(i=0;i<n;i++) {for(j=0;j<=n-i;j++) printf(" "); for(k=l k<=2*i+1,k++) printf(" *");printf ("\n");

}return 0;}