LukasD (Normal User)
Newbie
Messaggi: 13
Iscritto: 13/09/2016
|
Salve a tutti. Ho un dubbio riguardante una funzione che ho creato e che dovrebbe restituirmi un valore, ma evidentemente non ho capito come fare. Ora inserisco il codice in modo che sia tutto più chiaro.
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <stdlib.h> #define max 30 void leggi_v (int v1[], int *dim) { int i; printf ("Inserire gli elementi del vettore: \n\n"); for (i=0; i<*dim; i++) { printf ("Elemento %d: ", i+1); scanf ("%d", &v1[i]); } } void stampa_v (int v1[], int dim) { int i; printf ("Il vettore sara' composto dai seguenti elementi \n"); for (i=0; i<dim; i++) printf ("Elemento n.%d: %d\n", i+1, v1[i]); } int check_v (int v1[], int dim) { int i; int contatore = 0; for (i=0; i<dim; i++) { if ((v1[i]%2) == 1 || v1[i] == 0) { contatore++; } } return (contatore); // non ritorna il valore del contatore poichè con un printf nel main ho notato che il contatore me lo da =0. } typedef int vet1[max]; int main(){ vet1 v1; int dim; int i, contatore; printf ("Inserire il numero di elementi del vettore: "); scanf ("%d", &dim); leggi_v (v1, &dim); stampa_v (v1, dim); check_v (v1, dim); if (contatore == dim) { printf ("Apposto"); } if (contatore < dim) { printf ("Il vettore non contiene solo numeri dispari o pari a 0\n"); return (0); } }
|
In pratica questo programma legge un vettore inserito dall'utente. Se ha numeri dispari o uguali a 0 continua se ha almeno un numero pari si ferma. Solo che nella funzione di chack_v non mi ritorna il valore del contatore che poi utilizzerò nel main per far andare avanti o fermare il programma.
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Il valore di ritorno delle funzioni deve essere salvato in una variabile, non si salva per magia o perchè una variabile si chiama come la funzione:
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <stdlib.h> #define max 30 void leggi_v (int v1[], int *dim) { int i; printf ("Inserire gli elementi del vettore: \n\n"); for (i=0; i<*dim; i++) { printf ("Elemento %d: ", i+1); scanf ("%d", &v1[i]); } } void stampa_v (int v1[], int dim) { int i; printf ("Il vettore sara' composto dai seguenti elementi \n"); for (i=0; i<dim; i++) printf ("Elemento n.%d: %d\n", i+1, v1[i]); } int check_v (int v1[], int dim) { int i; int contatore = 0; for (i=0; i<dim; i++) { if ((v1[i]%2) == 1 || v1[i] == 0) { contatore++; } } return (contatore); // non ritorna il valore del contatore poichè con un printf nel main ho notato che il contatore me lo da =0. } typedef int vet1[max]; int main(){ vet1 v1; int dim; int i, contatore; printf ("Inserire il numero di elementi del vettore: "); scanf ("%d", &dim); leggi_v (v1, &dim); stampa_v (v1, dim); contatore = check_v (v1, dim); if (contatore == dim) { printf ("Apposto"); } if (contatore < dim) { printf ("Il vettore non contiene solo numeri dispari o pari a 0\n"); return (0); } }
|
|
|
LukasD (Normal User)
Newbie
Messaggi: 13
Iscritto: 13/09/2016
|
Aaah ok ho capito, la variabile viene salvato in contatore alla fine della funzione check.
Un altra domanda. Ho utilizzato l'algoritmo bubble sort per ordinare gli elementi del vettore poichè l'esercizio richiede di portare gli elementi dispari a sinistra e quelli uguali a 0 a destra.
Questo che ho fatto è un "prototipo" di funzione poichè è la prima funzione del tipo "bubble sort" che faccio e volevo vedere come e se funzionava.
Codice sorgente - presumibilmente C++ |
void ord_v (int v1[], int dim) { int i; int alto; for (alto=dim-1; alto>0; alto--) { for (i=0; i<alto; i++) { if (((v1[i]%2) == 1) > (v1[i] == 0)) { int tmp = ((v1[i]%2) == 1); ((v1[i]%2) == 1) = (v1[i] == 0); (v1[i] == 0) = tmp; } } } }
|
Cosa ho sbagliato?
Ultima modifica effettuata da LukasD il 13/09/2016 alle 11:46 |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Non so cosa hai (sintatticamente) sbagliato, credo il numero o la posizione delle parentesi, ma quell'algoritmo non è un bubble sort.
Un bubble sort e' qualcosa del genere:
Codice sorgente - presumibilmente C++ |
bool sostituzione = true; do { //questa potrebbe essere l'ultima esecuzione dell'algoritmo (se non avvengono scambi) sostituzione = false; for (int i = 0; i < dim - 1; i++) { if (((v[i] % 2) == 0) && (v[i+1] % 2)) { int temp = v[i] ; v[i] = v[i + 1]; v[i + 1] = temp; //ho scambiato, quindi probabilmente non ho finito l'algortmo sostituzione = true; } } } while (sostituzione);
|
Un consiglio che mi sento di darti è: un errore emesso dal compilatore non è una brutta cosa di cui devi solo prendere visione:
l'errore va letto e capito. Quando domandi su un forum lo devi riportare. Quando hai la soluzione devi capire come non ripeterlo più.
Per esempio un errore del tipo expected ';' o ')' significa che hai un errore di sintassi o nel numero delle parentesi.
|
|
LukasD (Normal User)
Newbie
Messaggi: 13
Iscritto: 13/09/2016
|
Questo è l'errore: [Error] lvalue required as left operand of assignment
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
In un contesto semplificato puoi vedere un L-valore come uno spazio in memoria, ad esempio una variabile, un elemento di un array o un puntatore deferenziato.
Si chiama L-valore perche sta a sinistra (left) dell'operazione di assegnamento.
Nel tuo codice fai:
(v1 == 0) = tmp;
Ma ciò non ha senso: come fai ad assegnare un R-valore a qualcosa che non è un L-valore.
Valutando l'espressione tra parentesi si ottiene un numero: 0 o 1.
Tu vorresti assegnare ad un numero, quindi ad un R-valore un R-valore (l'R-valore di tmp), ma ciò non è possibile.
Che senso avrebbe fare 0 = 5 ? nessuno! non puoi assegnare l'R-valore 5 all'R-valore 0, perchè 0 è 0 e 5 è 5!
|
|
LukasD (Normal User)
Newbie
Messaggi: 13
Iscritto: 13/09/2016
|
Oook ho capito... queste cose non mi erano state spiegate al corso....
Tornando all'esercizio, non riesco a capire come far funzionare questa funzione, scusa il gioco di parole, di scambio.
Devo semplicemente spostare a destra tutti gli elementi =0.
Codice sorgente - presumibilmente C++ |
void ord_v (int v1[], int dim) { int i; int j; int tmp; for (i=0; i=dim-1; i++) { for (j=0; j<dim-1-i; j++) { if (v1[j] > v1[j+1]) { tmp = v1[j]; v1[j] = v1[j+1]; v1[j+1] = tmp; } } } }
|
Ho provato a cambiare ancora una volta la funzione seguendo un altro esempio. Ma il programma viene compilato e prima dell'esecuzione di questa funzione si blocca. :/
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
erroraccio sul for: hai scritto i=dim-1 mentre tu volevi i<dim-1
Comunque a questo punto non posso più darti codice già pronto come ho fatto con il bubblesort perchè il regolamento non me lo consente.
La tua versione del bubble sort differisce dalla mia perchè esegue il for più interno un numero fisso di volte, ovvero dim-1, mentra la mia lo esegue il numero ottimale di volte.
Ti consiglio di leggere bene https://it.wikipedia.org/wiki/Bubble_sort prima di fare altre varianti. Anche perchè la variante che chiedi non è affatto difficile, anzi!
Però finchè non fai tuo l'algoritmo NON sarai in grado di adattarlo alle tue necessità.
|
|
LukasD (Normal User)
Newbie
Messaggi: 13
Iscritto: 13/09/2016
|
Sono riuscito a completare l'esercizio finalmente!!!
Insomma il programma non è che si fermava... Ho semplicemente dimenticato io di far stampare il vettore ordinato alla fine.... Chiedo perdono
Ora mi è tutto più chiaro!!! Grazie mille!
|
|