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

    Aiuto nella soluzione di un esercizio di programmazione in Pascal

    Salve a tutti amici del Forum!!!Spero stavolta di essere chiaro e di usare le procedure corrette....Vorrei sapere se qualcuno di voi è in grado di dirmi perchè il programma VerificaMatrice sotto riportato con il testo redatto in Pascal, non funziona. Il programma stesso che, dovrebbe verificare se una data matrice quadrata letta da ingresso è simmetrica, triangolare superiore o inferiore e diagonale, risulta sintatticamente corretto; infatti il compilatore che uso (Dev-Pascal) dopo averlo appunto "compilato" non segnala errore, ma i problemi sorgono nella verifica degli errori a tempo di esecuzione. In particolare, mentre sembra funzionare la procedura MatSimmetrica che verifica se la matrice è simmetrica, le altre tre procedure MatriangInf, MatriagSup, MatDiagonale che dovrebbero controllare se la matrice è rispettivamente triangolare inferiore, superiore o diagonale non sempre danno risultati corretti. Ho dunque sbagliato anche la sintassi di queste tre procedure ? E se si, come vanno riscritte? Ricordo che una matrica Mat: array[1..n,1..n]of integer, quadrata, è simmetrica se risulta mat[i,j]=mat[j,i] per ogni i<>j, che è tringolare superiore o inferiore se ha tutti gli elementi nulli al di sotto o al di sopra dellla diagonale principale, e che è diagonale se vale mat[i,j]=0 per ogni i<>j. Ho provato a sviluppare quattro programmini indipendenti ciascuno con le funzioni delle singole procedure ottenendo gli stessi risultati, ovvero programmi che risultano sintatticamente corretti ma che non lo sono nella verifica degli errori a tempo di esecuzione. Riporto di seguito il testo del programma:

    codice:
    program VerificaMatrice(input,output);
    label 99;
    const n=10;
    type tipoar=array[1..n,1..n]of integer; 
    var a : tipoar;    
         k : integer;     
         finito : boolean;  
    procedure LeggieScriviMat(var mat : tipoar); 
    var rig,col : integer;
    begin     
          writeln('fornire gli elementi della matrice, ciascuno seguito da un <INVIO>:');   
          writeln;     
          for rig:=1 to k               
                       do for col:=1 to k                              
                                         do readln(mat[rig,col]);      
          writeln;     
          for rig:=1 to k                
                        do begin                        
                                   for col:=1 to k                             
                                                 do write(' ',mat[rig,col],' ':3);                        
                                    writeln;                   
                            end;
    end;(* fine procedura LeggieScriviMat *)
     procedure MatSimmetrica(var mat : tipoar); 
     var rig,col : integer; 
     begin     
           for rig:=1 to k              
                         do begin                        
                                  col:=1;                        
                                  finito:=true;                       
                                  while(col>=1)and(col<=k)and(finito)                        
                                  do begin                                
                                            if(rig<>col)and(mat[rig,col<>mat[col,rig])                                
                                            then finito:=false;                                 
                                            col:=col+1;                            
                                      end;                    
                             end; 
    end;(* fine procedura MatSimmetrica *)
     procedure MatriangSup(var mat : tipoar); 
     var rig,col : integer;
     begin     
            for col:=1 to k                
                          do begin                         
                                    rig:=col+1;                         
                                    finito:=true;                        
                                    while(rig>col)and(rig<=k-1)and(finito)                        
                                    do begin                                
                                                if mat[rig,col]<>0                                 
                                                then finito:=false;                                
                                                rig:=rig+1;                           
                                        end;                    
                              end; 
    end;(* fine procedura MatriangSup *)
    procedure MatriangInf(var mat : tipoar); 
    var rig,col : integer;
     begin      
           for rig:=1 to k                
                        do begin                        
                                   col:=rig+1;                        
                                   finito:=true;                        
                                   while(col>rig)and(col<=k-1)and(finito)                       
                                   do begin                                
                                              if mat[rig,col]<>0                                
                                              then finito:=false;                                
                                              col:=col+1;                           
                                       end;                    
                             end; 
    end;(* fine procedura MatriangInf *) 
    procedure MatDiagonale(var mat : tipoar);
     var rig,col : integer;
     begin     
             for rig:=1 to k               
                          do begin                        
                                    col:=1;                        
                                    finito:=true;                        
                                    while(col>=1)and(col<=k)and(finito)                         
                                    do begin
                                               if(rig<>col)and(mat[rig,col]<>0)                                 
                                               then finito:=false;                                 
                                               col:=col+1;                            
                                        end;                    
                             end; 
    end;(* fine procedura MatDiagonale *)
      
    begin(* programma principale *)   
      write('fornire la dimensione della matrice: '); 
      readln(k);  
      writeln;  
      if k>n then begin                  
                             writeln('dimensione troppo grande della matrice! - STOP -');   
                             goto 99;              
                     end        
              else begin                   
                           LeggieScriviMat(a);                  
                           writeln;                    
                           MatSimmetrica(a);                   
                           if not(finito)                    
                           then writeln('la matrice non e'' simmetrica')                  
                           else writeln('la matrice e'' simmetrica');                   
                           MatriangSup(a);                   
                           if not(finito)                   
                           then writeln('la matrice non e'' triangolare superiore')                   
                           else writeln('la matrice e'' triangolare superiore');                   
                           MatriangInf(a);                    
                           if not(finito)                   
                           then writeln('la matrice non e'' triangolare inferiore')                   
                           else writeln('la matrice e'' triangolare inferiore');                   
                           MatDiagonale(a);                   
                           if not(finito)                    
                           then writeln('la matrice non e'' diagonale')                   
                           else writeln('la matrice e'' diagonale');              
                      end;   
      99 :  
      readln;  
    
    end.
    Ringraziandovi sin da ora per l'attenzione che vorrete prestare al mio problema vi saluto tutti!!!
    Ciao!!!!

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

    Soluzione alternativa

    Ho provato una soluzione alternativa, che è la seguente:
    codice:
    program VerificaMatrice(input,output);
    label 99;
    const n=10;
    type tipoar=array[1..n,1..n]of integer;
    var a : tipoar;
        k : integer;
    
    procedure Leggimat( var mat : tipoar);
    var i,j :integer;
    begin
                       writeln('inserire gli elementi della matrice, ciascuno seguito da un <INVIO>:');
                       writeln;
                       for i:= 1 to k do
                            for j:= 1 to k do readln(mat[i,j]);
                       writeln;
                       for i:=1 to k do
                       begin
                            for j:= 1 to k do write(' ',mat[i,j]:5,' ');
                            writeln;
                       end;
    end;(*fine procedura leggimat*)
    function MatSimmetrica(mat : tipoar): boolean;
    var i, j: integer;
        simmetrica: boolean;
    begin
      simmetrica := true;
      i := 1;
      while(i<k) and simmetrica do
        begin
          { inutile scandire tutta la matrice: basta il triang. sup. }
          j := i + 1;
          while (j <= k) and simmetrica do
            begin
              simmetrica := mat[i, j] = mat[j, i];
              j := j + 1
            end;
          i := i + 1
        end;
      MatSimmetrica := simmetrica
    end;
    
    
    function MatriangSup(mat : tipoar): boolean;
    var i, j: integer;
        triangSup: boolean;
    begin
      triangSup := true;
      i := 2; { inutile guardare la prima riga }
      while (i <= k) and triangSup do
        begin
          { controlla che il triang. inf. sia nullo }
          j := 1;
          while (j < i) and triangSup do
            begin
              triangSup := mat[i, j] = 0;
              j := j + 1
            end;
          i := i + 1
        end;
      MatriangSup := triangSup
    end;
    
    
    function MatriangInf(mat : tipoar): boolean;
    var i, j: integer;
        triangInf: boolean;
    begin
      triangInf := true;
      i := 1;
      while (i < k) and triangInf do
        begin
          { controlla che il triang. sup. sia nullo }
          j := i + 1;
          while (j <= k) and triangInf do
            begin
              triangInf := mat[i, j] = 0;
              j := j + 1
            end;
          i := i + 1
        end;
      MatriangInf := triangInf
    end;
    
    
    function MatDiagonale(mat : tipoar): boolean;
    begin
      MatDiagonale := (MatriangInf(mat)) and (MatriangSup(mat))
    end;
    
    begin
    
      write('fornire la dimensione della matrice: ');
      readln(k);
      writeln;
      if k>n then begin
                       writeln('dimensione troppo grande della matrice! - STOP -');
                       goto 99;
                  end
             else begin
                       Leggimat(a);
                       if not MatSimmetrica(a)
                       then writeln('la matrice non e'' simmetrica')
                       else writeln('la matrice e'' simmetrica');
                       if not MatriangSup(a)
                       then writeln('la matrice non e'' triangolare superiore')
                       else writeln('la matrice e'' triangolare superiore');
                       if not MatriangInf(a)
                       then writeln('la matrice non e'' triangolare inferiore')
                       else writeln('la matrice e'' triangolare inferiore');
                       if not MatDiagonale(a)
                       then writeln('la matrice non e'' diagonale')
                       else writeln('la matrice e'' diagonale');
                  end;
      99 :
      readln;
    
    end.
    Ma...anche questa non funziona. Sono sempre MatriangSup, MatriangInf e di conseguenza MatDiagonale, a dare problemi nella verifica delgli errori a tempo di esecuzione. Ciao!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    si ma che errori a tempo di esecuzione? In questo modo dobbiamo prenderlo e spulciarlo da noi, se dai un'indicazione di massima sull'errore e sul punto in cui si verifica aiuti noi ad aiutarti.
    Un consiglio, concentrati su un punto particolare, non sull'insieme: rischi di non capire bene cosa fai. Prendi una funzione e analizzala, suppongo che l'errore sia simile in tutte le funzioni che prepari

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

    risposta a valia

    Per errori a tempo di esecuzione intendo che se tu provi a dare al programma come input la seguente matrice:

    1 4 4 4
    6 1 4 4
    6 6 1 4
    6 6 6 1

    Il programma medesimo invece che rispondere:

    La matrice non è simmetrica
    La matrice non è triangolare superiore
    La matrice non è triangolare inferiore
    La matrice è diagonale

    fornisce risultati errati...

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

    Soluzione!!!

    ...Scusate ma sbagliavo io, la seconda soluzione è quella giusta. Grazie!!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    errori a tempo di esecuzione possono essere di vario tipo, non sto qui ad elencarli.
    Quello non è un errore, o meglio è un errore legato alla semantica che dai tu al codice.
    Inoltre fornire un esempio come hai fatto è anche un modo per riprodurre in tempi rapidi l'errore e porvi rimedio, altrimenti chiunque qui si deve mettere a riprodurre il tuo errore (le varie casisistiche) per poterti aiutare

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.