[ C ++] Compilazione di un semplice programma matematico
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
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
Ho eliminato stdio perché era inutile, indentato per bene e dichiarato l'array.
Un array si dichiara scrivendo con questo ‘stile’
per esempio:
è inoltre possibile fare cose tipo
per assegnare dei valori ai vari elementi dell'array.
Maggiori info:
http://www.cplusplus.com/doc/tutorial/arrays/
#include <iostream.h> #include <time.h> #include <stdlib.h> using namespace std; int main () { int n; int f[6], 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); return 0; }
Un array si dichiara scrivendo con questo ‘stile’
type nome_array[dim_array];
per esempio:
// array di 7 int chiamato ore_lavoro int ore_lavoro[7]; // un array di 100 double chiamato funz double funz[100];
è inoltre possibile fare cose tipo
double origine[3] = {0.0, 0.0, 0.0}
per assegnare dei valori ai vari elementi dell'array.
Maggiori info:
http://www.cplusplus.com/doc/tutorial/arrays/
Comunque quel “vuoi continuare” dovrebbe tener conto anche del caso in cui digiti cose diverse.
Si infatti devo aggiustare quella parte del programma. Comunque, ho provato ad eseguire il tuo programma ma da risultati non veri. Tipo ho provato a inserire n=50 ma le frequenze escono completamente sballate...
Immagino sia perché non ho messo a 0 gli elementi dell'array. Comunque che risultati ti da? Una certa variazione è normale e poi non è detto che sia un dado "equilibrato".
Escono valori assurdi che superano il milione di lanci (quando io ho impostato solo n=50)...
Purtroppo non riesco a trovare l'errore perché non so nemmeno da cosa possa dipendere...
Sarebbe meglio che riposti il codice con le modifiche che ti ha consigliato vict85 e che hai fatto te

Il codice è rimasto tale e quale a quello che ho postato a pagina 2 di questa discussione. Non ho apportato modifiche perché non so come proseguire e sono entrato in confusione

Per quanto riguarda il codice di vict85 in questa pagina per il lancio dei dadi ci sono due cose da correggere:
1. le librerie in C++ non vogliono più il .h e andrebbero quindi incluse nel modo seguente:
2. L'array f non è stato inizializzato, per cui la sua dichiarazione andrebbe riscritta nel modo seguente:
Il tuo codice ha lo stesso problema con gli header, probabilmente vict85 l'ha copiato dal tuo codice. Non hai inoltre alcun bisogno di includere stdio.h (o l'equivalente in C++ cstdio). Per il resto mi sembra funzionare.
1. le librerie in C++ non vogliono più il .h e andrebbero quindi incluse nel modo seguente:
#include <iostream> #include <ctime> #include <cstdlib> using namespace std;
2. L'array f non è stato inizializzato, per cui la sua dichiarazione andrebbe riscritta nel modo seguente:
int f[6] = {0, 0, 0, 0, 0, 0}, i, faccia, risp;
Il tuo codice ha lo stesso problema con gli header, probabilmente vict85 l'ha copiato dal tuo codice. Non hai inoltre alcun bisogno di includere stdio.h (o l'equivalente in C++ cstdio). Per il resto mi sembra funzionare.
Ho apportato quelle modifiche ma non riesco ad eseguire il programma perchè individua 3 errori proprio riguardanti le librerie stdio, time ed stdlib. In particolare esce il messaggio: "No such file or directory".
Inoltre trovo una certa difficoltà a correggere la parte finale del programma. Se si preme un numero diverso da 1 o 2 il programma si chiude automaticamente. Ho cercato di fare qualche correzione al ciclo do-while ma non sono riuscito nell'intento. Oltre a do-while cosa posso utilizzare per correggere quella parte? Grazie mille a tutti per l'aiuto che mi state dando!
Se tolgo il .h dalle librerie Dev C++ non esegue il programma. In caso contrario il programma parte alla perfezione.
Ragazzi scusate per i post di fila. Mi sono accorto che il codice contiene comunque qualche errore. Infatti, ho eseguito il programma impostando il numero di lanci a 50. In seguito, ho ripetuto il programma impostando n=2. In questo caso, la frequenza delle facce esce comunque sballata e superiore alla decina per ogni faccia. Come mai? Cosa c'è che non va? Non riesco proprio a comprendere dove vi possa essere l'errore...
Inoltre, facendo più prove, ho notato che il primo tentativo è sempre corretto. Se poi ripeto il ciclo, impostando un numero di lancio molto minore o maggiore rispetto al primo, le frequenze proposte dal programma sono molto simili a quelle del primo ciclo. Faccio un esempio: ho impostato n = 100. Il programma mi ha dato le seguenti frequenze per ogni faccia:
faccia 1 > 13
faccia 2 > 15
faccia 3 > 16
faccia 4 > 21
faccia 5 > 14
faccia 6 > 21
Dopo ho ripetuto il ciclo impostando n = 2 e le frequenze sono state le seguenti:
faccia 1 > 13
faccia 2 > 15
faccia 3 > 16
faccia 4 > 23
faccia 5 > 14
faccia 6 > 21
Nel primo caso la somma è esattamente 100, nel secondo invece è 102. Riprovando una terza volta e impostando n=10 ho notato che la somma delle frequenze era 112. Praticamente, somma al primo n impostato tutti gli n successivi e ne fa le frequenze. Da cosa può dipendere? Spero nel vostro aiuto perché non ci sto capendo più niente.
Inoltre, facendo più prove, ho notato che il primo tentativo è sempre corretto. Se poi ripeto il ciclo, impostando un numero di lancio molto minore o maggiore rispetto al primo, le frequenze proposte dal programma sono molto simili a quelle del primo ciclo. Faccio un esempio: ho impostato n = 100. Il programma mi ha dato le seguenti frequenze per ogni faccia:
faccia 1 > 13
faccia 2 > 15
faccia 3 > 16
faccia 4 > 21
faccia 5 > 14
faccia 6 > 21
Dopo ho ripetuto il ciclo impostando n = 2 e le frequenze sono state le seguenti:
faccia 1 > 13
faccia 2 > 15
faccia 3 > 16
faccia 4 > 23
faccia 5 > 14
faccia 6 > 21
Nel primo caso la somma è esattamente 100, nel secondo invece è 102. Riprovando una terza volta e impostando n=10 ho notato che la somma delle frequenze era 112. Praticamente, somma al primo n impostato tutti gli n successivi e ne fa le frequenze. Da cosa può dipendere? Spero nel vostro aiuto perché non ci sto capendo più niente.
vado molto ad occhio, non ho letto le discussioni dall'inizio solo le ultime di vict85 ed apatriarca. Quello che non hai incluso nel tuo codice è l'azzeramento del vettore f[] ad ogni ciclo. Essendo ogni prova indipendente.
Te praticamente come hai visto sommi i lanci ad ogni prova.
per risolvere ciò basta che inserisci all'inizio (o alla fine se hai inizializzato l'array) del do_while una cosa tipo:
così risolvi i problemi che hai descritto.
per questo rileggi il post di apatriarca, le librerie in C++ non hanno quel nome.
PS: te lo sarai sentito scrivere molte volte, ma te lo sottolineo pure io. DEV-C++ è una sciagura per ogni novello studente, da quello che ho visto sei alle prime armi, se utilizzi questo immondo IDE può capitare che ti dia errore quando non deve o il contrario. E' vecchio, non aggiornato per il mondo informatico. Non è utilizzato, se non da qualche anziano docente che non ha voglia di cambiare.
Cambia IDE e cambierai il mondo
(a parte gli scherzi è semplicemente un consiglio, poi fai come credi).
Te praticamente come hai visto sommi i lanci ad ogni prova.
per risolvere ciò basta che inserisci all'inizio (o alla fine se hai inizializzato l'array) del do_while una cosa tipo:
for (i=0; i<MAX; i++) { f[i]=0; }
così risolvi i problemi che hai descritto.

