+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Calcolo della norma - Fortran 90

  1. #1
    Nemesi non  in linea Novello
    Post
    38
    Like Inviati  
    0
    Like Ricevuti  
    0
    L'esercizio il seguente :
    Scrivere una funzione Fortran che, dato un vettore, restituisca al programma principale la
    norma.

    Lo so l'esercizio per molti pu risultare molto banale ma io sono alle prime armi con fortran 90 e di errori ne faccio tanti. Ho provato a risolverlo ma non parte il programma

    integer,parameter :: n = 3
    
    
    real function vet (n)
    implicit none
    integer :: num
    real :: array (n),norma
    
    do num = 0,n
    read (*,*) array(n)
    
    norma+ = ( (array(n))^2 )^(1/2)
    
    end do
    
    end function norma
    
    
    
    
    program main
      implicit none
    
    integer :: num
    
    do num = 0,n
        vet(n)
    
    end do
    
    write (*,*) norma
    
    end program main
    
    Sarebbe fantastico se qualcuno( con tanta pazienza ) mi elencasse tutti gli errori che ho commesso su questo codice spiegandomi come risolverli e in pi se ha qualche consiglio su come perfezionare il codice dal punto di vista stilistico la cosa non mi dispiacerebbe ^^

  2. #2
    L'avatar di AntonioG
    AntonioG non  in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,502
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    35
    Per cominciare sarebbe utile sapere quale messaggio d'errore hai al momento della compilazione/esecuzione.
    ℹ️ Leggi di pi su AntonioG ...

  3. #3
    Nemesi non  in linea Novello
    Post
    38
    Like Inviati  
    0
    Like Ricevuti  
    0
    Questi sono gli errori:

    ||Error: Syntax error in data declaration |
    ||Error: IMPLICIT NONE statement at (1) cannot follow data declaration statement |
    ||Error: Unclassifiable statement |
    ||Error: Expecting END PROGRAM statement |
    ||Error: Unexpected IMPLICIT NONE statement |
    ||Error: Symbol 'num' already has basic type of INTEGER|
    ||Error: Unexpected PROGRAM statement |

    guarda avevo fatto un piccolo errore di sitrazione nel nominare vet la funzione e poi farlo finire con end norma, ma mi da lo stesso un altro errore di end "||Error: Expecting END PROGRAM statement |"

  4. #4
    L'avatar di willy55
    willy55 non  in linea Scribacchino
    Post
    730
    Like Inviati  
    0
    Like Ricevuti  
    0
    Bisogna sempre leggere la descrizione fornita, per cui in base agli errori presentati viene indicato appunto la motivazione:
    Quote Originariamente inviato da Nemesi
    ||Error: IMPLICIT NONE statement at (1) cannot follow data declaration statement |
    ovvero la IMPLICIT NONE non pu seguire una dichiarativa dei dati:
    ℹ️ Leggi di pi su willy55 ...

  5. #5
    Nemesi non  in linea Novello
    Post
    38
    Like Inviati  
    0
    Like Ricevuti  
    0
    hummmmmm guarda ho rivisto il codice e ora mi da solo due errori uguali non specificando la riga
    ||Error: Unclassifiable statement |

    come lo risolvo questo? questo il codice

    
    real function vet (n)
    
    implicit none
    integer :: num
    integer:: n
    real :: array (n),norma
    
    do num = 0,n
    read (*,*) array(n)
    
    norma+ = ( (array(n))^2 )^(1/2)
    
    end do
    
    write (*,*) norma
    end function vet
    
    
    program main
      implicit none
    
    integer :: num
    integer:: n = 3
    
    do num = 0,n
        vet(n)
    
    end do
    
    
    
    end
    

  6. #6
    L'avatar di AntonioG
    AntonioG non  in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,502
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    35
    Ma quale compilatore usi esattamente ?
    ℹ️ Leggi di pi su AntonioG ...

  7. #7
    Nemesi non  in linea Novello
    Post
    38
    Like Inviati  
    0
    Like Ricevuti  
    0
    GNU fortran compiler

  8. #8
    L'avatar di willy55
    willy55 non  in linea Scribacchino
    Post
    730
    Like Inviati  
    0
    Like Ricevuti  
    0
    Credo che tu stia affrontando la problematica con un approccio C-like. Ma evidenzio che mischiare espressioni in linguaggio Fortran e C poco praticabile.
    Da considerare che, in Fortran, di norma, la elevazione a potenza viene espressa con due asterischi contigui (**) e non con il simbolo del circonflesso (^) applicabile, viceversa, appunto, al linguaggio C.
    Arithmetic Operations and Functions

    Esistono poi ulteriori elementi che differiscono, pertanto ho modificato il tuo codice per evidenziarti la sintassi:

    subroutine vet(n)
    implicit none
    integer :: num
    integer:: n
    real :: array (n)
    real :: norma
    
    do num = 0,n
     read (*,*) array(n)
     norma = norma + ( (array(n))**2 )**(1/2)
    end do
    write (*,*) norma
    end 
    
    program main
    implicit none
    
    integer :: num
    integer:: n = 3
    
    do num = 0,n
      call  vet(n)
    end do
    
    end program
    


    Da tenere presente che parlando del calcolo della norma euclidea di un vettore (in Fortran 77) si pu vedere il seguente link:
    Algoritmi e Programmi Fortran 77
    il cui codice potrebbe essere adattato in qualcosa del genere:

    ! C====================================================================
    
    !  Tratto da
    !  http://www.math.unipd.it/~michela/algof77.html
    ! C====================================================================
    
    ! C====================================================================
    
    ! C Function per il calcolo della norma euclidea di un vettore
    
    ! C====================================================================
          
    REAL*8 FUNCTION norm2 (x, n)
     
    ! ===========================
    
    ! x   vettore di dimensione n
    
    ! n   dimensione di x
    
    ! ===========================
          
    IMPLICIT NONE
    
    ! C====================
    
    ! C Parte dichiarativa
    ! C====================
       
    INTEGER n
          
    INTEGER i
          
    REAL*8 x(1:*)
    
    ! C====================
    
    ! C Parte esecutiva
    ! C====================
          
    norm2 = 0.0d0
          
    do i = 1, n
            
      norm2 = norm2 + x(i)**2
          
    end do
          
    norm2 = dsqrt(norm2)
    
    return
    
    end
    
    ℹ️ Leggi di pi su willy55 ...

  9. #9
    L'avatar di AntonioG
    AntonioG non  in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,502
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    35
    Quote Originariamente inviato da willy55 Visualizza il messaggio
    al linguaggio C.
    No, il C non lo permette. Pi che altro usato dal BASIC e vari dialetti.
    ℹ️ Leggi di pi su AntonioG ...

  10. #10
    L'avatar di willy55
    willy55 non  in linea Scribacchino
    Post
    730
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grazie della precisazione (quale errata corrige) infatti l'elevamento a potenza in linguaggio C realizzata con la funzione pow, mentre
    il simbolo '^' applicabile al linguaggio Basic (e sue varianti) e pertanto da intendersi in questo ultimo ambiente.
    ℹ️ Leggi di pi su willy55 ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Campo di calcolo automatico del giorno della settimana
    Da markolino1987 nel forum Microsoft Access
    Risposte: 2
    Ultimo Post: 05-08-2013, 09:12
  2. Errore nel calcolo della media
    Da john15689 nel forum Microsoft Excel
    Risposte: 4
    Ultimo Post: 22-11-2012, 21:20
  3. Risolto: Calcolo della radice quadrata [D7]
    Da camaleonteplus nel forum Delphi
    Risposte: 8
    Ultimo Post: 24-11-2011, 22:48
  4. Calcolo (efficiente !) della distanza fra 2 punti in 2D/3D
    Da xardas nel forum Altri linguaggi e strumenti
    Risposte: 8
    Ultimo Post: 19-08-2009, 21:07
  5. Differenza dei tempi e calcolo della media
    Da Gossip nel forum Visual Basic .Net
    Risposte: 5
    Ultimo Post: 12-04-2007, 07:05