fundamentos de informática

Anuncio
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)LQDOPHQWHDYHULJH\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).
Descargar