Newsgroup: it.comp.lang.c++
Titolo: Consigli suggerimenti per il primo programma c++ scritto

visto che mio padre premeva per avere un controllo delle vincite enalotto
automatiche per non doversi guardare 20 biglietti a mano mi sono deciso di
scrivegli un piccolo proogrammino ... ora giudicate voi e datemi nuovi
suggerimenti se mi sono dimenticato allocazioni controlli di errore ed altro
... almeno cresco sempre piu' ... e non si sa mai che serva anche a voi ;-)
ciao a tutti
ps. e' il mio primissimo programma scritto in c++ giudizi ;-), pacchette
sulla spalla ??? :-p
---------begin code------------------
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct lotto
{
 int num[6];
};
int main(int argc, char *argv[])
{
 vector<lotto> giocata;
 giocata.reserve(1000);
 lotto estrazione = {0,0,0,0,0,0};
 ifstream in;
 char buff[200] = "";
 in.open("enalotto.csv",ios::in);
 if (in.rdstate())
 {
  in.close();
  cerr << "Non trovato enalotto.csv file !" << endl;
  return 1;
 }
 while (!in.eof())
 {
  lotto lettura = {0,0,0,0,0,0};
  for (int i=0;i<5;i++)
  {
   in.getline(buff,190,';');
   if (in.eof()) break;
   lettura.num[i] = ((0 < atoi(buff) < 91) ? atoi(buff) : 0 );
   buff[0] = '\0';
  }
  if (in.eof()) break;
  in.getline(buff,190);
  lettura.num[5] = ((0 < atoi(buff) < 91) ? atoi(buff) : 0 );
  buff[0] = '\0';
  if (lettura.num[0] == 0 ||lettura.num[1] == 0 ||lettura.num[2] == 0 ||
  lettura.num[3] == 0 ||lettura.num[4] == 0 ||lettura.num[5] == 0) break;
  else giocata.push_back(lettura);
 }
 in.close();
 if (!giocata.size()) {cerr << "File enalotto.csv vuoto o corrotto !" <<
endl;return 1;}
 while(estrazione.num[0] == 0 || estrazione.num[1] == 0 || estrazione.num[2]
== 0 ||
 estrazione.num[3] == 0 || estrazione.num[4] == 0 || estrazione.num[5] == 0)
 {
  cout << "Inserire i numeri dell'estrazione nel formato : n n n n n n , e
devono essere compresi tra 1 e 90\n" << endl;
  for (int i=0;i<5;i++)
  {
   cin.getline(buff,190,' ');
   estrazione.num[i] = ((0 < atoi(buff) < 91) ? atoi(buff) : 0 );
   buff[0] = '\0';
  }
  cin.getline(buff,190);
  estrazione.num[5] = ((0 < atoi(buff) < 91) ? atoi(buff) : 0 );
 }
 cout << "\n\n" << endl;
 int trovato = 0;
 for (int find=0,i=0;i<giocata.size();i++)
 {
  for (int j=0;j<6;j++)
  for (int y=0;y<6;y++)
  if (giocata[i].num[j] == estrazione.num[y]) find++;
  if (find == 3) {cout << "Terno nella giocata : \t"; trovato++;}
  if (find == 4) {cout << "Quaterna nella giocata : \t"; trovato++;}
  if (find > 4) {cout << "Bingo siamo miliardari nella giocata : \t";
trovato++;}
  if (find > 2) {for (int j=0;j<6;j++) cout << giocata[i].num[j] <<
'\t';cout << "\n\n" << endl;}
  find = 0;
 }
 if (trovato == 0) cout << "Mi spiace ritenta la fortuna alla prossima
estrazione !!!\n\n" << endl;
 cout << "Finita la computazione !\n\n" << endl;
 giocata.clear();
 system("PAUSE");
 return 0;
}
-------------end code--------------

    lettura.num[i] = ((0 < atoi(buff) < 91) ? atoi(buff) : 0 );
                                 ^^^^^^^^^^^^^^
Cosě non verifichi che atoi(buff) sia compreso tra 0 e 91: quello che
succede č verificare che 0 (false) sia < del risultato dell'espressione
atoi(buff) < 91, mi sembra strano che non ti abbia dato nessun warning.
Ciao

 ha scritto nel messaggio
news:bfv281$1kc$1...@news.ngi.it...


 Ciao
no nessun warning ... ma mi sono accorto che senza parentesi malfunzionava
quel pezzo ... ora che mi ci fai pensare lo cambiero' ... ero abituato al
php dove quell'espressione e' legale e testa che un risultato stia in un
range ...
vabbe ora lo vambio in :
atoi(buff) > 0 && atoi(buff) < 91
ah se sai ... se io uso 3 volte atoi sul buff selo ottimizza gia' il
compilatore da usare 1 sola variabile o sarebbe meglio come in php
appoggiarsi prima ad una variabile e poi usare solo lei senza chiamare 3
volte una funzione ???
ciao

 Grazie....
