]> git.llucax.com Git - z.facultad/75.42/string.git/blob - tp4.cpp
Se agrega la carátula.
[z.facultad/75.42/string.git] / tp4.cpp
1 /* vim: set et sts=4 sw=4 fdm=indent fdn=1 fo+=t tw=80:
2  *
3  * Taller de Programación (75.42).
4  *
5  * Ejercicio Número 4:
6  * Ordena texto ASCII o Unicode.
7  *
8  * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
9  * Puede copiar, modificar y distribuir este programa bajo los términos de
10  * la licencia GPL (http://www.gnu.org/).
11  *
12  * Creado: lun sep 29 01:37:10 ART 2003
13  *
14  * $Id$
15  */
16
17 #include "ascii.h"
18 #include "unicode.h"
19 #include "universalstring.h"
20 #include "quicksort.h"
21
22 #include <vector>
23 #include <iostream>
24 #include <cstdlib>
25
26 using namespace std;
27
28 /// String ASCII.
29 typedef UniversalString< Ascii > StringA;
30
31 /// String Unicode.
32 typedef UniversalString< Unicode > StringU;
33
34 /// Vector con strings ASCII.
35 typedef vector< StringA > VectorA;
36
37 /// Vector con strings Unicode.
38 typedef vector< StringU > VectorU;
39
40 /**
41  * Dibuja el menú en pantalla.
42  */
43 void print_menu(void) {
44     cout << "Menu:" << endl;
45     cout << "      1. Ingresar frase al vector ASCII." << endl;
46     cout << "      2. Ingresar frase al vector Unicode." << endl;
47     cout << "      3. Copiar palabra de vector a vector." << endl;
48     cout << "      4. Ordenar vectores." << endl;
49     cout << "      5. Listar vectores." << endl;
50     cout << "      6. Salir." << endl;
51 }
52
53 /**
54  * Obtiene la selección del menú del usuario.
55  */
56 char get_entrada(void) {
57     char c;
58     cout << "Elija una opción: ";
59     cin >> c;
60     // Ignoro hasta el próximo <enter>.
61     cin.ignore(4096, '\n');
62     return c;
63 }
64
65 /**
66  * Copia una frase de un vector a otro (o el mismo).
67  * Pregunta por la entrada estándar los parámetros y muestra mensaje de error en
68  * caso de haberlo.
69  */
70 void intercambiar(VectorA& va, VectorU& vu) {
71     char orig;
72     char dest;
73     size_t n;
74     cout << "Ingrese el vector origen, vector destino e índice a "
75         "copiar separados por espacios ('a' para vector ASCII, 'u' "
76         "para vector Unicode. Ejemplo: 'a u 5'): ";
77     // Obtengo los 3 parámetros e ignoro el resto hasta el fin de línea.
78     cin >> orig >> dest >> n;
79     //cin.ignore(4096, '\n');
80     // Si el origen es el vector ASCII.
81     if (orig == 'a') {
82         // Si no existe el índice, muestra error y sale.
83         if (n >= va.size()) {
84             cerr << "ERROR: No existe el índice " << n
85                 << " en el vector ASCII." << endl;
86             return;
87         }
88         // Si el destino es el vector ASCII.
89         if (dest == 'a') {
90             va.push_back(va[n]);
91         // Si el destino es el vector ASCII.
92         } else if (dest == 'u') {
93             vu.push_back(va[n]);
94         // Si es incorrecto, muestra error y sale.
95         } else {
96             cerr << "ERROR: Vector no válido ('" << orig
97                 << "') debe ser 'a' o 'u'." << endl;
98             return;
99         }
100     // Si el origen es el vector Unicode.
101     } else if (orig == 'u') {
102         // Si no existe el índice, muestra error y sale.
103         if (n >= vu.size()) {
104             cerr << "ERROR: No existe el índice " << n
105                 << " en el vector Unicode." << endl;
106             return;
107         }
108         // Si el destino es el vector ASCII.
109         if (dest == 'a') {
110             va.push_back(vu[n]);
111         // Si el destino es el vector ASCII.
112         } else if (dest == 'u') {
113             vu.push_back(vu[n]);
114         // Si es incorrecto, muestra error y sale.
115         } else {
116             cerr << "ERROR: Vector no válido ('" << orig
117                 << "') debe ser 'a' o 'u'." << endl;
118             return;
119         }
120     }
121 }
122
123
124 /**
125  * Programa principal.
126  * Este es el programa que se encarga de resolver el trabajo práctico.
127  *
128  * \return EXIT_FAILURE si hubo un error, si no EXIT_SUCCESS.
129  */
130 int main(void) {
131     // Creo vectores.
132     VectorA va;
133     VectorU vu;
134     // Muestra menú.
135     print_menu();
136     // Obtengo entrada del usuario.
137     char entrada = get_entrada();
138     // Mientras no sea '6' (salir), se mantiene en el loop.
139     while (entrada != '6') {
140         // Mientras la entrada sea inválida, muestra mensaje de error.
141         while ((entrada < '1') || (entrada > '6')) {
142             cout << endl << endl << endl;
143             print_menu();
144             cerr << "ERROR: Debe elegir un número entre 1 y 6!" << endl;
145             entrada = get_entrada();
146         }
147         cout << endl;
148         // Strings temporales para obtener entrada de usuario.
149         StringA sa;
150         StringU su;
151         switch (entrada) {
152             case '1': // Ingresa frase al vector ASCII
153                 cout << "Ingrese frase al vector ASCII: ";
154                 cin >> sa;
155                 va.push_back(sa);
156                 break;
157             case '2': // Ingresa frase al vector Unicode
158                 cout << "Ingrese frase al vector Unicode: ";
159                 cin >> su;
160                 vu.push_back(su);
161                 break;
162             case '3': // Copia frase de vector a vector
163                 intercambiar(va, vu);
164                 break;
165             case '4': // Ordena vectores
166                 quicksort(va, 0, va.size() - 1);
167                 quicksort(vu, 0, vu.size() - 1);
168                 break;
169             case '5': // Imprime vectores
170                 cout << "Vector de strings ASCII:" << endl;
171                 cout << "    ";
172                 copy(va.begin(), va.end(),
173                         ostream_iterator< StringA >(cout, "\n    "));
174                 cout << endl;
175                 cout << "Vector de strings Unicode:" << endl;
176                 cout << "    ";
177                 copy(vu.begin(), vu.end(),
178                         ostream_iterator< StringU >(cout, "\n    "));
179                 cout << endl;
180                 break;
181             case '6': // Sale
182                 continue;
183         }
184         cout << endl << endl;
185         print_menu();
186         entrada = get_entrada();
187     }
188     // Salió todo ok.
189     return EXIT_SUCCESS;
190 }
191