JAVI URGENTE, EL CODIGO ESTA CON UN ERROR.

POLYTA_1977
08 de Abril del 2005
Gracias Javi por tu respuesta tan rapida, sabes, tu codigo quedo muy bien, pero ahora que tu agregaste la validacion del letras, cuando vuelve a pedir el dia SE CORRE TODO COMO UN ESPACIO HACIA ARRIBA, Y PEOR AUN EL AÑO YA NO VALIDA!!!!!!!!! ¿TU LO EJECUTASTE?, CUANDO INGRESO UN AÑO NO VALIDO ME DICE "EL MES NO ESTA EN EL RANGO" O SEA ESTA TOMANDO OTRA VALIDACION. TE PIDO POR FAVOR QUE PUEDAS VERLO, PORQUE COMO TE DIGO LA VALIDACION DE LA LETRA ESTA MUY BIEN PERO AHORA EL AÑO MARCA UNA VALIDACION ERRONEA!!!!!!!! TE ENCARGO,
EL CODIGO ES
#include<dos.h>
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<conio.h>

void fnc_fecha();
void fnc_hora();

int main()
{
char opcion;
do
{
clrscr();
gotoxy(35,2);
printf("RUTINA DE FECHAn");
gotoxy(25,10);
printf("1.- Fecha n");
gotoxy(25,12);
printf("2.- Hora n");
gotoxy(25,14);
printf("3.- Salirn ");
fflush(stdin);
opcion=getchar();
if (opcion=='1')
fnc_fecha();

else if(opcion=='2')
fnc_hora();
}
while(opcion!='3');

return 1;

}


void fnc_fecha()
{

int dia,mes,ano;
struct date fecha;
clrscr();
getdate(&fecha);

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy (1,3);
printf("Su fecha actual es: %d-%d-%d",fecha.da_day, fecha.da_mon,fecha.da_year);

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,4);printf(" Ingrese nuevo dia :");
while(scanf("%d",&dia)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
printf("Su fecha actual es: %d-%d-%d",fecha.da_day, fecha.da_mon,fecha.da_year);
gotoxy(1,4);printf(" Ingrese nuevo dia :");
fflush(stdin);
}
while (dia<0 || dia>31)
{
gotoxy(40,4);printf("Dia fuera de rango (0-31)");
delay(2000);
fnc_fecha();
}


fecha.da_day=dia;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,5);printf(" Ingrese nuevo mes :");
while(scanf("%d",&mes)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
printf("Su fecha actual es: %d-%d-%d",fecha.da_day, fecha.da_mon,fecha.da_year);
gotoxy(1,5);printf(" Ingrese nuevo mes :");
fflush(stdin);
}
while (mes<0 || mes>12)
{
gotoxy(40,5);printf("Mes fuera de rango (1-12)");
delay(2000);
fnc_fecha();
}
while (mes==2 && dia>28)
{
gotoxy(40,5);printf("Mes con 28 dias");
delay(2000);
fnc_fecha();
}
while (mes==4 || mes==6 || mes==9 || mes==11 && dia>30)
{
gotoxy(40,5);printf("Mes con 30 dias");
delay(2000);
fnc_fecha();
}

fecha.da_mon=mes;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,6);printf(" Ingrese nuevo ano :");
while(scanf("%d",&ano)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
printf("Su fecha actual es: %d-%d-%d",fecha.da_day, fecha.da_mon,fecha.da_year);
gotoxy(1,6);printf(" Ingrese nuevo año :");
fflush(stdin);
}
while (ano<1980 || ano>2099)
{
gotoxy(40,6);printf("Ano fuera de rango (1980-2099)");
delay(2000);
fnc_fecha();
}
fecha.da_year=ano;


setdate(&fecha);
gotoxy(1,7);
printf("nnSu nueva fecha es: %d-%d-%dnnn",fecha.da_day, fecha.da_mon,fecha.da_year);
system("pause");
}

//****************************************************************************
void fnc_hora()
{

int horas,minutos,segundos;
struct time hora;
clrscr();
gettime(&hora);
gotoxy(1,2);
printf("Su hora actual es: %d:%d:%d",hora.ti_hour, hora.ti_min,hora.ti_sec);

//++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,3);printf(" Ingrese nueva hora :");
while(scanf("%d",&horas)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
printf("Su hora actual es: %d:%d:%d",hora.ti_hour, hora.ti_min,hora.ti_sec);
gotoxy(1,3);printf(" Ingrese nueva hora :");
fflush(stdin);
}
while (horas<0 || horas>24)
{
gotoxy(40,3);printf("Hora fuera de rango (0-24)");
delay(2000);
fnc_hora();
}

hora.ti_hour=horas;


//+++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,4);printf(" Ingrese nuevos minutos :");
while(scanf("%d",&minutos)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
printf("Su hora actual es: %d:%d:%d",hora.ti_hour, hora.ti_min,hora.ti_sec);
gotoxy(1,3);printf(" Ingrese nuevos minutos :");
fflush(stdin);
}
while (minutos<0 || minutos>60)
{
gotoxy(40,4);printf("Minutos fuera de rango (0-60)");
delay(2000);
fnc_hora();
}

hora.ti_min=minutos;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,5);printf(" Ingrese nuevos segundos:");
while(scanf("%d",&segundos)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
printf("Su hora actual es: %d:%d:%d",hora.ti_hour, hora.ti_min,hora.ti_sec);
gotoxy(1,3);printf(" Ingrese nuevos segundos :");
fflush(stdin);
}
while (segundos<0 || segundos>60)
{
gotoxy(40,5);printf("Segundos fuera de rango (0-60)");
delay(2000);
fnc_hora();
}

hora.ti_sec=segundos;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++
hora.ti_hour=horas;
hora.ti_min=minutos;
hora.ti_sec=segundos;
settime(&hora);
gotoxy(1,6);
printf("nnSu nueva hora es: %d:%d:%dnnn",hora.ti_hour,hora.ti_min,hora.ti_sec);
system("pause");
}



javi
08 de Abril del 2005
El problema que veo es un error de programacion .
Usas llamadas a la funcion fnc_fecha() dentro de la misma funcion ,y esto que genera ,pues genera que se produzcan bucles de funciones lo que genera los resultados que comentas ,es decir cuando ingresas
un dia mayor de 31 y llamas a fnc_fecha() la llamada actual no se elimina y se volvera a retornar a donde estaba ,por eso cuando tu ves en teoria que fnc_fecha() ha terminado en realidad tienen que terminar todos los fnc_fecha() que llamastes .
Te he cambiado el codigo sustituyendo las llamadas a las funciones por returns ,lo cual si hace que salga de la funcion.


#include<dos.h>
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<conio.h>

int fnc_fecha();
int fnc_hora();

int main()
{
char opcion;
do
{
clrscr();
gotoxy(35,2);
printf("RUTINA DE FECHAn");
gotoxy(25,10);
printf("1.- Fecha n");
gotoxy(25,12);
printf("2.- Hora n");
gotoxy(25,14);
printf("3.- Salirn ");
fflush(stdin);
opcion=getchar();
if (opcion=='1')
fnc_fecha();


else if(opcion=='2')
fnc_hora();

}
while(opcion!='3');

return 1;

}


int fnc_fecha()
{

int dia,mes,ano;
struct date fecha;
clrscr();
getdate(&fecha);

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy (1,3);
printf("Su fecha actual es: %d-%d-%d",fecha.da_day, fecha.da_mon,fecha.da_year);

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,4);printf(" Ingrese nuevo dia :");
fflush(stdin);
while(scanf("%d",&dia)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
gotoxy (1,3);
printf("Su fecha actual es: %d-%d-%d",fecha.da_day, fecha.da_mon,fecha.da_year);
gotoxy(1,4);printf(" Ingrese nuevo dia :");
fflush(stdin);
}
while ((dia<0) || (dia>31))
{
gotoxy(40,4);printf("Dia fuera de rango (0-31)");
delay(2000);
return 0;
}


fecha.da_day=dia;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,5);printf(" Ingrese nuevo mes :");
fflush(stdin);
while(scanf("%d",&mes)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
gotoxy (1,3);
printf("Su fecha actual es: %d-%d-%d",fecha.da_day, fecha.da_mon,fecha.da_year);
gotoxy(1,4);printf(" Ingrese nuevo mes :");
fflush(stdin);
}
while ((mes<0) || (mes>12))
{
gotoxy(40,5);printf("Mes fuera de rango (1-12)");
delay(2000);
return 0;
}
while ((mes==2) && (dia>28))
{
gotoxy(40,5);printf("Mes con 28 dias");
delay(2000);
fnc_fecha();
}
while ((mes==4 )||(mes==6) || (mes==9) || (mes==11) &&( dia>30))
{
gotoxy(40,5);printf("Mes con 30 dias");
delay(2000);
return 0;
}

