Sprawdzenie kodu i pomoc

0

Cześć, przepraszam że kolejny temat ale do poprzedniego nie mam dostępu (usunięte czy coś a widać go).

  1. Pytanie w kodzie
  2. Druga sprawa jest taka że to generuje 60x nazwe/imie/haslo a do notatnika zapisuje tylko jedno z tych. Jak temu zaradzić ?
  3. Jak zrobić żeby to dawało liczby min. 5 cyfrowe do 7 cyfrowych bo aktualnie wygląda to tak że da np. nazwaXXX a ma dawać nazwaXXXXX (X- to liczby).

Z góry dziękuję za jakąkolwiek pomoc :)

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

using namespace std;
class losuj{
    public:
    int cyfry;
    losuj(){
        srand(time(NULL));
        for(int i=1;i<60;i++){ <-- Generuje max. 60 razy a gdy wpiszę tam np. 65 to zrobi 60 i cmd się zatnie
            cyfry= rand()%(9999999)+1;
            cout<<"nazwa"<<cyfry<<endl;
            cout<<"imie"<<endl;
            cout<<"haslo"<<endl;
  fstream plik;
        plik.open("konto.txt",ios::out);
        plik<<"nazwa"<<endl;
        plik<<"imie"<<endl;
        plik<<"haslo"<<endl;
        plik.close();
        }
    }
};
int main()
{
   losuj start;
   getch();
   return 0;
}
2
  1. Przy każdej iteracji pętli otwierasz plik i piszesz. Spróbuj otworzyć go raz, przed pętlą i zamnąć po. Ewentualnie możesz poeksperymentować z flagami przy otwieraniu.
    http://www.cplusplus.com/reference/fstream/fstream/open/

  2. setfill ustawia czym ma wypełniać puste miejsce, setw ustawia szerokość(ilość znaków) jaką ma zająć value. value to zmienna, w Twoim przypadku będzie cyfry

cout << setfill('0') << setw(5) << value;
0

Naprawiłem, przeczytałem coś na forum
ios::out | ios::trunc – zawartość pliku zostanie usunięta przed zapisem
ios::out | ios::app – informacja zostanie dopisana na końcu istniejącego pliku

Zamiast fstream plik( "plik.txt", ios::app ); miałem dane fstream plik( "plik.txt", ios::out ); i dlatego plik zapisywał tylko jedną rzecz a usuwał inne.. On po prostu wszystko po kolei dodawał, usuwał a ostatnia formuła została w pliku bo nic jej nie usunęło.. Hura jaa ^^

Teraz zostaje tylko problem z liczbami.. żeby generował co najmniej 5 a max 7

1

Teraz zostaje tylko problem z liczbami.. żeby generował co najmniej 5 a max 7

Losuj od 10000 do 9999999, albo użyj std::setw oraz std::fill jak sugeruje @Grzyboo.

0

Dobry pomysł, ale wskaż mi miejsce w kodzie gdzie to napisać :/
Chyba że ktoś ma taki generator który jest wyposażony w przedział do ustawienia np. od 5 cyfrowej liczby do 8 cyfrowej.

1

https://msdn.microsoft.com/en-us/library/bb982398.aspx#code

...lub std::rand i liczysz ręcznie:
Prosta matematyka - chcesz liczbę z przedziału od 10 do 20, a std::rand zwraca od 0, wiec liczysz
od 10 do 20 włacznie jest 11 liczb (20 - 10 + 1).
losujesz wartość std::rand() % 11, np. 7
i do tej liczby dodajesz liczbę dolnej granicy (7 + 10 = 17).
https://m.youtube.com/watch?v=REQVOGiXplU&t=3s

0

A jak chcę liczbę z przedziału 100000 do 99999999 ? :P

0

Nie wiem czy dobrze to napisałem. Chcę żeby bot losował liczbę min. 100000 a max. 99999999.. Np. 18427732 / 827328 / 9037182

1

W czym masz problem? Nie umiesz dodawać i odejmować?
Spróbuj napisać wg wskazówek i wstaw gdyby nie szło.

BTW: Nie masz tam przypadkiem kolizji nazw. Klasa i metoda mają taką samą nazwę.

0

Nie pojmuje tego..
(99999999 - 100000 + 1)= 99 900 000
i co dalej?

