1 /* vim: set et sts=4 sw=4 fdm=indent fdn=1 fo+=t tw=80:
3 * Taller de Programación (75.42).
6 * Ordena texto ASCII o Unicode.
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/).
12 * Creado: lun sep 29 01:37:10 ART 2003
19 #include "universalstring.h"
20 #include "quicksort.h"
29 typedef UniversalString< Ascii > StringA;
32 typedef UniversalString< Unicode > StringU;
34 /// Vector con strings ASCII.
35 typedef vector< StringA > VectorA;
37 /// Vector con strings Unicode.
38 typedef vector< StringU > VectorU;
41 * Dibuja el menú en pantalla.
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;
54 * Obtiene la selección del menú del usuario.
56 char get_entrada(void) {
58 cout << "Elija una opción: ";
60 // Ignoro hasta el próximo <enter>.
61 cin.ignore(4096, '\n');
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
70 void intercambiar(VectorA& va, VectorU& vu) {
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.
82 // Si no existe el índice, muestra error y sale.
84 cerr << "ERROR: No existe el índice " << n
85 << " en el vector ASCII." << endl;
88 // Si el destino es el vector ASCII.
91 // Si el destino es el vector ASCII.
92 } else if (dest == 'u') {
94 // Si es incorrecto, muestra error y sale.
96 cerr << "ERROR: Vector no válido ('" << orig
97 << "') debe ser 'a' o 'u'." << endl;
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;
108 // Si el destino es el vector ASCII.
111 // Si el destino es el vector ASCII.
112 } else if (dest == 'u') {
114 // Si es incorrecto, muestra error y sale.
116 cerr << "ERROR: Vector no válido ('" << orig
117 << "') debe ser 'a' o 'u'." << endl;
125 * Programa principal.
126 * Este es el programa que se encarga de resolver el trabajo práctico.
128 * \return EXIT_FAILURE si hubo un error, si no EXIT_SUCCESS.
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;
144 cerr << "ERROR: Debe elegir un número entre 1 y 6!" << endl;
145 entrada = get_entrada();
148 // Strings temporales para obtener entrada de usuario.
152 case '1': // Ingresa frase al vector ASCII
153 cout << "Ingrese frase al vector ASCII: ";
157 case '2': // Ingresa frase al vector Unicode
158 cout << "Ingrese frase al vector Unicode: ";
162 case '3': // Copia frase de vector a vector
163 intercambiar(va, vu);
165 case '4': // Ordena vectores
166 quicksort(va, 0, va.size() - 1);
167 quicksort(vu, 0, vu.size() - 1);
169 case '5': // Imprime vectores
170 cout << "Vector de strings ASCII:" << endl;
172 copy(va.begin(), va.end(),
173 ostream_iterator< StringA >(cout, "\n "));
175 cout << "Vector de strings Unicode:" << endl;
177 copy(vu.begin(), vu.end(),
178 ostream_iterator< StringU >(cout, "\n "));
184 cout << endl << endl;
186 entrada = get_entrada();