Kod: Zaznacz cały
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
void losowe_liczby (int *wskaz, int ile, int przedzial, int a);
int main()
{
std::cout << "Program wylosuje okreslona ilosc licz bez powtorzen"<<std::endl<<std::endl;
int a, b, ile, przedzial;
do{
std::cout << "Podaj 'a' i 'b' aby okreslic przedzial [a...b]: ";
std::cin>>a>>b;
if(a >= b){
std::cout<<"'a' nie moze byc wieksze badz rowne 'b'. Podaj a i b jeszcze raz."<<std::endl;
Sleep(3000);
system("cls");
}
}while(a>=b);
przedzial=b-a;
std::cout<<"Wybrany przez Ciebie przedzial to: ["<<a<<"..."<<b<<"]"<<std::endl<<std::endl;
std::cout<<"Liczby maja byc bez powtorzen a wiec nie moze byc ich wiecej niz: "<< b-a+1 <<std::endl<<std::endl;
do{
std::cout <<"Podaj ile liczb z tego przedzialu chcesz wylosowac: " ;
std::cin >> ile;
if(ile < 1 || ile > b-a+1){
std::cout<<"Ilosc liczb do wylosowania nie moze byc mniejsza od 1 i wieksza od: "<<b-a+1<<std::endl;
std::cout<<"Podaj ilosc liczb jeszcze raz."<<std::endl;
Sleep(2000);
}
}while(ile < 1 || ile > b-a+1);
int *tablica;
tablica = new int [ile];
int *wskaznik = tablica;
losowe_liczby (wskaznik, ile, przedzial, a);
delete [] tablica;
}
void losowe_liczby (int *wskaz, int ile, int przedzial, int a){
srand(time(0));
for(int nr_indeksu = 0; nr_indeksu < ile; nr_indeksu ++){
*wskaz = rand()%przedzial + a;
/*
int stala = *wskaz; //zapisuje wartosc *wskaz czyli tablicy dla jakiegos indeksu do: stala
wskaz = wskaz - nr_indeksu; //wskaznik jest teraz na zerowym indeksie tablicy
for(int j = 0; j < nr_indeksu; j ++){
if(stala == *wskaz){
wskaz--;
break;
}
wskaz++;
}
*/
std::cout<<nr_indeksu+1<<" liczba: "<<*wskaz<<" "<<std::endl;
wskaz ++;
}
}
To w komentarzach to próba napisania funkcji aby liczby się nie powtarzały, jednak dla wskaźników nie wygląda to tak kolorowo jak mi się wydawało, zdaje sobie sprawę ze ta funkcja nie ma za bardzo sensu bo wskaźnik raczej nie wraca na swoje miejsce - 1, czasami tak się zdarzy..czasami + funkcja wykonuje się 'ile' razy, próbowałem zmniejszać nr_indeksu ale to też nie pomaga, czasami tylko wypluwa dziwne liczby i losowań jest za dużo, co jest logiczne.
Reasumując, raczej nie mam dobrego pomysłu napisania tego.
A teraz napisze ten pomysł:
mam jakąś liczbę dla danego wskaźnika po czym sprawdzam wcześniejsze zmniejszając wskaz do 0, probowałem zrobić tak, że jeśli liczba się powtórzy to zwraca on wskaz-1 względem tego, który był przed operacją przypisania go do zera, ciężko mi to sensownie opisać, ale wydaje mi się że myślę dobrze, jednak zostaje problem wykonywania się pętli 'ile' razy.
Możecie mi przybliżyć jak to osiągnąć?
-- 1 kwi 2016, o 19:55 --
Mam jeszcze pytanie:
dlaczego zwracanie zera w mainie jest złym pomysłem, sam C++ narzuca nam aby zwracać zero, jeśli to nie jest odpowiednie, to co powinno się tam znajdować?