Vai al contenuto

Aiuto esercizio programmazione linguaggio c


Messaggi raccomandati

Ciao ragazzi, sto cercando di scrivere un esercizio in c per l'università ma ahimè mi trovo in serie difficoltà.

Il testo dell'esercizio è il seguente:

Si scriva una funzione in C, denominata cerca, che ricerchi la presenza di un elemento in un vettore di interi. La funzione riceve in ingresso tre parametri: 1. un vettore di interi vettore[] nel quale ricercare il valore; 2. un valore intero dimensione che indica quanti elementi contiene il vettore; 3. il valore intero elem che deve essere ricercato. La funzione deve restituire: 1. se il valore elem è presente nel vettore, allora la funzione restituisce l’indice della posizione nella quale si trova tale valore; 2. se il valore elem è presente più volte, si restituisca l’indice di tutte le occorrenze; 3. se il valore elem non è presente nel vettore, si restituisca -1. Si modifichi poi la funzione cerca definendo la funzione cerca_vettore_ordinato che faccia le stesse cose descritte in precedenza ma su un vettore ordinato

 

Ho provato a buttare giù uno straccio di codice ma ovviamente non funziona niente.

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

int funzione_cerca (int vettore[], int dimensione, int elem); //prototipo della mia funzione
//alla funzione verranno passati tre argomenti di tipo intero e la stessa dovrà restituire un valore di tipo intero

int main() {
	
	int vettore[8]={10,5,15,20,25,40,5,56};
	int dimensione=8;
	int elem=20;
	int appoggio;
	
	funzione_cerca (&vettore[dimensione],dimensione,elem);
	appoggio=funzione_cerca(&vettore[dimensione],dimensione,elem);
	
	printf("%d",appoggio);
	return 0;
}

int funzione_cerca (int vettore[], int dimensione, int elem) {
	
	int m,posizione;
	
	for(m=0; m<dimensione; m++) {
		
		if(vettore[m]==elem) {
			posizione=m; 
			return posizione;	
		}
		
		else return -1;
	}
	
}

Se provo a cercare il valore 20 perchè la funzione non mi restituisce il valore 3 (posizione del valore nell'array) quando vado a stamparlo con printf?

Ogni suggerimento è ben accetto anche perchè non so più cosa inventarmi :)

Grazie in anticipo

 

Link al commento
Condividi su altri siti

il mio primo consiglio per evitare problemi simili in futuro è compilare con l'opzione -Wall che ti da dei warning in più che ti aiutano a correggere il codice.

per compilare con questa opzione da terminale si fa così

gcc -o nomeprogramma -Wall nomeprogramma.c

 

Dopo aver ripulito il codice ecco qual'è l'errore che mi dava

prog.c: In function 'funzione_cerca':
prog.c:33:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

 

a questo punto bisogna interpretarlo... cosa significa questo warning? significa che la funzione può raggiungere la fine senza avere un return (anche se la funzione non ritorna void).

 

analizziamo il codice:

for(m=0; m<dimensione; m++) {
        
        
if(vettore[m]==elem) {
            posizione=m;
            return posizione;    
        
}
        
        
else return -1;
    }

 

qua tu stai giustamente facendo un ciclo sul tuo vettore che finisce quando finisce il vettore.

Però analizzando l'if cosa ne viene fuori? Ne viene fuori che tu giustamente controlli se il tuo elemento all'indice m è uguale a elem e se questo si verifica  giustamente  esci dalla funzione ritornando l'indice m (tu fai un passaggio in più che non serve metti m in una variabile posizione).

Se però il tuo if fallisce cosa succede? Tu interrompi la funzione e ritorni -1... il che cosa significa? che non stai controllando tutto il vettore perchè al primo elemento se trovi l'elemento sei a posto ma se non lo trovi esci subito e non controlli niente.

in pratica dovresti fare il return -1 solo dopo il ciclo for... questo perchè prima di uscire dal metodo e dire "non ho trovato niente" devi controllare tutto l'array.

 

Questo è il principale problema del tuo codice...

adesso analizziamo il resto del codice:

La prima cosa che mi ha lasciato perplesso è la tua dichiarazione di un array... perchè se dichiari ogni elemento non c'è assolutamente bisogno di mettere tra [] la dimensione...

