por que tengo que "inicializar" esta lista en nil
Publicado por Braian (1 intervención) el 25/08/2013 21:50:02
buenas gente, yo siempre tuve entendido que si uno tiene una variable de tipo lista, y NO se le hace un NEW, esta queda por defecto en nil, pero aca hice este codigo medio complejo para mi, en el cual si no le asigno un nil una variable auxiliar de tipo lista me termina dando error, pero si lo hago no, queria entender porque. aca les dejo el codigo, esa asignacion esta en el modulo generar arreglo. gracias por su respuesta.
PD:para facilitarle las cosas el ejercicio este simula la carga de ventas de maximo 5 sucursales de un supermercado, las ordena por codigo de producto y cantidad. el codigo de producto puede repetirse, inclusive en la misma sucursal. despues devolver una lista con la cantidad de ventas de cada producto y la sucursal con mas ventas.
SALUDOS!!
PD:para facilitarle las cosas el ejercicio este simula la carga de ventas de maximo 5 sucursales de un supermercado, las ordena por codigo de producto y cantidad. el codigo de producto puede repetirse, inclusive en la misma sucursal. despues devolver una lista con la cantidad de ventas de cada producto y la sucursal con mas ventas.
SALUDOS!!
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
program listadecontadoresymas;
type
dato=record
codigo:integer;
cantidad:integer;
end;
lista=^lis;
lis=record
datos:dato;
sig:lista;
end;
super=array [1..5] of lista;
cont= array [1..5] of integer;
procedure regist (var r:dato);
begin
WRITELN ('INSERTA EL CODIGO');
readln (r.codigo);
if (r.codigo<>0) then begin
WRITELN ('INSERTA LA CANTIDAD');
readln (r.cantidad);
end;
end;
procedure generarlista (var l:lista);
var nue:lista; r:dato;
begin
regist (r);
while (r.codigo<>0) do begin
new (nue);
nue^.datos:=r;
nue^.sig:=l;
l:=nue;
regist (r);
end;
end;
procedure generararreglo (var s:super; var diml:integer);
var aux:lista;
begin
diml:=0;
aux:=nil; {ESTA ES LA ASIGNACION QUE NO ENTIENDO POR QUE HACE FALTA}
writeln ('LLENANDO ELEMENTO 1');
generarlista (aux);
while (aux<>nil) and (diml<5) do begin
diml:=diml+1;
s[diml]:=aux;
if (diml<5) then begin
WRITELN ('LLENANDO ELEMENTO ', DIML+1);
aux:=nil; {cuando llenas arreglos de listas acordate de vaciar la lista a nil antes de pasar al siguiente elemento del arreglo}
generarlista (aux);
end;
end;
end;
procedure imprimir (s:super; diml:integer);
var i:integer;
begin
for i:= 1 to diml do begin
writeln ('SUCURSAL: ', i);
if (s[i]=nil) then begin
writeln ('LISTA VACIA'); {esto no lo va a imprimir, por que nunca entraria a esta parte del for por la diml que quedaria en 0}
end
else begin
while (s[i]<>nil) do begin
writeln ('codigo: ', s[i]^.datos.codigo);
writeln ('cantidad: ', s[i]^.datos.cantidad);
s[i]:=s[i]^.sig;
end;
end;
end;
end;
procedure masventas (s:super; diml:integer; var sucmax:integer);
var i, maxventas:integer; c:cont;
begin
maxventas:=-1;
for i:= 1 to diml do begin
c[i]:=0;
while (s[i]<>nil) do begin
c[i]:=c[i]+s[i]^.datos.cantidad;
s[i]:=s[i]^.sig;
end;
if (c[i]>maxventas) then begin
sucmax:=i;
maxventas:=c[i];
end;
end;
end;
function verificarsiexiste(cod:integer; conl:lista):boolean;
var ok:boolean;
begin
ok:=false;
while (conl<>nil) and (not ok) do begin
if (conl^.datos.codigo=cod) then
ok:=true;
conl:=conl^.sig;
end;
verificarsiexiste:=ok;
end;
procedure buscaryagregar (r:dato; var conl:lista);
var aux:lista;
begin
aux:=conl;
while (aux^.datos.codigo<>r.codigo) do
aux:=aux^.sig;
aux^.datos.cantidad:=aux^.datos.cantidad+r.cantidad;
end;
procedure crearnuevo (var conl:lista; r:dato);
var aux:lista;
begin
new (aux);
aux^.datos:=r;
aux^.sig:=conl;
conl:=aux;
end;
procedure contar (s:super; diml:integer; var conl:lista);
var i:integer;
begin
for i:= 1 to diml do begin
while (s[i]<>nil) do begin
if (verificarsiexiste(s[i]^.datos.codigo, conl)) then begin
buscaryagregar(s[i]^.datos, conl)
end
else begin
crearnuevo(conl, s[i]^.datos);
end;
s[i]:=s[i]^.sig;
end;
end;
end;
procedure imprimirlista (l:lista);
begin
while (l<>nil) do begin
writeln ('PRODUCTO: ',l^.datos.codigo);
writeln ('CANTIDAD: ',l^.datos.cantidad);
l:=l^.sig
end;
end;
var
s:super; diml, sucmax:integer; conl:lista;
begin
generararreglo (s, diml);
imprimir (s,diml);
masventas (s,diml,sucmax);
writeln ('LA SUCURSAL CON MAS VENTAS ES LA SUCURSAL ',sucmax);
contar (s, diml,conl);
imprimirlista (conl);
readln;
readln;
end.
Valora esta pregunta


0