Advertisement
xlujiax

lab4

Oct 9th, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.21 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include "split.h"
  7. #define INC 2
  8. using namespace std;
  9.  
  10. void incrementar(char*** &lista, int numArticulos) {
  11.     if (lista == NULL) {
  12.         lista = new char **[INC + 1];
  13.         for (int i = 0; i < INC + 1; i++) lista[i] = NULL;
  14.     } else {
  15.         char *** aux = new char **[numArticulos + INC + 1];
  16.         for (int i = 0; i < numArticulos; i++) aux[i] = lista[i];
  17.         for (int i = numArticulos; i <= numArticulos + INC; i++) aux[i] = NULL;
  18.         delete [] lista;
  19.         lista = aux;
  20.     }
  21. }
  22.  
  23. void leerDatos(char*** &lista, int &numArticulos) {
  24.     //inicializamos
  25.     lista = NULL;
  26.     numArticulos = 0;
  27.     char linea[200];
  28.  
  29.     while (1) {
  30.         char** palabras;
  31.         int numPal;
  32.  
  33.         cin.getline(linea, 100, '\n');
  34.         if (strcmp(linea, "****") == 0) break;
  35.         splitTokens(linea, palabras, numPal);
  36.  
  37.         //Por Incrementos
  38.         if (lista == NULL) {
  39.             incrementar(lista, numArticulos);
  40.             lista[0] = palabras;
  41.         } else {
  42.             if (numArticulos % INC == 0)
  43.                 incrementar(lista, numArticulos);
  44.             lista[numArticulos] = palabras;
  45.         }
  46.         numArticulos++;
  47.     }
  48. }
  49.  
  50. void imprimir(char*** &lista, int &numArticulos) {
  51.     for (int i = 0; i < numArticulos; i++) {
  52.         for (int j = 0; lista[i][j] != NULL; j++) {
  53.             cout << lista[i][j] << " ";
  54.         }
  55.         cout << endl;
  56.     }
  57.  
  58. }
  59.  
  60. int existeNumero(char *palabra) {
  61.     for (int i = 0; palabra[i] != '\0'; i++) {
  62.         if (isdigit(palabra[i]))
  63.             return 1;
  64.     }
  65.     return 0;
  66. }
  67.  
  68. tolawer(char **&palabras, int nPal) {
  69.     for (int i = 0; i < nPal; i++) {
  70.         for (int j = 0; palabras[i][j] != '\0'; j++) {
  71.             if ((palabras[i][j] >= 65) && (palabras[i][j] <= 90))
  72.                 palabras[i][j] += 32;
  73.         }
  74.     }
  75. }
  76.  
  77. int buscarPalabra(char *palabra, char *** lstarticulos, char *** lstpalabras, int numArticulos, int numPalabras) {
  78.     for (int i = 0; i < numArticulos; i++) {
  79.         if (strcmp(lstarticulos[i][0], palabra) == 0)
  80.             return 1;
  81.     }
  82.  
  83.     for (int j = 0; j < numPalabras; j++) {
  84.         if (strcmp(lstpalabras[j][0], palabra) == 0)
  85.             return 1;
  86.     }
  87.  
  88.     return 0;
  89. }
  90.  
  91. int buscar(char *palabra, char *** lista, int numero) {
  92.     for (int i = 0; i < numero; i++) {
  93.         if (strcmp(lista[i][0], palabra) == 0)
  94.             return i;
  95.     }
  96.     return -1;
  97. }
  98.  
  99. void analizarOraciones(char *** lstarticulos, char *** words, int numArticulos, int numPalabras) {
  100.  
  101.     char linea[300];
  102.     int contOraciones = 0;
  103.     int contPal = 0;
  104.     int contPalErr = 0;
  105.     int contPalErrLex = 0;
  106.     int contPalErrGram = 0;
  107.     int AuxcontPalErrGram = 0;
  108.  
  109.     char **PalErr = new char*[20];
  110.     for (int i = 0; i < 20; i++) PalErr[i] = NULL;
  111.  
  112.     char **PalErrLex = new char*[20];
  113.     for (int j = 0; j < 20; j++) PalErrLex[j] = NULL;
  114.  
  115.     char **PalErrGra = new char*[40];
  116.     for (int k = 0; k < 40; k++) PalErrGra[k] = NULL;
  117.  
  118.     while (1) {
  119.         char c = cin.peek();
  120.         if (c == EOF)
  121.             break;
  122.         cin.getline(linea, 300, '.');
  123.         char** palabras;
  124.         int nPal;
  125.         splitTokens(linea, palabras, nPal);
  126.         tolawer(palabras, nPal);
  127.  
  128.         contPal += nPal;
  129.         for (int i = 0; i < nPal; i++) {
  130.             int flagPalErr = existeNumero(palabras[i]);
  131.             if (flagPalErr == 1) {
  132.                 PalErr[contPalErr] = palabras[i];
  133.                 contPalErr++;
  134.                 contPal -= 1;
  135.             }
  136.  
  137.             if (!buscarPalabra(palabras[i], lstarticulos, words, numArticulos, numPalabras) && (flagPalErr != 1)) {
  138.                 PalErrLex[contPalErrLex] = palabras[i];
  139.                 contPalErrLex++;
  140.             }
  141.         }
  142.  
  143.         for (int i = 0; i < nPal; i++) {
  144.             int posArt;
  145.             if ((posArt = buscar(palabras[i], lstarticulos, numArticulos)) != -1) {
  146.                 int posPal;
  147.                 if ((posPal = buscar(palabras[i + 1], words, numPalabras)) != -1) {
  148.                     if (!((lstarticulos[posArt][1] == words[posPal][1]) && (lstarticulos[posArt][2] == words[posPal][2]))) {
  149.                         PalErrGra[AuxcontPalErrGram] = palabras[i];
  150.                         PalErrGra[AuxcontPalErrGram + 1] = palabras[i + 1];
  151.                         contPalErrGram++;
  152.                         AuxcontPalErrGram += 2;
  153.                     }
  154.                 }
  155.             }
  156.         }
  157.  
  158.         contOraciones++;
  159.     }
  160.     cout << "ESTADISTICAS GENERALES" << endl;
  161.     cout << "-----------------------------------" << endl;
  162.     cout << "Total de Oraciones: " << contOraciones << endl;
  163.     cout << "Total de Palabras erradas por formato: " << contPalErr << endl;
  164.     cout << "Palabras erradas por formato: " << endl;
  165.     for (int i = 0; i < contPalErr; i++) {
  166.         cout << PalErr[i] << endl;
  167.     }
  168.     cout << "Correccion Lexical" << endl;
  169.     cout << "-----------------------------------" << endl;
  170.     cout << "Total de palabras erradas por lexico: " << contPalErrLex << endl;
  171.     for (int i = 0; i < contPalErrLex; i++) {
  172.         cout << PalErrLex[i] << endl;
  173.     }
  174.     cout << "Correcion Gramatical" << endl;
  175.     cout << "-----------------------------------" << endl;
  176.     cout << "Total de pares de palabras erradas por gramatica: " <<contPalErrGram << endl;
  177.     int aux = 0;
  178.     for (int i = 0; i < AuxcontPalErrGram; i++) {
  179.        
  180.         cout << PalErrGra[aux] << " " <<PalErrGra[aux+1] << endl;
  181.         aux+=2;
  182.     }
  183.  
  184. }
  185.  
  186. int main(int argc, char** argv) {
  187.    
  188.     freopen("LAB4.txt", "r", stdin);
  189.  
  190.     char*** articulos;
  191.     char*** palabras;
  192.     int numArticulos;
  193.     int numPalabras;
  194.     leerDatos(articulos, numArticulos);
  195.     imprimir(articulos, numArticulos);
  196.  
  197.     leerDatos(palabras, numPalabras);
  198.     imprimir(palabras, numPalabras);
  199.  
  200.     analizarOraciones(articulos, palabras, numArticulos, numPalabras);
  201.     return 0;
  202. }
  203. ----------------------------------------------------------------------
  204.  
  205. #include <cstdio>
  206. #include <cstdlib>
  207. #include <cctype>
  208. #include <iomanip>
  209. #include <iostream>
  210. #include <cstring>
  211. #include "split.h"
  212.  
  213. void memExacta_str(char ** input, char **& output, int numElem){
  214.     output = new char*[numElem+1];
  215.     for (int i = 0; i < numElem; i++) {
  216.         int size = strlen(input[i])+1;                  
  217.         output[i] = new char [size];
  218.         strcpy(output[i],input[i]);
  219.     }
  220.     output[numElem] = NULL;
  221. }
  222.  
  223. bool isSeparador(char c){
  224.     if (isblank(c) || (c == ',') || (c == '.') || (c == '\n'))
  225.         return true;
  226.     else return false;
  227. }
  228.  
  229. void splitTokens(char* linea, char**&palabras, int &numPal){
  230.    
  231.     numPal = 0;    
  232.     char * auxPal[50];
  233.     if(!isSeparador(linea[0])){
  234.         auxPal[numPal] = linea;
  235.         numPal++;
  236.     }
  237.     for(int i = 1; linea[i] != '\0'; i++){
  238.         if(!isSeparador(linea[i]) && (isSeparador(linea[i-1]) || linea[i-1] == '\0')){
  239.             auxPal[numPal] = &linea[i];
  240.             numPal++;
  241.         }        
  242.         if (isSeparador(linea[i]) && !isSeparador(linea[i-1])){
  243.             linea[i] = '\0';
  244.         }
  245.     }
  246.     memExacta_str(auxPal, palabras, numPal);    
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement