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 - Calcolo del massimo tra gli elementi di una lista semplice
Forum - Pascal - Calcolo del massimo tra gli elementi di una lista semplice

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 12:22
Venerdì, 22/06/2012
Salve a tutti utenti e moderatori del forum. Ho da sottoporre un problema che, pur nella sua semplicità, a me riesce di ardua soluzione. Si tratta di calcolare il massimo degli elementi di una lista semplice di numeri reali. Per memorizzare la lista ho usato una procedura ricorsiva, mentre per il calcolo del massimo una funzione. Sicuramente ho commesso un errore nella compilazione di quest'ultima, ma non riesco ad individuare quale. Qualcuno di voi è in grado di aiutarmi? Riporto di seguito il codice del programma da me elaborato:

Codice sorgente - presumibilmente Delphi

  1. program MaggioreDegliElementiDiUnaLista(input,output);
  2. const bell=07;
  3. type punt=^elem;
  4.      elem=record
  5.                 val : real;
  6.                 next : punt;
  7.           end;
  8. var p : punt;
  9.     n,i,risposta: integer;
  10.     max,massimo  : real;
  11.  
  12. procedure LeggiLista( var p : punt; k : integer);
  13. begin
  14.      if k=0
  15.      then p:=nil
  16.      else begin
  17.                new(p);
  18.                read(p^.val);
  19.                LeggiLista(p^.next,k-1);
  20.           end;
  21. end;{ fine procedura Leggilista }
  22. Function CalcolaMassimo( p : punt ): real;
  23. begin
  24.      i:=1;
  25.      max:=p^.val;
  26.      while(i<=n)
  27.      do begin
  28.              p:=p^.next;
  29.              if p^.val>max
  30.              then max:=p^.val;
  31.              i:=i+1;
  32.         end;
  33.      CalcolaMassimo:=max;
  34. end;{ fine function CalcolaMassimo }
  35. { corpo del programma }
  36. begin
  37.      repeat
  38.            writeln('-------------------------- Dati di ingresso -----------------------------');
  39.            writeln;
  40.            writeln;
  41.            write('Fornire la lunghezza della lista: ');
  42.            readln(n);
  43.            writeln;
  44.            if n>20
  45.            then begin
  46.                      writeln(chr(bell),'Lunghezza della lista troppo grande! - STOP -');
  47.                      exit;
  48.                 end
  49.            else begin
  50.                      writeln('Fornire gli elementi della lista ciascuno separato da <SPAZIO>:');
  51.                      writeln;
  52.                      Leggilista(p,n);
  53.                      writeln;
  54.                      massimo:=CalcolaMassimo(p);
  55.                      writeln;
  56.                      writeln('Il massimo degli elementi della lista e'' : ',massimo:6:2);
  57.                 end;
  58.            writeln;
  59.            writeln('Finito?');
  60.            writeln;
  61.            writeln('Scrivere ''1'' per finire ''2'' per continuare');
  62.            writeln;
  63.            readln(risposta);
  64.            writeln;
  65.            readln;
  66.      until(risposta=1);
  67.  
  68. end.
  69.  
  70. Scusandomi ancora per la semplicità del problema proposto e per gli eventuali errori commessi rimango in attesa di una risposta. Ciao !!!:)


PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 15:54
Venerdì, 22/06/2012

Non hai specificato quale errore ti da, è molto probabile che sia un errore logico,

a prima vista potrebbe essere quel i := 1;



If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 16:00
Venerdì, 22/06/2012
L'errore è 256. Dovrebbe essere per un effetto collaterale all'interno della funzione CalcolaMassimo, tuttavia non riesco a scriverla correttamente...

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 16:42
Venerdì, 22/06/2012

Effetto collaterale, di sicuro un errore logico, sono quelli più rognosi


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 17:07
Venerdì, 22/06/2012
Perchè mi dici che è un errore inizializzare ad 1 la variabile contatore i nella funzione CalcolaMassimo

Codice sorgente - presumibilmente Delphi

  1. Function CalcolaMassimo( p : punt; k : integer ): real;
  2. var i : integer;
  3. begin
  4.      i:=1;
  5.      max:=p^.val;
  6.      while(i<=k)
  7.      do begin
  8.              p:=p^.next;
  9.              if p^.val>max
  10.              then max:=p^.val;
  11.              i:=i+1;
  12.         end;
  13.      CalcolaMassimo:=max;
  14. end;{ fine function CalcolaMassimo }



non devo attribuire forse a max il valore iniziale p^.val del primo elemento della lista e poi procedere con il ciclo while? Dimmi dove sbaglio...forse devo usare una variabile ausiliaria all'interno di quest'ultimo ciclo? E se si ...in che modo?

PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 18:24
Venerdì, 22/06/2012
a volte le cose semplici sono le più facili :)

pensa di scorrere la lista sino a quando non è nulla, perchè devi contare ?
io farei così...
Codice sorgente - presumibilmente Delphi

  1. Function CalcolaMassimo( p : punt ): real;
  2. begin
  3.   result := 0;
  4.      while Not (p = nil) do
  5.      begin
  6.        if p^.val > result then
  7.          result := p^.val;
  8.        p:=p^.next;
  9.      end;
  10. end;{ fine function CalcolaMassimo }



PS: non testata scritta "al volo"

G.

Ultima modifica effettuata da Goblin il 22/06/2012 alle 18:26


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


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 19:09
Venerdì, 22/06/2012
Grazie Goblin per la tua disponibilità!!!

PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 21:31
Venerdì, 22/06/2012
Ragazzi, mi scuso per non aver spiegato l'errore, ma con il cell è stato già difficile scrivere, allora l'errore "credo" che fosse il classico AC, in quanto il loop andava a prendere un p^.val a nil, fabioser ti consiglio un compilatore con il debug "step by step" credo che il freepascal/lazarus siano la cosa migliore, errori del genere li becchi al volo.
Un piccolo consiglio quando si fanno i vari loop che siano for, while o repeat e ci sono delle liste il 99% delle volte l'errore è dovuto ad un accesso ad una lista nulla


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


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 6:35
Sabato, 23/06/2012
Grazie per i preziosi consigli!!!:)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo