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

nauka logicznego myślenia

Object Storage Arubacloud
+1 głos
595 wizyt
pytanie zadane 26 lipca 2017 w Algorytmy przez Jakub 0 Pasjonat (23,120 p.)

witam ,zadałem to pytanie ponieważ niepokoi mnie pewna kwestia ,dotyczy ona zrozumienia i pisania własnych algorytmów ,umiejętności przerzucenia pomysłu na kod .Problem jest taki że na przykład poznaje nowy algorytm sortowania ,np z kursu P.Mirosława ,zatrzymuje film i zastanawiam się w jaki sposób bym zaimplementował algorytm znając zasadę jego działania . Zazwyczaj mi to nie wychodzi (albo najwyżej stworzę bardzo długawy i niestabilny program) a po zobaczeniu gotowego kodu myślę sobie jakie to proste ,czemu ja na to sam nie wpadłem angry

Mimo iż z większością algorytmów nie mam problemu z ich zrozumieniem to ciężko mi jest je napisać samemu dopóki pierwszy raz nie zobaczę ich implementacji ,wobec tego mam pytanie w jaki sposób mogę się nauczyć takiego logicznego myślenia jaki potrzebuję developer i jak przelewać pomysł na kod? Co np sądzicie o schematach blokowych i pseudokodzie ? czy przedstawienie algorytmu w takim czymś pozwoli mi go łatwiej zaimplementować ? Dziękuje z góry za pomoc i komentarze :)

2 odpowiedzi

+1 głos
odpowiedź 26 lipca 2017 przez mokrowski Mędrzec (155,460 p.)
wybrane 26 lipca 2017 przez Jakub 0
 
Najlepsza

Jedno słowo: ćwiczyć.

Zadanie do wykonania:

Zainicjuj tablicę (jeśli nie znasz vector) 100 elementów wartościami losowymi unsigned int. Następnie policz ilość elementów nieparzystych i podzielnych przez 7. Postaraj się wykonać zadanie z użyciem funkcji z dbałością aby rozwiązanie było wydajne.

Jak tu umieścisz, dostaniesz informację zwrotną. Zadanie jest proste a zobaczysz ile da się zrobić aby było dobrze zrobione. Nie szukaj "kamienia filozoficznego" (diagramów, tabletek (!) czy innych remediów) które Ci pozwolą ten etap opanować. Tu po prostu trzeba "otrzaskać się" z językiem i nabyć nawyków pewnego sposobu myślenia. Później będziesz stosował te narzędzia. Trzeba najpierw powbijać trochę gwoździ :-)

komentarz 26 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
dzięki za odpowiedź . Cóż ,staram się robić zadania z serwisu SPOJ ,piekielnie szybko mi to nie wychodzi ale może coś z tego wyjdzie . Zrobię zadanie jakie mi zaproponowałeś i podam kod do oceny :)
komentarz 26 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
edycja 26 lipca 2017 przez Jakub 0

hej, rozwiązałem już zadanie z liczeniem ,dzięki za pomoc i zainteresowanie :

 

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#define n 100

using namespace std;

vector <unsigned> numbers;

int e(int nr){
    if(nr%2!=0)return true; //troche przegiolem z funkcjami ;) ,ale tak jest mi wygodzie bo nie lubi zlozonych petli
    else return false;
}
int d(int nr)
{
    if(nr%7==0)return true;
    else return false;
}

void VectorSetValue()//nadanie losowej wartosci
{
    srand(time(NULL));

    int x;

    for(int i=0; i<n; i++)
    {
        x = rand()%100+1;
        numbers.push_back(x);
    }
}

void Counter()//ilosc nieparzystych i podzielnych dla siedmiu
{
    int even_counter = 0;
    int divisible_by_seven_counter = 0;

    for(int i=0; i<n; i++)
    {
        if(e(numbers[i])==true)even_counter++;
        if(d(numbers[i])==true)divisible_by_seven_counter++;
    }

    cout<<"nieparzyste -> "<<even_counter<<endl;
    cout<<"podzielne przes siedem -> "<<divisible_by_seven_counter<<endl;

}

int main()
{
    VectorSetValue();

    cout<<endl<<endl;

    for(int i=0; i<numbers.size(); i++)
    {
        cout<<"liczba nr. "<<i<<" : "<<numbers[i]<<endl; //to nie dziala nie wiem czemu ,i chodzi mi wlasnie o takie momenty
    }

    cout<<endl<<endl;

    Counter();

    return 0;
}

 

1
komentarz 26 lipca 2017 przez mokrowski Mędrzec (155,460 p.)

No to pierwszy krok. Nie jest jeszcze to co można zrobić docelowo ale nie będę robił rewolucji. Pytaj jak nie rozumiesz:

Uwagi:

1. Stosowanie makr powinno być bardzo ograniczane. W przypadku Twojego n, masz do czynienia ze stałą która powinna być zdefiniowana przez constexpr. Jest jednocześnie wielkością kontenerów a wtedy stosujemy typ size_t. Ten typ obsługuje największą możliwą ilość danych dostępnych w kontenerze.

2. Stosowanie zmiennych globalnych to zło. Należy tego unikać.

3. Do takiego obliczenia jak "podzielność przez 7" lub "jest parzysta", można nie pisać funkcji ale jeśli już, to powinny nazwą odzwierciedlać co robią.

Z racji tego że to predykat (funkcja zwracająca true/false), przyjmuje się częstą konwencję nazywania takich funkcji isCoś(...).

Dodatkowo można spokojnie uprościć kod samych funkcji. Mniej kodu, mniej powodów do błędu :-)

4. Obecnie nie używa się już (od 2011 roku) generowania liczb losowych z użyciem srand/rand. Teraz stosujemy nagłówek <random>. Z racji tego że masz wygenerować cały zakres unsigned, nie wiesz ile bitów ma unsigned a najmniej może mieć 16 :-) Stąd do definiowania maksymalnego zakresu użyć warto limitów kompilatora z nagłówka <limits>. Generator losowy ma wylosować liczby o równomiernym rozkładzie.

Deklaruję vector o znanym rozmiarze przez co uniknę niepotrzebnych alokacjipamięci oraz będę mógł łatwo go wypełnić danym.

Dodatkowo warto by funkcja albo przyjęła do wypełnienia kontener lub go po prostu stworzyła i wypełniła. Przyjmę to drugie podejście.

5. Raczej nazwa Count a nie counter. I raczej należy zwrócić policzone ilości tak aby inna funkcja wyświetliła dane. Na razie to zostawię. Łatwiej można przejść po całym kontenerze z użyciem takiego for(...) jak widzisz. Do funkcji także lepiej przekazać poprzez stałą referencję kontener na którym ma pracować. Stałą bo nie ma być możliwe modyfikowanie jego zawartości.

Kompiluj w trybie zgodności z C++11. Już trochę lat minęło od tego czasu :-)

Kod:

#include <iostream>
#include <vector>
#include <random>
#include <limits>

constexpr static size_t NUMBERS_COUNT = 100;
 
using namespace std;
 
bool isEven(unsigned number){
    return ! (number % 2);
}

bool isDividedBy7(int number)
{
    return ! (number % 7);
}
 
vector<unsigned> VectorCreateValue()//nadanie losowej wartosci
{
    random_device rd;
    mt19937_64 gen(rd());
    uniform_int_distribution<unsigned> dis(0, numeric_limits<unsigned>::max());

    vector<unsigned> numbers(NUMBERS_COUNT); 

    for(auto& value: numbers) {
        value = dis(gen);
    }
    
    return numbers;
}
 
void Count(const std::vector<unsigned>& numbers)//ilosc nieparzystych i podzielnych dla siedmiu
{
    size_t even_counter{};
    size_t divisible_by_seven_counter{};
 
    for(const auto& value: numbers)
    {
        if(isEven(value)) {
            ++even_counter;
        }
        if(isDividedBy7(value)) {
            ++divisible_by_seven_counter;
        }
    }
 
    cout << "nieparzyste -> " << even_counter << endl;
    cout << "podzielne przes siedem -> " << divisible_by_seven_counter << endl;
 
}
 
int main()
{

    auto numbers = VectorCreateValue();
 
    cout << endl << endl;
 
    for(size_t i = 0; i < numbers.size(); ++i)
    {
        cout << "liczba nr. " << i << " : " << numbers[i]
            << endl;
    }
 
    cout << endl << endl;
 
    Count(numbers);
}

 

komentarz 26 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
dzięki za komentarz ,co prawda znam tylko kurs Mirosława Zelenta więc nie do końca się znam na nowych rozwiązaniach w c++ ale mam kupioną książkę "c++ ,szkoła programowania wyd VI" i nie długo będę się z niej uczyć po ukończeniu "podstawowych podstaw" tego języka .Problem jest jeszcze taki że nie korzystam puki co z najnowszego  standardu c++ więc ten kod mi nie odpali . Jednak nie długo zaopatrzę się w nowe środowisko ,kompilator i tak jak mówiłem studium nowej książki .
1
komentarz 26 lipca 2017 przez mokrowski Mędrzec (155,460 p.)

No to czym prędzej do książki :-) Kurs Pana Mirka Zelenta jest już bardzo nie na czasie a C++ to już dawno nie język "C z obiektami" co widać u niektórych :-) 

 

+1 głos
odpowiedź 26 lipca 2017 przez Jedras Maniak (54,860 p.)
Po prostu pisz jak najwięcej kodu. Rozwiązywanie zadań z matematyki (ale nie schematycznych) też powinno pomóc w rozwoju abstrakcyjnego myślenia.
komentarz 26 lipca 2017 przez Jakub 0 Pasjonat (23,120 p.)
dzięki ,mam nadzieje że pomoże ;-)

Podobne pytania

0 głosów
1 odpowiedź 6,929 wizyt
pytanie zadane 15 stycznia 2017 w C i C++ przez anntru Nowicjusz (180 p.)
0 głosów
2 odpowiedzi 634 wizyt
0 głosów
1 odpowiedź 2,178 wizyt

92,551 zapytań

141,395 odpowiedzi

319,526 komentarzy

61,936 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!

...