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"
31 typedef UniversalString< Ascii > StringA;
34 typedef UniversalString< Unicode > StringU;
36 /// Vector con strings ASCII.
37 typedef vector< StringA > VectorA;
39 /// Vector con strings Unicode.
40 typedef vector< StringU > VectorU;
43 * Dibuja el menú en pantalla.
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;
56 * Obtiene la selección del menú del usuario.
58 char get_entrada(void) {
60 cout << "Elija una opción: ";
62 // Ignoro hasta el próximo <enter>.
63 cin.ignore(4096, '\n');
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
72 void intercambiar(VectorA& va, VectorU& vu) {
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.
84 // Si no existe el índice, muestra error y sale.
86 cerr << "ERROR: No existe el índice " << n
87 << " en el vector ASCII." << endl;
90 // Si el destino es el vector ASCII.
93 // Si el destino es el vector ASCII.
94 } else if (dest == 'u') {
96 // Si es incorrecto, muestra error y sale.
98 cerr << "ERROR: Vector no válido ('" << orig
99 << "') debe ser 'a' o 'u'." << endl;
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;
110 // Si el destino es el vector ASCII.
113 // Si el destino es el vector ASCII.
114 } else if (dest == 'u') {
116 // Si es incorrecto, muestra error y sale.
118 cerr << "ERROR: Vector no válido ('" << orig
119 << "') debe ser 'a' o 'u'." << endl;
127 * Programa principal.
128 * Este es el programa que se encarga de resolver el trabajo práctico.
130 * \return EXIT_FAILURE si hubo un error, si no EXIT_SUCCESS.
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;
146 cerr << "ERROR: Debe elegir un número entre 1 y 6!" << endl;
147 entrada = get_entrada();
150 // Strings temporales para obtener entrada de usuario.
154 case '1': // Ingresa frase al vector ASCII
155 cout << "Ingrese frase al vector ASCII: ";
159 case '2': // Ingresa frase al vector Unicode
160 cout << "Ingrese frase al vector Unicode: ";
164 case '3': // Copia frase de vector a vector
165 intercambiar(va, vu);
167 case '4': // Ordena vectores
168 quicksort(va, 0, va.size() - 1);
169 quicksort(vu, 0, vu.size() - 1);
171 case '5': // Imprime vectores
172 cout << "Vector de strings ASCII:" << endl;
174 copy(va.begin(), va.end(),
175 ostream_iterator< StringA >(cout, "\n "));
177 cout << "Vector de strings Unicode:" << endl;
179 copy(vu.begin(), vu.end(),
180 ostream_iterator< StringU >(cout, "\n "));
186 cout << endl << endl;
188 entrada = get_entrada();