Prácticas de C++ Practica Nº 3 Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Practica Nº3 Programación en C++ Pág. 1 ÍNDICE ÍNDICE ........................................................................................................................................ 1 1. Introducción...................................................................................................................... 1 1.1 Ejercicio 1: Usando mi primer array .......................................................................... 1 1.2 Ejercicio 2: Pasando los límites al ejercicio anterior. ................................................ 2 1.3 Ejercicio 3: Calculando el Mayor y el Menor de un conjunto de números................ 2 1.4 Ejercicio 4: Ordenando un conjunto de números. ...................................................... 3 1.5 Ejercicio 5: Ordenar sin olvidar el desorden inicial................................................... 4 1.6 Ejercicio 6: Jugando con las “cadenas”...................................................................... 4 1.7 Ejercicio 7: Buscando palabras. ................................................................................. 5 1. Introducción. Ha llegado el momento de empezar a trabajar con los Array’s, para lo cual se le dará una pequeña introducción en el tema: • Un array (también conocido como arreglo, vector o matriz) es una colección de variables relacionadas a las que se hace referencia por medio de un nombre en común. Es un modo de manejar una gran cantidad de datos del mismo tipo bajo un mismo nombre o identificador. • Su forma general es: tipo nombre[ tamaño ] Ejemplo double datos[10] : En esta sentencia se reserva espacio para 10 variables de tipo double, las cuales se van a manejar por medio del nombre datos y un índice, el cual en C++ siempre empieza por “cero”. • Los elementos se enumeran desde 0 hasta (n-1). Hay que tener mucho cuidado de no sobre-pasar las dimensiones del array, en cuyo caso daría error el programa. – Si queremos acceder al primer elemento del ejemplo anterior: datos[0]=2.5; Al segundo: datos[1]=4.5; Y así sucesivamente hasta el último valor: datos[9]=3.5; 1.1 Ejercicio 1: Usando mi primer array En este ejercicio vamos a generar una cantidad constante de números aleatorios entre dos límites A y B dados por el usuario y los vamos a introducir en un array de doubles. Sacaremos por la consola dichos números con sus correspondientes raíces cuadradas, para lo cual usaremos algunos manipuladores vistos en clase: #include <iostream.h> #include <math.h> //para sqrt() #include <stdlib.h> //para rand() #include <iomanip.h> #define NUM 15 void main() { double datos[NUM]; //array double A,B; //limites cout << "Dar limite A y B:"; cin >> A >> B; //generacion de numeros con For for (int i=0;i<NUM;i++){ double x = (double)rand()/RAND_MAX; //entre 0 y 1 datos[i] = A + x * (B - A); //entre A y B Informática II – Fundamentos de Programación - Tecnun Practica Nº3 Programación en C++ Pág. 2 } //imprimir datos con While i=0; while(i<NUM){ cout << "Num:"<< setw(8) << setprecision(5) << datos[i]; cout << " Sqrt:"<< sqrt(datos[i]) << endl; i++; } } //fin de main 1.2 Ejercicio 2: Pasando los límites al ejercicio anterior. El objetivo de este ejercicio es hacerle una mejora al ejercicio anterior, la cual consiste en que el programa sea capaz de detectar si se le han pasado los límites A y B a través de los argumentos de main. En el caso en que no se le pasaran los argumentos, el programa debe pedirlos. Y en caso de que sólo se le pasara un argumento, debe asumir que es el límite A y debe pedir al usuario que ingrese el límite B. Para el desarrollo de este ejercicio no es necesario que cree un proyecto ni fichero nuevo, puede utilizar el del ejercicio 1. 1.3 Ejercicio 3: Calculando el Mayor y el Menor de un conjunto de números. En este ejercicio vamos a hacer la versión 1.1 del ejercicio 6 de la práctica No. 2, en el que se calculaba el mayor elemento de un conjunto de números enteros. En este caso, los datos serán pedidos por el programa y se irán almacenando en un array. El objetivo de este ejercicio es calcular no solo el mayor, sino también el menor elemento de un grupo de números enteros. Todo esto lo haremos en un solo bucle. Los pasos que debe seguir son: 1- Debe crear un array de datos de tipo int, para almacenar hasta 10 elementos. Por ejemplo int datos[10]; 2- Debe crear dos variables tipo int: iMax, iMin, en las cuales se almacenará el valor máximo y el mínimo. 3- Si lo cree necesario, puede crear más variables temporales que le ayuden a hacer los cálculos. 4- Luego debe pedir por teclado al usuario que introduzca los elementos, uno a uno, y los debe ir almacenando en el array. 5- Es momento de hacer el algoritmo de calcular el máximo y mínimo. 6- Finalmente sacará por la consola todos los elementos, tal como han sido introducidos y luego cual es el mayor, cuál es el menor del conjunto y sus respectivas posiciones. Este ejercicio tiene dos pasos, para lo cual debe generar un solo proyecto: Ejer3. Para el primer paso debe generar un fichero MayMinFor.cpp en el que hará el programa, según las indicaciones anteriores, sólo con sentencias For (donde deba usar los bucles). El segundo paso es hacer lo mismo pero con la sentencia While o Do-While en lugar de for, para lo cual hará otro fichero MayMinWhile.cpp. Informática II – Fundamentos de Programación - Tecnun Practica Nº3 Programación en C++ Pág. 3 1.4 Ejercicio 4: Ordenando un conjunto de números. En este ejercicio vamos a ordenar un conjunto de números introducidos por el usuario, a través del teclado. Primero, el programa debe pedir al usuario de qué forma desea ordenarlos: ascendente o descendente. Debe Ud. crear un proyecto nuevo Ejer4 y en él un fichero ordena.cpp, en el que pondrá el siguiente código: #include <iostream.h> #define NUM 10 void main(void) { int dato[NUM]; bool ord=false; //true:ascend false=descen. char ch; while(true){ cout << "\nOrdenar descendente (D) o Ascendente (A)?" ; cout << flush; //limpia buffer cin >> ch; //captura la tecla presionada if (ch=='A' || ch=='a') { ord=true; break; } else if (ch=='D' || ch=='d') { ord=false; break; } else cout << "Error, no ha elegido bien.\n"; } //introducir numeros cout << endl; for (int i=0;i<NUM;i++){ cout << "dame el dato[" << i << "]:"; cin >> dato[i]; } // algoritmo de ordenacion for (i=0;i<NUM-1;i++){ for (int j=i+1;j<NUM;j++){ int a=dato[i]; int b=dato[j]; if ( a < b && !ord) { // Descen dato[i] = b; dato[j] = a; } if ( a > b && ord){ //Ascend dato[i] = b; dato[j] = a; } } } // imprime numeros ordenados cout << "\nOrden elegido: " ; ord? cout << "Ascend" : cout << "Descend"; //operador ternario for ( i=0;i<NUM;i++){ cout << "\ndato[" << i << "]:" << dato[i]; } cout << endl; } Una vez que le ha funcionado el programa y lo ha entendido por completo, deberá reemplazar cada for por un while y cada while por un for. Esto lo hará en otro fichero ordena1.cpp (podría copiar el código de un fichero a otro y hacer lo cambios oportunos, para que no pierda tiempo en volver a escribirlo). Debe tener en cuenta la forma en que se compara la tecla presionada, cuyo valor está en la variable ch. También debe analizar la forma como utilizamos el operador ternario ( ? : ). Informática II – Fundamentos de Programación - Tecnun Practica Nº3 Programación en C++ Pág. 4 Para ordenar se usa un algoritmo sencillo, el llamado algoritmo de la burbuja que procede de la siguiente manera: se van recorriendo uno a uno todos los elementos del vector, desde el primero hasta el penúltimo (índice i). Cada uno de estos elementos se compara con el de todos los elementos siguientes (índice j). Si se encuentra un elemento j con un valor menor o mayor que i (según sea el caso) se intercambian dichos elementos, pues están desordenados Así pues, para implementar este algoritmo son necesarios dos bucles: el primero, bucle i, recorre el vector desde la posición i= 0 hasta i < NUM-1. El segundo bucle, bucle j, recorre el vector desde la posición j= i+1 hasta el final. 1.5 Ejercicio 5: Ordenar sin olvidar el desorden inicial Este ejercicio consiste en guardar los datos dados al inicio en el ejercicio anterior, con el fin de mantener los datos desordenados, tal cual fueron introducidos. Para este ejercicio puede utilizar el proyecto anterior, pero debe crear un nuevo fichero Ordena2.cpp, en el cual va a copiar todo el código anterior. A partir de aquí empezará a hacer las modificaciones. Para desarrollar el ejercicio, debe crear otro array de enteros: int datoOld[NUM]; en el cual debe copiar los datos introducidos al inicio. Recuerde que el algoritmo de ordenación modifica el vector. Finalmente, debe sacar por la consola los dos array’s: a la izquierda el inicial y a la derecha el ordenado, tal como se ve en la siguiente figura: Orden elegido: Ascendente VecIni VecFin dato[0]: 1 1 dato[1]: 5 2 dato[2]: 9 5 dato[3]: 2 9 dato[4]: 40 40 1.6 Ejercicio 6: Jugando con las “cadenas”. En este ejercicio vamos a experimentar con algunas de las funciones utilizadas para el manejo de las cadenas, como por ejemplo escribir una cadena al revés, escribirla en mayúsculas, invertir las mayúsculas a minúsculas y viceversa. Debe crear un proyecto nuevo Ejer6 y en él crear el fichero cadena.cpp, en el cual escribirá el siguiente código: // fichero cadena.cpp #include <iostream.h> #include <string.h> #include <ctype.h> void main(void) { char cadena[120]; //para strlen() //para islower() cout << "Escribe una frase:" << endl; cin.getline(cadena,120); int len = strlen(cadena); cout << "Longitud de la cadena: " << len << endl; //escribir la cadena al revés cout << "Cadena al reves: " << endl << "\t"; Informática II – Fundamentos de Programación - Tecnun Practica Nº3 Programación en C++ Pág. 5 int val=len; //copia longitud while(val--){ cout << cadena[val]; } //convertir las May en Min y viceversa cout << "\nConvertir de May a Min y viceversa:\n"; for (int i=0;i<len;i++){ if ( islower( cadena[i] )) { //es minuscula? cout << (char)toupper(cadena[i]); //conv a may. }else { cout << (char)tolower(cadena[i]); //sino conv. a min. } } cout << endl; } Dentro de las funciones utilizadas tenemos: strlen( char* ): devuelve la longitud de la cadena, hasta encontrar el carácter nulo ‘\0’. islower( char ): esta función devuelve un true si el carácter está en minúsculas. toupper( char ): esta función convierte un carácter a mayúsculas. tolower( char ): convierte a minúsculas. No olvide poner siempre los ficheros de encabezado para poder usar estas funciones. 1.7 Ejercicio 7: Buscando palabras. Dada su experiencia ya con el manejo de las cadenas, demostrada en el ejercicio anterior, en este ejercicio debe hacer un programa que pida al usuario una frase y también que pida una palabra para buscar dentro de dicha frase. El programa debe decirle en qué posición ha encontrado dicha frase, en caso de haberla encontrado, sino deberá mostrar un mensaje diciendo que no ha encontrado dicha palabra. Por ejemplo: Frase: Esta es una demostración del uso de las cadenas con el lenguaje C++ Palabra a buscar: uso Resultado: Encontrada en la posición 30. Informática II – Fundamentos de Programación - Tecnun