From 4c144833b278188c567198866934e8773be9c8f4 Mon Sep 17 00:00:00 2001 From: Mitsuo Tokumori Date: Fri, 20 Oct 2023 12:31:43 -0500 Subject: Add sol for p1, p2 of 2023-2 E1 Also add the topics covered in the exam on topics.txt --- 2023-2/E1/mitsuo/p2/fun.cpp | 186 ++++++++++++++++++++------------------------ 1 file changed, 85 insertions(+), 101 deletions(-) (limited to '2023-2/E1/mitsuo/p2/fun.cpp') diff --git a/2023-2/E1/mitsuo/p2/fun.cpp b/2023-2/E1/mitsuo/p2/fun.cpp index 9e61144..7521998 100644 --- a/2023-2/E1/mitsuo/p2/fun.cpp +++ b/2023-2/E1/mitsuo/p2/fun.cpp @@ -1,126 +1,110 @@ -#include +#include +#include #include #include - -#include -#include +#include #include "fun.hpp" using namespace std; -enum Reg {COD, NOM, PRECIO, STOCK}; - -void cargarProductos(void *&prod, const char *nombArch){ - ifstream in(nombArch); - if(!in) { - cerr << "Error: no se pudo abrir archivo\n"; +void cargarProductos(void *& productos, const char * archivo) { + ifstream in(archivo); + if (!in) { + cout << "Error: no se pudo abrir archivo\n"; exit(1); } - void **productos=nullptr; - char *cod; - int nd=0, cap=0; - while(1){ - cod = leeCad(in,','); - if(in.eof()) break; - if(nd==cap) aumentaEspacios(productos,nd,cap); - guardaProd(in, productos[nd-1], cod); - nd++; - } - prod = productos; - qsort(prod, nd-1, sizeof(void *), cmpProducto); -} + void ** ps = NULL; + size_t size = 0; -void aumentaEspacios(void**&productos, int &nd, int &cap){ - void **aux; - cap += INCREMENTO; - if(productos==nullptr){ - productos = new void * [cap]{}; - nd=1; - } - else{ - aux = new void * [cap]{}; - for(int i=0;i> price; in.get(); + in >> stock; in.get(); + if (!in) { + break; + } + + if (i + 1 >= size) { + increase_size_productos(ps, size); } - delete productos; - productos = aux; + + char * code_mem = new char [strlen(code) + 1]; strcpy(code_mem, code); + char * desc_mem = new char [strlen(desc) + 1]; strcpy(desc_mem, desc); + + void ** p1 = new void * [4] {code_mem, desc_mem, new double {price}, new int {stock}}; + void ** p2 = new void * [2] {p1, NULL}; + + ps[i] = p2; + ps[i + 1] = NULL; } + +// at the end of the iteration ps[i] == NULL + qsort(ps, i - 1, sizeof(void *), cmp_productos); + productos = ps; } -char *leeCad(istream &arch, char delim){ - char *cad, buff[80]; - arch.getline(buff,80,delim); - if(arch.eof()) return nullptr; - cad = new char [strlen(buff)+1]; - strcpy(cad,buff); - return cad; +int cmp_productos(const void *lhs, const void *rhs) { + // (nasty) + char * s1 = (char *)(*(void ****) lhs)[0][0]; + char * s2 = (char *)(*(void ****) rhs)[0][0]; + return strcmp(s1, s2); } -void guardaProd(istream &arch, void *&prod, char *cod){ - void **producto = new void *[2]{}; - producto[0] = creaRegProd(arch, cod); - producto[1] = nullptr; - prod = producto; -} +void increase_size_productos(void **& ps, size_t &size) { + if (!ps) { + // init + size = INCREMENTO; + ps = new void * [size]; -void *creaRegProd(istream &arch, char *cod){ - char *nomb; - double precio; - int stock; - void **reg; - nomb = leeCad(arch,','); - arch>>precio; - arch.get(); - arch>>stock; - arch>>ws; - reg = new void * [4] {}; - reg[COD] = cod; - reg[NOM] = nomb; - reg[PRECIO] = new double (precio); - reg[STOCK] = new int (stock); - return reg; -} + ps[0] = NULL; + return; + } -int cmpProducto(const void *a, const void *b){ - void **ai = (void**)a, **bi = (void**)b; - void **duplaA = (void**)(*ai), **duplaB = (void**)(*bi); - void **regA = (void**)(duplaA[0]), **regB = (void**)(duplaB[0]); - char *codA = (char *)(regA[0]), *codB = (char*)(regB[0]); - return strcmp(codA, codB); + // this has O(n^2) time complexity (not good) + size += INCREMENTO; + void ** ps_tmp = new void * [size]; + + int i; + for (i = 0; i < size && ps[i]; i++) { + ps_tmp[i] = ps[i]; + } + ps_tmp[i] = NULL; + + delete [] ps; + ps = ps_tmp; } -void pruebaDeCargaDeProductos(void *prod){ - void **productos = (void**)prod; +void pruebaDeCargaDeProductos(void * productos) { ofstream out("PruebaProductos.txt"); - if(!out){ - cout<<"error al abrir archivo PruebaProductos.txt"<