Eseguire il seguente programma mediante l'utilizzo di funzioni.

di il
16 risposte

Eseguire il seguente programma mediante l'utilizzo di funzioni.

Salve a tutti sono nuovo del forum. spero che questo post rispetti tutte le regole e che venga regolarmente pubblicato.
avrei urgentemente bisogno di aiuto per eseguire questo esercizio utilizzando però le funzioni.
parto dal presupposto che sono mesi che studio informatica , ma credo di avere serie difficoltà a comprendere alcuni tecnicismi , un po perche credo che i libri di riferimento che utilizzo non sono adatti, e un po perche nonostante sia solo " elementi di informatica" il nostro professore non si è prodigato troppo in spiegazioni concrete ed applicabili lasciando molte cose al caso.
veniamo al dunque.
la traccia dell'esercizio chiede di scrivere una lista di n nomi ed età , fare la media delle età e poi ( mediante un indicizzazione ) scegliere uno dei contatti e cambiare l'età con un altro valore arbitrariamente scelto .
dopo diversi sbattimenti sono riuscito a completare l'esercizio mediante l'utilizzo del costrutto struct , in questo modo :

 #include <iostream>
using namespace std;

typedef struct persona {
	char nome [20];
	int eta;
}persona;


int main(){
	persona dati[3];
	int s=0;
	int m,neta;
	for(int i=0;i<3;i++){
	cout<<"inserire nome del "<<i+1<<"^ contatto : ";
	cin>>dati[i].nome;
	cout<<"inserire eta del "<<i+1<<"^ contatto : ";
	cin>>dati[i].eta;
	
	s=s+dati[i].eta;
}
m=s/3;
	cout <<"la media delle eta e': "<<m;

cout<<"\ninserire la posizione del contatto da modificare ";
for(int i=0;i<3;i++){
cin>>i;

cout<<"\n inserire l'eta da sostituire ";
cin>>neta;

dati[i].eta=neta;

cout<<" il contatto dopo la modifica e : "<<dati[i].nome<<" "<<dati[i].eta;
}
}

in realtà la traccia chiede di svolgere questo esercizio utilizzando però le funzioni ..
e qui casca l'asino.
sono stato abituato ad utilizzare innanzitutto soltanto funzioni di tipo void , int o bool , ma sopratutto non ho mai trattato come parametri di funzione il costrutto struct e pertanto non so ne come indicarlo all'interno della funzione stessa , ne tantomeno come richiamarlo durante lo svolgimento ...
qualcuno , di grazia , potrebbe aiutarmi concretamente con eventuale spiegazione dei passaggi?
mi rendo conto che possa essere una richiesta scomoda e che pertanto nessuno sia tenuto a farlo, ma avendo l'esame fra qualche giorno sarebbe una questione relativamente urgente . (inoltre se doveste notare errori all'interno della stesura del codice che ho postato, siate liberissimi di correggerli per affinare il tutto.)
sarei infinitamente grato per ogni eventuale aiuto.

grazie mille in anticipo. Francesco.

