Problema scelta dati da mandare al terminale

di il
5 risposte

Problema scelta dati da mandare al terminale

Ciao a tutti,
sto provando a costruire un programma che mi dia il risultato di questa operazione "t = t + dt"
con "t" che parte da zero e "dt" che scelgo io insieme al valore massimo da raggiungere per poi visualizzare tutti i risultati intermedi.Fino a qui non ci sono problemi.
Il problema vero e proprio è fare in modo che il programma in uscita non mi dia tutti i valori di "t" passo dopo passo (cioè dt dopo dt) ma vorrei che mi facesse visualizzare solo i valori che voglio io.Ad esempio se "dt=0.5" il programma calcolerà "t=0.5" poi "t=1" poi "t=1.5" e così via fino al valore che voglio(per es 20) ma visualizzera i risultati ad un passo 5.Nel programma ho pensato di fornire da tastiera il numero di stampe "nstampe"che deve essere visualizzato e il programma calcola il passo.Non riesco però a ottenere nulla...mi date una mano? ecco il programma:
#include <iostream>
#include <iomanip>

using namespace std;
typedef float dp;
dp t,dt,d;

void loop(dp t,dp tstampa,dp nstampe);
void calc (dp t, dp dt,dp d);
void inizia();


int main () {

dp d,h,tstampa,nstampe;

cout<<"dimmi quando fermarmi"<<endl;
cin>>d;
cout<<"dammi ora dt"<<endl;
cin>>dt;
cout<<"dammi nstampe"<<endl;
cin>>nstampe;

tstampa=d/nstampe;


loop(t,tstampa,nstampe);

}


void inizia(){
t=0;
}

void calc (dp t, dp dt,dp d){

while (t<d){
t = t + dt;
}
}

void loop(dp t,dp tstampa,dp nstampe){
int i;
for(i=1;i<=nstampe;i++){
calc(t+tstampa);
cout<<setw(4)<<i<<setw(6)<<t<<setw(10)<<tstampa<<endl;
}
}

5 Risposte

  • Re: Problema scelta dati da mandare al terminale

    Ciao,

    non mi è chiaro quello che devi eseguire ma posso segnalarti alcuni problemi:
    a) quando richiami la funzione calc() passi un solo argomento quando in realtà lei se ne aspetta 3;
    d) la funzione calc() modifica t che però è l'argomento della funzione, non il t che hai definito globalmente; suggerisco di far ritornare dalla calc() il valore calcolato di t;
    c) la funzione inizia() non viene mai richiamata, pertanto t non viene mai inizializzato;
    d) la variabile globale nstampe è definita come dp, ovvero float, e viene utilizzata all'interno del ciclo for all'interno di loop(); sarebbe meglio a mio avviso che tale variabile sia un intero;

    Spero di esserti stato utile
  • Re: Problema scelta dati da mandare al terminale

    Ciao,
    si hai ragione grazie per i consigli.
    quello che vorrei fare è creare un programma che fa l'operazione "t =t+dt" con dt dato da tastiera e supponendo che si cominci con "t=0".Tutto questo fino a che "t" non raggiunge il valore massimo che gli do io. Il programma pero non deve mostrarmi tutti i risultati(che ,supposto ad esempio "dt=0.5" ,potrebbero essere: "t=0","t=0.5","t=1.0","t=1.5"..... ecc fino a,ad esempio,20)ma solo quelli che vorrei io..cioè ad esempio potrei volere che venga visualizzato il tempo una volta ogni 5 conteggi(tstampa) e quindi ottenere "t=0","t=2","t=2.5" e così via. In realtà si tratta di un progretto più ampio in cui oltre a "t" devo visualizzare posizione e velocità (che entrambe dipendono da t) e poi farne un grafico.Ma a seconda di quanto scelgo "dt" piccolo i conteggi possono diventare tantissimi e quando poi con gnuplot faccio il grafico non vedrò più dei punti ma solo una linea omogenea.Per questo mi serve che il programma faccia i suoi conteggi e più sono e meglio è,non visualizzi tutti i conteggi ma solo per esempio uno ogni 5...simulando una vera e propria misurazione reale della grandezza.Prima però di fare i conti anche con le altre variabili volvo prima provare solo con il tempo "t"..e da qui la domanda che ho postato.
  • Re: Problema scelta dati da mandare al terminale

    Ho semplificato il tuo codice; ho aggiunto il calcolo del numero totale di campioni (ncampioni) e il calcolo dell'intervallo fra una riga e la successiva (modstampa); credo che il pezzo di codice qui sotto faccia proprio quello di cui hai bisogno (sempre se ho capito bene):
    int main () 
    {
    	float d;
    	float dt;
    	long nstampe;
    	float t;
    	long i;
    	long ncampioni;
    	long modstampa;
    
    	cout<<"dimmi quando fermarmi"<<endl;
    	cin>>d;
    	cout<<"dammi ora dt"<<endl;
    	cin>>dt;
    	cout<<"dammi nstampe"<<endl;
    	cin>>nstampe;
    
    	if( nstampe <= 0 )
    		return 1;
    
    	ncampioni = (int)(d / dt);
    	modstampa = (int)(ncampioni / nstampe);
    
    	t = 0;
    	i = 0;
    	while( t <= d )
    	{
    		if( ( i % modstampa ) == 0 )
    			cout << setw(4) << i << setw(6) << t << endl;
    
    		t = t + dt;
    		i ++;
    	}
    }
    A mio avviso dovresti evolvere il programma in modo da lavorare con t,d e dt come interi anzichè float, per maggiore precisione.
    Questo lo puoi fare semplicemente immagazzinando al loro interno valori a virgola fissa, ad esempio moltiplicandoli per 1000 (in input leggi un float, lo moltiplichi per 1000 e lo copi in un intero, lavori normalmente con l'intero e poi solo in fase di output lo inserisci in un float e dividi per 1000).
    Spero di esserti stato utile.
  • Re: Problema scelta dati da mandare al terminale

    Ho letto il tuo post,
    purtroppo però a livello teorico ci sono dei passaggi che non abbiamo affrontato a lezione e sinceramente mi secca un po presentare parti di codice non spiegate dal prof..
    In ogni caso il tuo codice mi ha fatto riflettere ,in particolare l'idea dell'istruzione "if".
    Ho provato a riformulare un codice...
    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    
    int main () 
    {
       float d;
       float dt;
       float nstampe;
       float n;
       float t;
       int i;
       float ncampioni;
       float modstampa;
    
       cout<<"dimmi quando fermarmi"<<endl;
       cin>>d;
       cout<<"dammi ora dt"<<endl;
       cin>>dt;
       cout<<"dammi nstampe"<<endl;
       cin>>nstampe;
    
       
    
       ncampioni = (d / dt);
       modstampa = (ncampioni / nstampe);
    
       t = 0;
       i = 1;
    cout<<setw(10)<<"modstampa"<<setw(10)<<"ncampioni"<<endl;
    cout<<setw(10)<<modstampa<<setw(10)<<ncampioni<<endl<<endl;
       while( t <= d )
       {
          
          
          if (t = i*modstampa){
             cout << setw(4) << i << setw(10) << t << setw(10) << endl;}
          t = t + dt; 
          i++;
          
       }
    }

    Il programma viene compilato senza errori ma quando viene eseguito si ferma a "i=1".
    cosa ne pensi?
  • Re: Problema scelta dati da mandare al terminale

    Nel codice che hai postato c'è l'errore che confondi l'operatore = con l'operatore di confronto ==.
    Comunque, se non vuoi utilizzare l'operatore %, puoi simularne l'uso con un contatore, nell'esempio qui sotto l'ho chiamato step
    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int main ()
    {
    	float d;
    	float dt;
    	long nstampe;
    	float t;
    	long i;
    	long ncampioni;
    	long modstampa;
    	int step;
    
    	cout<<"dimmi quando fermarmi"<<endl;
    	cin>>d;
    	cout<<"dammi ora dt"<<endl;
    	cin>>dt;
    	cout<<"dammi nstampe"<<endl;
    	cin>>nstampe;
    
    	if( nstampe <= 0 )
    		return 1;
    
    	ncampioni = (int)(d / dt);
    	modstampa = (int)(ncampioni / nstampe);
    
    	t = 0;
    	i = 0;
    	step = 0;
    	while( t <= d )
    	{
    		//if( ( i % modstampa ) == 0 )
    		if( step == modstampa )
    		{
    			cout << setw(4) << i << setw(6) << t << endl;
    			step = 0;
    		}
    
    		t = t + dt;
    		i ++;
    		step ++;
    	}
    }
    
Devi accedere o registrarti per scrivere nel forum
5 risposte