Advertisement
xlujiax

CursosVoid

Oct 6th, 2016
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #define N 100
  5. using namespace std;
  6.  
  7. /*
  8. IEE2A5      Maquinas   eléctricas          3.5
  9. HIS242  Historia del Perú   2: Siglo  16 & 17       4
  10. */
  11.  
  12. void imprimirCursos(void *lstCursos, int numCursos){
  13.     void **arrCursos = (void **)lstCursos;
  14.    
  15.     for (int i = 0; i < numCursos ;i++){
  16.         void **regCurso = (void **) arrCursos[i];
  17.        
  18.         char *ptrCodigo = (char *)regCurso[0];
  19.         char *ptrNombre = (char *)regCurso[1];
  20.         double *ptrCred = (double *)regCurso[2];
  21.        
  22.         cout << ptrCodigo << '\t' << ptrNombre << '\t' << *ptrCred << endl;
  23.     }
  24.    
  25. }
  26.  
  27. void tokenizer(char * linea, int &n_tokens, char ** &tokens){
  28.     n_tokens = 0;
  29.     char * aux_tokens[20];
  30.     if(!isblank(linea[0])){
  31.         n_tokens++;
  32.         aux_tokens[0] = linea;
  33.     }
  34.     for (int i=1; linea[i]; i++){
  35.         //busquemos el inicio de los tokens
  36.         if (!isblank(linea[i]) &&
  37.             (isblank(linea[i-1]) || (linea[i-1]==0)) ){
  38.             aux_tokens[n_tokens] = &linea[i];
  39.             n_tokens++;
  40.         }
  41.         //busquemos el final de los tokens
  42.         if (!isblank(linea[i]) && isblank(linea[i+1])){
  43.             linea[i+1] = 0;
  44.             i++;
  45.         }
  46.         //Otra forma posible de analizar el final de los tokens
  47.         /*if (isblank(linea[i]) && !isblank(linea[i-1])){
  48.           linea[i] = 0;
  49.         }*/
  50.     }
  51.  
  52.     //Guardamos los tokens en memoria exacta
  53.     tokens = new char* [n_tokens+1];
  54.     for (int i=0; i<n_tokens; i++){
  55.         //Se debe reservar memoria y copiar el contenido porque
  56.         //tenemos que dejar de usar el espacio de memoria estático de "linea"
  57.         int sizeToken = strlen(aux_tokens[i]);
  58.         tokens[i] = new char [sizeToken+1]; //no se olviden del caracter nulo
  59.         strcpy(tokens[i], aux_tokens[i]);
  60.     }
  61.     tokens[n_tokens] = NULL;
  62.     //return tokens; //Estamos retornando por referencia
  63. }
  64.  
  65. void leerCursos(void *** &);
  66. void separaCurso(char *, void ** &);
  67. void memoria_exacta_curso(void ** &, char **, int);
  68. void memoria_exacta(void *** &, void ***, int);
  69.  
  70. void separaCurso(char * linea, void ** &curso){
  71.     char ** tokens;
  72.     int n_palabras;
  73.     tokenizer(linea,n_palabras,tokens);
  74.  
  75.     curso = new void*[3];
  76.     //codigo
  77.     curso[0] = tokens[0];
  78.     //creditos
  79.     double* auxFloat = new double;
  80.     *auxFloat = atof(tokens[n_palabras-1]);
  81.     curso[2] = auxFloat;
  82.     delete [] tokens[n_palabras-1];
  83.     //nombre del curso
  84.     int size = 0;
  85.     for (int i=1; i<n_palabras-1; i++)
  86.         size+=strlen(tokens[i])+1;
  87.     //probar si pueden asignar directo a: curso[1]
  88.        
  89.     char * auxNombre = new char[size]; //no es necesario sumar 1
  90.     strcpy(auxNombre, tokens[1]);
  91.     for (int i=2; i<n_palabras-1; i++){
  92.         strcat(auxNombre," ");
  93.         strcat(auxNombre,tokens[i]);
  94.     }
  95.     curso[1] = auxNombre;
  96.     //curso[3] = NULL;
  97. }
  98.  
  99. void memoria_exacta(void *** &output, void *** input, int n){
  100.     output = new void** [n+1];
  101.     for (int i=0; i<n; i++)
  102.         output[i] = input[i];
  103.     output[n] = NULL;
  104. }
  105.  
  106. void leerCursos(void *** &cursos, int &nCursos){
  107.     nCursos = 0;
  108.     char linea[500];
  109.     void ** auxCursos[N];
  110.     void ** curso;
  111.     while(cin.getline(linea,500,'\n')){
  112.         separaCurso(linea, curso);
  113.         auxCursos[nCursos++] = curso;
  114.     }
  115.     memoria_exacta(cursos,auxCursos,nCursos);
  116. }
  117.  
  118.  
  119. int main(int argc, char const *argv[]) {
  120.     void *** cursos;
  121.     int nCursos;
  122.     leerCursos(cursos, nCursos);
  123.     imprimirCursos(cursos, nCursos);
  124.  
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement