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/p1/fun.cpp | 236 +++++++++++++++++++++----------------------- 1 file changed, 115 insertions(+), 121 deletions(-) (limited to '2023-2/E1/mitsuo/p1/fun.cpp') diff --git a/2023-2/E1/mitsuo/p1/fun.cpp b/2023-2/E1/mitsuo/p1/fun.cpp index 8eaccbe..aa589c1 100644 --- a/2023-2/E1/mitsuo/p1/fun.cpp +++ b/2023-2/E1/mitsuo/p1/fun.cpp @@ -1,151 +1,145 @@ -#include -#include -#include -#include - #include "fun.hpp" -#define INCREMENTO 5 +#include +#include +#include +#include using namespace std; -void cargarPedidos(int **&fechaClienteCantidad, char **&codigoDelProducto, const char *nombArch){ - int nd=0, cap=0; - char *cod; - ifstream arch(nombArch,ios::in); - if(not arch.is_open()){ - cout<<"error al abrir "<> dni; in.get(); + in >> qty; in.get(); + in >> dd; in.get(); in >> mm; in.get(); in >> yy; in.get(); + date = yy*10000 + mm*100 + dd; + if (!in) { + break; + } + + if (i + 1 >= size) { + increase_size_productos(fechaClienteCantidad, codigoDelProducto, size); + } + + fechaClienteCantidad[i] = new int [3] {date, dni, qty}; + char * code_mem = new char [strlen(code) + 1]; strcpy(code_mem, code); + codigoDelProducto[i] = code_mem; + + fechaClienteCantidad[i + 1] = NULL; } - qSort(fechaClienteCantidad, codigoDelProducto, 0, nd-2); + + qsort_pedidos(fechaClienteCantidad, codigoDelProducto, 0, i - 1); } -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; -} +void increase_size_productos(int **&fechaClienteCantidad, char **&codigoDelProducto, size_t &size) { + if (!fechaClienteCantidad) { + // init + size = INCREMENTO; + fechaClienteCantidad = new int * [size]; + codigoDelProducto = new char * [size]; -void aumentaEspacios(int **&fechaClienteCantidad, char **&codigoDelProducto, int &nd, int &cap){ - int **auxF; - char **auxC; - cap += INCREMENTO; - if(fechaClienteCantidad==nullptr){ - fechaClienteCantidad = new int * [cap]{}; - codigoDelProducto = new char * [cap]{}; - nd=1; + fechaClienteCantidad[0] = NULL; + return; } - else{ - auxF = new int * [cap]{}; - auxC = new char * [cap]{}; - for(int i=0;i>dni; - arch.get(); - arch>>cant; - arch.get(); - fecha = leeFecha(arch); - fechaClienteCantidad = new int [3] {}; - fechaClienteCantidad[0] = fecha; - fechaClienteCantidad[1] = dni; - fechaClienteCantidad[2] = cant; - codigoDelProducto = cod; + delete [] fechaClienteCantidad; + delete [] codigoDelProducto; + fechaClienteCantidad = tmp1; + codigoDelProducto = tmp2; } + +void qsort_pedidos(int ** v1, char ** v2, int left, int right) { + int i, last; -int leeFecha(istream &arch){ - int dd,mm,aa; - char c; - arch>>dd>>c>>mm>>c>>aa; - return dd+mm*100+aa*10000; -} + /* do nothing if array has less than 2 elements */ + if (left >= right) + return; + + swap_pedidos(v1, v2, left, (left + right) / 2); + last = left; -void qSort(int **fechaClienteCantidad, char **codigoDelProducto, int izq, int der){ - int limite; - if (izq>=der) return; - cambiar(fechaClienteCantidad[izq],codigoDelProducto[izq],fechaClienteCantidad[(izq+der)/2],codigoDelProducto[(izq+der)/2]); - limite = izq; - for(int i=izq+1;i<=der;i++){ - if(desorden(fechaClienteCantidad[i], fechaClienteCantidad[izq])){ - limite++; - cambiar(fechaClienteCantidad[i],codigoDelProducto[i],fechaClienteCantidad[limite],codigoDelProducto[limite]); + /* partition */ + for (i = left + 1; i <= right; i++) { + if (v1[i][0] < v1[left][0]) { + swap_pedidos(v1, v2, ++last, i); } } - cambiar(fechaClienteCantidad[izq],codigoDelProducto[izq],fechaClienteCantidad[limite],codigoDelProducto[limite]); - qSort(fechaClienteCantidad,codigoDelProducto,izq,limite-1); - qSort(fechaClienteCantidad,codigoDelProducto,limite+1,der); -} -void cambiar(int *&fechaClienteI,char *&codigoDelProductoI,int *&fechaClienteK,char *&codigoDelProductoK){ - int *auxI = fechaClienteI; - char *auxC = codigoDelProductoI; - fechaClienteI = fechaClienteK; - codigoDelProductoI = codigoDelProductoK; - fechaClienteK = auxI; - codigoDelProductoK = auxC; + swap_pedidos(v1, v2, left, last); /* reset partition element */ + qsort_pedidos(v1, v2, left, last - 1); + qsort_pedidos(v1, v2, last + 1, right); + } +void swap_pedidos(int ** v1, char ** v2, int left, int right) { + int * t1 = v1[left]; + char * t2 = v2[left]; -bool desorden(int *fechaClienteCantidadI, int *fechaClienteCantidadK){ - return fechaClienteCantidadI[0] < fechaClienteCantidadK[0]; + v1[left] = v1[right]; + v2[left] = v2[right]; + + v1[right] = t1; + v2[right] = t2; } -void pruebaDeCargaDePedidos(int **fechaClienteCantidad, char **codigoDelProducto, const char *nombArch){ - ofstream arch(nombArch,ios::out); - if(not arch.is_open()){ - cout<<"error al abrir "<