annuncio

Comprimi
Ancora nessun annuncio.

Piccolo (?) problema con C

Comprimi
X
 
  • Filtro
  • Ora
  • Visualizza
Elimina tutto
nuovi messaggi

  • 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?

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


    Clan Spammer Severi ma giusti.

    Commenta


    • #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


      • #4
        Originariamente inviato da innet Visualizza il messaggio
        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 Visualizza il messaggio
        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, 10:52.
        [Amdir]Firma Irregolare[/Amdir]

        Commenta


        • #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


          • #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


            • #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


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

                L'hai provato?

                Secondo me funziona

                Amdir

                Commenta


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

                  Commenta


                  • #10
                    Originariamente inviato da Amdir Visualizza il messaggio
                    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; 17-11-2010, 01:15.

                    Commenta


                    • #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


                      • #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


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

                          Commenta


                          • #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


                            • #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...
                              X