1) Formalna gramatika zapisa vremena (u obliku sati : minute).

T ::= <S>:<M>
<M> ::=<d><j>
<j> ::=0|1|2|3|4|5|6|7|8|9
<d> ::=0|1|2|3|4|5
<S> ::=0<j>|1<j>|2<k>
<k> ::=0|1|2|3|4





2) Napisati po ugledu za binarno pretraživanje funkciju koja konvertuje ASCII kod velikog slova u malo slovo, a ako je unet neki drugi znak sve ostaje isto.
  char charLower(char c)

{
if (c >= 'A' && c <= 'Z') return c - 'A' + 'a';
return c;
}




3) Na ovim adresama možete pročitati nešto o:

EDVAC-u : http://ftp.arl.mil/~mike/comphist/61ordnance/chap3.html    http://lecture.eingang.org/edvac.html
EDVAC-u : http://www.seas.upenn.edu/~museum/overview.html    http://www.pbs.org/wgbh/aso/databank/entries/dt45en.html   



4) Proširiti funkciju atof tako da prepoznaje realnu konstantu u eksponencijalnom obliku. Funkcija atof :

  double atof (char s[]) 
     { 
     double val, power; 
      int i, sign; 
      for (i=0; isdigit(s[i]); i++);  /* preskociti escape - znake */ 
      sign = (s[i] == '-') ? -1 : 1;  /* odrediti predznak */ 
      if (s[i] == '+' || s[i] == '-') 
      i++;        		       /* preskociti predznak */ 
    /* racunati celobrojni deo */ 
      for (val = 0.0; isdigit(s[i]); i++) 
      val = 10.0 * val + (s[i] - '0'); 
    /* ukoliko postoji tacka u zapisu */ 
      if (s[i] == '.') 
      i++; 
    /* racunati razlomljeni deo */ 
      for (power = 1.0; isdigit(s[i]); i++) { 
      val = 10.0 * val + (s[i] - '0'); 
      power *= 10; 
     } 
     return sign * val / power; /* vratiti izracunati broj */ 
    } 
    
 Tražena funkcija - atofd : 
    

    double atofd (char s[]) 
     { 
      double val, power;	/* celobrojni deo, razlomljeni deo */ 
      int i, sign;	/* brojac, predznak */ 
      for (i=0; isdigit(s[i]); i++);  /* preskociti escape - znake */ 
      sign = (s[i] == '-') ? -1 : 1;  /* odrediti predznak */ 
      if (s[i] == '+' || s[i] == '-') 
        i++;        		       /* preskociti predznak */ 
    /* racunati celobrojni deo */ 
      for (val = 0.0; isdigit(s[i]); i++) 
      val = 10.0 * val + (s[i] - '0'); 
    /* ukoliko postoji tacka u zapisu */ 
      if (s[i] == '.') 
      { 
       i++; 
    /* racunati razlomljeni deo */ 
      for (power = 1.0; isdigit(s[i]); i++) 
       { 
      val = 10.0 * val + (s[i] - '0'); 
      power *= 10; 
       } 	/* kraj bloka vezanog za for */
      val=sign * val / power; /* vrednost izracunatog broja */ 
      }	/* kraj bloka vezanog za if*/ 
      else		/* ukoliko ne postoji tačka */ 
      val=sign * val;	/* vrednost broja */ 
      if (s[i] == 'e' || s[i] == 'E') 
       {	/* ukoliko postoji oznaka eksponenta */ 
      int exp;	/* vrednost eksponenta */ 
      i++; 
      sign=(s[i] == '-') ? -1 : 1; 
      if (s[i] == '+' || s[i] == '=') 
      i++;	/* preskakanje predznaka */ 
      for (exp=0.0; isdigit(s[i]); i++) 
      exp = 10.0 * exp + (s[i] - '0'); 
      if (sign == -1)	/* u zavisnosti od toga da li je predznak posle slova e(E) - ili + deli se ili mnozi sa 10 */ 
      for (i=1; i<=exp; i++) 
      val /= 10.0; 
      else 
      for (i=1; i<=exp; i++) 
      val *= 10.0; 
        }      /* kraj bloka vezanog za if */ 
    return val;	/* izracunat broj */ 
    } 
 



5) Funkcija koja učitava realan broj bez eksponenta ( koristeći funkciju getchar ) i vraća sledeće rezultate: -1 ukoliko je uspešno unet broj, 0 ukoliko nije prepoznat broj a ako je prepoznat broj iza koga se nalaze neki znakovi koji nisu cifre onda vraća vrednost 1 .
int getfloat(float *pn);
{
 int i,sign=1;
float b=o;
 char c;
 if((c=getchar())=='-')
    sign=-1;
 else if(c>='0'&& c<='9') b=c;
 while((c=getchar())!=EOF && c>='0' && c<='9')
                         b=10*b+c-'0';
 if(c=='.')
  for(i=1;(c=getchar())!=EOF && c>='0' && c<='9';i++)
                         b=10*b+c-'0';
 else if(b==0) return 0;
 else if(b=='\0')
 {
  *pn=b;
  return -1;
 }
 else 
 {
  *pn=b;
  return 1;
 }
 if(c=='\0')
 {
  *pn=sign*b/pow(10,i);
  return -1; 
 }
 else return 1;
}






