#include <iostream> using namespace std; #include <time.h> //#define NUMEROT 39 //#define ARVOTUTNUMEROT 7 //onko oltava? struct NUMEROT { //int numero=0; int arvotut[NUMEROT+1]={0}; int valitut[NUMEROT+1]={0}; int i=0; const int numerot={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39}; int arvotutnumerot={0,0,0,0,0,0,0,0}; //järkee? }; int Valikko(void); void AnnaNumerot(NUMEROT, *numerot[]); void ArvoNumerot(NUMEROT, *numerot[]); void SuoritaArvonta(NUMEROT, *numerot[]); void TalletaNumerotTiedostoon(NUMEROT, **numerot) void HaeNumerotTiedostosta(NUMEROT, **numerot) void main(void) { int valinta; int numerot; srand((unsigned) time(NULL)); while(1) { valinta = Valikko(); switch(valinta) { case 0: cout<<"Lopetit lottoamisen"; break; return 0; case 1: AnnaNumerot(numerot); break; case 2: AnnaNumerot(numerot); //uusien numeroiden syöttö break; case 3: SuoritaArvonta(numerot); break; case 4: cout <<"\nOHJEITA"; cout<<"\nPainamalla 1. pääset antamaan 7 numeroa kuin lotossa ikään."; cout<<"\nPainamalla 2. voit syöttää uudet numerot, muuten muistissa on edelliset numerot."; cout<<"\nPainamalla 3 kone arpoo 7 numeroa 39:stä ja ilmoittaa kuinka monta oli oikein."; cout<<"\nPainamalla 4 saat ohjeita"; cout<<"\nPainamalla 0 lopetetaan ohjelma."; break; default:cout<<"\nVirhe: ei ko. toimintoa!"; break; } int Valikko(void) { cout<<"VALIKKO:"<<endl; cout<<"0. Lopeta lotto"<<endl; cout<<"1. Syota numerot"<<endl; cout<<"2. Anna uudet numerot"<<endl; cout<<"3. Suorita arvonta"<<endl; cout<<"4. OHJEITA"<<endl; cout<<"\n\nValintasi: "; cin>>ws>>valinta; } void AnnaNumerot(NUMEROT, numerot[]) { for (i=0;i<ARVOTUTNUMEROT;i++) cout<<"Anna " << i+1 << ". numero: "; cin>>numero; if (numero > 39 || numero <1 || valitut[numero] ==1) { cout <<"Numerot valilla 1-39 kiitos!.\n"; i--; } else valitut[numero]=1; } for (i=0;i<ARVOTUTNUMEROT;i++) void ArvoNumerot(NUMEROT, numerot[]); { int i; for (i=0;i<10;i++) int arpa = (rand() % NUMEROT)+1; while (arpa > NUMEROT) arpa=arpa/40; if (arvotut[arpa]==1) i--; else arvotut[arpa]=1; } void SuoritaArvonta(NUMEROT); { int i; cout <<"\nAnnetut numerot: "; for (i=1;i<=NUMEROT;i++) if (valitut[i]==1) cout << i << " "; cout <<"\nArvotut numerot: "; for (i=1;i<=NUMEROT;i++) if (arvotut[i]==1) cout <<i << " "; int oikein=0; for (i=1;i<=NUMEROT;i++) if (valitut[i] == 1 && arvotut[i] == 1) oikein++; cout<<"\nSait "<< oikein <<" oikein, jatka yrittamista\n\n"; } void TalletaNumerotTiedostoon(NUMEROT, **numerot) { int i; ofstream tulos("c:\\temp\\numerot.dat", tieto); if (!tulos.is_open()) { cout<<"Tiedostovirhe, talletusta ei tehdä"; exit(-1); } for (i = 0; i < 10; i++) tulos.write((char *)&numerot[i], sizeof(int)); cout.write((char *)&numerot[i], sizeof(int)); tulos.close(); } void HaeNumerotTiedostosta(NUMEROT, **numerot) { int i; int k=0; int j=0; for (i=0;i<10;i++) { delete numerot[i]; numerot[i]=NULL; } int tieto = ios_base::binary; ifstream tiedot("c:\\temp\\numerot.dat", tieto); if (!tiedot.is_open()) { cout<<"Tiedostoa ei ole olemassa, tietoja ei loydy"; exit(-1); } for (j=0;tiedot.peek() != EOF;j++) { for (k=0;k<10;k++) if (hlo[k] == NULL) { hlo[k] = new NUMEROT; break; } if (k>=10) { cout<<"Ei mahdu"; } else { tiedot>>arvotut[k]; tiedot.ignore(2,'\n'); } } cout<<"Lottonumerot haettu\n"; tiedot.close(); }
Hmm, tuo koodi sisältää virheitä niin paljon, että taitaisi olla helpompi aloittaa koko homma alusta. Näyttää siltä, että olet ahnehtinut kerralla vähän liikaa. On järkevämpää kirjoittaa koodia vähän kerrallaan ja testata jokainen vaihe kunnolla toimivaksi ennen kuin kirjoittaa lisää. Suosittelen, että pistät kaikkien funktioiden sisällöt kommenteiksi ja yrität saada pääohjelman ensiksi toimimaan. Sen jälkeen voit seuraavaksi kokeilla valikkoa jne.
Tässä joitakin virheitä, mitä näin yleissilmäyksellä löytyy. En jaksanut ihan loppuun asti silmäillä. Kiinnitä huomiota aaltosulkujen käyttöön.
#include <iostream> using namespace std; #include <time.h> //#define NUMEROT 39 //Miksi olet laittanut nämä kommenteiksi, kun kuitenkin käytät niitä? //#define ARVOTUTNUMEROT 7 //onko oltava? struct NUMEROT { //int numero=0; int arvotut[NUMEROT+1]={0}; int valitut[NUMEROT+1]={0}; int i=0; const int numerot={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39}; int arvotutnumerot={0,0,0,0,0,0,0,0}; //järkee? }; int Valikko(void); void AnnaNumerot(NUMEROT, *numerot[]); void ArvoNumerot(NUMEROT, *numerot[]); void SuoritaArvonta(NUMEROT, *numerot[]); void TalletaNumerotTiedostoon(NUMEROT, **numerot) //Puolipisteet puuttuu void HaeNumerotTiedostosta(NUMEROT, **numerot) void main(void) { int valinta; int numerot; //Älä käytä globaalia nimeä muuttujassa srand((unsigned) time(NULL)); while(1) //Eikö olisi järkevämpää laittaa valikkoon lopetusvaihtoehto? { valinta = Valikko(); switch(valinta) { case 0: cout<<"Lopetit lottoamisen"; break; return 0; case 1: AnnaNumerot(numerot); break; case 2: AnnaNumerot(numerot); //uusien numeroiden syöttö break; case 3: SuoritaArvonta(numerot); break; case 4: cout <<"\nOHJEITA"; cout<<"\nPainamalla 1. pääset antamaan 7 numeroa kuin lotossa ikään."; cout<<"\nPainamalla 2. voit syöttää uudet numerot, muuten muistissa on edelliset numerot."; cout<<"\nPainamalla 3 kone arpoo 7 numeroa 39:stä ja ilmoittaa kuinka monta oli oikein."; cout<<"\nPainamalla 4 saat ohjeita"; cout<<"\nPainamalla 0 lopetetaan ohjelma."; break; default:cout<<"\nVirhe: ei ko. toimintoa!"; break; } //Tästä puuttuu parit aaltosulut int Valikko(void) { cout<<"VALIKKO:"<<endl; cout<<"0. Lopeta lotto"<<endl; cout<<"1. Syota numerot"<<endl; cout<<"2. Anna uudet numerot"<<endl; cout<<"3. Suorita arvonta"<<endl; cout<<"4. OHJEITA"<<endl; cout<<"\n\nValintasi: "; cin>>ws>>valinta; //Et ole esitellyt muuttujaa nimeltä 'valinta' //int-tyyppinen funktio tarvitsee saman tyyppisen paluuarvon //esimerkiksi: 'return valinta'; } void AnnaNumerot(NUMEROT, numerot[]) { for (i=0;i<ARVOTUTNUMEROT;i++) //Silmukka tarvitsee aaltosulut, joiden väliin toiminta tulee cout<<"Anna " << i+1 << ". numero: "; cin>>numero; if (numero > 39 || numero <1 || valitut[numero] ==1) { cout <<"Numerot valilla 1-39 kiitos!.\n"; i--; } else valitut[numero]=1; } for (i=0;i<ARVOTUTNUMEROT;i++) //Aaltosulut puuttuu void ArvoNumerot(NUMEROT, numerot[]); //Ei puolipistettä tähän { int i; for (i=0;i<10;i++) int arpa = (rand() % NUMEROT)+1; while (arpa > NUMEROT) arpa=arpa/40; if (arvotut[arpa]==1) i--; else arvotut[arpa]=1; } void SuoritaArvonta(NUMEROT); //Ei puolipistettä { int i; cout <<"\nAnnetut numerot: "; for (i=1;i<=NUMEROT;i++) //Aaltosulut... if (valitut==1) cout << i << " "; cout <<"\nArvotut numerot: "; for (i=1;i<=NUMEROT;i++) //Aaltosulut... if (arvotut==1) cout <<i << " "; int oikein=0; for (i=1;i<=NUMEROT;i++) //Aaltosulut... if (valitut == 1 && arvotut == 1) oikein++; cout<<"\nSait "<< oikein <<" oikein, jatka yrittamista\n\n"; } void TalletaNumerotTiedostoon(NUMEROT, **numerot) { int i; ofstream tulos("c:\\temp\\numerot.dat", tieto); if (!tulos.is_open()) { cout<<"Tiedostovirhe, talletusta ei tehdä"; exit(-1); } for (i = 0; i < 10; i++) tulos.write((char *)&numerot, sizeof(int)); cout.write((char *)&numerot, sizeof(int)); tulos.close(); } void HaeNumerotTiedostosta(NUMEROT, **numerot) { int i; int k=0; int j=0; for (i=0;i<10;i++) { delete numerot; numerot=NULL; } int tieto = ios_base::binary; ifstream tiedot("c:\\temp\\numerot.dat", tieto); if (!tiedot.is_open()) { cout<<"Tiedostoa ei ole olemassa, tietoja ei loydy"; exit(-1); } for (j=0;tiedot.peek() != EOF;j++) { for (k=0;k<10;k++) if (hlo == NULL) { hlo = new NUMEROT; break; } if (k>=10) { cout<<"Ei mahdu"; } else { tiedot>>arvotut; tiedot.ignore(2,'\n'); } } cout<<"Lottonumerot haettu\n"; tiedot.close(); }
Lisäksi: käytä kooditagia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.