Oppure

Loading
28/05/12 10:46
Goblin
Perdonami, ma ci ho capito veramente poco, riesci a farmi un esempio pratico di ciò che ti occorre.
Per esempio le due liste come vengono "inputate",

Domanda: Perchè hai usato delle Procedure con variabili di tipo "var" invece che delle Function ?
per esempio la tua procedura LeggiEScriviLista io la rifarei

Function LeggiEScriviLista(k : integer): Punt;
Var Temp : punt;
begin
  if k=0 then
    Result := nil
  else
  begin
    new(Result);
    read(Result.val);
    new(Temp);
    read(Temp.val);
    write(Result.val,' ');
    write(Temp.val,' ');
    Result.next:=Temp;
    dispose(Temp);
    Result.back := LeggiEScriviLista(k-1);
  end;
end;{ Fine procedura LeggiEScriviLista }


in modo da essere chiamata
p := LeggiEScriviLista(m);
q := LeggiEScriviLista(n);
Personalmente vedo il codice più pulito, ma come ti ho accennato all'inizio mi sfugge, il risultato finale, e la composizione delle liste
Ibis redibis non morieris in bello
28/05/12 12:48
Phi
Ma nei campi next non ti serve forse che ci sia il puntatore all'elemento successivo(ovvero quello "inputato" subito prima) ??

Anche perché con le ultime procedure che hai scrittoti ritrovi con un puntatore non allocato inutilizzabile.

Io scriverei, ascoltanto anche il suggerimento di Goblin, così :
Function LeggiEScriviLista(k : integer; successivo:Punt): Punt;
    begin
      if k=0 then
        Result := nil
      else
      begin
        new(Result);
        read(Result.val);
        write(Result.val,' ');
        Result.next:=successivo;
        Result.back := LeggiEScriviLista(k-1, Result);
      end;
    end;{ Fine procedura LeggiEScriviLista }


o al massimo così:

Function LeggiEScriviLista(k : integer): Punt;
    begin
      if k=0 then
        Result := nil
      else
      begin
        new(Result);
        read(Result.val);
        write(Result.val,' ');
        Result.back := LeggiEScriviLista(k-1);
        Result.back^.next:=Result;
      end;
    end;{ Fine procedura LeggiEScriviLista }


Nel primo caso nel main dovrei avere:
p:= LeggiEScriviLista(m,nil); 

nel secondo semplicemente:
p:= LeggiEScriviLista(m); 
aaa
28/05/12 19:33
fabioser
Ho provato entrambe le versioni ma nessuna delle due funziona. Ecco il codice del programma con quella che dovrebbe essere l'applicazione della prima delle due soluzioni proposte:


program ScritturaDiUnaListaSimmetrica(input,output);
label 99;
const bell=07;
type punt=^elem;
     elem= record
                 val: integer;
                 back : punt;
                 next : punt;
           end;
var p,Result,successivo: punt;
    m : integer;

    Function LeggiEScriviLista(k : integer; successivo:Punt): Punt;
    begin
      if k=0 then
        Result := nil
      else
      begin
        new(Result);
        read(Result^.val);
        write(Result^.val,' ');
        Result^.next:=successivo;
        Result^.back := LeggiEScriviLista(k-1, Result);
      end;
    end;{ Fine function LeggiEScriviLista }

{ Corpo del programma }

begin
     writeln('------------------------- Dati di ingresso --------------------------');
     writeln;
     write('Fornire la lunghezza della lista: ');
     readln(m);
     writeln;
     if m>=10 then begin
                      writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
                      goto 99;
                   end
              else begin
                      write('Fornire la lista: ');
                      p:= LeggiEScriviLista(m,nil);
                   end;
     99 :
     readln;

end.


Grazie per l'aiuto ed il tempo dedicato!:)

aaa
28/05/12 20:01
fabioser
...a rifletterci bene il problema della rappresentazione di una lista simmetrica non può essere risolto con una function, poichè io non stò cercando di
calcolare un valore
, ma debbo appunto scrivere una lista che è una variabile di tipo strutturato composta di record con campi valore integer ma anche campi puntatore. La via corretta per me, è quella della procedura ricorsiva...per me cioè non ha senso porre p:=LeggiEScriviLista(...).
aaa
28/05/12 20:24
Goblin
resta il fatto che io ancora non ho capito cosa ti serve .. mi fai un esempio:
dati in input, calcoli e dati in output.

PS: cosa cambia tra:

program xxxx
var x:integer;

procedure foo(var n:integer);
begin
  n := 5;
end;

begin
  foo(x);
  writeln(x);
end.

e
program xxxx

Function foo: integer;
begin
  Result := 5;
end;

begin
  writeln(foo);
end.



G.
Ultima modifica effettuata da Goblin 28/05/12 20:26
Ibis redibis non morieris in bello
29/05/12 6:36
fabioser
Con il risultato finale della chiamata della procedura otterrai la lista,mentre la chiamata della funzione è per il calcolo di un valore numerico risultato di un espressione, non so se è chiaro.Ciao!:)
aaa
29/05/12 11:23
fabioser
In questa maniera il sottoprogramma mi stampa la lista intera stavolta solo se è dispari:


program ScritturaDiUnaListaSimmetrica(input,output);
label 99;
const bell=07;
type punt=^elem;
     elem= record
                 val: integer;
                 back : punt;
                 next : punt;
           end;
var p,q,t: punt;
    m : integer;
procedure LeggiEScriviLista( var p,q,t : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   read(p^.val);
                   new(t);
                   read(t^.val);
                   p^.back:=t;
                   new(q);
                   read(q^.val);
                   p^.next:=q;
                   t^.next:=q^.back;
                   write(p^.val,' ');
                   write(t^.val,' ');
                   write(q^.val,' ');
                   LeggiEScriviLista(t^.back,p^.back,q^.back,k-1);;
              end;
    end;{ Fine procedura LeggiEScriviLista }

{ Corpo del programma }

begin
     writeln('------------------------- Dati di ingresso --------------------------');
     writeln;
     write('Fornire la lunghezza della lista: ');
     readln(m);
     writeln;
     if m>=10 then begin
                      writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
                      goto 99;
                   end
              else begin
                      write('Fornire la lista: ');
                      LeggiEScriviLista(p,t,q,m);
                   end;
     99 :
     readln;

end.

aaa
29/05/12 15:20
Phi
Postato originariamente da fabioser:
Ho provato entrambe le versioni ma nessuna delle due funziona. Ecco il codice del programma con quella che dovrebbe essere l'applicazione della prima delle due soluzioni proposte:


Se ho capito correttamente ciò che vuoi fare l'errore dipende dal fatto che è sbagliata anche la procedura per la somma.
Ma capisci perché voglio assegnare a .next quel valore ?

Come dice Goblin fa un esempio con dei numeri di quello che vuoi che succeda. Così ci rendiamo conto se abbiamo capito giusto che vuoi fare o no.
Ultima modifica effettuata da Phi 29/05/12 15:22
aaa