Problema con esercizio sul linguaggio C

di il
8 risposte

Problema con esercizio sul linguaggio C

Salve, dopo domani ho un esame, e oggi stavo finendo di esercitarmi su alcune prove d'esame che il mio professore ha fornito agli studenti, e mi sono imbattuto ne seguente codice scritto dal mio professore. Praticamente il programma dovrebbe, prendere da tastiera la dimensione massima dei vettori, allocare dinamicamente i due vettori, riempire uno dei due , tramite la funzione "lettura_dati", con valori maggiori ad una data soglia, restituire il vettore a cui sono stati appena assegnati i valori, fare la stessa cosa con il secondo vettore e, con la funzione "intersezione" copiare, in un terzo vettore i numeri pari che compaiono nei primi due vettori.
N.B: non posso cambiare le funzioni del programma, la struttura del condice, insieme ad alcune funzioni, mi viene già data pronta, devo solo inserire i vari valori in alcune funzioni.

#include <stdio.h>
#include <stdlib.h>

int lettura_dati(int *v, int n, int soglia) { 
	for (int i = 0; i < n; ++i) {
		scanf("%d", &v[i]);
		if (v[i] < 0)
			return i;
		if (v[i] > soglia)
			--i;
	}
	return n;
}

int *intersezione(const int *v1, const int *v2, int n_1, int n_2, int *n_uscita) {
	int * v_uscita = NULL;
	*n_uscita = 0;
	for (int i = 0; i < n_1; ++i) {
		if (v1[i] % 2 == 1)
			continue;
		for (int j = 0; j < n_2; ++j)
			if (v1[i] == v2[j])
				++(*n_uscita);
	}
	v_uscita = calloc(*n_uscita, sizeof(int));
	// v_uscita = (int *)malloc((*n_uscita) * sizeof(int));
	for (int i = 0, k = 0, *n_uscita = 0; i < n_1; ++i) {
		if (v1[i] % 2 == 1)
			continue;
		for (int j = 0; j < n_2; ++j)
			if (v1[i] == v2[j]) {
				v_uscita[k] = v1[i];
				++k;
			}
	}
	return v_uscita;
}

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

int main(void) {
	int *v1;
	int *v2;
	int *v_risultato;
	int dim1, dim2;
	int dim_risultato;
	int soglia;

	printf("Inserisci le dimensioni dei due vettori di ingresso: ");
	scanf("%d%d", &dim1, &dim2);

	v1 = calloc(dim1, sizeof(int));
	v2 = calloc(dim2, sizeof(int));

	printf("Inserisci la soglia: ");
	scanf("%d", &soglia);
	printf("Inserisci il primo vettore: \n");
	dim1 = lettura_dati(v1, dim1, soglia);
	printf("Inserisci il secondo vettore: \n");
	dim2 = lettura_dati(v2, dim2, soglia);

	v_risultato = intersezione(v1, v2, dim1, dim2, &dim_risultato);

	stampa(v_risultato, dim_risultato);

	free(v1);
	free(v2);
	free(v_risultato);
}

Ora, ho provato a scrivere un programma che facesse questo, ma trovo un problema con questa funzione


int lettura_dati(int *v, int n, int soglia) { 
	for (int i = 0; i < n; ++i) {
		scanf("%d", &v[i]);
		if (v[i] < 0)
			return i;
		if (v[i] > soglia)
			--i;
	}
	return n;
perchè non ne trovo il senso: crea il vettore ma inserisce sempre un solo valore nell'unico spazio di memeria del vettore, appunto.
vorrei capire se sono io idiota o se effettivamente la funzione scritta così ha un senso.
P.s il codice sopra non è mio, è del mio professore, ho provato a compilare il suo per vedere dove sbagliavo, il rpoblema è che il suo programma compila, ma restituisce risultati senza senso e crea esclusivamente 2 vettori di dimensione 1. Grazie per eventuali risposte e scusate per la lunghezza del messaggio.

8 Risposte

  • Re: Problema con esercizio sul linguaggio C

    La funzione legge i dati nei vari elementi del vettore. Perché dici che non funziona?
  • Re: Problema con esercizio sul linguaggio C

    oregon ha scritto:


    La funzione legge i dati nei vari elementi del vettore. Perché dici che non funziona?
    perchè non deve solo leggerli: deve leggere il valore che viene inserito da tastiera ed inserirlo nel vettore. il vettore in questione, con i vari elementi al suo interno, dovrà essere passato ad un altra funzione che dovrà restituire un terzo vettore che contiene i valori pari che sono contenuti in entrambi i vettori. il problema è che dopo la lettura dei dati usa la terza funzione ma passa solo due vettori di un solo elemento ciascuno.
  • Re: Problema con esercizio sul linguaggio C

    Continuo a non capire. Fa tutto nel main... qual è il problema? Spiegati
  • Re: Problema con esercizio sul linguaggio C

    oregon ha scritto:


    Continuo a non capire. Fa tutto nel main... qual è il problema? Spiegati
    mi spiego meglio, se copi quel codice, e lo compili passo passo, per esempio, dando per esempio dimensione 10 ai due vettori che alloca nel main, quando passerà i vettori alle varie funzioni per inserire i valori, quello che otterrà non sono due vettori con 10 elementi, otterrà 2 vettori che contengono solo l'ultimo elemento inserito, e se non è lo stesso elemento per entrambi i valori e non è pari l'ultima funzione ritornerà un vettore che contiene solo un valore randomico
  • Re: Problema con esercizio sul linguaggio C

    Ho compilato ed eseguito e funziona.

    Ad esempio ho inserito
    3 3
    soglia
    100
    primo vettore
    1
    2
    5
    secondo vettore
    2
    4
    6
    e il risultato corretto è stato un vettore di un solo elemento pari a 2
  • Re: Problema con esercizio sul linguaggio C

    oregon ha scritto:


    Ho compilato ed eseguito e funziona.

    Ad esempio ho inserito
    3 3
    soglia
    100
    primo vettore
    1
    2
    5
    secondo vettore
    2
    4
    6
    e il risultato corretto è stato un vettore di un solo elemento pari a 2
    boh, lo avevo compilato e a me dava valori totalmente diversi, riproverò a vedere domani allora, grazie mille
  • Re: Problema con esercizio sul linguaggio C

    oregon ha scritto:


    Ho compilato ed eseguito e funziona.

    Ad esempio ho inserito
    3 3
    soglia
    100
    primo vettore
    1
    2
    5
    secondo vettore
    2
    4
    6
    e il risultato corretto è stato un vettore di un solo elemento pari a 2
    Nulla, sono stupido io: solitamente quando uso vettori sono abituato a vedere tutti i vari elementi in tutte le posizioni del vettore tramite le variabili locali nel debug, mentre in questo caso, vedevo solo il primo elemento del vettore e non tutto il resto(se puoi spiegarmi come mai te ne sarei grato, uso visual studio) e quindi non vedevo l'array che si riempiva, e probabilmente non ho prestato attenzione ai valori che inserivo e questo è il motivo per cui mi ritornava valori strani. comunque grazie mille.
  • Re: Problema con esercizio sul linguaggio C

    Visual Studio nel caso di un puntatore ti mostra il primo elemento. Solo per un vettore dichiarato staticamente mostra tutti i valori. Apri una finestra di memoria e controlla direttamente tutti i valori a partire dal puntatore. Oppure semplicemente aggiungi delle orintf di controllo dove ti servono.
Devi accedere o registrarti per scrivere nel forum
8 risposte