Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Determinazione della lista dei numeri pari e di quelli dispari da una lista data di interi
Forum - Pascal - Determinazione della lista dei numeri pari e di quelli dispari da una lista data di interi

Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 15:37
Domenica, 22/07/2012
Salve a tutti utenti e moderatori del forum. Ho da proporre alla vostra attenzione un problema classico e che dovrebbe essere di semplice soluzione, ma del quale non riesco a venire a capo. Si tratta di determinare la lista dei numeri pari e di quella dei numeri dispari a partire da una lista qualunque di interi data in ingresso, che noi non supporemo maggiore del numero di venti elementi. Ho pensato di procedere nel seguente modo. Ho prima acquisito la lista data mediante una procedura ricorsiva, poi tramite una seconda procedura ho estratto gli elementi nulli o quelli pari e li ho memorizzati in una lista denominata "nuova". Poi ho proceduto alla stampa della lista dei pari così ottenuta, e alla stampa della lista rimanente di quella fornita in partenza, che dovrebbe contenere solo numeri dispari.Tuttavia debbo avere sicuramente commesso qualche errore logico nella stesura del programma, poichè all'atto della compilazione il compilatore medesimo mi da errore a tempo di esecuzione. Riporto di seguito il codice sorgente dell'intero programma da me elaborato:


