• 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

Object Storage Arubacloud
0 głosów
117 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ź 114 wizyt
pytanie zadane 17 grudnia 2018 w C i C++ przez wojtas_21 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 699 wizyt
pytanie zadane 13 listopada 2017 w C i C++ przez raryk 77 Nowicjusz (160 p.)
+2 głosów
1 odpowiedź 311 wizyt
pytanie zadane 1 listopada 2017 w C i C++ przez k3ybo4rd Obywatel (1,180 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...