Comprensione codice c

di il
13 risposte

Comprensione codice c

Ciao a tutti Ho questo codice (dato dal prof) e devo capire un pò come funziona. Solo che ho trovato un problema. Il codice è questo:
    #include <stdio.h>
    #define NMax 100

    void p(int*,int*);
    void d(int*,int);
    void u(int*,int,int*,int,int*,int*);
    int q(int*,int);

    void main()
    {int vet1[NMax],vet2[NMax],res[2*NMax];
     int i,j,n1,n2,nr;
     p(vet1,&n1);
     p(vet2,&n2);
     if(q(vet1,n1)&&q(vet2,n2))
     {u(vet1,n1,vet2,n2,res,&nr);
      d(res,nr);
     }else printf("\nSituazione atipica");
    }
     
     void p(int*v,int*n)
    {int i;
     printf("\n");
     do
       {scanf("%d",n);
        printf("\n");
       }
     while(*n>NMax);
     for(i=0;i<*n;i++)
       scanf("%d",v+i);
     }

    void d(int*v, int n)
    {int i;
     printf("\n");
     for(i=0;i<n;i++)
      printf("%d ",v[i]);
     printf("\n");
    }

    void u(int a[], int na, int b[], int nb, int c[], int *n)
    {int i,j,k;
     i=j=k=0;
     while (i<na &&j<nb)
      if(k%2) c[k++]=a[i++];
      else c[k++]=b[j++];
    *n=k;
    }

    int q(int *v,int n)
    {int i;
     for(i=0;i<n-1;i++)
      if(v[i]%2)  return 0;
     return 1;
    }
Il problema che ho trovato è nella funzione q e in particolare quando la richiama nel main. Ipotizziamo che inserisco in input: 2 4 6 2 8 10, non capisco perchè in output mi da 8 4 10. Spiego meglio dove mi blocco: nella funzione q, if (v%2) return 0, quindi se i numeri sono tutti pari mi restituisce 0 (falso). Torniamo all'if del main, se sia q(vet1,n1) che q(vet2,n2) restituiscono 0, la condizione dell'if non dovrebbe essere falsa e quindi stampare Situazione atipica?? Aiutatemi, davvero non capisco. So che quasi sicuramente sbaglio in qualcosa nel mio ragionamento, vorrei capire cosa Grazie

