Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- #include <cstdlib>
- #define N 100
- using namespace std;
- /*
- IEE2A5 Maquinas eléctricas 3.5
- HIS242 Historia del Perú 2: Siglo 16 & 17 4
- */
- void imprimirCursos(void *lstCursos, int numCursos){
- void **arrCursos = (void **)lstCursos;
- for (int i = 0; i < numCursos ;i++){
- void **regCurso = (void **) arrCursos[i];
- char *ptrCodigo = (char *)regCurso[0];
- char *ptrNombre = (char *)regCurso[1];
- double *ptrCred = (double *)regCurso[2];
- cout << ptrCodigo << '\t' << ptrNombre << '\t' << *ptrCred << endl;
- }
- }
- void tokenizer(char * linea, int &n_tokens, char ** &tokens){
- n_tokens = 0;
- char * aux_tokens[20];
- if(!isblank(linea[0])){
- n_tokens++;
- aux_tokens[0] = linea;
- }
- for (int i=1; linea[i]; i++){
- //busquemos el inicio de los tokens
- if (!isblank(linea[i]) &&
- (isblank(linea[i-1]) || (linea[i-1]==0)) ){
- aux_tokens[n_tokens] = &linea[i];
- n_tokens++;
- }
- //busquemos el final de los tokens
- if (!isblank(linea[i]) && isblank(linea[i+1])){
- linea[i+1] = 0;
- i++;
- }
- //Otra forma posible de analizar el final de los tokens
- /*if (isblank(linea[i]) && !isblank(linea[i-1])){
- linea[i] = 0;
- }*/
- }
- //Guardamos los tokens en memoria exacta
- tokens = new char* [n_tokens+1];
- for (int i=0; i<n_tokens; i++){
- //Se debe reservar memoria y copiar el contenido porque
- //tenemos que dejar de usar el espacio de memoria estático de "linea"
- int sizeToken = strlen(aux_tokens[i]);
- tokens[i] = new char [sizeToken+1]; //no se olviden del caracter nulo
- strcpy(tokens[i], aux_tokens[i]);
- }
- tokens[n_tokens] = NULL;
- //return tokens; //Estamos retornando por referencia
- }
- void leerCursos(void *** &);
- void separaCurso(char *, void ** &);
- void memoria_exacta_curso(void ** &, char **, int);
- void memoria_exacta(void *** &, void ***, int);
- void separaCurso(char * linea, void ** &curso){
- char ** tokens;
- int n_palabras;
- tokenizer(linea,n_palabras,tokens);
- curso = new void*[3];
- //codigo
- curso[0] = tokens[0];
- //creditos
- double* auxFloat = new double;
- *auxFloat = atof(tokens[n_palabras-1]);
- curso[2] = auxFloat;
- delete [] tokens[n_palabras-1];
- //nombre del curso
- int size = 0;
- for (int i=1; i<n_palabras-1; i++)
- size+=strlen(tokens[i])+1;
- //probar si pueden asignar directo a: curso[1]
- char * auxNombre = new char[size]; //no es necesario sumar 1
- strcpy(auxNombre, tokens[1]);
- for (int i=2; i<n_palabras-1; i++){
- strcat(auxNombre," ");
- strcat(auxNombre,tokens[i]);
- }
- curso[1] = auxNombre;
- //curso[3] = NULL;
- }
- void memoria_exacta(void *** &output, void *** input, int n){
- output = new void** [n+1];
- for (int i=0; i<n; i++)
- output[i] = input[i];
- output[n] = NULL;
- }
- void leerCursos(void *** &cursos, int &nCursos){
- nCursos = 0;
- char linea[500];
- void ** auxCursos[N];
- void ** curso;
- while(cin.getline(linea,500,'\n')){
- separaCurso(linea, curso);
- auxCursos[nCursos++] = curso;
- }
- memoria_exacta(cursos,auxCursos,nCursos);
- }
- int main(int argc, char const *argv[]) {
- void *** cursos;
- int nCursos;
- leerCursos(cursos, nCursos);
- imprimirCursos(cursos, nCursos);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement