Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Pomoc w skróceniu kodu(pętle i tablice)


naxch

Rekomendowane odpowiedzi

Opublikowano

Witam. Dopiero, co zaczynam swoje przygody z c++. Stworzyłem sobie prosty programik(dla mnie sprawił wiele problemu) w którym podajemy komputerowi liczbę z zakresu liczb od 1 do 10, a on próbuje ją zgadnąć. Działać działa, lecz chciałbym, aby ktoś skrócił mój kod na losowanie bez powtórzeń, ponieważ jak widać przy większym zakresie licz będę musiał dopisać kolejną tablicę=m. Prosiłbym również o możliwe opisanie tego, co zmieniliśmy i wytłumaczenie w sposób dla zielonych. Dziękuję z góry. Niżej link:

http://wklej.to/WQ9Ue

1std.png

 

"Nigdy nie kłóć się z idiotą. Szybko sprowadzi Cię do swojego poziomu i pokona doświadczeniem."

 

Start projektu WSLR Dnia 27.11.12r. Godz. 9.00

Opublikowano
#include <time.h>
#include <ctime>

To jest jedna i ta sama bliblioteka, o ile się nie mylę.

Bliblioteki, które w nazwach mają .h kojarzą mi się z C, a nie z C++, więc zostawiłabym ctime, a tą drugą usunęła.

Nie zagłębiam się dalej w kod, ale to rzuciło mi się akurat w oczy.

it's not who i am underneath

but what i do that defines me.

Opublikowano

Jeśli by to robić porządnie to tak.

//zostawilem polskie napisy
#include <iostream>
#include <random>
#include <chrono>
#include <algorithm>
#include <array>

int main()
{
    constexpr int maxNumber = 10;
    std::mt19937 rng(std::chrono::system_clock::now().time_since_epoch().count());
    int numberToGuess;
    std::cout << "podaj liczbe od 0 do 10, a ja sprobuje ja odgadnac: ";
    std::cin >> numberToGuess;

    std::array<int, maxNumber+1> possibleNumbers;
    for(int i = 0; i <= maxNumber; ++i) possibleNumbers[i] = i;
    std::shuffle(possibleNumbers.begin(), possibleNumbers.end(), rng);

    int numberOfTries = 0;
    for(const int n : possibleNumbers)
    {
        int guess = possibleNumbers[numberOfTries];
        ++numberOfTries;
        std::cout << "Liczba(proba nr: " << numberOfTries << " ): " << guess << '\n';

        if(guess == numberToGuess)
        {
            std::cout << '\n' << "Udalo mi sie za: " << numberOfTries << " razem" << '\n';
            break;
        }
    }
    return 0;
}


Jeśli czegoś nie rozumiesz to pytaj.

 

Jeśli losujesz liczby bez powtórzeń to lepiej zrobić tablicę ze wszystkimi możliwościami i losowo ją 'potasować'. Wtedy wybierasz z niej liczby po kolei.

Jest to lepsze rozwiązanie jeśli będziesz potrzebował znaczną część liczb z puli możliwych.

Dla n liczb w puli i m liczb do wylosowania powinno być wydajniejsze kiedy

m*m>n

i może nawet dla mniejszych m.

Opublikowano

@Sopelek997 kolega prosił o poprawienie jego kodu, a nie pisanie całego od nowa. o.O

Ja chciałabym zapytać, jeśli mogę się wtrącić, dlaczego dopisujesz wszędzie std:: zamiast raz napisać using namespace std;?  Tak jest Ci po prostu wygodniej, czy to ma jakieś ukryte znaczenie? :P

 

I co TO jest? :D

std::mt19937 rng(std::chrono::system_clock::now().time_since_epoch().count());

it's not who i am underneath

but what i do that defines me.

Opublikowano
@Sopelek997 kolega prosił o poprawienie jego kodu, a nie pisanie całego od nowa. o.O

 

No to poprawiłem. Drastycznie, ale poprawiłem.

 

Ja chciałabym zapytać, jeśli mogę się wtrącić, dlaczego dopisujesz wszędzie std:: zamiast raz napisać using namespace std;?  Tak jest Ci po prostu wygodniej, czy to ma jakieś ukryte znaczenie? :P

 

Z przyzwyczajenia. Częściej jest to problemem niż pożytkiem.

 