13 Risposte

  • Re: Comprensione codice c

    if(v[i]%2)
    significa
    if(v[i]%2 != 0)
    in quanto l'if è valutato a true se l'espressione restituisce un valore diverso da zero. Quindi la funzione q restituisce 1 solo se tutti i numeri sono pari e restituisce 0 se almeno uno dei numeri è dispari.
    Quindi l'output è giusto.
  • Re: Comprensione codice c

    Ecco, quello che accade dopo questo passaggio vorrei capire.
    restituisce 0 se almeno uno dei numeri è pari
    Io so che restituisce 0 (dove 0 è un valore booleano che indica false), quindi nella parte di codice:
     if(q(vet1,n1)&&q(vet2,n2))
    avrò, schematizzando: 0&&0 . Questo non significa che l'intero if restituisce 0 e quindi devo considerare l'else? (In questo ragionamento cosa considero in modo errato?)
  • Re: Comprensione codice c

    if(q(vet1,n1)&&q(vet2,n2))
    prendi la parte
    q(vet1,n1)
    Questo restituisce 0 se almeno uno dei numeri è pari. L'if lo valuta e vedendolo non soddisfatto la condizione non va neanche a valutare la seconda parte dell'espressione in quanto l'algebra di boole ci insegna che 0 AND qualcosa da sempre 0 è quindi falso.
    Se la prima parte è valutata a 1 (quindi tutti i numeri pari) allora viene valutata la seconda espressione. Magari scritta così ti è più chiara
    if((q(vet1,n1) != 0) &&(q(vet2,n2) != 0)
    Spero di non avere creato più confusione

    Retifica della funzione q
    Restituisce 1 se tutti i numeri sono pari e restituisce 0 se almeno uno dei numeri è dispari. Ho scritto male all'inizio in quanto v % 2 != 0 significa se il numero è dispari. Scusa per la confusione.
  • Re: Comprensione codice c

    Se la prima parte è valutata a 1 (quindi tutti i numeri pari)
    Esattamente questo non capisco! La prima parte non è valutata a 0?? (considerando gli input di esempio che ho scritto)
  • Re: Comprensione codice c

    Retifica della funzione q
    Restituisce 1 se tutti i numeri sono pari e restituisce 0 se almeno uno dei numeri è dispari. Ho scritto male all'inizio in quanto v % 2 != 0 significa se il numero è dispari. Scusa per la confusione.
  • Re: Comprensione codice c

    Ricapitoliamo un momento
    if (v[i]%2) return 0;
    return 1;  
    leggendolo così capisco che se il numero che considero è pari mi restituisce 0, altrimenti continua finchè non esce dal ciclo for e restituisce 1. Fin qui come procedo?
  • Re: Comprensione codice c

    No ti sbagli. Leggi meglio
    if (v[i]%2) return 0;
    return 1;  
    significa
    if (v[i]%2 != 0) return 0;
    return 1;  
    e quindi se l'elemento i-esimo è dispari ritorna 0.
    Altrimenti finisce il ciclo e retituisce 1 non trovando nessun dispari quindi tutti gli elementi sono pari

    Se un numero è pari il suo modulo è uguale a zero quindi salterebbe la valutazione del if (quindi il return zero) e verra valutato l'elemento successivo.
  • Re: Comprensione codice c

    Quello che mi è sempre stato insegnato è che scrivere
    if(v[i]%2)
    è come scrivere
    if(v[i]%2 ==0)

    Ora tu mi dici che
    f(v[i]%2)
    equivale a
    if(v[i]%2 !=0)
    Mi capisci se ci vado di matto?
  • Re: Comprensione codice c

    If(esspressione)
    significa
    if(esspressione == true)

    Viene definito COME TRUE un valore DIVERSO DA ZERO quindi da -infinito a -1 e da 1 a +infinito. E' sempre stato così non l'ho inventato io.



    Anche se in inglese si può capire bennissimo sta frase
    If the value of expression is nonzero, statement1 is executed.
  • Re: Comprensione codice c

    Allora così magari te lo semplifico ancora
    
    if(1)
    {
    // true
    }
    else
    {
    //false
    }
    
    Prendiamo il true
    
    if(v[i] % 2)
    {
     return 0;
    }
    else
    {
      return 1;
    }
    
    si traduce in
    
    if(v[i] % 2 == 1)
    {
       return 0;
    }
    else
    {
     return 1;
    }
    
    e quindi
    v[i] % 2 == 1
    capita solo quando il numero è dispari e quindi entriamo in return 0 solo se il numero è dispari.
  • Re: Comprensione codice c

    Ok ho capito cosa intendi dire tu. Mi hai postato un link che parla del C++ io non l'ho mai studiato quindi non so se vale la stessa cosa per il C(quello che studio io xD). In ogni caso quando io scrivo
    v[i]%2
    in generale intendo dire che deve dividere quel numero per 2 e restuirmi il resto. Ora se io scrivo
    v[i]%2 ==0 
    intendo dire che il resto è 0(quindi il numero è pari). Capito perchè mi risulta tutto troppo anomalo? Scusami se ti rompo ma sono abbastanza testarda e inoltre ho appena riletto un esempio del prof che conferma quello che sostengo >.< (se ti va di aiutarmi te lo scrivo in modo da avere più chiaro te quello che ho in testa io e potermi aiutare meglio)
  • Re: Comprensione codice c

    Si ho capito cosa intendi (C e C++ per quanto riguarda if, while, for ecc sono uguali). Ti stai solo confondendo perche non riesci a comprendere questo
    if((v[i] % 2) == 0)
    significa
    valutare la parte sinistra con quella destra. A sinistra hai v % 2 e a destra hai 0
    Valutiamo la parte sinistra. Se il numero è pari questa ci darà zero. La parte destra è zero, quindi la valutazione sarà
    if(0 == 0)
    che significa
    if(1) perche 0 == 0 è vera.

    if(v % 2) significa
    if(v[i] % 2 == 1)
    l'uno è sottointeso per definizione in quanto il lunguaggio stesso ci dice che
    if(espressione) significa if(espressione == 1) ovvero if(espresione == true)
    Ecco dove ti confondi.
    Se vuoi fammi tutto il raggionamento e ti trovo l'errore.
  • Re: Comprensione codice c

    v[i] % 2
    e
    v[i] % 2 == 0 
    sono due cose diverse non uguali
    if(v[i] % 2)
    e
    if(v[i] % 2 == 0)
    sono due cose diverse non uguali
    Per le proprietà del post sopra si possono riscrivere in
    if((v[i] % 2) == 1)
    e
    if((v[i] % 2 == 0) == 1)
    e come vedi hai a che fare con due cose diverse, uno l'opposto dell'altro
Devi accedere o registrarti per scrivere nel forum
13 risposte