Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * File: main.cpp
- * Author: alulab14
- *
- * Created on 11 de octubre de 2014, 10:38 AM
- */
- #include <cstdlib>
- #include <cstdio>
- #include <cstring>
- #include "funcs.h"
- using namespace std;
- /*
- *
- */
- int main(void) {
- void *autores, *separados;
- leeAutores(autores);
- imprimirAutores(autores);
- leeVentas(autores);
- //pagoAutores(autores/*,????*/);
- //separarAutores(autores,separados/*,????*/);
- //reporte(autores,separados);
- return 0;
- }
- /*
- * File: funcs.h
- * Author: alulab14
- *
- * Created on 11 de octubre de 2014, 11:02 AM
- */
- #ifndef FUNCS_H
- #define FUNCS_H
- void leeAutores(void *&);
- void imprimirAutores(void *);
- void **colocarAutor(int *,char *,double *);
- void **memoriaExacta(void **,int);
- void leeVentas(void *&);
- void imprimeVentas(void *, int []);
- int buscarAutor(void *,int);
- void inicializarArreglo(int [], int);
- void agregarLibro(void **,char *, int , int[], int);
- void crearListaAut(void **&,char *,int);
- int buscarLibro(char **, char *, int);
- void aumentarEspacios(void **, int);
- #endif /* FUNCS_H */
- #include <cstdlib>
- #include <cstdio>
- #include <cstring>
- #include "funcs.h"
- void leeAutores(void *&autores){
- void *auxAutores[500]; int numAutores = 0;
- int buffCodAutor, i = 0;
- while (1){
- // Leo todo normal
- if (scanf("%d",&buffCodAutor)==0) break;
- double buffPorcAutor; char buffPal[30], buffNombAutor[100];
- scanf("%s",buffNombAutor);
- while (1){
- if(scanf("%lf",&buffPorcAutor)==1) break;
- scanf("%s",buffPal);
- if (i > 1) strcat(buffNombAutor,"-");
- else strcat(buffNombAutor,"/");
- strcat(buffNombAutor,buffPal);
- i++;
- }
- i = 0; //Reinicio el contador de apellidos
- // Le doy memoria exacta a todos
- double *porcAutor; char *nombAutor; int *codAutor;
- codAutor = new int;
- *codAutor = buffCodAutor;
- nombAutor = new char[strlen(buffNombAutor)+1];
- strcpy(nombAutor,buffNombAutor);
- porcAutor = new double;
- *porcAutor = buffPorcAutor;
- auxAutores[numAutores] = colocarAutor(codAutor,nombAutor,porcAutor);
- numAutores++;
- }
- autores = memoriaExacta(auxAutores,numAutores);
- }
- void **colocarAutor(int *codAutor,char *nombAutor,double *porcAutor){
- void **regAutor = new void*[4];
- regAutor[0] = codAutor;
- regAutor[1] = nombAutor;
- regAutor[2] = porcAutor;
- regAutor[3] = NULL;
- return regAutor;
- }
- void **memoriaExacta(void **auxAutores,int cantDatos){
- void **autores = new void*[cantDatos+1];
- for(int i = 0; i < cantDatos; i++)
- autores[i] = auxAutores[i];
- autores[cantDatos] = NULL;
- return autores;
- }
- void imprimirAutores(void *autoresVoid){
- void **autores = (void**) autoresVoid;
- for(int i = 0; autores[i]; i++){
- void **autor = (void**)autores[i];
- int *cod = (int *)(autor[0]);
- char *nomb = (char *)(autor[1]);
- double *porc = (double *)(autor[2]);
- printf("%12d %-50s %4.2lf \n",*cod,nomb,*porc);
- }
- }
- void leeVentas(void *&autoresVoid){
- int i;
- void **autores = (void **)autoresVoid;
- for (i = 0; autores[i]; i++);
- int cantAut = i;
- int cantLibrosxAut[cantAut + 1];
- inicializarArreglo(cantLibrosxAut,cantAut);
- while (1){
- char buffCodLib[10]; int buffCantLib, buffCodAut;
- scanf("%s %d %d",buffCodLib,&buffCodAut,&buffCantLib);
- if (strcmp(buffCodLib,"*******") == 0) break;
- int numAut;
- numAut = buscarAutor(autores,buffCodAut);
- agregarLibro(autores,buffCodLib,buffCantLib,cantLibrosxAut,numAut);
- }
- imprimeVentas(autores,cantLibrosxAut);
- }
- void inicializarArreglo(int arr[], int numDat){
- for (int i = 0; i < numDat; i++)
- arr[i] = 0;
- }
- int buscarAutor(void *autores,int codAut){
- void **ptrAutor = (void **)autores;
- for (int i = 0; ptrAutor[i]; i++){
- void **ptrDatos = (void **)ptrAutor[i];
- int *codigo = (int*)(ptrDatos[0]);
- if (codAut == *codigo) return i;
- }
- return -1;
- }
- void agregarLibro(void **autores,char *codLib, int cantLib,
- int *cantLibrosxAut , int numAut){
- void **autor = (void **)autores[numAut];
- if (autor[3] == NULL){ // Primer libro de este autor
- crearListaAut(autor,codLib,cantLib);
- autores[numAut]=autor;
- cantLibrosxAut[numAut]++;
- }
- else{
- char **libros = (char **)autor[3];
- int * cantidad = (int *)autor[4];
- int n = buscarLibro(libros,codLib,cantLibrosxAut[numAut]);
- if (n == -1){ // No lo encontro
- if (cantLibrosxAut[numAut] % 5 == 0){
- aumentarEspacios(autor,cantLibrosxAut[numAut]);
- libros = (char**)(autor[3]);
- cantidad = (int *)(autor[4]);
- }
- char *codigo=new char[strlen(codLib)+1];
- strcpy(codigo,codLib);
- libros[cantLibrosxAut[numAut]] = codigo;
- cantidad[cantLibrosxAut[numAut]] = cantLib;
- cantLibrosxAut[numAut]++;
- }
- else // Encontro el libro
- cantidad[n] = cantidad[n] + cantLib;
- }
- }
- int buscarLibro(char **libros, char *codLib, int cant){
- for (int i = 0; i < cant; i++)
- if (strcmp(libros[i],codLib)== 0) return i;
- return -1;
- }
- void aumentarEspacios(void **autor, int cantLibrosxAut){
- char **libros = (char **)(autor[3]);
- int *cantidad = (int *)(autor[4]);
- cantLibrosxAut += 5;
- char **auxLib = new char*[cantLibrosxAut];
- int *auxCant = new int[cantLibrosxAut];
- for (int i = 0; i<cantLibrosxAut; i++){
- auxLib[i] = libros[i];
- auxCant[i] = cantidad[i] ;
- }
- delete[]libros;
- delete[]cantidad;
- autor[3] = auxLib;
- autor[4] = auxCant;
- }
- void crearListaAut(void **&autor,char *codLib,int cantLib){
- void **aux = new void *[5];
- aux[0] = autor[0];
- aux[1] = autor[1];
- aux[2] = autor[2];
- // Espacio para nuevas estructuras
- char **codigos = new char *[5];
- int *cantidad = new int [5];
- char *cod = new char[strlen(codLib)+1];
- strcpy(cod,codLib);
- codigos[0] = cod;
- cantidad[0] = cantLib;
- aux[3] = codigos;
- aux[4] = cantidad;
- delete[]autor;
- autor = aux;
- }
- void imprimeVentas(void *autoresVoid,int cantLibxAut[]){
- void **autores = (void **) autoresVoid;
- for (int i = 0; autores[i]; i++){
- void **autor = (void **)(autores[i]);
- int *cod = (int *)(autor[0]);
- char *nomb = (char *)(autor[1]);
- double *porc = (double *)(autor[2]);
- printf("\n\n\n%12d %-50s %4.2lf \n",*cod,nomb,*porc);
- if (autor[3]){
- char **libros = (char **)autor[3]; // arreglo de libros
- int *cant = (int *)autor[4];
- for (int j = 0; j < cantLibxAut[i]; j++)
- printf(" %-10s %d ",libros[j],cant[j]);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement