Oppure

Loading
24/05/12 9:56
fabioser
Salve. Vorrei sapere se può essere considerata esatta la scrittura della procedura LeggiEScriviLista nella maniera seguente:


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

    procedure LeggiEScriviLista( var p,q : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   readln(p^.val);
                   writeln(p^.val);
                   new(q);
                   readln(q^.val);
                   writeln(q^.val);
                   p^.next:=q;
                   dispose(q);
                   LeggiEScriviLista(p^.back,q,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
                      writeln('Fornire la lista: ');
                      writeln;
                      LeggiEScriviLista(p,q,m);
                   end;
     99 :
     readln;

end.




L'ho testata e stavolta non mi da errore. Tuttavia vorrei sapere come è possibile far si che l'ultimo elemento ( l'm-esimo), punti anch'esso a nil senza compromettere la validità della procedura medesima. Grazie dell'aiuto che vorrete fornirmi. :asd:
Ultima modifica effettuata da Phi 24/05/12 18:25
aaa
24/05/12 18:20
fabioser
Ecco l'ultima correzione del programma con la procedura LeggiEScriviLista riscritta:


program SommaDiDueListe(input,output);
label 99;
const bell=07;
type punt=^elem;
     elem= record
                 val: integer;
                 back : punt;
                 next : punt;
           end;
var p,q,s,t: punt;
    m,n : integer;

    procedure LeggiEScriviLista( var p,t : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   read(p^.val);
                   new(t);
                   read(q^.val);
                   write(p^.val,' ');
                   write(t^.val,' ');
                   p^.next:=t;
                   dispose(t);
                   LeggiEScriviLista(p^.back,t,k-1);
              end;
    end;{ Fine procedura LeggiEScriviLista }
procedure CalcoloSommaDiDueListe( var s : punt; p,q : punt; k : integer);
begin

     if k=0
     then s:=nil
     else begin
               new(s);
               write('Fornire la prima lista: ');
               writeln;
               LeggiEScriviLista(p,t,m);
               writeln;
               write('Fornire la seconda lista: ');
               writeln;
               LeggiEScriviLista(q,t,n);
               writeln;
               writeln('La lista somma e'':');
               writeln;
               s^.val:=p^.val+q^.val;
               case(p^.next^.val+q^.next^.val)of
               0,1,2,3,4,5,6,7,8,9 : s^.val:=p^.val+q^.val;
               10,11,12,13,14,15,16,17,18 : s^.val:=p^.val+q^.val+1
               end;
               case(s^.val)of
               0,1,2,3,4,5,6,7,8,9 :  write(s^.val,' ');
               10,11,12,13,14,15,16,17,18 : begin s^.val:=(s^.val)-10;
                                                  s^.back:=1;
                                                  write(s^.val,' ');
                                                  write(s^.back^.val,' ');
                                            end;
               end;
               CalcoloSommaDiDueListe(s^.back,p^.back,q^.back,k-1);
          end;
end;{ Fine procedura CalcoloSommaDiDueListe }

{ Corpo del programma }
begin
     writeln('------------------------- Dati di ingresso --------------------------');
     writeln;
     write('Fornire la lunghezza della prima lista: ');
     readln(m);
     writeln;
     write('Fornire la lunghezza della seconda lista: ');
     readln(n);
     writeln;
     if m<n then begin
                      writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
                      goto 99;
                 end
            else begin
                      CalcoloSommaDiDueListe(s,p,q,m);
                 end;
     99 :
     readln;

end.



Ma il programma...continua a dare problemi!!!
aaa
24/05/12 18:30
Phi
begin
[..]
new(t);
[..]
p^.next:=t;
dispose(t);
[..]
end;


Scusami, non capisco bene questo passaggio.
Cosa vuoi fare qui ?
Perche' allochi un puntatore per puoi deallocarlo senza usarlo ?
Ultima modifica effettuata da Phi 24/05/12 18:32
aaa
25/05/12 5:06
fabioser
Semplicemente creo un puntatore ausiliario t, per definire il campo next di p e poi elimino tale puntatore. Ho provato a scivere una procedura LeggiEScriviLista fatta così, come da te suggerito:


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

    procedure LeggiEScriviLista( var p,q : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   read(p^.val);
                   new(q);
                   read(q^.val);
                   write(p^.val,' ');
                   write(q^.val,' ');
                   p^.next:=q;
                   dispose(q);
                   LeggiEScriviLista(p^.back,q,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,q,m);
                   end;
     99 :
     readln;

end.



Questa procedura è simile a quella usata nel programma ma...mi scrive la lista completa solo se questa è pari mentre se è dispari mi trascura l'ultimo elemento!!!
aaa
25/05/12 5:57
fabioser
P.S. La scelta di eliminare il puntatore ausiliario è motivata dal fatto che p,q sono parametri in ingresso-uscita. Dunque al termine dell'esecuzione della procedura se elimino q, che è superfluo, avrò meno occupazione di memoria. (Coreggimi se sbaglio).
aaa
25/05/12 10:27
fabioser
Poichè il calcolo della somma delle due liste attraverso la procedura CalcoloSommaDiDueListe è difficile da interpretare la riporto con il codice commentato.


procedure CalcoloSommaDiDueListe( var s : punt; p,q : punt; k : integer);
begin

     if k=0
     then s:=nil
     else begin
               { Creazione della lista somma s}
               new(s);
               { il generico valore  di s corrispondente a quello di k= 1,..,n è pari alla somma
               dei corrispettivi valori di p e q per quel k }
               s^.val:=p^.val+q^.val;
               { se la somma dei valori di p e q, p^.next.val e q^.next.val, che precedono p e q nella lista procedendo da destra verso sinistra è pari a 0,1,..,9 allora s^.val è la somma di q^.val e q^.val. Altrimenti se essa eccede la decina 'debbo riportarne uno'. Ciò vuol dire che s^.val sarà uguale a p^.val+q^.val+1 }
               case(p^.next^.val+q^.next^.val)of
               0,1,2,3,4,5,6,7,8,9 : s^.val:=p^.val+q^.val;
               10,11,12,13,14,15,16,17,18 : s^.val:=p^.val+q^.val+1
               end;
               { Se s^.val(risultato della somma)vale 0,..,9 allora è sufficiente 'scriverlo'. Se vale 10,..,18 allora s^.val sarà uguale a (s^.val)-10, perchè debbo riportare la decina, e l'elemento s a sinistra(s^.back) sarà uguale a 1. A questo punto stampo s^.val }
               case(s^.val)of
               0,1,2,3,4,5,6,7,8,9 :  write(s^.val,' ');
               10,11,12,13,14,15,16,17,18 : begin s^.val:=(s^.val)-10;
                                                  s^.back:=1;
                                                  write(s^.val,' ');
                                            end;
               end;
               CalcoloSommaDiDueListe(s^.back,p^.back,q^.back,k-1);
               { Stampa dell'ultimo elemento da destra verso sinistra della somma s qualora s^.val valesse 10,..,18}
               write(s^.back^.val,' ');
          end;
end;{ Fine procedura CalcoloSommaDiDueListe }





Sperando di essere stato più chiaro delle volte precedenti e confidando nel vostro utilissimo aiuto, vi saluto!!!:asd:
aaa
25/05/12 19:17
fabioser
Nella precedente versione di CalcoloSommaDiDueListe ho commesso diversi errori e me ne scuso. Presento qui quella che dovrebbe essere la mia versione definitiva della procedura (perchè non riesco ad andare avanti). Il codice è il seguente:


procedure CalcoloSommaDiDueListe( var s : punt; p,q : punt; k : integer);
begin

     if k=0
     then s:=nil
     else begin
               { Creazione della lista somma s}
               new(s);
               { il generico valore  di s corrispondente a quello di k= 1,..,n è          pari alla somma dei corrispettivi valori di p e q per quel k }
               s^.val:=p^.val+q^.val;
               { se la somma dei valori di p e q, p^.next.val e q^.next.val, che precedono p e q nella lista procedendo da destra verso sinistra è pari a 0,1,..,9 allora s^.val è la somma di q^.val e q^.val. Altrimenti se essa eccede la decina 'debbo riportarne uno'. Ciò vuol dire che s^.val sarà uguale a p^.val+q^.val+1 }
               case(p^.next^.val+q^.next^.val)of
               0,1,2,3,4,5,6,7,8,9 : s^.val:=p^.val+q^.val;
               10,11,12,13,14,15,16,17,18 : s^.val:=p^.val+q^.val+1
               end;
               { Se s^.val(risultato della somma)vale 0,..,9 allora è sufficiente 'scriverlo'. Se vale 10,..,18 allora s^.val sarà uguale a (s^.val)-10, perchè debbo riportare la decina. A questo stampo s^.val }
               case(s^.val)of
               0,1,2,3,4,5,6,7,8,9 :  write(s^.val,' ');
               10,11,12,13,14,15,16,17,18 : begin s^.val:=(s^.val)-10;
                                                                   write(s^.val,' ');
                                                           end;
               end;
               CalcoloSommaDiDueListe(s^.back,p^.back,q^.back,k-1);
               { Stampa dell'ultimo elemento da destra verso sinistra della somma s qualora s^:val valesse 10,..,18}
              if k=m
              then case(s^.val)of
                   0,1,2,3,4,5,6,7,8,9 :  ;
                   10,11,12,13,14,15,16,17,18 : begin s^.back:=1;
                                                                       write(s^.back^.val,' ');
                                                               end;
                    end;
          end;
end;{ Fine procedura CalcoloSommaDiDueListe }




Rimanendo in attesa di una risposta di verifica della correttezza di quanto scritto saluto moderatori ed utenti del Forum.Ciao!!!:)
aaa
27/05/12 10:21
fabioser
Ho elaborato una formulazione della procedura CalcoloSommaDiDueListe, che corregge la precedente e che fa uso dell'istruzione if..then..else
in luogo dell'istruzione case, usata erroneamente. Il codice è il seguente:


procedure CalcoloSommaDiDueListe( var s : punt; p,q : punt; k : integer);
begin

     if k=0
     then s:=nil
     else begin
               { Creazione della lista somma s}
               new(s);
               { il generico valore  di s corrispondente a quello di k= 1,..,n è pari alla somma
               dei corrispettivi valori di p e q per quel k }
               s^.val:=p^.val+q^.val;
               { se la somma dei valori di p e q, p^.next.val e q^.next.val, che precedono p e q
               nella lista procedendo da destra verso sinistra è pari a 0,1,..,9 allora s^.val è
               la somma di q^.val e q^.val. Altrimenti se essa eccede la decina 'debbo riportarne
               la medesima'.}
               s^.next^.val:=p^.next^.val+q^.next^.val;
               if s^.next^.val>=10
               then begin
                         s^.next^.val:=(s^.next^.val)mod 10;
                         s^.val:=p^.val+q^.val+(s^.next^.val)div 10;
                    end;
               { Se s^.val(risultato della somma)vale 0,..,9 allora è sufficiente 'scriverlo'.Altrimenti
                vale (s^.val)mod 10. A questo punto stampo s^.val }
               if s^.val<10
               then write(s^.val,' ')
               else  begin s^.val:=(s^.val)mod 10;
                           write(s^.val,' ');
                     end;
               { Stampa dell'ultimo elemento da destra verso sinistra della somma s qualora s^.val
                fosse>=10}
               if k=m
               then if s^.val>=10
                    then begin s^.back^.val:=(s^.val)div 10;
                               write(s^.back^.val,' ');
                         end;
               CalcoloSommaDiDueListe(s^.back,p^.back,q^.back,k-1);
          end;
end;{ Fine procedura CalcoloSommaDiDueListe }




Sarei grato a chiunque del Forum fosse in grado di verificarne la correttezza.Ciao!!!:)


aaa