]> git.llucax.com Git - z.facultad/75.42/string.git/commitdiff
- Bugfixes.
authorLeandro Lucarella <llucax@gmail.com>
Mon, 29 Sep 2003 04:33:51 +0000 (04:33 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Mon, 29 Sep 2003 04:33:51 +0000 (04:33 +0000)
- Se agrega la funcionalidad para convertir de un string a otro.
- Se hace la función quicksort.

Makefile
ascii.cpp
ascii.h
quicksort.h [new file with mode: 0644]
unicode.cpp
unicode.h
universalstring.cpp
universalstring.h

index 636d4e26ab03c211a6c2bcb5b290c7dfe5955a1e..08ee0b63368e6e80418a7672715541958cec186a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -28,40 +28,26 @@ all: $(TARGETS)
 
 # Pruebas.
 tests: $(TESTS)
-       ./dllist_test
 
-dllist_test: dllist.o
+ascii.o: ascii.cpp ascii.h
 
-tp3: dllist.o figura.o rectangulo.o cuadrado.o linea.o circulo.o dibujo.o
+unicode.o: unicode.cpp unicode.h
 
-dllist.o: dllist.cpp dllist.h
+#quicksort.o: quicksort.cpp quicksort.h
 
-figura.o: figura.cpp figura.h punto.h
+#universalstring.o: universalstring.h universalstring.cpp
 
-linea.o: figura.o linea.cpp linea.h
+universalstring: ascii.o unicode.o universalstring.cpp
 
-circulo.o: figura.o circulo.cpp circulo.h
-
-rectangulo.o: figura.o rectangulo.cpp rectangulo.h
-
-cuadrado.o: rectangulo.o cuadrado.cpp cuadrado.h
-
-dibujo.o: dllist.o figura.o dibujo.cpp dibujo.h
-
-
-# Preety-printing del código fuente.
-corrida.txt: tp3
-       @./tp3 > corrida.txt
 
 # Regla para borrar.
 clean:
        @echo "Limpiando..."
-       @rm -fR $(TARGETS) *.o core tp2 corrida_*.txt html latex* *.ps
+       @rm -fR $(TARGETS) *.o core html latex* *.ps
 
 # Preety-printing del código fuente.
-FUENTES=dllist.h dllist.cpp punto.h figura.h figura.cpp rectangulo.h \
-       rectangulo.cpp cuadrado.h cuadrado.cpp linea.h linea.cpp circulo.h \
-       circulo.cpp dibujo.h dibujo.cpp tp3.cpp
+FUENTES=ascii.h ascii.cpp unicode.h unicode.cpp universalstring.h \
+       quicksort.h quicksort.cpp
 code.ps:  $(FUENTES)
        @enscript -j -Ecpp -U2 -C --fancy-header=squeeze --color -pcode.ps \
        $(FUENTES)
index 1864fb8dd9de28af7fd9fcb6835f74c254a95d18..8687cdd91cad95fc754404fe97aa933440c50c38 100644 (file)
--- a/ascii.cpp
+++ b/ascii.cpp
@@ -38,7 +38,7 @@ Ascii::~Ascii(void) {
 #endif
 }
 
-bool Ascii::is_endl(void) {
+bool Ascii::is_endl(void) const {
 #ifdef DEBUG
     std::cerr << "En Ascii::is_endl()." << std::endl;
 #endif
@@ -54,14 +54,14 @@ Ascii& Ascii::operator=(const Ascii& ascii) {
     return *this;
 }
 
-bool Ascii::operator<(const Ascii& ascii) {
+bool Ascii::operator<(const Ascii& ascii) const {
 #ifdef DEBUG
     std::cerr << "En operator< de Ascii." << std::endl;
 #endif
     return caracter < ascii.caracter;
 }
 
-bool Ascii::operator==(const Ascii& ascii) {
+bool Ascii::operator==(const Ascii& ascii) const {
 #ifdef DEBUG
     std::cerr << "En operator== de Ascii." << std::endl;
 #endif
diff --git a/ascii.h b/ascii.h
index a2cb48c352143b890753cdfdf2edaef282ca53fe..05316e3c9e6f156e1322ba7f9002fe4a3c6c6a69 100644 (file)
--- a/ascii.h
+++ b/ascii.h
@@ -42,16 +42,16 @@ class Ascii {
         virtual ~Ascii(void);
 
         /// Indica si el caracter es de fin de línea.
-        bool is_endl(void);
+        bool is_endl(void) const;
 
         /// Asignación de una instancia a otra.
         Ascii& operator=(const Ascii& ascii);
 
         /// Comparación por menor de dos instancias.
-        bool operator<(const Ascii& ascii);
+        bool operator<(const Ascii& ascii) const;
 
         /// Comparación por igual de dos instancias.
-        bool operator==(const Ascii& ascii);
+        bool operator==(const Ascii& ascii) const;
 
         /// Cast a char.
         operator char(void) const;
diff --git a/quicksort.h b/quicksort.h
new file mode 100644 (file)
index 0000000..8326c72
--- /dev/null
@@ -0,0 +1,59 @@
+/* vim: set et sts=4 sw=4 fdm=marker fmr={,} fdn=1 fo+=t tw=80:
+ *
+ * Taller de Programación (75.42).
+ *
+ * Ejercicio Número 4:
+ * Ordena texto ASCII o Unicode.
+ *
+ * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
+ * Puede copiar, modificar y distribuir este programa bajo los términos de
+ * la licencia GPL (http://www.gnu.org/).
+ *
+ * Creado: Mon Sep 22 21:00:15 ART 2003
+ *
+ * $Id$
+ */
+
+#ifndef QUICKSORT_H
+#define QUICKSORT_H
+
+#include <cstdlib>
+#include <vector>
+#include <cmath>
+
+/// Intercambia 2 índices del vector.
+template < class T >
+void swap(std::vector< T >& v, int i, int j) {
+    T tmp = v[i];
+    v[i] = v[j];
+    v[j] = tmp;
+}
+#include <iostream>
+/// Genera un índice al azar.
+int rnd(int i, int j) {
+    return i + rand() % (j-i+1);
+}
+
+/// Algoritmo de ordenamiento generico para ordenar un vector.
+template < class T >
+void quicksort(std::vector< T >& v, int left, int right) {
+    // Asigno como último al de la izquierda.
+    int last = left;
+    // Si los extremos se juntan, termina.
+    if (left >= right) {
+        return;
+    }
+    // Intercambia.
+    swap(v, left, rnd(left, right));
+    for (int i = left + 1; i <= right; i++) {
+        if (v[i] < v[left]) {
+            swap(v, ++last, i);
+        }
+    }
+    swap(v, left, last);
+    // Llama recursivamente para los fragmentos.
+    quicksort(v, left, last - 1);
+    quicksort(v, last + 1, right);
+}
+
+#endif // QUICKSORT_H
index 127754b2b1fed3b0b92e9f5e48a60f98050377a8..398f82c090fb36fddc95f083c7bd4d31e3935729 100644 (file)
@@ -37,12 +37,12 @@ Unicode::~Unicode(void) {
     std::cerr << "En destructor de Unicode." << std::endl;
 #endif
 }
-#include <iostream>
-bool Unicode::is_endl(void) {
+
+bool Unicode::is_endl(void) const {
 #ifdef DEBUG
     std::cerr << "En Unicode::is_endl()." << std::endl;
 #endif
-    // Si los últimos 8 bits son 0xA = 10 = '\n' devuelve true.
+    // Si los primeros o últimos 8 bits son 0xA = 10 = '\n' devuelve true.
     return (static_cast<char>(caracter) == '\n')
         || (static_cast<char>(caracter >> 8) == '\n');
 }
@@ -55,14 +55,22 @@ Unicode& Unicode::operator=(const Unicode& unicode) {
     return *this;
 }
 
-bool Unicode::operator<(const Unicode& unicode) {
+Unicode& Unicode::operator=(short c) {
+#ifdef DEBUG
+    std::cerr << "En operator= de Unicode (short)." << std::endl;
+#endif
+    caracter = c;
+    return *this;
+}
+
+bool Unicode::operator<(const Unicode& unicode) const {
 #ifdef DEBUG
     std::cerr << "En operator< de Unicode." << std::endl;
 #endif
     return caracter < unicode.caracter;
 }
 
-bool Unicode::operator==(const Unicode& unicode) {
+bool Unicode::operator==(const Unicode& unicode) const {
 #ifdef DEBUG
     std::cerr << "En operator== de Unicode." << std::endl;
 #endif
index 1dcdc8741cfb524593c746c9d79ccf7adcba6109..be95a549a237e053ba088959b644fc365b966d8c 100644 (file)
--- a/unicode.h
+++ b/unicode.h
@@ -49,16 +49,19 @@ class Unicode {
          * andar ya que el fin de línea se compone de 2 caracteres: 0xDA, por lo
          * tanto termina en 0xA y debería ser considerado fin de línea.
          */
-        bool is_endl(void);
+        bool is_endl(void) const;
 
         /// Asignación de una instancia a otra.
         Unicode& operator=(const Unicode& unicode);
 
+        /// Asignación de un short.
+        Unicode& operator=(short c);
+
         /// Comparación por menor de dos instancias.
-        bool operator<(const Unicode& unicode);
+        bool operator<(const Unicode& unicode) const;
 
         /// Comparación por igual de dos instancias.
-        bool operator==(const Unicode& unicode);
+        bool operator==(const Unicode& unicode) const;
 
         /// Cast a char.
         operator char(void) const;
index 5704ce63d7d2e09e637dbfa9a7e407c830e9bebe..245eac682a7bb27e46b53012ba2131e96fe34924 100644 (file)
  * $Id$
  */
 
-#include <iostream>
 #include "ascii.h"
 #include "unicode.h"
 #include "universalstring.h"
-#include <algorithm>
+#include "quicksort.h"
+#include <iostream>
+#include <vector>
 
 using namespace std;
 
 int main(void) {
 
     // Ascii.
-    UniversalString<Ascii> sa("Hola mundo");
-    cout << sa << endl;
+    UniversalString< Ascii > sa("Hola mundo");
+//    cout << sa << endl;
     cin >> sa;
     cout << sa << endl;
-
+/*
     // Unicode.
-    UniversalString<Unicode> su("Hola mundo");
+    UniversalString< Unicode > su("Chau mundo");
     cout << su << endl;
     cin >> su;
     cout << su << endl;
+
+    // Conversión.
+    sa = su;
+    cout << su << endl;
+*/
+    // Agrego cosas al vector para ordenar.
+    vector< UniversalString< Ascii > > v;
+    v.push_back(sa);
+    v.push_back(UniversalString< Ascii >("Hola mundo!"));
+    v.push_back(UniversalString< Ascii >("Chau mundo!"));
+    // Imprimo.
+    cout << "Sin ordenar (" << v.size() << "):" << endl;
+    for (int i = 0; i < v.size(); i++) {
+        cout << v[i] << endl;
+    }
+    // Ordeno.
+    quicksort(v, 0, 2);
+    // Imprimo.
+    cout << "Ordenado:" << endl;
+    copy(v.begin(), v.end(), ostream_iterator< UniversalString< Ascii > >(cout,
+                "\n"));
+    
     return 0;
 }
 
index 4ec4d56b412f9b604e69182bc17c3944cc116d94..44fb64d16b2add7b1f6a54a7ae3143e078096d52 100644 (file)
 #endif
 
 /// String Universal.
-template <class T>
+template < class T >
 class UniversalString {
 
         /// Cadena de caracteres.
-        std::vector<T> string;
+        std::vector< T > string;
 
     public:
 
@@ -45,12 +45,15 @@ class UniversalString {
         /// Constructor a partir de un string C.
         UniversalString(const char* str) {
 #ifdef DEBUG
-            std::cerr << "En constructor de UniversalString a partir de string C."
+            std::cerr << "En constructor de UniversalString desde string C."
                 << std::endl;
 #endif
             int len = strlen(str);
+            // Limpio cadena de caracteres anterior.
             string.clear();
+            // Reservo nuevo espacio.
             string.reserve(len);
+            // Agrego cada caracter.
             for (int i = 0; i < len; i++) {
                 string.push_back(str[i]);
             }
@@ -62,6 +65,7 @@ class UniversalString {
             std::cerr << "En constructor de copia de UniversalString."
                 << std::endl;
 #endif
+            string = str.string;
         }
 
         /// Destructor.
@@ -76,10 +80,31 @@ class UniversalString {
 #ifdef DEBUG
             std::cerr << "En operator= de UniversalString." << std::endl;
 #endif
+            // Asigno la cadena de caracteres del string str.
             string = str.string;
             return *this;
         }
 
+        /// Asignación de una instancia a otra de distinto tipo.
+        template < class T2 >
+        UniversalString& operator=(const UniversalString< T2 >& str) {
+#ifdef DEBUG
+            std::cerr << "En operator= de UniversalString de tipos distintos."
+                << std::endl;
+#endif
+            // Obtengo un vector con los caracteres del string str.
+            std::vector< T2 > v = str.to_vector();
+            // Limpio mi cadena de caracteres.
+            string.clear();
+            // Reservo el nuevo espacio para mi cadena.
+            string.reserve(v.size());
+            // Voy agregando caracter a caracter.
+            for (size_t i = 0; i < v.size(); i++) {
+                string.push_back(T(v[i]));
+            }
+            return *this;
+        }
+
         /// Comparación por menor de dos instancias.
         bool operator<(const UniversalString& str) {
 #ifdef DEBUG
@@ -96,31 +121,33 @@ class UniversalString {
             return string == str.string;
         }
 
-        /// Cast a string C.
-        //operator char*(void);
+        /// Devuelve un vector de caracteres T.
+        std::vector< T > to_vector(void) const {
+            return string;
+        }
 
         /// Volcado a un stream de salida.
         friend std::ostream& operator<<(std::ostream& out,
-                const UniversalString<T>& str) {
+                const UniversalString< T >& str) {
 #ifdef DEBUG
             std::cerr << "En operator<< de UniversalString." << std::endl;
 #endif
             // Copio el vector de caracteres al stream de salida.
             std::copy(str.string.begin(), str.string.end(),
-                    std::ostream_iterator<T>(out, ""));
+                    std::ostream_iterator< T >(out, ""));
             return out;
         }
 
         /// Captura desde un stream de entrada.
         friend std::istream& operator>>(std::istream& in,
-                UniversalString<T>& str) {
+                UniversalString< T >& str) {
 #ifdef DEBUG
             std::cerr << "En operator>> de UniversalString." << std::endl;
 #endif
             // Limpio la cadena actual.
             str.string.clear();
-            T c;
             // Obtengo primer caracter, incluyendo espacios.
+            T c;
             in >> std::noskipws >> c;
             // Mientras que no sea el fin de línea, sigo leyendo caracteres.
             while (!c.is_endl()) {