Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    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 e, in caso contrario, fornirmi quella giusta . Grazie e ciao a tutti!!!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,310

    Moderazione

    Hai già aperto questa discussione con un titolo del tutto identico, quindi perché aprirne un'altra ancora con lo stesso titolo e sullo stesso problema?

    Ti è già stato detto qui il modo corretto in cui condurre le discussioni, senza fare un monologo: posti codice troppo lungo, o problemi troppo generali e "aperti" per poterti aiutare, visto che non si conosce qual è il problema specifico o spesso questo problema nemmeno c'è, poiché il codice che riporti (particolarmente lungo) andrebbe letto, esaminato e approfondito tutto per poter suggerire una miglioria, cosa che gli utenti non hanno ovviamente il tempo di fare, e non ha senso nemmeno richiederlo.

    In conclusione, preciso ancora una volta che la discussione si apre quando c'è un problema specifico o un ostacolo che - a seguito di vari tentativi - non si riesce a superare, e in quel caso semplicemente si riporta la parte di codice rilevante da esaminare per poter suggerire una modifica o una correzione al codice.

    Aprire una discussione, o anche più di una, mettendo un programma completo e chiedere genericamente di "migliorarlo" non è tollerato (tant'è che le tue discussioni vengono puntualmente ignorate, proprio per questi motivi).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

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 © 2024 vBulletin Solutions, Inc. All rights reserved.