Wątek przeniesiony 2016-08-10 14:26 z C/C++ przez ŁF.

Losowanie bez powtorzen daczego moje liczbo sa rowne 0

0
#include <iostream>
#include <time.h>
#include <cstdlib>
using namespace std;
int losowanie(int liczba_wylosowana) {
  liczba_wylosowana = rand() % 10 + 1;
  return liczba_wylosowana;
}
bool warunek(int pojemnik_2[5], int liczba_1) {
  for (int i = 0; i <= 5; i++) {
    if (liczba_1 == pojemnik_2[i]) return false;
  }
  return true;
}
int main() {
  srand(time(NULL));
  cout << "Wylosuje liczbe od 1 do 10:" << endl;
  int pojemnik[5];
  int liczba = 0;
  int i = 0;
  do {
    i++;
    losowanie(liczba);
    warunek(pojemnik, liczba);
    pojemnik[i] = liczba;
    cout << pojemnik[i] << ",";

  } while (i != 5);

  return 0;
}
1
int liczba = 0;

pozniej nigdzie nie zmieniasz tej zmiennej

pojemnik[i] = liczba;

a Twoja funkcja losujaca niby cos tam zwraca ale nigdzie tego wyniku nie przypisujesz

z uwag ogolnych

  1. nie korzystaj z tablic, od tego masz std::vector czy std::array
  2. nie time.h tylko ctime
  3. rand jest obsolete. Zobacz sobie (mozesz sam sprawdzic) jak sie robi to od C++11
1

Przypisz do jakiejś zmiennej pseudolosową liczbę zwróconą przez funkcję losowanie().
warunek(pojemnik, liczba); - tu pewnie też będziesz się dziwił, że nie działa, a tymczasem nic nie robisz z otrzymanym wynikiem.

Na przyszłość:

  • nazywaj wszystko po angielsku
  • funkcje coś robią, więc w nazwie ma być czasownik + określenie do czego się odnosi czynność, a nie sam rzeczownik, np. wylosuj (getRandomNumber), sprawdźWarunek (checkCondition). Przy czym ta ostatnia nazwa jest też słaba, bo nie wiadomo na co ten warunek, więc najlepiej checkIfTableContainsNumber.
1
  1. Przekazywanie parametru przez wartość i referencję koniecznie przeczytaj bo wyraźnie nie rozumiesz
  2. słabe nazwy zmiennych
  3. co robi warunek w main? (nic, ignorujesz wartość zwracaną przez funkcję)
  4. ignorujesz wartość zwracaną przez losowanie
  5. losowanie bez powtórzeń na małych zbiorach najłatwiej (ale niekoniecznie najwydajniej) jest zrobić mieszając kontener z pożądanymi liczbami i biorąc z niego n pierwszych liczb
1

pojemnik[i] = liczba; a to dlaczego sie nie przypisuje

Ależ przypisuje się:

  int liczba = 0; // liczba == 0
  do {
    i++;
    losowanie(liczba); // nadal liczba == 0, bo ani do funkcji nie przekazujesz referencji, ani nie używasz wartości przez funkcję zwróconej
    warunek(pojemnik, liczba); // liczba == 0
    pojemnik[i] = liczba; // liczba == 0, więc pojemnik[i] = 0

Amen.

0

no ale program dalej powtarza liczby..dlaczego przy warunku return false ..program zapisuje i wpypisuje ta liczbe

0

A gdzie sprawdzasz ten warunek? I gdzie powtarzasz szukanie w przypadku, gdy wylosowałeś​ już znalezioną?

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