Or II Parcijala Tutorijali
-
Upload
meliha-duhera -
Category
Documents
-
view
271 -
download
6
Transcript of Or II Parcijala Tutorijali
-
8/17/2019 Or II Parcijala Tutorijali
1/60
Osnove računarstva Tutorijal 6
Berina Cocalić
Potrebno je napisati program koji će vršiti unos i sortiranje niza cjelobrojnih brojeva. Elemente niza treba
sortirati od najmanjeg ka najvećem, a potom je potrebno ispisati sortirani niz. Za sortiranje koristiti Bubble sort
algoritam.
sortiranje niza od manjeg ka većem sortiranje niza od većeg ka manjem
#include #define velicina 10
/*Za duzinu niza se koristi simbolicka konstanta*/
int main() {
int niz[velicina]; int i;
/* Unos niza*/ for ( i = 0; i
-
8/17/2019 Or II Parcijala Tutorijali
2/60
Osnove računarstva Tutorijal 6
Berina Cocalić
Napisati program koji traži da se unesu dva niza cijelih pozitivnih brojeva A i B čija dužina ne prelazi 10
elemenata. Nakon unosa, nizove A i B je potrebno spojiti u novi niz C koji je potrebno ispisati na ekranu. Prilikom
unosa nizova A i B koristiti koristiti unos broja -1 kao kraj unosa.
#include
#define velicina 10 /* Za duzinu niza se koristi simbolicka konstanta*/
int main() {
int A[velicina]; int a_vel = 0;
/*Unos niza A.*/ printf("Unesite elemente niza A:"); do {
scanf("%i", &A[a_vel]); } while (A[a_vel] != -1 && ++a_vel
-
8/17/2019 Or II Parcijala Tutorijali
3/60
Osnove računarstva Tutorijal 6
Berina Cocalić
Potrebno je napisati program koji de iz unesenog niza izbaciti elemente koji imaju određenu vrijednost. Odkorisnika se traži da unese niz pozitivnih cijelih brojeva koji ima maksimalnu dužinu od 100 elemenata, a potom
se traži da se unese broj koji je potrebno izbaciti. Program treba da iz unesenog niza izbaci sve pojave unesenog
broja, i potom ispiše novi niz na ekranu. Prilikom unosa niza, koristiti unos broja -1 kao kraj unosa.
#include #define velicina 100
/* Za duzinu niza se koristi simbolicka konstanta*/
int main() {
int niz[velicina]; int niz_vel = 0; /*Varijabla koja cuva broj unesenih elemenata*/
/*Unos niza*/ printf("Unesite niz od maksimalno 100 elemenata (-1 + ENTER za kraj unosa): "); do {
scanf("%i", &niz[niz_vel]); } while ( niz[niz_vel] != -1 && ++niz_vel
-
8/17/2019 Or II Parcijala Tutorijali
4/60
Osnove računarstva Tutorijal 6
Berina Cocalić
Napisati program koji učitava realnu matricu dimenzija 10 x 10 te pronalazi najmanji/najveći element na glavnojdijagonali.
najmanji element na glavnoj dijagonali najveći element na glavnoj dijagonali
#include #define velicina 10
/* Za velicinu matrice se koristi simbolicka
konstanta*/
int main() {
float matrica[velicina][velicina]; int i, j;
/*Unos matrice*/ printf("Unesite matricu dimenzija 10 x 10: "); for (i = 0; i
-
8/17/2019 Or II Parcijala Tutorijali
5/60
Osnove računarstva Tutorijal 6
Berina Cocalić
Napisati program koji učitava realnu matricu dimenzija A x B (gdje su A i B konstante), a potom pronalazi sumuelemenata na rubu matrice. Rub mat rice sačinjavaju elementi prvog i zadnjeg reda, te prve i zadnje kolone. Pri
sabiranju voditi računa da elementi u ćoškovima ne budu uračunati dva puta.
#include #define A 4
#define B 4 /* Za velicinu matrice se koriste se simbolicke konstante*/
int main() {
float matrica[A][B]; int i, j;
/*Unos matrice*/ printf("Unesite matricu dimenzija %i x %i: ", A, B); for (i = 0; i
-
8/17/2019 Or II Parcijala Tutorijali
6/60
Osnove računarstva Tutorijal 6
Berina Cocalić
Napisati program koji učitava matricu dimenzija 10 x 10, a potom nalazi red sa najvećim i najmanjim elementommatrice. Ako su oba elementa u ist om redu, program treba ispisati odgovarajuću poruku i završiti sa radom. U
suprotnom, potrebno je u matrici zamijeniti pronađene redove i potom ispisati rezultirajuću matricu.
#include #define velicina 10
/* Za dimenziju matrice se koristi simbolicka konstanta*/
int main() {
int matrica[velicina][velicina]; int i, j;
/*Unos matrice*/ printf("Unesite matricu dimenzija %i x %i: ", velicina, velicina); for ( i = 0; i
-
8/17/2019 Or II Parcijala Tutorijali
7/60
Osnove računarstva Tutorijal 7
Berina Cocalić
Pot rebno je napisati program koji će učitati niz od pet cijelih brojeva, a potom iscrtati grafikon koji prikazuje te
brojeve. Za iscrtavanje je potrebno napisati funkciju. Pokušajte prepraviti program tako da se grafikon iscrtava
koristeći neke druge znak ove osim zvjezdica.
#include #define velicina 5
/*Funkcija za crtanje zvjezdica*/ void crtaj (int broj) {
int i = 0; for ( i = 0; i
-
8/17/2019 Or II Parcijala Tutorijali
8/60
Osnove računarstva Tutorijal 7
Berina Cocalić
Potrebno je napraviti funkciju koja računa faktorijel datog broja, a potom iskoristiti tu funkciju za računanjevrijednosti sljećedeg konačnog reda:
∑ !
= + 2! +
3! +
4! + ⋯ +
!
#include
/*Funkcija za racunanje faktorijela*/ long faktorijel (int broj) {
int i; long fakt = 1; for ( i = 1; i
-
8/17/2019 Or II Parcijala Tutorijali
9/60
Osnove računarstva Tutorijal 7
Berina Cocalić
Potrebno je napraviti funkciju koja kao rezultat vraća 1 ako je proslijeđeni broj prost, a u slučaju da broj nijeprost, funkcija vraća rezultat 0. Prototip funkcije treba da izgleda ovako: int prost (int broj) .
Potom je potrebno iskoristiti napravljenu funkciju kako bi se napravio program koji ispisuje sve proste brojeve
između 1 i 100.
#include
/*Funkcija za ispitivanje proslijedjenog broja*/ int prost (int broj) {
int i;
for ( i = 2; i
-
8/17/2019 Or II Parcijala Tutorijali
10/60
Osnove računarstva Tutorijal 7
Berina Cocalić
Napraviti funkciju koja računa sinus broja koristeći sljedeći Taylorov razvoj:
∑(1)− −
(21)!
=
3! +5!
7! + ⋯ +
−(21)!
Za računanje stepena broja koristiti funkciju pow
koja se nalazi u bibliotecimath.h
. Prototip funkcije zaračunanje sinusa treba da izgleda ovako: double sinus (double x, int n) .
Nakon što napravite funkciju, potrebno je testirati tako što napravite program koji će rezultate funkcije poreditisa rezultatima ugrađene f unkcije sin koja se nalazi u biblioteci math.h.
#include #include
/*Funkcija za racunanje faktorijela*/ double faktorijel (int broj) {
int i; double fakt = 1; for ( i = 1; i
-
8/17/2019 Or II Parcijala Tutorijali
11/60
Osnove računarstva Tutorijal 7
Berina Cocalić
Potrebno je napraviti program koji na ekranu ispisuje vrijednosti Pascalovog trougla. Svaki broj u Pascalovom
trouglu je jednak sumi dva broja koji se nalaze iznad njega. Program treba da traži unos broja redova, a potom
treba da ispiše vrijednosti članova trougla.
#include
int trougao(int a, int b) {
/*Ako je u pitanju prva kolona, ili dijagonala, vrati 1*/ if ( b==1 || a==b )
return 1; else /*Ako nije, vrati zbir elemenata iznad.*/
return trougao(a-1,b) + trougao(a-1,b-1); }
int main() {
int i, j, n;
printf ("Unesite broj redova trougla: ");
scanf("%d", &n);
/*Ispisivanje elemenata pozivanjem funkcije koja odredjuje svaki sljedeci*/ for(i = 1; i
-
8/17/2019 Or II Parcijala Tutorijali
12/60
Osnove računarstva Tutorijal 8
Berina Cocalić
Napisati funkciju koja će, za dati pozitivan cijeli broj x , na ekranu ispisati najveću i najmanju cifru tog broja. Potom
napisati program koji testira tu funkciju.
#include
void minmax(int a) {
int najveca = 0, najmanja = 9;
while (a > 0) {
/*Odredjivanje najvece i najmanje cifre*/ if (a%10 > najveca)
najveca = a%10;
if (a%10
-
8/17/2019 Or II Parcijala Tutorijali
13/60
Osnove računarstva Tutorijal 8
Berina Cocalić
Napisati funkciju koja kao rezultat vraća njoj proslijeđen pozitivni cijeli broj okrenut naopako. Primjerice, ako se
funkciji proslijedi broj 12345, funkcija treba da kao rezultat vrati broj 54321. Za rješavanje problema ne koristiti
nizove. Potom napisati program koji testira napisanu funkciju.
#include
int rikverc(int a) {
int naopaki = 0;
while (a > 0) {
naopaki = naopaki*10 + a%10; a/=10;
}
return naopaki; }
int main() { int broj;
/*Unos broja*/ printf ("Unesite broj: "); scanf("%d", &broj);
/*Poziv funkcije koja okrece broj*/ printf("Broj okrenut naopako glasi: %i", rikverc(broj));
return 0; }
-
8/17/2019 Or II Parcijala Tutorijali
14/60
Osnove računarstva Tutorijal 8
Berina Cocalić
Napisati funkciju koja će, za dati pozitivan cijeli broj x , kao rezultat vratiti razliku najveće i najmanje cifre broja.
Primjerice, ako se funkciji kao argument proslijedi broj 12345, ona kao rezultat treba da vrati broj 4 jer je najveća
cifra broja 5, a najmanja je 1. Potom napisati program koji testira tu funkciju.
#include
void minmax(int a) {
int najveca = 0, najmanja = 9;
while (a > 0) {
/*Odredjivanje najvece i najmanje cifre*/ if (a%10 > najveca)
najveca = a%10;
if (a%10
-
8/17/2019 Or II Parcijala Tutorijali
15/60
Osnove računarstva Tutorijal 8
Berina Cocalić
Napisati program koji traži od korisnika da unese osam realnih brojeva koji predstavljaju mjerenja temperature
tokom jednog dana. Program potom treba da ispiše najveću i prosječnu izmjerenu temperaturu. Za rješavanje
problema napraviti dvije funkcije. Prva funkcija treba da pronađe najveću temperaturu u proslijeđenom nizu i
treba da ima sljedeći prototip: float maksimum(float temperature[8]);.
Druga funkcija treba da pronađe prosječnu temperaturu koristeći proslijeđeni niz i treba da ima sljedeći prototip:
float prosjek(float temperature[8]);.
Modifikovati rješenje zadatka tako da broj mjerenja nije konstantan, nego se unosi sa tastature. Da bi ove
funkcije znale koliko je elemenata korisnik unio, potrebno im je taj broj proslijediti kao parametar. Sa takvom
modifikacijom, prototip za funkciju koja nalazi najveću temperaturu će sada izgledati ovako:
float maksimum(float temperature[], int broj_unosa);
verzija 1 verzija 2
#include #define vel 8
float maksimum(float temperature[8]) { float najveca=temperature[0]; int i;
/*Trazenje najvece temperature*/ for(i = 0; i najveca) najveca = temperature[i];
}
return najveca; }
float prosjek(float temperature[8]) {
float suma = 0; int i;
/*Racunanje prosjecne temperature*/ for (i = 0; i
-
8/17/2019 Or II Parcijala Tutorijali
16/60
Osnove računarstva Tutorijal 8
Berina Cocalić
Napraviti funkciju koja u datom nizu cijelih brojeva pronalazi drugi element po veličini i vraća indeks tog člana
u nizu.
#include #define vel 100 /*Maksimalni broj elemenata niza*/
int drugi (int niz[], int velicina) {
int najveci = 0; int i = 0, flag = 0, indeks;
/*Trazenje najveceg elementa*/ for (i = 0; i = najveci) najveci = niz[i];
}
int drugi = 0;
/*Trazenje drugog najveceg elementa, ako ima vise istih vracamo drugi najveci sa lijeve strane.*/ for (i = velicina - 1; i >= 0; i--) {
if (niz[i] >= drugi && niz[i] != najveci) {
drugi = niz[i]; indeks = i; flag = 1; /*Ako je vrijednost varijable 'drugi' makar jednom promijenjena, znaci da nisu svi
elementi niza isti*/ }
}
/*Provjera da li su svi elementi isti*/ if (najveci == 0 || flag == 0)
indeks = -1;
return indeks; }
int main () {
int niz[vel]; int i = 0;
/*Unos niza*/ printf("Unesite niz brojeva:");
do
{ scanf("%i", &niz[i]); } while (niz[i] != -1 && i++
-
8/17/2019 Or II Parcijala Tutorijali
17/60
Osnove računarstva Tutorijal 9
Berina Cocalić
Potrebno je napisati funkciju koja kao parametar prima niz realnih brojeva proizvoljne dužine, a zatim sve
brojeve u nizu zaokružuje na jednu decimalu. Pri rješavanju zadatka je obavezno korištenje pokazivačke
aritmetike. Dakle, u programu nije dozvoljeno pristupati članovima niza korištenjem uglastih zagrada.
#include
#define vel 100
void zaokruzi(float* pok, int velicina)
{
int i;
float temp;
/*Zaokruzivanje brojeva na jednu decimalu*/
for(i=0; i
-
8/17/2019 Or II Parcijala Tutorijali
18/60
Osnove računarstva Tutorijal 9
Berina Cocalić
Potrebno je napisati funkciju sortiraj koja slaže po veličini niz realnih brojeva, pri čemu se dužina niza funkciji
prosljeđuje kao argument. Nakon pisanja funkcije, napraviti kratki program koji je testira. Kao i u prethodnom
zadatku, za rješavanje je obavezno korištenje pokazivačke aritmetike.
#include
#define vel 100
void sortiraj(float* pok, int velicina)
{
int i,j;
/*Sortiranje*/
for(i=0; i
-
8/17/2019 Or II Parcijala Tutorijali
19/60
Osnove računarstva Tutorijal 9
Berina Cocalić
Napisati funkciju koja prima dvodimenzionalni niz cijelih brojeva i ispisuje ga na ekranu kao tabelu. Zadatak
riješite korištenjem nizova, a potom korištenjem pokazivačke aritmetike.
korištenjem nizova korištenjem pokazivačke aritmetike
#include
#define vel 3
void ispisi(int matrica[][vel])
{
int i,j;
/*Ispis*/
for(i=0; i
-
8/17/2019 Or II Parcijala Tutorijali
20/60
Osnove računarstva Tutorijal 9
Berina Cocalić
Napisati funkciju koja vrši zamjenu dva broja. Primjerice, ako je funkcija pozvana sa varijablama a=3 i b=5 ,
nakon poziva funkcije vrijednosti tih varijabli trebaju biti a=5 i b=3.
#include
void zamijeni(int* a, int* b)
{
int temp;
temp=*a;
*a=*b; *b=temp;
}
int main()
{ int a, b;
/*Unos dva broja*/
printf("Unesite broj a:");
scanf("%i", &a);
printf("Unesite broj b:"); scanf("%i", &b);
/*Poziv funkcije koja mijenja*/
zamijeni(&a, &b);
printf("\nBroj a je: %i, a broj b je %i.", a, b);
return 0;
}
-
8/17/2019 Or II Parcijala Tutorijali
21/60
Osnove računarstva Tutorijal 10
Berina Cocalić
Potrebno je napisati program koji učitava niz znakova (string) koristeći funkciju unos. Potom program treba da
traži unos znaka i pozove funkciju prebrojavanje koja treba da nađe broj ponavljanja znaka u datom stringu.
Dopuniti program funkcijom koja prebrojava koliko ukupno ima slova u stringu. Potom dodati poziv ove funkcije
u glavnu funkciju programa. Prototip funkcije bi trebao biti sljedeći: int duzina(char* string) .
Dopuniti program dodavanjem funkcije samoglasnici koja će kao rezultat vraćati broj samoglasnika uproslijeđenom stringu. Pri implementaciji funkcije je potrebno paziti na mala i velika slova. Nakon dodavanja
funkcije, dodati poziv iste u glavnu funkciju programa. Prototip funkcije treba da bude sljedeći:int samoglasnici (char* string) .
#include
/*Funkcija za unos novog stringa*/ void unos(char* string, int duzina) {
int i = 0;
char c;
do {
c = getchar(); string[i] = c; i++;
} while(c != '\n' && i = 'A' && *(string) = 'a' && *(string)
-
8/17/2019 Or II Parcijala Tutorijali
22/60
Osnove računarstva Tutorijal 10
Berina Cocalić
Napisati funkciju k oja u proslijeđenom stringu sva mala slova pretvara u velika. Rezultat funkcije treba da budepokazivač na prvi znak stringa, tj. isti koji je i proslijeđen funkciji; ovo omogućava lančano pozivanje ovakvih
funkcija. Nakon toga napisati program koji poziva ovu funkciju. Prototip funkcije treba da bude sljedeći:char* velika(char* string) .
#include
/*Funkcija za unos stringa*/ void unos(char* string, int duzina) {
int i = 0; char c;
do {
c = getchar(); string[i] = c; i++;
} while(c != '\n' && i ='a' && *string
-
8/17/2019 Or II Parcijala Tutorijali
23/60
Osnove računarstva Tutorijal 10
Berina Cocalić
Napisati funkciju koja vraća broj riječi koje se nalaze u proslijeđenom stringu. Radi jednostavnosti zadatka,
pretpostaviti da je riječ bilo koji niz znakova razdvojen znakom razmaka. Prototip funkcije treba da bude
sljedeći: int broj_rijeci(char* string) .
#include
/*Funkcija za unos stringa*/ void unos(char* string, int duzina) {
int i = 0; char c;
do {
c = getchar(); string[i] = c; i++;
} while(c != '\n' && i
-
8/17/2019 Or II Parcijala Tutorijali
24/60
Osnove računarstva Tutorijal 10
Berina Cocalić
Potrebno je implementirati funkciju iz biblioteke string.h Funkcija vrši poređenje dva stringa po abecedi i vraćacjelobrojnu vrijednost: 0 ako su stringovi jednaki, broj manji od nule ako je prvi string abecedno ispred drugog,
broj veći od nule ako je drugi string abecedno ispred prvog. Ako su dva stringa različite dužine, a identični su do
kraja kraćeg stringa, smatra se da je kraći string ispred prvog. Funkcija treba da ima sljedeći prototip:int strcmp(const char* prvi, const char* drugi) .
#include #define vel 15
void unos(char* string) {
int i = 0; char c;
/*Unos stringa*/ do {
c = getchar(); string[i] = c; i++;
} while(c != '\n' && i
-
8/17/2019 Or II Parcijala Tutorijali
25/60
Osnove računarstva Tutorijal 10
Berina Cocalić
Prepraviti prethodni program tako da funkcija prima i parametar koji predstavlja logičku vrijednost kojaodređuje da li de se pri poređenju uzimati u obzir razlika između velikih i malih slova ili ne. Prototip funkcije
sada treba da izgleda ovako: int strcm(const char* prvi, const char* drugi, int velikamala) .
#include #define vel 15
void unos(char* string) {
int i = 0; char c;
/*Unos stringa*/ do {
c = getchar(); string[i] = c; i++;
} while(c != '\n' && i ='A' && *(prvi+i)='A' && *(drugi+i
)
-
8/17/2019 Or II Parcijala Tutorijali
26/60
Osnove računarstva Dodatni zadaci iz stringova
Berina Cocalić
Napisati funkciju rot13() koja vrši šifrovanje i ujedno dešifovanje primljenog stringa po ROT13 algoritmu.
ROT13 algoritam znači da se svako slovo u primljenom t ekstu zamjenjuje slovom koje je udaljeno za 13 mjesta uengleskoj abecedi. Npr. slovo A se zamjenjuje slovom N, slovo B slovom O itd. Ako se pri brojanju mjesta dođe do
slova Z, brojanje se nastavlja od početka, pa se npr. slovo M zamjenjuje slovom Z, a slovo N se zamjenjuje slovomA jer smo krenuli od početka abecede, slovo O se zamjenjuje slovom B itd. Iz ovoga vidimo da ista funkcija radi i
šifrovanje i dešifrovanje teksta pošto engleska abeceda ima tačno 26 slova.
Pazite da se u funkciji velika slova zamjenjuju velikim, a mala malim, dok ostale znakove (razmake, brojeve itd.)
ostavljate nepromijenjenim. Funkcija treba da prima string preko pokazivača a ne vraća ništa (tipa je void). Napišite i glavni program u kojem se unosi string, poziva funkcija i zatim ispisuje (de)šifrovani string.
#include #define vel 15
void unos(char* string) {
int i = 0; char c;
/*Unos stringa*/ do {
c = getchar(); string[i] = c; i++;
} while(c != '\n' && i ='A' && *string='a' && *string='N' && *string='n' && *string
-
8/17/2019 Or II Parcijala Tutorijali
27/60
Osnove računarstva Dodatni zadaci iz stringova
Berina Cocalić
Napraviti funkciju koja prima string koji predstavlja rečenicu i neki cijeli broj n, a zatim iz rečenice izbacuje n-
tu po redu riječ. Ako je n manje od jedan ili veće od broja riječi u stringu, f unkcija ne treba uraditi ništa.
Riječ se u ovom zadatku definiše kao neprekinuti niz velikih i malih slova. Svaki drugi karak ter u stringu (tačka,
zarez, minus itd.) smatraće se prekidom riječi. Npr. ako je dat string "Auto-Stop", smatraće se da se on sastoji iz
dvije riječi od po četiri slova. Napravite i kraći glavni program koji demonstrira korištenje ove funkcije.
#include #define duzina 50
void unos (char* string) {
char c; int i=0;
do
{ c=getchar(); string[i]=c; i++;
} while(c != '\n' && i 'Z' && *string 'Z' && *(string+i) = 'A' && *(string+i+1) <= 'Z') || (*(string+i+1) >= 'a' && *(string+i+1)<='z') || *(string+i+1)=='\0'))
{ i++; k++;
/*Brisanje rijeci, tj. pomjeranje ostatka stringa
ulijevo za broj slova u rijeci*/ if (++broj_rijeci == rijec) {
do {
*(string+i-k) = *(string+i); string++;
} while (*(string+i-k)!='\0'); *(string+i-k)='\0'; break;
}
/*k pamti duzinu zadnje rijeci pa se
nakon svake rijeci restartuje*/ k = 0;
}
k++; i++;
} }
int main() {
char recenica[duzina]; printf("Unesite recenicu: "); unos(recenica);
int n; printf("Unesite koju rijec zelite
izbaciti:"); scanf("%i", &n);
izbaci(recenica, n);
/*Ispis promijenjene recenice*/ printf("\nRecenica: %s", recenica);
return 0; }
-
8/17/2019 Or II Parcijala Tutorijali
28/60
Osnove računarstva Dodatni zadaci iz stringova
Berina Cocalić
Napraviti funkciju sa prototipom: char* whitespace (char* string) koja u datom stringu zamjenjuje sve
"whitespace" znakove jednim razmakom. Dakle, novi redovi ('\n') i tabovi ('\t') trebaju biti zamijenjeni
razmakom. Takođe, ukoliko se javlja više razmaka zaredom, treba ih zamijeniti jednim razmakom. Ovo uključuje
i kombinacije razmak-tab ili razmak-novi red.
#include #define duzina 100
void unos (char* string) {
char c; int i=0; do {
c=getchar(); string[i]=c; i++;
} while(c != '\n' && i
-
8/17/2019 Or II Parcijala Tutorijali
29/60
Osnove računarstva Dodatni zadaci iz stringova
Berina Cocalić
Napraviti funkciju koja iz datog stringa, koji predstavlja C kod, izbacuje sve komentare. Funkcija treba da
podržava komentare u C stilu: /* komentar */ i u C++ stilu: // komentar.....
Napravite i kraći program koji demonstrira korištenje ove funkcije. U zadatku je zabranjeno korištenje funkcija
iz biblioteke string.h.
#include #define duzina 100
void unos (char* string) {
char c; int i=0;
do {
c=getchar(); string[i]=c; i++;
} while(c != '\n' && i
-
8/17/2019 Or II Parcijala Tutorijali
30/60
Osnove računarstva Dodatni zadaci iz stringova
Berina Cocalić
Napraviti funkciju koja u datom stringu sve riječi dužine 10 ili više slova pretvara u skraćeni oblik - prva tri
slova i znak tačka.
Primjer:
Ulaz: Za vrijeme promjena specifikacija moze doci do poremecaja tolerancije izlaznog proizvoda.
Izlaz: Za vrijeme promjena spe. moze doci do por. tol. izlaznog proizvoda.Radi jednostavnosti, ne trebate posebno tretirati znakove interpunkcije. Riječ je svaki dio teksta koji je
ograničen sa jednim ili više razmaka.
#include #define vel 100
/*Funkcija za unos stringa*/ void unos (char* string) {
char c; int i=0;
do { c=getchar(); string[i]=c; i++;
} while(c != '\n' && i 9) {
int k=3; *(s+k)='.'; k++;
while(*(s+k)!='\0')
{ *(s+k)=*(s+j); k++; j++;
} *(s+k)=*(s+j);
} } s++;
} return pok;
}
int main()
{ char string[vel];
printf("Unesite recenicu: "); /*Unos strina.*/ unos(string);
/*Ispis stringa nakon poziva funkcije.*/ printf("String: %s", skrati(string));
return 0; }
-
8/17/2019 Or II Parcijala Tutorijali
31/60
Osnove računarstva Dodatni zadaci iz stringova
Berina Cocalić
Napisati funkciju s imenom adresa koja kao argument uzima dva stringa koji predstavljaju ime i prezime a kao
rezultat vraća novi string koji se dobije tako da se string koji predstavlja prezime promijeni u string koji
predstavlja e-mail adresu slijedećeg oblika: [ime].[prezime]@etf.unsa.baPrototip funkcije je: char* adresa(char *ime, char *prezime) Na primjer, ako su argumenti ime="Marko", prezime="Markovic" funkcija adresa() vraća pokazivač na
rezultirajući string prezime koji je promijenjen u novi string oblika: [email protected]. Nakon toga,napisati glavni program koji učitava ime i prezime neke osobe i na standardnom izlazu ispisuje toj osobi
pridruženu e-mail adresu koja se dobije pozivom funkcije adresa().
#include
void unos (char* string, int vel) {
char c; int i=0; do {
c=getchar(); string[i]=c; i++;
} while(c != '\n' && i =0);
i=0; /*Petlja koja dodaje ime ispred prezimena
(ukljucujuci tacku)*/ do
{ *(prezime+p)=*(ime+p); p++;
} while(*(ime+p)!='\0');
int k = 0;
/*Ukidanje razmaka i mijenjanje velikih slova
u mala*/ do {
if (*(prezime+k) == ' ') {
int l = k+1;
do { *(prezime+l-1) = *(prezime+l); l++;
} while (*(prezime+l-1) != '\0'); }
if (*(prezime+k) >= 'A' && *(prezime+k) <= 'Z')
*(prezime+k) = *(prezime+k)+32; k++;
} while (*(prezime+k) != '\0'); *(prezime+k) = '\0';
return pok; }
int main() {
char ime[15], prezime [50]; /*Unos imena.*/ printf("Unesite ime: "); unos(ime, 15);
/*Unos imena.*/ printf("Unesite prezime: "); unos(prezime, 20);
/*Ispis adrese*/ printf("Adresa: %s", adresa(ime, prezime));
return 0; }
-
8/17/2019 Or II Parcijala Tutorijali
32/60
Osnove računarstva Tutorijal 11
Berina Cocalić
Potrebno je napisati program koji će omogućiti unos tačke i kružnice sa tastature. Tačku i kružnicu je potrebno
predstaviti kao strukture, a za unos je potrebno napraviti dvije funkcije koje de vršiti unos podataka i vraćati te
strukture kao rezultat. Nak on unosa, program treba da ispiše da li se unesena tačka nalazu unutar, na granici ili
izvan kružnice.
#include
/* Definicija struktura tačke i kružnice */ struct Tacka{
float x, y; }; struct Kruznica{
struct Tacka centar; float poluprecnik;
};
/* Funkcije za unos */ struct Tacka unos_tacke()
{ struct Tacka t; printf ("Unesite koordinate tacke (x, y): "); scanf ("%f %f", &t.x, &t.y); return t;
} struct Kruznica unos_kruznice() {
struct Kruznica k; printf ("Unesite centar kruznice: \n"); k.centar = unos_tacke(); printf ("Unesite poluprecnik kruznice: "); scanf("%f", &k.poluprecnik); return k;
}
/* Funkcija za udaljenost izmedju dvije tačke */ float udaljenost(struct Tacka t1, struct Tacka t2) {
return sqrt((t1.x - t2.x) * (t1.x - t2.x) + (t1.y - t2.y) * (t1.y - t2.y)); }
/* Glavni program: Da li je tačka unutar kružnice */ int main() {
struct Kruznica k; struct Tacka t; float d;
printf ("Unesite kruznicu: \n"); k = unos_kruznice();
printf ("Unesite neku tacku: \n"); t = unos_tacke();
/* Tačka se nalazi unutar kružnice ako je udaljenost tačke od centra kruznice manja od poluprečnika kružnice */ d = udaljenost(t, k.centar); if (d
-
8/17/2019 Or II Parcijala Tutorijali
33/60
Osnove računarstva Tutorijal 11
Berina Cocalić
Prepraviti zadatak dodavanjem funkcija koje računaju obim i površinukružnice. U glavnu funkciju programa
dodati kod koji poziva ove funkcije i ispisuje rezultat.
#include #define PI 3.14
/* Definicija struktura tačke i kružnice */ struct Tacka{
float x, y;
};
struct Kruznica{
struct Tacka centar; float poluprecnik;
};
/* Funkcije za unos */ struct Tacka unos_tacke() {
struct Tacka t;
printf ("Unesite koordinate tacke (x, y): "); scanf ("%f %f", &t.x, &t.y);
return t; }
struct Kruznica unos_kruznice() {
struct Kruznica k;
printf ("Unesite centar kruznice:\n"); k.centar = unos_tacke();
printf ("Unesite poluprecnik kruznice: "); scanf("%f", &k.poluprecnik);
return k; }
/* Funkcija za udaljenost izmedju dvije tačke */ float udaljenost(struct Tacka t1, struct Tackat2) {
return sqrt((t1.x-t2.x) * (t1.x-t2.x) + (t1.y-t2.y) * (t1.y-t2.y)); }
float obim_kruznice(struct Kruznica k) {
return 2*PI*k.poluprecnik; }
float povrsina_kruznice(struct Kruznica k) {
return PI*k.poluprecnik*k.poluprecnik; }
/* Glavni program: Da li je tačka unutar kružnice
*/ int main() {
struct Kruznica k; struct Tacka t; float d;
printf ("Unesite kruznicu:\n"); k = unos_kruznice();
printf ("Unesite neku tacku:\n"); t = unos_tacke();
/* Tačka se nalazi unutar kružnice ako je
udaljenost tačke od centrakruznice manja od
poluprečnika kružnice */ d = udaljenost(t, k.centar);
if (d
-
8/17/2019 Or II Parcijala Tutorijali
34/60
Osnove računarstva Tutorijal 11
Berina Cocalić
Prepraviti program dodavanjem strukture koja predstavlja pravougaonik, a potom dodati funkcije za unos i
računanje obima i površine istog. Nakon toga dodati kod koji koristi ove funkcije, kao i kod koji provjerava da li
se unesena tačka nalazi unutar unesenog pravougaonika.
#include
#define PI 3.14
/* Definicija struktura tačke i kružnice */ struct Tacka{
float x, y; };
struct Kruznica{
struct Tacka centar; float poluprecnik;
};
struct Pravougaonik{
struct Tacka koordinata1; struct Tacka koordinata2; struct Tacka koordinata3; struct Tacka koordinata4;
};
/* Funkcije za unos */ struct Tacka unos_tacke() {
struct Tacka t;
printf ("Unesite koordinate tacke (x, y): ");
scanf ("%f %f", &t.x, &t.y);
return t; }
struct Kruznica unos_kruznice() {
struct Kruznica k;
printf ("Unesite centar kruznice:\n"); k.centar = unos_tacke();
printf ("Unesite poluprecnik kruznice: "); scanf("%f", &k.poluprecnik);
return k; }
struct Pravougaonik unos_pravougaonika() {
struct Pravougaonik p;
do {
printf ("Unesite koordinate gornje lijeve tacke:\n"); p.koordinata1 = unos_tacke();
printf ("Unesite koordinate gornje desne tacke:\n");
p.koordinata2 = unos_tacke();
printf ("Unesite koordinate donje desne tacke:\n"); p.koordinata3 = unos_tacke();
-
8/17/2019 Or II Parcijala Tutorijali
35/60
Osnove računarstva Tutorijal 11
Berina Cocalić
printf ("Unesite koordinate donje lijeve tacke:\n"); p.koordinata4 = unos_tacke();
} while(p.koordinata1.y!=p.koordinata2.y || p.koordinata2.x!=p.koordinata3.x || p.koordinata3.y!=p.koor
dinata4.y ||p.koordinata1.x!=p.koordinata4.x);
return p;
}
/* Funkcija za udaljenost izmedju dvije tačke */ float udaljenost(struct Tacka t1, struct Tacka t2) {
return sqrt((t1.x-t2.x) * (t1.x-t2.x) + (t1.y-t2.y) * (t1.y-t2.y)); }
float obim_kruznice(struct Kruznica k) {
return 2*PI*k.poluprecnik; }
float povrsina_kruznice(struct Kruznica k) {
return PI*k.poluprecnik*k.poluprecnik; }
float obim_pravougaonika(struct Pravougaonik p) {
float a, b; a=udaljenost(p.koordinata1,p.koordinata2); b=udaljenost(p.koordinata2,p.koordinata3);
return 2*a+2*b; }
float povrsina_pravougaonika(struct Pravougaonik p) {
float a, b; a=udaljenost(p.koordinata1,p.koordinata2); b=udaljenost(p.koordinata2,p.koordinata3);
return a*b; }
/* Glavni program: Da li je tačka unutar kružnice */ int main() {
struct Kruznica k;
struct Tacka t; struct Pravougaonik p; float d;
printf ("Unesite kruznicu:\n"); k = unos_kruznice();
printf ("Unesite pravougaonik:\n"); p = unos_pravougaonika();
printf ("Unesite neku tacku:\n"); t = unos_tacke();
/* Tačka se nalazi unutar kružnice ako je udaljenost tačke od centrakruznice manja od poluprečnika
kružnice */ d = udaljenost(t, k.centar);
if (d
-
8/17/2019 Or II Parcijala Tutorijali
36/60
Osnove računarstva Tutorijal 11
Berina Cocalić
else if (d == k.poluprecnik) printf("Tacka je na kruznici.\n");
else printf("Tacka je izvan kruznice.\n");
if(t.xp.koordinata1.x && t.yp.koordinata4.y) printf("Tacka je unutar pravougaonika.\n");
else if ((t.x==p.koordinata1.x && (t.y=p.koordinata4.y)) || (t.x==p.koordina
ta2.x && (t.y=p.koordinata3.y)) || (t.y==p.koordinata1.y && (t.x=p.koordinata1.x)) || (t.y==p.koordinata3.y &&(t.x=p.koordinata1.x)))
printf("Tacka je na pravougaoniku.\n");
else printf("Tacka je izvan pravouganika.\n");
printf("Obim kruznice je %.2f, a povrsina kruznice je%.2f.", obim_kruznice(k), povrsina_kruznice(k));
printf("Obim pravougaonika je %.2f, a povrsina pravougaonika je%.2f.", obim_pravougaonika(p), povrsina_pravougaonika(p));
return 0;
}
-
8/17/2019 Or II Parcijala Tutorijali
37/60
Osnove računarstva Tutorijal 11
Berina Cocalić
Data je slijedeća struktura:struct Vrijeme{
int sati; int minute; int sekunde;
};
Napraviti program koji vrši unos dvije varijable koje su tipa struct Vrijeme, a potom određuje koliko je sekundiprošlo između ta dva vremena. Koristiti funkcije unos vremena() i proteklo() i paziti na slučaj kada je drugo
vrijeme ispred prvog. Prepraviti program tako da određuje koliko je sati, minuta i sekundi proteklo između dva
vremena.
u sekundama u satima, minutama i sekundama#include
struct Vrijeme{
int sati; int minute; int sekunde;
};
struct Vrijeme unos_vremena() {
struct Vrijeme v;
scanf ("%i %i%i", &v.sati, &v.minute, &v.sekunde);
return v; }
float proteklo(struct Vrijeme v1, struct Vrijeme
v2) {
return ((v1.sati*3600+v1.minute*60+v1.sekunde)-(v2.sati*3600+v2.minute*60+v2.sekunde)); }
int main() {
struct Vrijeme v1; struct Vrijeme v2; int sekunde;
printf ("Unesite prvo vrijeme:\n");
v1 = unos_vremena(); printf ("Unesite drugo vrijeme:\n"); v2 = unos_vremena();
sekunde=proteklo(v1, v2);
if(sekunde
-
8/17/2019 Or II Parcijala Tutorijali
38/60
Osnove računarstva Tutorijal 11
Berina Cocalić
Data je sljedeća struktura podataka:struct Osoba{
char ime[duzina]; char prezime[duzina]; int telefon;
};
Napraviti program koji sadrži niz od 100 osoba i omogućava unos osoba, kao i ispis do sada unesenih osoba.Korisniku se nakon svakog unosa ili ispisa prikazuje meni koji mu nudi da izabere da li će da vrši unos, ispis ili
izlaz.
#include #define vel 101 #define duzina 15
/*Ciscenje buffera*/ void Ocisti () {
char c; while((c=getchar()) != '\n' && c != EOF);
}
struct Osoba{
char ime[duzina]; char prezime[duzina]; int telefon;
};
/*Unos stringa*/ void unos (char* string) {
char c; int i=0;
do {
c=getchar(); string[i]=c; i++;
} while (c != '\n' && i
-
8/17/2019 Or II Parcijala Tutorijali
39/60
Osnove računarstva Tutorijal 11
Berina Cocalić
Napisati funkciju koja proslijeđeni string mijenja tako da se pri ispisu istog ispiše samo prva riječ stringa.
Funkcija treba da kao rezultat vrati pokazivač na početak tog stringa. Prototip funkcije treba da izgleda ovako:char* rijec(char* string) .
#include
#define vel 50
void unos (char* string) {
int i=0; char c; do {
c=getchar(); string[i]=c; i++;
} while(c != '\n' && i ='A' && *(string)='a' && *(string)
-
8/17/2019 Or II Parcijala Tutorijali
40/60
Osnove računarstva Tutorijal 12
Berina Cocalić
Potrebno je napisati program koji za neku tekstualnu datoteku (čije se ime učitava sa tastature) određuje broj
redova, broj riječi i broj znak ova. Pri brojanju znakova se ne računaju razmaci (obični razmak, tab karakter i znak
za novi red).
#include #include
int main () {
FILE* ulaz; char znak, ime[50]; int broj_redova = 0, broj_rijeci = 0, broj_znakova = 0, razmak = 1;
printf("Unesite ime datoteke: "); scanf("%s", ime);
ulaz = fopen(ime, "r");
/*Provjera da li je uspjelo otvaranje datoteke*/ if(ulaz == NULL)
{ printf("Greška prilikom otvaranja datoteke '%s'! \n", ime); exit(1);
}
while((znak = fgetc(ulaz)) != EOF) {
/* Ako je znak novi red, povecaj broj linija za jedan */ if(znak == '\n')
broj_redova++;
/* Da li je znak razmak? */ if(znak == ' ' || znak == '\n' || znak == '\t')
razmak = 1;
else { /* Ako je prethodni znak bio razmak, a ovaj nije, povecaj broj rijeci za jedan */ broj_znakova++; if(razmak == 1)
broj_rijeci++; razmak = 0;
} } if(broj_znakova != 0)
broj_redova++;
printf("Broj redova: %d \n", broj_redova); printf("Broj rijeci: %d \n", broj_rijeci); printf("Broj znakova: %d \n", broj_znakova);
/*Zatvaranje datoteke*/ fclose(ulaz);
return 0; }
-
8/17/2019 Or II Parcijala Tutorijali
41/60
Osnove računarstva Tutorijal 12
Berina Cocalić
Prepraviti program iz tako da ispisuje broj samoglasnika, broj velikih slova i broj cifara.
#include #include
int main () {
FILE* ulaz; char znak, ime[50]; int broj_redova = 0, broj_rijeci = 0, broj_znakova = 0; int razmak = 1, broj_samoglasnika = 0, velika_slova = 0, broj_cifara = 0;
printf("Unesite ime datoteke: "); scanf("%s", ime); ulaz = fopen(ime, "r");
/*Provjera da li je uspjelo otvaranje datoteke*/ if(ulaz == NULL) {
printf("Greška prilikom otvaranja datoteke '%s'! \n", ime); exit(1);
}
while((znak = fgetc(ulaz)) != EOF) {
/* Ako je znak novi red, povecaj broj linija za jedan */ if(znak == '\n')
broj_redova++;
/*Brojanje velikih slova*/ else if ( znak >= 'A' && znak = '0' && znak
-
8/17/2019 Or II Parcijala Tutorijali
42/60
Osnove računarstva Tutorijal 12
Berina Cocalić
Data je datoteka ispiti.txt čiji redovi imaju sljedeću strukturu:
broj_indeksa predmet ocjena
Pri tome broj_indexa predstavlja broj indeksa studenta koji je polagao ispit, predmet pretstavlja predmet za koji
se polagao ispit, a ocjena predstavlja rezultat ispita. Primjer sadržaja datoteke je:
12345 3 10
12345 4 9
12233 4 10
13579 2 8
Prvi red označava da je student sa brojem indeksa 12345 iz predmeta broj 3 (to mogu biti Osnove računarstva)
dobio ocjenu 10 itd. Ako je isti student položio više predmeta, jednostavno se dodaje još jedan red sa istim brojem
indeksa, ali drugim predmetom. Potrebno je kreirati ovu datoteku i napuniti je nekim testnim podacima. Potom
je potrebno napraviti program koji traži od korisnika da unese broj predmeta, te zatim ispisuje prosječnu ocjenu
i prolaznost na predmetu (procenat studenata koji su na ispitu dobili ocjenu 6 ili više).
#include #include #define velicina 100
struct Student{
int indeks; int predmet; int ocjena;
};
int main () {
FILE* ulaz;
ulaz = fopen("ispiti.txt", "r");
/*Provjera da li je uspjelo otvaranje
datoteke*/ if(ulaz == NULL) {
printf("Greška prilikom otvaranjadatoteke ispiti.txt! \n");
exit(1); }
int i = 0; struct Student osoba[velicina];
/*Ucitavanje podataka iz datoteke u nizstruktura*/
while (fscanf(ulaz, "%i %i%i\n", &osoba[i].indeks, &osoba[i].predmet, &osoba[i].ocjena) != EOF && i 5) broj_prolaza++;
suma_ocjena += osoba[j].ocjena; broj_izlazaka++;
}
} while ( j++
-
8/17/2019 Or II Parcijala Tutorijali
43/60
Osnove računarstva Tutorijal 12
Berina Cocalić
Dopuniti prethodni program tako da se od korisnika ne traži broj predmeta, nego njegov naziv. Za ovu svrhu
napraviti datoteku pod nazivom predmeti.txt koja sadrži imena predmeta zajedno sa njihovim brojevima. Primjer
sadržaja datoteke je:
1 Inzenjerska matematika I
2 Inzenjerska fizika I
3 Linearna algebra i geometrija
4 Osnove racunarstva
5 Osnove elektrotehnike
Kada korisnik unese naziv predmeta, program treba da provjeri da li se taj naziv nalazi u datoteci predmeti.txt .
Ako naziv nije u toj datoteci, ispisuje se greška. U suprotnom slučaju se ispisuju podaci predmeta.
#include #include #include #define velicina 100 #define vel 6
struct Student{
int indeks; int predmet; int ocjena;
};
struct Predmet{
int redni_broj; char ime[50];
};
void unos (char* string, int duzina) {
char c; int i = 0;
do {
c = getchar(); *(string+i) = c; i++;
} while (c != '\n' && i
-
8/17/2019 Or II Parcijala Tutorijali
44/60
Osnove računarstva Tutorijal 12
Berina Cocalić
/*Ucitavanje podataka iz datoteke u niz struktura*/ while (fscanf(ulaz, "%i %i
%i\n", &osoba[i].indeks, &osoba[i].predmet, &osoba[i].ocjena) != EOF && i
-
8/17/2019 Or II Parcijala Tutorijali
45/60
Osnove računarstva Tutorijal 12
Berina Cocalić
broj_prolaza++;
suma_ocjena += osoba[j].ocjena; broj_izlazaka++;
} } while ( j++
-
8/17/2019 Or II Parcijala Tutorijali
46/60
Osnove računarstva Tutorijal 12
Berina Cocalić
Prepraviti prethodni program dodavanjem mogućnosti da se unese broj indeksa studenta, nakon čega program
ispisuje ukupan broj predmeta za koje je student polagao ispite, broj položenih ispita, te prosječnu ocjenu.
#include #include #include
#define velicina 100 #define vel 6
struct Student{
int indeks; int predmet; int ocjena;
};
struct Predmet{
int redni_broj; char ime[50];
};
void unos (char* string, int duzina) {
char c; int i = 0;
do {
c = getchar(); *(string+i) = c; i++;
}
while (c != '\n' && i
-
8/17/2019 Or II Parcijala Tutorijali
47/60
Osnove računarstva Tutorijal 12
Berina Cocalić
int izbor;
do {
printf("\nUnesite 1 za statistiku studenta, 2 za statistiku predmeta, 0 za izlaz:"); scanf("%i", &izbor); Ocisti();
if ( izbor == 1) {
int br_indeksa; int l; int izasao = 0; int polozio = 0; float suma_polozenih = 0.0;
printf("Unesite broj indeksa:"); scanf("%i", &br_indeksa); Ocisti();
/*Brojanje ispita na koje je student izasao, koje je polozio i prosjecne ocjene*/ for (l = 0; l 5) {
suma_polozenih += osoba[l].ocjena; polozio++;
}
izasao++; }
}
if (izasao == 0)
printf("Osoba sa tim brojem indeksa ne postoji.");
else printf("Student je polagao ispite iz %i predmeta, a polozio je %i (%.2f %%).\n Prosjecnaocjena polozenih predmeta je %.2f.",izasao, polozio, (polozio*100.)/izasao, suma_polozenih/polozio);
}
else if ( izbor == 2 ) {
/*Otvaranje datoteke predmeti*/ ulaz = fopen("predmeti.txt", "r");
/*Provjera da li je uspjelo otvaranje datoteke*/ if(ulaz == NULL) {
printf("Greška prilikom otvaranja datoteke predmeti.txt! \n");
exit(1); }
/*Ucitavanje datoteke u niz*/ int j = 0; struct Predmet imena[vel]; do {
fscanf(ulaz, "%i ", &imena[j].redni_broj); fgets (imena[j].ime, 50, ulaz); imena[j].ime[strlen (imena[j].ime)-1] = '\0'; j++;
} while (j
-
8/17/2019 Or II Parcijala Tutorijali
48/60
Osnove računarstva Tutorijal 12
Berina Cocalić
/*Odabir predmeta*/ char ime_predmeta[50]; int podudarnost = 0; int broj_predmeta;
int k; do {
/*Unos predmeta i ispit postojanja istog*/
printf("Unesite predmet: "); unos(ime_predmeta, 50);
for (k = 0; k 5) broj_prolaza++;
suma_ocjena += osoba[j].ocjena; broj_izlazaka++;
} } while ( j++
-
8/17/2019 Or II Parcijala Tutorijali
49/60
Osnove računarstva Tutorijal 13
Berina Cocalić
Potrebno je napraviti program koji učitava podatke iz datoteke ispit.txt , sortira ih, i potom ih ispisuje u datoteku
ispit_sortiran.txt .
Potrebno je napraviti datoteku ispit.txt formatiranu na sljedeći način:
prezime ime broj_bodova
pri čemu prezime zauzima 15 mjesta, ime zauzima 10 mjesta a broj_bodova zauzima 2 mjesta. Pazite da svaki
podatak u datoteci zauzima predviđeni broj mjesta! Za prezime je potrebno rezervirati tačno 15 mjesta. Ako je
prezime kraće od 15 slova, dopuniti ostatak prostora razmacima. Ako je duže, skratite ga.
#include #include #define name 10 #define lname 15 #define velicina 100
struct Osoba {
char ime[name+1], prezime[lname+1]; int broj_bodova;
};
/*Funkcija koja ucitava datoteku i podatke iz nje
kopira u niz struktura.*/ int ucitaj (struct Osoba o[]) {
FILE* ulaz; int br_unesenih = 0;
ulaz = fopen("ispit.txt", "r");
/*Ako otvaranje datoteke nije uspjelo, javigresku.*/
if ( ulaz == NULL ) {
printf("Datoteka ispiti.txt ne moze bitiucitana.");
exit(1); }
/*Ako je otvaranje uspjelo, ucitaj podatke u
niz struktura*/ else
{ while (fscanf(ulaz,"%15s %15s %2i\n",
o[br_unesenih].prezime, o[br_unesenih].ime, &o[br_unesenih].broj_bod
ova) != EOF && br_unesenih++
-
8/17/2019 Or II Parcijala Tutorijali
50/60
Osnove računarstva Tutorijal 13
Berina Cocalić
U datoteku ispit.txt dodati kolonu broj_bodova_2 koja predstavlja broj bodova na drugom parcijalnom ispitu,
dok broj_bodova_1 predstavlja bodove na prvom parcijalnom ispitu.
prezime ime broj_bodova_1 broj_bodova_2
Potom je potrebno prepraviti program tako da:
- Struktura Student sadrži oba podatka za bodove.
-
U datoteku usmeni.txt uspisuju se studenti koji su položili oba parcijalna ispita (na oba imaju 10 ili višebodova)
- Datoteka usmeni.txt treba imati sljedeću strukturu:
prezime ime ukupno
i pri tome treba biti sortirana po koloni ukupno, od većih prema manjim vrijednostima.
#include #include #include #define name 10 #define lname 15 #define velicina 100
struct Osoba { char ime[name+1], prezime[lname+1]; int broj_bodova_1, broj_bodova_2;
};
/*Funkcija koja ucitava datoteku i podatke iz nje
kopira u niz struktura.*/ int ucitaj (struct Osoba o[]) {
FILE* ulaz; int br_unesenih = 0; ulaz = fopen("ispit.txt", "r");
/*Ako otvaranje datoteke nije uspjelo, javigresku.*/
if ( ulaz == NULL ) {
printf("Datoteka ispiti.txt ne moze bitiucitana.");
exit(1); }
/*Ako je otvaranje uspjelo, ucitaj podatke u
niz struktura, ali samo onih studenata koji su
položili oba parcijalna;*/ else {
while (fscanf(ulaz,"%15s %15s %2i %2i\n", o[br_unesenih].prezime, o[br_unesenih].ime, &o[br_unesenih].broj_bodova_1
, &o[br_unesenih].broj_bodova_2
) != EOF && br_unesenih++
-
8/17/2019 Or II Parcijala Tutorijali
51/60
Osnove računarstva Tutorijal 13
Berina Cocalić
Napraviti program za unos podataka putem tastature u datoteku ispit.txt specificiranu u prethodnom zadatku.
Ovaj program ne smije da briše postojeću datoteku ispit.txt nego treba dodavati nova polja u nju. Program treba
da vrši kontrolu ispravnosti podataka i traži ponovan unos ako su podaci neispravni.
#include #include
#include #define name 10 #define lname 15 #define velicina 100
struct Osoba { char ime[name+1], prezime[lname+1]; int broj_bodova_1, broj_bodova_2;
};
/*Funkcija cisti BUFFER.*/ void Ocisti () {
char c;
while((c=getchar()) != '\n' && c != EOF);
}
/*Funkcija za unos stringa*/ void unos(char* string, int vel) {
int i=0; char c;
do {
c = getchar(); *(string+i) = c;
i++; } while (c != '\n' && i
-
8/17/2019 Or II Parcijala Tutorijali
52/60
Osnove računarstva Tutorijal 13
Berina Cocalić
fclose (ulaz);
return br_unesenih; }
/*Funkcija za unos novih studenata na kraj datoteke*/ int unesi () {
FILE* dodavanje; struct Osoba novi;
dodavanje = fopen("ispit.txt", "a");
if ( dodavanje == NULL ) return -1;
printf("Unesite prezime:\n"); unos(novi.prezime, lname); printf("Unesite ime:\n"); unos(novi.ime, name);
printf("Unesite broj bodova na prvom parcijalnom:");
do {
if ((scanf("%i", &novi.broj_bodova_1))!= 1 || novi.broj_bodova_1 20) printf("Unesite ponovo!\n");
Ocisti();
} while (novi.broj_bodova_1 20);
printf("Unesite broj bodova na drugom parcijalnom:"); do {
if (( scanf("%i", &novi.broj_bodova_2)!= 1 || novi.broj_bodova_2 20)) printf("Unesite ponovo!\n");
Ocisti();
} while (novi.broj_bodova_2 20);
fprintf(dodavanje, "%-15s %-15s %-2i %-2i\n", novi.prezime, novi.ime, novi.broj_bodova_1, novi.broj_bodova_2);
fclose (dodavanje); return 0;
}
/*Kreiranje datoteke usmeni.txt.*/ int zapisi (struct Osoba o[], int vel) {
FILE* sortiranje; int i, j;
sortiranje = fopen("ispit.txt", "w");
if ( sortiranje == NULL ) return -1;
/*Sortiranje niza*/ for (i = 0; i = 10) &&(o[j].broj_bodova_2 >=10))) { struct Osoba temp = o[i]; o[i] = o[j]; o[j] = temp;
-
8/17/2019 Or II Parcijala Tutorijali
53/60
Osnove računarstva Tutorijal 13
Berina Cocalić
} }
}
/*Unos sortiranog niza u postojecu datoteku*/ for (i = 0; i
-
8/17/2019 Or II Parcijala Tutorijali
54/60
Osnove računarstva Tutorijal 13
Berina Cocalić
Dopuniti program iz prethodnog zadatka tako da podržava sljedeće funkcije:
- dodavanje studenata
- brisanje studenata
- izmjena studenata
- ispis sadržaja datoteke
Također se potrebno pobrinuti da datoteka ispit.txt u svakom trenutku bude sortirana.
#include #include #include #define name 10 #define lname 15 #define velicina 100
struct Osoba { char ime[name+1], prezime[lname+1]; int broj_bodova_1, broj_bodova_2;
};
/*Funkcija cisti BUFFER.*/ void Ocisti () {
char c; while((c=getchar()) != '\n' && c != EOF);
}
/*Funkcija za unos stringa*/ void unos(char* string, int vel) {
int i=0; char c;
do {
c = getchar(); *(string+i) = c; i++;
} while (c != '\n' && i
-
8/17/2019 Or II Parcijala Tutorijali
55/60
Osnove računarstva Tutorijal 13
Berina Cocalić
o[br_unesenih].prezime, o[br_unesenih].ime, &o[br_unesenih].broj_bodova_1, &o[br_unesenih].broj_bodova_2) != EOF && br_unesenih++
-
8/17/2019 Or II Parcijala Tutorijali
56/60
Osnove računarstva Tutorijal 13
Berina Cocalić
(((o[j].broj_bodova_1 + o[j].broj_bodova_2) == (o[i].broj_bodova_1 + o[i].broj_bodova_2)) && (o[j].broj_bodova_1 >= 10) &&(o[j].broj_bodova_2 >=10)))
{ struct Osoba temp = o[i]; o[i] = o[j]; o[j] = temp;
}
} }
/*Unos sortiranog niza u postojecu datoteku*/ for (i = 0; i
-
8/17/2019 Or II Parcijala Tutorijali
57/60
Osnove računarstva Tutorijal 13
Berina Cocalić
int i;
for (i = 0; i
-
8/17/2019 Or II Parcijala Tutorijali
58/60
Osnove računarstva Tutorijal 13
Berina Cocalić
if (dodaj() == -1 || br_osoba >= velicina) {
printf("Dodavanje nije uspjelo!"); exit(1);
}
else {
br_osoba++;
ucitaj(student); }
}
else if (izbor == 2) {
if (obrisi(student, br_osoba) == 1) {
printf("Student obrisan!\n"); br_osoba--;
}
else printf("Student ne postoji!"); }
else if (izbor == 3) {
if (izmijeni(student, br_osoba) == 1) printf("Student izmijenjen.");
else printf("Student ne postoji.\n"); }
else if (izbor == 4) ispisi(student, br_osoba);
zapisi (student, br_osoba);
} while ( izbor != 0 );
return 0; }
-
8/17/2019 Or II Parcijala Tutorijali
59/60
Osnove računarstva Tutorijal 13
Berina Cocalić
Dopuniti program Imenik sa tutorijala 11 tako da podatke drži u datoteci. Cilj ove dopune je da se imena ne
moraju ponovo unositi svaki put kad se pokrene program, nego da program pamti imena unesena posljednji
put.
#include #include
#define vel 101 #define duzina 15
/*Ciscenje buffera*/ void Ocisti () {
char c; while((c=getchar()) != '\n' && c != EOF);
}
struct Osoba{
char ime[duzina]; char prezime[duzina];
int telefon; };
/*Unos stringa*/ void unos (char* string) {
char c; int i=0;
do {
c=getchar(); string[i]=c; i++;
} while (c != '\n' && i
-
8/17/2019 Or II Parcijala Tutorijali
60/60
Osnove računarstva Tutorijal 13 /*Ucitavanje podataka iz datoteke*/ int ucitaj(struct Osoba os[]) {
FILE* ulaz; int br_unesenih = 0;
ulaz=fopen("imenik.txt", "r");
/*Ako je ucitavanje datoteke uspjelo, smjeste se podaci iz nje u niz struktura*/ if (ulaz != NULL ) {
do {
printf("%i", br_unesenih); } while ( fscanf(ulaz,"%s %s
%i",os[br_unesenih].ime, os[br_unesenih].prezime, &os[br_unesenih].telefon) != EOF && br_unesenih++