Zadatci za vežbu iz programskog jezika C – I kolokvijum
–
IZVOD IZ ZBIRKE ZADATAKA „UVOD U PROGRAMIRANJE“ – M. ŠKARIĆ, V. RADOVIĆ –
Osnovi programskog jezikta C Podatak i njegov tip 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 int float double
jedno slovo, cifra ili znak ceo (pozitivan ili negativan) broj realanbroj (npr. 3.1415) 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++
Znakovi i tekst 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čunar koji “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'. Ulaz i izlaz 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.
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: % d ili %i
za unos/ispis celog broja
\n
novi red
%f
za unos/ispis realnog broja
\t
tabulator
%c
\\ za unos/ispis znaka za unos/ispis teksta (stringova) \%
%s
znak\ znak%
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. Pretprocesorske direktive Da bismo mogli koristiti funkcije printf i scanf, moramo da napišemo #incluđe 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!
Funkcije i operatori 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:
operator
primei
značenje
Osnovi programskog jezikta C.............................................................................................................................2
1. ..............................................................................................................5 1. ..............................................................................................................9
Ciklusi i bitovni operatori..................................................................................................................................10 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 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 fabs(x) sqrt(x) sin(x),cos(x) pow(a,n) log(x) ceil(x) floor(x)
znacenje apsolutna vrednost kvadratni koren od x sinus i kosinus (x je u radijanima) stepenovanje an prirodni logaritam lnx zaokruživanje na veći broj zaokruživanje na manji broj
primer
.
fabs (-5)je 5 sqrt (4) je -2 sin (M_P1") je 1 pow (2,3) je 8 log(M_E)je 1 ceil (3.2) je 4 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.
Primeri 1. Napisati program koji na standardni izlaz ispisuje poruku Zdravo, svete! #include 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 #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 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 int main() { 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 #include 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 int main() { int a=5; printf("a=%d\n",a); printf("a++=%d\n",a++); printf("a=%d\n",a); printf("++a=%d\n",++a); printf("a=%d\n",a) return 0; }
// a=5 //a++=5 // a=6 //++a=7 // a=7
Zadaci 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. Zadaci za vežbu 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° ).
Rešenja 1. #incluđe int main() { printf("Zdravo svete\nHello world"); return 0;
}
2. #include int main() { 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 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 #include //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 #include 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 #define PI 3.14 int main() { float r; printf("Uneti poluprecnik kruga: “); scanf("%f",&r); printf("Povrsina kruga poluprecnika %f iznosi: %f",r,r*r*PI); return 0;
}
Uslovne naredbe logički operatori Naredba if
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.
Logički operatori 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 različito (nije jednako) negacija manje veće manje ili jednako veće ili jednako logičko i (konjunkcija) logičko ili (disjunkcija)
2==2 1!=2 !A je isto što i A==0 AB X<=Y X>=Y A==B && B==C A==B || B==C
.
Uslovni operator ?: 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.
Naredba switch 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). 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! Primeri 1. Napisati program koji ispisuje manji od dva uneta cela broja. I način:
II način:
iinclude int main() { int a,b scanf("%d%d", &a,&b) printf("Manji je:"); if (a
#include int main() { int a,b; scanf("%d%d" &a,&b) printf("Manji je:%d",(a
Osnovi programskog jezikta C.............................................................................................................................2
1. ..............................................................................................................5 1. ..............................................................................................................9
Ciklusi i bitovni operatori..................................................................................................................................10 -2x, x < 0 if(P%2==0) printf ("Paran\n"); // Broj je paran ako je ostatak
x,
0
x2,
x>1
else printf ("Neparan\n"); deljenju sa đva 0 return 0;
// pri
}
3. Za uneto x izračunati y po formuli: #include int main() { float x,y scanf("%f" &x) if(x<0) y=-2*x; else if (x
}
4. Napisati program koji ispisuje ime dana u nedelji čiji je redni broj unet. Npr. za uneti broj 1 ispisuje Ponedeljak, #include 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; }
Zadaci 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. 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
y=
x+2 0
2x
x >5
9. Napisati program koji za uneto x i y izračunava z po formuli:
z=sqr t
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. Zadaci za vežbu
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. 2.
Rešenja 1.
3.
#include int main () { int max,a,b,c scanf ("%d%d%d" &a,&b,&c); max=a; //Postavimo da prvi broj ima maksimalnu vrednost if(max
2. #include int main() { int x; scanf("%d" &x); printf("abs(%d)=%d\n",x, (x<0)?-x:x); return 0; } 3. #include #include 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. } printf("Koren od %f je %f",x,sqrt(x)); returni 0; } 4.
#include 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 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 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 nahnadno
scanf("%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; }
Ciklus while
Ciklusi i bitovni operatori
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 nijednom izvršiti i zato se while zove ciklusom sa preduslovom. Ciklus do … whle
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 for
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 Naredbe 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. Obrada teksta
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).
Bitovni operatori
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
|
logičko ILI nad bitovima ^ ekskluzivno IL I(netačno za obe nule i jedinice) << pomeranje ulevo >> pomeranje udesno ~ Complement (jedinice postaju nule i obmuto)
5 & 3 je 1
101 & 011 je 001
5 | 3 je 7 5 ^ 3 je 6
101 | 011 je 111 101 ^ 011 je 110
3 << 1 je 6 3 >> l je l za tip char: ~5 je 250
011 << l je ll0 011 >> l je 001 ~00000101 je 11111010
Primeri 1. Napisati program koji izračunava zbir rvih pet prirodnih brojeva. I način:
#include 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 int main() { int i=l,zbir= 0; while(i<=5) { zbir+=i; zbir+=i++; } printf("Zbir = %d"7zbir); return 0; } III način: #include int main() { int i-1,zbir= 0; do zbir+=i++; while (i<=5); printf("Zbir = %d",zbir); return 0; }
llb način: #include int main() { int i=l,zbir=0; while(i<=5) zbir+=i++; printf("Zbir=%d",zbir); return 0; }
2. Napisati program koji sabira brojeve koje unosi korisnik sve dok suma brojeva ne pređe n.. #include 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 #include
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 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 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 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; }
7. Napisati program koji ulaz sa tastature kopira na ekran zamenjujući svaku seriju belina jednom belinom. #include 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 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<
9. Napisati program koji dati broj N pretvaia u njegov binarm ekvivalent. #include 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
} }
Zadaci: 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- ja17. Napisati program kojim se ispituje da Ii je dati prirodan broj prost. 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 2
a +b =c
i
b idu od
1
do N. Napomena: Brojevi su Pitag^rini ako važi
2
19. Napisati program koji za uneto N iscrtava odgovarajuću figuru a) N=4 * ** *** ****
b) N=4 * ** *** ****
c) N=4 * *** ***** *******
Zadaci za vežbu
Napisati program koji implementira funkciju pow(a,n), to jest računa vrednost izraza an. 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. 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 Napomena: n!!=
2*4*6*…*( n - 2 ) * 2n,n = 2k 27.
Napisati program kojim se izračunava zbii prvih N članova reda
28. 29.
Ispisati zbir najveće najmanje cifre unetog broja N. Napisati program kojim se izbacuje prvo pojavljivanje cifre C F iz datog broja.
1+1/3+1/5+…+1/2n-1
Rešenja 1. #include 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 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 int main() { 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 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 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 int main() { int n,i double 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 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 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): #include 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;
9. #include #include