16 Risposte

  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Ma i puntatori li avete studiati?
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Si , certo ... o meglio, da programma ci sono , e teoricamente so la differenza tra passaggio per valore e per riferimento...
    ma sinceramente credo di non saperli utilizzare come si deve ..
    mi hai fatto questa domanda perchè avrei dovuto usare i puntatori nel codice che ho postato o perche dovrei usarli nelle funzioni?
    grazie mille per la risposta .
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Individua quali funzioni devi usare e passa il vettore di strutture con un puntatore dive serve....
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Scusami in che senso quali funzioni devo usare?
    ad ogni modo farò alcuni tentativi , eventualmente se dovessi raggiungere un risultato concreto posterò qui sopra sperando che tu o qualcun altro possiate analizzarlo ed aiutarmi.
    ti ringrazio molto comunque per il tuo aiuto .
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Una funzione e' un ""blocchetto che fa qualcosa"".

    L'esercizio GIA' INDICA i blocchetti da usare:

    1) scrivere una lista di n nomi ed età ,
    2) fare la media delle età
    3) scegliere uno dei contatti
    4) cambiare l'età con un altro valore
    5) valore arbitrariamente scelto .

    Il corso si chiamera' (o si dovrebbe chiamare) algoritmi e strutture dati.
    QUESTI sono gli algoritmi
    Ma un algoritmo lavora su delle STRUTTURE DATI.
    DEVI identificare la struttura dati. Un pezzo lo hai gia' identificato, ti manca l'altro.

    Osservazione:

    1) un po perche credo che i libri di riferimento che utilizzo non sono adatti: MOOOLTO IMPROBABILE. Tendenzialmente IMPOSSIBILE
    2) e un po perche nonostante sia solo " elementi di informatica" il nostro professore non si è prodigato troppo in spiegazioni concrete ed applicabili: questo richiesta NON HA SENSO. E' come voler chiedere che il prfessore ti mostri TUTTI I MODI in cui puoi combinare numeri e le quattro operazioni, e se non tutti, una grande varieta' di casi. Richiesta ASSURDA!
    3) lasciando molte cose al caso: in informatica NIENTE E' LASCIATO AL CASO.

    A questo livello hai:

    1) UNA struttura per la ""blochettizzazione"" del codice
    2) DUE strutture dati
    3) TRE strutture di controllo
    4) QUATTRO tipi di dati diversi (questo vale UNO)
    5) qualche altro concettino sparso.

    In totale un po' piu' di OTTO concetti FONDAMENTALI, che rispetto alle QUATTRO OPERAZIONI PIU' le parentesi e l'ordine di valutazione, sono giusto un paio di concettini in piu!

    Non ci vogliono ANNI per imparare OTTO concettini semplicciotti !

    Consiglio: LASCIA PERDERE L'INPUT DA TASTIERA! Usa strutture dati COSTANTI definite DIERTTAMENTE nel codice.
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Ciao, grazie per aver risposto.
    allora per quanto riguarda le funzioni , non posso andare oltre 3 ... in particolare devono essere suddivise in questo modo , una void inserisci ( per l'inserimento dei parametri con i quali avremo a che fare durante l'esercizio ) , una void elabora ( in cui vengono effettivamente esplicate le varie richieste da traccia ) una void stampa ( output.) , pertanto dovrei limitarmi a queste 3.
    il corso universitario si chiama " elementi di informatica " 6 cfu . algoritmi e strutture dati a cui tu fai riferimento , si trova al corso di laurea di informatica o ingegneria informatica , io faccio ingengeria dei materiali , ( chimica principalmente ) e pertanto non è richiesta questa grande conoscenza della programmazione. elementi di informatica dovrebbe essere davvero il minimo e di fatto con il prof precedente non abbiamo nemmeno affrontato il costrutto struct ( per fare un esempio ) .
    per quanto concerne la questione libro, sicuramente sarà come dici tu , ma io lo trovo alquanto dispersivo e poco chiaro ... giusto un parere personale .
    tornando all'esercizio , sto provando diversi modi per usare le funzioni , appena arriverò a qualcosa di più o meno concreto aggiornerò il post.
    grazie infinitamente a tutti per le risposte .
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Non c'e' NESSUN MOTIVO AL MONDO che ti obblighi a usarne SOLO tre.
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Scusami , ma io ho difficoltà a seguirti e capire ...
    innanzitutto ovviamente so che posso usare quante funzioni voglio , ma sono costretto ad utilizzarne al massimo 3 perche il professore impone questo limite . non dipende da me .
    per quanto riguarda i sopracitati concetti , io so cosa sia una struttura di controllo, struttura dati , tipo di dato ecc ecc , ma saperli teoricamente non mi sta aiutando ( PERSONALMENTE ) a risolvere il mio problema .
    inoltre , se hai voglia di dedicarmi un po di tempo , potresti postarmi un esempio concreto? sinceramente ho imparato molto di più studiando codici gia compilati piuttosto che sbattere ore e ore la testa sul libro per trovare una strada percorribile .
    detto questo , posto qui di seguito una bozza di cio che sto facendo , so che è pieno di errori (d'altronde , pur avendo seguito più o meno il codice precedente , non riesco nemmeno ad inserire in numero richiesto " n " di contatti ( va oltre il valore che io indico , non capisco perche ) , e non stampa nemmeno correttamente )
    
    #include  <iostream>
    using namespace std;
    
    typedef struct persona {
    	char nome[20];
    	int eta;
    }persona;
    
    void inserisci ( persona *dati, int &n){
    	int m=0;
    	int s=0;		
    		cout<<"quanti contatti vuoi inserire? ";
    	cin >>n;
    		for (int i=0;i<n;i++){
    	cout<<"inserire nome del "<<i+1<<"^ contatto : ";
    	cin>>dati[i].nome;
    	cout<<"inserire eta del "<<i+1<<"^ contatto : ";
    	cin>>dati[i].eta;
    	s=s+dati[i].eta;
    	
    }
    m=s/n;
    }
    void stampa( persona *dati,int &n,int m){
    	cout<<"i contatti inseriti sono : ";
    	for(int i=0;i<n;i++){
    		cout<<" nome : "<<dati[i].nome<<" eta : "<<dati[i].eta;
    	}
    	cout<<"la media delle eta e : "<<m;
    }
    int main ()
    {
    	int s=0,n,m=0;
    	persona dati [n];
    	
    	inserisci(dati,n);
    	stampa(dati,n,m);
    }
    ora , non fraintendermi ... io non pretendo niente di " ben servito " e ti garantisco che prima di scrivere su questo forum ci ho sbattuto davvero la testa ... immagino che per voi siano fesserie queste , ma , sarà un mio limite evidentemente , per me il lavoro è arduo .
    se avessi voglia di correggere il mio codice e renderlo funzionante come si deve , ti sarei veramente grato.
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    L'input di n va fatto PRIMA di dichiarare il vettore, altrimenti n non avrà un valore corretto.
    Quindi va chiesto nel main e non nella funzione a cui va passato e non per riferimento dato che non va modificato.
    Al contrario m va passato per riferimento nella prima funzione per averlo in uscita e per copia alla seconda per usarlo.

    Quindi, le modifiche ...
    
    #include  <iostream>
    
    using namespace std;
    
    typedef struct persona {
    	char nome[20];
    	int eta;
    }persona;
    
    void inserisci(persona *dati, int n, int &m) {
    	int s = 0;
    	for (int i = 0; i<n; i++) {
    		cout << "inserire nome del " << i + 1 << "^ contatto : ";
    		cin >> dati[i].nome;
    		cout << "inserire eta del " << i + 1 << "^ contatto : ";
    		cin >> dati[i].eta;
    		s = s + dati[i].eta;
    
    	}
    
    	m = s / n;
    }
    
    void stampa(persona *dati, int n, int m) {
    	cout << "i contatti inseriti sono : " << endl;
    	for (int i = 0; i<n; i++) {
    		cout << " nome : " << dati[i].nome << " eta : " << dati[i].eta << endl;
    	}
    	cout << "la media delle eta e : " << m << endl;
    }
    
    int main()
    {
    	int s = 0, n, m = 0;
    
    	cout << "quanti contatti vuoi inserire? ";
    	cin >> n;
    
    	persona dati[n];
    
    	inserisci(dati, n, m);
    	stampa(dati, n, m);
    	
    	return 0;
    }
    
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Inanzitutto grazie infinitamente per il tuo lavoro .
    sto studiando il tuo codice e nel frattempo mi annoto qualche domanda .
    tuttavia vorrei subito chiederti se potresti spiegarmi questa cosa ..
    nella maggior parte degli esercizi con vettori ( invertire il vettore, scambiarne un valore , concatenare due vettori ecc ecc) tramite indicazioni del prof , ho sempre dichiarato nella funzione il vettore e la dimensione in questo modo :
    void inserisci ( int&dim, int*&v) 
    per quanto riguarda la questione puntatore , in breve , ho compreso che se scrivessi una cosa del genere :
    x=*v sto intendendo ( assegna a x il valore puntato da v) se invece scrivessi :
    *v=&x sto intendendo ( assegna a v l'indirizzo di x)
    ma .. scrivere *&v cosa intende esplicitamente ?
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    francesco101722 ha scritto:


    ho compreso che se scrivessi una cosa del genere :
    x=*v sto intendendo ( assegna a x il valore puntato da v) se invece scrivessi :
    *v=&x sto intendendo ( assegna a v l'indirizzo di x)
    ma .. scrivere *&v cosa intende esplicitamente ?
    ci provo io, anche se non programmo in C++
    x=*v --> ci hai preso assegna a x il valore puntato da v
    *v=&x --> non ci hai preso: assegna alla variabile "puntata" da v l'indirizzo di x; ne discende che la "variabile puntata" da v deve essere a sua volta un puntatore

    ecco il punto dolens:
    int * & v

    è in una dichiarazione di funzione
    se conosco bene il C++
    significa che V è puntatore a intero; inoltre V viene passata per riferimento (modalità che non esiste in C)
    quindi V è un puntatore a intero che si può modificare all'interno della funzione alla quale viene passato
    modificare il puntatore intendo, non l'intero puntato
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Mhm... che scopo avrebbe modificare il puntatore?
    cioe mi spiego.. per quanto ne ho capito , un puntatore serve sostanzialmente ad indicare la posizione in memoria di un oggetto , tipo una variabile , per poi poter " trasportare" l'informazione contenuta in questa cella di memoria , la dove ci serve ..
    cioe , facendo un esempio più pratico...
    mettiamo il caso che io abbia un database di dati , facciamo che siano ad esempio libri e facciamo che siano ad esempio 100 ... di questi 100 libri , alcuni sono stati scritti prima degli anni 80 magari e pertanto hanno un prezzo più elevato ..
    ora supponiamo che da un momento all'altro io decida di unificare tutti i prezzi dei miei libri , potrei procedere in 2 modi ...
    se avessi registrato il prezzo di un singolo libro mediante una variabile , dovrei cambiarle manualmente una per una ..
    se avessi registrato il prezzo utilizzando un puntatore, basterebbe cambiare l'indirizzo di quel puntatore , "indirizzandolo" verso una variabile che abbia il nuovo valore da me richiesto ... cosi che tutti i libri nel database vengano modificati istantaneamente ...
    tutto questo è corretto? ... ed è lo scopo dei puntatori nella programmazione giusto?
    pertanto in funzione di cio, cosa significa e sopratutto a cosa serve modificare un puntatore , se quest'ultimo non è altro che uno strumento con cui posso muovermi fra le celle di memoria ?
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Ancora salve a tutti ... ho completato il codice e finalmente pare funzionare ... certamente grazie alle vostre spiegazioni e il vostro aiuto ... tuttavia vorrei ancora affinare delle cose .
    #include  <iostream>
    using namespace std;
    
    typedef struct persona {
    	char nome[20];
    	int eta;
    }persona;
    
    
    void inserisci(persona *dati, int n,int&m){
    	int s=0;
    	for (int i=0;i<n;i++){
    	cout<<"inserire nome del "<<i+1<<"^ contatto : ";
    	cin>>dati[i].nome;
    	cout<<"inserire eta del "<<i+1<<"^ contatto : ";
    	cin>>dati[i].eta;
    s=s+dati[i].eta;
    }
    m=s/n;
    }
    void sostituisci(persona*dati,int neta,int n){
    int i;
    	cout<<"inserisci la poszione del contatto da modificare ";
    	
    	cin>>i;
    	cout<<"inserisci il valore da sostituire all'eta del contatto : ";
    	cin>>neta;
    	dati[i].eta=neta;
    		cout<<"\n il contatto dopo la modifica e : ";
    	cout<<"nome : "<<dati[i].nome<<"  eta : "<<dati[i].eta;
    }
    
    void stampa(persona*dati,int n,int &m){
    	int i,neta;
    	cout<<"i contatti inseriti sono : "<<endl<<endl;
    	for (int i=0;i<n;i++){
    		cout<<"nome :"<<dati[i].nome<<"  eta : "<<dati[i].eta<<endl<<endl;
    	}
    	
    	cout<<"\nla media delle eta e : "<<m<<endl;
    
    }
    
    
    
    
    int main (){
    	int i,n,m=0,neta;
    	
    	cout<<"quanti contatti vuoi inserire ? : ";
    	cin>>n;
    
    	persona dati[n];
    	inserisci(dati,n,m);
    	stampa(dati,n,m);
    	sostituisci(dati,neta,n);
    }
    A questo punto , avrei una domanda ... sono riuscito ad apportare e stampare la modifica , solo restando nella funzione " sostituisci" ...
    tuttavia avrei gradito riuscire a fare lo stesso ma nella funzione stampa...
    cioè mi spiego meglio
    questa stringa di codice
    
    		cout<<"\n il contatto dopo la modifica e : ";
    	cout<<"nome : "<<dati[i].nome<<"  eta : "<<dati[i].eta;
    avrei gradito visualizzarla nella funzione stampa...
    ho provato in diversi modi ma , vuoi le mie varie inadempienze , vuoi che sto studiando nostop dalle 9 , non sono riuscito a farlo .
    potreste innanzitutto dirmi se e possibile ed eventualmente suggerirmi come farlo? o se qualcuno avesse voglia , farlo direttamente?

    grazie infinite a tutti.
  • Re: Eseguire il seguente programma mediante l'utilizzo di funzioni.

    Hai usato male i tag code... non si capisce
Devi accedere o registrarti per scrivere nel forum
16 risposte