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'; } |
Jelena Grmusa | Osnovi programiranja |