• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kontrola powtórzeń nie działa

Aruba Cloud - Virtual Private Server VPS
0 głosów
141 wizyt
pytanie zadane 5 grudnia 2018 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)

Funkcja dla jednego z pól struktury losuje typ int kontrolując powtórzenia. Po uruchomieniu programu i wypisaniu wartości okazuje się że wylosowane wartości się powtarzają.

Funkcja losowania:

int losuj_liczbe(){
    int wylosowana, j;
    if (licznik ==0){
        wylosowana = rand()%10000-1000;
        tab2[licznik]=wylosowana;
    }
    else{
        while(j<=licznik) {

        wylosowana = rand()%10000-1000;

        for(j = 0; j <=licznik; j++){
            if(wylosowana == tab2[j]){
                    break;
                }
            }

    tab2[licznik+1] = wylosowana;
    }
     return wylosowana;
}
}

Dalej w programie:

//cos_tam_cos_tam

  tab2 = (int*)malloc(N*sizeof(int));
    srand(time(NULL));

    for (i = 0; i<=n; i++){
        tab[i]=(struct Struktura*)malloc(sizeof(struct Struktura));
        tab[i]->i=losuj_liczbe();
        tab[i]->c=losuj_znak();
        tab[i]->f=1000+i;
    }

Czy to przez złe umiejscowienie srand? Jest on wewnątrz innej funkcji, ale wywoływana jest tylko raz. srand powinien być wywołany w maine, jednak gdy tak zrobiłem, wszystkie wartości pola dla któego losujemy liczbę były identyczne. Co jest nie tak?

komentarz 6 grudnia 2018 przez Alan Kruszyński Obywatel (1,410 p.)
Przy okazji jak sprawdzić czy istnieje instancja klasy? if (obiekt==true) wystarczy?
komentarz 6 grudnia 2018 przez RafalS VIP (122,820 p.)
edycja 6 grudnia 2018 przez RafalS
Ciężko coś powiedzieć skoro nie wrzuciłeś całego kodu a używasz zmiennych globalnych.

Z instancjami to samo. Pokaż w kodzie co masz na mysli, bo cieżko wróżyć z fusów.
komentarz 6 grudnia 2018 przez Alan Kruszyński Obywatel (1,410 p.)

@RafalS 

Wklejam od całego programu. Pytanie odnośnie instancji to tak abstrahując od tematu, nie piszę tego w żadnym programie, ale niedługo będzie mi to potrzebne. Nie wiem jak skonstruować warunek który tworzy instancję obiektu klasy jeżeli jeszcze żadna instancja obiektu tej klasy nie istnieje np. sprawdź czy istnieje już obiekt klasy Lista. Jeśli nie, utwórz go

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <cstdlib>
#include <time.h>

struct Struktura {
    int i;
    char c;
    float f;
} ;

int N, i, licznik = 0; //licznik to dlugosc tablicy tab2
Struktura **tab;
int * tab2;
char X;



using namespace std;

void odczyt_pliku(){
    fstream plik;
    plik.open("labin01.txt", ios::in);

    if(plik.good()==false){
        cout<<"Nie udalo sie odczytac pliku lub plik nie istnieje";
        exit(0);
    }
plik >> N >> X;
plik.close();
}

int losuj_liczbe(){
    int wylosowana, j;
    if (licznik ==0){
        wylosowana = rand()%10000-1000;
        tab2[licznik]=wylosowana;
    }
    else{
        while(j<=licznik) {

        wylosowana = rand()%10000-1000;

        for(j = 0; j <=licznik; j++){
            if(wylosowana == tab2[j]){
                    break;
                }
            }

    tab2[licznik+1] = wylosowana;
    }
     return wylosowana;
}
}

char losuj_znak(){

char znaki[]="BCDEFGHIJKLMNOPQRSTUVWX";
char w_znak = znaki[rand()%(sizeof(znaki)-1)];
return w_znak;
}


Struktura ** losuj (int n){
    struct Struktura **tab = (struct Struktura**)malloc(N*sizeof(struct Struktura*));
    tab2 = (int*)malloc(N*sizeof(int));
    srand(time(NULL));

    for (i = 0; i<=n; i++){
        tab[i]=(struct Struktura*)malloc(sizeof(struct Struktura));
        tab[i]->i=losuj_liczbe();
        tab[i]->c=losuj_znak();
        tab[i]->f=1000+i;
    }
    for(i=0; i<=20; i++){
cout<<tab[i]->i<<" ";
cout<<tab[i]->c<<" ";
cout<<tab[i]->f<<endl;
    }
cout<<endl;
return tab;
}

void sortowanie(Struktura ** wsk, int rozm){
    int j;
    bool zamiana = 0;

    for (i=0; i<rozm-1; i++){

        for (j=0; j<rozm-i; j++){

            zamiana = 0;

            if (((wsk[j])->i) > ((wsk[j+1])->i)) {

                swap(wsk[j], wsk[j+1]);
                zamiana = 1;
            }
        }
        if (zamiana == 0){
            break;
        }
    }
     for(i=0; i<=20; i++){
cout<<wsk[i]->i<<endl;
    }
}

int licz_znak(Struktura ** wsk, int rozm, char znak){
    int ile_znakow = 0;
    for (i =0; i<=rozm; i++){
        if ((wsk[i]->c)==znak){
            ile_znakow++;
        }
    }
return ile_znakow;
}

void kasowanie(Struktura **tab, int *tab2, int rozm){

    for (i=0; i<N; i++){
        free(tab[i]);
    }
    free(tab);
    free(tab2);
}

int main()
{
    odczyt_pliku();
    Struktura **tablica = losuj(N);
    sortowanie(tablica, N);
    cout<<endl<<"Znak "<<X<<" wystepuje "<<licz_znak(tablica, N, X)<<" razy"<<endl;

    return 0;
}

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 166 wizyt
pytanie zadane 17 grudnia 2018 w C i C++ przez wojtas_21 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 975 wizyt
pytanie zadane 13 listopada 2017 w C i C++ przez raryk 77 Nowicjusz (160 p.)
+2 głosów
1 odpowiedź 365 wizyt
pytanie zadane 1 listopada 2017 w C i C++ przez k3ybo4rd Obywatel (1,180 p.)

93,335 zapytań

142,330 odpowiedzi

322,411 komentarzy

62,670 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...