I co TO jest? :D

 

Coś ala time() z c. Tylko, że lepsze.

Opublikowano

Coś ala time() z c. Tylko, że lepsze.

Mógłbyś nieco bardziej o tym napisać, ewentualnie podesłać jakiś link, gdzie jest to wytłumaczone?

Niewiele mówi mi ten ciąg znaczków, a z pewnością poszczególne fragmenty coś znaczą i nie trzeba uczyć się tego na pamięć. :P

 

@naxch wybacz, że tak Ci wchodzę w paradę, mam nadzieję, że informacje od @Sopelek997 Tobie również okażą się być przydatne. ^^

it's not who i am underneath

but what i do that defines me.

Opublikowano

Wszystko zrozumiałe. Przynajmniej na swoje oczy zobaczyłem bardziej profesjonalny kod ; p i dostałem coś czego oczekiwałem, bo sam dość czytałem na temat "shuffle", lecz nie wiedziałem jak to zastosować

1std.png

 

"Nigdy nie kłóć się z idiotą. Szybko sprowadzi Cię do swojego poziomu i pokona doświadczeniem."

 

Start projektu WSLR Dnia 27.11.12r. Godz. 9.00

Opublikowano

jest jeszcze pewien problem, ponieważ mój program nie czyta następujących bibliotek:

#include <random>
#include <chrono>
#include <algorithm>
#include <array>

w czym tkwi problem? Używam najnowszego Code::Blocks

1std.png

 

"Nigdy nie kłóć się z idiotą. Szybko sprowadzi Cię do swojego poziomu i pokona doświadczeniem."

 

Start projektu WSLR Dnia 27.11.12r. Godz. 9.00

Opublikowano

Settings->Compiler->Compiler Flags opcja "Have g++ follow the C++11 ISO C++ language standard"

Opublikowano

Jakiego kompilatora używasz i jaka jest jego wersja. Sprawdź czy nie masz usuniętych jakichś plików bo chociaż algorithm powinieneś mieć, bo ona jest stara.

Opublikowano

To, co napisał "NopeDotAvi" podziałało, lecz czy na zwykłym dev c++ ze zwykłym kompilatorem pójdzie ten kod? Tak biblioteka #include <algorithm> działa. Używam GNU GCC Compiler

 

@edit: jeśli byłaby szansa to prosiłbym Cię o poprawienie tylko tej pętli, którą mam w dość długi sposób rozpisaną. Twój kod jest można powiedzieć, że doskonały. Nie sądzę, że w przeciągu 4 miesięcy ogarnę jak pisać w ten sposób. Mam coś na przyszłość przynajmniej, ale póki, co wolę te podstawowe sposoby, bo mam się uczyć, a nie pisać profesjonalnie ^^. Jest się na czym wzorować póki co ;p

1std.png

 

"Nigdy nie kłóć się z idiotą. Szybko sprowadzi Cię do swojego poziomu i pokona doświadczeniem."

 

Start projektu WSLR Dnia 27.11.12r. Godz. 9.00

Opublikowano

Tyle tylko, że to nie jest pisanie "profesjonalnie" a pisanie w C++. Dlaczego miałbyś nie uczyć się od razu pisać lepiej tylko zaczynać od kupy? W zasadzie sporo zależy od tego czy chcesz wiązać jakąkolwiek przyszłość z programowaniem czy uczysz się na zaliczenie. Owszem, podstawy są ważne ale skoro istnieją lepsze i aktualne mechanizmy, to należy z nich korzystać.

YOU MUST DIE

- Ganon, Koridai

Opublikowano

uczę się dla siebie. Po prostu przeraził mnie kod, którego użył Sopelek997 ;). W takim razie wracam tylko do pytania, czy pójdzie mi ten kod na zwykłym dev c++ ze zwykłym kompilatorem, ponieważ większość czasu uczę się c++ poza domem i ćwiczę na tym programie.

1std.png

 

"Nigdy nie kłóć się z idiotą. Szybko sprowadzi Cię do swojego poziomu i pokona doświadczeniem."

 

Start projektu WSLR Dnia 27.11.12r. Godz. 9.00

Opublikowano

Jeżeli byś znalazł opcje, dzięki której dev będzie wspierał c++11 to zadziała ;)

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...