summaryrefslogtreecommitdiffstats
path: root/2023-2/E1/mitsuo/p1/fun.cpp
diff options
context:
space:
mode:
authorMitsuo Tokumori <[email protected]>2023-10-20 12:31:43 -0500
committerMitsuo Tokumori <[email protected]>2023-10-20 12:31:43 -0500
commit4c144833b278188c567198866934e8773be9c8f4 (patch)
tree6ee01c357c58c9b9bd30ab621770d33f7d589ea7 /2023-2/E1/mitsuo/p1/fun.cpp
parentfba9c34c547c99d56b4bf2d83caf5c68a638107f (diff)
downloadLP1-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.cpp236
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