summaryrefslogtreecommitdiffstats
path: root/2023-2/E1/mitsuo/p2/fun.cpp
blob: 75219982367041022de868062f599f5dc8f44b62 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <iostream>
#include "fun.hpp"

using namespace std;

void cargarProductos(void *& productos, const char * archivo) {
    ifstream in(archivo);
    if (!in) {
        cout << "Error: no se pudo abrir archivo\n";
        exit(1);
    }
    void ** ps = NULL;
    size_t size = 0;

    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);
        }

        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;
}

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 increase_size_productos(void **& ps, size_t &size) {
    if (!ps) {
        // init
        size = INCREMENTO;
        ps = new void * [size];

        ps[0] = NULL;
        return;
    }

    // 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 * productos) {
    ofstream out("PruebaProductos.txt");
    if (!out) {
        cout << "Error: no se pudo abrir archivo\n";
        exit(1);
    }

    void ** ps = (void **) productos;

    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];

        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';
    }
}