C/Visual C - Ordenar fechas struct tm

 
Vista:
sin imagen de perfil

Ordenar fechas struct tm

Publicado por Diego (150 intervenciones) el 10/07/2016 21:28:18
Buenas tardes, intento ordenar las fechas de menor a mayor. Pero no logro ver porqué falla la lógica.

estructura que debo utlizar:
1
2
3
4
5
6
7
8
9
10
struct datos{
		unsigned int tamanio;
		unsigned int fecha_modificacion;
		long long reservado1;
		long long reservado2;
		char *nombre;
		char magic[4];
		char version;
		unsigned int entradas;
	};

funcion:
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
void OrdenarFechas(struct datos cabecera[], unsigned int tam)
{
	unsigned int i, j;
	struct datos menor;
	struct tm time[tam];
	time_t modificacion;
	for (i = 0; i < tam; i++){
		modificacion = cabecera[i].fecha_modificacion;
		localtime_r(&modificacion, &time[i]);
	}
	for (j = 0; j < (tam - 1); j++){
		for (i = j; i < (tam - 1); i++){
			if (time[i + 1].tm_year < time[j].tm_year){
				menor = cabecera[i + 1];
				cabecera[i + 1] = cabecera[j];
				cabecera[j] = menor;
			}else{
				if((time[i + 1].tm_year = time[j].tm_year) &&
				   (time[i + 1].tm_mon < time[j].tm_mon)){
					menor = cabecera[i + 1];
					cabecera[i + 1] = cabecera[j];
					cabecera[j] = menor;
				}else{
					if((time[i + 1].tm_year = time[j].tm_year) &&
					   (time[i + 1].tm_mon = time[j].tm_mon) &&
					   (time[i + 1].tm_mday < time[j].tm_mday)){
						menor = cabecera[i + 1];
						cabecera[i + 1] = cabecera[j];
						cabecera[j] = menor;
					}else{
						if((time[i + 1].tm_year = time[j].tm_year) &&
						   (time[i + 1].tm_mon = time[j].tm_mon) &&
					   	   (time[i + 1].tm_mday = time[j].tm_mday) &&
					   	   (time[i + 1].tm_hour < time[j].tm_hour)){
					   		menor = cabecera[i + 1];
							cabecera[i + 1] = cabecera[j];
							cabecera[j] = menor;
					   	}else{
					   		if((time[i + 1].tm_year = time[j].tm_year) &&
					   		   (time[i + 1].tm_mon = time[j].tm_mon) &&
					   	   	   (time[i + 1].tm_mday = time[j].tm_mday) &&
					   	   	   (time[i + 1].tm_hour = time[j].tm_hour) &&
					   	   	   (time[i + 1].tm_min < time[j].tm_min)){
					   	   		menor = cabecera[i + 1];
								cabecera[i + 1] = cabecera[j];
								cabecera[j] = menor;
					   	   	}else{
					   	   		if((time[i + 1].tm_year = time[j].tm_year) &&
					   	   		   (time[i + 1].tm_mon = time[j].tm_mon) &&
					   	   	           (time[i + 1].tm_mday = time[j].tm_mday) &&
					   	   	           (time[i + 1].tm_hour = time[j].tm_hour) &&
					   	   	           (time[i + 1].tm_min < time[j].tm_min) &&
					   	   	           (time[i + 1].tm_sec < time[j].tm_sec)){
					   	   	   		menor = cabecera[i + 1];
									cabecera[i + 1] = cabecera[j];
									cabecera[j] = menor;
					   	   	   	}
					   	   	}
					   	}
					}
				}
			}
		}
	}
 
}

el concepto parecia bastante sencillo cuando lo plantee en mi pizarrón.
primero comparar los ordenes superiores, si hay coincidencia se baja de nivel y se repite la comparacion hasta llegar a segundos.
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
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Ordenar fechas struct tm

Publicado por agustin (272 intervenciones) el 10/07/2016 22:55:00
Si pasaras a time_t todas las fechas seria más sencillo ya que trabajas con un double y simplemente ordenas por su valor y luego de ordenados los conviertes a struct tm y listo.
En tu código para empezar esto esta mal:
1
2
3
for (j = 0; j < (tam - 1); j++){
	for (i = j; i < (tam - 1); i++){
		if (time[i + 1].tm_year < time[j].tm_year){
Cada vez que inicia el segundo bucle comparas entre el mismo ya que tanto I como j apuntan al mismo. Además el segundo bucle nunca leerá el último miembro.
Seria asi:
1
2
3
4
5
6
for (j = 0; j < (tam - 1); j++){
	for (i = j+1; i < (tam); i++){
		if (time[i].tm_year < time[j].tm_year){
			menor = cabecera[i];
			cabecera[i] = cabecera[j];
			cabecera[j] = menor;
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

Ordenar fechas struct tm

Publicado por Diego (150 intervenciones) el 11/07/2016 17:35:49
Ya escribí una respuesta, pero no se publicó, escribo de una manera más corta esta vez. NO haría falta hacer correcciones en mis dos iteraciones.
1
2
3
for (j = 0; j < (tam - 1); j++){
	for (i = j; i < (tam - 1); i++){
		if (time[i + 1].tm_year < time[j].tm_year){

Lo pantee rapidamente en una prueba de escritorio con simplemente 2 elementos
{56, 8}
Tu corrreccion tambíen obtiene el mismo resultado, ya que incrementás en 1 el indice i e incrementás en 1 el tamanio tam; es una equivalencia a la forma en la que lo escribí yo.

Ahora luego de que vulva d e trabajar voy a ponderme a ver que resultados me arrojan las fechas en usigned int, para ver si las puedo ordenar sin pasarlas a struct tm.
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

Ordenar fechas struct tm

Publicado por Diego (150 intervenciones) el 11/07/2016 19:58:44
Acabo de ver lo que se almacenó en fecha_modificacion y tenías razón, para el ordenamiento no necesito pasarlos a un strcut tm, puedo trabajarlos así como están.
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

Ordenar fechas struct tm

Publicado por Diego (150 intervenciones) el 11/07/2016 20:03:04
LIsto. Ahora ya funciona.
Me quedó así.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void OrdenarFechas(struct datos cabecera[], unsigned int tam)
{
	unsigned int i, j;
	struct datos menor;
	for (j = 0; j < tam - 1; j++){
		for (i = j; i < tam - 1; i++){
			if (cabecera[i + 1].fecha_modificacion < cabecera[j].fecha_modificacion){
				menor = cabecera[i + 1];
				cabecera[i + 1] = cabecera[j];
				cabecera[j] = menor;
			}
		}
	}
}
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

Ordenar fechas struct tm

Publicado por Chema (234 intervenciones) el 10/07/2016 23:20:37
Diseñar en un pizarrón es cosa buena, personalmente usaba lápiz y papel, ahora me basta con dibujar figuras en el aire con los dedos,con los ojos cerrados, lo malo de esta técnica, es que si aparece alguien, yo no lo veo, y si no me conoce, puede pensar que estoy loco perdido.

Dibuja esta figura en el pizarrón, y piensa que es un bloque de datos, y que representa la medida de lectura y escritura.

--------------------
--------------------
--------------------
--------------------

A los bloques no le van muy bien los punteros, (char *nombre) en la estrucctura, pinta muy mal.

Lo que pretendes hacer es mucho más simple y sencillo de lo que piensas.
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

Ordenar fechas struct tm

Publicado por Diego (150 intervenciones) el 11/07/2016 17:26:28
Al ver el dibujo, me hizo pensar en una matriz. Y también se me ocurrió hacerlo en un matriz y hacer una ordenamiento primero por año, luego por mes, y aśi hasta hacerlo por segundos. pero es ordenamiento de los ordenes inferiores solo sería entre los que tuvieran el mismo año, mes, dia, etc.
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