fecha.da_mon=mes;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,6);printf(" Ingrese nuevo ano :");
fflush(stdin);
while(scanf("%d",&ano)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
gotoxy (1,3);
printf("Su fecha actual es: %d-%d-%d",fecha.da_day, fecha.da_mon,fecha.da_year);
gotoxy(1,4);printf(" Ingrese nuevo año :");
fflush(stdin);
}
while ((ano<1980) ||(ano>2099))
{
gotoxy(40,6);printf("Ano fuera de rango (1980-2099)");
delay(2000);
return 0;
}
fecha.da_year=ano;



setdate(&fecha);
gotoxy(1,7);
printf("nnSu nueva fecha es: %d-%d-%dnnn",fecha.da_day, fecha.da_mon,fecha.da_year);
printf("n Pulsa una tecla para continuar n");
getch();
return 1;
}

//****************************************************************************
int fnc_hora()
{

int horas,minutos,segundos;
struct time hora;
clrscr();
gettime(&hora);
gotoxy(1,2);
printf("Su hora actual es: %d:%d:%d",hora.ti_hour, hora.ti_min,hora.ti_sec);

//++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,3);printf(" Ingrese nueva hora :");
fflush(stdin);
while(scanf("%d",&horas)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
gotoxy(1,2);
printf("Su hora actual es: %d:%d:%d",hora.ti_hour, hora.ti_min,hora.ti_sec);
gotoxy(1,3);printf(" Ingrese nueva hora :");
fflush(stdin);
}
while ((horas<0) || (horas>24))
{
gotoxy(40,3);printf("Hora fuera de rango (0-24)");
delay(2000);
return 0;
}

hora.ti_hour=horas;


//+++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,4);printf(" Ingrese nuevos minutos :");
fflush(stdin);
while(scanf("%d",&minutos)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
gotoxy(1,2);
printf("Su hora actual es: %d:%d:%d",hora.ti_hour, hora.ti_min,hora.ti_sec);
gotoxy(1,3);printf(" Ingrese nuevos minutos :");
fflush(stdin);
}
while ((minutos<0) || (minutos>60))
{
gotoxy(40,4);printf("Minutos fuera de rango (0-60)");
delay(2000);
return 0;
}

hora.ti_min=minutos;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
gotoxy(1,5);printf(" Ingrese nuevos segundos:");
fflush(stdin);
while(scanf("%d",&segundos)==0)
{
printf("nError, letra introducida ,debe ser un numero");
delay(2000);
clrscr();
gotoxy(1,2);
printf("Su hora actual es: %d:%d:%d",hora.ti_hour, hora.ti_min,hora.ti_sec);
gotoxy(1,3);printf(" Ingrese nuevos segundos :");
fflush(stdin);
}
while ((segundos<0) || (segundos>60))
{
gotoxy(40,5);printf("Segundos fuera de rango (0-60)");
delay(2000);
return 0;
}

hora.ti_sec=segundos;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++
hora.ti_hour=horas;
hora.ti_min=minutos;
hora.ti_sec=segundos;
settime(&hora);
gotoxy(1,6);
printf("nnSu nueva hora es: %d:%d:%dnnn",hora.ti_hour,hora.ti_min,hora.ti_sec);
printf("n Pulsa una tecla para continuar n");
getch();
return 1;
}

jorge zapata
08 de Abril del 2005
explicame sobre las estructuras repetitivas Do while y me envies unos programas usando do while sencillos te lo agradeceria mucho por favor

javi
08 de Abril del 2005
Si lo quieres tener como lo tenias hecho ,sin returns y con void me lo dices y te lo hago ,mas o menos seria asi:
int error;
haces un bucle
do
{
error=1; //para que si no hay errores salga bucle

para comparar los rangos usamos un if en vez de while
if(0>dia||dia>31)
{
msges de error
error=0; //para que se repita el bucle
continue; //esta sentencia nos manda
//al while ,comprueba y como error es cero vuelve a repetir el bucle do

....
error=1;
}
while (!error);