Problemy ze zrobieniem funkcji.

0

Cześć potrzebuję pomocy jak w tym kodzie zrobić reszte funkcji które powinny odpowiadać za podanie liczby przez użytkownika oraz losowaniu liczb. Udało mi się zrobić funkcję porównująca obie tablice. Jednak z tymi pozostałymi funkcjami coś mi nie idzie.

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

int liczbyg[6];
int z;
int i;





 int compare( int liczbyg[], int wylosowane[] ) {
    int punkty = 0;
    for( int i = 0; i < 5; i++ ) {
        for( int k = 0; k < 5; k++ ) {
            if( liczbyg[ i ] == wylosowane[ k ] ) punkty++;

        }

    }
    return punkty;
}

int main()

{
cout <<"Podaj zakres liczbowy:"<<" ";
cin >>z;

cout <<"Podaj"<<" "<<i+1<<" "<< "liczbe"<<endl;

        cin >> liczbyg[i];



for(int i=0;i<6;i++)
{

cout <<"Podaj"<<" "<<i+1<<" "<< "liczbe"<<endl;

        cin >> liczbyg[i];
}

cout <<"Wybrane liczby:"<<"";
for(int i=0;i<6;i++)
{
    cout <<" "<<liczbyg[i];
}
srand(time(NULL));

int ile_pytan = z;
int ile_wylosowac= 6;
int ile_juz_wylosowano=0;
int*wylosowane= new int[ile_wylosowac+1];
bool losowanie_ok;

for (int i=1; i<=ile_wylosowac; i++)
{
    do
    {
        int liczba=rand()%ile_pytan+1;
        losowanie_ok=true;

        for (int j=1; j<=ile_juz_wylosowano;j++)
        {

        if(liczba==wylosowane[j])losowanie_ok=false;
        }
        if(losowanie_ok==true)
        {

         ile_juz_wylosowano++;
         wylosowane[ile_juz_wylosowano]=liczba;
        }
    }while(losowanie_ok!=true);
}


    cout<<endl<<"Wylosowane liczby:";
    for(int i=1; i<=ile_wylosowac;i++)
    {
        cout<<wylosowane[i]<<" ";

    }



    cout <<endl<<"Trafiono"<<" "<<compare( liczbyg, wylosowane )<<" ""liczb" << endl;

   return 0;
}
0

Ten kod ma tyle problemów, że nawet nie wiem od czego zacząć. Może zacznijmy od tego, że na razie nic namacalnie Ci się nie udało, bo ten kod nie działa, poniższa pętla

for (int j=1; j<=ile_juz_wylosowano;j++)

będzie się wykonywała w nieskończoność, bo ile_juz_wylosowano zawsze będzie wynosiła zero w tym miejscu. Proste przeniesienie inkrementacji przed pętle jak niżej

ile_juz_wylosowano++;
for (int j=1; j<=ile_juz_wylosowano;j++)

nie pomoże za wiele, bo powinieneś dostać segfualt w takim przypadku, jeśli mnie oczy nie mylą.

Napraw te dwa problemy, to wtedy możemy pogadać o wydzialaniu funkcji. BTW ich implementacja już jest w kodzie, także jeśli samodzielnie zrobiłeś funkcję porównującą, to powinieneś już wiedzieć jak zrobić pozostałe dwie.

1

W przypadku kodowania zestawu liczb na bitach oraz rozbicia na funkcje, da się całość uprościć:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

const unsigned VALUES=6;

unsigned InputData(const char *prompt,size_t min,size_t max)
{
	while(true)
	{
		cout<<prompt<<": ";
		unsigned ret;
		if(cin>>ret)
		{
			if((min<=ret)&&(ret<=max)) return ret;
			cout<<"Niepoprawny zakres"<<endl<<endl;
		}
		else
		{
			cout<<"To nie jest liczba"<<endl<<endl;
			cin.clear();
			while(cin.get()!='\n') {}
		}
	}
}

unsigned BitsCount(unsigned ValuesSet)
{
	size_t ret=0;
	for(;ValuesSet;++ret) ValuesSet&=(ValuesSet-1);
	return ret;
}

unsigned Compare(unsigned a,unsigned b)
{
	return BitsCount(a&b);
}

void ShowValuesSet(unsigned values)
{
	bool first=true;
	for(int i=0;values;++i)
	{
		if(values&(1<<i))
		{
			values&=(values-1);
			if(first) first=false;
			else cout<<", ";
			cout<<(i+1);
		}
	}
	cout<<endl;
}

unsigned RandValuesSet(unsigned range) // zestaw 1,3,5,6,7 = 0b1110101
{
	unsigned ret=0;
	for(size_t v=0;v<VALUES;v=BitsCount(ret))
	{
		ret|=(1<<(rand()%range));
	}
	return ret;
}

unsigned InputValuesSet(unsigned range)
{
	unsigned ret=0;
	for(size_t v=0;v<VALUES;v=BitsCount(ret))
	{
		unsigned value=InputData("Podaj liczbe",1,range);
		if(ret&(1<<(value-1))) cout<<"Liczba "<<value<<" juz byla podana wczesniej"<<endl<<endl;
		ret|=(1<<(value-1));
	}
	return ret;
}

int main()
{
	srand(time(NULL));
	unsigned range=InputData("Podaj zakres",VALUES,64);
	unsigned inputset=InputValuesSet(range);
	unsigned randset=RandValuesSet(range);
	cout<<"Wylosowano: ";
	ShowValuesSet(randset);
	cout<<"Wprowadzono: ";
	ShowValuesSet(inputset);
	cout<<"Trafiono: "<<Compare(randset,inputset)<<endl;
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1