COMPUTACIÓN Ejercicio 1 : SOLUCIÓN DE LA ECUACIÓN DE SEGUNDO GRADO. Dada la ecuación de segundo grado: hay que calcular el discriminante: Se pueden presentar tres casos distintos: Si discr >0.0 las dos raíces son reales y distintas, y valen: Si discr = 0.0 las dos raíces son reales e iguales, y valen: Finalmente, si discr < 0.0 las dos raíces son complejas conjugadas. Las partes real e imaginaria valen: Teclea y compila el siguiente programa para resolver la ecuación de segundo grado. Llámalo ec2.c. Compila y ejecuta este programa cambiando los valores de a, b y c, de modo que se prueben las tres opciones del programa. Solución comentada al Ejercicio // resolución de la ecuación de segundo grado #include <stdio.h> #include <math.h> // incluye decl. de la función sqrt() void main(void) { double a, b, c; double discr, x1, x2, xd, xr,xi; printf("Escribe los valores de los coeficientes A, B y C\n"); scanf("%lf%lf%lf", &a, &b, &c); discr = b*b - 4.0*a*c; if (discr>0.0) { x1 = (-b+sqrt(discr))/(2.0*a); x2 = (-b-sqrt(discr))/(2.0*a); printf("\nLas dos raíces reales son: %12.6e y %12.6e \n", x1, x2); } else if (discr<0.0) { xr = -b/(2.0*a); xi = sqrt(-discr)/(2.0*a); printf("\nRaices complejas:\n"); printf("(%12.6e, %12.6ei) y (%12.6e, %12.6ei)\n", xr, xi, xr, -xi); } else { x1 = -b/(2.0*a); printf("\nLas dos raíces son iguales y valen: %12.6e \n", x1); } } Comentario: Incluyendo la librería math.h se puede usar las funciones matemáticas tales como sqrt(), para la raíz cuadrada; cos() para calcular el coseno de un ángulo, etc. La instrucción if...else permite hacer una bifurcación, dependiendo de la cual se realizarán diferentes actividades. Ingeniería Eléctrica y Electrónica 1 COMPUTACIÓN Ejercicio 2: PROGRAMA QUE SUMA LOS CINCO PRIMEROS NÚMEROS NATURALES. Se presenta a continuación un programa que utiliza la sentencia while para definir un bucle. El programa sumará de forma automática los cinco primeros números naturales. Sálvalo con el nombre suma_int.c. Solución comentada al Ejercicio // Programa para calcular la suma de los enteros del 1 al 5 #include <stdio.h> void main(void) { int i = 1, suma = 0; while (i <= 5) { // se ejecuta el bloque mientras i<=5 suma += i; // equivale a suma=suma+i; ++i; // equivale a i=i+1; } printf("suma = %d\n", suma); } Comentario: El bucle while realiza la sentencia simple o compuesta que le sigue mientras la condición definida entre paréntesis sea verdadera (es decir distinta de cero). El bucle while del programa anterior podía también haberse escrito en la siguiente forma (más compacta): while (i <= 5) suma += i++; // se ejecuta el bloque mientras i<=5 // equivale a suma=suma+i e i=i+1; No hacen falta las llaves porque sólo hay una sentencia simple detrás del while. 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. Solución comentada al Ejercicio /* Programa para sumar los enteros del 1 al 5 */ #include <stdio.h> main() { int i=1, suma = 0; for ( ; i <= 5 ; ) /* primera forma */ { suma += i; ++i; } printf("suma 1 = %d\n", suma); suma = 0; /* segunda forma */ for ( i = 1; i <= 5; ++i) suma += i; Ingeniería Eléctrica y Electrónica 2 COMPUTACIÓN printf("suma 2 = for( i = 1, suma ; printf("suma 3 = for( i = 1, suma ; printf("suma 4 = %d\n", suma); = 0; i <= 5 ; ++i, suma+=i) /* tercera forma */ %d\n", suma); = 0; i <= 5 ; suma+=i, ++i) /* cuarta forma */ %d\n", suma); } Comentario: Para definir un bucle hace falta un contador o variable de control (que casi siempre es un entero y suele nombrarse con las letras típicas de subíndices: i, j, k, l,...). Esta variable de control es la que se chequea cada vez que comienza el bucle y la que permite continuar o no realizando las operaciones de dentro del bucle. Por otra parte, en C, el bucle for tiene tres componentes separadas por punto y coma: la primera es una inicialización de la variable de control (u otras que pudieran afectar al bucle), la segunda es la sentencia de chequeo de la variable de control que siempre es necesaria (véase la primera forma); por último, la tercera son sentencias de actualización que se ejecutan al final del bucle (que también se podrían poner entre las llaves del bucle, detrás de las demás sentencias). Conociendo estas características, la forma más habitual de expresar un bucle es la segunda, ya que el bucle for contiene las instrucciones pertinentes a la variable de control. La forma primera es más asimilable a un bucle while, ya que la instrucción for contiene sólo el chequeo de la variable. La diferencia entre las formas tercera y cuarta es el orden en que se ejecutan las instrucciones: la forma tercera ejecuta antes el incremento de la variable que el chequeo y la suma, por tanto cuando i vale 6 ya se ha sumado a la variable suma y, por eso el resultado sale 20 en lugar de 15. Ejercicio 4: Máximo elemento de un conjunto de números. Este programa calcula el máximo entre un conjunto de números enteros. Para ello se sigue el siguiente algoritmo: se crea una variable llamada max, a la que se da inicialmente el valor de conjunto[0]. Luego se recorren paso a paso todas las posiciones del vector, comparando el valor almacenado en la posición considerada del vector con el valor de la variable max. Si el valor de la posición considerada del vector es mayor que max entonces se copia (se sustituye el valor) en la variable max este valor. De esta forma, una vez recorrido todo el vector, la variable max contendrá el máximo valor. Guárdalo con el nombre maximo.c. Solución comentada al Ejercicio /* Programa para calcular el m ximo de un conjunto de n£meros */ #include <stdio.h> #define SIZE 5 void main(void) { int i, max, imax; int conjunto[SIZE]; printf("Introduzca %d valores:\n", SIZE); for (i=0; i<SIZE; i++) { Ingeniería Eléctrica y Electrónica 3 COMPUTACIÓN printf("%d: ", i+1); scanf("%d", &conjunto[i] ); printf("\n"); } max = conjunto[0]; imax = 0; for (i=0; i<SIZE ; i++) { if (conjunto[i] > max) { max = conjunto[i]; imax = i; } } printf("\nEl máximo valor del conjunto es: %d.\n", max); printf("\ny está en la posición %d.\n", imax+1); } Comentario: Este programa es muy sencillo, si se entiende el algoritmo. La variable max acabará siendo igual al elemento mayor del conjunto, e imax indicará la posición del máximo. Ejercicio 5: Escriba un programa que halle el menor de dos números pedidos al usuario. /* Calculo del menor de dos numeros dados */ #include <stdio.h> main() { int menor, numero1, numero2; printf("\nEscriba el primer numero y pulso INTRO: "); scanf("%d",&numero1); printf("\nEscriba el segundo numero y pulso INTRO: "); scanf("%d",&numero2); if (numero1 < numero2) menor=numero1; else menor=numero2; /* la sentencia if-else es equivalente a: menor=numero1<numero2 ? numero1 : numero2; */ printf("\nEl menor de %d y %d es %d\n",numero1, numero2, menor); } Ejercicio 6: Escriba un programa que calcule el factorial de un número. /* Factorial de un numero */ #include <stdio.h> main() { int i, numero, factorial=1; printf("\nEscriba un numero entero para calcular su factorial: "); scanf("%d",&numero); for (i=numero; i>1; --i) factorial *= i; Ingeniería Eléctrica y Electrónica 4 COMPUTACIÓN printf("\n%d! = %d\n",numero,factorial); } Ejercicio 7: Escriba un programa que muestre una tabla de conversiones de temperatura de grados Farenheit a grados Celsius, de 0ºF a 300ºF de 20 en 20ºF. /* Sistema de temperaturas */ #include <stdio.h> main() { int i; float c; for (i=0;i<=300;i+=20) { c=(5./9)*(i-32); printf("%3d grados Farenheit equivalen a %4.4f grados Celsius\n",i,c); } Ingeniería Eléctrica y Electrónica 5