Pascal/Turbo Pascal - por que tengo que "inicializar" esta lista en nil

 
Vista:

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


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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

por que tengo que "inicializar" esta lista en nil

Publicado por ramon (2158 intervenciones) el 31/08/2013 22:57:52
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
{A ver mira esto te ayudara algo lo primero no hace falta el nil lo otro si fíjate el porque si sigues
 el programa te darás cuenta de ello.
 El array de punteros te sobra puesto que los punteros realizan ese echo del array.
 
program prueva;
  uses
     crt;
  type
   dato = record
          codigo : integer;
          cantidad : integer;
        end;
 
   punteroejemp = ^ejemplo;
     ejemplo = record
           datos : dato;
           sig : punteroejemp;
         end;
   datos1 = ^string;
 
   var
     prime, anter, actu : punteroejemp;
     midato : datos1;
     tec : char;
 
 
   procedure entramidato;
   begin
       new(midato);
       write('   Entre Mi Dato : ');
       readln(midato^);
   end;
 
 
   procedure entradas;
    procedure entramosdatos;
    begin
       with actu^ do
       begin
          write('Introduzca codigo : ');
          readln(datos.codigo);
          write('Introduzca Cantidad : ');
          readln(datos.cantidad);
       end;
    end;
   begin
   if prime = nil then
   begin
       new(actu);
       entramosdatos;
       prime := actu;
       actu^.sig := nil;
      end
   else
      begin
          anter := actu;
          new(actu);
          entramosdatos;
          anter^.sig := actu;
          actu^.sig := nil;
      end;
    end;
 
  procedure listardatos;
    var
      ver : punteroejemp;
    begin
       writeln('  Codigo         Cantidad');
       ver := prime;
       while ver <> nil do
       begin
          with ver^ do
          writeln('   ',datos.codigo,'                ',datos.cantidad);
          ver := ver^.sig;
        end;
        writeln;
        writeln('Pulse [Enter]');
        readln;
     end;
 
   begin
       clrscr;
       writeln('   Primero La Variable Puntero Datos1 Estringe de 255',
                                                     ' caracteres ');
       writeln;
       entramidato;
       writeln;
       writeln(' Mi Dato Fue : ',midato^);
       writeln('   Pulse Una Tecla');
       readkey;
       dispose(midato);
       clrscr;
       prime := nil;
       writeln('  Segunda Variable De Registros ');
       writeln;
     repeat
       entradas;
       writeln('  Desea mas entradas [S/N]');
       tec := upcase(readkey);
       if tec = 'S' then
       clrscr;
     until tec = 'N';
     clrscr;
     listardatos;
     dispose(actu);
   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