Oppure

Loading
13/09/16 9:07
LukasD
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.

#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.
aaa
13/09/16 9:22
TheDarkJuster
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:

#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);
        }
 
 
}


E questo sistema tutto :rotfl::rotfl::rotfl:
aaa
13/09/16 9:31
LukasD
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.

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 13/09/16 9:46
aaa
13/09/16 9:42
TheDarkJuster
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:

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.
aaa
13/09/16 9:50
LukasD
Questo è l'errore: [Error] lvalue required as left operand of assignment
aaa
13/09/16 9:58
TheDarkJuster
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[i] == 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!
aaa
13/09/16 10:20
LukasD
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.

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. :/
aaa
13/09/16 10:40
TheDarkJuster
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 it.wikipedia.org/wiki/… 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à.

aaa