int vettore[]={10,5,15,20,25,40,5,56};

int vettore[8]={10,5,15,20,25,40,5,56};

sono equivalenti

 

l'altra cosa che mi ha lasciato perplesso è l'utilizzo della funzione_cerca 2 volte (la stessa cosa che ti ha fatto notare Francesco).

Infine mi ha lasciato perplesso come stai passando il parametro &vettore[dimensione]...

Fatti questa domanda, cosa vuole la funzione?
int vettore[]

 

risposta vuole un vettore di interi. il che significa che gli devi passare un vettore di interi, ne più ne meno.

Quando tu gli passi vettore[dimensione] gli stai passando l'elemento all'indice dimensione di vettore (ossia l'elemento 8, ossia un intero e basta) non un vettore di interi... la & significa semplicemente che gli passi un puntatore a quella variabile (che in questo caso non è necessario)..

 

Corretto il codice funziona come dovrebbe (almeno hai una base di codice corretta per il primo punto)...

Mi resta un dubbio per quanto riguarda il secondo punto che ti ha dato

2. se il valore elem è presente più volte, si restituisca l’indice di tutte le occorrenze;

questo punto non è abbastanza chiaro, infatti se il valore elem è presente più volte (mettiamo che è presente 2 volte), se tu devi restituire un int (come restituisce attualmente la tua funzione) come fai a restituire una serie di int? O restituisci la somma degli indici, o restituisci un contatore che dice quante volte è presente (ma non restituisci gli indici) oppure il valore di ritorno della tua funzione non è corretto.

 

Per quanto riguarda l'esercizio sul vettore ordinato devi adottare un algoritmo più efficente (il succo è che se il tuo array è ordinato e tu stai cercando un elemento più grande o più piccolo (a seconda di quale algoritmo usi un esempio è la binary search che divide il tuo array in due parti) di quello che stai analizzando in quel momento non devi continuare la ricerca).

 

un esempio:

hai il tuo array ordinato

1   3    5   7   9

 

stai cercando 4

a differenza di prima non devi per forza arrivare fino in fondo con la tua ricerca infatti quando arrivi a 5 siccome 5 > 4 e l'array è ordinato sai che nell'array non c'è sicuramente 4.

 

Per la prima parte dell'esercizio ti lascio il tuo codice corretto:

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

int funzione_cerca (int vettore[], int dimensione, int elem); //prototipo della mia funzione
//alla funzione verranno passati tre argomenti di tipo intero e la stessa dovrà restituire un valore di tipo intero

int main() {
    int dimensione=8;
//notare non serve usare [8]
    int vettore[]={10,5,15,20,25,40,5,56};
    int elem=20;
    int appoggio = 0;
   //uso solo una volta funzione_cerca
   //passo vettore che è un array di int non &vettore[dimensione] che è un puntatore all'elemento 8 ed è quindi un puntatore ad int
    appoggio=funzione_cerca(vettore,dimensione,elem);
    
    printf("%d\n",appoggio);
    return 0;
}

int funzione_cerca (int vettore[], int dimensione, int elem) {
    
    int m,posizione;
    
    for(m=0; m<dimensione; m++) {
        if(vettore[m]==elem) {
            posizione=m;
            return posizione;    
        }
    }

// notare il return è fuori dal for
    return -1;
    
}
Link al commento
Condividi su altri siti

Tra le altre cose, se non sbaglio esiste già una funzione che conta gli elementi di un array, quindi tanto vale eliminare la variabile e usare quella funzione...

Per il secondo punto si potrebbe fare una funzione che restituisca una stringa con gli indici oppure un errore:

es.

vettore 2 5 3 5 4 5 6

numero 15

"non trovato"

numero 3

"2;"

5

"1;3;5;"

e poi lavori sulla stringa nel main

:apple:  iPhone 5S

Link al commento
Condividi su altri siti

Tra le altre cose, se non sbaglio esiste già una funzione che conta gli elementi di un array, quindi tanto vale eliminare la variabile e usare quella funzione...

Per il secondo punto si potrebbe fare una funzione che restituisca una stringa con gli indici oppure un errore:

es.

vettore 2 5 3 5 4 5 6

numero 15

"non trovato"

numero 3

"2;"

5

"1;3;5;"

e poi lavori sulla stringa nel main

 

all'università chiedono spesso di fare funzioni già presenti in libreria. visto che è un esercizio universitario bisogna che faccia quel che gli chiedono.

Link al commento
Condividi su altri siti

il mio primo consiglio per evitare problemi simili in futuro è compilare con l'opzione -Wall che ti da dei warning in più che ti aiutano a correggere il codice.

per compilare con questa opzione da terminale si fa così

Eppero'!  Complimenti per l'impegno!  Ma sarà ripagato?
Link al commento
Condividi su altri siti

Eppero'!  Complimenti per l'impegno!  Ma sarà ripagato?

è un modo per esercitarmi, correggere codice è il miglior modo per imparare a smettere di far errori e per migliorare il proprio codice (quando vedo certi orrori anche solo d'identazione nei miei codici passati ora mi viene la pelle d'oca). Poi ricordo che all'inizio anch'io facevo errori del genere, e in pochi davano spiegazioni chiare (in particolare sul web) abbastanza spicciole quindi quando ho voglia e tempo cerco sempre di farlo (in realtà non so se sono chiaro, immagino che adesso alcune cose le dia per scontate pure io).

Insomma se a lui serve 2 piccioni con una fava, se la mia spiegazione è stata inutile almeno ho imparato qualcosa in più io... tanto sto studiando proprio per questo (sottolineo che sono studente a tempo pieno in questo periodo).

Comunque quando ci si rende conto di quanta differenza c'è tra leggere un codice proprio e un codice fatto da altri ci si rende conto anche che per poter lavorare in azienda è necessario è in grado di leggere il codice scritto dai tuoi colleghi, ed essere in grado di scrivere codice che i tuoi colleghi riescano a leggere.

 

non hai capito, invece di inserire int dimensione=8; fare direttamente

appoggio=funzione_cerca(vettore,COUNT(VETTORE),elem);

o come si chiama  :ok: 

ti assicuro che ho capito. ma a mio parere una funzione del genere (guardando il livello dell'esercizio) vuole che se la crei da solo oppure che utilizzi una variabile a dimensione fissa. All'università insegnano così, uso delle librerie minimo, molti esercizi standard e pochi programmi veri (la maggior parte sono esercizietti che metti da parte subito dopo averli finiti). Verso fine corso di solito iniziano a chiedere qualcosa di più ma se uno vuole davvero imparare deve anche mettersi a programmare da solo. L'approccio universitario a mio parere serve solo se uno si mette ad applicare le cose che studia anche in programmi con una minima complessità, altrimenti è come scrivere in arabo senza conoscere la lingua...

Per materie come analisi non si può fare altrimenti visto che sono solo una sfilza di teoremi ed esercizi... nella programmazione invece fin da subito si deve sperimentare il più possibile su situazioni pratiche.

Link al commento
Condividi su altri siti

Sì, ma a meno di farti un ciclo sul vettore con try per non rischiare di riceve un errore per esserne uscito e poi restituire il numero di conteggio al quale eri arrivato, cosa che non mi sembra proprio esserci nell'esercizio, tanto vale, count è un modo equivalente, nulla più, nulla meno, secondo me

:apple:  iPhone 5S

Link al commento
Condividi su altri siti

Sì, ma a meno di farti un ciclo sul vettore con try per non rischiare di riceve un errore per esserne uscito e poi restituire il numero di conteggio al quale eri arrivato, cosa che non mi sembra proprio esserci nell'esercizio, tanto vale, count è un modo equivalente, nulla più, nulla meno, secondo me

 

La mia idea è che lui abbia sbagliato il valore di ritorno.

Se ad esempio dovesse restituire un array di interi il punto 2 sarebbe fattibile.

Link al commento
Condividi su altri siti

Grazie a tutti per l'aiuto, ma soprattuto a Lief, sei stato gentilissimo e hai spiegato tutto alla perfezione. Purtroppo come avrai potuto notare sono alle prime armi e mi trovo veramente in difficoltà con gli esercizi settimanali per l'università quindi perdono se il codice non risultata chiaro ma è il massimo che riesco a fare per adesso :)

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...