Autor Tema: Ejemplo funciones en C Calcular series de números impares LenguajeC CU00552F  (Leído 2727 veces)

Pandemia

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 255
    • Ver Perfil
Buenas noches amigos aquí os dejo una posible solución al ejercicio CU00552F.

Citar
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”.

 

Código: [Seleccionar]
//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);
}

Solución

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

#define NMAX 19
int obtenerValorParaCalculo();
long resolverSumatorio (int numeroItemsSum);
long 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
}

long 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);
}

long 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);
}

« Última modificación: 05 de Agosto 2016, 14:36 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenas tardes, el ejercicio indica que <<los mensajes no sean mostrados por las distintas funciones, sino que la muestra de mensajes sea realizada exclusivamente por la función main>>

Tu código no cumple con lo que se pedía, ya que dentro de las funciones tienes instrucciones printf para mostrar mensajes por pantalla.

Puedes contrastar tu solución con la propuesta en este otro hilo: https://www.aprenderaprogramar.com/foros/index.php?topic=4924.0

Saludos

Pandemia

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 255
    • Ver Perfil
Buenas tardes Mario y gracias por responder, no me había quedado claro el ejercicio,  lo he leído con más detenimiento y dejo el código nuevo.

Código: [Seleccionar]
//Programa cálculos con impares02
#include <stdio.h>
#include <stdlib.h>

#define NMAX 19

int obtenerValorParaCalculo();
long resolverSumatorio (int numeroItemsSum);
long 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)
            {
                printf("n = %d El valor del sumatorio es: %ld", valorParaCalculo, resolverSumatorio(valorParaCalculo));
            }
            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, 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
}
long resolverSumatorio (int valorCalculoSum)
{
    int impar = -1;
    long resultadoSum =0;
    do
    {
        impar = impar + 2;
        resultadoSum = resultadoSum + impar;
    }
    while (impar < valorCalculoSum);
    return resultadoSum;
}
long resolverProducto (int valorCalculoProd)
{
    int impar = -1;
    long resultadoProd = 1;
    do
    {
        impar = impar + 2;
        resultadoProd = resultadoProd * impar;
    }
    while (impar < valorCalculoProd);
    return resultadoProd;
}


Saludos y gracias por tu tiempo.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Así mejor, las funciones ahora se limitan a devolver algo mediante la sentencia return, que era lo que se pedía. Saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".