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/p1/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/p1/fun.cpp')
| -rw-r--r-- | 2023-2/E1/mitsuo/p1/fun.cpp | 236 |
1 files changed, 115 insertions, 121 deletions
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 <iostream> -#include <fstream> -#include <iomanip> -#include <cstring> - #include "fun.hpp" -#define INCREMENTO 5 +#include <cstring> +#include <fstream> +#include <iomanip> +#include <iostream> 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 "<<nombArch<<endl; +void cargarPedidos(int **&fechaClienteCantidad, char **&codigoDelProducto, + const char *archivo) { + ifstream in(archivo); + if (!in) { + cout << "Error: no se pudo abrir archivo\n"; exit(1); } - fechaClienteCantidad = nullptr; - codigoDelProducto = nullptr; - while (1) { - cod = leeCad(arch, ','); - if (cod==nullptr) break; - if (nd == cap) aumentaEspacios(fechaClienteCantidad, codigoDelProducto, nd, cap); - guardaPed(arch, fechaClienteCantidad[nd - 1], codigoDelProducto[nd - 1], cod); - nd++; - arch.get(); + + fechaClienteCantidad = NULL; + codigoDelProducto = NULL; + size_t size = 0; + + char code[MAXLEN]; + int dni, qty, date, dd, mm, yy; + + int i; + for (i = 0; true; i++) { + in.getline(code, MAXLEN, ','); + in >> 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<nd;i++){ - auxF[i] = fechaClienteCantidad[i]; - auxC[i] = codigoDelProducto[i]; - } - delete fechaClienteCantidad; - delete codigoDelProducto; - fechaClienteCantidad = auxF; - codigoDelProducto = auxC; + + // this has O(n^2) time complexity (not good) + size += INCREMENTO; + int ** tmp1 = new int * [size]; + char ** tmp2 = new char * [size]; + + int i; + for (i = 0; i < size && fechaClienteCantidad[i]; i++) { + tmp1[i] = fechaClienteCantidad[i]; + tmp2[i] = codigoDelProducto[i]; } -} + tmp1[i] = NULL; -void guardaPed(istream &arch, int *&fechaClienteCantidad, char *&codigoDelProducto, char *cod){ - int fecha, dni, cant; - arch>>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 "<<nombArch<<endl; +void pruebaDeCargaDePedidos(int **fechaClienteCantidad, + char **codigoDelProducto, const char *archivo) { + ofstream out(archivo); + if (!out) { + cout << "Error: no se pudo abrir archivo\n"; exit(1); } - arch.precision(2); - arch<<fixed; - arch<<setw(43)<<"REPORTE DE PRUEBA DE PEDIDOS"<<endl; - imprimeLinea(arch,'='); - arch<<right<<setw(7)<<"FECHA"; - arch<<right<<setw(12)<<"DNI"<<setw(16)<<"CANTIDAD"<<setw(5)<<" "<<left<<setw(20)<<"CODIGO PRODUCTO"<<endl; - for(int i=0;fechaClienteCantidad[i];i++){ - imprimePedido(arch,fechaClienteCantidad[i], codigoDelProducto[i]); - } -} + out << "Fecha DNI Cant. Código producto\n"; + for (int i = 0; fechaClienteCantidad[i]; i++) { + int date = fechaClienteCantidad[i][0]; + int dni = fechaClienteCantidad[i][1]; + int qty = fechaClienteCantidad[i][2]; + char * code = codigoDelProducto[i]; -void imprimeLinea(ostream &arch,char c){ - for(int i=0;i<58;i++) arch<<c; - arch<<endl; + out << right << fixed << setprecision(2); + print_date(out, date); + out << setw(12) << dni; + out << setw(12) << qty; + out << left << " "; + out << setw(12) << code; + out << '\n'; + } } -void imprimePedido(ostream &arch,int *fechaClienteCantidad, char *codigoDelProducto){ - imprimeFecha(arch,fechaClienteCantidad[0]); - arch<<right<<setw(12)<<fechaClienteCantidad[1]<<setw(10)<<fechaClienteCantidad[2]<<setw(11)<<" "<<left<<setw(10)<<codigoDelProducto<<endl; +void print_date(ostream &out, int date) { + int yy = date / 10000; + int mm = date / 100 % 100; + int dd = date % 100; + out << setfill('0') << right; + out << setw(2) << dd << '/'; + out << setw(2) << mm << '/'; + out << setw(4) << yy << " "; + out << setfill(' '); } - -void imprimeFecha(ostream &arch,int fecha){ - int dd,mm,aa=fecha; - dd = aa%100; - aa/=100; - mm = aa%100; - aa/=100; - arch.fill('0'); - arch<<right<<setw(2)<<dd<<"/"<<setw(2)<<mm<<"/"<<setw(4)<<aa; - arch.fill(' '); -}
\ No newline at end of file |