scusa ... spiegartelo in che modo ??? riga per riga o solo a grandi linee
quello che fa ???
nella prima ipotesi cmq fai prima a prenderti in mano un manuale c++ e
dargli una studiata prima di leggere codice scritto da altri ;-) solo un
consiglio ... anche solo perche' poi in molti usiamo feature speciali del
c/c++ che rendono la vita difficile in lettura ...
vedi come es: la doppia inizzializzazione fatta sulla creazioen del ciclo
for ... o altri tipi di inline aggressivo e rottura cicli ... sono cose
abbastanza ostiche all'inizio della vita di un programmatore ed e' meglio
incominciare a leggere esempi di un libro in cui lo scrittore spiega
approfonditamente il tutto separando tutte le istruzioni cosi da rendere la
lettura meno stressante.
cmq il mio codice e' molto semplice come comprensione, se noti ho fatto in
modo di non usare puntatori perche' inutili secondo me in questo programma.
ora aspetto una tua risposta per capire un po meglio cosa stai cercando ...
ciao

 -------------end code--------------
-- 
'cause nothin' lasts forever

 > -------------end code--------------
scusami ??? mica sono forzato ad usare classi per un programma banale ... e
cmq se noti ha gia' la sua struct o class chiamala come vuoi ...
come sai e come leggo sempre piu' spesso e' meglio non forzarsi ad usare
classi quando non sene ha bisogno o non sene vede il motivo.
e poi la vector e' gia' una classe io la ho usata :-p anche la f/stream :-p
io piu' che altro non volevo consigli su ma perche' non hai fatto tutto a
classi o altro ... mi serviva sapere se l'implementazione cosi' e' buona
c'erano errori di buffer o lettura ecc ... cioe' cercavo di vedere piu' che
altro se ho capito bene come programmare in modo sicuro con i/o.
ciao

 volte una funzione ???
Questo non te lo so dire con esattezza, comunque non credo: in generale, in
qualunque espressione è bene non utilizzare la stessa chiamata a funzione
più di una volta, perchè potrebbe ritornare risultati diversi (e per questo
motivo non credo che venga fatta l'ottimizzazione che dici). Credo che lo
standard definisca una situazione di questo tipo come un undefined
behaviour, ma non sono certo neanche di questo. Occhio comunque che in
generale le ottimizzazioni che vengono fatte da un compilatore possono non
essere fatte da altri, quindi è bene programmare senza adagiarsi troppo su
queste supposizioni.
Scusa, non ho tempo di esaminare il resto del codice in dettaglio, magari
nei prossimi giorni gli do un'occhiata.
Ciao

 ha scritto nel messaggio
news:bfv281$1kc$1...@news.ngi.it...
scusate se mi auto replico anche ... ma volevo sapere:
e' meglio usare exit(1); per terminare il mio main, o va benissimo il modo
che ho usato con il return 1; ???
pregi e difetti di entrambi, differenze ???
cmq io avevo pensato di usare sempre il return perche' magari un domani
basta rinominare il main e si puo' includere il programma in un altro
programma senza toccare null'altro ... o magari toccando solo le chiamate
cout, che se non sbaglio sono facilmente overloadabili quindi controllabili
da un programma superiore no ???
ciao

No dicevo a grandi linee, tipo l'uso di Vector, fstream.
Io so programmare in pascal e varie cose so farle in c++, infatti ci sto
studiando,
però non so usare ancora molte librerie.


 però non so usare ancora molte librerie.
bhe per la standard template library e' meglio che ti procuri una lettura
... spiegarla a parole non e' semplicissimo ...
ti posso dire che sono piu' librerie che contengono oggetti scritti in
template per uso generico, forse e' meglio se leggi il Think in C++ volume 2
che parla di questa libreria ... e sono piu' o meno 1000 pagine, quindi vedi
anche dasolo che parlarne via newsgroup sarebbe un poco generico ed
approsimativo.
cmq in parole povere la classe vector si comporta uguale ad un array, ma
dinamico.
e le classi stream sono come dire dei file, ma file generici che puoi usare
per molta roba.
ciao

 ha scritto nel messaggio
news:bfv281$1kc$1...@news.ngi.it...
altro problema che ho riscontrato nel mio programma ... come faccio a sapere
quando l'input e' finito ??? testo l'eof anche sugli standard input ??? o
che metodo uso ???
ciao