Enunciados Practicas
Enunciados Practicas
entero = 12;
if(entero = 7){
printf("El valor de entero es 7);
} else {
printf("El valor de entero es 12);
}
cont = 1;
while (cont <= n){
cont = cont + 1;
suma = suma + cont;
}
2. Dada la sentencia
resultado = a * b * c;
Escribe un programa que pida al usuario tres números enteros, utilice la sentencia anterior y escriba por
pantalla el resultado.
3. Escribe un programa que pida un número entero y determine si es par o impar. Una ejecución tı́pica deberı́a
ser:
Ahora haz otro programa que determine si el número entero es múltiplo de tres. Si no lo es, que determine
su resto. Una ejecución tı́pica del programa debe ser:
1
***** Nombre: Jdkdkdkd
**** Apellidos: Skdkdkd Rdkdkdkd
**** Matricula: 12345
***************************
4. Siguiendo los problemas anteriores, ahora se pide que escribas un programa que pida un número entero y
a continuación otro entero. Que compruebe si éste último es un divisor del primero. En caso contrario que
determine el resto, de la división entera. Una ejecución tı́pica del programa debe ser:
5. Escribe un programa que intercambie los respectivos valores que contengan dos variables. Esto es, si la
variable a = −12 y la variable b = 7, entonces el código tiene que ser capaz de obtener la salida: a = 7 y
b = −12. Una posible ejecución podrı́a ser:
var1 = 1;
var3 = 1;
var2 = 25;
while (var1 < var2){
var1 = var1 + 1;
var3 = var3 * var1;
}
7. Escribe un programa que calcule el factorial de número natural, dado. Una posible ejecución serı́a:
2
***************************
El factorial de 7 es 7! = 5040
8. Escribe un programa que calcule la potencia entera positiva de un número entero. Esto es, si a ∈ Z es la
base y b ∈ N el exponente, se pide ab . Una posible ejecución serı́a:
La potencia 5 de -2 es -32
9. Escribe un programa que sume los dı́gitos de un número natural. Esto es, dado el número 7435 la suma de
sus dı́gitos es 19. La idea es ir obteniendo el resto de la división entera por 10. Por ejemplo, siguiendo con
el número anterior: 7435 % 10 = 5 y 7435/10 = 743. Seguidamente se hace el mismo proceso pero ahora
con 743. Es decir: 743 % 10 = 3, que será otro dı́gito que se suma al anterior y se opera: 743/10 = 74. A
continuación se sigue una pauta análoga con 74 y ası́ sucesivamente, hasta que la parte entera sea cero. Una
posible ejecución del programa serı́a:
10. A partir del programa anterior, escribe un código que escriba el reverso de un número natural. Esto es, si
se introduce el número 45178, la salida debe ser 87154. A continuación que compruebe si es capicúa o no.
Una posible ejecución del programa serı́a
11. Escribe un programa que determine si un número es perfecto. Se dice que un número natural es perfecto si
su valor coincide con la suma de sus divisores. Por ejemplo, el número 6 es perfecto ya que 6 = 1 + 2 + 3.
También lo son 28 y 496. La idea del algoritmo es muy sencilla: basta con tomar todos los números menores
3
que el introducido y comprobar si alguno es divisor. Si lo es, entonces se suma con los anteriores que han
sido divisores. Al final la suma total y el número natural inicial deben ser iguales, si el número es perfecto.
Utilizando el código anterior, haz un programa que dado un número natural, saque por pantalla todos los
números perfectos menores que él.
12. Haz un programa que calcule el Máximo común divisor (m.c.d.) y el Mı́nimo común múltiplo (m.c.m.) de dos
números naturales.
NOTA:
Para calcular el máximo común divisor (m.c.d.) de dos números enteros positivos, puede aplicarse
el Algoritmo de Euclides. Este proceso se basa en que dados dos números D (dividendo) y d
(divisor) con D > d, la división entre ambos números se expresa de la forma:
D =C ·d+r
T · k = C · s · k + r ⇐⇒ k · (T − C · s) = r
Teniendo en cuenta este hecho, se hace a continuación, la división entre d y r, pero ahora d como
dividendo y r como divisor, obteniéndose:
d = C2 · r + r2
D <- a; d <- b;
Mientras r != 0 haz lo siguiente
r <- mod(D,d) //resto de la división entera
D <- d
d <- r
fin
el resultado es: D
Como ejemplo y antes de resolver el problema aplica este algoritmo, para determinar el m.c.d.(35, 25).
13. Realiza un programa que muestre, para cada tipo definido en el capı́tulo, el número de bytes que tiene
asignado, junto con el rango y la precisión. Por ejemplo, parte de la salida podrı́a ser:
4
..........
...........
..........
El tipo float ocupa 4 bytes
El rango de sus valores es de 1.17549e-038 a 3.40282e+038
Su precisión es de 6 cifras significativas
....................
...................
14. Escribe un programa que dado un carácter, obtenga su correspondiente código ASCII en decimal, octal y
hexadecimal. Un ejemplo de ejecución del código podrı́a ser:
Seguidamente, haz otro programa que ejecute el proceso inverso esto es, que se pueda introducir un valor
entre 0 y 255 y obtenga el correspondiente carácter. Analiza si existe alguna diferencia entre utilizar char
y unsigned char.
15. Realiza un programa que determine que para C, cualquier valor distinto de 0 es verdadero, pero si es 0,
entonces es falso.
Peso en Kg.
IMC =
Altura en metros2
da una estimación sobre el peso correcto según la altura. Se pide que realices un programa en que dados un
peso y una altura, se calcule el IMC. Una posible ejecución podrı́a ser:
18. Escribe un programa en el que se introduzcan las coordenadas cartesianas de un punto del plano y devuelva
por pantalla su distancia al origen.
(Nota: se pueden utilizar las funciones matemáticas del C).
5
19. Escribe un programa en el que se introduzcan las coordenadas de un punto y devuelva sus coordenadas
polares.
(Nota: se pueden utilizar las funciones matemáticas del C).
20. Dada la siguiente instrucción
21. Haz un programa que lea un entero sin signo y lo imprima, pero debe comprobar que la entrada es correcta.
Esto es, si se introduce un carácter, ha de tenerse la posibilidad de repetir la entrada, sin detener la ejecución
del programa. Un posible ejemplo serı́a:
25. Anteriormente ya se ha definido el Índice de Masa Corporal. Se pide que hagas un programa que una vez
calculado este coeficiente, tenga una salida que se ajuste al cuadro 1 utilizando if...else múltiple. Una
posible ejecución podrı́a ser
6
Resultados del Índice de Masa Corporal
26. Realiza un programa de forma que introducido un año, determine si es bisiesto o no. Para resolver este
ejercicio se puede consultar la página Leap Year de Wikipedia en inglés.
27. Realiza un programa que escriba en un fichero, una tabla con las potencias cuadradas y cúbicas de los n
primeros números naturales, donde n debe ser seleccionado desde el teclado (ha de cumplirse que n 6 100).
Este resultado debe escribirse en un fichero llamado [Link]. Una posible ejecución del programa
podrı́a ser
7
28. Razón áurea. Calcula el valor de la fracción continua
1
1+
1
1+
..
.
..
.
1
1+
1
1+
1
1+
1
1+
1+1
La entrada del programa debe ser un valor entero que determine la cantidad de términos que deben calcularse.
√
Se trata de una sucesión que se aproxima al número áureo o razón áurea: (1 + 5)/2. A continuación se
pide que hagas un programa que dado un valor (por ejemplo: 10−6 ), se determine el número de términos de la
sucesión que se necesitan, para obtener una aproximación de la razón áurea, menor que el valor introducido.
En la salida también debe darse esta aproximación.
29. Escribe un programa que determina todos los divisores de un numero natural y el resultado lo escriba en un
fichero llamado [Link]. Una posible ejecución podrı́a ser:
30. Con las funciones getc y putc escribe un programa, que lea un texto de un fichero de entrada (por ejemplo
[Link]) y escriba dicho texto, en un fichero de salida (por ejemplo [Link]). Se debe poder
contar el número de caracteres del texto (incluidos los blancos). Por ejemplo, el fichero [Link]
podrı́a contener el texto:
31. Utilizando un bucle for, escribe un programa que calcule el factorial de un número natural n, introducido
por el teclado. Ten en cuenta, que el valor del factorial para números mayores de 21 no es muy precisa1 ,
debido a un posible desbordamiento (overflow). Una posible ejecución del programa podrı́a ser:
8
***************************
y el resultado
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 = 15 ! = 1307674368000
39. Realiza un programa que imprima un cuadrado de asteriscos en un fichero llamado [Link]. El dato
de entrada n, será el tamaño del lado. Por tanto el cuadrado contendrá n × n asteriscos. Un ejemplo de
ejecución serı́a:
9
con una salida de la forma
*****
*****
*****
*****
*****
a) Con la misma idea que en el caso anterior, ahora que imprima, para un tamaño n, un triángulo de
forma:
&
&&
&&&
&&&&
&&&&&
&&&&&&
(en este caso n = 6)
b) Ahora un triángulo de la forma
$$$$$$
$$$$$
$$$$
$$$
$$
$
(n = 6)
c) El siguiente con la forma
######
#####
####
###
##
#
(n = 6)
d) Por último, una pirámide de la forma:
@
@@@
@@@@@
@@@@@@@
@@@@@@@@@
@@@@@@@@@@@
(n = 6)
40. Se llama triángulo de Floyd al triángulo rectángulo formado con números naturales. Para crear un triángulo
de Floyd, se comienza con un 1 en la esquina superior izquierda, y se continúa escribiendo la secuencia de
los números naturales de manera que cada lı́nea contenga un número más que la anterior. Por ejemplo, el
triángulo de Floyd para n = 4 serı́a:
10
1
2 3
4 5 6
7 8 9 10
Se pide que hagas un programa que dado un número n (tamaño del cateto), se imprima el triángulo de Floyd,
en un fichero.
41. Realiza un programa que implemente el método congruencial lineal y obtenga 20 números aleatorios. La
salida debe realizarse a un fichero llamado [Link] y se debe poder guardar los resultados obtenidos
con ejecuciones anteriores. Prueba con los valores a = 5, b = 3, m = 16 y n0 = 7. Repite la ejecución
cambiando los valores de la semilla.
42. Realiza un programa que determine los n números enteros pseudo-aleatorios en el intervalo [M, N ] cuyos
extremos deben introducirse por teclado y la salida debe escribirse en un fichero. Se debe introducir también
el valor de la semilla y observar en el fichero las diferentes sucesiones obtenidas para diferentes semillas.
Implementar la obtención de la semilla mediante la lectura del reloj del sistema.
43. Realiza un programa que determine los n números reales pseudo-aleatorios en el intervalo [a, b] cuyos
extremos deben introducirse por teclado y la salida debe escribirse en un fichero. Se debe introducir también
el valor de la semilla y observar en el fichero las diferentes sucesiones obtenidas para diferentes semillas.
Implementar la obtención de la semilla mediante la lectura del reloj del sistema.
44. Realiza un programa que simule el lanzamiento de una moneda 1,000,000 de veces y obtener la frecuencia
absoluta para cada una de las distintas caras.
45. Realiza un programa que simule el lanzamiento de un dado 6,000,000 de veces y obtener la frecuencia
absoluta para cada una de las distintas caras. ¿Cuál serı́a la probabilidad de cada una de las caras?
46. Utiliza uno de los dos algoritmos de Box-Muller planteados en teorı́a, para simular un conjunto de números
aleatorios con distribución Normal N (µ, σ), cuyos valores µ y σ deben introducirse por teclado ası́ como,
el número de datos que se deben generar.
47. Comprueba, tal y como dice en la teorı́a, que el segundo algoritmo de Box-Muller es más eficiente que el
primero.
48. Anteriormente has realizado un programa que calculaba la tabla de los cuadrados y cubos de los n primeros
números naturales. Amplı́a este programa para que también te pida la potencia. Por ejemplo, una posible
ejecución podrı́a ser:
y la salida aproximadamente:
11
3 9 27 81 243
4 16 64 256 1024
5 25 125 625 3125
6 36 216 1296 7776
7 49 343 2401 16807
8 64 512 4096 32768
9 81 729 6561 59049
10 100 1000 10000 100000
49. Se pide que a partir de un intervalo dado se generen una cierta cantidad de números aleatorios enteros:
x1 , . . . , xn y con ellos calcules la media y la cuasi-desviación tı́pica muestral, esto es:
n √
1X
x= xi y s= s2
n
i=1
donde
n
!
1 X
s2 = x2i − nx2
n−1
i=1
La media es 5.690000000
La CuasiDesviación Tı́pica muestral es 2.751289872
12
50. Dado un número real x definido de la forma
n
1
x=1+ con n∈N
2
se pide que realices un programa que determine el mayor número natural n0 tal que se cumpla:
n
1
x=1+ >1
2
El programa debe permitir al usuario seleccionar si el cálculo se realiza en simple precisión, tecleando la
letra S o en doble precisión, tecleando la letra D.
Una ejecución tı́pica del programa con salida en pantalla serı́a:
El valor de n0 es: 95
El valor de 1/2 elevado a n0 es: 0.0023430127
51. Programa un código en el que la computadora genere un número entero aleatorio entre 1 y 100 y el usuario
lo adivine. Cada intento del usuario introduciendo un número por teclado debe tener respuesta orientativa de
la computadora (el número introducido es mayor/menor).
El número debe ser generado con semilla variable en base al reloj del sistema.
El usuario debe tener la opción de abandonar a mitad del juego.
Cuando el usuario adivine el número se le informará de los intentos que ha realizado.
Cuando haya ganado se ofrecerá al usuario la posibilidad de volver a jugar (nueva ejecución), de
manera que tras varias partidas se le informe de la cantidad media de intentos que ha hecho a lo largo
de todas las ejecuciones.
El número de intentos de cada juego, el número de ejecuciones y la media de intentos se grabarán en
un fichero cuyo nombre será introducido por teclado.
Apellidos:
Nombre:
No de Matrı́cula:
***************************
Introduce el número natural que crees que es (0 para terminar): 20
El número introducido es menor.
Introduce el número natural que crees que es (0 para terminar):30
El número introducido es mayor.
13
Introduce el número natural que crees que es (0 para terminar):25
Has adivinado en 3 intentos. ¿Jugamos de nuevo?
(Propuesto en examen: curso 15/16)
52. Programa un código que implemente el algoritmo para calcular la potencia enésima (con n ∈ N) de la suma
de dos números enteros mediante la expresión
n
X n
(a + b)n = ak bn−k .
k=0 k
Apellidos:
Nombre:
No de Matrı́cula:
***************************
Introduce dos números enteros: -5 12
Introduce la potencia: -2
Introduce la potencia: (1) 2
Las potencias de a = −5 son: - - - -
Las potencias de b = 12 son: - - - -
Los números combinatorios son: - - - -
El resultado es: - - - -
(1)Control de entrada de dato correcto.
(Propuesto en examen: curso 15/16)
x = (x1 , x2 , . . . , xn )
14
***** Nombre: Jdkdkdkd
**** Apellidos: Skdkdkd Rdkdkdkd
**** Matricula: 1111111
***************************
54. Escribe un programa que abra un fichero con un nombre especificado por el usuario y añada lo que el usuario
teclea.
55. Dada una cadena de caracteres escribe un programa que cuente el número de caracteres e invierta la frase
(debe aparecer escrita al revés). Una ejecución tı́pica del programa debe ser:
15
El polinomio producto
Se pide que hagas un programa que calcule el producto de dos polinomios cuyos coeficientes se introducirán
por el teclado y el polinomio producto resultante, se imprimirá en un fichero de datos, cuyo nombre se deberá
introducir por teclado, previamente.
57. Realiza una tabla de números primos. Se debe introducir un número natural n y escribir en un fichero, la
tabla de todos los primos menores o iguales que n, ası́ como la cantidad de números primos que hay. Un
ejemplo de ejecución serı́a:
y el resultado
1 ; 2 ; 3 ; 5 ; 7 ; 11 ; 13 ; 17 ; 19 ; 23
58. Dada una matriz A ∈ Mm×n haz un programa que imprima su matriz transpuesta en un fichero de datos. A
continuación, si A es una matriz cuadrada de dimensión n, haz un programa que determine su transpuesta
y la almacene en las mismas posiciones de memoria que la matriz de entrada (obviamente los datos de
la matriz de entrada cambiarán por los coeficientes de la matriz transpuesta). Si quieres puedes utilizar el
dimensionamiento dinámico.
En un espacio vectorial euclı́deo (como (Rn , ·)), esta operación se llama producto diádico o tensorial de a
y b y da lugar a una forma bilineal que recibe el nombre de tensor y opera de la forma
(a ⊗ b) · v = (b · v) a ∀ v ∈ Rn
16
60. Escribe un programa que calcule kAk∞ y kAk1 con A ∈ Mn×m .
m
X n
X
kAk∞ = máx |ai, j | kAk1 = máx |ai, j |
16i6n 16j6m
j=1 i=1
61. Escribe un programa que determine si una matriz cuadrada es diagonal dominante. Se dice que una matriz
cuadrada es diagonal dominante si
n
X
|ai, i | > |ai, j |
j=1
i6=j
62. Resuelve la ecuación de segundo grado utilizando el tipo complex, para la solución.
63. Haz un programa que pida un número complejo por teclado y compruebe la igualdad:
Introduce X[2] = 2
Introduce Y[2] = 1
Introduce X[3] = 3
Introduce Y[3] = 4
Introduce X[4] = 0
Introduce Y[4] = 3
Introduce X[5] = 1
Introduce Y[5] = 2
17
y la salida, en un fichero, debe ser
Se ha introducido el polı́gono con vértices:
X[1] = 0.00 Y[1] = 0.00
X[2] = 2.00 Y[2] = 1.00
X[3] = 3.00 Y[3] = 4.00
X[4] = 0.00 Y[4] = 3.00
X[5] = 1.00 Y[5] = 2.00
El perı́metro es 12.21090
65. Se pide que realices un programa que permita descomponer una matriz cuadrada real de tamaño n, A en
suma de una matriz simétrica S y una matriz antisimétrica T, utilizando la siguiente expresión:
1 1
A + At + A − At
A=
|2 {z } |2 {z }
S T
en donde At es la matriz traspuesta de A. Una ejecución tı́pica del programa debe ser:
***** Nombre: Jdkdkdkd
**** Apellidos: Skdkdkd Rdkdkdkd
**** Matricula: 1111111
***************************
Introduce A[1][1] = 1
Introduce A[1][2] = 2
Introduce A[1][3] = 3
Introduce A[2][1] = 4
Introduce A[2][2] = 5
Introduce A[2][3] = 6
Introduce A[3][1] = 7
Introduce A[3][2] = 8
Introduce A[3][3] = 9
18
Capı́tulo–6. Punteros
66. Realiza un programa que declare e inicialice una variable de tipo double. A continuación declara un
puntero a double, que apunte a la variable anterior. A través del puntero, suma y resta una cantidad constante.
En un fichero, escribe el valor inicial de la variable con su dirección y el resultado final con su dirección.
67. Dado el vector real V = [−2,45, 0,23, −45,98, −23,25, 1,89], se pide que realices un programa que asigne
un puntero al vector y mediante este puntero, opera adecuadamente para incrementar cada componente en
25 unidades. En un fichero de salida se debe escribir el resultado final, con la dirección de memoria de cada
componente. Primero hazlo con un tipo float y después con un tipo double. Observa el valor de las
direcciones de memoria.
68. Ejemplo de *++ptr. Se pide que asignes el puntero ptr a la cadena de caracteres: Me gusta programar
en C y a continuación imprime en un fichero, la salida como consecuencia de operar: *++ptr.
69. Ejemplo de (*ptr)-- -. Se pide que asignes el puntero ptr a la cadena de caracteres: Me gusta
programar en C y a continuación imprime en un fichero, la frase escrita del revés.
70. Dada la matriz real
−1,56 5,0 −23,764
A = 34,257 12,34 −25,074
95,72 −84,73 0,34
se pide que le asocies un puntero y a través de este puntero escribas los valores de las componentes junto
con las respectivas direcciones de memoria.
71. Escribe un programa que permute las filas dadas de una matriz real dada.
72. En este ejercicio se trata de ilustrar la diferencia del concepto de matriz en C, con el de doble puntero (**
PtrMat).
a) Declara e inicializa la matriz
−1,56 5,0 −23,764
A = 34,257 12,34 −25,074
95,72 −84,73 0,34
después escribe en un fichero esta matriz, con las direcciones de memoria de cada una de sus componentes.
19
Capı́tulo–7. Funciones
74. Haz un programa en el que se defina la función Presentacion() cuyo objetivo es que escriba en pantalla,
el número de matrı́cula, el nombre y los apellidos. Mejora esta función para que los mismos datos se escriban
en un fichero de salida.
75. A partir de la función potencia, que debes haber definido previamente, realiza un programa en la que
se defina y utilice una función que calcule la potencia de dos números enteros. Esto es, dados m y n, que
calcule mediante una función, el valor: mn y lo imprima en un fichero.
76. Utiliza la función definida anteriormente para calcular las variaciones con repetición de m elementos toma-
dos de n en n ya planteado en problemas anteriores.
77. Define una función Factorial y utilı́zala, para calcular las variaciones sin repetición de m elementos
tomados de n en n y para determinar el número combinatorio
m m!
=
n n!(m − n)!
conceptos ya vistos en problemas anteriores. Una vez visto el concepto de recursividad, reescribe la función
Factorial para que el cálculo se realice de forma recursiva.
78. Escribe un programa que dado un número m ∈ N, calcule todos los números combinatorios siguientes:
m m m m
, , ,...,
0 1 2 m
y muestre todos ellos en un fichero de salida, en el mismo orden. En este ejercicio y a partir del problema
anterior, es obligado que se defina y utilice una función combinatorio cuyo argumento de entrada sean
dos números positivos y la salida su número combinatorio correcto.
(Propuesto en examen: curso – 2014/15)
a) Se pide que se escriba un programa que dado un número natural m > 1 calcule 2m , SIN utilizar la
función pow(x,y) de la biblioteca de C. Por tanto, se tendrá que definir la función correspondiente.
b) Además el programa debe evaluar el binomio de Newton (esto es, programar el miembro de la derecha
de la igualdad anterior), para comprobar que el cálculo anterior es correcto y mostrarlo en un fichero
de salida. Después deben analizarse si ambos resultados son iguales. Si los son, la salida debe ser
Se cumple la igualdad establecida por el Binomio de Newton
si no,
Uff!! algo falla en el programa.
80. Escribe una función que describa el Algoritmo de Horner y utilı́zala para determinar el valor de un polinomio
dado en el punto x0 .
x = (x1 , x2 , . . . , xn )
20
a) Calcular el valor de las normas:
n
√ X
kxk2 = x · x; kxk1 = |xi |; kxk∞ = máx |xi |
16i6n
i=1
82. Teniendo en cuenta la tabla de números primos realizada en un problema anterior, haz un programa que
construya una tabla con la descomposición en factores primos de un número natural dado N . Para ello, debe
construirse una función que determine los números primos menores que N y utilizar este resultado, para
obtener la descomposición en factores primos.
83. Se llama número de Armstrong al número que verifica la propiedad de que la suma de cada uno de sus
dı́gitos elevado a la potencia del número de dı́gitos, coincide con su valor. Por ejemplo el número 371 es un
número de Armstrong ya que cumple
33 + 73 + 13 = 371
o bien, el número 92727
95 + 25 + 75 + 25 + 75 = 92727
Otros números de Armstrong son: 1, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834. Se
pide que hagas una función de manera que dado un número natural N , determine si es de Armstrong o no.
A partir de esta función, haz un programa que calcule los números de Armstrong menores de 108 (hay 27 y
menores a 109 , 31) y los imprima en un fichero.
21
84. Haz una función tal que dada una matriz permita permutar dos filas de la matriz.
85. Haz una función tal que dada una matriz A ∈ Mn×m (R), se obtenga su transpuesta.
(Sugerencia: constrúyase la matriz transpuesta sobre una matriz cuadrada de tamaño máx(n, m)).
86. Dada una matriz A ∈ Mn×m , se dice que uno de sus coeficientes es un punto de silla si es el máximo de su
fila y mı́nimo de su columna o bien, si es el mı́nimo de su fila y máximo de su columna. Se pide que hagas
un programa que determine los posibles puntos de silla de una matriz entera dada A ∈ Mn×m (Z). Se deben
definir y utilizar al menos 3 funciones: Maximo, Minimo y PuntoSilla desde la cual, se debe imprimir
la solución. Una ejecución tı́pica del programa debe ser:
Introduce A[1][1] = 1
Introduce A[1][2] = 2
Introduce A[1][3] = 3
Introduce A[2][1] = 5
Introduce A[2][2] = 6
Introduce A[2][3] = 7
Introduce A[3][1] = 4
Introduce A[3][2] = 1
Introduce A[3][3] = 9
87. Haz un programa que calcule el área de un polı́gono simple, mediante la utilización de una función area.
Un argumento de entrada de la función debe ser un puntero al vector del tipo punto, que contiene las
coordenadas de los vértices.
88. Haz un programa que calcule el m.c.d. de dos números naturales mediante el algoritmo de Euclides, definida
en una función cuya codificación debe estar realizada de manera recursiva.
89. En un curso de álgebra lineal se define la Traza de una matriz A ∈ Mm×n como la suma de las componentes
de la diagonal principal. Esto es
a1, 1 . . . a1, n
k
.. ..
A= . . .
X
. . =⇒ T r(A) = aii donde k = mı́n(n, m)
i=1
am, 1 . . . am, n
22
En el caso de matrices del mismo tamaño, el concepto de traza se puede asociar al de un operador lineal.
En este ejercicio se pide que dada una matriz simétrica aleatoria A ∈ Mn×n calcules su componente
desviatoria esto es
1
AD = A − T raza(A)I
n
donde I es la matriz identidad. El concepto de componente desviatoria es una generalización matemática de
la componente desviatoria del tensor de tensiones, que indica cuánto se aparta el estado tensional un sólido,
respecto de un estado hidrostático o isotrópico.
Para realizar el ejercicio se debe:
a) definir una función llamada MatSimAl que obtenga la matriz simétrica aleatoria, en la cual se pida los
extremos del intervalo en donde estarán los números aleatorios, ası́ como la semilla para generarlos.
El proceso para generar esta matriz es muy sencillo. No obstante, se puede seguir la siguiente sugeren-
cia
Como argumento de la función debe estar el puntero a una matriz cuadrada. A continuación, en la parte triangular
superior de la matriz se situarán los números aleatorios (el proceso es similar al realizado en clase de prácticas,
para imprimir figuras triangulares de ejercicios planteados en el capı́tulo de Sentencias de Control). Es decir,
Una vez asignados estos valores, se rellenan las componentes de la parte triangular inferior con la regla:
aj, i = ai, j
El intervalo es [-1, 5]
La semilla es -1
23
-1.00; 3.00; -1.00;
2.00; -1.00; 1.00;
90. En un curso de álgebra lineal se define la Traza de una matriz A ∈ Mm×n como la suma de las componentes
de la diagonal principal. Esto es
a . . . a1, n
1, 1 k
.. ..
A= . .. =⇒ T r(A) =
X
aii donde k = mı́n(n, m)
. .
i=1
am, 1 . . . am, n
En el caso de matrices del mismo tamaño, el concepto de traza se puede asociar al de un operador lineal.
En este ejercicio se pide que dado un vector aleatorio real v ∈ Rn , se calcule el valor de la traza del
producto diádico del vector v por sı́ mismo. Esto es
T r(v ⊗ v)
a) definir una función llamada VectorAleatorio que genere el vector aleatorio v, en la cual se pida
los extremos del intervalo en donde estarán los números aleatorios, ası́ como la semilla para generarlos.
b) definir una función llamada ProdTensorial, que a partir del vector v se genere la matriz corres-
pondiente al producto diádico o tensorial del vector v por sı́ mismo.
c) definir una función llamada Traza que determine la traza de una matriz cualquiera y sea utilizada
para obtener el resultado pedido. Su aplicación debe hacerse desde el programa principal.
Una ejecución tı́pica del programa con salida en pantalla serı́a:
El intervalo es [-1, 2]
La semilla es -3
El vector aletorio es de tamaño 5 con valores:
-0.99744; -0.24540; -0.96219; 1.61400; -0.02228;
24
La matriz del producto diádico es:
0.99488; 0.24477; 0.95972; -1.60986; 0.02222;
0.24477; 0.06022; 0.23612; -0.39607; 0.00547;
0.95972; 0.23612; 0.92580; -1.55297; 0.02144;
-1.60986; -0.39607; -1.55297; 2.60500; -0.03596;
0.02222; 0.00547; 0.02144; -0.03596; 0.00050;
91. Programa un código que calcule áreas y perı́metros de figuras planas. Se ofrecerá al usuario un menú con la
posibilidad de elegir entre cuatro opciones y una vez que el usuario haya elegido una figura, se le pedirá que
introduzca los datos necesarios para los cálculos.
Para cada figura deberá construirse una función que calcule su área y su perı́metro en términos de los datos
introducidos.
Las coordenadas de los vértices y las salidas de las funciones se guardarán en variables de tipo estructura.
Figuras a ofrecer y datos a pedir:
Cı́rculo: radio.
Cuadrado: vértices.
Triángulo: vértices.
Concluido el programa y comprobado su buen funcionamiento, se añadirá una función que guarde en un
fichero los datos y los resultados. El nombre del fichero será introducido por teclado desde la función prin-
cipal.
Se ofrecerá al usuario la oportunidad de elegir más de una figura. En ese caso, todos los resultados se
guardarán en el mismo fichero.
(Propuesto en examen: curso 15/16).
92. Programa un código para calcular el área y el perı́metro de un polı́gono simple cuyos vértices son puntos
del plano real. Para el cálculo del perı́metro debe usarse la fórmula de la distancia entre dos puntos y para el
cálculo del área la expresión
n−1
1 X x i x i+1
Área = det ,
2 y y
i=0 i i+1
donde n es el número de vértices y (xn , yn ) son las coordenadas del primer punto.
El número de vértices será introducido por teclado, con control de dato correcto.
Las coordenadas de los vértices se introducirán por teclado y se guardarán en variables de tipo es-
tructura. Es necesario que los vértices se introduzcan de forma consecutiva, siguiendo el borde del
polı́gono.
Deberá haber al menos cuatro funciones, cada una con uno de los siguientes objetivos:
• Cálculo de la distancia entre dos vértices.
• Cálculo del determinante para cada par de vértices.
• Cálculo del perı́metro.
• Cálculo del área.
Concluido el programa y comprobado su buen funcionamiento, se añadirá una función que imprima
en un fichero los datos y los resultados. El nombre del fichero será introducido por teclado desde la
función principal.
25
Se ofrecerá al usuario la oportunidad de introducir más de un polı́gono. En ese caso, todos los resulta-
dos se guardarán en el mismo fichero.
En este ejercicio se pide que dado un polinomio con coeficientes enteros P (x) obtengas la sucesión que
genera el método para aproximar y(1) ≈ yM .
Para realizar el ejercicio se debe:
a) introducir desde teclado el nombre de un fichero en el que se escribirán los datos de salida.
b) introducir el número de pasos, M , para generar la sucesión que aproxima y(1), ası́ como el grado del
polinomio P (x), n.
c) definir una función llamada GenPol que obtenga los coeficientes enteros aleatorios del polinomio
P (x), en la cual se pida los extremos del intervalo en donde estarán los números aleatorios, ası́ como
la semilla para generarlos. Los coeficientes del polinomio resultante serán reales de doble precisión,
se imprimirán por pantalla y en el fichero desde el programa principal.
d) definir una función llamada Pol que calcule, y devuelva, el valor del polinomio P (x) para un valor
real cualquiera x, que deberá ser real de doble precisión.
e) definir una función llamada Euler que genere la sucesión de valores yi i = 0, 1, . . . , M que será
devuelta al programa principal en un vector.
f ) por último, desde el programa principal debe imprimirse en el fichero y por pantalla la sucesión de
puntos (xi , yi ) i = 0, 1, 2, . . . , M , siendo yM ≈ y(1)
26
Coeficientes (vector V ) generados->
[Link] grado 0-> V[0]=1.00 [Link] grado 1-> V[1]=1.00
[Link] grado 2-> V[2]=4.00 [Link] grado 3-> V[3]=3.00
Sucesión generada:
Salida de los puntos x(i) y sus aproximaciones y(i)
i x(i) y(i)
0 0.0000 1.0000
1 0.1000 1.0368
2 0.2000 1.0758
3 0.3000 1.1193
4 0.4000 1.1690
5 0.5000 1.2259
6 0.6000 1.2899
7 0.7000 1.3598
8 0.8000 1.4336
9 0.9000 1.5091
10 1.0000 1.5842
94. Se pide que realices un programa que determine el vector y ∈ Rn , resultado del producto de la matriz
A ∈ Mn×n con el vector x ∈ Rn . Matricialmente:
y1 a1, 1 . . . a1, n x
1 n
.. .. .. ..
.. ⇐⇒
X
. = . . . . y i = ai, j xj con i = 1, 2, . . . , n
j=1
yn an, 1 . . . an, n xn
a) definir una función llamada VecMatInt en la que se establezcan las componentes del vector x y de
la matriz cuadrada A. Si la introducción se realiza mediante números aleatorios, en esta función se
debe introducir el intervalo en donde estarán los números aleatorios, ası́ como la semilla. Si se opta
por introducir las componentes por teclado, deberá programarse de manera clara y ordenada para que
el usuario sepa qué componentes del vector x y de la matriz cuadrada A está introduciendo.
b) definir una función llamada Prod en la que se realice el producto pedido.
c) imprimir, desde el programa principal, el vector y resultado del producto obtenido en la función Prod.
Una ejecución tı́pica del programa con salida en pantalla serı́a:
27
**** Apellidos: Kskdiekdkm Rosldoe
**** Número de matrı́cula: 111111
************************************
El intervalo es [-2, 5]
La semilla es -1
El vector aletorio es de tamaño 3 con valores:
1.00; 1.00; 4.00;
28