C++ Zwracanie wartości przez funkcję.

0

Witam, mam pewien problem, poniżej wklejam kod do programu, problem polega na tym, że funkcja szukaj_c wypisuje złe c. W tablicy "pierwsze" znaduje sie 5 liczb - 2,3,5,7,11 w tablicy "czynniki" znajdują się 3 liczby - 2,2,3 - sprawdzałem tablice wypisują własnie te liczby i zarówno zmienna "ile" - mowiaca ile jest liczb w tablicy "pierwsze" jak i zmienna "ilosc_czynnikow" mowiaca ile jest liczb w tablicy "czynniki" też jest wypisywana dobrze. Funkcja szukaj_c "leci" po tablicach i szuka liczby ktora znajduje sie w tablicy "pierwsze" a nie znajdue sie w talblicy "czynniki" i kiedy znajdzie jest break. Jednak po odpaleniu programu w konsoli pojawia sie: nasze c: 3, nasze c:3 , tak dwa razy. Probowalem juz na pare sposobów, zmieniac void na int i zwracać wartość potem jeszcze inaczej i caly czas mam ten problem. Chodzi o to zeby funkcja szukaj_c znalazła c, powinna znaleźć liczbe - 5 i poźniej ta 5 powinna byc podstawiona to wzoru na końcu kodu. Bardzo proszę o pomoc.

 #include <iostream>

using namespace std;



int c;
void szukaj_c(int m,int ile,int x_max,int ilosc_czynnikow,int czynniki[],int pierwsze[])  //TUTAJ FUNKCJA SZUKAJ_C //
{
	int i = 0;
	int j = 0;
	
	do
	{
		if (pierwsze[i] != czynniki[j])
		{
			c = pierwsze[i];
			break;
		}
		i++;
		j++;
	} while (i != ile || j != ilosc_czynnikow);
	
	cout << "Nasze c: " << c << endl;
}

int szukaj_a(int m,int ab)
{
	int u = 1, w;
	
	while (u < m)
	{
		w = m / u;
		if (m%u == 0)
		{
			while (ab <= m + 1)
			{
				if ((ab - 1) % w == 0 && ab>m)
				{
					
					cout << "Nasze a: " << ab << endl;
					return ab;
					break;
				}
				ab++;
			}
		}
		ab = 1;
		u++;
	}
	
	
	
}


int main()
{
	int x_max, m;
	int ilosc_czynnikow = 0;
	int ile = 0;
	cout << "Podaj x_max: ";
	cin >> x_max;
	m = x_max + 1;
	int* czynniki = new int[m / 2];
	int* pierwsze = new int[m];

	cout << "M(zakres) wynosi: " << m << endl;
	cout << "Rozklad na czynniki pierwsze liczby " << m << ": ";

	int k = 2;

	int i = 0;
	while (m>1)
	{
		while (m%k == 0) //dopóki liczba jest podzielna przez k
		{
			cout << k << " ";
			m /= k;
			czynniki[i] = k;
			i++;
			ilosc_czynnikow++;
			
		}
		++k;


	}


	cout << endl;
	
	unsigned int lp, p, d;

	bool t;
	m = x_max + 1;
	ile = 0;
	int l = 0;
	lp = 0;
	p = 2;
	
	cout << "Liczby pierwsze z zakresu od 0 do m: ";
	for (int i = 0; i < m - 1; i++)
	{
		t = true;
		for (d = 2; d <= p / 2; d++)
			if (p % d == 0)
			{
				t = false;
				break;
			}
		if (t)
		{
			cout << p << " ";
			pierwsze[l] = p;
			l++;
			ile++;

		}

		p++;

	}
	cout << endl;


	
	szukaj_c(m, ile, x_max, ilosc_czynnikow, czynniki,pierwsze);  //TUTAJ WYWOLANIE FUNKCJI//
	cout << "Nasze c: " << c << endl;
	
	int ab = 1;
	szukaj_a(m,ab);
	
	int *x;
	x = new int[m];
	x[0] = 0;
	
	int *wyniki;
	wyniki = new int[m];
	
	cout << "x[0]=0" << endl;
	for (int i = 1; i < m; i++)
	{
		x[i] = ((ab*x[i - 1]) + c) % m;                    //TUTAJ MA BYC PODSTAWIONE ZNALEZIONE C//
		cout << "x[" << i << "] = " << x[i] << endl;
		wyniki[i] = x[i];
	
	}
	
	int r = 10, s = 7, m2 = 128;
	cout << endl;
	
	
	cout << "-------------------" << endl;
	cout << "      PUNKT NR 2   " << endl;
	cout << "-------------------" << endl;

	for (int i = 1; i <= r;i++)
	{
		wyniki[i] = (wyniki[(r - s + i) % r] + wyniki[i]) % m2;
		
		cout << "Fib[" << i << "] = " << wyniki[i] << endl;
	}
	
	system("pause");
	return 0;
}
4

Nie chce mi się sprawdzać całości kodu, ale co mogę powiedzieć po obejrzeniu szukaj_c:

  1. Używaj biblioteki standardowej. Kod będzie czytelniejszy, wydajniejszy i pozbawiony głupich błędów. Bardzo polecam obejrzenie https://channel9.msdn.com/Events/GoingNative/2013/Cpp-Seasoning
  2. niepotrzebnie masz i i j jako osobne zmienne. Tzn może dobrze myślisz, ale w obecnej implementacji one mają zawsze identyczne wartości,
  3. jeśli ile i ilosc_czynnikow (przy okazji: gratuluję konsekwencji w nazewnictwie, oraz użycia ile "ilość" zamiast "liczba") są różne pętla nigdy się nie skończy i wyjdziesz poza zakres jednej z tablic - UB,
  4. porównujesz tylko n-ty czynnik z n-tą liczbą pierwszą, więc jeśli czynniki będą w nieodpowiedniej kolejności to ich nie znajdziesz,
  5. nie używaj zmiennych globalnych, niech funkcja coś zwraca
0

Zmieniłem funkcję szukaj_c na taką postać, wszystko działa, dziekuję za pomoc :) :

int szukaj_c(int m, int ile, int x_max, int ilosc_czynnikow, int czynniki[], int pierwsze[])
{
	int cc;
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (pierwsze[i] != czynniki[j] && pierwsze[i]!=x_max)
			{
				c = pierwsze[i];
				break;
			}
		}
	}

	return c;
}
0

Już to zmieniłem, na zmienne i też wszystko działa ;)

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