Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [FORTRAN] Esercizio sulle matrici e su uno scalare da confrontare.

    codice:
            PROGRAM RICERCA
            
    C        Ricerca di una dato valore in un array monodimensionale
    C        di interi, con indicazione della posizione in cui questo si
    C        trova (se il valore è presente più volte indicare il numero
    C        delle volte e le rispettive posizioni)
    
           INTEGER MAX, RIGHE, COLONNE
           PARAMETER (MAX=10)
           REAL MATRICE (MAX, MAX), NUM
           
           CALL DICHIARA_DIMENSIONI (RIGHE, COLONNE, MATRICE)
           
           IF ((RIGHE .LE. MAX) .AND. (COLONNE .LE. MAX)) THEN
            CALL VISUALIZZA_MATRICE (RIGHE, COLONNE, MATRICE)
           ENDIF
    
           
           CALL SCRIVI_NUMERO (NUM)
           CALL RIC_NUM (NUM, RIGHE, COLONNE, MATRICE)
           
           STOP
           END
           
           SUBROUTINE DICHIARA_DIMENSIONI (RIGHE, COLONNE)
           INTEGER RIGHE, COLONNE
           PRINT*, "DICHIARA LE DIMENSIONI DELLA MATRICE:"
           READ*, RIGHE
           READ*, COLONNE
           RETURN
           END
           
           SUBROUTINE VISUALIZZA_MATRICE(RIGHE, COLONNE, MATRICE)
           INTEGER MAX, I, J, RIGHE, COLONNE
           PARAMETER (MAX=10)
           REAL MATRICE (MAX, MAX)
    
           PRINT*, "INSERISCI GLI ELEMENTI DELLA MATRICE PER COLONNE:"
           
           DO 10, I=1, COLONNE
            DO 20, J=1, RIGHE
              READ*, MATRICE (I, J)
    20        CONTINUE
    10        CONTINUE
           RETURN
           END
           
            SUBROUTINE SCRIVI_NUMERO (NUMERO)
            REAL NUMERO
            PRINT*, "SCRIVI NUMERO:"
            READ*,   NUMERO
            RETURN
            END
    
            SUBROUTINE RIC_NUM (NUMERO, RIGHE, COLONNE, MATRICE)
            INTEGER NUMERO, MAX, I, J, RIGHE, COLONNE, CONTATORE, K, L
            PARAMETER (MAX=10)
            REAL MATRICE (MAX, MAX)
    
            CONTATORE=0
                    
            DO 10, I=1, COLONNE
             DO 20, J=1, RIGHE
    
             IF (NUMERO .EQ. MATRICE(I, J)) THEN
                CONTATORE=CONTATORE+1
               ENDIF
    20       CONTINUE
    10       CONTINUE
    
               IF (CONTATORE .EQ.0) THEN
                 PRINT*, "IL NUMERO CHE Š STATO SCRITTO NON COMPARE NELLA"
                 PRINT*, "MATRICE"
    
               
               ELSE IF (CONTATORE .GT. 0) THEN
    
                      DO 30, K=1, COLONNE
                       DO 40, L=1, RIGHE
                        IF (NUMERO .EQ. MATRICE(K, L)) THEN
                         PRINT*, "IL NUMERO COMPARE", CONTATORE, "VOLTE"
                         PRINT*, "IL NUMERO COMPARE ALLA POSIZIONE", K, L
                        ENDIF
    40                CONTINUE
    30                CONTINUE
    
                ENDIF
                
             RETURN
             END
    Questo è un altro programma, che questa volta sono riuscito a scrivere, anche se mi dà un errore logico che non riesco a correggere.

    La spiegazione della funzione che questo programma deve avere è spiegata nelle prime righe, quelle con la c alla destra (la C in FORTRAN sostituisce il simbolo "//" di altri linguaggi, mi viene in mente C). Ho cercato di seguire il regolamento usando il tag [CODE], tuttavia non sono sicuro di averlo fatto bene. Inoltre, ho complicato un po' l'esercizio, prendendo invece dell'indicato array monodimensionale, un array bi-dimensionale.

    La sintassi del FORTRAN forse è comprensibile anche per chi non conosce propriamente questo linguaggio. Il "Do" seguito a distanza, quando finisce il ciclo, dal numero (che non indica assolutamente niente di logico, è solo un' etichetta) a sua volta seguito da CONTINUE, indica quello che in C si chiama ciclo FOR

    La condizione IF è simile, se non ricordo male, a quella presente in C.

    Dal punto di vista logico, io forse ho usato un ciclo in più del necessario, anche se non credo (me lo confermerete, voi, ovviamente, se ne avrete voglia) che sia per questo che il programma non funziona.

    L'errore che mi dà è sostanzialmente questo:
    ogni volta che effettuo un confronto tra il numero e gli elementi della matrice, mi esce sempre la scritta "il numero non compare nella matrice", anche nei casi in cui non me l'aspetterei.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    19
    ebbene si', hai trovato uno della old-economy, ASM, BASIC, FORTRAN, PL/1, PASCAL, E BEN 14 ANNI DI COBOL ...

    se non hai ancora risolto il problema ti faccio notare che la variabile NUMERO definita in RIC_NUM e' INTEGER mentre nel main l'hai definita correttamente REAL.

    io il motran l'ho usato mooolti anni fa, comunque prova a fare la modifica e vedi se funziona.
    se non ricordo male in fortran le variabili vengono sempre passate per indirizzo, non per valore. questo spiegherebbe perche' non ti funziona.

    ciao !!!

    ps: ma perche' lavori in fortran nel 2009 ?

  3. #3
    Ho un' esame all'università da fare...
    Da libero appassionato mi ero avvicinato a C l'anno scorso...

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.