Prácticas de C++ Practica Nº 2 Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Practica Nº2 Programación en C++ Pág. 1 ÍNDICE ÍNDICE..................................................................................................................................................................... 1 1. Introducción................................................................................................................................................. 1 1.1 Ejercicio 1: Pasando argumentos a main()........................................................................................... 1 1.2 Ejercicio 2: Mi primer bucle FOR. ........................................................................................................ 2 1.3 Ejercicio 3: varias formas de utilizar el bucle for. ............................................................................... 2 1.4 Ejercicio 4: Sacando por consola todos los argumentos pasados a main(). ......................................... 3 1.5 Ejercicio 5: Mi primer menú. ............................................................................................................... 3 1.6 Ejercicio 6: Calculando el mayor de un conjunto de números enteros. ............................................... 4 1.7 Ejercicio 7: Calculando el menor de un conjunto de números enteros. ............................................... 5 1.8 Ejercicio 8: Calculando el mayor en valor absoluto de un conjunto de números enteros. ................... 5 1.9 Ejercicio 9: Calcular el factorial ......................................................................................................... 5 1.10 Ejercicio 10: Programa de Encriptación............................................................................................... 5 1. Introducción. Vamos a empezar con la segunda práctica de C++, y como recomendación general, recuerde no utilizar caracteres extraños en los nombres de los directorios ni de los ficheros que va a generar. Tampoco utilice el espacio dentro de un nombre. Recuerde que debe tratar de hacer todos los ejercicios. Si no lo logra en las 2 horas, hágalo en otra hora que disponga de un PC. 1.1 Ejercicio 1: Pasando argumentos a main(). Todos los argumentos que se le pasan al programa desde la línea de comandos (ventana del MS-DOS) se reciben en un array de caracteres, esto quiere decir que si pasamos un número, este es leído como una cadena de caracteres, con lo cual no se puede utilizar para hacer operaciones aritméticas. En este ejercicio vamos a ver cómo convertimos esas cadenas de caracteres en números, enteros o reales. Debe crear el proyecto Ejer1, el fichero Ejer1.cpp y escribir el siguiente código: #include <iostream.h> void main(int num, char *cadena[]) { cout << "Numero de argumentos: " << num; } Compile este proyecto y ejecute el programa desde la consola de comandos, pasándole un número real: G:\Info2> Ejer1 25.6 La salida que obtendrá será: Numero de argumentos: 2 Recuerde que también puede ejecutar el programa desde el entorno, pero tiene que pasarle los argumentos desde Projects -> Settings ->Debug -> Program Arguments. Ahora que ya sabemos que en la variable num de la función main() viene el número de argumentos, ya podemos obtener el argumento en cuestión, el cual viene en el siguiente argumento (char *cadena[]). Con el siguiente código vamos a obtener la sqrt() del número que nos han pasado como argumento. No hace falta crear un nuevo proyecto, utilice el mismo: #include <iostream.h> Informática II – Fundamentos de Programación - Tecnun Practica Nº2 Programación en C++ Pág. 2 #include <math.h> //para atof y sqrt void main(int num, char *cadena[]) { if (num == 1 ){ cout << "Pasar un número real como parámetro" << endl; }else{ double valor = atof(cadena[1]); double res = sqrt(valor); cout << "Resultado: " << res << endl; } } Se utiliza la función atof(), definida en el fichero math.h, para realizar la conversión de caracteres a una variable numérica tipo double. En la posición 1 del array (cadena[1]) viene el argumento 1, en la dos el siguiente y así sucesivamente hasta num-1. Recuerde que esto es porque en C++ los índices empiezan en cero. Este programa detecta si no se le ha pasado ningún argumento desde la línea de comandos. Pruebe a ejecutar el programa y no le pase argumentos, obtendrá un mensaje. 1.2 Ejercicio 2: Mi primer bucle FOR. En este ejercicio va a hacer su primer bucle for. Para ello es necesario echar mano de los apuntes (sentencias de control) para ver cuál es la forma general del bucle for. Para este ejercicio, debe crear un proyecto nuevo Ejer2, con un fichero mi_for.cpp. Yo le voy a dar el código del bucle for pero el código anterior tiene Ud. que ponerlo. En el ejercicio se trata de generar una serie de números aleatorios entre 0 y 1. La cantidad de números a generar tiene que se pasada como argumento al programa (desde la consola, por ejemplo g:\Info2\>ejer2 10), para lo cual utilizarás la variable entera Num: . . . int Num = atoi(cadena[1]); for (int i=0;i<Num;i++){ double val = rand()/32767.0; cout << "Numero: " << i+1 << " Valor:"<< val << endl; } . . . La función rand() ( utiliza math.h ) genera un número entero aleatorio entre 0 y 32767 y la función atoi(char *) convierte una cadena de caracteres en un número entero (es necesario declarar el fichero stdlib.h al inicio del programa, usando la directiva #include del preprocesador). 1.3 Ejercicio 3: varias formas de utilizar el bucle for. En el siguiente programa se muestran distintas formas de escribir un bucle for para sumar los enteros del 1 al 5. Cree un proyecto llamado Ejer3, teclee con el editor de Visual C++ el siguiente programa y guárdelo con el nombre suma_for.cpp: // fichero suma_for.cpp #include <iostream.h> void main(void) { int i=1, suma=0; for( ; i<=5; ) { // forma 1 suma += i; ++i; } cout << "suma 1 = " << suma << endl; suma=0; Informática II – Fundamentos de Programación - Tecnun Practica Nº2 Programación en C++ Pág. 3 for(i=1; i<=5; ++i) // forma 2 suma += i; cout << "suma 2 = " << suma << endl; for(i=1, suma=0; i<=5; ++i, suma+=i) ; cout << "suma 3 = " << suma << endl; // forma 3 for(i=1, suma=0; i<=5; suma+=i, ++i) ; cout << "suma 4 = " << suma << endl; // forma 4 } La suma de los 5 primeros números enteros se ha realizado de 4 formas distintas. En la forma 1 se han dejado en blanco las partes de inicialización y actualización del bucle for; el resultado es correcto porque dichas tareas se han incluido de otra forma. La forma 2 es completamente estándar. En la forma 3 todo se ha introducido en el paréntesis del bucle; en la inicialización se da valor inicial tanto a i como a suma; en la actualización se modifica también tanto i como suma. El resultado es que el bucle sólo necesita una sentencia vacía, representada por el punto y coma (;). La forma 4 es una variante de la forma 3. Después de crear el proyecto, de compilar y de ejecutar este programa, observará que la forma 3 da un resultado diferente de las demás. ¿Sabría explicar por qué? ¿Puede corregirla? Puede utilizar el debugger para que le ayude a encontrar el error. 1.4 Ejercicio 4: Sacando por consola todos los argumentos pasados a main(). Ahora que ya sabe hacer un bucle for, puede hacer un programa que imprima por la consola todos los argumentos que se le pasan desde la línea de comandos. Cree un proyecto nuevo Ejer4 y en él debe crear ejer4.cpp. El programa que debe hacer será ejer4.exe, el cual al ejecutarlo deberá sacar algo así: Argumento 1: Valor: 10 Argumento 2: Valor: 13.5 Argumento 3: Valor: Mensaje 1.5 Ejercicio 5: Mi primer menú. En este ejercicio va a aprender a hacer un menú, desde el cual puede escoger distintas opciones. Lo va a implementar utilizando sólo sentencias if-elseif y sentencias for. Debe crear otro proyecto, Ejer5, y un fichero menu.cpp. El código es el siguiente: // fichero menu.cpp #include <iostream.h> #include <stdlib.h> //para system() y exit; void main(void) { int opcion; system("cls"); //borra la pantalla al inicio for(;;){ cout << "\tMi Menu" << endl; cout << "\t-------" << endl; cout << "1. Opcion 1" << endl; cout << "2. Opcion 2" << endl; cout << "3. Opcion 3" << endl; cout << "4. Opcion 4" << endl; cout << "5. Salir" << endl; //pedimos al usuario que escoja. cin >> opcion; Informática II – Fundamentos de Programación - Tecnun Practica Nº2 Programación en C++ } Pág. 4 //evaluamos la opcion escogida if (opcion==1) { cout << "\tHa elegido la opcion 1." }else if (opcion==2){ cout << "\tHa elegido la opcion 2." }else if (opcion==3){ cout << "\tHa elegido la opcion 3." }else if (opcion==4){ cout << "\tHa elegido la opcion 4." }else if (opcion==5){ cout << "Adios.." << endl; exit(0); //termina }else { cout << "Elija Bien..." << endl; } << endl; << endl; << endl; << endl; } Como podrá observar, el bucle for sin ningún parámetro se utiliza como un bucle infinito, esto quiere decir que nunca terminará, por eso se termina el programa por medio de la función exit(0). También puede probar a utilizar la sentencia break para salir del bucle for. En cada opción sólo se ha puesto una sentencia cout, pero podría ir allí todo el código que se desearía ejecutar cuando se elija dicha opción. 1.6 Ejercicio 6: Calculando el mayor de un conjunto de números enteros. Este programa calcula el mayor elemento entre un conjunto de números enteros que son pasados como argumentos al programa. Cuando veamos la teoría sobre array’s podemos hacer otra versión (la versión 1.1) que pida los números desde el teclado. Para el cálculo se utiliza el siguiente algoritmo: se crea una variable llamada Max, a la que se da inicialmente el valor del primer elemento pasado como argumento, previamente convertido a entero por medio de la función atoi(). Luego se recorren paso a paso todos los otros valores, por medio de un bucle for. Usamos una variable temporal tmp para obtener el siguiente valor, convertido a entero, y lo comparamos con el valor de la variable Max. Si el nuevo valor es mayor que Max (o Max menor que tmp) entonces se copia este valor en la variable Max. De esta forma, una vez que hayamos recorrido todos los valores, la variable Max contendrá el máximo valor del conjunto, pues cada vez que se ha encontrado un valor mayor que Max, esta variable se ha cambiado a dicho valor. La variable iMax indica la posición del último valor copiado a Max. Al final, iMax indicará en qué posición estaba el mayor elemento. Guarde este fichero con el nombre mayor.cpp (el proyecto correspondiente se deberá llamar Ejer6): // fichero mayor.cpp #include <iostream.h> #include <stdlib.h> //para atoi void main(int Num, char *cadena[]) { int iMax, Max; if (Num == 1) { cout << "Dar los numeros para hallar el mayor" << endl; exit(0); } iMax = 1; Max = atoi( cadena[1] ); for (int i=2; i<Num; i++){ int tmp = atoi( cadena[i] ); if ( Max < tmp ){ Max = tmp; //guarda el valor Informática II – Fundamentos de Programación - Tecnun Practica Nº2 Programación en C++ Pág. 5 iMax = i; } } cout << "El mayor es: " << Max; cout << " En la Posicion:" << iMax << endl; } Compile el programa y ejecútelo desde la línea de comandos, pasándole varios números: G:\info2\ejer6\>ejer6 10 15 4 22 18 34. Sería útil que usara el debugger para ver cómo van cambiando los valores de las variables i, Max, tmp e iMax. 1.7 Ejercicio 7: Calculando el menor de un conjunto de números enteros. Cree un proyecto Ejer7 y el fichero menor.cpp que permita calcular el menor de varios números reales pasados como argumentos, basándose en el programa anterior. 1.8 Ejercicio 8: Calculando el mayor en valor absoluto de un conjunto de números enteros. Para hacer este ejercicio se puede basar en el ejercicio 6, el que calcula el mayor de un conjunto de número enteros. Para calcular el valor absoluto de un número se utiliza la función abs(int) que está definida en el fichero math.h. Esta función trabaja de la siguiente manera: int x1=-5, x2; x2 = abs(x1); cout <<”Valor absoluto de “ << x1 << “ es “ << x2; Compile el proyecto Ejer8 y pásele unos números enteros, positivos y negativos. Tendrá que hallar el mayor en valor absoluto y la posición en la que se encuentra: G:\infor2\ejer8\ejer8 12 –25 4 16 10 El resultado tiene que ser 25 en la posición 2; 1.9 Ejercicio 9: Calcular el factorial Este ejercicio consiste en calcular el factorial de un número entero. El programa tiene que ver si el número al que se le va a calcular el factorial viene como argumento de main(), entonces hace el cálculo. Si no viene como argumento, el programa debe pedirle al usuario que ingrese el número por teclado y realizar el cálculo. Cree un nuevo proyecto Ejer9 y el fichero factorial.cpp para realizar este ejercicio. 1.10 Ejercicio 10: Programa de Encriptación Este ejercicio consiste en hacer un programa para encriptar un texto dado por el usuario. Esto se consigue hacer básicamente con el operador XOR. Para poder tomar todo lo escrito por el usuario, incluidos los espacios, utilizamos la función getline del flujo cin. #include <iostream.h> #include <string.h> //para strlen() void main() { int len; const int NUM=120; //num. maximo de caracteres. Informática II – Fundamentos de Programación - Tecnun Practica Nº2 Programación en C++ Pág. 6 char texto[NUM],key; cout << "Escriba un texto:"; cin.getline(texto,120); cout << "Introduzca la clave para codificar (un digito):"; cin >> key; len=strlen(texto); cout << "\n\t*** texto Codificado ***\n"; for (int i=0;i<len;i++){ texto[i] = texto[i] ^ key; //XOR } cout << texto << endl; } cout << "\n\t*** texto DeCodificado ***\n"; for (i=0;i<len;i++){ texto[i] = texto[i] ^ key; } cout << texto << endl; NOTA: Si no ha llegado hasta aquí, debe tratar de hacerlo en casa o en otras horas libres... Informática II – Fundamentos de Programación - Tecnun