Pascal/Turbo Pascal - Programa que valide fecha

 
Vista:

Programa que valide fecha

Publicado por Yiara (5 intervenciones) el 17/11/2006 13:54:00
Uolaaa gente!! weno os cuento mi frustracion jejeje, estoy cursando ingenieria tecnica en informatica d sistemas y nos an mandao en pascal acer un programita q valide una fecha, es decir al introducirla el usuario, nos diga si es correcta o no, he pensado como condiciones las siguientes:

1. dias, meses y años: enteros positivos.

2. mes 1,3,5,7,8,10,12: dia no mayor de 31

mes 4,6,9,11: dia no mayor de 30

mes 2: dia no mayor de 29 --> año bisiesto

dia no mayor de 28 --> año no bisiesto

3. Mes entre 1 y 12.

os pongo la chapuciya q e planteado... jejej q solo son planteamientos... d ideas q kiero expresar pero nose como... ni idea d si necesito procedimientos(procedure) o funciones (function)

lo que esta entre [[[ ]]] es lo keiro expresar... pero nose como... y lo demas d año y mes deberia meterlo con subprogramas pero weno.. en fin espero q podais ayudarme a solucionarlo debidamente! ya q solo tengo asta el miercoles dia 22 d nov!!

muchiiiiiiiiisimas gracias!!

ahi va:

Program ValidarFecha;
Uses Crt;
Var

begin
Write(`Dime un año:');
Readln(año);
If (año mod 4=0) or (año mod 100=0) and not (ano mod 400=0) then
bisiesto:=TRUE
else
bisiesto:=FALSE;

Write('Dime un mes:');
Readln(mes);
If (mes<1) or (mes>12) then
Writeln ('El mes introducido es incorrecto');
else
case mes of
1,3,5,7,8,10,12: [[[ condicion: dia>=1 o dia<=31]]]
4,6,9,11: [[[ condicion: dia>=1 o dia<=30]]]
2: if bisiesto=TRUE then [[[ condicion: dia>=1 o dia<=29]]]
else [[[ condicion: dia>=1 o dia<=28]]]

Write ('Dime un dia:');
Readln(dia);
........................ nose mas.... :'-(
Espero haberme expresado bien!! gasias!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Programa que valide fecha

Publicado por Carlos Guimaraenz (265 intervenciones) el 17/11/2006 16:38:15
Hola Yiara! Primero que nada, modifico la pregunta para saber si es biciesto o no, ya que es biciesto, seguro, si es divisible por 400... pero no lo es si es divisible por 4 pero no por 100... además, puedes asignarle directamente esa expresión a la variable BICIESTO:

biciesto:=(ano mod 400 = 0) or ((ano mod 4 = 0) and (ano mod 100 <> 0));

En cuánto a la evaluación del día, puedes utilizar una variable de tipo byte llamada MAX_DIAS por ejemplo:

case mes of
1,3,5,7,8,10,12: MAX_DIAS:=31;
4,6,9,11: MAX_DIAS:=30;
2: begin
if (biciesto) then MAX_DIAS:=29
else MAX_DIAS:=28;

Y luego de leer el día, preguntas:

if (dia < 1) or (dia > MAX_DIAS) then
Write('DIA INCORRECTO');

Después deberías organizar todas estas instrucciones para llegar, si son todos los datos ingresados CORRECTOS, a informarlo en pantalla.

Espero haberme hecho entender. Un beso!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

expongo programa ¿CUALES SON LOS ERRORES? :'-(

Publicado por Yiara (5 intervenciones) el 17/11/2006 20:40:54
Muchiiiiisimas gracias por tu ayuda!! me as servido de mucho!! gracias d verdad!
Tengo problemiyas con las funciones aun... si fuerais tan amables d cotiyear un pokiyo mi exposicion para ver cual es el error... aunq creo q hay bastantes... pero al compilar sale en la linea 13 (es decir en el inicio de la funcion EsBisiesto)
aki os lo dejo!! Saludosss.

Program VAlidarFecha;
Uses Crt;
Var
bisiesto:boolean;
ano, mes, dia: integer;

Begin
clrscr;
Writeln ('Dime un dia');
REadln (dia);
Writeln ('Dime un mes');
Readln (mes);
Writeln ('Dime un ano');
Readln (ano);

Function EsBisiesto (bisiesto:boolean):boolean; <---AKI DA EL ERROR!! NO ES BOOLEAN???
Var
ano:integer;
bisiesto:boolean;
Begin
bisiesto:=(ano mod 4=0) or ((ano mod 4=0) and (ano mod 100=0));
end;

Function DiasMesEsValido (mes, dia: integer): integer;
Var
mes:integer;
bisiesto:boolean;
begin
case mes of
1,3,5,7,8,10,12: Max_Dias:=31;
4,6,9,11: Max_Dias:=30;
2: begin
if (bisiesto) then Max_Dias:=29;
else Max_Dias:=28;
else mes:=FALSE
end;

begin
if (dia<Max_Dias) then DiaMesEsValido:=TRUE
end;
end;

end.

Espero peudan corregir mis errores! gasiasss
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:expongo programa ¿CUALES SON LOS ERRORES? :'-

Publicado por Carlos Guimaraenz (265 intervenciones) el 17/11/2006 22:10:18
Hola Yiara!
Antes que nada, debes conocer la estructura básica de un programa, ya que éste aparece demasiado mezclado.

Ésto es:

program xxx; {identificador del programa, opcional}
uses xxx [,yyy]; {todas las unit a utilizar, opcional}
const {constantes, opcional}
type {tipos definidos por el usuario, opcional}

-- Luego viene la sección de declaración e implementación de procedures y functions, que pueden no existir --

-- Para finalizar, el programa principal, con sus variables... éstas pueden ser declaradas también antes de los procedures y las functions, pero conviene declararlas aquí y realizar la comunicación entre módulos a través de parámetros --

Punto y aparte. Ahora pasamos a la función EsBisiesto:
--------------------
Function EsBisiesto (bisiesto:boolean):boolean;
Var
ano:integer;
bisiesto:boolean;
Begin
bisiesto:=(ano mod 4=0) or ((ano mod 4=0) and (ano mod 100=0));
end;
--------------------
Errores:
1º El parámetro que se debe pasar, no es bisiesto (dicho sea de paso, es con S y no con C como yo he estado empeñado en escribirlo :P), sino que debes pasarle ano : integer, ya que es el valor que necesitarás para evaluar si es bisiesto o no.
2º No necesitas declarar ninguna variable, ya que como he dicho, "ano" viene como parámetro, y el resultado de la expresión directamente se asigna a EsBisiesto para devolver el valor, TRUE o FALSE.

Ahora pasamos a DiasMesEsValido...
-----------------------------------
Function DiasMesEsValido (mes, dia: integer): integer;
Var
mes:integer;
bisiesto:boolean;
begin
case mes of
1,3,5,7,8,10,12: Max_Dias:=31;
4,6,9,11: Max_Dias:=30;
2: begin
if (bisiesto) then Max_Dias:=29;
else Max_Dias:=28;
else mes:=FALSE
end;
------------------------------------
1º ¿Por qué la función devuelve un INTEGER? ¿No convendría un BOOLEAN?
2º Cuando pasas parámetros, no necesitas volver a declararlos en la sección VAR de la función (y no intentes usar el mismo nombre ya que te dará un IDENTIFICADOR DUPLICADO).
3º Debes pasar el valor de "bisiesto", o bien llamar a la función desde esta función, ya que al declararla localmente, ésta no es inicializada y no tiene un valor útil.
4º Siempre debes recordar asignar un valor de retorno para la función (en este caso sería:
DiasMesEsValido:=<algun valor>;
5º La sentencia CASE, siempre va finalizada con END; aún sin llevar BEGIN.
6º "if (dia<Max_Dias) then DiaMesEsValido:=TRUE" : Podrías leer un dia -5 por ejemplo, y en tu programa sería válido... debes considerar ambos límites.
7º Debes declarar la variable Max_Dias.

Bien, a continuación escribo el programa completo que funciona... te recomiendo copiarlo tal cual y no intentar REMENDAR tu código, ya que probablemente se mezcle más:

------------------------------------
Program VAlidarFecha;
Uses Crt;

{función EsBisiesto que devuelve si es bisiesto o no}
Function EsBisiesto (ano : integer) : boolean;
Begin
EsBisiesto:=(ano mod 4=0) or ((ano mod 4=0) and (ano mod 100=0));
end;

{ésta función devuelve TRUE si la fecha es válida}
Function DiasMesEsValido (dia, mes: integer; bisiesto : boolean): boolean;
var
Max_Dias : byte;
begin
case mes of
1,3,5,7,8,10,12: Max_Dias:=31;
4,6,9,11: Max_Dias:=30;
2: begin
if (bisiesto) then Max_Dias:=29
else Max_Dias:=28;
end;
end;
{si el mes y el dia son válidos, devuelvo TRUE}
DiasMesEsValido:=((mes>=1) and (mes<=12)) and ((dia>=1) and (dia <= Max_Dias ));
end;

{CODIGO PRINCIPAL}
Var
bisiesto:boolean;
ano, mes, dia: integer;

Begin
clrscr;
{leo dia, mes y año}
Writeln ('Dime un dia');
Readln (dia);
Writeln ('Dime un mes');
Readln (mes);
Writeln ('Dime un ano');
Readln (ano);
{verifico si el año es bisiesto}
bisiesto:=EsBisiesto(ano);
{verifico la validez de la fecha}
if DiasMesEsValido(dia,mes,bisiesto) then
Write('La fecha es válida')
else
Write('La fecha NO es válida');
ReadLn;
end.
--------------------------------------
Un beso!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

gasiassss!!!

Publicado por Yiara (5 intervenciones) el 18/11/2006 15:10:06
Joe Carlos muxiiiiisimas gasias por tu ayudaa!!! ya me funciona!! jejej y gracias a ti e comprendido mejor la estructura y las funciones!! esto los profesores no lo acen eh... jejeje
vuelvo a repetir q muxisimas gracias por tu ayuda okis!!
1besazooo y asta otra q vuelva a preguntar... q no sera muy tarde jejeje XIAUUU
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Un detallito más . . .

Publicado por Jose Rafael (2 intervenciones) el 13/08/2014 03:48:17
Se que es un asunto viejo, pero merece el esfuerzo comentarlo.

La función:

Function EsBisiesto (ano : integer) : boolean;
Begin
EsBisiesto:=(ano mod 4=0) or ((ano mod 4=0) and (ano mod 100=0));
end;

No es del todo correcta, puesto que "ano mod 4=0" pasará el examen a todo año divisible por 4 y no pasará los siglos (1500, 1600, 1700 . . . ) al segundo exámen "(ano mod 4=0) and (ano mod 100=0)". El asunto es que según esta función la fecha 29/2/1900 es válida, cuando en realidad no lo es.

¿Cuándo un año es bisiesto?
Un año es bisiesto cuando es divisible por cuatro, pero además que no termine en dos ceros; y cuando termine en dos ceros se consideraría bisiesto si fuera divisible por 400. De cualquier forma, el calendario gregoriano arrastraría una diferencia respecto al año solar de más de un día cada 4.000 años, por lo que los años divisibles por 4.000, como el año 4000, 8000 o 12000, que tendrían que ser bisiestos según la regla descrita anteriormente, no lo son.

Por eso la función correcta sería:

Function EsBisiesto (ano : integer) : boolean;
Begin
EsBisiesto := ((a mod 400 = 0) and not (a mod 4000 = 0)) or ((a mod 4 = 0) and not (a mod 100 = 0));
end;

Yo hice mi propio algoritmo de validación de fecha:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
program validar_fecha;
 
	uses crt;
 
	type
		string12 = string[12];
 
	var
		fech : string[12];
		mes : string[2];
		cont : integer;
 
 
 
	Function fechval ( fech : string12 ) : boolean;
		var
			error1, error2, error3, a, m, d : integer;
			bisiesto : boolean;
			max : byte;
			dar : string[2];
			ay : string[4];
	Begin
		if fech[2] = '/' then
			insert('0',fech,1);
		{end if}
		if fech[5] = '/' then
			insert('0',fech,4);
		{end if}
		dar := copy(fech,1,2);
		val(dar,d,error1);
		dar := copy(fech,4,2);
		val(dar,m,error2);
		ay := copy(fech,7,4);
		val(ay,a,error3);
		if (( error1 + error2 + error3) = 0) then
			begin
 
			bisiesto := ((a mod 400 = 0) and not (a mod 4000 = 0)) or ((a mod 4 = 0) and not (a mod 100 = 0));
 
				case m of
					1,3,5,7,8,10,12: max := 31;
					4,6,9,11: max := 30;
					2: 	begin
							if (bisiesto = true) then
								max := 29
							else
								max := 28;
							{end if}
						end;
				end;
				fechval := (( m >= 1 ) and ( m <= 12 )) and (( d >= 1 ) and ( d <= max ));
			end
		else
			fechval := false;
		{end if}
	end;
 
	BEGIN
	cont := 0;
	repeat
		writeln;
		writeln('  Digite la Fecha dd/mm/aaaa ');
		writeln;
		writeln('   Fecha : ');
		read(fech);
		if fechval(fech) = true then
			writeln('  La Fecha Es Valida ')
		else
			writeln('  La Fecha No Es Valida ');
		readkey;
		cont := cont + 1;
	until cont = 10;
	END.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Un detallito más . . .

Publicado por Jose Rafael (2 intervenciones) el 13/08/2014 05:39:39
Estéticamente quedaría mejor así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
program validar_fecha;
 
	uses crt;
 
	type
		string12 = string[12];
 
	var
		fech : string[12];
		mes : string[2];
 
	Function fechval ( fech : string12 ) : boolean;
		var
			error1, error2, error3, a, m, d : integer;
			bisiesto : boolean;
			max : byte;
			dar : string[2];
			ay : string[4];
	Begin
		if fech[2] = '/' then
			insert('0',fech,1);
		{end if}
		if fech[5] = '/' then
			insert('0',fech,4);
		{end if}
		dar := copy(fech,1,2);
		val(dar,d,error1);
		dar := copy(fech,4,2);
		val(dar,m,error2);
		ay := copy(fech,7,4);
		val(ay,a,error3);
		if (( error1 + error2 + error3) = 0) then
			begin
			bisiesto := ((a mod 400 = 0) and not (a mod 4000 = 0)) or ((a mod 4 = 0) and not (a mod 100 = 0));
				case m of
					1,3,5,7,8,10,12: max := 31;
					4,6,9,11: max := 30;
					2: 	begin
							if (bisiesto = true) then
								max := 29
							else
								max := 28;
							{end if}
						end;
				end;
				fechval := (( m >= 1 ) and ( m <= 12 )) and (( d >= 1 ) and ( d <= max ));
			end
		else
			fechval := false;
		{end if}
	end;
 
	BEGIN
	repeat
		writeln;
		writeln('  Digite la Fecha dd/mm/aaaa, o cero (0) para salir ');
		writeln;
		write('   Fecha : ');
		readln(fech);
		writeln;
		if fech <> '0' then
			begin
			if fechval(fech) = true then
				writeln('  La Fecha Es Valida ')
			else
				writeln('  La Fecha No Es Valida ');
			readkey;
			end;
		{end if}
	until fech = '0';
	END.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar