karlangadas

Auxiliar lab 5 LP1 2017-1

May 12th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.93 KB | None | 0 0
  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6. #include <iostream>
  7. #include <cstring>
  8. #include "auxiliar.h"
  9. #define INC 5
  10. #define INF 1000000
  11. using namespace std;
  12. /*void ordenar(char **datos,int izq,int der){
  13.     int limite;
  14.     if(izq>=der) return;
  15. }*/
  16. void agregarint(int *&lst,int elem){
  17.     if(lst==NULL){
  18.         incrementarint(lst,0);
  19.         lst[0]=elem;
  20.         for(int i=0;i<INC;i++) lst[i]=-1;
  21.     }
  22.     else{
  23.         int numElem=0;
  24.         for(int i=0;lst[numElem]!=-1;i++){
  25.             numElem++;
  26.         }
  27.         if(numElem%INC==0) {incrementarint(lst,numElem);}
  28.         lst[numElem]=elem;
  29.         //  cout<<"Elemento agregado "<<endl;
  30.     }  
  31. }
  32. void incrementarint(int *&lst,int numElem){
  33.     if(lst==NULL){
  34.         lst=new int[INC+1];
  35.         for(int i=0;i<INC;i++) lst[i]=-1;
  36.     }
  37.     else{
  38.         int *lstAux=new int[numElem+INC+1];
  39.         for(int i=0;i<numElem;i++) lstAux[i]=lst[i];
  40.         for(int i=numElem;i<=numElem+INC;i++) lstAux[i]=-1;
  41.         delete []lst;
  42.         lst=lstAux;
  43.     }
  44. }
  45. void generarIndices(char ***tweets,char **users,char **hashtags,int **&indexUsers,int **&indexHashtags){
  46.     int ntweets,nusers,nht;
  47.     for(ntweets=0;tweets[ntweets]!=NULL;ntweets++);
  48.     for(nusers=0;users[nusers]!=NULL;nusers++);
  49.     for(nht=0;hashtags[nht]!=NULL;nht++);
  50.     indexUsers=new int*[nusers+1];
  51.     indexHashtags=new int*[nht+1];
  52.     for(int i=0;i<nusers+1;i++) indexUsers[i]=NULL;
  53.     for(int i=0;i<nht+1;i++) indexHashtags[i]=NULL;
  54.     for(int i=0;i<nusers;i++){
  55.         for(int j=0;j<ntweets;j++){
  56.             char linea[200];
  57.             strcpy(linea,tweets[j][1]);
  58.             char **palabras;
  59.             split_Tokens(linea,palabras,INF);
  60.             for(int k=1;palabras[k]!=NULL;k++){
  61.                 if(strcmp(palabras[k],users[i])==0) {agregarint(indexUsers[i],j+1);}
  62.             }
  63.             delete [] palabras;
  64.         }  
  65.     }
  66.     for(int i=0;i<nht;i++){
  67.         for(int j=0;j<ntweets;j++){
  68.             char linea[200];
  69.             strcpy(linea,tweets[j][1]);
  70.             char **palabras;
  71.             split_Tokens(linea,palabras,INF);
  72.             for(int k=0;palabras[k]!=NULL;k++){
  73.                 if(strcmp(palabras[k],hashtags[i])==0) agregarint(indexHashtags[i],j+1);
  74.             }
  75.             delete [] palabras;
  76.         }  
  77.     }
  78. }
  79. void buscarIndices(char ***tweets,char **users,char **hashtags,int **indexUsers,int **indexHashtags){
  80.     int nbusq=0,idx,i;
  81.     char linea[100];
  82.     while(cin.getline(linea,98,'\n')){
  83.         nbusq++;
  84.         cout<<"Búsqueda "<<nbusq<<": "<<linea<<endl;
  85.         if(linea[0]=='#'){
  86.             for(idx=0;strcmp(hashtags[idx],linea)!=0;idx++);
  87.             for(i=0;indexHashtags[idx][i]!=-1;i++){
  88.                 cout<<tweets[indexHashtags[idx][i]-1][0]<<": "<<tweets[indexHashtags[idx][i]-1][1]<<endl;
  89.             }
  90.             cout<<"Total tweets: "<<i<<endl<<endl;
  91.         }
  92.         else{
  93.             for(idx=0;strcmp(users[idx],linea)!=0;idx++);
  94.             for(i=0;indexUsers[idx][i]!=-1;i++)
  95.                 cout<<tweets[indexUsers[idx][i]-1][0]<<": "<<tweets[indexUsers[idx][i]-1][1]<<endl;
  96.             cout<<"Total tweets: "<<i<<endl<<endl;
  97.        
  98.         }
  99.        
  100.     }
  101. }
  102. void memExacta_str(char**input,char**&output,int numElem){
  103.     output=new char*[numElem+1];
  104.     for(int i=0;i<numElem;i++){
  105.         int size=strlen(input[i])+1;
  106.         output[i]=new char[size];
  107.         strcpy(output[i],input[i]);
  108.     }
  109.     output[numElem]=NULL;
  110. }
  111. bool isSep(char c){
  112.     if( (isblank(c)) or (c == '.') or (c == ',') or (c == ';') or (c == ':') ) return true;
  113.     return false;
  114. }
  115.  
  116. void split_Tokens(char* linea, char ** & palabras, int n){
  117.     int numPal = 0;
  118.     char *auxPal[500];
  119.     if(!isblank(linea[0])){
  120.         auxPal[numPal] = linea;
  121.         numPal++;
  122.     }
  123.     for(int i = 1; linea[i] != '\0'; i++){
  124.         if(!isSep(linea[i]) and (isSep(linea[i-1]) or (linea[i-1] == '\0')) ){
  125.             auxPal[numPal] = &linea[i];
  126.             numPal++;
  127.            
  128.         }
  129.         if(isSep(linea[i]) and !isSep(linea[i-1]) )
  130.             linea[i] = '\0';
  131.         if(numPal == n) break;     
  132.     }
  133.         memExacta_str(auxPal,palabras,numPal);
  134. }
  135.  
  136. void incrementar(char **&lst,int numElem){
  137.     if(lst==NULL){
  138.         lst=new char*[INC+1];
  139.         for(int i=0;i<INC;i++) lst[i]=NULL;
  140.     }
  141.     else{
  142.         char **lstAux=new char *[numElem+INC+1];
  143.         for(int i=0;i<numElem;i++) lstAux[i]=lst[i];
  144.         for(int i=numElem;i<=numElem+INC;i++) lstAux[i]=NULL;
  145.         delete []lst;
  146.         lst=lstAux;
  147.     }
  148. }
  149. void agregar(char**&lst,char *elem){
  150.     //cout<<"Elemento que queremos agregar "<<elem<<endl;
  151.     if(lst==NULL){
  152.         incrementar(lst,0);
  153.         lst[0]=elem;
  154.         //cout<<"Elemento agregado "<<endl;
  155.     }
  156.     else{
  157.         int numElem=0,idx=0;
  158.         for(int i=0;lst[numElem];i++){
  159.             if(strcmp(lst[numElem],elem)==0) return;
  160.             if(strcmp(lst[numElem],elem)<0) idx++;
  161.             numElem++;
  162.         }
  163.         if(numElem%INC==0) incrementar(lst,numElem);
  164.         for(int i=numElem;i>=idx;i--)
  165.             lst[i]=lst[i-1];
  166.         lst[idx]=elem;
  167.     }
  168. }
  169. void leerTweets(char ***&tweets,char **&users,char **&hashtags){
  170.     char linea[500],linea2[500];
  171.     char ***auxTweets=new char**[300];
  172.     int nTw=0;
  173.     char **auxUsers=NULL;
  174.     char **auxHT=NULL;
  175.     while(cin.getline(linea,200,'\n') and strcmp(linea,"0")!=0){
  176.         strcpy(linea2,linea);
  177.         char **palabras;
  178.         split_Tokens(linea,palabras,2);
  179.         auxTweets[nTw]=new char*[2];
  180.         auxTweets[nTw][0]=palabras[0];
  181.         auxTweets[nTw][1]=palabras[1];
  182.         nTw++;
  183.         delete [] palabras;    
  184.         split_Tokens(linea2,palabras,INF);
  185.         for(int i=1;palabras[i];i++){
  186.             if(palabras[i][0]=='@') agregar(auxUsers,palabras[i]);
  187.             if(palabras[i][0]=='#') agregar(auxHT,palabras[i]);
  188.         }
  189.         delete [] palabras;    
  190.     }
  191.     int nusers,nht;
  192.     for(nusers=0;auxUsers[nusers]!=NULL;nusers++);
  193.     for(nht=0;auxHT[nht]!=NULL;nht++);
  194.     memExacta_str(auxUsers,users,nusers);
  195.     memExacta_str(auxHT,hashtags,nht);
  196.     tweets=new char**[nTw+1];
  197.     for(int i=0;i<nTw;i++)
  198.        tweets[i]=auxTweets[i];
  199.     tweets[nTw]=NULL;
  200.     delete [] auxTweets;
  201. }
  202. void reporteLectura(char ***&tweets,char **&users,char **&hashtags){
  203.     int ntweets,nusers,nht;
  204.     for(ntweets=0;tweets[ntweets]!=NULL;ntweets++);
  205.     for(nusers=0;users[nusers]!=NULL;nusers++);
  206.     for(nht=0;hashtags[nht]!=NULL;nht++);
  207.     cout<<"Total tweets: "<<ntweets<<endl;
  208.     cout<<"Total usuarios mencionados: "<<nusers<<endl;
  209.     cout<<"Lista de usuarios: "<<endl;
  210.     for(int i=0;i<nusers;i++) cout<<users[i]<<' ';
  211.     cout<<endl;
  212.     cout<<"Total  hashtags: "<<nht<<endl;
  213.     cout<<"Lista de hashtags: "<<endl;
  214.     for(int i=0;i<nht;i++) cout<<hashtags[i]<<' ';
  215.     cout<<endl<<endl;
  216.    
  217. }
Advertisement
Add Comment
Please, Sign In to add comment