elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Printf un poco especial en lenguaje C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Printf un poco especial en lenguaje C  (Leído 4,977 veces)
DanielPy

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Printf un poco especial en lenguaje C
« en: 10 Noviembre 2013, 19:30 pm »

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.
Bueno luego de tantas  idas y venidas pude finalizar el vendito almanaque, estoy contento porque he aprendido bastante con tantas prácticas debido a los innumerables errores, al grano, el programita que les dejo es parte del mismo y como verán 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:
#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 año..: %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.-

Un saludo.
Daniel


En línea

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.-
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Printf un poco especial en lenguaje C
« Respuesta #1 en: 11 Noviembre 2013, 12:14 pm »

Si ingresas el año borra todo, llamas a mostrar con orden como 3 y solo hace el cls. Si lo cambio por 2 termino con dia, mes y año en pantalla.


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
DanielPy

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Printf un poco especial en lenguaje C
« Respuesta #2 en: 11 Noviembre 2013, 16:14 pm »

Hola.
Muchas gracias por  responder, no sé si interprete del todo la ayuda que propusiste pero a partir de ella pude lograrlo.- ;-)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void mostrar(int orden, int dd, int mm);
  5.  
  6. int main(void){
  7.  
  8.    int dd,mm,aaaa,orden,ok,ch; dd = mm = aaaa = orden = ok = ch = 0;
  9.  
  10.    do{
  11.        system("CLS");
  12. printf("\n Ingrese dia...: ");
  13.        ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31;
  14.        while ((ch = getchar()) != EOF && ch != '\n');
  15. }while(!ok);
  16.  
  17.    do{
  18. mostrar(1, dd, mm);
  19.        printf("\n Ingrese mes...: ");
  20.        ok = scanf("%d", &mm) == 1 && mm >= 1 && mm <= 12;
  21.        while ((ch = getchar()) != EOF && ch != '\n');
  22. }while(!ok);
  23.  
  24.    do{
  25.        mostrar(2, dd, mm);
  26.        printf("\n Ingrese año..: ");
  27.        ok = scanf("%d", &aaaa) == 1 && aaaa >= 1 && aaaa <= 9999;
  28.        while ((ch = getchar()) != EOF && ch != '\n');
  29.    }while(!ok);
  30.  
  31.    printf("\n La fecha ingresada es %d/%d/%d", dd,mm,aaaa);
  32.  
  33.    return 0;
  34. }
  35.  
  36. void mostrar(int orden, int dd, int mm){
  37.    system("CLS");
  38.    if(orden == 1){
  39.        printf("\n Ingrese dia...: %d", dd);
  40.    }
  41.    if(orden == 2){
  42.        printf("\n Ingrese dia...: %d", dd);
  43.        printf("\n Ingrese mes...: %d", mm);
  44.    }
  45. }

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
En línea

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.-
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Printf un poco especial en lenguaje C
« Respuesta #3 en: 11 Noviembre 2013, 19:56 pm »

De nadas, entendiste bien, ahora no pasas mas como primero parametro 3 a mostrar.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
DanielPy

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Printf un poco especial en lenguaje C
« Respuesta #4 en: 11 Noviembre 2013, 20:17 pm »

Hola.
Buscando y buscando encontré que una de las maneras para saber si un número es decimal seria esta.

Código
  1. #include <stdio.h>
  2.  
  3. int main(void){
  4. int a;
  5. float b;
  6. printf("\n Ingresa un numero...:");
  7. scanf("%f", &b);
  8. a = b;
  9. if(a == b)
  10. printf("\n es entero");
  11. else
  12. printf("\n NO es entero");
  13.  
  14.  
  15. return 0;
  16. }

Me podes decir si hay una manera más concisa para meter precisamente aquí(**).-

Código
  1. ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31 (**);

Desde ya muchas gracias.-
Saludos.
Daniel
En línea

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Printf un poco especial en lenguaje C
« Respuesta #5 en: 12 Noviembre 2013, 02:10 am »

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.
Para solucionarlo en el bucle donde descartas el resto de la linea verificas si el carácter a procesar no es espacio blanco con isspace (prototipo en <ctype.h>), si es así cambias el valor de la variable "ok" a cero. Por ejemplo el primer bucle con el cambio:
Código
  1. do {
  2.   system("CLS");
  3.   printf("Ingrese dia...:");
  4.   fflush(stdout);
  5.   ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31;
  6.  
  7.   while ((ch = getchar()) != EOF && ch != '\n')
  8.      if (!isspace(ch))
  9.         ok = 0;
  10. }while (!ok);

Un saludo
« Última modificación: 12 Noviembre 2013, 02:12 am por rir3760 » En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
DanielPy

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Printf un poco especial en lenguaje C
« Respuesta #6 en: 12 Noviembre 2013, 02:24 am »

Hola rir3760.
Gracias por el código, no es un espacio lo que me ocupa sino que se ingrese un número decimal.-

Saludos.
Daniel
En línea

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Printf un poco especial en lenguaje C
« Respuesta #7 en: 12 Noviembre 2013, 02:37 am »

no es un espacio lo que me ocupa sino que se ingrese un número decimal.
La comprobación "!isspace(ch)" sera verdadera cuando se encuentre cualquier carácter que no sea espacio blanco, si eso sucede ya podemos concluir que la linea no es valida.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
DanielPy

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Printf un poco especial en lenguaje C
« Respuesta #8 en: 12 Noviembre 2013, 14:44 pm »

Hola rir3760.

La comprobación "!isspace(ch)" sera verdadera cuando se encuentre cualquier carácter que no sea espacio blanco, si eso sucede ya podemos concluir que la linea no es valida.

Me imagino el gesto que pondras cuando leas esto (¿prejuicioso?) pero no puedo dejarlo pasar sin entenderlo.-
Ingreso 12.50 porque debo suponer que isspace me va a encontrar el punto específicamente si lo que detecta es:


Citar
Comprueba sin un carácter es de tipo espacio.

isspace es una macro que verifica el entero c pertenece grupo de caracteres de espacio, ' ', tab, retorno de carro, nueva línea, tabulador vertical o salto de página. El comportamiento depende de la categoría local de LC_CTYPE.

La línea de código con isspace funciona a la perfección, espero tu aclaración.-

Un saludo cordial.
Daniel
En línea

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Printf un poco especial en lenguaje C
« Respuesta #9 en: 12 Noviembre 2013, 15:01 pm »

Ingreso 12.50 porque debo suponer que isspace me va a encontrar el punto
Correcto. La idea es permitir solo espacio blanco después del numero (por ello el uso de isspace).

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
hacer un mataprocesos un poco especial
Programación Visual Basic
KXC 2 1,701 Último mensaje 28 Febrero 2006, 00:25 am
por Kizar
Ataque MitM... un poco especial... ayuda
Hacking
Marion22 7 5,295 Último mensaje 3 Marzo 2010, 18:49 pm
por Marion22
Necesito crear un diccionario un poco especial . ( alguien me ayuda )
Hacking Wireless
Siscu.cab 4 3,160 Último mensaje 20 Agosto 2012, 16:43 pm
por Siscu.cab
un ransomware un poco especial « 1 2 »
Seguridad
SOFTEL 18 9,722 Último mensaje 25 Enero 2015, 07:15 am
por Shout
Iniciarme en programación desde 0, especial interés en el lenguaje Rust
Programación General
gji 2 6,888 Último mensaje 20 Agosto 2022, 00:21 am
por .xAk.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines