Pascal/Turbo Pascal - Lista Ordenada por su aproximación

 
Vista:

Lista Ordenada por su aproximación

Publicado por Javier (1 intervención) el 17/11/2015 23:02:18
Hola, estoy haciendo un programa que tengo que entregar en menos de un día. He desarrollado todas las funciones propuestas en la consigna, pero no consigo resolver como ordenar una lista. Tengo que hacerlo según esta condición:

aproximacion = 10 * buenos + regulares

La lista que devuelve esta función las notas aparecen ordenadas por su aproximación. El campo turno indica el orden en el cual ese código fue propuesto.

1
2
3
4
5
CONST
	MAXIMO_INTENTOS = 6;
	LARGO_CODIGO = 4;
	PRIMERA_LETRA = 'A';
	ULTIMA_LETRA =  'J';

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type
 
    RangoCodigo =  1..LARGO_CODIGO;
    RangoBR = 0 .. LARGO_CODIGO;
    TipoCodigo = array [RangoCodigo] of char;
    TRegistroNota = record
		       codigo : TipoCodigo;
		       buenos,
		       regulares: RangoBR;
    end;
 
    THistoria  = record
		    info : array [1..MAXIMO_INTENTOS] of TRegistroNota;
		    tope : 0..MAXIMO_INTENTOS;
    end;
 
    ListaNotas = ^CeldaNota;
    CeldaNota = record
         codigo    : TipoCodigo;
         buenos,
         regulares : RangoBR;
         turno     : 1 .. MAXIMO_INTENTOS;
         siguiente : ListaNotas;
     end;

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
(*---------------------------------------------------------------------------------------------------*)
 
function EsValido(codigo: TipoCodigo) : boolean;
 
begin
	EsValido := true;
	i := 1;
	for i := 1 to LARGO_CODIGO do
	if (codigo[i]>= PRIMER_LETRA) and (codigo[i]<= ULTIMA_LETRA)
	then
		EsValido := false;
end;
 
 
 
(*---------------------------------------------------------------------------------------------------*)
 
procedure ObtenerNota(propuesta, codigo: TipoCodigo; var buenos,regulares: RangoBR);
type
	ArregloBooleano = array[1..LARGO_CODIGO] of boolean;
var
	x,y : integer;
	encontre : boolean;
	ArregBool : ArregloBooleano;
begin
	for x := 1 to LARGO_CODIGO do
		ArregBool[x] := false;
		buenos := 0;
		regulares := 0;
		for x := 1 to LARGO_CODIGO do
			if (propuesta[x] = codigo[x])
				then
				begin
					ArregBool[x] := true;
					buenos := buenos + 1 (*Suma a buenos*)
				end;
			if (buenos <> LARGO_CODIGO)
				then
				begin
					for x:= 1 to LARGO_CODIGO do
					begin
						y := 1;
						encontre := false;
						while (y<=LARGO_CODIGO) and (not encontre) do
						begin
							if (codigo[y] = propuesta[x]) and (not ArregBool[y]) and (not(codigo[x] = codigo[y]))
							then
							begin
								encontre := true;
								regulares := regulares + 1; (*Sumo a regulares*)
								ArregBool[y] := true
							end;
							y := y + 1 (*Aumenta conteo*)
						end;
					end;
				end
 
end;
(*---------------------------------------------------------------------------------------------------*)
 
procedure SiguienteCodigo(codigo: TipoCodigo; var siguiente: TipoCodigo);
 
var
	a : integer;
	flag : boolean;
 
begin
	a := LARGO_CODIGO;
	flag := false;
	codigo := siguiente;
	repeat
	begin
	if codigo[a] <> ULTIMA_LETRA then
		begin
			siguiente[a] := succ(codigo[a]);
			flag := true
		end
	else
		begin
			siguiente[a] := PRIMER_LETRA;
			a := a - 1;
			if a = 0 then
				a := LARGO_CODIGO
		end;
	end;
	until
		flag = true;
end;
 
(*---------------------------------------------------------------------------------------------------*)
 
procedure IniciarHistoria(var historia: THistoria);
 
begin
	historia.tope := 0
end;
 
(*---------------------------------------------------------------------------------------------------*)
 
procedure GuardarNota(var historia: THistoria; codigo: TipoCodigo; buenos,regulares : RangoBR);
 
begin
	historia.tope := historia.tope + 1;
	historia.info[historia.tope].codigo := codigo;
	historia.info[historia.tope].buenos := buenos;
	historia.info[historia.tope].regulares := regulares
end;
 
(*---------------------------------------------------------------------------------------------------*)
 
function EsApropiado(codigo : TipoCodigo; historia: THistoria): boolean;
var
	buenos,regulares: integer;
	contador: integer;
	i: integer;
begin
	i := 1
	contador := 1;
	while (i<=historia.tope) and (contador<=historia.tope) do
	begin
	ObtenerNota(historia.info[i].codigo,codigo,buenos,regulares);
	if(historia.info[i].buenos=buenos) and (historia.info[i].regulares=regulares)
		then
		contador := contador + 1
		i := i + 1 (*Se incrementa la variable*)
	end;
	EsApropiado := contador > historia.tope (*Resultado*)
end;
 
(*---------------------------------------------------------------------------------------------------*)
 
function ListaOrdenada(historia : THistoria) : ListaNotas;
 
(*---------------------------------------------------------------------------------------------------*)
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