Edit: Kolizji ? W build log nie ma żadnego błędu

1

Masz już przedział.

start = 100000
stop = 99999999
przedział = stop - start + 1
wylosowana liczba = rand() % przedział + start

Zobacz do linku z Youtube. Fajnie jest wytłumaczone.

BTW: polecam pierwszy link o <random>

0

Wkleiłem ten kod ale przy próbie włączenia jest błąd w build log.

#include <random>  
#include <iostream>  
  
using namespace std;  
  
int main()  
{  
    random_device rd;   // non-deterministic generator  
    mt19937 gen(rd());  // to seed mersenne twister.  
                        // replace the call to rd() with a  
                        // constant value to get repeatable  
                        // results.  
  
    for (int i = 0; i < 5; ++i) {  
        cout << gen() << " "; // print the raw output of the generator.  
    }  
    cout << endl;  
}  
1

Podaj treść błędu.

0

||=== Build: Debug in test (compiler: GNU GCC Compiler) ===|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\c++0x_warning.h|32|error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.|
C:\Users\PROGRAMOWANIE\Desktop\Nowy folder (2)\test\main.cpp||In function 'int main()':|
C:\Users\PROGRAMOWANIE\Desktop\Nowy folder (2)\test\main.cpp|14|error: 'random_device' was not declared in this scope|
C:\Users\PROGRAMOWANIE\Desktop\Nowy folder (2)\test\main.cpp|15|error: 'mt19937' was not declared in this scope|
C:\Users\PROGRAMOWANIE\Desktop\Nowy folder (2)\test\main.cpp|21|error: 'gen' was not declared in this scope|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

2

Kod działa:
https://ideone.com/ItZVs9

Włącz w opcjach kompilatora standard C++11 lub wyższy.

0

Coś udało mi się zrobić z filmiku tylko nie wiem czy dobrze..
rand()%(99999999-100000+1)+100000=100000000

rand()%100000000; <- tak ma to być wklejone?

3

rand()%100000000; <- tak ma to być wklejone?

Nie. Nie zrozumiałeś. Napisałem kilka postów wyżej gotowy pseudo kod. Wystarczy go przepisać na kod.

0

No dobra, to już się nie męczę.. Może kiedyś :)
Dobra, ten kod działa ze strony, ale daje 10 cyfrowe cyfry np. 2412496532
Idzie jakoś to zmniejszyć do max 8 ?

2

https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution

We wcześniejszym linku o random, drugi przykład robi dokładnie to czego oczekujesz. Analizuj co dostajesz.

0

Mógłbyś mi to edytować tak żeby dawało liczby w zakresie 100000-99999999 ?
dis(100000, 99900000) daje za każdym razem tą samą liczbę

2
std::uniform_int_distribution<> dist(100000, 99999999);
0

Znalazłem taki kod, ale nie mam pojęcia gdzie go edytować żeby wpisać zakres liczb

int random(int min, int max)
{
   int tmp;
   if (max>=min)
       max-= min;
   else
   {
       tmp= min - max;
       min= max;
       max= tmp;
   }
   return max ? (rand() % max + min) : min;
}
0

Funkcje
W argumentach wywołania funkcji. Dokładnie tak samo jak w uniform_int_distribution, więc po co szukać gorszego rozwiązania, gdy ma się pod nosem dobre?

0

Gdy zamieniłem std::uniform_int_distribution<> dis(100000, 99999999); na std::uniform_int_distribution<> dist(100000, 99999999);

to są errory ;p

0

Jeśli deklarujesz obiekt o nazwiedist to tej nazwy używaj dalej w kodzie.

0

Zmieniłem wszystko z dis na dist i były błędy..

0

Pokaż kod.

0

Już działa ale tak czy siak jest do niczego,, daje te same liczby cały czas

#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dist(100000, 99999999);


    for (int n=0; n<10; ++n)

        std::cout << dist(gen) << ' ';
    std::cout << '\n';
}

0

Może jakiś bug kompilatora. GCC po C::B miał jakiś problem z random. Dodaj może nagłówek <ctime> lub <chrono> i zobacz czy coś to da. Wygląda na to, że ziarno jest takie samo w każdym wywołaniu.

0

Nie no, generator mam. Teraz tylko duplikator jakiś i będzie dobrze.

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