6) Program koji učitava tekst a zatim ga uređuje na sledeći način : između dve reči ostavlja samo jednu belinu a tekst slaže u linije od po najviše 80 karaktera pritom vodeći računa o tome da reči ostanu cele (neprelomljene).
#include<stdio.h>
#include<string.h>
#define MAXLINE 80
main()
{
int i,j,bel,lim;
char c,s[90];
i=0;
bel=1;
while((c=getchar())!=EOF)
 {
 lim=MAXLINE;
 while(i<MAXLINE && c!=EOF)
   {
   if(c!='\t' && c!='\n' && c!=' ')
                           {
                           s[i++]=c;
                           bel=0;
                           }  
   else if(c==' ' && bel==0)
                           {
                           s[i++]=c;
                           bel=1;
                           lim=i-1;
                           }
   if(c=='\n' && bel==0) s[i++]=' ';
   if(i<MAXLINE) c=getchar();
   }
 if(c==EOF) lim=i;
 for(j=0;j<lim;j++)
         putchar(s[j]);
 if(c==EOF) return 0;
 putchar('\n');
 i=0;
 lim++;
 while(lim<MAXLINE)
             s[i++]=s[lim++];
 }
}






8) Napisati program koji prebrojava karaktere, reci, recenice, paragrafe i naslove u tekstu obeleženom prema uputstvu za seminarski rad (.txt), i izdaje broj pojavljivanja svakog karaktera (sekvencije za YU-znake brojati kao jedinstvene karaktere), reci (ukupno), recenica, paragrafa i naslova.

#include <stdio.h>
#include <string.h>
main()
{
int i,k,j=0;
int brk;
int x=0,reci=0,recenice=0,y=0,paragrafi=0,pr=0;
int b[200],c2[20];
char c;
char a[200],p[5];
char c1[20][5];
while((c=getchar())!=EOF)
{
if(c=='&')
{
ovde:
p[0]='&';
for(i=1;(c=getchar())!=';';i++) p[i]=c;
p[i++]=';';
p[i]='\0';
for(i=0;strcmp(p,c1[i]) && i<x;i++);
if(i==x)
{
x++;
for(k=0;k<5;k++) c1[x][k]=p[k];
c2[x]=1;
}
else c2[i]++;
if((c=getchar())=='&') goto ovde;
}
for(i=0;a[i]!=c && i<brk;i++);
if(i==brk)
{
brk++;
a[brk]=c;
b[brk]=1;
}
else b[i]++;
if(c==' ' && j==1)
{
reci++;
j=0;
}
else if(c!=' ') 
j=1;
if((y==0 && c=='<')||(y==1 && c=='s')||(y==2 && c=='e')||(y==3 && c=='g')||(y==4 && c=='<')) y++;
else y=0;
if(y==5)
{
y=0;
recenice++;
}
if((pr==0 && c=='<')||(pr==1 && c=='p')||(pr==2 && c=='<')) pr++;
else pr=0;
if(pr==3)
{
pr=0;
paragrafi++;
}
}
a[brk+1]='\0';
b[brk+1]=0;
for(i=1;i<brk;i++) printf("karakter %c se pojavljuje %d puta\n",a[i],b[i]);
for(k=1;k<=x;k++) printf("karakter %s se pojavljuje %d puta\n",c1[k],c2[k]);
printf("\nu datoteci ima %d reci",reci+1);
printf("\nu datoteci ima %d recenica",recenice);
printf("\nu datoteci ima %d paragrafa\n",paragrafi);
putchar('\n');
}






9) Napisati program koji proverava ugnjezdenost i nepresecanje etiketa u tekstu obelezenom prema uputstvu za seminarski rad.

#include <stdio.h>
#include <string.h>
struct stek
{
char tag[40];
struct stek *veza;
}*vrh;
int gettag(char*);
void push(char*);
void pop(char*);
void copy(char*,char*);
main()
{
char rec[40];
char pom[40];
char prev[40]="a";
vrh=NULL;
while(gettag(rec))
{
if(strcmp(rec,prev)==0) pop(pom);
else
{
push(rec);
copy(prev,rec);
}
}
if(vrh!=NULL)printf("postoji greska u datoteci\n");
else printf("svi tagovi su pravilno postavljeni\n");
}
void push(char a[])
{
struct stek *p;
p=(struct stek*)malloc(sizeof(*p));
copy(p->tag,a);
p->veza=vrh;
vrh=p;
}
void pop(char b[])
{
struct stek *g;
copy(b,vrh->tag);
g=vrh;
vrh=vrh->veza;
free(g);
}
int gettag(char c[])
{
int i;
char d;
while((d=getchar())!='<' && d!=EOF);
if(d==EOF)return 0;
c[0]='<';
for (i=1;(d=getchar())!='>';i++)
{
if(d!='/')c[i]=d;
else i--;
}
c[i++]='>';
c[i]='\0';
return 1;
}
void copy(char d[],char e[])
{
int i;
for(i=0;i<strlen(e);i++) d[i]=e[i];
}