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