You are on page 1of 7

Instrucciones: 1. Se debern empezar en la misma hoja del enunciado. Se podr utilizar nicamente una hoja adicional por ejercicio.

2. En caso de hacer dos ejercicios en la misma hoja o no escribir nombre/grupo se anular dicha hoja. 3. La ltima hoja es el borrador, se deber entregar aunque no se corregir. 4. No se podrn sacar hojas adicionales. Ejercicio 1. [7 puntos] Algoritmia. Quirksome squares El nmero 3025 tiene una peculiaridad: si se divide su representacin en dos enteros de igual longitud (30 y 25) entonces con la suma al cuadrado se obtiene el mismo numero: (30 + 25)2 = 3025 El objetivo de este problema es determinar todos los nmeros con esta propiedad que tiene un determinado numero par de dgitos. Por ejemplo, los nmeros de 4 dgitos van desde el 0000 hasta el 9999. Hay que tener en cuenta que los ceros iniciales deben de tenerse en cuenta, es decir, que 0001 que es un numero de 4 dgitos es un quirksome. El numero de digitos pede ser de 2, 4, 6 o 8 a eleccin por el usuario. Se pide hallar todos los quicksome de 4 dgitos. Ejemplo: de 2 seran quirksome: 00, 01, 81 Ejercicio 2. [7 puntos] Ejercicio de Mens- Programacin modular. Implementar un programa que muestre un men con las siguientes opciones: 1. [1 Punto] Funcin main en la que si el usuario pulsa 0, s o S saldr del men y acabar la ejecucin. 2. [3Puntos] Al pulsar 1 calcular la suma de los primeros N trminos de la siguiente serie(el denominador es un numero primo): 1 + 1/3 + 1/5 + 1/7 + 1/11... 3. [3 Puntos] Opcin 2 en la que el usuario escribir un nmero menor que 5000 y pasarlo a romano. Sugerencia: Se evaluar la implementacin y claridad del cdigo. Numero Romanos: I: Valor decimal 1. V: Valor decimal 5. X: Valor decimal 10. L: Valor decimal 50. C: Valor decimal 100. D: Valor decimal 500.

M: Valor decimal 1000. Ejemplos singulares: IV: Valor decimal 4. IX: Valor decimal 9. XL: Valor decimal 40. XC: Valor decimal 90. CD: Valor decimal 400. DM: Valor decimal 900. Ejercicio 3. [6 puntos] Ejercicio Terico y de anlisis. 1. [2 Puntos] Hay dos formas de evaluacin en un bucle while. Que est controlado por centinela o por indicadores(bandera). Escriba un algoritmo sencillo explicando la diferencia. 2. [1 Punto] (Operadores) El operador ternario equivale a un tipo de sentencia de seleccin. Exponga un ejemplo donde se vea claramente la correlacin entre ambos. 3. [3 Puntos] Explicar si el siguiente cdigo se encuentra sintcticamente bien, en caso de que se encuentre mal, indicarlo, explicar el por qu y ponerlo en la forma correcta, realizando una simulacin de ejecucin. Tambin se sabe que el uso de break no es aconsejable, escribir el cdigo eliminndolo. Finalmente escribir el algoritmo con el for de forma normal siguiendo la misma ejecucin en la que est escrito. Explicar, por ltimo la diferencia entre contador++ y ++contador. Hacer un ejemplo con una simulacin clara donde se vea la diferencia entre ambos(debe ser un cdigo diferente al mostrado). #include <stdio.h> int main(){ int contador = 0; unsigned long int max; printf( "Cuantos holas? " ); scanf( "%d", max ); for ( ; ; ) { if( contador < max ) { puts("Hola!') ; contador++; }else break; } return 0; } NOTA: No se cambiarn ni el tipo de variables ni se crearn bucles

adicionales. Se deber reescribir el cdigo correctamente, las modificaciones en el enunciado no se corregirn. 4. Un nmero es perfecto si al efectuar la suma de sus divisores (excepto l mismo) se obtiene dicho nmero. Por ejemplo, el nmero 6 es un nmero perfecto puesto que 3+2+1=6. Desarrollar un programa que, dado un nmero entero, compruebe si es o no perfecto. Respuesta: #include <stdio.h> int EsPerfecto (int) ; main() { int Perfecto, numero ; printf ("Introduce un nmero entero: ") ; scanf ("%d", &numero) ; Perfecto = EsPerfecto (numero) ; if (Perfecto) printf ("El nmero entero %d es perfecto\n", numero) ; else printf ("El nmero entero %d no es perfecto\n", numero) ; } int EsPerfecto (int numero) { int i, devuelve, suma=0 ; for (i=1; i<numero; i++) if ((numero % i) == 0) suma = suma+i ; if (suma == numero) devuelve = 1 ; else devuelve = 0 ; return devuelve ; }

} while (dato != 0) ; 7. Escribe una expresin en C usando la estructura de repeticin do_while que sea equivalente a la siguiente expresin for: printf ("Dame un nmero entero: ") ; scanf ("%d", &n) ; for (i=1; i<n; i++) a=a+i; a=a*2; (0.5 puntos) Respuesta: printf ("Dame un nmero entero: ") ; scanf ("%d", &n) ; if (n > 1) do { a=a+i; i++ ; } while (i < n) ; a = a * 2; 1. Escribe un programa en C que vaya solicitando nmeros reales por teclado hasta que se introduzca un 0. Tras la introduccin de los datos, el programa debe mostrar: - el valor medio (sin tener en cuenta el ltimo cero introducido) - si entre los nmeros introducidos haba o no alguno negativo. Respuesta: #include <stdio.h> int main() { int cont, negat ; flota x, suma ; cont = 0 ; suma = 0 ; negat = 0 ; printf ("Dame numeros reales. Acaba con el cero: ") ; scanf ("%f", &x) ; while (x != 0){ suma += x ; cont++ ; if (x < 0) negat = 1 ; scanf ("%f", &x) ; } if (cont > 0){ printf ("El valor medio es %4.2f\n", suma/cont) ; if (negat == 0) printf ("No habia negativos\n") ; else printf ("Habia numeros negativos.\n") ; } else printf ("No hay datos sobre los que calcular nada.\n") ; } Otra solucin vlida usando do_while:

1. Reescribe el siguiente fragmento de programa C a otro equivalente que use la estructura de repeticin do_while en lugar de la estructura de repeticin while: dato = 10; printf (Dame un nmero entero: ) ; scanf (%d, &ele) ; dato = dato + ele ; while (dato != 0) { dato = 10 ; printf (Dame un nmero entero : ) ; scanf (%d, &ele) ; dato = dato + ele ; } Respuesta: do { dato = 10 ; printf ("Dame un nmero entero: ") ; scanf ("%d", &ele) ; dato = dato + ele ;

#include <stdio.h> int main() { int cont, negat ; float x, suma ; cont = 0 ; suma = 0 ; negat = 0 ; do { printf ("Dame numeros enteros. Acaba con el cero: ") ; scanf ("%f", &x) ; suma += x ; cont++ ; if (x < 0) negat = 1 ; } while (x != 0); cont-- ; /* para no contar el 0 */ if (cont > 0){ printf ("El valor medio es %4.2f\n", suma/cont) ; if (negat == 0) printf ("No habia negativos\n") ; else printf ("Habia numeros negativos.\n") ; } else printf ("No hay datos sobre los que calcular nada.\n") ; } 1. Escribe una funcin que calcule la suma de todos los divisores de un nmero n dado incluyendo al nmero 1, pero no a l mismo. Por ejemplo, si n = 10, entonces la suma es 1+2+5=8. (0.5 puntos) Respuesta: include <stdio.h> int SumaDiv (int) ; int main() { int numero ; printf ("Introduce el valor del numero-> ") ; scanf ("%d",&numero) ; printf ("La suma de divisores del numero %d, (incluyendo al 1) es %d\n", numero, SumaDiv(numero)) ; } int SumaDiv (int n) { int i, suma = 1 ; for (i=2; i<n; i++) if (n % i == 0) suma = suma + i ; return suma ; } 5. Escribe un programa en C que muestre las tablas de multiplicar en pantalla (las tablas desde el 1 al 10). (0.5 puntos) Respuesta: #include <stdio.h>

int main() { int i, j ; for (i=1; i<=10; i++) for (j=1; j<=10; j++) printf("%d por %d es %d\n", i, j, i*j) ; } 7. Implementa un programa que vaya leyendo nmeros reales hasta que se hayan ledo 5 nmeros negativos, imprimiendo antes de finalizar la suma de los nmeros positivos ledos. (0.5 puntos) Respuesta: #include <stdio.h> int main() { float x, sum = 0.0 ; int nneg = 0 ; while (nneg < 5) { printf ("Dame numero: ") ; scanf ("%f", &x) ; if (x<0) nneg++ ; else sum += x ; } printf("La suma de positivos es %f\n",sum) ; return 0 ; } 1. Convierte el siguiente bucle for: for (i=0; i<10; i++) if (i==5) { printf ("i=%d\n",i) ; break ; } en un bucle while equivalente, que NO utilice la sentencia break. Se puede utilizar una variable booleana. (0.5 puntos) Respuesta: salir = 0 ; i=0; while ((i<10) && (salir==0)) { if (i == 5) { printf (" i=%d\n",i) ; salir = 1 ; }i ++ ; } 3. Implementa una funcin recursiva que dado un valor entero, calcule la suma de todos los nmeros enteros iguales y ms pequeos que l, hasta el 1. Por ejemplo, para el nmero 4, el programa debe devolver 10=4+3+2+1. (0.5 puntos) Respuesta: int suma (int n) {

if (n==1) return 1 ; else return (suma(n-1)+n) ; } 1. Escribe una funcin que reciba dos parmetros enteros n1 y n2 y devuelva la suma de todos los nmeros comprendidos entre 1 y n1 que sean mltiplos de n2. A continuacin escribe un programa que solicite la introduccin de dos nmeros enteros, invoque a la funcin anterior y muestre por pantalla el resultado devuelto. Respuesta: #include <stdio.h> int suma_multiplos (int n1, int n2) { int i, suma = 0 ; for(i=n2; i<=n1; i+=n2) suma += i ; return suma ; } int main() { int n1, n2, s ; printf ("Introduce dos nmeros enteros: ") ; scanf ("%d%d", &n1, &n2) ; s = suma_multiplos (n1, n2) ; printf ("La suma es %d\n", s) ; return 0 ; } 1. Se desea calcular la factura de la luz de una vivienda en funcin de los kilowatios/hora (kWh) consumidos, teniendo en cuenta la siguiente tabla de precios: 0.10 euros por kWh si el consumo est entre 0 y 100 kWh. 0.11 euros por kWh si el consumo est entre 101 y 150 kWh. 0.12 euros por kWh si el consumo es mayor de 150 kWh. Adems se establece una cuota fija de 5 euros, independientemente del consumo realizado. Escribe un programa que solicite los kWh consumidos y muestre la cantidad de euros a pagar. Respuesta: #include <stdio.h> int main() { int kwh; float precio; printf("Introduce los kWh consumidos: "); scanf("%d", &kwh); if( kwh <= 100 ) precio = kwh*0.1; else if( kwh <= 150 ) precio = kwh*0.11; else precio = kwh*0.12;

precio += 5; printf("Total a pagar: %f\n", precio); return 0; } 2. Escribe un programa que solicite dos nmeros enteros n1 y n2 y calcule el producto de todos los nmeros comprendidos entre n1 y n2 (ambos incluidos). Antes de calcular el producto, el programa deber comprobar que n1>0, n2>0 y n1<n2. En caso de que esta condicin no se cumpla, el programa volver a solicitar los datos, tantas veces como sea necesario, hasta que los datos sean vlidos. Respuesta: #include <stdio.h> int main() { int n1, n2, i, prod=1; do { printf("Introduce dos nmeros positivos: "); scanf("%d%d", &n1, &n2); }while( n1<=0 || n2<=0 || n1>=n2 ); for(i=n1; i<=n2; i++) prod *= i; printf("Producto = %d\n", prod); return 0; } 6. Implementa una funcin que devuelva si dos nmeros dados son amigos. Dos nmeros a y b son amigos si a es la suma de los divisores de b y b es la suma de los divisores de a, sin considerar la divisin entre s mismo. Por ejemplo 220 y 284 son nmeros amigos, ya que: Los divisores de 220 (sin contar l mismo) son 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 y 110, que suman 284. Los divisores de 284 son 1, 2, 4, 71 y 142, que suman 220. Escribe un programa que solicite dos nmeros enteros y, haciendo uso de la funcin anterior, muestre si son o no amigos. Respuesta: #include <stdio.h> int amigos( int, int ); int main() { int a, b; printf("Introduce dos nmeros enteros: "); scanf("%d%d", &a, &b); if( amigos(a,b)==1 ) printf("%d y %d son nmeros amigos\n", a, b); else printf("%d y %d no son nmeros amigos\n", a, b); return 0; } int amigos( int a, int b ) {

int i, sum1=0, sum2=0; for(i=1; i<a; i++) if( a%i == 0 ) sum1 += i; for(i=1; i<b; i++) if( b%i == 0 ) sum2 += i; return (sum1==b && sum2==a); } 3. Escribe una funcin recursiva que dado un numero entero decimal, lo imprima (por pantalla) en formato binario. Se pueden usar los operadores % y / (divisin entera). Ejemplo: Si el parmetro de entrada es 18, la salida de la funcin debe imprimir 10010. Nota: No importa si el nmero se imprime al revs, es decir, aceptaremos que la salida de la funcin sea, para el parmetro de entrada 18: 01001. Respuesta: Para imprimir el nmero correctamente: void binario(int n){ if (n != 0) { binario (n / 2) ; printf ("%d", n % 2) ; } } Pero tambin aceptamos como vlida la siguiente solucin: void binario (int n) { if (n != 0) { printf ("%d", n % 2) ; binario (n / 2) ; } } que imprime los valores al revs. 6. Escribe un programa en C que imprima los nmeros enteros que sean primos y menores que un numero dado. Para saber si un nmero es primo adems se debe implementar una funcin (que ser llamada por el programa principal) y que dado un nmero diga si es primo o no. Nota: se puede usar el operador %. Ejemplo. Para el 15, los primos son 1, 2, 3, 5, 7, 11, 13. Respuesta: #include <stdio.h> int esPrimo (int) ; int main() { int i, num ; printf ("Introduce un numero entero-->") ; scanf ("%d", &num) ; printf ("Los numeros primos menores que %d son\n", num) ; for (i=1; i<num; i++) if (esPrimo(i)) printf ("%d ", i) ;

return 0 ; } int esPrimo (int numero) { int i=2, no_divisible=1 ; while ((i<numero) && (no_divisible)) { if ((numero % i) == 0) no_divisible=0; i++; } return no_divisible ; }

1. Desarrolla un programa que calcule el precio de un billete de avin. Para ello, se parte de un precio base al que se le debe aplicar una serie de recargos o descuentos en funcin de ciertas situaciones aplicadas en el orden en que se dan. El programa deber solicitar los siguientes datos de entrada: precio base del billete, edad del pasajero, nmero de maletas a facturar y peso total del equipaje. Si se pretende facturar ms de dos maletas o el precio total del equipaje supera los 50 kilos, entonces no es posible emitir el billete y el programa mostrar un mensaje de error. En caso contrario, se calcular el precio del billete segn las siguientes reglas: si la edad del pasajero es menor o igual a 11 aos, se aplicar un descuento del 20% sobre el precio base. Por cada maleta facturada se aadir un sobrecargo de 30 euros. Adems, si el peso total del equipaje supera los 20 kilos, se aadir un recargo de 5 euros por cada kilo extra. SOLUCION: #include <stdio.h> int main() { float precio, kg ; int edad, num_maletas ; printf ("Introduzca el precio base del billete: ") ; scanf ("%f", &precio) ; printf ("Introduzca edad el pasajero: ") ; scanf ("%d", &edad) ; printf ("Introduzca nmero de maletas a facturar: ") ; scanf ("%d", &num_maletas) ; printf ("Introduzca el peso total del equipaje: ") ; scanf ("%f", &kg) ; if (num_maletas > 2 || kg > 50) printf ("No es posible expedir el billete\n") ; else { if (edad <= 11) precio *= 0.8 ; precio += num_maletas * 30; if (kg > 20) precio += (kg-20)*5 ; printf ("Precio total del billete: %f\n", precio) ; } return 0 ; }

2. Escribe un programa que solicite un nmero entero n y calcule la suma 1 + 1/2 + 1/3 + + 1/n. Antes de calcular la suma, el programa deber comprobar que n>0 y n<100. En caso de que esta condicin no se cumpla, el programa volver a solicitar los datos tantas veces como sea necesario hasta que sean vlidos.) SOLUCION: #include <stdio.h> int main() { int n, i ; float suma ; do { printf ("Introduzca valor de n (0-99): ") ; scanf ("%d", &n) ; if (n<=0 || n>=100) printf ("El valor debe estar entre 0 y 99\n") ; } while (n<=0 || n>=100) ; suma = 0 ; for (i=1; i<=n; i++) suma += (1.0/i) ; printf ("La suma de la serie es: %f\n", suma) ; return 0 ; } 1. Construye un programa que lea nmeros enteros introducidos por teclado hasta que el valor sea un cero (que no contabilizaremos). El programa debe indicar: - si en ese listado de nmeros ha aparecido alguno negativo; - la media aritmtica de todos los valores introducidos; - cuntos de ellos son mltiplos de 3. SOLUCION: #include <stdio.h> int main() { int dato, negativo, contmultiplos, cont, suma ; float media ; negativo = 0 ; cont = 0 ; contmultiplos = 0 ; suma = 0 ; media = 0 ; printf ("Dame numeros enteros. Acaba con 0: ") ; scanf ("%d", &dato) ; while (dato != 0) { cont++ ; suma += dato ; if (dato < 0) negativo = 1 ; if (dato % 3 == 0) contmultiplos++ ; scanf ("%d", &dato) ; } if (cont > 0) media = (float) suma / cont ; if (negativo == 0) printf("No han aparecido negativos.\n") ;

else printf ("Haba nmeros negativos.\n") ; printf ("La media ha sido %4.2f.\n", media) ; printf ("Hay %d nmeros mltiplos de 3.\n", contmultiplos) ; return 0 ; }

1. Dado el sueldo de un trabajador y sus aos de antigedad en la empresa, se proceder a modificar el sueldo segn los siguientes criterios: Si el sueldo es inferior a 1000: o Si la antigedad es inferior a 1 ao, el sueldo se incrementar un 10%. o Si la antigedad est entre 1 y 5 aos (ambos incluidos), se incrementar un 12%. o Si la antigedad es mayor de 5 aos, se incrementar un 14%. Si el sueldo est entre 1000 (incluido) y 2500 (no incluido): o Si la antigedad es inferior a 10 aos, se incrementar un 7%. o Si la antigedad es de 10 aos o ms, se incrementar un 5%. Si el sueldo est entre 2500 y 3500 (no incluido), no se modificar. Si el sueldo est entre 3500 y 5000 (no incluido), se reducir un 10%. Si el sueldo es mayor o igual que 5000, se reducir un 30%. Haz un programa que pida el sueldo y la antigedad e imprima el sueldo con el ajuste incorporado. SOLUCION: #include <stdio.h> int main(){ float sueldo ; int antiguedad ; printf ("Dame el sueldo: ") ; scanf ("%f", &sueldo) ; printf ("Antigedad: ") ; scanf ("%d", &antiguedad) ; if (sueldo < 1000) { if (antiguedad < 1) sueldo = sueldo * 1.1 ; else if (antiguedad <= 5) sueldo = sueldo * 1.12 ; else sueldo = sueldo * 1.14 ; } else if (sueldo >= 1000 && sueldo < 2500) { if (antiguedad >= 10) sueldo = sueldo * 1.07 ; else sueldo = sueldo * 1.05 ;

} else if (sueldo >= 3500 && sueldo < 5000) sueldo = sueldo * 0.9 ; else if (sueldo >= 5000) sueldo = sueldo * 0.7 ; printf ("El nuevo sueldo es de %.2f\n", sueldo) ; return 0 ; } 3. Escribe un programa que solicite dos valores reales y a continuacin muestre el siguiente men de opciones: 1.- Sumar 2.- Restar 3.- Multiplicar 4.- Dividir 5.- Salir Mientras no se escoja la opcin de salir, el programa deber realizar la operacin solicitada y mostrar por pantalla el resultado. En caso de que se introduzca una operacin incorrecta (valor menor que 1 o mayor que 5) deber mostrarse un mensaje de error y a continuacin volver a mostrar el men de opciones. Se valorar el uso de funciones. SOLUCION: #include <stdio.h> int menu() ; int main() { int x ; float a, b, res ; do { printf ("Dame dos valores reales: ") ; scanf ("%f%f", &a, &b) ; x = menu() ; switch (x) { case 1 : res=a+b ; break ; case 2 : res=a-b ; break ; case 3 : res=a*b ; break ; case 4 : res=a/b ; break ; case 5 : printf ("Se acaba la ejecucin\n") ; break ; default : printf ("Opcion incorrecta. Elige de nuevo.\n") ; } if (x>=1 && x<=4) printf ("El resultado es %f\n", res) ; } while (x != 5) ; } int menu() { int z ; printf ("Que operacin quieres hacer:\n ") ; printf ("1: sumar\n") ; printf ("2: restar\n") ; printf ("3: multiplicar\n") ; printf ("4: dividir\n") ; printf ("5: acabar\n") ; scanf ("%d", &z) ; return z ;

} 5. Escribe un programa que, dados dos nmeros enteros positivos a y b calcule el producto de ambos sin utilizar la operacin de multiplicacin (sumar b veces el valor de a). El programa deber cerciorarse de que los valores introducidos son positivos, para lo cual deber solicitar los datos tantas veces como sea necesario, hasta que stos sean vlidos. SOLUCION: #include <stdio.h> int main() { int a, b, res, i ; do { printf("Introduce dos nmeros enteros positivos: ") ; scanf("%d%d", &a, &b) ; if (a<=0 || b<=0) printf ("Datos incorrectos\n") ; } while (a<=0 || b<=0) ; res = 0 ; for (i=1; i<=b; i++) res += a ; printf ("%d x %d = %d\n", a, b, res) ; return 0 ; }

You might also like