Aiuto esercizio semplice in C

Collapse
X
 
  • Filter
  • Ora
  • Show
Clear All
new posts
  • john89
    Inattivo
    • Jan 2008
    • 434
    • 133
    • 61
    • Send PM

    Aiuto esercizio semplice in C

    Mi aiutate a risolvere questo esercizio in C?

    Una matrice N x N è simmetrica se A[i][j]=A[j][i] per tutti gli i e j. Scrivere una funzione booleana che riceve come parametro una matrice NxN, e restituisce come risultato il valore vero se la matrice è simmetrica, falso altrimenti.

    Vi scrivo la parte che ho fatto, solo che non so esattamente come far risultare una risposta falsa o vera, so dichiarare enum etc ma poi dentro la funzione non so come usarlo. (da testo non posso usare dichiarazioni globali, invece variabili globali sì)

    (siccome i,j = j,i la diagonale di cui non mi devo curare perchè il valore di quelle caselle sarà uguale a se stessa, è la diagonale che va dall'alto a sx fino a in basso a dx). Uso le graffe anche dove non necessario per evidenziare i vari passaggi.

    void verifica(int mat[N][N])
    {int i,j,trovato=0,x=1;
    for(i=N-1;i<0 && trovato!=1;i++)
    {for(j=0;j<N-x && trovato!=1;j++)
    {if(mat[i][j]!=mat[j][i])
    {trovato=1;}} x++;}
    if(trovato!=1) /*dire che è false*/
    else /*dire che è false*/
    }



    Grazie mille.
  • XVII
    Bodyweb Advanced
    • Nov 2007
    • 595
    • 48
    • 75
    • Send PM

    #2
    Non ho controllato il codice perché è illeggibile così, cerca di indentarlo meglio Il tipo di variabile boolean in c non esiste, quindi te lo devi implementare te, e ci sono millemila modi per farlo, ti faccio due esempi:

    #define TRUE 1
    #define FALSE 0

    in questo modo definisci, servendoti del preprocessore, le costanti simboliche false e true come semplici int. Starà poi a te eseguire correttamente i controlli if( return == FALSE) ecc.

    Un altro metodo potrebbe essere quello di utilizzare il tipo enumerativo,

    typedef enum{false,true} boolean;

    In questo modo fai più o meno la stessa cosa, però utilizzando la typedef...sta a te scegliere il metodo che preferisci di più...se qualcosa non è chiaro chiedi pure

    Edit: ho controllato velocemente il codice.
    La funzione falla non VOID ma INT, e utilizzi return TRUE; o return FALSE; all'interno dei due if, così risolvi
    what?

    Commenta

    • john89
      Inattivo
      • Jan 2008
      • 434
      • 133
      • 61
      • Send PM

      #3
      Originariamente Scritto da XVII Visualizza Messaggio
      Non ho controllato il codice perché è illeggibile così, cerca di indentarlo meglio Il tipo di variabile boolean in c non esiste, quindi te lo devi implementare te, e ci sono millemila modi per farlo, ti faccio due esempi:

      #define TRUE 1
      #define FALSE 0

      in questo modo definisci, servendoti del preprocessore, le costanti simboliche false e true come semplici int. Starà poi a te eseguire correttamente i controlli if( return == FALSE) ecc.

      Un altro metodo potrebbe essere quello di utilizzare il tipo enumerativo,

      typedef enum{false,true} boolean;

      In questo modo fai più o meno la stessa cosa, però utilizzando la typedef...sta a te scegliere il metodo che preferisci di più...se qualcosa non è chiaro chiedi pure

      Edit: ho controllato velocemente il codice.
      La funzione falla non VOID ma INT, e utilizzi return TRUE; o return FALSE; all'interno dei due if, così risolvi
      Grazie mille. Il problema è che penso la prof volesse che utilizzassimo una funzione proprio di tipo boolean
      boolean verifica(...){etc.

      Io dichiarerei dentro alla funzione una variabile di tipo boolean e poi la metterei=true in un caso e =false nell'altro. esatto?
      in questo caso cosa faccio? Potresti sistemarmi un attimo il codice così capisco bene come fare? Grazie ancora

      Commenta

      • XVII
        Bodyweb Advanced
        • Nov 2007
        • 595
        • 48
        • 75
        • Send PM

        #4
        Originariamente Scritto da john89 Visualizza Messaggio
        Grazie mille. Il problema è che penso la prof volesse che utilizzassimo una funzione proprio di tipo boolean
        boolean verifica(...){etc.

        Io dichiarerei dentro alla funzione una variabile di tipo boolean e poi la metterei=true in un caso e =false nell'altro. esatto?
        in questo caso cosa faccio? Potresti sistemarmi un attimo il codice così capisco bene come fare? Grazie ancora
        Allora, una funzione boolean la trovo un po strana, sicuro fosse quello che voleva la prof? In ogni caso la facciamo comunque.

        se definiamo il tipo boolean con il typedef avremo:

        boolean isSimmetrica(int trovato)
        {
        if(trovato == 1)
        return false;
        else
        return true;
        }

        altrimenti se la dichiari con il define

        int isSimmetrica(int trovato)
        {
        if(trovato == 1)
        return FALSE;
        else
        return TRUE;
        }

        e così hai la tua funzione, che richiamerai con:

        void verifica(int mat[N][N])
        {int i,j,trovato=0,x=1;
        for(i=N-1;i<0 && trovato!=1;i++)
        {for(j=0;j<N-x && trovato!=1;j++)
        {if(mat[i][j]!=mat[j][i])
        {trovato=1;}} x++;}
        if(isSimmetrica(trovato) == TRUE)
        { printf("La matrice e' simmetrica!\n");}
        else
        {printf("La matrice NON e' simmetrica\n");}
        }
        what?

        Commenta

        • john89
          Inattivo
          • Jan 2008
          • 434
          • 133
          • 61
          • Send PM

          #5
          Originariamente Scritto da XVII Visualizza Messaggio
          Allora, una funzione boolean la trovo un po strana, sicuro fosse quello che voleva la prof? In ogni caso la facciamo comunque.

          se definiamo il tipo boolean con il typedef avremo:

          boolean isSimmetrica(int trovato)
          {
          if(trovato == 1)
          return false;
          else
          return true;
          }

          altrimenti se la dichiari con il define

          int isSimmetrica(int trovato)
          {
          if(trovato == 1)
          return FALSE;
          else
          return TRUE;
          }

          e così hai la tua funzione, che richiamerai con:

          void verifica(int mat[N][N])
          {int i,j,trovato=0,x=1;
          for(i=N-1;i<0 && trovato!=1;i++)
          {for(j=0;j<N-x && trovato!=1;j++)
          {if(mat[i][j]!=mat[j][i])
          {trovato=1;}} x++;}
          if(isSimmetrica(trovato) == TRUE)
          { printf("La matrice e' simmetrica!\n");}
          else
          {printf("La matrice NON e' simmetrica\n");}
          }
          Perfetto. grazie ancora

          Commenta

          • XVII
            Bodyweb Advanced
            • Nov 2007
            • 595
            • 48
            • 75
            • Send PM

            #6
            Originariamente Scritto da john89 Visualizza Messaggio
            Perfetto. grazie ancora
            figurati se c'è altro chiedi pure
            what?

            Commenta

            • john89
              Inattivo
              • Jan 2008
              • 434
              • 133
              • 61
              • Send PM

              #7
              Se hai tempo mi dai un'ultima occhiata a questo programma? Ho seguito i tuoi consigli e ho provato a farlo come chiedeva la prof: con un'unica funzione di tipo booleano, senza funzioni ausiliarie. Grazie.

              #include<stdio.h>
              #define N 100
              typedef enum {true, false}boolean;
              boolean verifica(int mat[N][N]);

              int main()
              {int A[N][N]; /* sottointendo l'inizializzazione della matrice*/

              boolean risposta;
              risposta=verifica(A);
              if(risposta==true)
              printf("la matrice è simmetrica\n");
              else printf("la matrice non è simmetrica\n");
              system ("pause");}

              boolean verifica(int mat[N][N])
              {int i,j,trovato=0,x=1;
              boolean risultato;
              for(i=N-1;i<0 && trovato!=1;i++)
              {for(j=0;j<N-x && trovato!=1;j++)
              {if(mat[i][j]!=mat[j][i])
              {trovato=1;}} x++;}
              if(trovato==1)
              risultato=false;
              else risultato=true;
              return risultato;
              }

              Commenta

              • laplace
                Bodyweb Advanced
                • Dec 2005
                • 7984
                • 962
                • 1,370
                • Send PM

                #8
                un consiglio:

                if(risposta==true)

                NON è elegante esempio di programmazione (e nemmeno efficiente)

                si dovrebbe scrivere

                if ( risposta )

                Commenta

                • john89
                  Inattivo
                  • Jan 2008
                  • 434
                  • 133
                  • 61
                  • Send PM

                  #9
                  Originariamente Scritto da laplace Visualizza Messaggio
                  un consiglio:

                  if(risposta==true)

                  NON è elegante esempio di programmazione (e nemmeno efficiente)

                  si dovrebbe scrivere

                  if ( risposta )
                  si può? perchè io ho descritto boolean come true e false e basta, come se avessi scritto blu e verde. se scrivo solo if(risposta) il pc come fa a capire che mi sto riferendo al true?

                  Scusa l'ingnoranza.

                  Commenta

                  • gbpackers
                    #1 Fan GreenBay Packers
                    • Jun 2006
                    • 5542
                    • 302
                    • 227
                    • Send PM

                    #10
                    Originariamente Scritto da john89 Visualizza Messaggio
                    si può? perchè io ho descritto boolean come true e false e basta, come se avessi scritto blu e verde. se scrivo solo if(risposta) il pc come fa a capire che mi sto riferendo al true?

                    Scusa l'ingnoranza.
                    if (espressione)

                    if è una struttura di controllo grazie ai valori "true" e "false", all'interno lui verifica che l'"espressione" ritorni un tipo boolean quindi anche mettendo una variabile boolean lui verifica l'espressione quindi non hai la necessità di mettere l'uguaglianza.
                    Spero sia chiaro
                    sigpic

                    Commenta

                    • john89
                      Inattivo
                      • Jan 2008
                      • 434
                      • 133
                      • 61
                      • Send PM

                      #11
                      Originariamente Scritto da gbpackers Visualizza Messaggio
                      if (espressione)

                      if è una struttura di controllo grazie ai valori "true" e "false", all'interno lui verifica che l'"espressione" ritorni un tipo boolean quindi anche mettendo una variabile boolean lui verifica l'espressione quindi non hai la necessità di mettere l'uguaglianza.
                      Spero sia chiaro
                      l'unica cosa che non ho capito è: se io creo un tipo {blu,giallo}colori
                      e poi metto if(risposta), io sto dicendo if(risposta==blu) solo perchè blu è il primo della lista? Questo non mi è chiaro, come fa il calcolatore a capire che se non metto l'uguaglianza mi sto riferendo al primo elemento (true o blu)

                      Commenta

                      • gbpackers
                        #1 Fan GreenBay Packers
                        • Jun 2006
                        • 5542
                        • 302
                        • 227
                        • Send PM

                        #12
                        Originariamente Scritto da john89 Visualizza Messaggio
                        l'unica cosa che non ho capito è: se io creo un tipo {blu,giallo}colori
                        e poi metto if(risposta), io sto dicendo if(risposta==blu) solo perchè blu è il primo della lista? Questo non mi è chiaro, come fa il calcolatore a capire che se non metto l'uguaglianza mi sto riferendo al primo elemento (true o blu)
                        risposta deve essere boolean, in questo caso può non essere un boolean perchè risposta==blu quindi confronti risposta con blu
                        sigpic

                        Commenta

                        • john89
                          Inattivo
                          • Jan 2008
                          • 434
                          • 133
                          • 61
                          • Send PM

                          #13
                          Originariamente Scritto da gbpackers Visualizza Messaggio
                          risposta deve essere boolean, in questo caso può non essere un boolean perchè risposta==blu quindi confronti risposta con blu
                          Non riesco a capire come l'if possa "verificare l'espressione" in base a cosa la verifica? Io prima l'ho fatta diventare true o false a seconda di com'era la matrice. Poi gli dico if(risposta) e lui cosa va a verificare? che la risposta sia uguale al primo elemento? che la risposta sia di tipo boolean?

                          Commenta

                          • gbpackers
                            #1 Fan GreenBay Packers
                            • Jun 2006
                            • 5542
                            • 302
                            • 227
                            • Send PM

                            #14
                            mhmhmh if(espressione)

                            lui verifica che espressione sia un boolean
                            quindi dire espressione ==> 1 == 1
                            espressione ==> true
                            oppure
                            boolean test = true
                            espressione ==> test

                            è identico
                            sigpic

                            Commenta

                            • gbpackers
                              #1 Fan GreenBay Packers
                              • Jun 2006
                              • 5542
                              • 302
                              • 227
                              • Send PM

                              #15
                              potresti fare così
                              Codice:
                              boolean risposta;
                              risposta=verifica(A);
                              if(risposta==true)
                              è uguale a

                              Codice:
                              if(verifica(A))
                              sigpic

                              Commenta

                              Working...
                              X