Duda sobre variables y datos ingresados en ejercicio en C.

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
reaperss53
Mensajes: 3
Registrado: 03/09/2019 8:19 am

Duda sobre variables y datos ingresados en ejercicio en C.

#1 Mensaje por reaperss53 » 03/09/2019 8:24 am

Hola! Buenos días. Resulta que en realizando un ejercicio simple de C, quise agregarle una función para validar los datos. El problema es que cuando el usuario ingresa un dato erroneo (menor a 0), el dato erroneo es contabilizado al igual que el dato correcto.

Código: Seleccionar todo

/**25. Escribe una función que reciba como parámetro de entrada el valor de un año y devuelva como resultado un valor de tipo lógico que indique si es o no un
año bisiesto. Recuerda la regla: "Un año es bisiesto si es divisible por 400, o bien si es divisible por 4 pero no por 100"*/

#include<stdio.h>
#include<stdlib.h>

void main()
{
    int jahre;
    ingreso(&jahre);
    validar(&jahre);
    if(bisiesto(&jahre)==1)printf("\n\n\t\t%d es bisiesto.\n\n",jahre);
    else printf("\n\n\t\t%d no es bisiesto.\n\n",jahre);
    return 0;
}

void ingreso(int *jahre)
{
    printf("\n\n\nJahre: ");
    scanf("%d",&*jahre);
}

int bisiesto(int *jahre)
{
    if(*jahre%4==0)return 1;
    else return 0;
}

void validar(int *jahre)
{
    if(*jahre<0)
    {
        system("cls");
        printf("\n\t\tIngreso incorrecto. Reingresar.");
        main();
    }
}
Por ejemplo. Si ingreso -4, y después 2020. El programa me cuenta ambos ingresos al momento de mostrar el resultado final. La idea sería que solamente esté contabilizado el último ingreso (el correcto). Por si es de utilidad estoy utilizando CodeBlocks 17.12 en Windows 10 Pro 1903.

Gracias!

mollok
Mensajes: 505
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Duda sobre variables y datos ingresados en ejercicio en C.

#2 Mensaje por mollok » 03/09/2019 8:53 am

Hay que arreglar unos cuantos fallos:
main es tipo int.
Escribe los prototipos de las funciones antes de main.
No llames a main para repetir el programa, es una mala práctica. Encuentra otra forma para realizar el bucle si la validación falla.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

reaperss53
Mensajes: 3
Registrado: 03/09/2019 8:19 am

Re: Duda sobre variables y datos ingresados en ejercicio en C.

#3 Mensaje por reaperss53 » 03/09/2019 9:10 am

mollok escribió:
03/09/2019 8:53 am
Hay que arreglar unos cuantos fallos:
main es tipo int.
Escribe los prototipos de las funciones antes de main.
No llames a main para repetir el programa, es una mala práctica. Encuentra otra forma para realizar el bucle si la validación falla.
Tendré en cuenta los consejos.
Gracias Mollok! :D

Edit: Le corregí lo que me has dicho y le cambié algunas cosas. Parece que ahora funciona bien. Gracias nuevamente! :D

Código: Seleccionar todo

/**25. Escribe una función que reciba como parámetro de entrada el valor de un
año y devuelva como resultado un valor de tipo lógico que indique si es o no un
año bisiesto. Recuerda la regla: "Un año es bisiesto si es divisible por 400, o
bien si es divisible por 4 pero no por 100"*/

#include<stdio.h>
#include<stdlib.h>

void ingreso(int *jahre);
int bisiesto(int *jahre);
int validar(int *jahre);

int main()
{
    int jahre;
    do
    {
        ingreso(&jahre);
    }
    while(validar(&jahre)==0);
    if(bisiesto(&jahre)==1)printf("\n\n\t\t%d es bisiesto.\n\n",jahre);
    else printf("\n\n\t\t%d no es bisiesto.\n\n",jahre);
    return 0;
}

void ingreso(int *jahre)
{
    printf("\n\n\nJahre: ");
    scanf("%d",&*jahre);
}

int bisiesto(int *jahre)
{
    if(*jahre%4==0)return 1;
    else return 0;
}

int validar(int *jahre)
{
    if(*jahre<0)
    {
        system("cls");
        printf("\n\t\tIngreso incorrecto. Reingresar.");
        return 0;
    }
    return 1;
}


mollok
Mensajes: 505
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Duda sobre variables y datos ingresados en ejercicio en C.

#4 Mensaje por mollok » 03/09/2019 9:20 am

Cuidado con esta línea

Código: Seleccionar todo

if(validar(&jahre)==0)ingreso(&jahre);
Si ese ingreso de la línea también es erróneo el programa no se va a validar. Usa while en vez de if, así te asegurarás que se repita siempre que esté mal.

Código: Seleccionar todo

while(validar(&jahre)==0) ingreso(&jahre);
Cómo regalo:
En ingreso tienes puesto

Código: Seleccionar todo

scanf("%d",&*jahre);
Pero jahre ya es un puntero, que es lo que quiere scanf, por tanto no hay que desreferenciar el puntero para luego sacar su dirección.
Puedes usar

Código: Seleccionar todo

scanf("%d",jahre);
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

reaperss53
Mensajes: 3
Registrado: 03/09/2019 8:19 am

Re: Duda sobre variables y datos ingresados en ejercicio en C.

#5 Mensaje por reaperss53 » 03/09/2019 9:54 am

mollok escribió:
03/09/2019 9:20 am
Cuidado con esta línea

Código: Seleccionar todo

if(validar(&jahre)==0)ingreso(&jahre);
Si ese ingreso de la línea también es erróneo el programa no se va a validar. Usa while en vez de if, así te asegurarás que se repita siempre que esté mal.

Código: Seleccionar todo

while(validar(&jahre)==0) ingreso(&jahre);
Cómo regalo:
En ingreso tienes puesto

Código: Seleccionar todo

scanf("%d",&*jahre);
Pero jahre ya es un puntero, que es lo que quiere scanf, por tanto no hay que desreferenciar el puntero para luego sacar su dirección.
Puedes usar

Código: Seleccionar todo

scanf("%d",jahre);
Lo del IF lo corregí justo después de enviado el mensaje. Me di cuenta al hacer un par de pruebas. :lol:
No sabía lo del scanf, me va a servir para que sea más facil de leer el codigo.
Mil gracias Mollok! :D

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 7 invitados