Newsgroup: it.comp.lang.c
Titolo: illuminazione

Chiedo scusa se faccio ricorso alla vostra illuminazione:
Scrivere una funzione che, presi in ingresso un vettore di interi e la sua 
dimensione, restituisce 1 se gli elementi pari sono in numero uguale a 
quelli dispari e 0 viceversa:
int foo (int v[ ]; int n){
int i, dispari ,count= 0{
for(i= 0; i<n;  i++)  {
if (v[i]=dispari) count ++
}if ( count = =n-1/2);
return 1;
else return 0;
}
} 


Per verificare se un certo numero X e' pari o dispari
ci sono due modi semplici
1) calcoli il resto (operatore %) della divisione per 2.
Se il resto e' 0 il numero X e' pari se il resto  e'  1  X e' dispari
quindi
qualcosa tipo
if ((X % 2)==1) { ...il numero X e' dispari ...}
else { .... il numero X e' pari...}
2) verifichi se il bit meno significativo del numero X
e' uguale a 1, nel qual caso il numero e' dispari.
Il bit meno significativo si puo' calcolare facendo
l'operazione AND bit-a-bit con il numero 1, quindi X & 1.
Ovvero:
if ((X & 1)==1) { ... il numero X e' dispari ...}
else {... il numero X e' pari ...}
Ripassati un po' la sintassi...
non puoi scrivere delle robe come quelle che hai scritto
sopra.
ciao,
g.

 quelli dispari e 0 viceversa:
Trovi la soluzione all'indirizzo
http://www.teachingonline.it/articoli.php?IdArticolo=9
Studiatelo per bene, l'esercizio.
Fra

 Studiatelo per bene, l'esercizio. 
Si, copiando la soluzione e':
<QUOTE>
int pari_dispari(int v[], int n)
{
    int i,count=0;
    for(i=0; i<n; i++) {
        if (v[i]%2==0) count++;
    }
    if (count==(n-count))
        return(1);
    else return(0);
}
</QUOTE>
volendo fare un codice piu' compatto e meno leggibile:
int pari_dispari(int v[], int n)
{
    int i, count = 0;
    for(i=0; i<n; ++i)
        count += v[i]&1;
    return count==(n-count);
}
Ma, perdite di tempo a parte, ci sarebbe una interessante
ottimizzazione.
Supponiamo di aver un array di 7,000,001 elementi. Perche' mai dover
ciclare oltre 7 milioni di elementi per scoprire che il numero di numeri
pari e dispari non e' uguale.
Se noi abbiamo un numero pari di elementi la funzione puo' ritornare 1 o
0, esempio:
6,6
o
6,7
Ma se il numero di elementi e' dispari invece tanto vale ritornare
subito 0, passando da complessita' O(n) a O(1) :
int pari_dispari(int v[], int n)
{
    int i, count = 0;
    if(n&1) return 0;
    for(i=0; i<n; ++i)
        count += v[i]&1;
    return count==(n-count);
}
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 }
Ci sarebbe un'altra cosa da considerare...
count conta i numeri dispari.
n indica il numero totale di numeri nell'array.
i indica il numero di elementi che abbiamo iterato.
da qui possiamo quindi procedere dicendo che:
se count > n/2 allora possiamo subito ritornare 0.
e
se (count + (n-i)) < n/2 allora possimo subito ritornare 0.
I due esempi sono:
n = 40
i = ? (ad esempio 23)
count = 21
21 > 40/2 quindi ovviamente non importa procedere si puo' ritornare 0.
In questo caso risparmiamo 40-23 iterazioni.
n = 40      // numeri nel vettore
i = 31      // numeri ciclati
count = 10  // numeri dispari
(10 + (40-31)) < 40/2
(10 + 9) < 20
19 < 20
In altre parole se abbiamo iterato 31 numeri e count e' arrivato a 10,
rimanendo solo 9 numeri da iterare (40-31) allora count potra' al piu
arrivare a 19, ma non potra' mai arrivare a 20.
Quindi possiamo subito ritornare 0.
Ovviamente questi due test richiedono qualche ciclo di clock e quindi
rallentano l'esecuzione di ogni singola iterazione. In alcuni casi pero'
potrebbero far risparmiare parecchio.
Test accurati su set realistici di numeri che la funzione dovra'
calcolare potrebbero suggerire se inglobare questi test o meno.


TI ringrazio del suggerimento, del quale ho subito approfittato per alcune
modifiche allla pagina:
http://www.teachingonline.it/articoli.php?IdArticolo=9
Frank

 ha scritto nel messaggio 
news:pan.2005.07.28....@dario.it...


 comunque grazie a tutti ,ciò che per me è oscuro vedo che non lo è per 
Beh, io ho imparato a programmare in Fortran nel 1976, a scuola. Ho
iniziato a programmare usando le schede perforate, e quindi ne ho fatta di
strada e di programmi. All'inizio anche a me la programmazione era un'arte
esoterica, ma poi, l'esercizio, il lavoro, l'hanno resa un poco meno
ostica.
Frank
-- 
      Teaching OnLine 
Corsi online di programmazione
Php, Asp, C, C++, Visual Basic, Delphi
Linux Shell Programming
------------------------------------
http://www.teachingonline.it

 oscuro vedo che non lo č per voi...
Rileggendo il tuo posto originale non vedo nessuna domanda e non so come
risponderti...
Se hai domande da fare falle pure. Il codice non e' per nulla oscuro, e'
piuttosto semplice. Dicci pure cosa non capisci.


 ha scritto nel messaggio 
news:4b2d5bd153a98d73671...@mygate.mailgate.org...
