Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal]Calcolo della somma di due numeri interi rappresentati mediante liste

    Salve a tutti amici del forum!!!Mi rivolgo a voi, nella speranza di trovare un aiuto nella soluzione del seguente problema; è noto come due numeri interi ( che noi supporremo tali che il primo in ingresso sia maggiore o uguale al secondo, in quanto a numero di cifre che lo caratterizzano) possano essere rappresentati mediante due liste distinte che fanno uso di record e puntatori; si vuole scrivere un programma che dati due numeri così rappresentati, calcoli e stampi la loro somma. Ho provato ad elaborare un programma, risolutore del problema sopra citato, che fa uso di due procedure, la prima scritta per acquisire le due liste e rappresentarle, la seconda per calcolare la somma degli elementi delle liste suddette. In tale calcolo bisogna tenere conto delle cifre da riportare e da sommare, quando l'addizione di due elementi delle due liste superi il valore di dieci ed inoltre occorre tenere conto del fatto che , se le due liste sono di uguale lunghezza e la somma dell'ultima coppia di elementi ( le prime due cifre dei due numeri dati da sinistra!) ha valore maggiore di dieci occorre che la lista che rappresenta la somma abbia un elemento in più e pari ad 1. La soluzione da me proposta è la seguente:

    codice:
    program SommaDiDueListe(input,output);
    label 99;
    const bell=07;
    type punt=^elem;
         elem= record
                     val: integer;
                     back : punt;
               end;
    var p,q,s : punt;
        m,n,k : integer;
    
    procedure LeggiEScriviLista( var p : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   read(p^.val);
                   write(p^.val,' ');
                   LeggiEScriviLista(p^.back,k-1);
              end;
    end;{ Fine procedura LeggiEScriviLista }
    procedure CalcoloSommaDiDueListe( var s : punt; p,q : punt);
    var i : integer;
    begin
         new(s);
         for i:=1 to m
                  do begin
                          s^.val:=p^.val+q^.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,' ');
                                                             s^.back^.val:=(p^.back^.val+q^.back^.val+1);
                                                       end
                          end;
                          p:=p^.back;
                          q:=q^.back;
                          s:=s^.back;
                          s^.back:=nil;
                     end;
         if i=m then begin
                          case(p^.val+q^.val)of
                          10,11,12,13,14,15,16,17,18 : begin(s^.back^.val):=1;
                                                             write(s^.back^.val,' ');
                                                       end
                          end;
                          s^.back^.back:=nil;
                     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
                          write('Fornire la prima lista: ');
                          LeggiEScriviLista(p,m);
                          writeln;
                          write('Fornire la seconda lista: ');
                          LeggiEScriviLista(q,m);
                          writeln;
                          writeln('La lista somma e'':');
                          CalcoloSommaDiDueListe(p,q,s);
                     end;
         99 :
         readln;
    
    end.
    Tuttavia tale programma, pur risultando sintatticamente corretto, non risulta tale per quel che riguarda gli errori a tempo di esecuzione (segnatamente NON MI CALCOLA LA LISTA SOMMA!!!). Risulta evidente che l'errore si annida nella procedura CalcoloSommaDiDueListe, ma non riesco ad individuarlo. Come va riscritta correttamente tale procedura? Qualcuno di voi, amici del forum, è in grado di aiutarmi? Certo dell'attenzione che presterete al mio quesito, vi saluto e vi ringrazio. Ciao!!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [PASCAL] Calcolo somma di numeri interi rappresentati mediante liste

    Ho provato ad elaborare una versione ricorsiva della procedura CalcoloSommaDiDueListe, ma il risultato non è corretto, ovvero la finestra di dev-Pascal ( il compilatore che uso) , si chiude al momento del calcolo della somma senza fornire i dati richiesti. Ecco il programma redatto in questa nuova versione:

    codice:
    program SommaDiDueListe(input,output);
    label 99;
    const bell=07;
    type punt=^elem;
         elem= record
                     val: integer;
                     back : punt;
               end;
    var p,q,s : punt;
        m,n,k : integer;
    
    procedure LeggiEScriviLista( var p : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   read(p^.val);
                   write(p^.val,' ');
                   LeggiEScriviLista(p^.back,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);
                   s^.val:=p^.val+q^.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,' ');
                                                      s^.back^.val:=(p^.back^.val+q^.back^.val+1);
                                                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
                          write('Fornire la prima lista: ');
                          LeggiEScriviLista(p,m);
                          writeln;
                          write('Fornire la seconda lista: ');
                          LeggiEScriviLista(q,n);
                          writeln;
                          writeln('La lista somma e'':');
                          CalcoloSommaDiDueListe(s,p,q,k);
                     end;
         99 :
         readln;
    
    end.
    Ringraziando sin d'ora chiunque di voi saprà fornirmi la versione corretta del programma ( ricorsiva o no ), saluto tutti gli amici del forum. Ciao!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [PASCAL] Calcolo somma di numeri interi rappresentati mediante liste

    Salve a tutti!!!Torno sul problema già trattato del calcolo, mediante un programma redatto in linguaggio Pascal, della somma di due interi rappresentati mediante liste di record e puntatori, proponendo due versioni corrette rispetto alle precedenti fornite( una non ricorsiva e l'altra ricorsiva ) del problema, ove s, p e q costituiscono la lista somma e le due liste da sommare di cui la prima di lunghezza m e la seconda n, con m>=n:

    a) Versione non ricorsiva:

    codice:
    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 : punt;
        m,n,k : integer;
    
    procedure LeggiEScriviLista( var p : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   read(p^.val);
                   write(p^.val,' ');
                   LeggiEScriviLista(p^.back,k-1);
              end;
    end;{ Fine procedura LeggiEScriviLista }
    procedure CalcoloSommaDiDueListe( var s : punt; p,q : punt);
    var i : integer;
    begin
         new(s);
         begin
              s^.val:=p^.val+q^.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^.back^.val:=p^.back^.val+q^.back^.val+1;
                                                s^.val:=(s^.val)-10;
                                                write(s^.val,' ');
                                           end
              end;
              p:=p^.back;
              q:=q^.back;
              s:=s^.back;
              for i:=2 to m
                       do begin
                               case(p^.val+q^.val)of
                               0,1,2,3,4,5,6,7,8,9 : begin
                                                          if s^.back^.next^.val=p^.val+q^.val+1
                                                          then begin
                                                                    s^.val:=(p^.val+q^.val+1);
                                                                    write(s^.val,' ')
                                                               end
                                                          else begin
                                                                    s^.val:=(p^.val+q^.val);
                                                                    write(s^.val,' ')
                                                               end;
                                                     end;
                               10,11,12,13,14,15,16,17,18 : begin
                                                                 if s^.back^.next^.val=p^.val+q^.val+1
                                                                 then begin
                                                                           s^.val:=(p^.val+q^.val+1)-10;
                                                                           write(s^.val,' ');
                                                                      end
                                                                 else begin
                                                                           s^.val:=(p^.val+q^.val)-10;
                                                                           write(s^.val,' ')
                                                                      end;
                                                            end
                               end;
                               p:=p^.back;
                               q:=q^.back;
                               s:=s^.back;
                          end;
         if i=m then begin
                          case(p^.val+q^.val)of
                          0,1,2,3,4,5,6,7,8,9 : s^.back:=nil;
                          10,11,12,13,14,15,16,17,18 : begin(s^.back^.val):=1;
                                                             write(s^.back^.val,' ');
                                                       end
                          end;
                          s^.back^.back:=nil;
                     end;
         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
                          write('Fornire la prima lista: ');
                          LeggiEScriviLista(p,m);
                          writeln;
                          write('Fornire la seconda lista: ');
                          LeggiEScriviLista(q,n);
                          writeln;
                          writeln('La lista somma e'':');
                          CalcoloSommaDiDueListe(p,q,s);
                     end;
         99 :
         readln;
    
    end.
    b) Versione ricorsiva:

    codice:
    program SommaDiDueListe(input,output);
    label 99;
    const bell=07;
    type punt=^elem;
         elem= record
                     val: integer;
                     back : punt;
               end;
    var p,q,s : punt;
        m,n,k : integer;
    
    procedure LeggiEScriviLista( var p : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   read(p^.val);
                   write(p^.val,' ');
                   LeggiEScriviLista(p^.back,k-1);
              end;
    end;{ Fine procedura LeggiEScriviLista }
    procedure CalcoloSommaDiDueListe( var s : punt; p,q : punt; k : integer);
    begin
         if k=0
         then s^.back:=nil
         else begin
                   new(s);
                   s^.val:=p^.val+q^.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,' ');
                                                      s^.back^.val:=(p^.back^.val+q^.back^.val+1);
                                                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
                          write('Fornire la prima lista: ');
                          LeggiEScriviLista(p,m);
                          writeln;
                          write('Fornire la seconda lista: ');
                          LeggiEScriviLista(q,n);
                          writeln;
                          writeln('La lista somma e'':');
                          CalcoloSommaDiDueListe(s,p,q,m);
                     end;
         99 :
         readln;
    
    end.
    Sarei molto grato a chiunque di voi, amici del forum, sapesse indicarmi se possono essere considerate soluzioni corrette poichè Dev-Pascal mi da errori a tempo di esecuzione ( MI CHIUDE LA FINESTRA AL MOMENTO DEL CALCOLO DELLA SOMMA) e, quindi , in caso non lo fossero, fornirmi le correzioni giuste . Grazie e ciao a tutti!!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52
    Questo messaggio è rivolto, con cortesia, alle giuste osservazioni del moderatore. Riporto l'intero programma nella speranza che chi lo prenda in esame lo "testi", verificandone così gli eventuali errori di scrittura nel codice e così da potermi essere d'aiuto...credo che sia proprio questo lo scopo del forum...altrimenti perchè poi invitate a riportare l'eventuale soluzione a beneficio di tutti gli altri utenti? Non ho assolutamente intenzione di dimostrare alcunchè...sto solo condividendo informazioni...

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da serfabio
    Questo messaggio è rivolto, con cortesia, alle giuste osservazioni del moderatore.
    Per i chiarimenti si possono usare i messaggi privati.

    Originariamente inviato da serfabio
    Riporto l'intero programma nella speranza che chi lo prenda in esame lo "testi", verificandone così gli eventuali errori di scrittura nel codice e così da potermi essere d'aiuto...credo che sia proprio questo lo scopo del forum...
    Come ti è già stato detto, lo scopo del forum non è quello di prendere un programma intero, testarlo al posto tuo, individuare gli errori e dirti quali sono.

    Il dovere di testare quello che hai scritto, di individuare gli errori e di segnalare quali sono è TUO.

    Detto questo, una volta individuati gli errori, ne devi riportare i dettagli nella discussione, specificando SOLO la parte di codice interessata dall'errore, e gli utenti saranno ben felici di darti una mano.

    Originariamente inviato da serfabio
    altrimenti perchè poi invitate a riportare l'eventuale soluzione a beneficio di tutti gli altri utenti?
    Questo non c'entra nulla: il fatto che si debba riportare la soluzione del problema a beneficio di tutti non implica che il forum debba farsi carico di qualsiasi tipo di problema.

    La tipologia di discussioni ammesse è indicata sopra, e questa è già la terza volta che ti viene spiegato il concetto, per cui nel futuro attieniti alle indicazioni fornite, anche perché - come hai già visto e come ti ho già ribadito - la tipologia di discussioni che apri (per tutti questi motivi) non riscontra mai né interesse né un seguito, poiché deleghi ad altri oneri che sono tuoi.

    Spero di essere stato abbastanza chiaro questa volta con la spiegazione, così che la prossima occasione saprai come comportarti.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [PASCAL] Calcolo somma di numeri interi rappresentati mediante liste

    Forse la procedura CalcoloSommaDiDueListe, nella versione ricorsiva, va modificata come segue per notificare correttamente i riporti :

    codice:
    procedure CalcoloSommaDiDueListe( var s : punt; p,q : punt; k : integer);
    begin
         if k=0
         then s^.back:=nil
         else begin
                   new(s);
                   s^.val:=p^.val+q^.val;
                   case (p^.next^.val+q^.next^.val)of
                   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;
                                                      write(s^.val,' ');
                                                end
                   end;
                   CalcoloSommaDiDueListe(s^.back,p^.back,q^.back,k-1);
              end;
    end;{ Fine procedura CalcoloSommaDiDueListe }
    Tuttavia la somma non viene ancora calcolata....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.