[ C ++] Compilazione di un semplice programma matematico

daniele912
Ciao a tutti!
Ho appena iniziato a studiare qualcosa del linguaggio C++ in quanto devo realizzare un piccolo programma per la risoluzione di problemi matematici da portare all'appello orale di un esame. Siccome la parte di programmazione è ridotta all'osso (non costituisce, infatti, la parte centrale dell'esame) e siccome il prof. ha richiesto una conoscenza davvero minima del linguaggio, vorrei realizzare un programma non troppo complicato ma, comunque, non banale. Che tipo di programma potrei realizzare secondo voi? Avete qualche idea? Inoltre, sarebbe davvero gradita una mano nella compilazione del programma e nella correzione degli errori...
Grazie a tutti :)

Risposte
apatriarca
Qual'è il programma del corso? Immagino sarebbe carino che il programma fosse in qualche modo collegata agli argomenti del corso. Hai qualche preferenza sul settore matematico?

daniele912
In realtà i programmi da realizzare sarebbero due (perchè è possibile che uno sia da presentare anche all'appello scritto). Comunque, il corso si basa essenzialmente sull'Analisi delle incertezze (qui ho caricato la dispensa del corso che costituisce praticamente il programma del corso: http://www.megaupload.com/?d=KVWEDJO9). Inoltre, una parte è dedicata al caso del pendolo (con misurazioni di vario tipo) ed una piccolissima parte (praticamente due pagine) dedicate al metodo di Eulero per la risoluzione dei differenziali. Io so che il prof. gradisce particolarmente un programma che utilizza il metodo di Eulero ma, siccome penso sia piuttosto complicato per me, va benissimo anche qualcosa di più semplice. Un argomento possibile potrebbe essere quello relativo al calcolo delle probabilità/teoria dei giochi (per esempio un programma che stima la probabilità di uscita di un numero nel lancio di uno o più dadi) oppure un qualsiasi programma che riguardi l'analisi matematica (ad esempio, il metodo di bisezione e simili).

apatriarca
A me non sembra che il metodo di Eulero sia particolarmente complicato, è anzi probabilmente più semplice da implementare che molti altri algoritmi legati alla probabilità, teoria dei giochi o analisi matematica. Quali sono le tue difficoltà esattamente?

daniele912
La mia difficoltà è proprio quella di capire quali istruzioni utilizzare per compilare il programma. Inoltre, mio malgrado, non posso dedicare molto tempo allo studio del linguaggio C++ in quanto, non costituendo la parte centrale dell'esame, devo concentrarmi su altri argomenti. Questa parte di programmazione rappresenta un "di più" che devo comunque saper svolgere. Avevo iniziato a studiare il C++ ma ho trovato libri vastissimi ( e per me completamente inutili) davvero eccessivi per il mio scopo (ad esempio Tricky C). Comunque, ricordo di aver cominciato a trattare il metodo di Eulero ma di aver avuto qualche difficoltà nella comprensione dello stesso: non immagino neanche come si potrebbe realizzare un programma del genere nè da dove iniziare. Praticamente sono in alto, altissimo mare...

daniele912
Tempo fa cercai di realizzare un programma che simulava il lancio di due dadi e dopo un tot di volte in cui veniva ripetuta l'operazione di lancio, era possibile calcolare quante volte era uscito un determinato numero...

apatriarca
Il C++ non è un linguaggio che può essere imparato in poco, soprattutto se non si hanno conoscenze precedenti di programmazione. Si tratta di un linguaggio molto complesso e ricco di funzionalità e non credo sia possibile trovare un manuale decente di poche pagine (forse Accelerated C++ che segue però un approccio abbastanza non convenzionale e che non credo sia particolarmente adatto al tuo studio). Ma alla fine, gli argomenti che ti hanno insegnato si trovano nelle prime (forse centinaia di) pagine di un qualsiasi manuale. Se proprio vuoi qualcosa di sintetico puoi cercare qualche dispensa universitaria, ma devo ancora trovarne una senza una marea di errori già nelle prime 10 pagine.

La procedura esatta per compilare un codice sorgente in C++ dipende fortemente dal programma usato per farlo. Dipende cioè dal compilatore (nel caso di compilazione dalla riga di comando) oppure dall'IDE utilizzato. Non mi è però chiaro come puoi aver scritto un programma che simula due dadi se non sai neanche come si compila un codice.

E' ovvio che se non si comprende quello che si vuole implementare è impossibile farlo a prescindere dalla conoscenza del linguaggio. Lo studio della teoria deve quindi precedere l'implementazione del suddetto metodo. Io ti direi di fare il programma più semplice accettabile, anche quello del lancio del dado se hai già idea di come realizzarlo o se addirittura l'hai già completato.

daniele912
Sono riuscito a compilare qualcosa del genere conoscendo poche istruzioni di base e qualche ciclo (tipo do-while o for). Il problema è che lo stesso professore ha detto (riportando testuali parole): "Cercate le istruzioni del C++ e le librerie su internet". A me è sembrata una cosa assurda vista la complessità dell'argomento. Nonostante questo, leggendo altri codici e soprattutto spulciando le prime pagine di qualche guida, ho realizzato programmi molto semplici (come la risoluzione di equazioni di secondo grado).
Quindi, anche in modo molto riassuntivo o addirittura sbagliato, ho il disperato bisogno di imparare qualcosa per poter realizzare programmi del genere. Il mio esame si chiama "sperimentazioni di fisica": l'informatica non centra praticamente niente ma, nonostante questo, dobbiamo essere in grado di fare programmi del genere. Tu non potresti indicarmi un modo per realizzare qualche programma? L'importante è che riesco ad eseguire il programma e all'esame riesca a spiegare al prof. le istruzioni utilizzate. Non è pretenzioso sull'argomento. Un'infarinatura delle principali istruzioni e dei cicli più importanti è più che necessaria. Anche perchè ricordo chiaramente di aver fatto gran parte di quel programma sui dadi da solo e di aver ricercato qualcosa su internet; ricordo, inoltre, che le righe di codice che avevo incollato da internet le conoscevo tutte (anche se molto sommariamente e con diversi dubbi a riguardo). Proprio per questo motivo penso che, anche con conoscenze davvero basilari, possa fare un programma di questo tipo anche se molto semplice...

apatriarca
Ma non esiste una ricetta per scrivere un programma generico. Per cui il meglio che posso fare è aiutarti a scrivere un problema particolare. Insomma, scegli l'argomento e prova a realizzare il tuo programma chiedendo nel forum quando hai dubbi su come fare qualcosa (non tutto insieme però.. non possiamo realizzarti l'intero programma senza un qualche tuo contributo). Per iniziare puoi provare a postare il tuo codice dei dadi se vuoi qualche consiglio su come migliorarlo o qualche spiegazione o correzione.

daniele912
Va bene. Stasera, o al limite domani, posterò quello che sono riuscito a compilare del programma.

apatriarca
Mi è venuto il dubbio che il tuo uso del termine compilare sia improprio, che tu non sappia cioè esattamente che cosa significhi o forse che tu non sappia che compilare è un termine tecnico con un preciso significato in informatica che non sembra essere quello che tu gli attribuisci. Che cosa significa secondo te compilare un programma?

daniele912
Penso significhi trascrivere le istruzioni nel compilatore (tipo Dev C++). Sbaglio?

vict85
"daniele91":
Penso significhi trascrivere le istruzioni nel compilatore (tipo Dev C++). Sbaglio?


Dev C++ NON è un compilatore ma un IDE e neanche uno che ti conviene molto usare. Penso Microsoft abbia fatto uscire 2 o 3 versioni di Windows dall'ultima volte che Dev C++ è stato aggiornato. Ti suggerisco di usare code::blocks.

In ogni caso compilare significa parte di quello che tu probabilmente intendi con eseguire. Molto ridotto significa tradurre il codice scritto in linguaggio macchina. Una volta compilato e quindi creato un eseguibile; spesso, gli IDE, eseguono il programma cioè fanno partire l'eseguibile. In realtà il tutto è un po' più complesso di come l'ho spiegato ma per iniziare ti basta questo.

daniele912
Scusate per il ritardo. Il programma che simulava il lancio del dado calcolando la frequenza di uscita di ogni faccia (per 3000 lanci) è il seguente:


#include
#include
#include
#include
using namespace std;

int main ()
{
int f1=0, f2=0, f3=0, f4=0,f5=0,f6=0, i, faccia, risp;
srand ((unsigned)time(NULL));
do
{
cout << "Lancio di un dado per 3000 volte" << endl;
for (i=0; i<3000;i++)
{
faccia=rand()%6 + 1;
if (faccia==1)
f1++;
else if (faccia ==2)
f2++;
else if (faccia==3)
f3++;
else if (faccia==4)
f4++;
else if (faccia==5)
f5++;
else if (faccia==6)
f6++;
}
cout << "Faccia Frequenza" << endl;
cout << " Faccia 1 Frequenza > " << f1 << endl;
cout << " Faccia 2 Frequenza > " << f2 << endl;
cout << " Faccia 3 Frequenza > " << f3 << endl;
cout << " Faccia 4 Frequenza > " << f4 << endl;
cout << " Faccia 5 Frequenza > " << f5 << endl;
cout << " Faccia 6 Frequenza > " << f6 << endl;
cout << "Vuoi riprovare? Si=1, No=2" << endl;
cin >> risp;
f1=0,f2=0,f3=0,f4=0,f5=0,f6=0;
}
while (risp==1);

system ("pause");
return 0;
}

Inoltre, mi chiedevo come posso fare per dare la possibilità a chi esegue il programma di inserire il numero di lanci del dado e magari di inserire qualche altra funzionalità? Questo programma lo realizzai conoscendo qualche istruzione di base e analizzando programmi analoghi presi da internet...

vict85
Se quello è il programma del corso, perché non aggiungi al tuo programmino un test per determinare se la funzione rand è sufficientemente buona per simulare il lancio di un dado a 6 facce? Basta applicare alla fine un test \(\displaystyle \chi^2 \). Ovviamente la tabella te la guardi prima e inserisci direttamente il valore oppure usi una qualche funzione esterna.

Certamente alcuni miglioramenti andrebbero fatti per il tuo codice:
    [*:7h5un7vn] Usare un array invece di 6 variabili per le frequenze.[/*:m:7h5un7vn]
    [*:7h5un7vn] Eliminare le librerie stdio e time che non usi.[/*:m:7h5un7vn]
    [*:7h5un7vn] Eliminare il system("PAUSE") e cambiare IDE.[/*:m:7h5un7vn][/list:u:7h5un7vn]

    Indentare il codice è, senza dubbio, un altro miglioramento utile anche se non essenziale.

    Per chiedere quanti lanci basta usare cin e una variabile. Il for può anche avere un numero di passaggi non costanti.

daniele912
Per fare quello che dici tu penso che ci metterò un bel pò di tempo: non so nemmeno cosa sia un array (il prof. non l'ha mai nominato). Potresti spiegarmi di cosa si tratta?

daniele912
Ho realizzato anche questo piccolo programma per verificare l'allineamento di tre punti nel piano cartesiano. Purtroppo è davvero banale ma il mio livello è ancora bassissimo. Eccolo:

#include
#include

using namespace std;
int main () {
double a; double b; double c; double x1; double y1; double x2; double y2;double x3; double y3;//i punti P(x1;y1) e P1(x2;y2) e P3(x3;y3)
cout<< "Verificare l'allineamento di 3 punti nel piano cartesiano."<< endl;
cout<<"Inserire x1:" << endl;
cin>> x1;
cout<< "Inserire y1:" << endl;
cin>> y1;
cout<< "Inserire x2:" << endl;
cin>> x2;
cout<< "Inserire y2:" << endl;
cin>> y2;
a = y2-y1;
b = x1-x2;
c =(x2*y1-x1*y2);

cout<<"verificarne l'allineamento. Inserire x3:" << endl;
cin>> x3;
cout<<"Inserire y3"<< endl;
cin>>y3;
if (a*x3 + b*y3 + c ==0){ cout<< "sono allineati." << endl;}//la condizione per la quale il punto appartiene alla retta è ax+by+c=0 se esce uguale a zero sostituendo x e y con le coordinate dei due punti allora il punto appartiene alla retta ed è quindi allineato con gli altri due altrimenti no.
else {cout<<"non sono allineati"<< endl;}
system ("pause");
}

vict85
"daniele91":
Per fare quello che dici tu penso che ci metterò un bel pò di tempo: non so nemmeno cosa sia un array (il prof. non l'ha mai nominato). Potresti spiegarmi di cosa si tratta?


:-D Gli array sono cose molto semplici.

Con array si intende una variabile con contiene una "collezione" di altre variabili. In pratica è un tupla ordinata.

Per definire un array di 6 int uno scrive:

 int a[6];


Per assegnare 16 al 3 elemento della 'tupla' uno deve scrivere:

 a[2] = 16;


Perché gli indici partono da 0!

Nel tuo caso puoi definire un array f[6] al posto di f1, f2... e quindi poi accedere a quell'elemento in modo più rapido.

Per intenderci, invece di:

faccia=rand()%6 + 1;
if (faccia==1)
    f1++;
else if (faccia ==2)
    f2++;
else if (faccia==3)
    f3++;
else if (faccia==4)
    f4++;
else if (faccia==5)
    f5++;
else if (faccia==6)
   f6++;


avresti scritto:

faccia=rand()%6;
f[faccia]++;


Similmente al posto di

cout << "Faccia Frequenza" << endl;
cout << " Faccia 1 Frequenza > " << f1 << endl;
cout << " Faccia 2 Frequenza > " << f2 << endl;
cout << " Faccia 3 Frequenza > " << f3 << endl;
cout << " Faccia 4 Frequenza > " << f4 << endl;
cout << " Faccia 5 Frequenza > " << f5 << endl;
cout << " Faccia 6 Frequenza > " << f6 << endl;


avresti usato un ciclo for e quindi:

for(i=0; i<6; i++)
{
    cout << " Faccia " << i+1 << " Frequenza > " << f[i] << endl;
}


Molto più semplice... Non credi? :wink:

daniele912
Si mi sembra molto più semplice ma sono terribilmente confuso...Il problema principale è che mi sono reso conto che per masticare il C++ ci vuole molto molto tempo. Il prof. ci ha sconsigliato di perdercelo questo tempo e ci ha mostrato solo qualcosa: nonostante questo io devo portare un programma all'esame ma, nelle condizioni in cui sono, non riesco a svolgere nessun programma che non sia terribilmente banale.

vict85
Usa il tag

[code]
[/code]

intorno al tuo codice per visualizzarlo meglio.

Per tua utilità ti riscrivo il tuo ultimo codice in modo da correggere i tuoi errori. Se non capisci qualcosa chiedi. Ne metto 2 varianti (non controllo l'algoritmo ma solo il codice).

#include <iostream.h>

using namespace std;

int main () 
{
    double a, b, c;
    double P1[2], P2[2], P3[2];

    cout << "Verificare l'allineamento di 3 punti nel piano cartesiano."<< endl;
    cout << "Inserire le coordinate del punto 1" << endl;
    cin   >> P1[0] >> P1[1];
    cout << "Inserire le coordinate del punto 1" << endl;
    cin   >> P2[0] >> P2[1];
    cout << "Inserire le coordinate del punto 1" << endl;
    cin   >> P3[0] >> P3[1];

    a = P2[1] - P1[1];
    b = P1[0] - P2[0];
    c = P1[1]*P2[0] - P1[0]*P2[1];

    if(a*P3[0] + b*P3[1] + c ==0)
    {
        cout << "sono allineati." << endl;
    }
    else 
    {
        cout<<"non sono allineati"<< endl;
    }
}


Versione 2:

#include <iostream.h>

using namespace std;

int main () 
{
    double a, b, c;
    double x[3], y[3];

    cout << "Verificare l'allineamento di 3 punti nel piano cartesiano."<< endl;
    for(unsigned int i = 0; i != 3; ++i)
    {
        cout << "Inserire le coordinate del punto " << i+1 << endl;
        cin   >> x[i] >> y[i];
    }

    a = y[1] - y[0];
    b = x[0] - x[1];
    c = x[1]*y[0] - x[0]*y[1];

    if(a*x[2] + b*y[2] + c ==0)
    {
        cout << "sono allineati." << endl;
    }
    else 
    {
        cout<<"non sono allineati"<< endl;
    }
}


In casi più generici penso che userei una struttura o una classe (cose che puoi evitare di usare) ma in questo caso penso userei la 2 solo perché le formule sono scritte con \(\displaystyle x \) e \(\displaystyle y \).

daniele912
Ho provato a modificare il codice ma purtroppo ci sono dei bug che non riesco ad individuare. Inoltre, non ho capito come si dichiara un array. Ti posto quello che ho scritto in modo tale che tu possa individuare i miei errori:

#include <stdio.h>
 #include <iostream.h>
 #include <time.h> 
 #include <stdlib.h>
 using namespace std;
 
 int main ()  
 {
     int n;
     int f1=0, f2=0, f3=0, f4=0,f5=0,f6=0, i, faccia, risp;
    
     srand ((unsigned)time(NULL));
     cout << "SIMULATORE DI LANCIO DEL DADO" << endl; 
     
     do
     {      
           cout << " " << endl; 
           cout << "Inserisci il numero di ripetizione del lancio" << endl; 
           cin >> n; 
           for (i=0; i<n; i++)
           {
               faccia=rand()%6;
               f [faccia]++;
               
               }
               for (i=0; i<6; i++)
               {
               cout << "Faccia" << i+1 <<  "Frequenza > " << f[i] << endl;
               }
               cout << "Vuoi ripetere l'operazione? Si=1, No=2" << endl;
               cin >> risp;
               }
               while (risp==1);
               
               system ("pause");
               return 0;
               }

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.