III1
Na primer ULAZ:
Osnovi programiranja su moj najdrazi predmet na prvoj godini studija.
Vredno sam ucila,odnosno ucio, tokom leta i zato ocekujem da cu
poloziti ispit iz ovog interesantnog predmeta
bez potrebe da se oslonim na nepostene radnje kao sto su
prepisivanje iz ranije
pripremljenih puskica ili uznemiravanje kolege
da mi dozvoli da prepisem njegova resenja.
n=15 IZLAZ
13 | *
12 | *
11 | *
10 | *
9 | *
8 | *
7 | * * * *
6 | * * * * *
5 | * * * * * *
4 | * * * * * * *
3 | * * * * * * * *
2 | * * * * * * * *
1 | * * * * * * * * * *
+---------------------------------
1 2 3 4 5 6 7 8 9 10 >10
n=9 IZLAZ
9 | *
8 | *
7 | *
6 | *
5 | *
4 | * * * * *
3 | * * * * * *
2 | * * * * * * * *
1 | * * * * * * * *
+---------------------------------
1 2 3 4 5 6 7 8 9 10 >10
#include <stdio.h>
#include <stdlib.h>
#define MAXDUZRECI 10
int main(int argc, char *argv[])
{
int c; /* tekuci karakter sa ulaza */
int ureci = 0; /* indikator boravka tekuceg karakera ulaza
u reci ili van reci */
long zvezda[MAXDUZRECI + 1];
/* zvezda[i] sadrzi broj reci duzine i=1..10,
zvezda[10] sadrzi broj reci cija duzina >10 */
int duzina = 0; /* duzina tekuce reci sa ulaza*/
int n; /* limit visine histograma */
long max=0; /* max niza zvezda */
int pocetak = 1;
int i = 0, broj; /* brojacke promenljive */
FILE * ul;
/* inicijalizacije */
for(i = 0; i <= MAXDUZRECI; i++)
zvezda[i] = 0;
n=atoi(argv[1]) ;
ul=fopen("ulaz.txt", "rt");
/* citanje ulaza i formiranju vrednosti niza zvezda */
while(1)
{
c = fgetc(ul);
if(c == ' ' || c == '\t' || c == '\n' || c == EOF)
{if(ureci == 0)
{
pocetak = 0; ureci = 1;
if(duzina <= MAXDUZRECI)
{
if(duzina> 0)
{
++zvezda[duzina - 1];
if(zvezda[duzina - 1] > max)
max = zvezda[duzina - 1];
}
}
else
{
++zvezda[MAXDUZRECI];
if(zvezda[MAXDUZRECI] > max) max = zvezda[MAXDUZRECI];
}
}
if(c == EOF) break;
}
else
{
if(ureci == 1 || pocetak == 1)
{
duzina = 0;
pocetak = 0;
ureci = 0;
}
++duzina;
}
}
if (max < n) n=max;
/* vertikalno stampa odozgo nadole linije
vertikalnog histograma sve do apcise,
vodeci racuna o razmeri */
for(broj = n; broj > 0; broj--)
{
printf("%4d | ", broj);
for(i = 0; i <= MAXDUZRECI; i++)
if(zvezda[i] * n / max >= broj) printf("* ");
else printf(" ");
printf("\n");
}
/* apcisa */
printf(" +");
for(i = 0; i <= MAXDUZRECI; i++)
{
printf("---");
}
printf("\n ");
for(i = 0; i < MAXDUZRECI; i++)
{
printf("%2d ", i + 1);
}
printf(">%d\n", MAXDUZRECI);
fclose(ul);
return 0;
}
|
IV 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct drvo drvo; /* z-a drvo */
struct drvo {
char c;
drvo *l,*d;
};
void ubaci(drvo *, char c, int i);
/*smesta karakter c u drvo na nivo i */
void infiks(drvo *);
/* stampa drvo */
void oslobodi(drvo *);
/* oslobadja prostor */
void main(int argc, char **argv)
{ drvo *koren;
int i; /* brojacka promenljiva*/
koren = NULL;
/* unos znakova komandne linije u z-a drvo */
for(i=0;i< strlen(argv[1]);i++)
if(koren==NULL)
{
koren = malloc(sizeof(drvo));
koren->c = argv[1][i];
koren->l = NULL;
koren->d = NULL;
}
else ubaci(koren, argv[1][i], 0);
infiks(koren);
oslobodi(koren);
} /* main */
void ubaci(drvo *cv, char c, int nivo)
{
/* konstrukcija levog poddrveta */
if( (nivo % 2 == 1 && c > cv->c) ||
(nivo % 2 == 0 && c <= cv->c) )
if(cv->l == NULL)
{
cv->l = malloc(sizeof(drvo));
cv->l->c = c;
cv->l->l = NULL;
cv->l->d = NULL;
}
else ubaci(cv->l, c, nivo+1);
else
/* konstrukcija levog poddrveta */
if(cv->d == NULL)
{
cv->d = malloc(sizeof(drvo));
cv->d->c = c;
cv->d->l = NULL;
cv->d->d = NULL;
}
else ubaci(cv->d, c, nivo+1);
}
void infiks(drvo *cv)
{
if(cv!=NULL)
{
infiks(cv->l);
printf("%c",cv->c);
infiks(cv->d);
}
}
void oslobodi(drvo *cv)
{
if(cv != NULL)
{
oslobodi(cv->l);
oslobodi(cv->d);
free(cv);
}
}
|
III2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 21
typedef struct drvo_CV drvo;
/* BSP uredjeno leksikografski po etiketama */
struct drvo_CV
{ /* za svaku etiketu cuvaju se redni brojevi pojavnih redova r */
char rec[MAX];
int prvi, poslednji;
drvo *levo,*desno;
};
void getEtiketa(FILE *f, char *s, int *br);
/* izdvaja etiketu s iz ulazne datoteke
i postavlja vrednosr rednog broja linije br*/
drvo * addTree(drvo*d, char *s, int br);
/* unosi etiketu s koja se pojavila u redu br u BSP d*/
void printTree(drvo *, FILE *);
/* stampa etikete (inorder) i redne brojeve linija
prve i poslednje pojave etiketa*/
void freeTree(drvo *);/* oslobadja prostor */
main(int argc, char *argv[])
{
drvo *koren;
char rec[MAX]; /* tekuca etiketa sa ulaza */
int brlinije; /* redni broj tekuce linije */
//char c; /* tekuci karakter sa ulaza */
FILE *ul, *izl;
/* inicijalizacije */
koren = NULL;
brlinije = 1;
ul = fopen("sem.htm","rt");
izl = fopen(argv[1],"wt");
/* citanje sadrzaja datoteke i formiranje BSP-a*/
while(!feof(ul))
{
getEtiketa(ul, rec, &brlinije);
if(strlen(rec) > 0) koren=addTree(koren, rec, brlinije);
}
fclose(ul);
printTree(koren, izl);
freeTree(koren);
return 0;
}
void getEtiketa(FILE *fin, char *word, int *br)
{ char c; /* tekuci karakter ulazne datotke */
int k; /* tekuca pozicija niske word koja se formira */
/*ignorisati karaktere kojima ne pocinje etikete */
while( ((c = fgetc(fin))!='<') && c!=EOF)
if(c=='\n') *br=*br+1;
/* postavlja redni broj tekuceg reda */;
/* prazna etiketa i vratiti se u pozivajucu jedinicu*/
if (c==EOF) {word[0]='\0'; return;}
/*ucitati ostatak otvorene etiketa bez atributa
i formirati nisku word */
k = 0;
while(isalnum (c = fgetc(fin)) && c!=EOF)
{
word[k++] = tolower(c);
/* zbog potrebe za case insensitive poredjenjem
pri umetanju niske u drvo */
}
word[k] = '\0';
if(c=='\n') *br=*br+1;
/* postavlja redni broj tekuceg reda */;
} /* izdvojrec */
drvo * addTree(drvo *d, char *w, int br)
{
if(d == NULL) /* rec se prvi put pojavila */
{ d = (drvo *)malloc(sizeof(drvo));
strcpy(d->rec, w);
d->prvi=br; d->poslednji=br;
d->levo = NULL;
d->desno = NULL;
}
else /*rec se opet pojavila*/
if( (strcmp(w, d->rec) == 0) ) d->poslednji=br;
else
if(strcmp(w, d->rec) < 0)
d->levo=addTree( d->levo, w, br);
else d->desno=addTree(d->desno, w, br);
return d;
}
void freeTree(drvo *d)
{ if(d != NULL)
{ freeTree(d->levo);
freeTree(d->desno);
free(d);
}
}
void printTree(drvo *d, FILE *f)
{ if(d != NULL)
{ printTree(d->levo, f);
fprintf(f, "%s %d %d\n",d->rec, d->prvi, d->poslednji);
printTree(d->desno, f);
}
}
|
IV2
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 81
int strindex (char *s, char *obrazac);
/* vraca poziciju u nisci s iza one na kojoj se
zavrsava prva pojava niske obrazac
ili
-1 ako se obrazac ne pojavljuje u nisci s*/
main(int argc, char *argv[])
{
char linija[MAX]; /* tekuca linija ulazne datoteke*/
FILE* f;
f=fopen("ulaz.txt", "r");
if (f!=NULL)
{
while (fgets(linija, MAX, f))
if (strindex(linija, argv[1])!=-1) printf("%s", linija);
fclose(f);
}
return 0;
}
int strindex (char *s, char *obrazac)
{ /* Napomena: switch-case grananje u ovom resenju
je pravljeno s namerom da kod bude sto citljiviji,
cime je naruseno svojstvo kompaktnosti;
uociti da se mogla izbeci redudantnost
pojedinih fragmenata koda */
int i, j,k; /*brojacke promenljiva*/
int pojava; /* logicka promenljiva, koristi se pri testu
poredjenja karaktera obrasca sa karakterima niske s*/
for (i=0; s[i]!='\0';i++)
{
for (pojava=1,j=i,k=0; obrazac[k]!='\0' && pojava; j++,k++)
switch (obrazac[k])
{
/* testira (prisustvo sekvence \a u obrascu
i slova u nisci s) ili
(prisustvo sekvence \0 u obrascu
i dekadne cifre u nisci s) */
case '\\': if ( (obrazac[k+1]=='a') && isalpha(s[j]) )
{pojava=1; k++;}
else if ( (obrazac[k+1]=='0') && isdigit(s[j]) )
{pojava=1; k++;}
else pojava=0;
break;
/* testira prisustvo intervala u obrascu i
prisustva alfanumerickog karktera niske s unutar
granica tog intervala, ukljucujuci i same granice*/
case '[':
if ((s[j]>=obrazac[k+1]) && ((s[j]<=obrazac[k+3])))
{pojava=1; k=k+4;}
else pojava=0;
break;
/* preostao je jos treci slucaj,
a to je da je na poziciji k u obrascu
alfanumericki karakter doslovce, te se poredi sa
odgovarajucim karakterom niske s*/
default: pojava= (obrazac[k]==s[j]); break;
}
if (k>0 && (obrazac[k]=='\0')&& pojava ) return (i+k);
/* obrazac je prisutan unutar niske s ako se u unutrasnjem
for ciklusu stiglo do kraja niske obrazac, a indikator
pojava na izlasku iz unutrasnjeg for ciklusa ima istinutu
vrednost*/
}
return -1; /* inace, obrazac nije prisutan unutar niske s */
}
|
III3
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 81
void strOnce (char *s1, char *s2);
main(int argc, char *argv[])
{
char linija[MAX]; /* tekuca linija ulazne datoteke*/
scanf("%s", linija);
strOnce(linija, argv[1]);
printf("%s", linija);
return 0;
}
void strOnce (char *s1, char *s2)
{
int i, j,k, ind; /*brojacke promenljiva*/
for (i=0; s1[i]!='\0';)
{
for (j=i,k=0; (s2[k]!='\0') && (s1[j]==s2[k]); j++,k++) ;
if (k>0 && (s2[k]=='\0') )
{/*izbacen s2 iz s1 i pomicemo s1*/
for (ind=0; s1[j+ind]!='\0'; ind++)
s1[j-k+ind]=s1[j+ind];
i=j-k; s1[i+ind]='\0';
}
else i++;
}
}
|
IV3
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 81
void strrem (char *s1, char *s2);
main(int argc, char *argv[])
{
char linija[MAX]; /* tekuca linija ulazne datoteke*/
scanf("%s", linija);
strrem(linija, argv[1]);
printf("%s", linija);
return 0;
}
void strrem (char *s1, char *s2)
{
int i, j,k; /*brojacke promenljiva*/
int pojava; /* broj pojava karaktera u nisci s2*/
for (i=k=0; s1[i]!='\0';i++)
{
for (j=0, pojava=0; s2[j]!='\0'; j++)
pojava+= (s2[j]==s1[i]);
if (pojava !=1) s1[k++]=s1[i];
}
s1[k]='\0';
}
|