Ejercicios funciones en C. Ejemplo calcular series numéricas. Sumatorio n impares. Refactorizar. (CU00552F)

Resumen: Entrega nº52 del tutorial "Curso básico de programación en lenguaje C desde cero".
Codificación aprenderaprogramar.com: CU00552F

 

 

EJERCICIO RESUELTO Nº1: ENUNCIADO

Desarrollar un programa con las siguientes opciones:

a)   Introducir un valor entero impar comprendido entre 1 y 19

b)   Calcular la serie numérica 1 + 3 + 5 + ··· + n

c)   Calcular 1 * 3 * 5 * ··· * n

d)   Salir del programa.

logo lenguaje programacion C

 

Nota: los cálculos se han de realizar a través de un array que almacene los valores impares comprendidos entre 1y n, usando bucles y acumuladores para recorrer el vector y obtener resultados.

 

 

EJERCICIO RESUELTO Nº1: SOLUCIÓN

Aunque el problema podría resolverse usando fórmulas como:

sumatorio impares

 

Vamos a resolverlo tal y como indica el enunciado, usando arrays. Aunque a priori no conozcamos el valor entero impar con que hemos de realizar los cálculos, sí sabemos que ha de estar comprendido entre 1 y 19. Esto significa que como mucho tendremos que operar con diez datos (el número de impares que hay entre 1 y 19, es decir, 1, 3, 5, 7, 9, 11, 13, 15, 17 y 19).

//Programa cálculos con impares01
#include <stdio.h>
#include <stdlib.h>

#define NMAX 19

int valor[NMAX]; //Declaración de array como variable global, realmente solo usaremos 10 elementos
int numeroItems; //Declaración como variable global
int obtenerValorParaCalculo(); void rellenarArray (int numero);
long valorSumatorio (int numeroItemsSum); long valorProducto (int numeroItemsProd);
// Ejercicios resueltos de programación aprenderaprogramar.com

int main() {
    int valorParaCalculo=0;    int opcionUsuario = 1;
    while (opcionUsuario!=4) {
        printf("\n\n1: Introducir valor\n2: Calcular serie 1+3+5...\n");
        printf("3: Calcular serie 1*3*5...\n4: Salir\n\nElija opcion: ");
        scanf("%d", &opcionUsuario);

        if (opcionUsuario==1) {
            valorParaCalculo =  obtenerValorParaCalculo();
            rellenarArray (valorParaCalculo);
        }

        if (opcionUsuario==2) {
            if (valorParaCalculo!=0) {
                printf("n = %d El valor del sumatorio es: %ld", valorParaCalculo, valorSumatorio(numeroItems));
            } else {
                printf("No hay un valor para calculo que permita obtener sumatorio 1+3+5+...");
            }
        }

        if (opcionUsuario==3) {
            if (valorParaCalculo!=0) {
                printf("n = %d El valor del producto es: %ld", valorParaCalculo, valorProducto(numeroItems));
            } else {
                printf("No hay un valor para calculo que permita obtener resultado 1*3*5*...");
            }
        }
    }
    return 0;
}


int obtenerValorParaCalculo() {
    int imparElegido = 0;
    do {
        printf("\nPor favor introduzca numero entero impar entre 1 y 19: ");
        scanf("%d", &imparElegido);
    } while (imparElegido<=0 || imparElegido> NMAX ||imparElegido%2==0);
    return imparElegido;
}

void rellenarArray (int numeroElegido) {
    int impar = -1;     int i=0;
    do {
        i = i+1;
        impar = impar +2;
        valor[i] = impar;
    } while (impar < numeroElegido);
    numeroItems = i;
}

long valorSumatorio (int numeroItemsSum) {
    long resultadoSum =0;    int i=0;
    for (i=1; i<=numeroItemsSum; i++) {
        resultadoSum = resultadoSum + valor[i];
    }
    return resultadoSum; //Devolvemos el valor del sumatorio
}

long valorProducto (int numeroItemsProd) {
    int i=0;     long resultadoProd = 1;
    for (i=1; i<=numeroItemsProd; i++) {
        resultadoProd = resultadoProd * valor[i];
    }
    return resultadoProd; //Devolvemos el valor del producto
}

 

 

Comentarios: distintas variantes pueden ser introducidas para resolver este ejercicio. Te animamos a que intentes resolverlo de otras maneras. Para algunas variables hemos usado el tipo de dato long en lugar del tipo int. Con ello pretendemos evitar posibles problemas relacionados con las limitaciones que para los rangos numéricos supone trabajar con int. Al realizar cálculos con sucesiones geométricas los valores numéricos crecen muy rápidamente y a pesar de que int admite valores grandes, pueden ser insuficientes en algunos casos.

Un ejemplo de resultado que podemos obtener con este programa es el siguiente:

1: Introducir valor 2: Calcular serie 1+3+5...3: Calcular serie 1*3*5... 4: Salir

Elija opcion: 1                     Por favor introduzca numero entero impar entre 1 y 19: 9

Elija opcion: 2                     n = 9 El valor del sumatorio es: 25

Elija opcion: 3                     n = 9 El valor del producto es: 945

Elija opcion: 4

 

 

EJERCICIO RESUELTO Nº2: ENUNCIADO