"daniele91":
Ho apportato quelle modifiche ma non riesco ad eseguire il programma perchè individua 3 errori proprio riguardanti le librerie stdio, time ed stdlib. In particolare esce il messaggio: "No such file or directory".
per questo rileggi il post di apatriarca, le librerie in C++ non hanno quel nome.
PS: te lo sarai sentito scrivere molte volte, ma te lo sottolineo pure io. DEV-C++ è una sciagura per ogni novello studente, da quello che ho visto sei alle prime armi, se utilizzi questo immondo IDE può capitare che ti dia errore quando non deve o il contrario. E' vecchio, non aggiornato per il mondo informatico. Non è utilizzato, se non da qualche anziano docente che non ha voglia di cambiare.
Cambia IDE e cambierai il mondo

A parte il fatto che tutto questo va nettamente al di fuori di ogni mia conoscenza, ho provato ad inserire il ciclo for all'inizio e poi alla fine del ciclo do-while ma non è cambiato nulla. Inoltre, ho dovuto inizializzare la funzione MAX perché altrimenti mi dava errore.
"daniele91":
A parte il fatto che tutto questo va nettamente al di fuori di ogni mia conoscenza, ho provato ad inserire il ciclo for all'inizio e poi alla fine del ciclo do-while ma non è cambiato nulla. Inoltre, ho dovuto inizializzare la funzione MAX perché altrimenti mi dava errore.
scusa forse sono stato troppo generale.
MAX era un modo per generalizzare la dimensione dell'array. Sarebbe così il ciclo for:
for (i=0; i<6; i++) { f[i]=0; }
se ti piace di più vedi la sequenza del ciclo unfolded (srotolato):
f[0]=f[1]=f[2]=f[3]=f[4]=f[5]=0;
Comunque il codice copia/incollato da vict85, con modifiche di apatriarca e la mia aggiunta di azzermento (non ho modificato altro) risulta così:
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; int main () { int n; int f[6], i, faccia, risp; srand ((unsigned)time(NULL)); cout << "SIMULATORE DI LANCIO DEL DADO" << endl; do{ for (i=0; i<6; i++){ f[i]=0; } 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); return 0; }
vedi se lo comprendi, non ho aggiunto nulla di non già scritto

Ho provato a scaricare code::blocks ma, copiando e incollando il codice, mi da errore praticamente su tutto: le istruzioni "cout", "cin", "endl" e così via. Come mai? E comunque, penso che purtroppo all'esame sarò costretto ad utilizzare proprio Dev C++...
Comunque, con le tue modifiche il programma funziona perfettamente! Mi chiedevo un'altra cosa: come è possibile cambiare la parte finale dove l'utente deve scegliere se proseguire premendo 1 o 2? Se si sbaglia numero premendo per esempio "3" il programma si chiude. Vorrei dare la possibilità di ripetere l'operazione anche se chi esegue il programma sbagliasse per più volte. Come posso fare?
Grazie mille per l'aiuto
Comunque, con le tue modifiche il programma funziona perfettamente! Mi chiedevo un'altra cosa: come è possibile cambiare la parte finale dove l'utente deve scegliere se proseguire premendo 1 o 2? Se si sbaglia numero premendo per esempio "3" il programma si chiude. Vorrei dare la possibilità di ripetere l'operazione anche se chi esegue il programma sbagliasse per più volte. Come posso fare?
Grazie mille per l'aiuto

A me il codice di hamming_burst compila senza errori.
Anche a me compila senza errori ma solo in Dev C++. In code::blocks non capisco per quale motivo non parta. Comunque, hai un'idea di come posso migliorare la parte finale del programma? Se premo un numero diverso da 1 o 2 il programma termina mentre vorrei che ripetesse la richiesta di andare avanti o chiudere il programma finché non si premono i numeri corretti.
"daniele91":
Comunque, hai un'idea di come posso migliorare la parte finale del programma? Se premo un numero diverso da 1 o 2 il programma termina mentre vorrei che ripetesse la richiesta di andare avanti o chiudere il programma finché non si premono i numeri corretti.
a dire il vero se premi 1 il programma continua, ogni altro numero lo fa terminare.
Tipo dovrebbe essere una cosa simile:
do{ cout << "Vuoi ripetere l'operazione? Si=1, No=2" << endl; cin >> risp; }while(risp!=1&&risp!=2);
cioè circondare con un ciclo la richiesta e vincolare l'uscita solo sui numeri prefissati.