- wprowadza się początek i koniec przedziału (std::cin)
- wykonywana jest "funkcjaKontrolna" wykorzystująca dwa argumenty wcześniej wprowadzone (tj. początek i koniec przedziału). W skrócie ta funkcja TYLKO dodaje na zasadzie +1 od początku do końca przedziału. Dlaczego? Ponieważ ilość elementów tablicy i ich suma muszą się zgadzać z tą, która później zostanie odpalona.
- wykonywana jest funkcja "losujBezPowtorzen" z tymi samymi argumentami, tylko że tym razem nie ma dodawania, ale faktycznie wymuszam na funkcji rand() aby wylosowała mi dokładnie te liczby które chce - tj. rand() losuje tak długo, aż wylosuje liczbę której wcześniej nie było. Innym słowy funkcja "ma dosyć łatwo" na początku, ale już przy losowaniu ostatniej liczby ma tylko 1 prawidłową liczbę do wylosowania. Ilość elementów i suma elementów zawsze będzie się zgadzać z tą z "funkcjaKontrolna".
Uwagi
- Użyłem goto aby wyjść z wielokrotnie zagnieżdżonej pętli
Dla tych co mają dużo wolnego czasu: jak mógłbym ulepszyć swój kod?
Z góry dzięki za pomoc.
#include "stdafx.h"
#include <iostream> //std:cout + cin
#include <conio.h> //_getch()
#include <cstdlib> //pseudolosowe liczby calkowite
#include <ctime> //time();
using namespace std;
void funkcjaKontrolna(int k_poczatek, int k_koniec)
{
cout << "FUNKCJA KONTROLNA, bez losowania, jej wyniki musza byc takie same jak w funkcji wlasciwej" << endl;
const int iloscElementow = (k_koniec - k_poczatek) +1;
int tablicaKontrolna[1000];
for (int a=0 ; a<iloscElementow ; a++)
{
tablicaKontrolna[a] = k_poczatek;
k_poczatek++;
cout << "\tElement\t\t" << a << "\ttablicy ma wartosc:\t" << tablicaKontrolna[a] << endl;
}
int suma = 0;
for(int a=0; a<iloscElementow ; a++)
{
suma = suma + tablicaKontrolna[a];
}
cout << "\tIlosc elementow przedzialu to:\t\t\t\t" << iloscElementow << endl;
cout << "\tSuma wartosci elementow tablicy to:\t\t\t" << suma << "\n\n";
return;
}
void losujBezPowtorzen(int* tablicaZewn, int poczatekPrzedzialu, int koniecPrzedzialu, int *wsk_iloEle, int *wsk_sumEle)
{
cout << "FUNKCJA WLASCIWA, losuje w oparciu o rand()" << endl;
*wsk_iloEle = (koniecPrzedzialu - poczatekPrzedzialu) +1;
int stash;
for (int b=0 ; b<*wsk_iloEle ; b++)
{
wroc:
stash = ((rand() % *wsk_iloEle) + poczatekPrzedzialu);
if(b!=0)
for(int d=0; d<b ; d++)
{
if(stash == tablicaZewn[d])goto wroc;
}
tablicaZewn[b] = stash;
cout << "\tElement\t\t" << b << "\ttablicy ma wartosc:\t" << tablicaZewn[b] << endl;
}
int sumaa = 0;
for (int c=0 ; c<*wsk_iloEle ; c++)
{
sumaa = sumaa + tablicaZewn[c];
}
*wsk_sumEle = sumaa;
cout << "\tIlosc elementow przedzialu:\t\t\t\t" << *wsk_iloEle << endl;
cout << "\tSuma wartosci elementow tablicy:\t\t\t" << *wsk_sumEle << endl;
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << "******************************************\n\n\tkvsnagi prodakszyns prezents:\n\trandom function without repeating\n\n******************************************\n\n\n" ;
srand(time(NULL));
int poczatekPrzedzialu, koniecPrzedzialu;
cout <<"FUNKCJA MAIN\n\tWprowadz poczatek i koniec przedzialu,\n\tpamietaj ze max. rozmiar tablicy to 1000,\n\ta wiec nie elementow nie moze byc >1000" << endl;
cout <<"\n\tWprowadz poczatek przedzialu:\t";
cin >> poczatekPrzedzialu;
int kontrola=0;
do
{
kontrola = 0;
cout <<"\tWprowadz koniec przedzialu:\t";
cin >> koniecPrzedzialu;
if(poczatekPrzedzialu > koniecPrzedzialu || poczatekPrzedzialu == koniecPrzedzialu)
{
cout << "\tKoncowa wartosc przedzialu musi byc wieksza niz poczatkowa wartosc." << endl;
kontrola = 1;
}
}
while(kontrola==1);
cout << endl;
funkcjaKontrolna(poczatekPrzedzialu, koniecPrzedzialu);
int tablica[1000];
int iloscElementow;
int *wsk_iloEle = &iloscElementow;
int sumaElementow;
int *wsk_sumEle = &sumaElementow;
losujBezPowtorzen(tablica, poczatekPrzedzialu, koniecPrzedzialu, wsk_iloEle, wsk_sumEle);
_getch();
return 0;
}