summaryrefslogtreecommitdiffstats
path: root/2022-2/L6/mitsuo/fun.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2022-2/L6/mitsuo/fun.cpp')
-rw-r--r--2022-2/L6/mitsuo/fun.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/2022-2/L6/mitsuo/fun.cpp b/2022-2/L6/mitsuo/fun.cpp
new file mode 100644
index 0000000..569350c
--- /dev/null
+++ b/2022-2/L6/mitsuo/fun.cpp
@@ -0,0 +1,69 @@
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <cstdlib>
+#include "fun.h"
+
+using namespace std;
+
+void cargaarreglo(void *&arreglo,
+ int (*cmpnumero)(const void *, const void *),
+ int *leenumero(istream &in),
+ const char *filename)
+{
+ ifstream in(filename);
+
+ if (!in) {
+ cerr << "Error, no se pudo abrir archivo\n";
+ return;
+ }
+
+ int **numbers;
+ int *data;
+ int *buffer[MAXLEN];
+ int i;
+ /* load buffer */
+ for (i = 0; (data = leenumero(in)); i++) {
+ buffer[i] = data;
+ }
+ buffer[i] = nullptr;
+
+ /* create "exact" array of pointers to int */
+ numbers = new int * [i + 1];
+ for (i = 0; buffer[i]; i++) {
+ numbers[i] = buffer[i];
+ }
+ numbers[i] = nullptr;
+
+ /* sort array */
+
+ qsort(numbers, i, sizeof(void *), cmpnumero);
+
+ // for (i = 0; numbers[i]; i++) {
+ // cout << *numbers[i] << '\n';
+ // }
+
+ /* modify parameter reference */
+ arreglo = numbers;
+}
+
+/* qsort comparisong function. Descending order */
+int cmpnumero(const void *p1, const void *p2)
+{
+ return - (** (int **) p1 - ** (int **) p2);
+}
+
+/* allocates memory */
+int *leenumero(istream &in)
+{
+ int n;
+ if (in >> n)
+ return new int{n};
+ else
+ return nullptr;
+}
+
+void imprimenumero(ostream &out, void *data)
+{
+ cout << * (int *) data << '\n';
+}