Desarrollar un programa con las siguientes opciones:

a)   Introducir un valor entero impar comprendido entre 1 y 19

b)   Calcular la serie numérica 1 + 3 + 5 + ··· + n

c)   Calcular 1 * 3 * 5 * ··· * n

d)   Salir del programa.

 

Nota: los cálculos se han de realizar sin hacer uso de arrays. Este ejercicio es análogo (mismo enunciado) al anterior. Lo que pretendemos con su resolución es explorar distintas formas de resolver un mismo problema, aún sin plantearnos que sean formas de resolución óptimas.

 

EJERCICIO RESUELTO Nº2: SOLUCIÓN

//Programa cálculos con impares02
#include <stdio.h>
#include <stdlib.h>

#define NMAX 19
int obtenerValorParaCalculo(); void resolverSumatorio (int numeroItemsSum);
void resolverProducto (int numeroItemsProd);

int main() {
    int valorParaCalculo=0;    int opcionUsuario = 1;
    while (opcionUsuario!=4) {
        printf("\n\n1: Introducir valor\n2: Calcular serie 1+3+5...\n");
        printf("3: Calcular serie 1*3*5...\n4: Salir\n\nElija opcion: ");
        scanf("%d", &opcionUsuario);
        if (opcionUsuario==1) {
            valorParaCalculo =  obtenerValorParaCalculo();
        }

        if (opcionUsuario==2) {
            if (valorParaCalculo!=0) {
                resolverSumatorio(valorParaCalculo);
            } else {
                printf("No hay un valor para calculo que permita obtener sumatorio 1+3+5+...");
            }
        }

        if (opcionUsuario==3) {
            if (valorParaCalculo!=0) {
                resolverProducto(valorParaCalculo);
            } else {
                printf("No hay un valor para calculo que permita obtener resultado 1*3*5*...");
            }
        }
    }
    return 0;
}


int obtenerValorParaCalculo() {
    int imparElegido = 0;
    do {
        printf("\nPor favor introduzca numero entero impar entre 1 y 19: ");
        scanf("%d", &imparElegido);
    } while (imparElegido<=0 || imparElegido>NMAX ||imparElegido%2==0);
    return imparElegido; // Ejercicios resueltos de programación aprenderaprogramar.com
}

void resolverSumatorio (int valorCalculoSum) {
    int impar = -1;      long resultadoSum =0;
    do {
        impar = impar + 2;
        resultadoSum = resultadoSum + impar;
    } while (impar < valorCalculoSum);
    printf("n = %d El valor del sumatorio es: %ld", valorCalculoSum, resultadoSum);
}

void resolverProducto (int valorCalculoProd) {
    int impar = -1;     long resultadoProd = 1;
    do {
        impar = impar + 2;
        resultadoProd = resultadoProd * impar;
    } while (impar < valorCalculoProd);
    printf("n = %d El valor del producto es: %ld", valorCalculoProd, resultadoProd);
}

 

 

EJERCICIO

Reescribe el programa anterior para que todas las funciones tengan un tipo de retorno y que los mensajes no sean mostrados por las distintas funciones, sino que la muestra de mensajes sea realizada exclusivamente por la función main. Esto se corresponde con reorganizar o reescribir un código para mejorarlo, y a esto se le suele denominar “refactorización del código”.

 

Para comprobar si tus respuestas son correctas puedes consultar en los foros aprenderaprogramar.com.

 

 

 

 

 

 

Para acceder a la información general sobre este curso y al listado completo de entregas pulsa en este link:  Ver curso completo.

Para  hacer un comentario o consulta utiliza los foros aprenderaprogramar.com, abiertos a cualquier persona independientemente de su nivel de conocimiento.

Donar o colaborar

Este sitio se mantiene abierto gracias al apoyo de muchas personas. Si crees que merece la pena apoyar económicamente este sitio web puedes realizar una donación o colaborar. Contacta con nosotros.

¿Puedo yo aprender?

Seas o no del área informática, si quieres aprender a programar te ofrecemos una solución guiada y personalizada: realizar un curso tutorizado on-line. Con este tipo de curso, podrás aprender a programar de forma ágil y amena.

Acceder a detalles y precios de los cursos tutorizados on-line

Política sobre cookies

Utilizamos cookies propias y de terceros para ofrecerte una mejor experiencia y servicio, de acuerdo a tus hábitos de navegación.

Si continúas navegando, consideramos que aceptas su uso. Puedes obtener más información en nuestra Política de Cookies.

En Facebook!

Ahora puedes seguirnos en Facebook. Noticias, novedades y mucho más ¡Te esperamos!

RANKING APR2+

Ranking de lenguajes y entornos de programación aprenderaprogramar.com
 

JULIO - AGOSTO 2017

1. Java / J2EE
2. Entornos Oracle
3. Entornos SQL Server
4. JavaScript, jQuery
5. .NET, C#
6. HTML, CSS
7. Android, iOS
8. Php, MySql


Acceder a detalles sobre el ranking de programación aprenderaprogramar.com

FOROS APR2+

Pregunta, responde, consulta, lee, intercambia...

Participa!!! Entra en los foros aprenderaprogramar.com.

             Copyright 2006-2017 aprenderaprogramar.com                La web abierta a cualquier persona interesada en la programación