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.