Departamento de Computación UNAN-LEON 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 *******************/ #include <stdio.h> 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 Departamento de Computación UNAN-LEON 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 Departamento de Computación UNAN-LEON Funciones recursivas 2. El siguiente programa, cuenta valores de 1 a 10 de modo recursivo. #include <stdio.h> 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 Departamento de Computación UNAN-LEON 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 // fibonacci.c // #include <stdio.h> #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 8 13 21 34 Departamento de Computación UNAN-LEON // 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 Departamento de Computación UNAN-LEON 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 #include <stdio.h> 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