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


0