Newsgroup: it.comp.lang.pascal
Titolo: problemi di liste

Scusatemi , ho un problemino :
devo fare delle procedure che mi consantano di gestire una lista di elementi
(io ci ho messo gli interi).
Ora per le varie operazioni "standard" (push , pop..) ho implementato una
banale lista astratta , ora però vorrei fare una procedura che mi accettasse
come input una stringa di elementi separati da uno spazio , lo so che il tp
già lo fa , ma credo che dovrei farla io , vi includo un pezzzettino che ho
fatto, mica qualcuno potrebbedarmi una dritta?
(perchè sto un pò in alto mare)
type linea=array[1..200] of tipoelem ;
 nodo=record
        elem:tipoelem;
        punt:indice
     end;
     lista= array[indice] of nodo   ;
 procedure immettidati(var s:string (250); var f:linea)
 var i :integer;
 begin
 j:=1
 for i:=1 to 255 do
  begin
   read(s[i])
   if s[i]<>(chr(32)) then
    begin
     f[j]:=s[i];
     j:=j+1;
    end;
 else if s[i]=/ then exit;
 end.
procedure ordina(var l:lista;f:linea);
 begin
 for i:=1 to f[0] ;
 push(l,f[i]);
 end;
procedure inizio(var l:lista);
begin
writeln('inserire gli elementi della lista separati da uno spazio');
writeln('per terminare l''immissione inserire come ultimo carattere / ');
immettidati;
ordina;
end
 Grazie mille
Flora

(io ci ho messo gli interi).
Prima correggo il tuo esempio, poi lo riscrivo :-)))
Le correzioni sono tra parentesi graffe.
type linea=array[1..200] of tipoelem ;   {Come è definito tipoelem?}
nodo=record
        elem:tipoelem;
        punt:indice   {Qui è meglio mettere il ;}
     end;
     lista= array[indice] of nodo   ;  {NO, indice non è una costante}
procedure immettidati(var s:string (250); var f:linea)
{Al limite string[250], ma a questo punto è meglio lasciare string}
var i :integer;
begin
j:=1   {j non è dichiarata, manca il ;}
for i:=1 to 255 do
  begin   {Per questo begin non esiste un end corrispondente}
   read(s[i])  {Manca il ;}
   if s[i]<>(chr(32)) then {Il chr(32) puoi anche indicarlo con ' '}
    begin
     f[j]:=s[i];
     j:=j+1;
    end;
else if s[i]=/ then exit; {if s[i]='/'}
end.   {ci va il ;, non il .}
procedure ordina(var l:lista;f:linea);
begin
for i:=1 to f[0] ; {Con il ; non eseguirà mai l'istruzione push}
push(l,f[i]);
end;
procedure inizio(var l:lista);
begin
writeln('inserire gli elementi della lista separati da uno spazio');
writeln('per terminare l''immissione inserire come ultimo carattere / ');
immettidati;
ordina;
end {Qui ci va il ;}
{Ovviamente manca il main del programma}
Ecco come lo farei io.
Conservo la procedura inizio;
Conservo la procedura ordina (ammesso che push() faccia il suo dovere);
Definisco tipoelem = string[6];
Procedure ImmettiDati(Var f:linea);
{Questa procedura immette nell'array di stringhe f le stringhe ricavate}
{da tastiera. Ogni stringa è separata dalla successiva da uno spazio e}
{l'input è terminato da un carattere '/'}
{Si suppone che f sia inizialmente vuoto}
Var
  c : char;
  j:integer;
begin
  j := 1;
  {Cicla fino a quando non trovi il carattere '/'}
  Read(c);
  while c<>'/' do
    begin
      if c=' ' then
        j := j + 1
      else
        f[j] := f[j] + c;
      Read(c);
    end;
end;
Questo ovviamente ti fornisce in f delle stringhe, non degli interi.
Se vuoi lavorare su interi puoi o convertire le stringhe con la funzione
Val() o, meglio, leggere direttamente dei valori interi:
Type
  tipoelem=integer;
Procedure ImmettiDati(Var f:linea);
{Questa procedura immette nell'array di interi f gli interi ricavati}
{da tastiera. Ogni intero è separato dal successivo da uno spazio e}
{l'input è terminato da un intero=0}
{Si suppone che f sia inizialmente vuoto}
Var
  c : integer;
  j:integer;
begin
  j := 1;
  {Cicla fino a quando non trovi il carattere '/'}
  Read(c);
  while c<>0 do
    begin
      f[j] := c;
      j := j + 1
      Read(c);
    end;
end;
Ciao.

fatto, mica qualcuno potrebbedarmi una dritta?
Questo e' semplicissimo da realizzare.
E' previsto l'uso delle estensioni orientate agli oggetti nel tuo
progetto ?