vezba. 1-2 #include int main(void) { printf("Alert: zvucni ili vizuelni signal \a\n"); printf("Po\bvratnik ili b\backspace: sakrij me\b \n"); printf("Upravljacki znak carriage return, \r, pomera aktivnu poziciju do inicijalne pozicije tekuce linije.\n"); printf("Form feed. \f\n"); printf ("Horizontalni\ttab\n"); printf("Vertikalni tab \v je trikovit, jer mu je ponasanje nije specificirano pod izvesnim uslovima\n"); return 0; } vezba 1-3 #include int main(void) { float fahr, celsius; /*vrednosti stepena celzijusa, farenhajta*/ int lower, upper, step; /* donja vrednost skale - lower, gornja vrednost skale -upper, korak skaliranja */ /*inicijalizacije*/ lower = 0; upper = 300; step = 20; /*stampanje zaglavlja "tabele" */ printf("F C\n\n"); /*stampanje vrednosti stepena pocev od O do 300 sa korakom 20 */ fahr = lower; while(fahr <= upper) { celsius = (5.0 / 9.0) * (fahr - 32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } return 0; } vezba 1-4 #include int main(void) { float fahr, celsius; int lower, upper, step; lower = 0; upper = 300; step = 20; printf("C F\n\n"); celsius = lower; while(celsius <= upper) { fahr = (9.0/5.0) * celsius + 32.0; printf("%3.0f %6.1f\n", celsius, fahr); celsius = celsius + step; } return 0;} vezba 1-5 #include /* print Fahrenheit-Celsius table */ int main() { int fahr; for (fahr = 300; fahr >= 0; fahr = fahr - 20) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); return 0; } vezba 1-5 II nacin #include int main(void) { /*celzijusi u farenhajte pocev od 300 stepeni celzijusa do 0 celzijusa*/ float fahr, celsius; int lower, upper, step; lower = 0; upper = 300; step = 20; printf("C F\n\n"); celsius = upper; while(celsius >= lower) { fahr = (9.0/5.0) * celsius + 32.0; printf("%3.0f %6.1f\n", celsius, fahr); celsius = celsius - step; } return 0; } vezba 1-6 /* nakon unosa sa tastature se za uneti EOF (uglavnom * control-D ili control-Z karakter, ali ne obavezno), * stampa 0. Inace, stampa se 1. * * Akoje Vas input stream baferovan (a verovatno jeste), onda * morate pritisnuti ENTER taster pre nego dobijete izlaznu poruku */ #include int main(void) { printf("Pritisnite neki taster. Ne zaboravite ENTER :-)\n\n"); printf("Izraz getchar() != EOF ima vrednost %d\n", getchar() != EOF); return 0; } vezba 1-7 #include int main(void) { printf("Na mom sistemu vrednost za EOF je %d\n\n", EOF); return 0; } vezba 1-12 #include int main(void) { int c; /* znak sa ulaza */ int vanreci; /* indikator nailaska na kraj reci: space, tab ili new line*/ vanreci = 0; while((c = getchar()) != EOF) { if(c == ' ' || c == '\t' || c == '\n') { if(vanreci == 0) { vanreci = 1; /* promena stanja indikatora vanreci, jer smo naisli na zavrsetak reci */ putchar('\n'); } /* inace, nema prelaska u novi red, no samo stampanje sadrzaja tekuce reci */ } else { vanreci = 0; /*signalizira boravak unutar reci */ putchar(c); } } return 0; } IZLAZ IZ PROGRAMA U SLUCAJU: programiranje je moj omiljeni predmet na fakultetu 2 | * * 1 | * * * * * +--------------------------------- 1 2 3 4 5 6 7 8 9 10 >10 1234 567 123 567 567 567 567 567 567 567 567 9 | * 8 | * 7 | * 6 | * 5 | * 4 | * 3 | * 2 | * * 1 | * * +--------------------------------- 1 2 3 4 5 6 7 8 9 10 >10 1. Svaka linija standardnog ulaza je limitirane duzine i sadrzi prirodan broj. Napisati program koji sa standardnog ulaza cita niz pozitivnih brojeva x, dok se ne procita nula. Nije unapred poznat broj clanova niza x, sem da ih nece biti vise od 50. Od clanova niza x formirati niz y, tako sto iz niza x izbaci sve clanove xk koji su deljivi nekim od brojeva x1,x2,..,xk-1. Potom na standardnom izlazu odstampati sve clanove niza y. Pri ucitavanju elemenata niza, razviti sopstvene funkcije za citanje znakovne niske (stringa) i za konverziju u broj. Pretpostaviti da je ulaz i sintaksno i semanticki korektan. -videti i resenje zadatka sa vezbi #include #include #define LINELIMIT 1000 #define MAXNIZ 50 unsigned atou( char s[] ); int getline( char line[], int lim); int imaDelioce( unsigned clan, unsigned clanovi[], int granica); /* glavni program */ main() { char linija[LINELIMIT]; /*tekuci ulaz */ unsigned tekuciBr; /*broj sa ulaza */ int xClanova=0; /*broj clanova niza x */ unsigned x[MAXNIZ]; int yClanova=0; /*broj clanova niza y */ unsigned y[MAXNIZ]; int i; /*brojac u petlji */ /*ucitavanje linija do markera kraja(0) i konverzija u broj */ xClanova=0; do { i = getline(linija,LINELIMIT); tekuciBr = atou(linija); if( tekuciBr ) x[xClanova++] = tekuciBr; } while( tekuciBr ); /*provera svojstva clana niza x i kreiranje niza y zavisno od rezultata provere*/ yClanova = 0; for( i=0; i: a)znak='3'; b) znak='1'; c) znak='A'; 4. videti ekv zadatak sa vezbi unsigned a=0xff, b=0xf; printf("a=%X\tb=%X\n",a,b); printf("a|b=%x\n",a|b); printf("a&b=%x\n",a&b); printf("a^b=%x\n",a^b); DOMACI: Protumaciti uz pomoc K&R knjige izraze: unsigned x, n; x=x & 0177; x=x&01; x=x|n; x=x|01; x=x & ~0177; ~0; ~0< b)Postoji vise nacina da cirilicna slova budu vidljiva. Npr. vrednost charset u okviru taga META se postavi na iso-8859-5 dok se slova kodiraju u obliku &#number; Npr.Ђ 6. (10 poena) Sta je rezultat rada sledeceg programa : #include #define IN 1 #define OUT 0 main( ) { int c, nw , state; state=OUT; nw=0; while ( (c=getchar() ) != EOF) { if (c==' ' || c=='\n' || c=='\t') state=OUT; else if (state==OUT) { state=IN; ++nw; } } printf("\n%d\n",nw); } U sledecem novom redu se ispisuje broj reci teksta sa ulaza, pa se predje u novi red. Smatramo da rec je ma koji niz znakova koji ne sadrži blanko, tab, new line. 7. Sa standardnog ulaza se unosi najpre broj clanova niza celih brojeva, a potom i elementi tog niza. Napisati program koji na standardni izlaz stampa maksimalnu sumu pronadenu u nekom podnizu zadatog niza. Po dogovoru, svaki negativni zbir se zamenjuje nulom. Voditi racuna o efikasnosti rešenja i zadatak rešiti samo jednim prolaskom kroz niz. (Podniz cine uzastopni elementi niza i broj elemenata može biti od 1 do n.) podsetiti se pseudokoda #include #include #define MAXLINE 1000 #define MAX(x,y) ( ( (x)>(y)) ? (x) : (y) ) int getline( char line[], int lim); /* atoi: ascii to integer */ int atoi( char niska[] ); main( ) { int max; /*maksimalna vrednost promenljive maxDoSada*/ int maxDoSada; /*tekuci max koji se formira sumiranjem clanova tokom prolaska kroz niz */ int indeks; /*brojac u petlji */ int clan; /*clan niza cija se maksimalna suma podniza trazi*/ int n; /*broj clanova niza */ char s[MAXLINE]; /*sadrzaj broja; predznak i niska cifara*/ int duzina; /*duzina ucitane linije*/ /* inicijalizacije*/ max=0; maxDoSada=0; indeks=0; /*ucitavanje dimenzije niza*/ printf("Unesite broj elemenata niza:\n"); duzina=getline(s,MAXLINE); n=atoi(s); /* ucitavanje niza i pronalazak max sume podniza */ for(; indeks #define MAX 50 #define min(X,Y) ( (X) < (Y) ? (X):(Y) ) int kond(unsigned int a[],int n); void u_obican(unsigned int b[],int m); void printb(unsigned int x); main() {int n; /* dimenzija niza koji se ucitava */ int i; /* brojac u petlji */ unsigned int a[MAX]; /* tzv. obican niz koji se ucitava */ /*provera koretnosti vrednosti ucitane dimenzije niza*/ do {printf("\nUcitajte 0MAX); /* ucitavanje clanova niza - uociti opis formata */ for(i=0;ikond[j] vrednost clana a[i-1]->kond[j+1] */ return (j+2); /* duzina kondenzovanog sa slucajem poslednjeg clana ili sekvence poslednjih clanova obicnog niza */ } /*ulaz: kondenzovan niz k sa m izlaz: stampanje obicnog niza u bin/oct/hex osnovi */ void u_obican(unsigned int k[],int m) { int i,j; /* brojaci */ unsigned int pom; /* clan obicnog niza generisan iz kondenzovanog */ /* stampanje clanova obicnog niza */ for(i=0;i #define MAX 81 int getline(char s[],int lim); void copy(char to[],char from[]); void sifriraj(char s[],int pomeraj); int wordcount(char s[]); void sortiraj(int a[],int n,int cifre[]); void zameni(int *a,int *b); void broj_cifre(int b[],char line[]); main() { char line[MAX]; /* linija sa ulaza */ char longest[MAX]; /* najduza linija sa ulaza */ int len; /* duzina ucitane linije */ int max=0; /* duzina najduze linije sa ulaza */ int ndigit[10]; /* niz koji za cifre 0..9 cuva broj njihovih pojava u najduzoj liniji */ int cifre[10]; /* cuva vrednost j, tako da za i-tu cifru (cifre[i]) je broj pojava sacuvan u elementu ndigit[j] */ int ima_cifra; /* indikator postojanja bar 1 cifre u najduzoj liniji */ int i,j; /* brojaci u petlji */ /* ucitavanje ulaza do markera kraja (EOF) uz pronalazenje sadrzaja najduze linije */ while((len=getline(line,MAX))>0) if(len>max) /* ako je duzine tekuce linije sa ulaza veca od do tada maksimalne, onda je nova linija zasluzila da postane novi maksimum */ {max=len; copy(longest,line); } /* samo ako postoji najduza linija, izvrsi sifriranje Cezarovom sifrom */ if(max>0) { sifriraj(longest,1); printf("%s",longest); } /* ispis broja reci u najduzoj liniji */ printf("\nBroj reci u najduzoj liniji je %d",wordcount(longest)); /* inicijalizacija: za sada broj pojava cifri u najduzoj liniji je 0 za svaku od cifara*/ for(i=0;i<10;i++) {ndigit[i]=0; cifre[i]=i;} /* odredjivanje broja pojave svake cifre dekadnog sistema u stringu longest i smestanje u niz ndigit */ broj_cifre(ndigit,longest); /* sortiranje niza ndigit prema broju pojava cifri */ sortiraj(ndigit,10,cifre); ima_cifra=(ndigit[0] >0); /*jer ndigit[0] je posle sortiranja najveci, pa je i najpouzdaniji indikator da postoje cifre u najduzoj liniji */ if(ima_cifra) for(i=0;i<10;i++) printf("\nBroj pojave cifre %c u najduzoj liniji je %d",cifre[i]+'0',ndigit[i]); else printf("\nNajduza linija ima 0 cifara\n"); return 0; } int getline(char s[],int lim) {int c,i; for(i=0;i='A' && s[i] <='Z') /* videti i kompaktniji zapis sa vezbi */ { s[i]=s[i]+pomeraj+'a'-'A'; if(s[i]>'z') s[i]=s[i]-26; } else if (s[i]>='a' && s[i] <='z') { s[i]=s[i]+pomeraj+2-('a'-'A'); if(s[i] >'Z') s[i]=s[i]-26; } } } int wordcount(char s[]) {int broj=0,i,state=0; for(i=0;s[i]!='\0';i++) if (s[i]==' ' || s[i]=='\n' || s[i]=='\t' || s[i]=='\"' ) state=0; else if (!state) {state=1; broj++; } return broj; } void sortiraj(int a[],int n,int cifre[]) {int i,j; for(i=0;icifre[j]){ zameni(&a[i],&a[j]); zameni(&cifre[i],&cifre[j]); } } void zameni(int *a,int *b) { int pom; pom=*a; *a=*b; *b=pom; } void broj_cifre(int b[],char s[]) {int i; for(i=0;s[i] != '\0';i++) if(s[i] >='0' && s[i] <='9') b[s[i]-'0']++ ; } 10. /*Napisati C program koji: ucitava niz linija ulaznog teksta do markera EOF sa ne vise od 80 karaktera po liniji, pronalazi najduzu liniju i: a) smatrajuci da svakal linija sadrzi bar jednu cifru, pronalazi u najduzoj liniji najduzu seriju cifara i smesta je u string s1 b) formira string s2 koji sadrzi broj za +1 veci od broja predstavljenog stringom s1 /*obratiti paznju da broj moze da prevazidje najveci long int broj */ c) proverava da li je string s2 palindrom i rezultat izdaje na ekran */ #include #define MAX 81 int getline(char s[],int lim); void copy(char to[],char from[]); int strlen(char s[]); void serija_cifara(char line[],int *pocetak,int *duzina); void reverse(char s[]); int palindrom(char s[]); main() { char line[MAX]; /* linija sa ulaza */ char longest[MAX]; /* najduza linija sa ulaza */ char s1[MAX]; /* string iza zaheva a) */ char s2[MAX+1]; /* string iz zahteva b) */ int len; /* duzina linije sa ulaza*/ int max=0; /* duzina najduze linije sa ulaza */ int poc; /* pozicija karaktera u najduzoj linji kojim pocinje najduza serija cifara*/ int duz; /* duzina najduze serije cifara u najduzoj linji */ int i,j; /* brojaci u petlji */ while((len=getline(line,MAX))>0) if(len>max) {max=len; copy(longest,line); } if(max>0) { //rade se delovi zadatka ako postoji najduza linija serija_cifara(longest,&poc,&duz); /*Kada je potrebno da funkcija menja vrednost svojih stvarnih parametara ili kao sto je ovde slucaj da vrati vise izlaznih vrednosti onda se koristi tehnika predaje parametara koja se zove prenos adrese stvarnih parametara. Inace, na kolkvijumu ako ne pisite f-je, onda necete ni morati koristiti pokazivace. Inace poziv serija_cifara(longest,poc,duz); nece da valja, tj.nece vratiti vrednosti p i d za poc i duz */ /* kopira najduzu seriju iz stringa longest u string s1 i to pocev od pozicije poc na duzini duz */ for(i=0; duz !=0 ;i++,duz--) s1[i]=longest[i+poc] ; s1[i]='\0'; copy(s2,s1); /* dodavanje +1 na vrednost broja predstavljenog stringom s1 i smestanje rezulatata sabiranja u string s2 */ i=strlen(s2); /* dodavanje 1-ce pocev od razreda jedinica (i=strlen(s2)-1) i ako pri tom nastaju prenosi, oni se dodaju na cifre sledeceg razreda (i-1). Dodavanje se mora nastaviti ako tekuci razred nakon dodavanja ima vrednost 0 (tj. ako je pre dodavanja cifra tekuceg razreda imala vrednost 9), a mora se prekinuti kada se stigne do cifre najvece tezine, tj. do pocetka stringa s1*/ do{ i--; s2[i]=s2[i]+1; if(s2[i]== ('9'+1) ) s2[i] ='0'; } while ((s2[i]=='0') && (i>0)); if ( (i==0) && (s2[0]=='0') ) /*mora se uvecati broj karaktera za cifru najvece tezine - konkretno 1-cu */ { reverse(s2); i=strlen(s2); s2[i]='1'; s2[i+1]='\0'; reverse(s2); } printf("\n%s + 1 = %s\n",s1,s2); printf("\ns2= %s ",s2); if (palindrom(s2)) printf("jeste "); else printf("nije "); printf("palindrom"); } return 0; } int getline(char s[],int lim) {int c,i; for(i=0;i= desno); } void serija_cifara(char s[],int *p,int *d) { int i,br=0,max=0,j; *p=-1;*d=0; /* krecemo se po svim karakterima stringa s ... */ for(i=0;s[i] != '\0';i++) /* i nailaskom na cifru */ if(s[i] >='0' && s[i] <= '9') { br++; /* uvecavamo brojac duzine tekuce serije */ if(br==1) j=i; /* pamtimo pocetak serije u promenljivoj j */ if(br>max) /* ako je tekuca serija duzine br duza od do tada najduze serije duzine max*/ {max=br; *p=j;} /*proglasimo tekucu seriju za najduzu i u promenbljivoj p sacuvamo pocetak trenutno najduze serije */ } else br=0; /* prekid serije cifara, te je duzina trenutne serije jednaka 0 */ *d=max; /* sacuvamo duzinu najduze serije */ } 11. Napisati program u C-u koji prikazuje sve proste brojeve u datom intervalu kojima je zbir cifara složen broj. Interval se zadaje ucitavanjem gornje i donje granice (dva prirodna broja). Brojeve prikazati u opadajucem poretku. #include #include int prost (int n); /*testira da li je broj n prost broj */ /*Prirodni brojevi (sem 1)imaju najmanje dva delioca:jedinicu i samog sebe. Brojevi koji nemaju drugih delioca,sem ova dva, nazivaju se prostim */ int zbirCifara (int n); /*vraca zbir cifara broja n */ main() { int donja,gornja; /*granice intervala */ int i; /*brojac u petlji */ int pom; /*posrednik u eventualnoj zameni */ /*ucitavanja granice intervala */ scanf("%d%d", &donja, &gornja); if (donja > gornja) /*obezbedjivanje relacije: donja <=gornja */ { pom=donja; donja=gornja; gornja=pom; } for(i=gornja;i>=donja; i--) if (prost (i) && !prost(zbirCifara(i) ) ) printf("%d\n",i); } int prost(int n) /*Ispituje se da li je broj n prost tako to se proverava da li ima delioce medju brojevima od 2 do n/2. Pri implementaciji se koristi tvrdjenje da je broj prost ako je jednak 2, ili ako je neparan i ako nema delitelja medju neparnim brojevima od 3 do n/2 */ { int prost; /*indikator slozenosti broja n */ int i; /*potencijalni delitelj broja n */ if (n==1) return 0; prost= (n%2!=0) || (n==2); /*parni brojevi razliciti od od dva nisu prosti brojevi */ i=3; /*najmanji potencijalni kandidat za delitelje medju neparnim brojevima razlicitim od jedan */ while ( (prost) && (i<=n/2) ) { prost=n%i != 0; i=i+2; /*proveravamo kandidate za delitelje samo medju neparnim brojevma */ } return prost; } int zbirCifara (int n) { int Suma=0; while (n>0) { Suma+= n%10; /*dodavanje cifre tekuceg razreda,pocev od razreda jedinica , a iduci ka visim razredima cifara */ n=n/10; /*prelaz ka visem razredu */ } return Suma; } /* * Vezba 2-4 str. 48 * * */ /* squeeze2: uklanja sve karaktere iz s1 koji se pojavljuju u s2. */ void squeeze2(char s1[], char s2[]) { int i, j, k; /* brojacke promenljive */ int instr2 = 0; /* indikator jednakosti dva karaktera iz s1, s2 */ /* svaki znak iz s1 ...*/ for(i = j = 0; s1[i] != '\0'; i++) { instr2 = 0; /* ... bice testiran redom sa znacima iz s2 */ for(k = 0; s2[k] != '\0' && !instr2; k++) if(s2[k] == s1[i]) instr2 = 1; /* pronadjen je karakter iz s2 u s1 */ if(!instr2) /* ako je instr2==0 i nakon predjenih karaktera iz s2, onda je s1[i] "zasluzio" da ostane u nisci s1 na poziciji j */ { s1[j++] = s1[i]; } } s1[j] = '\0'; /* okoncanje niske s1*/ } /* TEST PROGRAM */ #include /* squeeze2: uklanja sve karaktere iz s1 koji se pojavljuju u s2. */ void squeeze2(char s1[], char s2[]); main() { char s1[]="abcd\t1234efgHBBA"; char s2[]="visibaba" squeeze2(s1,s2); printf("\nNakon poziva f-je squeeze s1=%s\n", s1); return 0; } /* varijanata squeeze2 sa formiranjem trece niske u kojoj se cuva rezultat */ void squeeze2(char s1[], char s2[], char s3[]) { int i, j, k; /* brojacke promenljive */ int instr2 = 0; /* indikator jednakosti dva karaktera iz s1, s2 */ /* svaki znak iz s1 ...*/ for(i = j = 0; s1[i] != '\0'; i++) { instr2 = 0; /* ... bice testiran redom sa znacima iz s2 */ for(k = 0; s2[k] != '\0' && !instr2; k++) if(s2[k] == s1[i]) instr2 = 1; /* pronadjen je karakter iz s2 u s1 */ if(!instr2) /* ako je instr2==0 i nakon predjenih karaktera iz s2, onda je s1[i] "zasluzio" da ostane u nisci s1 na poziciji j */ { s3[j++] = s1[i]; } } s3[j] = '\0'; /* okoncanje niske s3*/ } /* * 2-5 str. 46 * * * strpbrk */ /* vraca prvu poziciju u niski s1 gde se pojavljuje bilo koji znak iz s2 ili -1 ako s1 ne sadrzi nijedan znak iz s2 */ int any(char s1[], char s2[]) { int i, j; /* brojacke promenljive - indeksi redom niski s1, s2 */ int pos; /* pozicija u s1 na kojoj se pojavljuje neki znak iz s2 ili -1, inace */ /*inicijalizacija */ pos = -1; /* svaki znak iz s1 ...*/ for(i = 0; pos == -1 && s1[i] != '\0'; i++) { /* ... bice testiran redom sa znacima iz s2 */ for(j = 0; pos == -1 && s2[j] != '\0'; j++) { if(s2[j] == s1[i]) /* ako se neki znak iz s2 pojavljuje u s1 */ { pos = i; /* sacuvati poziciju njegove pojave u nisci s1 */ } } } return pos; } / * 3-2 */ #include void escape(char * s, char * t); void unescape(char * s, char * t); int main(void) { char text1[50] = "\aZdravo,\n\tsvete! greskaa\b je \"dadat 'a'\"!\n"; char text2[51]; printf("Originalna niska:\n%s\n", text1); escape(text2, text1); printf("Escape niska:\n%s\n", text2); unescape(text1, text2); printf("Unescape niska:\n%s\n", text1); return 0; } void escape(char * s, char * t) { int i, j; i = j = 0; while ( t[i] ) { /* transformacija specijalnih karaktera, ako postoje */ switch( t[i] ) { case '\n': s[j++] = '\\'; s[j] = 'n'; break; case '\t': s[j++] = '\\'; s[j] = 't'; break; case '\a': s[j++] = '\\'; s[j] = 'a'; break; case '\b': s[j++] = '\\'; s[j] = 'b'; break; case '\f': s[j++] = '\\'; s[j] = 'f'; break; case '\r': s[j++] = '\\'; s[j] = 'r'; break; case '\v': s[j++] = '\\'; s[j] = 'v'; break; case '\\': s[j++] = '\\'; s[j] = '\\'; break; case '\"': s[j++] = '\\'; s[j] = '\"'; break; default: /* tekuci karakter nije specijalan, pa ga samo kopiramo */ s[j] = t[i]; break; } ++i; ++j; } s[j] = t[i]; /* okoncati nisku - null karakter */ } void unescape(char * s, char * t) { int i, j; i = j = 0; while ( t[i] ) { switch ( t[i] ) { case '\\': /* nadjena je escape sekvenca, pa se transformise */ switch( t[++i] ) { case 'n': s[j] = '\n'; break; case 't': s[j] = '\t'; break; case 'a': s[j] = '\a'; break; case 'b': s[j] = '\b'; break; case 'f': s[j] = '\f'; break; case 'r': s[j] = '\r'; break; case 'v': s[j] = '\v'; break; case '\\': s[j] = '\\'; break; case '\"': s[j] = '\"'; break; default: /* inace, samo kopirati, bez transformacije */ s[j++] = '\\'; s[j] = t[i]; } break; default: /* ako nije escape sekvenca, kopirati karakter */ s[j] = t[i]; } ++i; ++j; } s[j] = t[i]; /* null karakter */ } /* 3-5 */ #include #include void itob(int n, char s[], int b); void reverse(char s[]); int main(void) { char buffer[10]; int i; for ( i = 2; i <= 20; ++i ) { itob(255, buffer, i); printf("Dekadni 255 predstavljen u osnovi %-2d : %s\n", i, buffer); } return 0; } /* */ void itob(int n, char s[], int b) { static char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i, sign; if ( b < 2 || b > 36 ) { fprintf(stderr, "3-5: Nekorektna osnova %d\n", b); exit(EXIT_FAILURE); } if ((sign = n) < 0) n = -n; i = 0; do { s[i++] = digits[n % b]; } while ((n /= b) > 0); if (sign < 0) s[i++] = '-'; s[i] = '\0'; reverse(s); } void reverse(char s[]) { int c, i, j; for ( i = 0, j = strlen(s)-1; i < j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } /*5-1000*/ #include #define MAX 100 main() { int i2,i3,i,n,x[100],ind; do { printf("\nUnesite n iz segmenta [1,%d]",MAX); scanf("%d",&n); } while (n<1 || n>MAX); i2=i3=0;x[0]=1; for (i=1;i0) { x[i]=3*x[i3]+1; i3++; } else { x[i]=2*x[i2]+1; i2++;i3++; } } //for printf("\nClanovi skupa M su:\n"); for (i=0;i #include int getch(void); void ungetch(int); /* getint: prihvata sledeci ceo broj sa ulaza u *pn */ int getint(int *pn) { int c, predznak; while (isspace(c = getch())) /* preskociti white space */ ; if (!isdigit(c) && c != EOF && c != '+' && c != '-') { ungetch(c); /* nije broj */ return 0; } predznak = (c == '-') ? -1 : 1; if (c == '+' || c == '-') c = getch(); for (*pn = 0; isdigit(c); c = getch()) *pn = 10 * *pn + (c - '0'); *pn *= predznak; if (c != EOF) ungetch(c); return c; } /* * getch , ungetch funkcije iz poglavlja 4.3. */ #include #define BUFSIZE 100 char buf[BUFSIZE]; /* buffer za ungetch */ int bufp = 0; /* sledeca slobodna pozicija u buf */ int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: previse karaktera\n"); else buf[bufp++] = c; } /* * getfloat * * Ocitava sledeci broj sa ulaza i smesta ga u *fp. Vraca: EOF za kraj ulaza nula ako sledeci element na ulazu nije broj i pozitivan broj ako je sa ulaza ucitan korektan broj */ #include #include int getfloat(float *fp) { int znak; int predznak; int razlom; int decim; while (isspace(znak = getch())) /* preskociti white space */ ; if (!isdigit(znak) && znak != EOF && znak != '+' && znak != '-' && znak != '.') { ungetch(znak); return 0; } predznak = (znak == '-') ? -1 : 1; if (znak == '+' || znak == '-') { znak = getch(); if (!isdigit(znak) && znak != '.') { if (znak == EOF) { return EOF; } else { ungetch(znak); return 0; } } } *fp = 0; razlom = 0; decim = 0; for ( ; isdigit(znak) || znak == '.' ; znak = getch()) { if (znak == '.') { razlom = 1; } else { if (!razlom) { *fp = 10 * *fp + (znak - '0'); } else { *fp = *fp + ((znak - '0') / pow(10, razlom)); razlom++; } decim++; } } *fp *= predznak; if (znak == EOF) { return EOF; } else { ungetch(znak); return (decim) ? znak : 0; } } /* * Test program */ #include int main(void) { int ret; do { float f; fputs("Unesite broj: ", stdout); fflush(stdout); ret = getfloat(&f); if (ret > 0) { printf("Uneli ste: %f\n", f); } } while (ret > 0); if (ret == EOF) { puts("Zaustavljeno markerom EOF!!!"); } else { puts("Nekorektan ulaz!!!"); } return 0; } 2. /* rad sa dinamickim strukturama podataka */ #include #include #define BFALSE 0 typedef struct { int dataitem; struct listelement *link; } listelement; void Izbori (int *izb); listelement * DodajClan (listelement * listpointer, int data); listelement * UkloniClan (listelement * listpointer); void PrintQ (listelement * listpointer); void ClearQ (listelement * listpointer); main () { listelement *listpointer; int data, izbor; listpointer = NULL; do { Izbori (&izbor); switch (izbor) { case 1: printf ("Unesite novi podatak "); scanf ("%d", &data); listpointer = DodajClan (listpointer, data); break; case 2: if (listpointer == NULL) printf ("Prazan red!\n"); else listpointer = UkloniClan (listpointer); break; case 3: PrintQ (listpointer); break; case 4: break; default: printf ("Pogresan izbor - pokusajte ponovo\n"); break; } } while (izbor != 4); ClearQ (listpointer); } /* main */ void Izbori (int *iz) { char local; printf ("\nUnesite\t1 ako dodajete clan,\n\t2 ako uklanjate clan\n\ \t3 ako stampate clanove \n\t4 ako izlazite\n"); do { local = getchar (); if ((isdigit (local) == BFALSE) && (local != '\n')) { printf ("\nmorate uneti broj.\n"); printf ("Unesite 1 za dodavanje, 2 za uklanjanje, 3 za stampanje, 4 za izlazak\n"); } } while (isdigit ((unsigned char) local) == BFALSE); *iz = (int) local - '0'; } listelement * DodajClan (listelement * listpointer, int data) { listelement * lp = listpointer; if (listpointer != NULL) { while (listpointer -> link != NULL) listpointer = listpointer -> link; listpointer -> link = (struct listelement *) malloc (sizeof (listelement)); listpointer = listpointer -> link; listpointer -> link = NULL; listpointer -> dataitem = data; return lp; } else { listpointer = (struct listelement *) malloc (sizeof (listelement)); listpointer -> link = NULL; listpointer -> dataitem = data; return listpointer; } } listelement * UkloniClan (listelement * listpointer) { listelement * tempp; printf ("Uklanaj se clan %d\n", listpointer -> dataitem); tempp = listpointer -> link; free (listpointer); return tempp; } void PrintQ (listelement * listpointer) { if (listpointer == NULL) printf ("prazan red!\n"); else while (listpointer != NULL) { printf ("%d\t", listpointer -> dataitem); listpointer = listpointer -> link; } printf ("\n"); } void ClearQ (listelement * listpointer) { while (listpointer != NULL) { listpointer = UkloniClan (listpointer); } }