Autor Tema: Printf un poco especial en lenguaje C validar fecha introducida  (Leído 6541 veces)

Pino1952

  • Sin experiencia
  • *
  • Mensajes: 21
    • Ver Perfil
Citar
Hago esta aclaración porque en muchos casos suponen que tengo 15 o 20 años(es lo lógico) y en realidad tengo 61, como comprenderán no voy a la facultad y la gente que conozco no tiene la más mínima idea lo que es la computadora y menos programar.-

Hola a todos.
El programita lo que hace es verificar que se ingrese día , mes y año válidos, el problema es que no puedo lograr  quitar el 0 que aparece después del printf, como lo muestra la imagen.-



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

void mostrar(int orden, int dd, int mm, int aaaa);

int main(void){

    int dd,mm,aaaa,orden,ok,ch; dd = mm = aaaa = orden = ok = ch = 0;

    do{
        dd = 0;
mostrar(0, dd, mm, aaaa);
ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31;
while ((ch = getchar()) != EOF && ch != '\n');
    }while(!ok);

    do{
mm = 0;
mostrar(1, dd, mm, aaaa);
ok = scanf("%d", &mm) == 1 && mm >= 1 && mm <= 12;
while ((ch = getchar()) != EOF && ch != '\n');
    }while(!ok);

    do{
aaaa = 0;
mostrar(2, dd, mm, aaaa);
ok = scanf("%d", &aaaa) == 1 && aaaa >= 1 && aaaa <= 9999;
while ((ch = getchar()) != EOF && ch != '\n');
    }while(!ok);
    mostrar(3, dd, mm, aaaa);

    return 0;
}

void mostrar(int orden, int dd, int mm, int aaaa){
    system("CLS");
    if(orden == 0){
    printf("\n Ingrese dia...: %d", dd);
    }
        if(orden == 1){
printf("\n Ingrese dia...: %d", dd);
printf("\n Ingrese mes...: %d", mm);
    }
    if(orden == 2){
printf("\n Ingrese dia...: %d", dd);
printf("\n Ingrese mes...: %d", mm);
printf("\n Ingrese anio..: %d", aaaa);
    }
}
Lo que dejo en claro es que no quiero utilizar conio, Windows.h ni nada que salga de lo estándar.-

Espero que en primer lugar que esto sea factible de lograr y que alguien en este foro sepa cómo hacerlo.-

Saludos.
Daniel
« Última modificación: 15 de Septiembre 2014, 14:28 por Alex Rodríguez »
Abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2053
    • Ver Perfil
Re:Printf un poco especial en lenguaje C.
« Respuesta #1 en: 10 de Noviembre 2013, 22:44 »
Hola Daniel, he visto el programa y he  encontrado diversos problemas, algunos de lógica de la programación y otros de sintaxis. Por ejemplo en este fragmento:

    do{
        dd = 0;
   mostrar(0, dd, mm, aaaa);
   ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31;
   while ((ch = getchar()) != EOF && ch != '\n');
    }while(!ok);

No veo necesario establecer dd = 0 al inicio del bucle. Por otro lado la expresión ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31; la veo una expresión poco legible.

Por otro lado los ceros aparecen porque están establecidos en el propio código:

printf("\n Ingrese dia...: %d", dd);

En C el mensaje de petición de datos se hace con printf y no tiene que incluir referencia a la variable que va a almacenar el dato solicitado. La variable únicamente necesita ser referenciada en el scanf.

Digamos que tienes que separar por un lado un mensaje (sin petición de datos ni referenciar variable) que es el printf y por otro lado la petición de datos (sin mensaje) que es el scanf.

Aquí te dejo lo que sería un pequeño programa de ejemplo generado a partir del que tú indicabas que quizás te sirva de guía:

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

int main(void){
    int dd = 0;
    int ok = 0;
    do{
printf("\n Ingrese dia...:");
scanf("%d", &dd);
if (dd>=1 && dd<=31) {ok=1; printf("\nDia ingresado es valido.\n\n");}
else {printf("\nDia ingresado no es valido.\n");}
    }while(ok==0);
    return 0;
}

Saludos.

Pino1952

  • Sin experiencia
  • *
  • Mensajes: 21
    • Ver Perfil
Re:Printf un poco especial en lenguaje C.
« Respuesta #2 en: 10 de Noviembre 2013, 23:52 »
Hola Alex.
Muchas gracia por responder.-
Veo que no corriste mi programa, si algún día lo haces seguramente entenderas la lógica del mismo.-

Un gran saludo.-
Daniel
Abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Pino1952

  • Sin experiencia
  • *
  • Mensajes: 21
    • Ver Perfil
Re:Printf un poco especial en lenguaje C.
« Respuesta #3 en: 11 de Noviembre 2013, 16:59 »
Hola a todos
Al fin pude lograrlo.-

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

void mostrar(int orden, int dd, int mm);

int main(void){

    int dd,mm,aaaa,orden,ok,ch; dd = mm = aaaa = orden = ok = ch = 0;
   
    do{
            system("CLS");
    printf("\n Ingrese dia...: ");
            ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31;
            while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);
       
    do{
mostrar(1, dd, mm);
        printf("\n Ingrese mes...: ");
        ok = scanf("%d", &mm) == 1 && mm >= 1 && mm <= 12;
        while ((ch = getchar()) != EOF && ch != '\n');
    }while(!ok);
       
    do{
        mostrar(2, dd, mm);
        printf("\n Ingrese anio..: ");
        ok = scanf("%d", &aaaa) == 1 && aaaa >= 1 && aaaa <= 9999;
        while ((ch = getchar()) != EOF && ch != '\n');
    }while(!ok);

    printf("\n La fecha ingresada es %d/%d/%d", dd,mm,aaaa);

    return 0;
}

void mostrar(int orden, int dd, int mm){
    system("CLS");
    if(orden == 1){
        printf("\n Ingrese dia...: %d", dd);
    }
    if(orden == 2){
        printf("\n Ingrese dia...: %d", dd);
        printf("\n Ingrese mes...: %d", mm);
    }
}
 

Igual tiene algo que no me gusta, si se ingresa 10.15 me toma el 10 me parece que voy a tener que modificar la validación.-

Un saludo.
Daniel
Abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

VITANARE

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re:Printf un poco especial en lenguaje C.
« Respuesta #4 en: 30 de Noviembre 2013, 19:17 »
sera por que lo tienes int y deberia ser float(real decimal)

 

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".