C+ + PRACTICA Nº2 Practica Nº2 Programación en C++ Pág. 1 ÍNDICE ÍNDICE ........................................................................................................................................0 1. Introducción. .....................................................................................................................1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 Ejercicio 1: Pasando argumentos a main(). .......................................................................................... 1 Ejercicio 2: Mi primer bucle FOR. ........................................................................................................ 2 Ejercicio 3: varias formas de utilizar el bucle for................................................................................. 2 Ejercicio 4: Sacando por consola todos los argumentos pasados a main()........................................... 3 Ejercicio 5: Mi primer menú. ............................................................................................................... 3 Ejercicio 6: Calculando el mayor de un conjunto de números enteros................................................. 4 Ejercicio 7: Calculando el menor de un conjunto de números enteros................................................. 5 Ejercicio 8: Calculando el mayor en valor absoluto de un conjunto de números enteros..................... 5 Ejercicio 9: Calcular el factorial.......................................................................................................... 5 1. Introducción. Vamos a empezar con la segunda práctica de C++, y como recomendación general, recuerda no utilizar caracteres extraños en los nombres de los directorios ni de los ficheros que vas a generar. Tampoco utilices el espacio dentro de un nombre. Recuerda que debes tratar de hacer todos los ejercicios. Si no lo logras en las 2 horas, hazlo en otra hora que dispongas de un PC. Os seguimos animando a que intentéis hacer vosotros mismos modificaciones y variaciones, incluso hay veces que un mismo problema puede resolverse de varias maneras diferentes que son igualmente correctas. 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. Crea un proyecto Ejer1 y en él crea un fichero Ejer1.cpp. Agrega el siguiente código: #include <iostream.h> void main(int num, char *cadena[]) { cout << "Numero de argumentos: " << num; } Compila este proyecto y ejecuta el programa desde la consola de comandos, pasándole un número real: G:\Info2> Ejer1 25.6 La salida que obtendrás será: Numero de argumentos: 2 Recuerda que también puedes ejecutar el programa desde el entorno, pero tienes 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[]). Informática II – Fundamentos de Programación - Tecnun Practica Nº2 Programación en C++ Pág. 2 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, utiliza el mismo: #include <iostream.h> #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. Recuerda 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 comando. Prueba a ejecutar el programa y no le pases argumentos, obtendrás un mensaje. 1.2 Ejercicio 2: Mi primer bucle FOR. En este ejercicio vas a hacer tu primer bucle for. Para ello es necesario echar mano de los apuntes dados esta semana para ver cuál es la forma general del bucle for. Para este ejercicio, crea un proyecto nuevo Ejer2, con un fichero mi_for.cpp. Yo te voy a dar el código del bucle for pero el código anterior tienes que ponerlo tú solo. 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. Crea un proyecto llamado Ejer3, teclea con el editor de Visual C++ el siguiente programa y guárdalo 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; Informática II – Fundamentos de Programación - Tecnun Practica Nº2 Programación en C++ Pág. 3 ++i; } cout << "suma 1 = " << suma << endl; suma=0; 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ás que la forma 3 da un resultado diferente de las demás. ¿Sabrías explicar por qué? ¿Puedes corregirla? Puedes utilizar el debugger para que te ayude a encontrar el error. 1.4 Ejercicio 4: Sacando por consola todos los argumentos pasados a main(). Ahora que ya sabes hacer un bucle for, puedes hacer un programa que imprima por la consola todos los argumentos que se le pasan desde la línea de comandos. Crea un proyecto nuevo Ejer4 y en él crea ejer4.cpp. El programa que debes 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 vas a aprender a hacer un menú, desde el cual puedes escoger distintas opciones. Lo vas a implementar utilizando sólo sentencias if-elseif y sentencias for. Debes 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; Informática II – Fundamentos de Programación - Tecnun Practica Nº2 Programación en C++ Pág. 4 cout << "4. Opcion 4" << endl; cout << "5. Salir" << endl; //pedimos al usuario que escoja. cin >> opcion; //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ás 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 puedes 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. Guarda 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; Informática II – Fundamentos de Programación - Tecnun Practica Nº2 Programación en C++ Pág. 5 Max = atoi( cadena[1] ); for (int i=2; i<Num; i++){ int tmp = atoi( cadena[i] ); if ( Max < tmp ){ Max = tmp; //guarda el valor iMax = i; } } cout << "El mayor es: " << Max; cout << " En la Posicion:" << iMax << endl; } Compila el programa y ejecútalo 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 usaras 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. Crea un proyecto Ejer7 y en él un fichero menor.cpp que permita calcular el menor de varios números reales pasados como argumentos. Básate en el programa anterior para hacerlo. 1.8 Ejercicio 8: Calculando el mayor en valor absoluto de un conjunto de números enteros. Para hacer este ejercicio te puedes 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; Compila el proyecto Ejer8 y pásale 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. Sino viene como argumento, el programa debe pedirle al usuario que ingrese el número por teclado y realizar el cálculo. Crea un nuevo proyecto Ejer9 y en él crea un fichero factorial.cpp para realizar este ejercicio. NOTA: Si no has llegado hasta aquí, debes tratar de hacerlo en casa o en otras horas libres... Informática II – Fundamentos de Programación - Tecnun