diff options
| author | Mitsuo Tokumori <[email protected]> | 2023-10-20 12:31:43 -0500 |
|---|---|---|
| committer | Mitsuo Tokumori <[email protected]> | 2023-10-20 12:31:43 -0500 |
| commit | 4c144833b278188c567198866934e8773be9c8f4 (patch) | |
| tree | 6ee01c357c58c9b9bd30ab621770d33f7d589ea7 /2023-2/E1/mitsuo/p2/fun.cpp | |
| parent | fba9c34c547c99d56b4bf2d83caf5c68a638107f (diff) | |
| download | LP1-4c144833b278188c567198866934e8773be9c8f4.tar.gz LP1-4c144833b278188c567198866934e8773be9c8f4.tar.bz2 LP1-4c144833b278188c567198866934e8773be9c8f4.zip | |
Add sol for p1, p2 of 2023-2 E1
Also add the topics covered in the exam on topics.txt
Diffstat (limited to '2023-2/E1/mitsuo/p2/fun.cpp')
| -rw-r--r-- | 2023-2/E1/mitsuo/p2/fun.cpp | 186 |
1 files changed, 85 insertions, 101 deletions
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 <iostream> +#include <cstring> +#include <cstdlib> #include <fstream> #include <iomanip> - -#include <cstdlib> -#include <cstring> +#include <iostream> #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<nd;i++){ - aux[i] = productos[i]; + char code[MAXLEN]; + char desc[MAXLEN]; + double price; + int stock; + + int i; + for (i = 0; true; i++) { + in.getline(code, MAXLEN, ','); + in.getline(desc, MAXLEN, ','); + in >> 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"<<endl; + if (!out) { + cout << "Error: no se pudo abrir archivo\n"; exit(1); } - out.precision(2); - out<<fixed; - out<<setw(70)<<"REPORTE DE PRUEBA DE PRODUCTOS"<<endl; - imprimeLinea(out,'='); - out<<left<<setw(10)<<"CODIGO"<<setw(70)<<"NOMBRE"<<right<<setw(10)<<"PRECIO" - <<setw(10)<<"STOCK"<<endl; - for(int i=0;productos[i];i++){ - imprimeProducto(out,productos[i]); - } -} -void imprimeLinea(ostream &arch,char c){ - for(int i=0;i<110;i++) arch<<c; - arch<<endl; -} + void ** ps = (void **) productos; -void imprimeProducto(ostream &arch,void *prod){ - void **producto = (void**)prod; - imprimeRegistroProducto(arch,producto[0]); -} + out << "Codigo Descripcion Precio Stock\n"; + for (int i = 0; ps[i]; i++) { + void ** p2 = (void **) ps[i]; + void ** p1 = (void **) p2[0]; + char * code = (char *) p1[0]; + char * desc = (char *) p1[1]; + double * price = (double *) p1[2]; + int * stock = (int *) p1[3]; -void imprimeRegistroProducto(ostream &arch,void *prod){ - void **producto = (void**)prod; - char *cod = (char*)producto[COD],*nom = (char*)producto[NOM]; - double *precio = (double*)producto[PRECIO]; - int *stock = (int*)producto[STOCK]; - arch<<left<<setw(10)<<cod<<setw(70)<<nom<<right<<setw(10)<<*precio<<setw(9)<<*stock<<endl; -} + out << left; + out << setw(12) << code; + out << setw(64) << desc; + out << right << fixed << setprecision(2); + out << setw(12) << *price; + out << setw(12) << *stock; + out << '\n'; + } +}
\ No newline at end of file |
