Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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
program CreazioneDiUnaListaDeiPariEDeiDispari(input,output);
const bell=07;
type punt=^elem;
elem=record
val:integer;
next : punt;
end;
var p,{puntatore all'elemento in esame}
prec,{puntatore a quello precedente in esame}
paux ,{puntatore ausiliario}
piniz,nuova,listapari,listadispari : punt;
n :integer;
procedure LeggiLista(var p : punt; k :integer);
begin
if k=0
then p:=nil
elsebegin
new(p);
read(p^.val);
LeggiLista(p^.next,k-1);
end;
end;{ fine procedure Leggilista }
procedure CreazioneListaPari(var piniz,nuova : punt );
{ procedura per la creazione di una lista dei pari}
begin
{inizializzazione dei puntatori}
p:=piniz;
prec:=nil;
nuova:=nil;
{scansione della lista}
while p<>nil
{se l'elemento è pari}
doif((p^.val)mod(2))=0
thenbegin
{eliminazione dell'elemento e suo inserimento
nella lista dei pari}
if prec=nil
{l'elemento da eliminare dalla lista p è il primo}
then piniz:=p^.next
else{l'elemento da eliminare non è il primo}
prec^.next:=p^.next;
{inserimento nella nuova lista ( in testa )dell'elemento
eliminato e aggiornamento del puntatore p}
paux:=p^.next;
p^.next:=nuova;
nuova:=p;
p:=paux;
end
elsebegin
prec:=p;
p:=p^.next;
end;
end;{ fine procedura CreazioneListaPari }
{ corpo del programma }
begin
writeln('-------------------------- Dati di ingresso --------------------------');
writeln;
writeln;
write('Fornire la lunghezza della lista in ingresso: ');
readln(n);
writeln;
if n>20
thenbegin
writeln(chr(bell),'Dimensione troppo grande della lista! - STOP -');
exit;
end
elsebegin
writeln;
writeln('Fornire la lista in ingresso con gli elementi separati da uno <SPAZIO>:');
writeln;
LeggiLista(piniz,n);
writeln;
writeln;
CreazioneListaPari(piniz,nuova);
writeln;
writeln;
writeln('La lista dei pari e'':');
writeln;
listapari:=nuova;
repeatwrite(listapari^.val:3,' ');
listapari:=listapari^.next;
until listapari=nil;
write(listapari^.val:3,' ');
writeln;
writeln;
{la lista dei dispari è ciò che rimane della lista p}
writeln('La lista dei dispari e'':');
writeln;
listadispari:=p;
repeatwrite(listadispari^.val:3,' ');
listadispari:=listadispari^.next;
until listadispari=nil;
write(listadispari^.val:3,' ');
end;
readln;
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!!!
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
repeatuntil 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
write(listapari^.val:3,' ');
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
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...
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
Codice sorgente - presumibilmente Delphi
program Project26;
uses
const bell=07;
type punt=^elem;
elem=record
val:integer;
next : punt;
end;
var listapari,listadispari : punt;
n :integer;
s:string;
procedure LeggiLista(var p : punt;var d: punt; k :integer);
Var nInsert:Integer;
begin
if k=0
then p:=nil
elsebegin
read(nInsert);
if(nInsert mod 2)= 0 then
begin
new(p);
p^.val:= nInsert;
LeggiLista(p^.next, d, k-1);
end
else
begin
new(d);
d^.val:= nInsert;
LeggiLista(p, d^.next,k-1);
end;
end;
end;{ fine procedure Leggilista }
begin
{ corpo del programma }
begin
writeln('-------------------------- Dati di ingresso --------------------------');
writeln;
writeln;
write('Fornire la lunghezza della lista in ingresso: ');
readln(n);
writeln;
if n>20
thenbegin
writeln(chr(bell),'Dimensione troppo grande della lista! - STOP -');
exit;
end
elsebegin
writeln;
writeln('Fornire la lista in ingresso con gli elementi separati da uno <SPAZIO>:');
writeln;
LeggiLista(listapari, listadispari, n);
writeln;
writeln('La lista dei pari e'':');
writeln;
whilenot(listapari=nil)do
begin
write(listapari^.val:3,' ');
listapari:=listapari^.next;
end;
writeln;
writeln;
{la lista dei dispari è ciò che rimane della lista p}
writeln('La lista dei dispari e'':');
writeln;
whilenot(listadispari=nil)do
begin
write(listadispari^.val:3,' ');
listadispari:=listadispari^.next;
end;
end;
readln(n);
end;
end.
Ultima modifica effettuata da Goblin il 23/07/2012 alle 13:13