Ejercicios sobre Descomposición Funcional, Parte II 1. Escribir un programa que haga uso de las siguientes funciones: tcomplejo SumarComplejos(tcomplejo, tcomplejo); que sume dos números complejos. tcomplejo RestarComplejos(tcomplejo, tcomplejo); que reste dos números complejos. tcomplejo MultiplicarComplejos(tcomplejo, tcomplejo); que multiplique dos complejos. /******************* srmcomplejos *******************/ typedef struct float real; float imag; tcomplejo; tcomplejo SumarComplejos(tcomplejo, tcomplejo); tcomplejo RestarComplejos(tcomplejo, tcomplejo); tcomplejo MultiplicarComplejos(tcomplejo, tcomplejo); void main(void) tcomplejo ca, cb, cc; printf("\n Introducir datos de la forma: x yi\n"); printf("ca = "); fflush(stdin); scanf("%f %f", &ca.real, &ca.imag); printf("cb = "); fflush(stdin); scanf("%f %f", &cb.real, &cb.imag); printf("\nresultado de la suma de complejos: \n"); printf("----------------------------------\n"); cc = SumarComplejos(ca,cb); printf("%g %+gi\n",cc.real,cc.imag); 1
printf("\n Resultado de la resta de complejos\n"); printf("----------------------------------\n"); cc = RestarComplejos(ca, cb); printf("%g %+gi\n",cc.real,cc.imag); printf("\nresultado de la multiplicacion de complejos\n"); printf("-------------------------------------------\n"); cc = MultiplicarComplejos(ca, cb); printf("%g %+gi\n",cc.real,cc.imag); tcomplejo SumarComplejos(tcomplejo a, tcomplejo b) tcomplejo temp; temp.real = a.real + b.real; temp.imag = a.imag + b.imag; return temp; tcomplejo RestarComplejos(tcomplejo a, tcomplejo b) tcomplejo temp; temp.real = a.real - b.real; temp.imag = a.imag - b.imag; return temp; tcomplejo MultiplicarComplejos(tcomplejo a, tcomplejo b) tcomplejo temp; temp.real = a.real * b.real - a.imag * b.imag; temp.imag = a.real * b.imag + a.imag * b.real; return temp; 2
Funciones recursivas 2. El siguiente programa, cuenta valores de 1 a 10 de modo recursivo. void contar(int cima); void main(void) contar(10); return; void contar(int cima) if(cima >1) contar(cima - 1); printf("%d ",cima); 3. El cálculo de los números de Fibonacci es un ejemplo de una definición matemática recursiva que se enuncia así: el número de Fibonacci f(i), siendo i el número de orden(0, 1, 2, 3, 4, 5,...) del número a calcular, es igual al número de Fibonacci f(i 1) más el número de Fibonacci f(i 2), sabiendo que f(0) es 0 y f(1) = 1. f(0) = 0 f(1) = 1 f(2) = f(1) + f(0) f(3) = f(2) + f(1)... f(i) = f(i - 1) + f(i 2) Realizar un programa que pregunte: cuántos números de Fibonacci, a partir del primero, se quieren calcular?, almacene esos números en una matriz del tamaño necesario y finalmente los muestre. Para ello se deberá utilizar una función recursiva con el prototipo indicado a continuación: int fibonacci(int n); La función fibonacci devolverá como resultado el número de Fibonacci cuyo número de orden(0, 1, 2,...) sea n. 3
Una ejecución del programa podría ser: Cuántos números de Fibonacci, a partir del primero, se quieren calcular? n = 10 0 1 1 2 3 5 8 13 21 34 // fibonacci.c // #include <stdlib.h> int fibonacci(int); int main() int n = 0, i = 0, *f; printf(" Cuántos números de Fibonacci, a partir del "); printf("primero, se quieren calcular?\n"); do printf("n = "); i = scanf("%d", &n); fflush(stdin); while ( i == 0 n < 1); // Crear una matriz dinámicamente f = (int *)malloc(n * sizeof(int)); if (f == NULL) printf("insuficiente memoria\n"); return -1; // Obtener los números de la serie for (i = 0; i < n; i++) f[i] = fibonacci(i); // Visualizar la matriz for (i = 0; i < n; i++) printf("%5d", f[i]); printf("\n"); 4
// Liberar la memoria asignada a la matriz free(f); return 0; int fibonacci(int n) if ( n == 0 ) return 0; else if ( n == 1 ) return 1; else return fibonacci(n-1) + fibonacci(n-2); 4. Dados dos números a (número entero) y b(número natural mayor o igual que cero). Realice una función recursiva para determinar a^b //recur1.c main() int a, c; unsigned b; printf("escriba el numero y la potencia a elevar como a^b: "); scanf("%d^%u", &a,&b); c = potencia(a,b); printf("c = %d",c); int potencia(int a, int b) if(b = = 0) return 1; else return a * potencia(a, b-1); 5
5. Dado un array constituido de números enteros que contiene N elementos, siendo N >=1, realice una función recursiva que calcule la suma de todos los elementos del array. //recur2.c main( ) int numeros[25]; int N, i; printf("cuantos numeros tiene el arreglo? \n"); scanf("%d",&n); printf("introduzca el arreglo: "); for(i = 0; i < N; i++) scanf("%d",&numeros[i]); printf("%d \n", sumarray(numeros,0,n)); int sumarray(int numeros[ ], int posicion, int N) if(posicion == N - 1) return numeros[posicion]; else return(numeros[posicion] + sumarray(numeros, posicion + 1, N)); 6