Rešenja zadataka sa pismenog dela ispita u oktobarskom ispitnom roku iz Osnova programiranja ( po tokovima )

 


 

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

e-mail: Jelena Grmuša


Poslednja izmena: 22. septembar 2004. 08 h
URL: http://www.matf.bg.ac.yu/~jelenagr/op/