Piccolo (?) problema con C

Comprimi
X
 
  • Ora
  • Visualizza
Elimina tutto
nuovi messaggi
  • innet
    Friend Member
    • Sep 2006
    • 2358

    #1

    Piccolo (?) problema con C

    #include <stdio.h>

    void grandi(int a[], int b, int *menomeno, int *piupiu);

    #define n 10

    /************************
    * FUNZIONE MAIN *
    ************************/

    int main()
    {
    int i, v[n], piu, meno;

    printf ("Inserisci %d numeri naturali: ",n);
    for ( i = 0 ; i < n ; i++ )
    {scanf("%d", &v[i]);}

    grandi (v, n, &meno, &piu);

    printf ("Il valore più grande è: %d \n",piu);
    printf ("Il secondo valore più grande è: %d\n",meno);

    return (0);
    }

    /************************************************
    * FUNZIONE PER CALCOLARE I DUE NUMERI MAGGIORI *
    ************************************************/


    void grandi (int a[], int b, int *menomeno, int *piupiu)
    {
    int i;

    *piupiu = *menomeno = a[0];

    for ( i = 1 ; i < b ; i++ )
    {
    if ( a[i] > *piupiu )
    *piupiu = a[i];
    }

    for ( i = 0 ; i < b ; i++ )
    {
    if (a[i] < *piupiu && a[i] > *menomeno || a[i] != *piupiu)
    *menomeno = a[i];
    }
    }

    Due semplici funzioni per stampare i due numeri più grandi di una serie di 10 numeri...
    L'errore è presente nel for..
    Il prototipo della funzione deve starci.
    Riuscite a trovarmi la soluzione?
  • KoroshiyaIchi
    Friend Member
    • Nov 2009
    • 11244

    #2
    La soluzione è dentro di te, e però è sbagliata.


    Clan Spammer Severi ma giusti.

    Commenta

    • Amdir
      BANNED
      • Dec 2005
      • 13375

      #3
      codice:
      void grandi (int a[], int b, int *m, int *p)
      {
        int i;
      
        *p = *m = a[0];
      
        for ( i = 1 ; i < b ; ++i )
        {
          if ( a[i] > *p )
          {
            *m = *p;
            *p = a[i];
          }
          else if ( a[i] > *m )
          {
            *m = a[i];
          }
        }
      }
      Dovrebbe essere cosi' ma non l'ho provato, l'ho scritto direttamente sul forum

      Amdir

      Commenta

      • thedeerhunter
        Fragrant Darkness
        • Jul 2008
        • 8646

        #4
        Originariamente inviato da innet
        for ( i = 0 ; i < b ; i++ )
        {
        if (a[i] < *piupiu && a[i] > *menomeno || a[i] != *piupiu)
        *menomeno = a[i];
        }
        }
        A che serve la condizione logica or quando hai già scritto a[i]<*piupiu, inoltre il for dovrebbe partire da 1 non da 0, la prima locazione del vettore è già puntata da menomeno, il primo ciclo è a vuoto.

        Originariamente inviato da Amdir
        codice:
        void grandi (int a[], int b, int *m, int *p)
        {
          int i;
        
          *p = *m = a[0];
        
          for ( i = 1 ; i < b ; ++i )
          {
            if ( a[i] > *p )
            {
              *m = *p;
              *p = a[i];
            }
            else if ( a[i] > *m )
            {
              *m = a[i];
            }
          }
        }
        Dovrebbe essere cosi' ma non l'ho provato, l'ho scritto direttamente sul forum
        Amdir
        con questo calcoli solo il numero più grande, manca il secondo.
        Ultima modifica di thedeerhunter; 16-11-2010, 08:52.
        [Amdir]Firma Irregolare[/Amdir]

        Commenta

        • ascotfmh
          Friend Member
          • Dec 2001
          • 12163

          #5
          amduz basta mettere && al posto di ||

          edito: intendevo dire che il for basta mettere
          for ( i = 0 ; i < b ; i++ )
          {
          if (a[i] < *piupiu && a[i] > *menomeno && a[i] != *piupiu)
          *menomeno = a[i];
          }
          }
          "Ci sono alcuni misteri che la mente umana non penetrerà mai. Per convincercene non dobbiamo far altro che gettare un'occhiata alle tavole di numeri primi. Ci accorgeremo che non vi regna né ordine né legge."

          Eulero.

          Commenta

          • thedeerhunter
            Fragrant Darkness
            • Jul 2008
            • 8646

            #6
            ma quella condizione finale è gia verificata da a[i]<*piupiu, anche se hai un vettore con numeri ridondanti, tipo [1,2,4,4] non viene verificata la prima condizione del primo AND sul terzo elemento.
            [Amdir]Firma Irregolare[/Amdir]

            Commenta

            • ascotfmh
              Friend Member
              • Dec 2001
              • 12163

              #7
              si hai ragione, a livello logico non cambia niente, se è vera una lo è anche l'altra
              "Ci sono alcuni misteri che la mente umana non penetrerà mai. Per convincercene non dobbiamo far altro che gettare un'occhiata alle tavole di numeri primi. Ci accorgeremo che non vi regna né ordine né legge."

              Eulero.

              Commenta

              • Amdir
                BANNED
                • Dec 2005
                • 13375

                #8
                Originariamente inviato da thedeerhunter
                con questo calcoli solo il numero più grande, manca il secondo.
                Ma hai letto il codice?

                L'hai provato?

                Secondo me funziona

                Amdir

                Commenta

                • thedeerhunter
                  Fragrant Darkness
                  • Jul 2008
                  • 8646

                  #9
                  Ho letto male l'else if
                  [Amdir]Firma Irregolare[/Amdir]

                  Commenta

                  • innet
                    Friend Member
                    • Sep 2006
                    • 2358

                    #10
                    Originariamente inviato da Amdir
                    codice:
                    void grandi (int a[], int b, int *m, int *p)
                    {
                      int i;
                    
                      *p = *m = a[0];
                    
                      for ( i = 1 ; i < b ; ++i )
                      {
                        if ( a[i] > *p )
                        {
                          *m = *p;
                          *p = a[i];
                        }
                        else if ( a[i] > *m )
                        {
                          *m = a[i];
                        }
                      }
                    }
                    Dovrebbe essere cosi' ma non l'ho provato, l'ho scritto direttamente sul forum

                    Amdir
                    no la cosa non funziona, su una serie di 10 1 2 3 4 5 6 7 8 9, essendo a[0] il numero maggiore, fa "fallire" tutte le if, lasciando quindi tutto come == a[0]
                    maggiore 10
                    secondo maggiore 10
                    Ultima modifica di innet; 16-11-2010, 23:15.

                    Commenta

                    • innet
                      Friend Member
                      • Sep 2006
                      • 2358

                      #11
                      Ho risolto la cosa in questa maniera:

                      /*******************************
                      * TROVA I DUE NUMERI MAGGIORI *
                      *******************************/

                      #include <stdio.h>

                      void grandi(int a[], int b, int *menomeno, int *piupiu);

                      #define n 10

                      /*****************
                      * FUNZIONE MAIN *
                      *****************/

                      int main()
                      {
                      int i, v[11], piu, meno;

                      v[0]=0;

                      printf ("Inserisci %d numeri naturali: ",n);
                      for ( i = 1 ; i < 11 ; i++ )
                      {scanf("%d", &v[i]);}

                      grandi (v, n, &meno, &piu);

                      printf ("Il valore più grande è: %d \n",piu);
                      printf ("Il secondo valore più grande è: %d\n",meno);

                      return (0);
                      }

                      /************************************************
                      * FUNZIONE PER CALCOLARE I DUE NUMERI MAGGIORI *
                      ************************************************/


                      void grandi (int a[], int b, int *menomeno, int *piupiu)
                      {
                      int i;

                      *piupiu = *menomeno = a[0];

                      for ( i = 1 ; i < b ; i++ )
                      {
                      if ( a[i] > *piupiu )
                      *piupiu = a[i];
                      }
                      cacca:
                      for ( i = 1 ; i <= b ; i++ )
                      {
                      if (a[i] < *piupiu && a[i] >= *menomeno)
                      *menomeno = a[i];
                      }
                      }

                      L'unico problema è che su una lista 1 1 1 1 1 1 1 1 1 1 mi da
                      maggiore 1
                      secondo maggiore 0

                      ps: forse ho trovato la soluzione ma per ora ho sonno e vado a dormire :V

                      Commenta

                      • thedeerhunter
                        Fragrant Darkness
                        • Jul 2008
                        • 8646

                        #12
                        void grandi (int a[], int b, int *m, int *p)
                        {
                        int i;

                        *p = *m = a[0];

                        for ( i = 1 ; i < b ; ++i )
                        {
                        if ( a[i] > *p )
                        {
                        *m = *p;
                        *p = a[i];
                        }
                        else if ( a[i] > *m || *m=*p )
                        {
                        *m = a[i];
                        }
                        }
                        }

                        prova cosi, anche se non penso funzioni
                        [Amdir]Firma Irregolare[/Amdir]

                        Commenta

                        • thedeerhunter
                          Fragrant Darkness
                          • Jul 2008
                          • 8646

                          #13
                          Ho provato e mi sembra che funzioni su tutti i tipi di vettore.
                          [Amdir]Firma Irregolare[/Amdir]

                          Commenta

                          • innet
                            Friend Member
                            • Sep 2006
                            • 2358

                            #14
                            il ragionamento ci sta, però a me da:
                            maggiora.c: In function ‘grandi’:
                            maggiora.c:40: error: lvalue required as left operand of assignment

                            Commenta

                            • thedeerhunter
                              Fragrant Darkness
                              • Jul 2008
                              • 8646

                              #15
                              Assumendo che la riga 40 sia l'else if, non ricordo bene come si gestiscono i valori dei puntatori, nel senso che forse la scrittura della condizione *p=*m è sbagliata
                              [Amdir]Firma Irregolare[/Amdir]

                              Commenta

                              Sto operando...