Codice sorgente - presumibilmente Delphi

  1. program CreazioneDiUnaListaDeiPariEDeiDispari(input,output);
  2. const bell=07;
  3. type punt=^elem;
  4.      elem=record
  5.                 val : integer;
  6.                 next : punt;
  7.           end;
  8. var  p,{puntatore all'elemento in esame}
  9.      prec,{puntatore a quello precedente in esame}
  10.      paux ,{puntatore ausiliario}
  11.      piniz,nuova,listapari,listadispari : punt;
  12.      n : integer;
  13.  
  14. procedure LeggiLista( var p : punt; k : integer);
  15. begin
  16.      if k=0
  17.      then p:=nil
  18.      else begin
  19.                new(p);
  20.                read(p^.val);
  21.                LeggiLista(p^.next,k-1);
  22.           end;
  23. end;{ fine procedure Leggilista }
  24. procedure CreazioneListaPari( var piniz,nuova : punt );
  25. { procedura per la creazione di una lista dei pari}
  26. begin
  27.      {inizializzazione dei puntatori}
  28.      p:=piniz;
  29.      prec:=nil;
  30.      nuova:=nil;
  31.      {scansione della lista}
  32.      while p<>nil
  33.      {se l'elemento è pari}
  34.      do if((p^.val)mod(2))=0
  35.         then begin
  36.                   {eliminazione dell'elemento e suo inserimento
  37.                   nella lista dei pari}
  38.                   if prec=nil
  39.                   {l'elemento da eliminare dalla lista p è il primo}
  40.                   then piniz:=p^.next
  41.                   else {l'elemento da eliminare non è il primo}
  42.                   prec^.next:=p^.next;
  43.                   {inserimento nella nuova lista ( in testa )dell'elemento
  44.                   eliminato e aggiornamento del puntatore p}
  45.                   paux:=p^.next;
  46.                   p^.next:=nuova;
  47.                   nuova:=p;
  48.                   p:=paux;
  49.              end
  50.         else begin
  51.                   prec:=p;
  52.                   p:=p^.next;
  53.              end;
  54. end;{ fine procedura CreazioneListaPari }
  55. { corpo del programma }
  56. begin
  57.      writeln('-------------------------- Dati di ingresso --------------------------');
  58.      writeln;
  59.      writeln;
  60.      write('Fornire la lunghezza della lista in ingresso: ');
  61.      readln(n);
  62.      writeln;
  63.      if n>20
  64.      then begin
  65.                writeln(chr(bell),'Dimensione troppo grande della lista! - STOP -');
  66.                exit;
  67.           end
  68.      else begin
  69.                writeln;
  70.                writeln('Fornire la lista in ingresso con gli elementi separati da uno <SPAZIO>:');
  71.                writeln;
  72.                LeggiLista(piniz,n);
  73.                writeln;
  74.                writeln;
  75.                CreazioneListaPari(piniz,nuova);
  76.                writeln;
  77.                writeln;
  78.                writeln('La lista dei pari e'':');
  79.                writeln;
  80.                listapari:=nuova;
  81.                repeat write(listapari^.val:3,' ');
  82.                       listapari:=listapari^.next;
  83.                until listapari=nil;
  84.                write(listapari^.val:3,' ');
  85.                writeln;
  86.                writeln;
  87.                {la lista dei dispari è ciò che rimane della lista p}
  88.                writeln('La lista dei dispari e'':');
  89.                writeln;
  90.                listadispari:=p;
  91.                repeat write(listadispari^.val:3,' ');
  92.                       listadispari:=listadispari^.next;
  93.                until listadispari=nil;
  94.                write(listadispari^.val:3,' ');
  95.           end;
  96.      readln;
  97.  
  98. end.



Nella speranza che qualcuno tra voi sia così gentile da fornirmi la soluzione esatta ed indicarmi gli errori commessi, vi saluto e rimango in attesa di una risposta. Grazie. Ciao!!!:)

PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 20:58
Domenica, 22/07/2012
Ho provato a ricompilarlo e a me restituisce "Runtime Error 216"(circa Segmentation Fault) dopo aver listato tutti i pari.
Ad una prima occhiata il motivo è che dopo il ciclo
Codice sorgente - presumibilmente Pascal

  1. repeat until listapari=nil;


sappiamo per forza che listapari non è allocato, quindi non puoi chiedere al programma di calcolare listapari^.val:3 (questo lo fai la riga dopo con il writeln ).

Quindi devi rimuovere le righe:
Codice sorgente - presumibilmente Plain Text

  1. write(listapari^.val:3,' ');
  2. write(listadispari^.val:3,' ');



Tuttavia a me restituisce ancora errore 216 in un punto successivo. Ora lo guardo meglio per capirne il motivo.

Ultima modifica effettuata da Phi il 22/07/2012 alle 20:59
PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 12:41
Lunedì, 23/07/2012
La procedura CreazioneListaPari dovrebbe essere corretta, poichè elaborata tenendo presente che il problema che ho presentato è analogo a quello della scittura di una lista non ordinata, ottenuta da una lista di interi data in ingresso, ed i cui elementi siano maggiori di un dato numero intero n...

PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 12:43
Lunedì, 23/07/2012
Ti propongo una variante alla tua soluzione:
Perchè non riempi le 2 liste "Pari" e "Dispari" all'origine ?
Ovviamente questa soluzione ha i suoi "pro" e "contro", il pro è dato dal fatto di evitarsi la scrittura di scorporamento pari/dispari della lista iniziale, il contro è che non si ha una lista generale, ma 2 liste distinte:


Ti posto un esempio scritto "al volo" e testato solo 2 volte 8-|
Codice sorgente - presumibilmente Delphi

  1. program Project26;
  2.  
  3. uses
  4.     const bell=07;
  5.     type punt=^elem;
  6.          elem=record
  7.                     val : integer;
  8.                     next : punt;
  9.               end;
  10.     var listapari,listadispari : punt;
  11.          n : integer;
  12.          s:string;
  13.     procedure LeggiLista( var p : punt; var d: punt; k : integer);
  14.     Var nInsert: Integer;
  15.     begin
  16.          if k=0
  17.          then p:=nil
  18.          else begin
  19.                 read(nInsert);
  20.                 if (nInsert mod 2) = 0 then
  21.                 begin
  22.                   new(p);
  23.                   p^.val := nInsert;
  24.                   LeggiLista(p^.next, d, k-1);
  25.                 end
  26.                 else
  27.                 begin
  28.                   new(d);
  29.                   d^.val := nInsert;
  30.                   LeggiLista(p, d^.next,k-1);
  31.                 end;
  32.               end;
  33.     end;{ fine procedure Leggilista }
  34.  
  35. begin
  36.     { corpo del programma }
  37.     begin
  38.          writeln('-------------------------- Dati di ingresso --------------------------');
  39.          writeln;
  40.          writeln;
  41.          write('Fornire la lunghezza della lista in ingresso: ');
  42.          readln(n);
  43.          writeln;
  44.          if n>20
  45.          then begin
  46.                    writeln(chr(bell),'Dimensione troppo grande della lista! - STOP -');
  47.                    exit;
  48.               end
  49.          else begin
  50.                    writeln;
  51.                    writeln('Fornire la lista in ingresso con gli elementi separati da uno <SPAZIO>:');
  52.                    writeln;
  53.                    LeggiLista(listapari, listadispari, n);
  54.                    writeln;
  55.                    writeln('La lista dei pari e'':');
  56.                    writeln;
  57.                    while not (listapari=nil) do
  58.                    begin
  59.                      write(listapari^.val:3,' ');
  60.                      listapari:=listapari^.next;
  61.                    end;
  62.                    writeln;
  63.                    writeln;
  64.                    {la lista dei dispari è ciò che rimane della lista p}
  65.                    writeln('La lista dei dispari e'':');
  66.                    writeln;
  67.                    while not (listadispari=nil) do
  68.                    begin
  69.                       write(listadispari^.val:3,' ');
  70.                       listadispari:=listadispari^.next;
  71.                    end;
  72.               end;
  73.          readln(n);
  74.     end;
  75. end.


Ultima modifica effettuata da Goblin il 23/07/2012 alle 13:13


Ibis redibis non morieris in bello
PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 12:44
Lunedì, 23/07/2012
Scusa...volevo dire scrittura e non scittura come ho erroneamente digitato...

PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 12:47
Lunedì, 23/07/2012
Grazie della soluzione alternativa Goblin!

PM Quote