summaryrefslogtreecommitdiffstats
path: root/2023-2/E1/mitsuo/p2/fun.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2023-2/E1/mitsuo/p2/fun.cpp')
-rw-r--r--2023-2/E1/mitsuo/p2/fun.cpp186
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