|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
[C] Aiuto per favore
Ciao a tutti.
E per la seconda volta non sono riuscito a passare l'esame perché non ho superato l'esercizio di sbarramento. Allora l'esercizio è il seguente: Si scriva una funzione C che, dato un vettore di interi di dimensione nota ed un parametro k, verifichi se il vettore contiene esattamente k elementi uguali. Io ho fatto così (da quello che mi ricordo): int verificaElementi(int a[], int n, int k){ int cnt=0; for(int i=0; i<n; ++i){ if(a[i]==a[i+1]) cnt++; } if (cnt==k) return 1; else return 0; } Mi pare fatto bene. Non capisco dove posso aver sbagliato. Cioè scandisco il vettore, controllo che siano uguali l'elemento corrente con il successivo, se lo sono aumento il contatore... Se questo contatore alla fine è uguale a k, significa che vi sono k elementi uguali (come richiede il testo) e ritorno 1, altrimenti ritorno 0. Dove ho sbagliato???? Grazie. |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
mmm non mi pare sia corretto....poi non sò eprchè non l'hai scritto indentato e non si capisce bene
cmq che devi fare? devi fverificare se per ogni elemento ci stanno dei doppioni e se il numero di doppioni è proprio uguale a k quindi devi fare 2 cicli annidati cioè per ogni elemento ti scorri tutti gli elementi del vettore e vedi se sono uguali..se ne trova uno uguale incrementa la variabili contatore...poi controlli se il contenuto della variabile contatore == k se è uguale a k torna 1 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ma scusa facendo quello che ho fatto io che cambia? Io confronto il precedente con il successivo (quindi ho probabilità di trovare k elementi uguali).
|
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
aspe provo a farlo ad occhio sul forum...non prendelo come oro colato..su questo pc non ho il compilatore installato...
Codice:
int verificaElementi(int a[], int n, int k){
int i, j;
int num = 0:
for(i=0;i<n;i++){ // Per ogni elemento i del vettore
for(j=0;j<n;j++){ // scorri il vettore alla ricerca di un elementouguale
/* Se l'elemento indicizzato da i nel vettore è == all'elemento
indicizzato da j nel vettore */
if(a[j]==a[j])
num++; // Incrementa il valore di num
}
if(num == k) // Se num corrisponde al valore di k
return 1; // ritorna al chiamante il valore 1
}
return 0; // Se non è stato restituito 1 e la funzione terminata anticipatamente allora vuol dire che non ci sono doppioni in numero pari a k e torna 0
}
Ciao Andrea |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
è sbalgiatissimo concettualmente te li confronti a coppie di 2 a 2 e poi passi alla coppia successiva...non può proprio andare così.-..ti consiglio di farti il diagramma a blocchi e di scriverti passo per passo quello che fà così ti accordi dei risultati che ti escono ;-)
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Anche secondo me l'interpretazione non e' giusta.
Esempio: se il vettore contiene gli elementi {1,2,4,2,6,5,3,2,6,3,6}, l'esito in base al valore di k dovrebbe essere: k=1 -> Si (o true, o quello che vuoi che ritorni la funzione in caso di successo) perche' c'e' un 1 (ma anche un 4, un 5...) k=2 -> Si, perche' ci sono due 3 k=3 -> Si, perche' ci sono tre 2 (ma anche tre 6) k=4 -> No, perche' non c'e' nessun elemento ripetuto quattro volte Almeno questa e' la mia interpretazione del testo: Quote:
Gica
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 614
|
Quote:
Devi stare anche attento a non confrontare il valore con se stesso, quindi saltare il giro nel secondo ciclo quando j e i sono uguali. Risolte queste due cose, c'e' cmq un problema di logica... non ottieni il risultato corretto... per prima cosa incrementi anche se trovi due coppie di valori diverse... 2 e 2 e 3 e 3... in piu', supponendo di avere un valore ripetuto che so 4 volte, tu, in tutte e 4 le volte lo conteggi 3 volte (ah tra l'altro cosi' non torna cmq perche' conteggi il valore sempre una volta in meno del dovuto). Insomma e' proprio da impostare in maniera diversa una possibile soluzione e' ordinare prima il vettore e poi confrontare i valori a coppie, in parte come aveva fatto Manugal, anche se nel suo ciclo il vettore andava fuori dimensione (l'ultimo confronto era fatto con a[i] con a[i+1], ma fatto sull'ultimo elemento del vettore non va bene) controllando ogni volta che il numero cambia se si e' conteggiato n numeri uguali a k. Non so se mi sono spiegato, ma dopo 10 ore di lavoro sono un po' fuso e non riesco a esser piu' preciso
__________________
AMD x2 3800+@2600 - Asus CrossHair - Corsair XMS PC 5400 2x1 GB - GeForce 8800 gts 320 MB@630/990 - Ali Corsair hx520 - HD WD Caviar SE16 250 GB - Case Enermax Big Chakra Ultima modifica di Madmind : 14-06-2005 alle 19:59. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 614
|
dopo l'ordinamento (ne puoi implementare uno qualunque... ce ne sono parecchi di algoritmi) potevi scrivere una cosa del genere:
Codice:
boolean verificaElementi(int a[], int n, int k)
{
boolean trovato = false;
int cnt=1;
for(int i=0; i<n-1 && !trovato ; i++)
{
if(a[i]==a[i+1])
cnt++;
else if (cnt == k) trovato = true;
else cnt = 1;
}
if (n == 1 && k == 1) trovato = true;
return trovato;
}
Nel caso ci sia solo un elemento nel vettore e k sia uno, allora il ciclo viene skippato, ma bisogna ritornare true (l'ho gestita male lo so, ma l'ho fatto velocemente). non ho verificato nulla e ho scritto il codice in questo istante... non garantisco nulla quindi :P
__________________
AMD x2 3800+@2600 - Asus CrossHair - Corsair XMS PC 5400 2x1 GB - GeForce 8800 gts 320 MB@630/990 - Ali Corsair hx520 - HD WD Caviar SE16 250 GB - Case Enermax Big Chakra |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 614
|
ah pardon sono un fesso, non considerare il boolean e usa degli int (abituato a java)
Codice:
#define TRUE 1
#define FALSE 0
int verificaElementi(int a[], int n, int k)
{
int trovato = FALSE;
int cnt=1;
for(int i=0; i<n-1 && trovato != TRUE ; i++)
{
if(a[i]==a[i+1])
cnt++;
else if (cnt == k) trovato = TRUE;
else cnt = 1;
}
if (n == 1 && k == 1) trovato = TRUE;
return trovato;
}
__________________
AMD x2 3800+@2600 - Asus CrossHair - Corsair XMS PC 5400 2x1 GB - GeForce 8800 gts 320 MB@630/990 - Ali Corsair hx520 - HD WD Caviar SE16 250 GB - Case Enermax Big Chakra Ultima modifica di Madmind : 14-06-2005 alle 20:40. |
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
Quote:
|
|
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
Quote:
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
io Sono per il metodo di D4rkAng3l ma con qualche semplice e rapida modifica
L'altro metodo non può andare..... Comunque ecco a voi: Codice:
int verificaElementi(int a[], int n, int k)
{
int i, j;
int num = 0:
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(a[j]==a[i])num++;
if(num==k)return 1;
}
num=0;
}
return 0;
}
Ciao mitici |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Quote:
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals Ultima modifica di anx721 : 15-06-2005 alle 16:22. |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
per l'if fuori ti do ragione perchè altrimenti andiamo a finire su almeno e non su un numero preciso, per il fatto che riguarda la partenza da i è cosi perchè i valori precedenti sono gia stati controllati.
Ciao. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 1218
|
prima ordini il vettore!!!!!!!!!! poi ci aggiungi il primo esercizio ke hai postato pero inizializzando cnt a 1 e nn a zero..........
vedrai ke è giusto.... facendo a[i]==a[i+1] se nn è ordinato nn è detto ke a[i] != a[i+2]capito? ps: 5--4--4--5--6 confronta il primo col secondo il terzo col quarto....ma nn il quarto col primo!!!! se lo ordini.... 4--4--5--5--6 cosi poi è apposto....... capito? |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
no scusa hai ragione tu anche sul secondo punto, però si può migliorare lo stesso la cosa
|
|
|
|
|
| Tutti gli articoli | Tutte le news | Tutti i download |
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:35.



















