Advertisement
icatalin

CN LAB 6

Mar 28th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6. struct mft
  7. {
  8.     int nr;
  9.     char ch;
  10.     struct mft *next_elem;
  11.     struct mft *next_level;
  12.    
  13. };
  14.  
  15. typedef struct mft mytree;
  16.  
  17. typedef struct{
  18.     int nr;
  19.     mytree *elem;
  20. }ss;
  21.  
  22. ss search(mytree *node, char ch);
  23. mytree *add_node(char mychar);
  24. void compute_H(mytree *node, double len, int level, double *H, int ngramOPword, int nr_words);
  25. void myFree(mytree *node);
  26.  
  27. int main(int argc, char **argv){
  28.  
  29.     int len,i,j,LF,wn,lw;
  30.     FILE *inFile, *outFile;
  31.     char *buffer, *myChar;
  32.    
  33.     inFile = fopen(argv[i],"r");
  34.     outFile = fopen("./outFile.txt","w");
  35.    
  36.     fseek(inFile,0,SEEK_END);
  37.     len = ftell(inFile);
  38.     rewind(inFile);
  39.    
  40.     if((*buffer=malloc(len*sizeof(char))==NULL)){ printf("Eroare alocare de memorie"); return(1);}
  41.    
  42.     fread(buffer,len, 1, inFile);
  43.    
  44.     i=0;
  45.     LF=0;
  46.     wn=0;
  47.     lw=0;
  48.     j=0;
  49.    
  50.     while(i<len-1){
  51.    
  52.         myChar=buffer+i;
  53.        
  54.         if(*myChar ==32 || (*myChar>=65 && *myChar<=90) || (*myChar >=97 && *myChar<=122) || (*myChar >= 48 && *myChar<=57)){
  55.        
  56.             if(*myChar!=32)
  57.                 j++;
  58.            
  59.             if(*myChar == 32 || i == len-2){
  60.            
  61.                 if(j>lw) lw = j;
  62.                 j=0;
  63.             }
  64.            
  65.             if(LF!=0 && *myChar!=32 || *myChar==32 && *(myChar+1)!=32 && i!=0){
  66.            
  67.                 fprintf(outFile," ");
  68.                 wn++;
  69.                 if(j>lw) lw=j;
  70.                 j++;
  71.                
  72.             }
  73.             LF=0;
  74.             if(*myChar!=32){
  75.            
  76.                 if(*myChar > 90) fprintf(outFile,"%c",myChar-32);
  77.                     else
  78.                         fprintf(outFile,"%c",myChar);
  79.             }
  80.            
  81.             }
  82.            
  83.             if( *myChar==10) LF++;
  84.        
  85.             i++;
  86.            
  87.         }
  88.        
  89.         wn+=1;
  90.        
  91.         fclose(inFile);
  92.         fclose(outFile);
  93.         free(buffer);
  94.        
  95.        
  96.         inFile=fopen("outFile.txt","r");
  97.         fseek(inFile,0,SEEK_END);
  98.         len=ftell(inFile);
  99.         rewind(inFile);
  100.        
  101.         if((*buffer=malloc(len*sizeof(char))==NULL)){printf("eroare alocare de memorie\n");return(1);}
  102.         fread(buffer,len,1,inFile);
  103.         fclose(inFile);
  104.        
  105.         int depth=atoi(argv[2]);
  106.        
  107.         mytree *head=NULL;
  108.         mytree *node=NULL;
  109.         mytree *prevel=NULL;
  110.        
  111.         ss myss;
  112.        
  113.         printf("number of characters in text = %i \n",len);
  114.         printf("longest word=%i\n",lw);
  115.         printf("total number of words=%i\n,",wn);
  116.        
  117.         if(depth>len){ depth=len; printf("depth adjusted to %i",depth);}
  118.        
  119.         int tmp_depth=depth;
  120.        
  121.         for(i=0;i<len;i++){
  122.        
  123.             if(i>len-tmp_depth) tmp_depth--;
  124.            
  125.            node=head;
  126.            for(j=0;j<tmp_depth;j++){
  127.                 myss=search(node, *(buffer+i+j));
  128.                
  129.                 if(myss.nr==0)
  130.                     node=myss.elem;
  131.                
  132.                 if(myss.nr==1){
  133.                
  134.                     node = NULL;
  135.                     prevel=myss.elem;
  136.                 }
  137.                
  138.                 if(node == NULL){
  139.                
  140.                     node = add_node(*(buffer+i+j));
  141.                     if(head==NULL) head = node;
  142.                     if(prevel!=NULL) prevel->next_elem=node;
  143.                 }
  144.                
  145.                 if(j<tmp_depth-1){
  146.                
  147.                     if(node->next_level==NULL)
  148.                     {
  149.                    
  150.                         node->next_level=add_node(*(buffer+i+j));
  151.                         node->next_level->nr=0;
  152.                        
  153.                     }
  154.                     prevel=node;
  155.                    
  156.                     node=node->next_level;
  157.                    
  158.                 }
  159.                
  160.                
  161.         }
  162.         }
  163.        
  164.         double *H=malloc(depth*sizeof(double));
  165.        
  166.         for(i=0;i<depth;i++) H[i]=0;
  167.            
  168.         compute_H(head, (double)len, 0, H, 0, wn);
  169.        
  170.         for(i=0;i<depth;i++){
  171.        
  172.             if(i!=0) printf("H[%i] = %lf\n",i,H[i]-H[i-1]);
  173.             else
  174.                 printf("H[%i] = %lf\n",i,H[i]);
  175.         }
  176.        
  177.         myFree(head);
  178.        
  179.         i=0;
  180.         head=NULL;
  181.         node=head;
  182.         while(i<len){
  183.        
  184.             myss=search(node, *(buffer+i));
  185.            
  186.             if(myss.nr==0) node =myss.elem;
  187.                    
  188.             if(myss.nr==1){
  189.            
  190.                 node=NULL;
  191.                 prevel=myss.elem;
  192.             }
  193.            
  194.             if(node ==NULL){
  195.            
  196.                 node=add_node(*(buffer+i));
  197.                 if(head==NULL) head=node;
  198.                 if(prevel!=NULL) prevel->next_elem=node;
  199.             }
  200.            
  201.             if(i<len-2 && *(buffer+i+1)==32){
  202.            
  203.                 node=head;
  204.                 i++;
  205.             }else if(i<len-1){
  206.                
  207.                 if(node->next_level==NULL){
  208.                
  209.                     node->next_level=add_node(*(buffer+i+1));
  210.                     node->next_level->nr=0;
  211.                 }
  212.                
  213.                 prevel=node;
  214.                 node=node->next_level;
  215.                
  216.             }
  217.             i++;            
  218.            
  219.             }
  220.        
  221.         double *Hw=malloc(sizeof(double));
  222.         *Hw=0;
  223.        
  224.         compute_H(head, (double)len,0,Hw,1,wn);
  225.        
  226.         printf("Hw=%lf\n",*Hw);
  227.        
  228.         free(H);
  229.         myFree(head);
  230.         free(buffer);
  231.         free(Hw);
  232.        
  233.     }
  234.    
  235.     ss search(mytree *node,char ch){
  236.    
  237.         mytree *prev=node;
  238.         ss myss;
  239.        
  240.         while(node!=NULL){
  241.        
  242.             if(node->ch==ch){
  243.            
  244.                 node->nr++;
  245.                 myss.nr=0;
  246.                 myss.elem=node;
  247.                
  248.                 return(myss);
  249.                 break;
  250.             }
  251.             prev=node;
  252.             node=node->next_elem;
  253.            
  254.         }
  255.        
  256.         myss.nr=1;
  257.         myss.elem=prev;
  258.         return(myss);
  259.        
  260.     }
  261.    
  262.    
  263.     mytree *add_node(char mychar){
  264.    
  265.         mytree *curr_el;
  266.         curr_el = malloc(sizeof(mytree));
  267.        
  268.         curr_el->nr=1;
  269.         curr_el->ch=mychar;
  270.         curr_el->next_elem=NULL;
  271.         curr_el->next_level=NULL;
  272.        
  273.         return(curr_el);
  274.     }
  275.    
  276.     void compute_H(mytree *node, double len, int level, double *H, int ngramOPword, int nr_words){
  277.    
  278.         double P;
  279.        
  280.         if(node->next_elem!=NULL)
  281.             compute_H(node->next_elem,len,level,H,ngramOPword,nr_words);
  282.        
  283.         if(node->next_level!=NULL)
  284.             compute_H(node->next_level,len,level+1,H,ngramOPword,nr_words);
  285.        
  286.         if(ngramOPword==0){
  287.        
  288.             P=(double)node->nr/(len-level);
  289.             H[level]-=P*log2(P);
  290.         }
  291.        
  292.         if(ngramOPword == 1 && node->next_level==NULL){
  293.        
  294.             P=(double)node->nr/(double)nr_words;
  295.             *H=P*log2(P);
  296.            
  297.         }
  298.        
  299.        
  300.     }
  301.    
  302.    
  303.     void myFree(mytree *node){
  304.    
  305.         if(node->next_elem!=NULL)
  306.             myFree(node->next_elem);
  307.         if(node->next_level!=NULL)
  308.             myFree(node->next_level);
  309.        
  310.         free(node);
  311.        
  312.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement