ISBN 978-84-9747-287-6 9 788497 472876 Mª CARMEN ARANDA GARRIDO ANTONIO LUIS CARRILLO LEÓN JOSÉ GALINDO GÓMEZ JOSÉ ANTONIO GÓMEZ RUIZ JOSÉ LUIS LEIVA OLIVENCIA FUNDAMENTOS DE INFORMÁTICA FUNDAMENTOS DE INFORMÁTICA Mª Carmen Aranda • Antonio L. Carrillo • José Galindo • José A. Gómez • José L. Leiva 90 UNIVERSIDAD DE MÁLAGA / MANUALES Relación de Problemas del Capítulo 4 del libro FUNDAMENTOS DE INFORMÁTICA 192 Las llaves pueden eliminarse en el caso de que el cuerpo del bucle esté formado por una única instrucción, siendo obligatorio ponerlas cuando esté formado por más de una instrucción. El bucle do..while es quizás el bucle más versátil del lenguaje C. La sentencia break solo puede utilizarse dentro de una estructura switch, Para evitar bucles infinitos es una buena costumbre comprobar que las variables alcanzarán el valor que utilizamos en las condiciones del mismo. 4.7. EJERCICIOS PROPUESTOS 4.7.1. Nivel fácil 1. Realizar un programa que pida por teclado un número y nos indique si es par o impar. Utilice en la solución el operador %. 2. Realizar un programa que pida por teclado 3 números y nos indique el mayor y el menor. 3. Realizar un programa que pida por teclado el precio de un producto y el número de unidades que se va a comprar de dicho producto. En este comercio se realiza un 10% de descuento si el número de unidades sobrepasa las 10 unidades. En caso de que el precio sea inferior a 20€ no se hace descuento. Si es mayor o igual a 20€ y menor o igual que 100€ se hace un 3% de descuento, y si sobrepasa los 100€ y es menor de 300€ se le hace un 7%. En caso de que sea mayor o igual a los 300€ se le hace un 12% de descuento inicial. Para los casos donde el número de unidades sobrepase las 10 unidades y tenga ya descuento se le aplica un 12% de descuento. El programa debe devolver el precio final que tiene que pagar el cliente. 4. Realizar un programa que lea tres números cualesquiera y nos escribe en pantalla los tres números en orden ascendente. 5. Realizar un programa que lea por teclado cuatro números cualesquiera y nos indica todas sus relaciones de igualdad (si son los cuatro iguales, si dos son iguales y los otros dos no, si hay tres iguales, si son iguales dos a dos y si son todos distintos) 6. Realizar un programa que pida por teclado una fecha compuesta por día, mes y año y nos muestra en pantalla la fecha correspondiente al día siguiente.(Suponemos que todos los meses de Febrero tienen 28 días) 7. Una empresa de correos maneja códigos postales compuesto de números con las siguientes características: - Cada código consta de cinco dígitos. - Los dos primeros representan la provincia. - El tercero si vale 0 indica que es un código de la capital de la provincia y los dos siguientes sería el distrito; si el tercer dígito no es cero indica población junto a los dos últimos. FUNDAMENTOS DE INFORMÁTICA 193 Escriba un programa que lea de teclado un número de cuatro dígitos, almacenándolo en una variable de tipo int, y posteriormente imprima en pantalla la siguiente información. PROVINCIA CAPITAL: DISTRITO & PROVINCIA CAPITAL: DISTRITO & Sí && o bien No &&& En caso de que el número no tenga exactamente cinco dígitos2, en lugar del mensaje anterior, habrá que imprimir en pantalla el siguiente mensaje de error: ERROR: CODIGO INVALIDO. 8. Realizar un programa que sume los n primeros números impares desde la unidad hasta n, contando cuántos múltiplos de 3 existen. 9. Realizar un programa que permita introducir una lista de números (para terminar se introduce el número 0) y nos calcule la media aritmética de todos los números pares. 10. Realizar un programa que pida por teclado un número y nos muestra su tabla de multiplicar. 4.7.2. Nivel intermedio 11. Modifica el ejercicio número 6, teniendo en cuenta los años bisiestos. 12. La constante pi (3.1415...) es muy utilizada en matemáticas. Un método sencillo para calcular su valor es: Pi=4*(2/3)*(4/5)*(6/7)*... Realizar un programa que pida por teclado un número de términos y efectúe dicho cálculo. 13. Con objeto de fomentar el ahorro energético, se desea realizar un programa que permita introducir los valores del contador del mes pasado y el del día de hoy y nos calcule el total de la factura, sabiendo que se elabora de la siguiente manera: 2.50 € de gastos fijos 0.20 € para los primeros 100 Kw 0.35 € para los siguientes 100 Kw 0.50 € para los siguientes 200 Kw 1 € para los siguientes Kw. 2 Obligatoriamente el primer dígito tiene que tener un valor entre 1 y 9. FUNDAMENTOS DE INFORMÁTICA 194 14. Realizar un programa que nos pida por teclado un año inferior a 2100 y nos dice la fecha exacta del domingo de Ramos y el domingo de Resurrección (ver sección 4.5.2). 15. Codifique un programa que se comporte como una calculadora simple repetitiva. Para ello deberá tener las siguientes características: - Solo efectuará operaciones con dos operandos. - Operaciones permitidas: (+,-,*,/). - Se trabajará con operandos enteros. - Pedirá en primer lugar el operados, y a continuación los dos operandos. Si el operador no se corresponde con alguno de los indicados se emitirá un mensaje de error a excepción del carácter & que servirá para finalizar el programa. EJEMPLO: Operación : * Operando 1: 24 Operando 2: 3 Resultado : 72 Operación : / Operando 1: 24 Operando 2: 3 Resultado : 8 Operación : & FIN DEL PROGRAMA 16. El NIF está formado por el DNI y una letra. La utilidad de la letra es poder detectar errores al introducir un determinado DNI. La letra es simplemente un control de errores. El mecanismo es muy sencillo, se calcula el resto de dividir el DNI por 23. El resto que será un número entre 0 y 22 se le asigna respectivamente las siguientes letras: T, R, W, A, G, M, Y, U, P, D, X, B, N, J, Z, S, Q, V, H, L, C, K y E. Se escogió el 23 por ser el primo más grande que es menor que el número de letras. Codificar un programa que pida por teclado un DNI y su letra. El programa debe informar si el DNI introducido corresponde con esa letra y en caso de que no corresponda qué letra le corresponde. 17. Realizar un programa que pida por teclado dos números enteros y nos muestra en pantalla todos los números entre dicho intervalo cerrado. El programa no debe suponer que el primero será menor que el segundo. Además calcula cuántos múltiplos de seis existen en dicho intervalo. 18. Realizar un programa que lea de entrada un texto carácter a carácter hasta localizar un punto y dé como resultado el número de vocales introducidas y el número de caracteres leídos (lea los caracteres uno a uno utilizando un bucle). FUNDAMENTOS DE INFORMÁTICA 195 19. Confecciona un programa que pida por teclado un texto carácter a carácter y nos indique si se ha leído la cadena ‘abc’. 20. Efectuar un programa que lea los valores de n resistencias electrónicas (en Ohmnios) conectadas (el programa pide que informemos si están conectadas en paralelo o en serie) y muestre en pantalla el valor global. 4.7.3. Nivel avanzado 21. Escriba un programa que lea un número natural N y un carácter. La salida debe ser un rombo compuesto del carácter y de la anchura que especifica el número N (diagonal horizontal). Por ejemplo, si N es 4 y el carácter es ‘A’, el rombo sería A A A A A A A A A A A A A A A A 22. Realizar un programa que lea un conjunto de caracteres terminando en punto. El programa debe mostrar en pantalla la primera y última posición donde aparece la primera vocal, así como cuántas veces aparece dicha vocal. Por ejemplo, en la frase: esto es un ejemplo., mostraría en la pantalla primera posición que aparece vocal ‘e’ es 1 y la última 14 y el número de veces que aparece es 4. 23. Realizar un programa que permita calcular el combinatorio (m,n), es decir que calcule el número de partes de m elementos que se pueden tomar en un conjunto de n elementos. La expresión es n!/(m!(n-m)!) 24. Realizar un programa que lea un número natural N y nos indique todos sus divisores. 25. Diseñar un programa que encuentre el primer número perfecto mayor que 28. Un número es perfecto si coincide con la suma de sus divisores. Por ejemplo, 28 es perfecto porque 28=1+2+4+7+14. Posteriormente, modifica el programa para que muestre en pantalla los n primeros números perfectos. (No pongas un valor de n muy grande, prueba con 3, 4, etc.) 26. Diseñar un programa que pida por teclado un número natural N y muestre en pantalla su crápulo. El crápulo es el número que se obtiene de la siguiente forma: se suman los dígitos que lo componen. Si el valor de la suma es menor de 10, el crápulo es el valor obtenido; si no, el crápulo es el crápulo de la suma de los dígitos. Por ejemplo, el crápulo de 13 es 4, y el de 493 es 7. FUNDAMENTOS DE INFORMÁTICA 196 27. Diseñar un programa que pida por teclado una fecha (expresada en día, mes y año) y una hora (expresada en hora, minutos y segundos). El programa debe indicarnos la fecha y hora transcurrido un segundo. 28. Diseñar un programa que invierta los dígitos de un número positivo entero. Por ejemplo, si se introduce el 3456, debe mostrar el 6543. 29. Diseñar un programa que pida un número N en base 10 y una base B. El programa debe mostrar el número N en base B. 30. Diseñar un programa que pida por teclado un número K e imprima en pantalla los primeros K números primos. Por ejemplo si K es 5 mostraría 1,2,3,5,7. (Puede usar el ejercicio del apartado 4.5.5.) 31. El circuito eléctrico que se muestra en la Figura 4.8 es un filtro paso alto que atenúa las señales de baja frecuencia. La razón entre el voltaje de salida, Vout, con respecto al voltaje de entrada, Vin, puede ser expresado mediante la ecuación: Vout/Vin=(XL)/(R+XL) donde XL representa la reactancia inductiva del inductor L y puede ser calculada con la ecuación: XL=23fL y f representa la frecuencia del voltaje suministrado Vin. Generar una tabla de valores mostrando cómo cambia Vout/Vin variando la frecuencia suministrada y observa cómo el voltaje de salida se incrementa cuando la frecuencia f aumenta. Si el inductor es reemplazado por un capacitor de valor C faradios, cuya reactancia capacitiva viene dada por la ecuación XC=1/XL, muestra que el circuito ahora se comporta como un filtro paso bajo, atenuando las señales de alta frecuencia. Realiza un programa que pida el valor de R, L, un valor de frecuencia inicial y otro final. Se mostrará por pantalla una tabla con el valor de frecuencia y el valor Vout/Vin correspondiente desde el valor de frecuencia inicial hasta el final. De esta forma se observa cómo varía el voltaje de salida con respecto a la frecuencia. Realiza el mismo programa reemplazando el inductor por el capacitor. Figura 4.8. Filtro de paso alto que atenua señales de baja frecuencia Relación de Problemas del Capítulo 5 del libro 68%352*5$0$6/$6)81&,21(6(1& (-(5&,&,2635238(6726 3XHGHHPSH]DULQWHQWDQGRUHVROYHUPHGLDQWHXQDIXQFLyQDOJ~QHMHUFLFLRTXH \D WHQJD UHVXHOWR GHO WHPD DQWHULRU 3RU VXSXHVWR WRGRV ORV HMHUFLFLRV GHEHQ UHVROYHUVHXVDQGRDOPHQRVXQDIXQFLyQGLVWLQWDGHmain() &XDQGR WHQJD TXH SURJUDPDU XQD IXQFLyQ LQWHQWH TXH VHD PX\ YHUViWLO GH PRGRTXHVLUYDHQODVLWXDFLyQPiVJHQHUDOSRVLEOH3DUDHOORWHQJDHQFXHQWDOR VLJXLHQWH • 'HQWURGHODIXQFLyQHVSUHIHULEOHHQJHQHUDOQROHHUQLHVFULELUYDORUHV/RV YDORUHV QHFHVDULRV SXHGHQ SURYHQLU SRU GLVWLQWDV YtDV QR VyOR OD OHFWXUD \ ORV YDORUHV GH VDOLGD SXHGHQ VHU UHTXHULGRV SDUD RWURV ILQHV QR VyOR OD HVFULWXUD • 'HILQD ELHQ ORV SDUiPHWURV GH HQWUDGD \ VDOLGD GHMDQGR ELHQ FODUR OR TXH QHFHVLWD\GHYXHOYHODIXQFLyQ3LHQVHFRQFXLGDGRHOWLSRGHFDGDDUJXPHQWR \VHDFRKHUHQWHHQODOODPDGDFRQGLFKRVWLSRV • (VFULED XQ FRPHQWDULR DQWHV GH FDGD IXQFLyQ TXH LQGLTXH OR TXH KDFH OD IXQFLyQ \ VXV YDORUHV GH HQWUDGDVDOLGD (VFULED HVWH FRPHQWDULR DQWHV GH SURJUDPDUODIXQFLyQSXHVHOOROHREOLJDUiDHQWHQGHUELHQORTXHTXLHUHTXH KDJDODIXQFLyQ,QGLTXHFODUDPHQWHHOFRPHWLGRGHFDGDDUJXPHQWR\YDORU GHUHWRUQRGHODIXQFLyQ • 1RXVHYDULDEOHVJOREDOHV 6LXQHMHUFLFLRORFRQVLGHUDGHPDVLDGRGLItFLOSUXHEHDKDFHUXQRPiVIiFLO R ELHQ LQWHQWH VLPSOLILFDU HO HMHUFLFLR SDUD FRQVLGHUDU VyOR XQDV FXDQWDV FDUDFWHUtVWLFDV GH OD IXQFLyQ R SURJUDPD QR WRGDV HOODV &XDQGR HO SURJUDPD IXQFLRQH FRQ HVDV FDUDFWHUtVWLFDV VLPSOLILFDGDV YD\D DxDGLHQGR FDUDFWHUtVWLFDV KDVWDFRQVHJXLUOR 1LYHOIiFLO ,PSOHPHQWDU GRV IXQFLRQHV TXH VLPXOHQ ODV VLJXLHQWHV GRV IXQFLRQHV PDWHPiWLFDV +DJD XQ SURJUDPD TXH SLGD ORV Q~PHURV UHDOHV GH ORV DUJXPHQWRVGHDPEDVIXQFLRQHV\PXHVWUHORVGRVUHVXOWDGRV I[ [[ JDE DDE (Q ORV VLJXLHQWHV FXDWUR IUDJPHQWRV GH FyGLJR GHWHUPLQH HO YDORU GH ODV YDULDEOHVGHODIXQFLyQSULQFLSDOxHyMXVWRDQWHVGHILQDOL]DU&RPSUXHEHHO UHVXOWDGRHMHFXWDQGRHOFyGLJRHLPSULPLHQGRHOUHVXOWDGR )81'$0(1726'(,1)250È7,&$ D int f (int a, int b) { while(a<b) a++; b--; return a+b; E void f (int a, int b){ { while(a<b) a++; b--; } } int main() { int x=1, y=3; x = f(x,y); } F int f (int a, int& b) { while(a<b) a++; b--; return a+b; int main() { int x=10, y=12; f(y,x); } G void f (int& a, int& b){ { while(a<b) a++; b--; } } int main() { int x=1, y=3; x = f(x,y); } int main() { int x=10, y=12; f(y,x); } (VFULED XQD IXQFLyQ Linea(N,c) GH WLSR void FRQ GRV DUJXPHQWRV 8Q HQWHURN\XQFDUiFWHUc/DIXQFLyQHVFULELUiNYHFHVHOFDUiFWHUc7UDVHVR SUXHEHODVVLJXLHQWHVOODPDGDV\GHVFXEUDHOSRUTXpGHVXVHIHFWRV D E F G Linea(5,'X'); Linea(3.9,'X'); /* Un número real */ Linea('A',65); /* ¿Argumentos cambiados? */ Linea(1E1,'P'); /* Notación científica */ (VFULED XQD IXQFLyQ TXH WHQJD FRPR DUJXPHQWRV ORV YDORUHV GH UHVLVWHQFLDV HOHFWUyQLFDV HQ 2KPLRV Ω /D IXQFLyQ GHYROYHUi HO YDORU GH DPEDV UHVLVWHQFLDVVLVHFRQHFWDUDQHQSDUDOHORORFXDOVHFDOFXODSRU55 (OSURJUDPDSULQFLSDOSHGLUiHOYDORUGH1UHVLVWHQFLDVHLUiPRVWUDQGRHOYDORU GH OD UHVLVWHQFLD JOREDO FRPR VL VH IXHUDQ FRQHFWDQGR GLFKDV UHVLVWHQFLDV FRQIRUPHYDQVLHQGROHtGDV2VHDHOSURJUDPDSHGLUiSULPHURHOQ~PHUR1GH UHVLVWHQFLDV D FRQHFWDU HQ SDUDOHOR 'HVSXpV SHGLUi XQR D XQR ORV YDORUHV GH 68%352*5$0$6/$6)81&,21(6(1& WRGDV ODVUHVLVWHQFLDV \ HQ FDGD SDVR DSOLFDQGR ODIXQFLyQ HVFULWD PRVWUDUiHO UHVXOWDGRGHFRQHFWDUODQXHYDUHVLVWHQFLDHQSDUDOHORFRQWRGDVODVDQWHULRUHV (OSURWRWLSRRFDEHFHUDGHHVWDIXQFLyQVHUi float Paralelo (float r1, float r2); (VFULEDXQDIXQFLyQSDUDSRGHUXWLOL]DUHORSHUDGRUOyJLFR;25H;FOXVLYH25 HQH[SUHVLRQHV(VWHRSHUDGRUELQDULRVHHYDO~DFRPRYHUGDGVLXQR\VyORXQR GH VXV GRV RSHUDQGRV HV YHUGDG (Q FDVR FRQWUDULR VH HYDO~D FRPR IDOVR /D IXQFLyQWHQGUiGRVDUJXPHQWRVHQWHURVSDUDVXVRSHUDQGRVVLJQLILFDIDOVR\ VLJQLILFD YHUGDG GHYROYLHQGR HO YDORU GH YHUGDG UHVXOWDQWH GH OD RSHUDFLyQ ;25&XDQGRWHQJDODIXQFLyQSUXpEHODFRQH[SUHVLRQHVFRPRODVLJXLHQWH if (XOR(a<0, b<0)) ... 6XSRQJDTXHWHQHPRVSURJUDPDGDVODVIXQFLRQHVFRQORVVLJXLHQWHVSURWRWLSRV \ WHQHPRV DGHPiV OD VLJXLHQWH GHFODUDFLyQ GH YDULDEOHV int a, b, c; 5D]RQHVLODVVLJXLHQWHVVHQWHQFLDVTXHXWLOL]DQHVDVIXQFLRQHVVRQFRUUHFWDVR IDOVDV WHQLHQGR HQ FXHQWD TXH VRQ FRUUHFWDV ODV SULPHUDV FLQFR \ IDOVDV ODV VLJXLHQWHV+DJDSHTXHxRVSURJUDPDVGHSUXHEDSDUDYHULILFDUOR void Primera (int Y, int& X); int Segunda (int X, int Z); float Tercera (float x, int& y, int z); D E F G H I J K L M Primera(a,b); a=Segunda(5,6); Primera(Segunda(a,3),b); Tercera(4.3, b, Segunda(b,b)); Tercera(2, b, c); Primera(a,6); a=Segunda(3, Primera(b,c)); Tercera(3.4, Segunda(5,6), c); Tercera(3.4, 5, Segunda(5,6)); Segunda(5, Tercera(3.14,b,c), a); (VFULELU XQ SURJUDPD SDUD FRQYHUWLU ODV FRRUGHQDGDV UHFWDQJXODUHV [\ GH XQ SXQWR D XQ IRUPDWR SRODU Uα 'DGDV ODV SRVLFLRQHV [\ HQ XQ VLVWHPD FDUWHVLDQRGHFRRUGHQDGDVVHGHEHFDOFXODUODGLVWDQFLDUGHVGHHORULJHQDHVH SXQWR \ HO iQJXOR α GHVGH HO HMH ; /RV YDORUHV Uα VRQ ODV FRRUGHQDGDV SRODUHVGHOSXQWR\VHFDOFXODQDVt )81'$0(1726'(,1)250È7,&$ § \· U = [ + \ α = WDQ − ¨ ¸ VL ©[¹ [ ≠ /DVLJXLHQWHIXQFLyQFDOFXODODVFRRUGHQDGDVSRODUHVUαDSDUWLUGH[\ void polar(float x, float y, float& r, float& alfa) { float agrados = 180 / 3.141593; r = sqrt(x*x + y*y); alfa = atan(y/x) * agrados; } /DYDULDEOHOODPDGDagradosVHXWLOL]DSDUDFRQYHUWLUHQJUDGRVORVUDGLDQHV GHYXHOWRVSRUODIXQFLyQatan()GHmath.hTXHFDOFXODODDUFRWDQJHQWH D +DJDXQSURJUDPDGHSUXHEDSDUDODIXQFLyQTXHSLGDORVGRVYDORUHVGH ODVFRRUGHQDGDVFDUWHVLDQDV[H\OODPHDODIXQFLyQ\HVFULEDSRUSDQWDOOD ODVFRRUGHQDGDVSRODUHV E /DIXQFLyQQRFRPSUXHEDVLODIXQFLyQatan()VHSXHGHUHDOL]DUHVGHFLU VL[HVGLVWLQWRGHFHUR0RGLILTXHODIXQFLyQDQWHULRUSDUDTXHFRPSUXHEH VL[YDOH\HQHVHFDVRGHYXHOYDyJUDGRVGHSHQGLHQGRGHOVLJQR GH\ ,PSOHPHQWDUXQDIXQFLyQFRQGRVDUJXPHQWRVDigit(N,num)TXHGHYXHOYD HOGtJLWRNpVLPRGHXQQ~PHURnumGHWLSRlong unsigned intWHQLHQGR HQFXHQWDTXHHOGtJLWRHVHOGtJLWRPiVDODGHUHFKDHOPHQRVVLJQLILFDWLYR /DIXQFLyQGHYROYHUi±VLHOQ~PHURQRWLHQHVXILFLHQWHVGtJLWRV(MHPSOR/D VLJXLHQWHOODPDGDGHYROYHUiDigit(2,12345) 8VDQGRODIXQFLyQGHOHMHUFLFLRDQWHULRUSURJUDPHRWUDIXQFLyQTXHGHYXHOYDHO SULPHU \ HO ~OWLPR GtJLWR GH XQ Q~PHUR N TXH VHUi VX SULPHU DUJXPHQWR 2EVHUYH TXH WLHQH TXH GHYROYHU GRV YDORUHV SHUR FRQ return VyOR SXHGH GHYROYHUVH XQR SRU OR TXH WLHQH TXH XWLOL]DU HO SDVR GH DUJXPHQWRV SRU UHIHUHQFLD(VFULEDODIXQFLyQGHGRVIRUPDVGLVWLQWDV D 'HYROYHU XQ YDORU FRQ return \ HO RWUR XWLOL]DQGR XQ VHJXQGR DUJXPHQWRSRUUHIHUHQFLD E 'HYROYHUDPERVYDORUHVHQHOVHJXQGR\WHUFHUDUJXPHQWRUHVSHFWLYDPHQWH DPERVSRUUHIHUHQFLDGHIRUPDTXHODIXQFLyQVHUiGHWLSRvoid 3UXHEH DPEDV IXQFLRQHV \ QRWH OD GLIHUHQFLD HQ OD IRUPD GH OODPDU D DPEDV IXQFLRQHV TXH KDVWD WLHQHQ GLVWLQWR Q~PHUR GH DUJXPHQWRV /D SULPHUD KD GH XVDUVHHQXQDH[SUHVLyQSDUDHVFULELUHOUHVXOWDGRRDVLJQDUHOUHVXOWDGRDXQD YDULDEOHPLHQWUDVTXHODVHJXQGDVHXVDUiFRPRXQDVHQWHQFLDLQGLYLGXDO 68%352*5$0$6/$6)81&,21(6(1& (VFULED XQD IXQFLyQ TXH FDOFXOH \ GHYXHOYD OD VXPD GH ORV GtJLWRV GH XQ Q~PHUR TXH VH SDVDUi FRPR ~QLFR DUJXPHQWR 3RU HMHPSOR OD VXPD GH ORV GtJLWRVGHOQ~PHURHV\ODVXPDGHORVGtJLWRVGHHV+DJDHVWD IXQFLyQ XVDQGR OD IXQFLyQ Digit() GH XQ HMHUFLFLR DQWHULRU \ VLQ XVDU QLQJXQD RWUD IXQFLyQ DFFHVRULD ,QWHQWH GHVFXEULU FXDO GH HVWDV GRV YHUVLRQHV UHDOL]DPHQRVRSHUDFLRQHV 1LYHOLQWHUPHGLR /DV UHVLVWHQFLDV HOHFWUyQLFDV VXHOHQ LU LGHQWLILFDGDV SRU XQ FyGLJR GH FRORUHV TXH SHUPLWH PDUFDU FDGD UHVLVWHQFLD FRQ VX YDORU HQ 2KPLRV Ω \ VX 7ROHUDQFLDHQ(VWHFyGLJRGHFRORUHVYLHQHUHSUHVHQWDGRHQOD7DEOD 'tJLWR &RORU 1LQJXQR 3ODWD 2UR 1HJUR 0DUUyQ 5RMR 1DUDQMD $PDULOOR 9HUGH $]XO 9LROHWD *ULV %ODQFR 0XOWLSOLFDGRU 7ROHUDQFLD 7DEOD&yGLJRGHFRORUHVSDUDODVUHVLVWHQFLDV SDUDPDUFDUVXYDORUHQ2KPLRVΩ\VX7ROHUDQFLDHQ (OFyGLJRTXHVXHOHHPSOHDUVHHQODVUHVLVWHQFLDVHVXQFyGLJRGHFRORUHVGH IRUPDTXHFDGDUHVLVWHQFLDHVWiPDUFDGDFRQEDQGDVGHFRORUHV&DGDEDQGD WLHQHXQVLJQLILFDGRTXHGHSHQGHGHFDGDFRORU • /DVSULPHUDVEDQGDVLQGLFDQXQQ~PHURGHGtJLWRV(VRVGRVGtJLWRVYLHQHQ GDGRVSRUHOFRORUGHHVDVEDQGDVVHJ~QODFROXPQD'tJLWRGHODWDEOD • /DWHUFHUDEDQGDHVXQYDORUSRUHOTXHVHPXOWLSOLFDUiHOQ~PHURREWHQLGRSRU ODVEDQGDVDQWHULRUHV8QDYH]PXOWLSOLFDGRVDPERVYDORUHVREWHQHPRVHOYDORU GHODUHVLVWHQFLDHQ2KPLRVΩ • /DFXDUWDEDQGDLQGLFDODWROHUDQFLDGHODUHVLVWHQFLD\FRPRSXHGHYHUVHHQOD WDEODQRSXHGHVHUGHFXDOTXLHUFRORU (MHPSOR 8QDV UHVLVWHQFLDV FRQ ORV VLJXLHQWHV FRORUHV WLHQHQ ORV YDORUHV GH UHVLVWHQFLD\WROHUDQFLDTXHVHLQGLFDQ9HUGH$]XO$PDULOOR2URNΩ 5RMR1HJUR5RMR5RMRNΩ5RMR5RMR0DUUyQ3ODWDΩ )81'$0(1726'(,1)250È7,&$ 6HJ~Q WRGR OR DQWHULRU LPSOHPHQWH XQD IXQFLyQ TXH SHUPLWD FDOFXODU OD UHVLVWHQFLD\ODWROHUDQFLDGHXQDUHVLVWHQFLDVDELHQGRORVFyGLJRVGHFRORUHV(O VXESURJUDPDWHQGUiFRPRPtQLPRDUJXPHQWRVTXHVHUiQQ~PHURVQDWXUDOHV \TXHLQGLFDUiQHOFRORUGHODVEDQGDVVHJ~QODFROXPQD³'tJLWR´/RVFRORUHV 2UR 3ODWD \ 1LQJXQR WRPDUiQ ORV YDORUHV \ UHVSHFWLYDPHQWH 3DUD IDFLOLWDUODHQWUDGDGHGDWRVLPSOHPHQWHRWUDIXQFLyQTXHPXHVWUHSRUSDQWDOOD HOGtJLWRTXHOHFRUUHVSRQGHDFDGDFRORULQFOX\HQGRORVGtJLWRV\ 5HDOL]DU XQD IXQFLyQ Fibonacci(n) TXH FDOFXOH HO WpUPLQR npVLPR GH OD VXFHVLyQGH)LERQDFFLODFXDOHPSLH]DHQ\\FDGDQXHYRWpUPLQRHVOD VXPD GH ORV GRV DQWHULRUHV « )RUPDOPHQWH SRGHPRVGHILQLUHVWDVXFHVLyQDVt fibonacci (0) = 0 fibonacci (1) = 1 fibonacci (i) = fibonacci (i-1) + fibonacci (i-2) 'LVHxDUWDPELpQXQSURJUDPDTXHDFHSWHYDORUHVGHnGHVGHHOWHFODGRXWLOLFH ODIXQFLyQDQWHULRU\HVFULEDHOUHVXOWDGRHQODSDQWDOOD(OSURJUDPDILQDOL]DUi FXDQGRVHLQWURGX]FDXQYDORUQHJDWLYR 3URJUDPH XQD IXQFLyQ OODPDGD MCD() SDUD FDOFXODU HO 0i[LPR &RP~Q 'LYLVRU GH GRV Q~PHURV QDWXUDOHV TXH VHUiQ VXV GRV ~QLFRV DUJXPHQWRV 8QD IRUPDGHKDFHUORHVSURJUDPDUXQEXFOHSRUHOTXHPLHQWUDVDPERVQ~PHURV VHDQGLVWLQWRVDOPD\RUOHUHVWDHOPHQRU$OWHUPLQDUHOEXFOHHO0&'VHUiHO Q~PHURUHVXOWDQWHGHHVDVUHVWDVVXFHVLYDV (VFULEDXQDIXQFLyQTXHFDOFXOHHO0tQLPR&RP~Q0~OWLSOR0&0XVDQGROD IXQFLyQ DQWHULRU VDELHQGR TXH 0&0DE 0&'DE DE (VFULED RWUD IXQFLyQTXHGHYXHOYDDPERVYDORUHV0&0\0&' (VFULELU XQD IXQFLyQ CuentaChars()TXH OHD XQD VXFHVLyQ GH FDUDFWHUHV XQRDXQRKDVWDOHHUXQSXQWR/DIXQFLyQFDOFXODUiODSRVLFLyQGHODSULPHUD \ OD ~OWLPD RFXUUHQFLD GH XQ GHWHUPLQDGR FDUiFWHU ch /D IXQFLyQ WHQGUi DUJXPHQWRV(OSULPHURVHUiHOFDUiFWHUch\ORVGRVVLJXLHQWHVVHUiQXWLOL]DGRV SDUD GHYROYHU ORV YDORUHV LQGLFDGRV XVDQGR XQ SDVR GH SDUiPHWURV SRU UHIHUHQFLD $PERV YDORUHV VHUiQ FHUR VL ch QR DSDUHFH QLQJXQD YH] HQ OD FDGHQD GH FDUDFWHUHV OHtGD $GHPiV OD IXQFLyQ GHYROYHUi FRQ return HO Q~PHURGHYHFHVTXHDSDUHFHHOFDUiFWHUch(OSURJUDPDGHSUXHEDSULQFLSDO VLPSOHPHQWH OHHUi HO FDUiFWHU ch OODPDUi D OD IXQFLyQ CuentaChars() \ PRVWUDUiORVYDORUHVUHVXOWDQWHV 68%352*5$0$6/$6)81&,21(6(1& (VFULELU XQD IXQFLyQ sumanumeros() TXH OHD XQD VXFHVLyQ GH Q~PHURV VHSDUDGRV SRU HVSDFLRV \ DFDEDGD HQ XQ SXQWR /D IXQFLyQ GHEH GHYROYHU OD VXPDGHWRGRVORVQ~PHURVGHODVXFHVLyQ(VWDIXQFLyQWHQGUiWUHVDUJXPHQWRV HO SULPHUR VHUi XQ FDUiFWHU TXH FRQWLHQH XQ GtJLWR GHO DO HO VHJXQGR DUJXPHQWRGHYROYHUiHOQ~PHURGHYHFHVTXHHVHGtJLWRDSDUHFHHQODFDGHQD GHHQWUDGD\HOWHUFHUDUJXPHQWRGHYROYHUiODFDQWLGDGGHQ~PHURVTXHVHKDQ VXPDGRHQODFDGHQDGHHQWUDGD2EVHUYDTXHORVGRV~OWLPRVSDUiPHWURVGHEHQ VHU SDVDGRV SRU UHIHUHQFLD /D IXQFLyQ OHHUi ORV Q~PHURV XQR D XQR FRPR FDUDFWHUHVHLUiLGHQWLILFDQGRVXSRVLFLyQFRUUHODWLYDPHQWH'HWHFWDUiXQQXHYR Q~PHURDOOHHUXQHVSDFLR\ILQDOL]DUiDOOHHUXQSXQWR 3RUHMHPSORODFDGHQDGHHQWUDGDSXHGHVHU22 18 1122 8. /DIXQFLyQVHUiXVDGDDVt suma=sumanumeros('2',nveces_digito,total_numeros); $OWHUPLQDUODHMHFXFLyQGHODPLVPDWHQGUHPRVORVVLJXLHQWHVYDORUHVsuma YDOGUi HVGHFLU nveces_digito YDOGUi HV GHFLU HO DSDUHFH YHFHV \ total_numeros YDOGUi HV GHFLU KD\ FXDWUR Q~PHURVHQODHQWUDGD 6XJHUHQFLD 3URJUDPH OD IXQFLyQ SRFR D SRFR FHQWUiQGRVH HQ XQ DVSHFWR HQ FDGDSDVR (VFULELU XQD IXQFLyQ TXH RUGHQH WUHV Q~PHURV /D IXQFLyQ WHQGUi VHLV DUJXPHQWRVORVWUHVSULPHURVVHUiQORVQ~PHURVDRUGHQDU\ORVWUHVVLJXLHQWHV VHUiQGRQGHODIXQFLyQGHYXHOYHHVRVWUHVYDORUHVGHIRUPDRUGHQDGD 'DWWDWUH\D.DSUHNDUIXHXQPDWHPiWLFRLQGLRTXHQXQFDHVFULELy QDGD GH DOWRQLYHO \ VXV WUDEDMRV QRKDQ GDGR RULJHQ D QLQJXQD LQYHVWLJDFLyQ HVSHFLDO QL WLHQHQ QLQJXQD XWLOLGDG LPSRUWDQWH SHUR VRQ VRUSUHQGHQWHV \ RULJLQDOHV(QWUHVXVWUDEDMRVHVWiHOVLJXLHQWH • • • • (OHJLU XQ Q~PHUR GH FXDWUR FLIUDV A QR WRGDV LJXDOHV \ HQ HO TXH ODV SULPHUDVSXHGHQVHUFHURV 2UGHQDUODVFLIUDVGHOQ~PHURAHQRUGHQFUHFLHQWHB\OXHJRHQRUGHQ GHFUHFLHQWHC 5HVWDUDPERVQ~PHURVD = C - B 9ROYHU D HPSH]DU SHUR FRQVLGHUDQGR DKRUD HO Q~PHUR D HQ YH] GHO Q~PHURA /RFXULRVRHVTXHLQGHSHQGLHQWHPHQWHGHOQ~PHURAHOHJLGRDOILQDOVLHPSUH VHOOHJDDOPLVPRQ~PHUR+DFHUXQSURJUDPDTXHDYHULJXHHVHQ~PHURILQDO 6XJHULPRV HVWDV IDVHV SDUD HO SURJUDPD 3ULPHUR KDFHU XQD IXQFLyQ )81'$0(1726'(,1)250È7,&$ KaprekarOrden(A) TXH GDGR HO Q~PHUR A FRPR ~QLFR DUJXPHQWR QRV GHYXHOYD HO Q~PHUR D (VD IXQFLyQ VyOR HIHFWXDUi XQ FLFOR (O SURJUDPD SULQFLSDO SHGLUi XQ Q~PHUR \ DSOLFDUi OD IXQFLyQ VXFHVLYDPHQWH KDVWD TXH HO UHVXOWDGR GH OD IXQFLyQ VHD LJXDO D VX DUJXPHQWR HV GHFLU KDVWD TXH \D QR WHQJDVHQWLGRVHJXLUDSOLFDQGRODIXQFLyQSRUTXHVLHPSUHREWHQHPRVHOPLVPR Q~PHUR (Q HVH PRPHQWR HO SURJUDPD PRVWUDUi HVH Q~PHUR \ WHUPLQDUi 0RVWUDU WDPELpQ HO Q~PHUR GH SDVRV QHFHVDULRV SDUD REWHQHU HVH Q~PHUR D SDUWLUGHOQ~PHURRULJLQDO 2WUDLGHDGH.DSUHNDUHVFRJHUXQQ~PHUR$GHFLIUDVTXHGLYLGLPRVHQGRV SDUWHVXQD%FRQODVSULPHUDVFLIUDV\RWUD&FRQODV~OWLPDV6HVXPDD DPERVQ~PHURV%\&GHVSUHFLDQGRHODFDUUHRVLVHVXSHUDHOQ~PHURGHFLIUDV LQLFLDO GH % \ & ,QYHUWLGORV GRV Q~PHURVSRQLHQGRGHODQWHHO GH GRVFLIUDV &% REWHQLHQGR XQ QXHYR Q~PHUR GH FLIUDV $KRUD YROYHU D HPSH]DU UHSLWLHQGR HO SURFHVR KDVWD TXH REWHQJDPRV GH QXHYR HO Q~PHUR LQLFLDO FRQWDQGR HO Q~PHUR GH SDVRV TXH YDPRV GDQGR 3RU HMHPSOR $ SDUWLU GHO Q~PHUR.DSUHNDUGHVFXEULyTXHVHREWLHQHHOQ~PHURLQLFLDOHQ HWDSDV .DSUHNDU WDPELpQ GHVFXEULy TXH DOJXQRV Q~PHURV DO HOHYDUORV DO FXDGUDGR \ SDUWLU HO UHVXOWDGR HQ GRV SDUWHV GH GtJLWRV VL VH VXPDQ HVDV GRV SDUWHV VH REWLHQHHOQ~PHURLQLFLDO3RUHMHPSORFX\RFXDGUDGRHVVLDKRUD GLYLGLPRVHQGRVSDUWHV\ODVVXPDPRVREWHQHPRVTXH 6LDHVRV Q~PHURV ORV OODPDPRV Q~PHURV GH .DSUHNDU SURJUDPH XQD IXQFLyQ TXH FDOFXOH\PXHVWUHWRGRVORVQ~PHURVGH.DSUHNDUPHQRUHVD1GRQGH1HVXQ YDORUQDWXUDOTXHVHLQWURGXFHFRPR~QLFRDUJXPHQWRGHODIXQFLyQ 1LYHODYDQ]DGR 5HDOL]DUXQSURJUDPDTXHVLPXOHHOVLJXLHQWHMXHJR8QMXJDGRUWLUDGRVGDGRV 6LHQODSULPHUDWLUDGDODVXPDGHORVGRVHVXHOMXJDGRUJDQD6LHVy SLHUGH 6L HV FXDOTXLHU RWUD SXQWXDFLyQ HO MXJDGRU GHEH VHJXLU WLUDQGR ORV GDGRVKDVWDTXHELHQUHSLWDODSULPHUDSXQWXDFLyQHQFX\RFDVRJDQDODSDUWLGD RELHQVDOJDXQ\SLHUGD3DUDHOORGHEHXVDUODVLJXLHQWHIXQFLyQTXHVLPXOD ODWLUDGDGHGRVGDGRV 68%352*5$0$6/$6)81&,21(6(1& /* Función tirada: Simula la tirada de dos dados y devuelve la suma de ambos */ int tirada(void) { int dado1, dado2; dado1 = 1 + (rand() % 6); dado2 = 1 + (rand() % 6); return dado1 + dado2; } &RPHQWDULRVUHVSHFWRDODJHQHUDFLyQGHQ~PHURVSVHXGRDOHDWRULRVH[SOLFDGRV FRQPD\RUGHWDOOHHQHO&DStWXOR • • /DIXQFLyQrand()GHYXHOYHXQQ~PHURSVHXGRDOHDWRULRDSDUWLUGHFHURHQWUH \RAND_MAX $OFDOFXODU PyGXORREWHQHPRV XQ Q~PHURSVHXGRDOHDWRULR HQWUH\$OVXPDUREWHQHPRVXQQ~PHURSVHXGRDOHDWRULRHQWUH\TXH SXHGHVLPXODUHOUHVXOWDGRGHXQGDGRGHMXHJR 6LORSUXHEDYHUiTXHODVHFXHQFLDGHWLUDGDVHVVLHPSUHODPLVPD(OORVHGHEHD TXHXQRUGHQDGRUQRSXHGHJHQHUDUDXWpQWLFRVQ~PHURVDOHDWRULRV\DTXHHVXQD PiTXLQDSURJUDPDGDFRQSUHFLVLyQVLQDOHDWRULHGDGQLQJXQD3RGHPRVVLPXODU PHMRU ORV Q~PHURV SVHXGRDOHDWRULRV KDFLHQGR TXH HPSLHFHQ HQ XQ YDORU TXH GHSHQGD GH OD KRUD GHO VLVWHPD 3DUD HOOR HMHFXWH OD VLJXLHQWH LQVWUXFFLyQ VyOR XQD YH] DO SULQFLSLR GHO SURJUDPD OD SULPHUD LQVWUXFFLyQ srand(time(NULL)); 127$ GHEH LQFOXLU HO ILFKHUR time.h HQ VX SURJUDPD &RGLILTXH XQD IXQFLyQ SDUD FDOFXODU HO 0tQLPR &RP~Q 0~OWLSOR 0&0 GH GRVQ~PHURVQDWXUDOHVD\ETXHVHUiQVXVGRV~QLFRVDUJXPHQWRVVLQFDOFXODU SUHYLDPHQWH HO 0&' 6H WUDWD GH HQFRQWUDU HO Q~PHUR PiV SHTXHxR TXH HV P~OWLSORGHDPERV(VHQ~PHURVHJXURTXHH[LVWH\HVWiHQHOUDQJR>Pi[DE DE@ 2EVHUYH TXH HO SURGXFWR GH DPERV Q~PHURV HV XQ P~OWLSOR FRP~Q D DPERVSHURSXHGHQRVHUHOPiVSHTXHxR +DFHU XQD IXQFLyQ TXH GHYXHOYD HO PHQRU Q~PHUR QDWXUDO WDO TXH 'LYLGLGR HQWUHGDGHUHVWRGLYLGLGRHQWUHGDGHUHVWRGLYLGLGRHQWUHGDGHUHVWR GLYLGLGRHQWUHGDGHUHVWRGLYLGLGRHQWUHGDGHUHVWRGLYLGLGRHQWUH GDGHUHVWRGLYLGLGRHQWUHGDGHUHVWR\GLYLGLGRHQWUHGDGHUHVWR (VFULEDXQDIXQFLyQPrimo(N)TXHGHYXHOYDHOQ~PHURIDOVRVLHOQ~PHUR N GH VX DUJXPHQWR QR HV XQ Q~PHUR SULPR \ HO Q~PHUR YHUGDG VL GLFKR Q~PHURHVSULPR)LQDOPHQWHDYHULJH\SUXHEHODXWLOLGDGGHOVLJXLHQWHEXFOH HVFULELHQGRRWUDIXQFLyQFX\RVDUJXPHQWRVVRQORVHQWHURVa\b )81'$0(1726'(,1)250È7,&$ for (i=a; i<=b; i++) if (Primo(i)) /* Equivalente a: if (Primo(i)==1) */ printf("\n- Encontrado primo: %i.",i); /DVHULHGH3HUULQFRPLHQ]DDVt« (VWRVQ~PHURVGH3HUULQVHGHILQHQGHODVLJXLHQWHIRUPD P(0)=3; P(1)=0; P(2)=2; P(i)=P(i-2)+P(i-3) SDUD i>2 &XDOTXLHUQ~PHURSULPRpGLYLGHDP(p),QWHQWHHQFRQWUDUXQQ~PHURSULPR TXHFRQWUDGLJDHVDUHJOD /RV Q~PHURV QR SULPRV x WDO TXH x GLYLGH D P(p) VH FRQRFHQ FRPR SVHXGRSULPRVGH3HUULQVLHQGRPODVHULHGH3HUULQ3URJUDPHXQDIXQFLyQSDUD HQFRQWUDU HO PHQRU Q~PHUR QR SULPR x WDO TXH x GLYLGH D P(p) (O PHQRU SVHXGRSULPRGH3HUULQHVTXHQRHVSULPR\DTXHHTXLYDOHDð (O JHQLR GH ODV PDWHPiWLFDV LQGLR 6ULQDYDVD 5DPDQXMDQ WUDEDMy HQ &DPEULGJH FRQ VX FROHJD LQJOpV *RGIUH\ +DUG\ &XDQGR 5DPDQXMDQ HQIHUPy +DUG\ VROtD YLVLWDUOR HQ HO KRVSLWDO 8Q GtD +DUG\ FRPHQWyDVXDPLJR³(OWD[LTXHPHKDWUDtGRWHQtDXQQ~PHUREDVWDQWHVRVR HUD HO """" 5DPDQXMDQ UHVSRQGLy ³1R +DUG\ HVH HV XQ Q~PHUR PX\ LQWHUHVDQWH(VHOPiVSHTXHxRGHORVQ~PHURVTXHVHSXHGHQH[SUHVDUFRPROD VXPD GH FXERV GH GRV PDQHUDV GLVWLQWDV´ 2 VHD """" D E F G (VFULEDXQDIXQFLyQTXHFDOFXOHHOQ~PHURGHOWD[LGH+DUG\VDELHQGRTXHHO Q~PHURQRWHQtDPiVGHFLIUDV 127$8QDIRUPDGHUHVROYHUORHVHVFULELHQGREXFOHVDQLGDGRVSDUDPRYHU ODVYDULDEOHVDEF\G/DVROXFLyQHV +D\Q~PHURVQDWXUDOHVTXHDOPXOWLSOLFDUORVVXFHVLYDPHQWHSRUVH REWLHQHQQ~PHURVTXHWLHQHQORVPLVPRVGtJLWRVTXHHORULJLQDOSHURHQGLVWLQWR RUGHQVyORDOPXOWLSOLFDUSRUVHREWLHQHXQQ~PHURFRQORVPLVPRVGtJLWRV HQ HO PLVPR RUGHQ 6XSRQJDPRV TXH SDUD HO Q~PHUR 1 VH FXPSOH HVD SURSLHGDG DO PXOWLSOLFDUOR SRU KDVWD ; (QWRQFHV GHFLPRV TXH HO ³Pi[LPR PXOWLSOLFDGRUFDEDOtVWLFR´GH1HV;(MHPSOR00& 3RU HMHPSOR \ &RGLILFDU XQD IXQFLyQ WDOTXHGDGRXQQ~PHURPXHVWUHVX00& &RQODIXQFLyQGHOHMHUFLFLRDQWHULRUVHUiPiVIiFLOFRGLILFDURWUDIXQFLyQFRQ GRV DUJXPHQWRV 7 \ 0 WDO TXH PXHVWUH HO UDQJR GH Q~PHURV FRQVHFXWLYRV \ FRQDOPHQRV7Q~PHURVWDOTXHWRGRVHOORVWLHQHQVX00&PD\RURLJXDOD 0$OILQDOODIXQFLyQGHEHPRVWUDUHOQXPHURFRQPD\RU00&GHWRGRVORV Q~PHURVDQDOL]DGRV Relación de Problemas del Capítulo 6 del libro FUNDAMENTOS DE INFORMÁTICA 306 Para acceder a un elemento de un array, puede usarse como índice una expresión aritmética entera, tal como: array[5+4–3] Si un array tiene 15 elementos, no es obligatorio utilizar todos esos elementos dentro de un programa. Si una función tiene un argumento de tipo array unidimensional, es muy importante especificar su tamaño dentro de los corchetes de la definición de ese argumento. Una función puede devolver con return una estructura completa, pero no un array con todos sus elementos. Igual que los arrays, los registros siempre se pasan por referencia. La función strlen() devuelve la posición del carácter '\0' en la cadena de su argumento. Si a y b son dos cadenas de caracteres y sus valores respectivos son "x" e "y", entonces, tras la llamada strcat(a,b), la cadena a vale "x y". 6.10 EJERCICIOS PROPUESTOS 6.10.1 Nivel fácil 1. Dada la siguiente declaración: float calif[10]= {4.55,8.20,3.56,1.34,6.75,2.25,7.45,8.90,5.34,3.89}; Escriba una lista de los elementos que mostrarán las siguientes secciones de código: a) for (m=1; m<=5; m++) printf("%7f",calif[m-1]); b) for(k=0; k<=9; k=k+2) printf("%.1f ",calif[k]); c) for(j=3; j<10; j+=3) printf("%i\t",(int)calif[j]); d) for(i=2; i<10; i=i+2) printf("%d ",calif[i]); e) for(i=1; i<10; i=i+2) printf("%f ",calif[++i]); TIPOS DE DATOS ESTRUCTURADOS 307 En el último bucle se modifica la variable de control del bucle (i) dentro del bucle for, lo cual es desaconsejable. 2. Escriba un programa que declare tres arrays unidimensionales denominados voltios, corriente y resistencia. Cada array debe declararse en main() y debe ser capaz de almacenar diez números en doble precisión. El programa debe pasar estos tres arrays a la función denominada calcVoltios(), para calcular los elementos del array voltios, como el producto de los elementos correspondientes en los arrays corriente y resistencia (por ejemplo, voltios[1]=corriente[1] * resistencia[1]). Después de que calcVoltios()haya colocado los valores en el array voltios, han de ser mostrados los valores del array desde la función main(). 3. Diseñar un programa que permita invertir el contenido de un array. No se trata de mostrar el array de forma inversa, sino de invertir los valores según su posición original. Ejemplo: Vector Original: 12 Vector Invertido: 15 45 90 7 9 9 7 90 45 15. 12. Nota: El programa no podrá utilizar vectores auxiliares. 4. Diseñar un programa que permita traducir una cadena de caracteres que contenga un número real, al número que representa: 7 Cadena de Entrada: Número de Salida: 78.05 8 . 0 5 \0 ... 5. Escribir la función Reemplazar() que acepte 3 argumentos: una cadena de caracteres CAD y dos caracteres A y B. La función sustituirá todas las ocurrencias del carácter A en la cadena CAD por el carácter B. La función devolverá el número de caracteres sustituidos. Ejemplo: si CAD contiene la cadena "felicidad", tras la llamada Reemplazar(CAD, 'i', 'x'), la variable CAD tendrá la cadena "felxcxdad" y la función devolverá el valor 2. 6.10.2 Nivel intermedio 6. Diseñar un programa que lea una matriz 6×8 de enteros (fila a fila), la almacene en un array bidimensional a, y calcule los resultados de las FUNDAMENTOS DE INFORMÁTICA 308 sumas de los elementos de cada fila en un vector b y las sumas de los elementos de cada columna en un vector c. Finalmente se imprimirán los tres arrays con el siguiente formato: a a a a a a c a a a a a a c a a a a a a c a a a a a a c a a a a a a c a a a a a a c a a a a a a c a a a a a a c b b b b b b c 7. Implementar una función que devolverá un dato de tipo cadena que corresponderá con las siglas de la cadena que toma como argumento. Las siglas estarán formadas por las letras en mayúsculas de todas las palabras, separadas por un punto. Ejemplo: Si la frase del argumento es “Alta Velocidad Española”, la frase que devolverá será “A.V.E.”. 8. Escriba un programa para efectuar la conversión de un número entero a base 10 a otra base menor a 10. La introducción del número se hará mediante una cadena de caracteres en este formato: "número/base". Por ejemplo, si la entrada al programa es "439/8", esto indica que deseamos cambiar el número 439 a base 8. Se aconseja hacer al menos una función para obtener los dos números de la cadena de entrada, y otra función distinta para efectuar la conversión de base. 9. Supongamos que deseamos evaluar a un determinado número de alumnos siguiendo el criterio de que aprobará aquel que supere la nota media de la clase. Escriba un programa que lea un número indeterminado de alumnos (como máximo 20, y las notas de tres evaluaciones, y como resultado emita un informe indicando, para cada alumno, las evaluaciones que tiene aprobadas y suspensas. Ejemplo de la salida que se debe obtener. Alumno Juan Lopez Luis Garcia Pedro Ruiz Nota-1 Aprobado Suspenso Aprobado Nota-2 Suspenso Aprobado Aprobado Nota-3 Aprobado Aprobado Aprobado TIPOS DE DATOS ESTRUCTURADOS 309 10.Dadas las siguientes declaraciones: struct fecha{ int dia, mes, anio; }; struct persona{ char nombre[50]; struct fecha fecha_nac; double altura; double peso; }; a) Implemente una función, escribir(), que muestre por pantalla todos los datos de todas las personas que hay almacenadas en un array de struct persona. La función debe tener dos argumentos, el primero un array de struct persona, y el segundo, un entero que indique el número de datos que hay en el array. La función no devuelve nada. b) Escriba una función leer() para pedir por teclado todos los datos de una persona concreta. La función no tendrá argumentos y devolverá un struct persona con los datos leídos. c) Suponga que tenemos la siguiente declaración de variables: struct persona Equipo[100]; Indique si las siguientes llamadas a la función implementada anteriormente son correctas o no y por qué: 1. Equipo=leer(); 2. Equipo[10]=leer(); 3. leer(Equipo[100]); 4. leer(); 5. leer(Equipo); 6. Equipo[100]=leer(); d) Escriba una función para buscar los datos de una persona en el array. La función buscará por el nombre de la persona y devolverá todos los datos y un valor entero (1 si ha encontrado a la persona y 0 si no lo ha encontrado). El prototipo de la función deberá ser el siguiente: int buscar(struct persona P[], int t, char name[], struct persona& per); e) Escriba una función en la que se utilice la función anterior. Declare las variables que sean necesarias, FUNDAMENTOS DE INFORMÁTICA 310 pida el nombre de la persona y llame adecuadamente a la función. 6.10.3 Nivel avanzado 11. Escriba un programa que lea por teclado dos matrices M×N y N×P, y devuelva como resultado la matriz producto M×P. Los valores M, N y P se introducirán por teclado antes de la lectura de las matrices. El tamaño máximo de M, N y P vendrá dado por constantes definidas en el programa. Nota: Son 3 bucles anidados de M, P y N iteraciones respectivamente. 12.Un cuadrado mágico es una matriz cuadrada con un número impar de filas y columnas, cuyas filas y columnas (e incluso sus diagonales) suman el mismo valor. Por ejemplo la matriz siguiente es un cuadrado mágico de 3×3 en el que los números en cada fila, cada columna y cada diagonal suman 15: 6 7 2 1 5 9 8 3 4 Hacer un programa que compruebe si una matriz es un cuadrado mágico o no. El tamaño máximo de la matriz será de 20×20. En primer lugar, el programa leerá el tamaño N de la matriz hasta que éste sea correcto (impar y menor que el tamaño máximo), y pedirá los datos de una matriz N×N. Una vez leídos y almacenados los datos se comprobará si la matriz es un cuadrado mágico o no y se mostrará el mensaje correspondiente. Nota: Realice el ejercicio implementando distintas funciones: para leer una matriz, escribir una matriz y comprobar si una matriz es cuadrado mágico. 13. Implementar la función SigCharPos() con 3 parámetros, devolviendo un unsigned int. El primer parámetro es una cadena de caracteres Cad, el segundo parámetro es un carácter Ch y el tercer parámetro un número natural N. La función devolverá la posición del siguiente carácter Ch en la cadena Cad empezando a mirar a partir de la posición N (inclusive). Si el carácter no es encontrado, la función devolverá el valor más grande posible que admita el tipo que se devuelve. Las llamadas siguientes devolverán los valores que se indican a la derecha: SigCharPos("Aristóteles dijo que saber es acordarse",'t',5):6 SigCharPos("Aristóteles dijo que saber es acordarse",'A',0):0 SigCharPos("Aristóteles dijo que saber es acordarse",'s',0):3 TIPOS DE DATOS ESTRUCTURADOS 311 Implementar esta función sin utilizar funciones de string.h y, como en la mayoría de las funciones, no se debe ni leer ni escribir datos. Implementar también un programa con un menú con las siguientes opciones: a) Buscar siguiente carácter a partir de una posición. En esta opción se pedirán los datos necesarios para llamar a la función y se mostrará el resultado devuelto. b) Buscar todas las ocurrencias de un carácter. En esta opción se pedirán también los datos (excepto la posición) y mostrará las posiciones de todas las ocurrencias de un carácter en una cadena. c) Buscar todas las ocurrencias de un carácter a partir de una posición. d) Salir. El menú debe repetirse hasta pulsar esta opción. 14. Programar una función en C de nombre InvierteCad() que tome un único argumento de tipo cadena de caracteres. La función debe invertir los caracteres de dicha cadena pero lo hará independientemente para cada frase. Supondremos que termina una frase cuando existe un punto (carácter '.') o si se llega al final de la cadena. Ejemplo: Si como argumento de InvierteCad() se introduce la cadena de la izquierda, dicha cadena se modificaría tomando el valor de la cadena de la derecha, quedando los puntos en la misma posición que en la cadena original: "PAZ. PARA. KOSOVO" "reconocer" "HOLA TIO. Yo bien." "Lee entero. El examen!" "ZAP.ARAP .OVOSOK" "reconocer" "OIT ALOH.neib oY ." "oretne eeL.!nemaxe lE" 15. Declare dos estructuras para almacenar la siguiente información en cada una de ellas: a) Pacientes (3 campos): De cada paciente almacenamos su nombre, nombre de la vacuna suministrada (coincide con el nombre de la enfermedad a la que se aplica) y número de la última dosis de dicha vacuna (1, 2...). b) Vacuna (3 campos): De una vacuna nos interesa el nombre de la enfermedad a la que se aplica (Hepatitis A, Tétano, Malaria...), la dosis (1, 2...) y la duración (en meses) que tiene su protección. Por ejemplo, la Hepatitis A en la primera dosis dura 6 meses pero si se inyecta una segunda dosis a los 6 meses, esa segunda dosis hace que la duración sea de 10 años. Supongamos que un programa principal maneja 2 arrays de estructuras correspondiendo cada uno a una de las 2 estructuras anteriores. Realice diferentes funciones independientes para las siguientes acciones: 312 FUNDAMENTOS DE INFORMÁTICA a) Función BuscaVacuna(): La función imprimirá todos los datos de una vacuna en particular. El nombre de la vacuna se pasará como un argumento más de la función, aparte del array de vacunas y su tamaño. Tenga en cuenta que una vacuna puede aparecer varias veces (para distintas dosis). b) Función ImprimeVacunas(): Dando como argumentos el nombre de un paciente, el array de pacientes y su tamaño, la función devolverá el número de vacunas que ese paciente tiene puestas y también mostrará por pantalla la información de esas vacunas (incluyendo la duración de la dosis administrada).