OSNOVI   PROGRAMIRANJA         II   kolokvijum, 2003.              III tok

 

1.   Napisati C program koji će iz datoteke ulaz.htm prepisati nazive međusobno različitih etiketa (bez atributa) u binarno stablo pretrage, a na standardni izlaz ispisati:

1) ukupan broj čvorova drveta, ako je kao parametar komandne linije zadata opcija -n

2)štampati sadržaj drveta u infiksnom poretku, ako je kao parametar komandne linije zadata opcija -p

Obezbediti da program radi i kada su prisutna oba opciona argumenta.

Pretpostaviti da naziv etikete nije duži od 30 karaktera.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

 

#define MAX 31

#define TRUE 1

#define FALSE 0

 

typedef struct BSP_cvor

{

char *etiketa;                     /*naziv etikete */

struct BSP_cvor *levi;            /* levi ogranak */

struct BSP_cvor *desni;           /* desni ogranak */

            } drvo;

 

 /*FUNKCIJE */

 /* ucitava etiketu (do max karaktera) iz datoteke u nisku s*/

int uzmi_etiketu(FILE * f, char * s, int max);

/* ubacuje rec u drvo */

drvo *ubaci(drvo *, char *);

/* alokacija  cvora BSP  */

drvo *alociraj( void );

/* kreira  kopiju niske s */

char *strdpl(char *);

/*poredjenje naziva dve etikete ignorisuci razliku malih, velikih slova*/

int uporedi(char *, char *);

/* stampa drvo - infiksni poredak za BSP*/

void infiks(drvo *);

/* vraca broj cvorova stabla */

int brcvor(drvo *);

/* oslobadja zauzeti prostor za drvo */

void osloboditi( drvo *);

 

 

main(int argc, char *argv[])

{

   drvo *koren;          /*koren stabla pretrazivanja */

   char etiketa[MAX];   /*naziv etikete sa ulaza */

   FILE *dat;

   int i,j;                /* brojacke promenljive */

   int infiksni=FALSE, prebroj=FALSE;  /*indikatori postojanja opcija u komandnoj liniji */

 

   dat=fopen("ulaz.htm","r");

    if (dat==NULL)  exit(1);

 

   /*prosledjivanje argumenata komandne linije */

  for (i = 1; i < argc && argv[i][0] == '-'; i++)

  /*prosledjivanje opcija

  ili niti jedne korektne opcije  ili od jedne do dve opcije*/

      for (j=1; argv[i][j] !='\0'; j++)

      {     /* proverava se  postojanje opcionih argumenata -n, -p  */

          switch (argv[i][j])

                { case 'n':  prebroj = TRUE; break;

                  case 'p':  infiksni=TRUE; break;

                  default:

       fprintf(stderr, "Nekorektna opcija %s u pozivu\n",argv[i]);

                                  return 1;

                 }

        

       }

   /*formiranje stabla od ucitanih razlicitih etiketa */

   koren = NULL;

   while( 1 )

   {        int kraj = uzmi_etiketu(dat,etiketa, MAX);

   /*dodavanje cvora u stablo  cvora, ako tag ne postoji u stablu */

            if  ( strlen(etiketa)) koren = ubaci( koren, etiketa);

            if(kraj == EOF) break;  

   }

    fclose(dat);

    if (infiksni)   infiks(koren);

    if (prebroj)  printf("\nBroj cvorova je: %d\n", brcvor(koren));

   osloboditi(koren);  

   return 0;

}

 

drvo *alociraj(void)

{ return (drvo *) malloc(sizeof(drvo)); }

 

drvo *ubaci( drvo *k, char *tag )

{ int test;

   if( k == NULL )

   {  /* naisao nov naziv */      k = alociraj();

                k->etiketa = strdpl(tag);

            k->levi = k->desni = NULL;

   }

   else if ((test = uporedi(tag,k->etiketa))< 0 ) /* idi levo */

            k->levi = ubaci(k->levi, tag);

   else  if (test >0)                            /* idi desno */

            k->desni = ubaci(k->desni, tag);

   return k;

}

 

void infiks(drvo  *k)

{

    if( k != NULL )

    {  infiks( k->levi );

        printf("%s\n", k->etiketa );

        infiks( k->desni );

    }

}

 

int uzmi_etiketu(FILE *f,char s[], int lim)

{  char c;

    int i = 0;

      if ( (c = fgetc(f)) == '<')

                 while (isalnum(c = fgetc(f)) && (i<lim)  )  s[i++] = c;

      s[i] = '\0';

      if( c==EOF ) return EOF;

      return i;

}

 

/*poredi etikete e1, e2 tako da poredjenje bude case insensitive*/

int uporedi(char *e1, char *e2)

{ char pom1[MAX], pom2[MAX];

   int i;

   for(i=0;i<strlen(e1);i++)  pom1[i]=tolower(e1[i]);

   pom1[i]='\0';

   for(i=0;i<strlen(e2);i++)  pom2[i]=tolower(e2[i]);

   pom2[i]='\0';

   return strcmp (pom1, pom2);

}

 

int brcvor(drvo *k)

{   if  (k == NULL)   return 0;

       else return 1+brcvor(k->levi)+brcvor(k->desni);

}

 

char *strdpl(char *s)  

{   char *pom;

        pom = (char *) malloc(strlen(s) + 1 );

        if( pom != NULL ) strcpy(pom,s);

        return pom;

 }

void osloboditi( drvo *k)

{   if (k->levi)  osloboditi (k->levi);

     if (k->desni)  osloboditi (k->desni);

    free (k);  

}

 

 

 

 

 

 

 

2.  Pod pretpostavkom da u datoteci ulaz.txt broj redova nije veći od 100 i da svaki red ima ne više od 80 karaktera, prepisati sadržaj datoteke ulaz.txt u datoteku izlaz.txt tako da bude sortiran  u neopadajućem poretku po prvim rečima iz svake linije. Sortiranje izvršiti korišćenjem funkcije qsort iz standardne biblioteke.

 

 

 

 

 

 

 

 

 

OSNOVI   PROGRAMIRANJA         II   kolokvijum, 2003.            IV tok

 

1. Napisati

a) funkciju koja kreira jednostruku povezanu listu od  karaktere niske koja se zadaje kao argument funkcije

b) funkciju koja kao argument prima početak jednostruke povezane liste i ispisuje sadržaj koji se dobija

obilaskom listom u smeru od kraja ka početku. U potprogramu proći najviše jednom kroz datu povezanu listu.

c) program koji testira rad funkcija pod a) b)  za nisku koja se zadaje iz komandne linije

 

2. Napisati C program koji od dve datoteke u kojima su linije sortirane prema rastućem poretku kolacione sekvencije formira treću koja sadrži linije koje postoje u tačno jednoj od dve ulazne datoteke, tako da ona bude takođe sortirana.

Imena sve tri datoteke sa zadaju kao argumenti komandne linije.