Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tähän koodiin tarvitsisi apua toimiakseen

Raezor [15.12.2003 16:09:59]

#

#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();
}

Meca [15.12.2003 21:05:41]

#

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();
}

thefox [15.12.2003 22:25:57]

#

Lisäksi: käytä kooditagia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta