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

Podstawy programowania - Czy naprawdę potrafisz programować?

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
+3 głosów
831 wizyt
pytanie zadane 20 listopada 2015 w Rozwój zawodowy, nauka, praca przez arek01996 Stary wyjadacz (12,100 p.)
Witam,

Piszę już dobrych parę lat w wielu językach. Od Paskala w zwyż... Nigdy nie zastanawiałem się nad wbudowanymi funkcjami w językach wysokiego poziomu dopóki sam nie zacząłem pisać własnego języka skryptowego. Otóż w jaki sposób sprawdzić resztę z dzielenia bez znaku "%" jak w C++ czy funkcji mod jak w starzych językach. Potrafisz na to odpowiedzieć ?

Otwórz teraz swój kompilator i spróbuj napisać algorytm sam... Czy to nie zabawne, że częsci z was się to nie uda choć macie już pare lat praktyki ?

Czemu nikt nie wspomina o takich podstawach na początku nauki w szkole czy na kursach?

Ja sam spędzilem kilka dni nad rozwiązaniem "reszty z dzielenia".

Pozdrawiam i życzę powodzenia.

9 odpowiedzi

+6 głosów
odpowiedź 21 listopada 2015 przez adrian17 Mentor (350,120 p.)

Czemu nikt nie wspomina o takich podstawach na początku nauki w szkole czy na kursach?

Bo "podstawy" w sensie niskopoziomowości nie implikują "podstaw" w sensie bycia potrzebnym do nauki konceptów wyższego poziomu. Musisz umieć dodawać żeby całkować, ale nie musisz umieć naprawiać samochodu żeby nim jeźdźić.

+1 głos
odpowiedź 21 listopada 2015 przez Thonem Obywatel (1,230 p.)
To jest niby trudne? Chodzi Ci o napisanie algorytmu na % z liczby np. w C++? Zrobiłem to w jakieś 10 minut, przed chwilą, mając 15 lat i nie będąc mistrzem programowania, jedynie początkującym. Oto kod funkcji:

double reszta(double dzielna, double dzielnik)
{
    double wynik = dzielna/dzielnik;
    wynik -= trunc(wynik);
    return abs(wynik*dzielnik);
}

Jeśli źle zrozumiałem treść tematu i chodziło Ci o coś innego, to przepraszam.
komentarz 21 listopada 2015 przez niezalogowany
Autor jedynie rozpoczął wątek filozoficzny, niemający na celu chęci uzyskania tego kodu ;)
komentarz 21 listopada 2015 przez Thonem Obywatel (1,230 p.)
Wiem, napisałem kod, żeby nie było, że oszukuję. Bo co tu jest do cholery trudnego?
komentarz 21 listopada 2015 przez niezalogowany
Nic w tym przypadku, to ten na rozkminę typu: używamy języków wysokiego poziomu, lecz bardzi często nie rozumiemu wielu mechanizmów, które się w nich kryją. Dzielenie modulo to tylko przykład
komentarz 21 listopada 2015 przez writen Nałogowiec (29,060 p.)
Autor myślał, że jesteśmy idiotami. Nie wiem jak jest teraz, ale ja się takich podstaw w szkole uczyłem. Jaaakie to było nudnee, pół roku algorytmów.
komentarz 21 listopada 2015 przez niezalogowany
Widzę, że dalej nie rozumiesz: nie każdy zaczyna od niskiego poziomu i nie każdy go zauważa. Autor chciał zachęcić nas do refleksji nad narzędziami, których używamy na co dzień.
komentarz 21 listopada 2015 przez writen Nałogowiec (29,060 p.)
Jak ktoś zaczyna naukę programowania od klepania na ślepo kodu, to dupa będzie, a nie programista.
komentarz 21 listopada 2015 przez Thonem Obywatel (1,230 p.)
edycja 21 listopada 2015 przez Thonem

Według mnie to chodziło mu głównie o to, że funkcje wbudowane w c++ są bardziej skomplikowane niż myślimy. Sam zresztą zaznaczył, że rozwiązanie tego problemu zajęło mu kilka dni. Dlatego użytkownik writen ma rację. Jeśli mając kilka lat doświadczenia nie umie zrobić tak prostej rzeczy, to dobrym programistą raczej nie jest.

 

Ps. "Widzę, że dalej nie rozumiesz"

 

To było do mnie? Chyba nie przeczytałeś autora komentarza, do którego się odniosłeś :).

Pozdrawiam.

komentarz 21 listopada 2015 przez niezalogowany
Mea culpa. Przyznaję się do błędu, czytałem to dość pospiesznie więc niedokładnie.

Ale może myślał nad nie-nawinym dzieleniem modulo, na rzecz czegoś lepszego ;)
komentarz 21 listopada 2015 przez Strategiusz Dyskutant (9,220 p.)
A ja obliczanie reszty z dzielenia miałem w podstawówce i to jeszcze przed poznaniem ułamków.
komentarz 21 listopada 2015 przez event15 Szeryf (93,790 p.)
komentarz 1 grudnia 2015 przez Dorion300 Szeryf (90,250 p.)
Podejrzewam że chodzi mu o napisanie funkcji bez wywoływania innych funkcji.
komentarz 12 grudnia 2015 przez Surykat Stary wyjadacz (14,780 p.)
edycja 12 grudnia 2015 przez Surykat
Bardzo mnie zaciekawił ten temat. Nie powiem, też mnie to dotknęło bo... nie wiedziałem, jak to zrobić. :D

Po pół godzinie szukania najlepszej możliwości, jedynie do głowy mi wpadło to co ty napisałeś, ale mam jedno ale:
Wynik, który zwraca twoja funkcja, nie jest całkowity, powinieneś go chyba zaokrąglić. ;)

W sensie, kiedy dzielisz np. 4/3, to wynik = 1.(3)
Po obcięciu części całkowitej zostaje ci 0.(3)
Po przemnożeniu przez dzielnik, twoja funkcja wypluje wartośc 0.(9), a nie 1. :)

Co do samej istoty tematu, to od dawna się na to wkurzam. Wszędzie w około jest przymus używania rzeczy, które są określone jako działające i na tym koniec. W nawale obowiązków, mało kto dzisiaj ma czas, by sobie sprawdzić pewne rzeczy samemu. To się nawarstwia i okazuje się, że ludzie mówią o rzeczach, oraz używają narzędzi, których nie rozumieją. Gdyby im to zabrać, to okazuje się, że potrafią (tak, ja również) niewiele. :)
PS
Kiedy dorabiałem na budowie, to nie musiałem znać zasady działania młota pneumatycznego, żeby coś efektownie rozpier... :) Uważam, że nie ma co się łamać.
komentarz 12 grudnia 2015 przez writen Nałogowiec (29,060 p.)
Jak już wspominałem, resztę z dzielenia można obliczyć bez żadnego dzielenia, mnożenia i dodatkowych funkcji.
komentarz 12 grudnia 2015 przez Surykat Stary wyjadacz (14,780 p.)
No tak. ;) Nie wiem, jak działa trunc, ale czy dla duuużo większych liczb, "ucięcie" sobie potrzebnych kawałków i potem ich odpowiednie zaokrąglenie i wymnożenie, nie zadziała szybciej?
+1 głos
odpowiedź 21 listopada 2015 przez hit02 Nałogowiec (33,970 p.)
No wiesz. Jak byś się zagłębił w budowę funkcji standardowych, to byś odkrył naprawdę wiele bardzo ciekawych kodów.

Dla przykładu standardowa funkcja C - strlen() ładuje nie po 1, ale po 4 znaki naraz w celu zmniejszenia ilości odwołań do pamięci, które są bardzo wolne. Aby to zrobić jest tam wrzucona naprawdę ciekawa matematyka sprawdzająca, czy w danych 4 bajtach jest jakiś zawierający 0.
+1 głos
odpowiedź 1 grudnia 2015 przez Józef Mądrala (5,200 p.)
Przykład wybrałeś raczej średnio, bo rozwiązałem problem w kilka minut bez włączania kompilatora (na kartce papieru), chociaż do programowania podchodzę czysto hobbystycznie. Poruszyłeś jednak bardzo ważny temat. Studiowałem kierunek, na którym niezwykle istotne jest opanowanie statystyki. Ponieważ jednak żyjemy w skomputeryzowanych czasach, wszystko można łatwo i szybko wykonać w magicznej skrzynce. Niestety często pozwala to zaobserwować, jakim wypaczeniom uległy studia wyższe w Polsce. Pamiętam pewną sytuację (wiem, że przywoływanie jednostkowych przypadku jest kiepską strategią przy argumentowaniu za ogólną zasadą, ale i tak nie zamierzam tego tutaj robić), gdy koleżanka poprosiła mnie, abym pomógł jej przy zrobieniu analizy statystycznej do jej pracy magisterskiej. Usiadłem więc z nią na kilka dni i razem dłubaliśmy przy SPSSie. Dokładnie jej pokazałem, co i jak ma zrobić, objaśniałem wyniki, tłumaczyłem, jak je wykorzystać w gotowym raporcie (przez cały ten czas praca z komputerem była dla niej męczarnią). Ostatecznie skończyliśmy robotę i zapomniałem o sprawie na klika tygodni. Po tym czasie jednak owa studentka przyszła do mnie i zapytała, co to właściwie jest ta korelacja zmiennych (jedno z podstawowych pojęć w statystyce), bo nie wie i obawia się, że mogą ją o to zapytać na obronie. Ręce mi opadły...

Dlatego cieszę się, że poruszyłeś ten temat. Czy moja koleżanka jest jedyną odpowiedzialną za zaistniały stan rzeczy? Oczywiście, że nie. Można mieć do niej pretensje o to, że kompletnie olała studia, że pisała pracę, chociaż de facto nie wiedziała, o czym ona jest etc. Nie wolno jednak zapominać, iż winna jest tutaj także uczelnia, a być może cały system edukacji, bo przecież jakoś przebrnęła przez całe studia i udało się jej obronić. Powiem więcej - teraz może pracować w zawodzie i odnosić sukcesy. Podobnie jak programista, który nie potrafi napisać algorytmu sprawdzającego resztę z dzielenia (ten przykład akurat jest nietrafiony, ale łatwo można chyba przytoczyć inny), tak ona i jej podobni będą mogli wklepywać dane do komputera, otrzymywać przetrawione wyniki i umieszczać je w raportach. Czy tylko tego należy oczekiwać od kogoś, kto powinien w danej dziedzinie być ekspertem?

Przepraszam, że tak marudzę, ale strasznie mnie ta sytuacja denerwuje.
komentarz 1 grudnia 2015 przez andrzej_bl Bywalec (2,390 p.)
Wspaniały esej. Ja ten problem widzę z drugiej strony. Jak mam zaimponować uczniowi w szkole podstawowej, który przyszedł pierwszy raz na zajęcia z programowania? Nauczyć go „Hello, World!!” ? A może sortowania trzech liczb? Przecież on w telefonie komórkowym korzysta z aplikacji, programów, gier pełnych wybajerowanych efektów i fajerwerków. Natomiast bardziej skomplikowanych algorytmów nie pojmie, bo nie ma podstaw matematycznych. Zostają programy typu Baltie czy Scratch w których uczy się myślenia algorytmicznego z pominięciem podstaw programowania. Potem taki uczeń przyzwyczaja się do gotowych procedur czy funkcji i nawet nie zastanawia się ile pracy trzeba włożyć żeby podzielić modulo dwie liczby, nie mówiąc już np. o zakodowaniu w kilku bajtach liczby zmiennoprzecinkowej. pozdrawiam
0 głosów
odpowiedź 20 listopada 2015 przez writen Nałogowiec (29,060 p.)
Ja jednak pamiętam, że przerabialiśmy taki temat i nie jest to wcale tak skomplikowane.

Pętla i zwykłe odejmowanie, czyli dzielenie bez dzielenia?
0 głosów
odpowiedź 21 listopada 2015 przez Grzyboo Nałogowiec (28,860 p.)

yyy? serio?

int mod(int x, int y)
{
    int z = x / y;

    return x - z * y;;
}

 

To dla C++ działa. W przypadku języków, gdzie dzielenie przez inta nie obcina w dół należałoby z wartości zmiennoprzecinkowej zaokrąglić w dół i by też wyszło w równie trywialny sposób.

0 głosów
odpowiedź 21 listopada 2015 przez event15 Szeryf (93,790 p.)
Rozumiem, że nie chodzi Ci o podanie kodu na tacy.

Widzę, że niektórzy nie rozumieją treści tematu. Skoro algorytm reszty z dzielenia jest dla nich zbyt prosty, to mam zadanko w sam raz dla nich.

W języku C++ niech stworzą własną funckję cout. Bez ładowania bibliotek C++. Jest to funkcja wbudowana w język, ale czy ktokowiek z cwaniaczków potrafi są samodzielnie napisać?

Powodzenia.
komentarz 21 listopada 2015 przez writen Nałogowiec (29,060 p.)

Tego się akurat w szkole nie uczyłem. Może bym umiał jakbym ją skończył laugh

komentarz 21 listopada 2015 przez event15 Szeryf (93,790 p.)
komentarz 1 grudnia 2015 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Widzę, żę ktoś odkopał, więc przy okazji zwrócę uwagę - std::cout to obiekt klasy ostream a nie funkcja :)
0 głosów
odpowiedź 1 grudnia 2015 przez Schizohatter Nałogowiec (39,600 p.)
Tym się różni programowanie od składania programu z gotowych klocków.

Programiści, którzy naprawdę programują kilka lat nie powinni mieć problemów z wymyślaniem podstawowych algorytmów. Po prostu tego rodzaju myślenia uczy się przy okazji programowania. Dlatego raczej nie stawia się takich challengów przed początkującymi programistami, chyba że mają ambicje na szybki rozwój. Zaczyna się od wymyślania prostych algorytmów. Ale z osoby, która nie potrafi wymyślać algorytmów po prostu programisty nie będzie. Myślenie algorytmowe to wręcz dziedzina interdyscyplinarna.

Resztę z dzielenia można też zrobić pętlą, odejmując dzielnik od dzielnej, aż do momentu dzielna < dzielnik. De facto, na tym polega dzielenie samo w sobie. Na odejmowaniu. Tak jak mnożenie na dodawaniu.
0 głosów
odpowiedź 1 grudnia 2015 przez tomashpl Obywatel (1,370 p.)

Z ciekawości - dlaczego operator % oblicza resztę z dzielenia inaczej, niż mówi twierdzenie o reszcie z dzielenia? 

C++: -12 % 5 == -2
Tw. o reszcie z dzielenia: r(-12/5) == 3

W związku z tym napisałem sobie taką funkcję, która resztę z dzielnia liczby ujemnej oblicza nieco inaczej niż standardowe modulo.

#include <iostream>

using namespace std;

int resztaZDzielenia(int dzielna1, int dzielnik1);

int main()
{
    int dzielna, dzielnik;

    cout << "Podaj dzielna: ";
    cin >> dzielna;
    do {
        cout << "Podaj dzielnik (rozny od 0): ";
        cin >> dzielnik;
    } while (dzielnik == 0);
    cout << "resztaZDzielenia(): " << resztaZDzielenia(dzielna, dzielnik) << endl;
    cout << "dzielna%dzielnik: " << dzielna % dzielnik << endl;
}

int resztaZDzielenia(int dzielna1, int dzielnik1) {
        // Podloga ilorazu
        int iloraz = dzielna1/dzielnik1;

        // Wartosc absolutna dzielnika (mozna by uzyc abs(dzielnik1), ale chcialem sobie to rozpisac bez uzycia wbudowanych funkcji
        int absDzielnik1;
        if (dzielnik1 > 0) absDzielnik1 = dzielnik1;
        else absDzielnik1 = dzielnik1+(-2*dzielnik1);

        // Obliczenie reszty
        if (dzielna1 >= 0) return dzielna1-iloraz*dzielnik1;
        else return absDzielnik1 + (dzielna1-iloraz*dzielnik1);
}

 

Podobne pytania

–1 głos
2 odpowiedzi 1,135 wizyt
pytanie zadane 22 października 2016 w Inne języki przez nodo12221 Obywatel (1,100 p.)
0 głosów
1 odpowiedź 794 wizyt
pytanie zadane 5 września 2016 w Algorytmy przez niezalogowany
0 głosów
0 odpowiedzi 176 wizyt
pytanie zadane 19 sierpnia 2018 w Sprzęt komputerowy przez niezalogowany

93,103 zapytań

142,077 odpowiedzi

321,571 komentarzy

62,445 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!

...