Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Negatywne mysli podczas nauki programowania

Ostatnio zmodyfikowano 2018-03-26 15:38
Autor Wiadomość
latajacaryba
» 2017-09-10 22:41:57
Może ja się po prostu nie nadaje do tego? Nie wiem, brak zdolności do myślenia logicznego? Albo po prostu te zagnieżdżanie mi słabo leży i jest trudne
Może. A może po prostu dopiero zaczynasz i zamiast się przejmować powinieneś pisać? Jak czegoś nie wiesz to sprawdź, przecież nie chodzi o to, żeby wymyślać koło na nowo, tylko wiedzieć, jak coś zrobić w prosty sposób.
Rób tak: jeśli czegoś nie wiesz, sprawdź rozwiązanie, ale potem napisz podobny program, opierający się na tym, czego dotyczył poprzedni.

Wyobraź sobie, że masz pięć piłek i chcesz wylosować trzy z nich. Napisz program, który wypisze na ekranie wszystkie możliwe kombinacje piłek jakie można wylosować. Dane jakie powinny zostać wypisywane na ekranie:

Najpierw plan. Mam 5 piłek i muszę wylosować 3 z nich.
Piłki numerujemy jako 1,2,3,4 i 5, przy czym oczywiste jest, że nie mogą się powtarzać w losowaniu(1, 2, 2 itd.). Jak to załatwić?
Załóżmy, że będziemy iść od najmniejszych wartości (tj. 1,2,3) i w ten sposób będzie to wypisywane, czyli pierwsza cyfra jest najmniejsza.
Skoro nie możemy pozwolić na 1,1,1 1,1,2  (będziemy to oznaczać jako i,j,k) to musimy "powiedzieć" kolejnym liczbą, że muszą być inne, niż jej poprzednicy.
Zaczynamy od i = 1, skoro 'i' jest równe jeden, to 'j' musi być równe 2 lub więcej, a 'k' 3 lub więcej.
zauważ, że i = 1, j = i+1, k = j+1

Kiedy już wypiszemy wszystkie opcje dla k ( pamiętamy, że k == j+1 && k <= 5) to czas zwiększyć zmienną j. j przyjmuje teraz wartość 2, a TO oznacza, że k przyjmuje wartość j+1, czyli 2+1. Teraz już zbiór liczb dla k to nie 1,2,3,4,5 tylko 2,3,4,5. Kiedy znowu zwiększy się j (3) to zbiór k skurczy sie jeszcze bardziej 4,5, a potem k zostanie tylko liczba 5 (1,4,5).

i = 1 j = i+1 k = j+1

i = 1  j = 2  k = 3
i = 1  j = 2  k = 4
i = 1  j = 2  k = 5
i = 1  j = 3  k = 4
i = 1  j = 3  k = 4
i = 1  j = 3  k = 5
i = 1  j = 4  k = 5
// uwaga, teraz j przybiera wartość 5, natomiast k o jeden większą. Jednak warunek nie pozwala nam, by k miało wartość 6 (bo jest tylko 5 piłek). Pętla 'k' więc od razu się kończy. 'j' przybiera
wartość 6, ale znowu okazuje się, że nie może tego zrobić, więc pętla się przerywa. Teraz to i zwiększa się o jeden

i = 2  j = 3  k = 4
i = 2  j = 3  k = 5
i = 2  j = 3  k = 5
i = 2  j = 4  k = 5
i = 3  j = 4  k = 5 // ostatni przypadek, potem przerywa się pętla k (bo k = 6), 'j' przyjmuje wartość 5, pętla 'k' znowu się przerywa (bo j+1 = 6), 'i' równa się 4, j = i+1 czyli 5, ale k = 6 i tak dalej się przerywa aż 'i' = 6 i następuje wyjście z ostatniej pętli i koniec programu



C/C++
for( int i = 1; i < 6; i++ )
{
    for( int j = i + 1; j < 6; j++ )
    {
        for( int k = j + 1; k < 6; k++ )
        {
            std::cout << i << " " << j << " " << k << "\n";
           
        }
       
    }
   
   
}

Nad każdym zadaniem trzeba trochę posiedzieć, myślę, że rok temu też bym miał z nim problem, chociaż znałem już zagnieżdżanie. Im więcej piszesz tym lepiej piszesz. To samo z zadaniami na myślenie.

PS. czterolinijkowe? To nieźle, bo pojedyncza pętla for z nawiasami i jedną instrukcją ma 4 linijki :o
P-164778
mateczek
» 2017-09-11 05:29:13
@up bez nawiasów też zadziała;) aczkolwiek niezbyt ładnie to wygląda
C/C++
for( int i = 1; i < 6; i++ )
for( int j = i + 1; j < 6; j++ )
for( int k = j + 1; k < 6; k++ )
     std::cout << i << " " << j << " " << k << "\n";
P-164780
latajacaryba
» 2017-09-11 08:49:35
@up
I to działa? Wydawało mi sie, że przy zagnieżdżaniu jednej pętli w drugiej muszą być nawiasy. Czyli sie da :P
P-164781
Saran
» 2017-09-11 11:01:53
Podobnie jest z ifami. I innymi podobnymi :)
P-164783
wgnsy123
Temat założony przez niniejszego użytkownika
» 2017-09-11 15:22:07
Dzięki za rozpisanie. Ja właśnie miałem ten problem, że myślałem poza zagnieżdżaniem pętli i chciałem na siłę 5 piłek jako tablice z 5 parametrami i.. no właśnie, nie potrafiłem zaplanować tego, z tym mam duży problem, że myślę głupio. Postaram się pisać jakieś zadania związane z zagnieżdżaniem pętli, ale męczy mnie to, że znów nie potrafiłem i muszę zaglądać do rozwiązań. Znacie może jeszcze jakieś sposoby prócz ciągłego pisania na poprawienie "myślenia" (w zakresie właśnie programowania, matematyki)? A może powinienem jakoś lepiej organizować tą naukę, jakoś oczyścić głowę przed nią? Nie wiem naprawdę. Głowię się nad zadaniem, patrze na rozwiązanie i pukam sobie w głowę jak mogłem na to nie wpaść, po rozpisaniu mi tego rozumiem, ale - łatwo rozumieć jeden przykład, trudniej używać go w innych sytuacjach.

Czyli dobrym sposobem chyba będzie po prostu pisanie czegoś na własną rękę, nawet bardzo prostego aby utrwalić i ćwiczyć, tak sądze.
P-164787
latajacaryba
» 2017-09-11 16:25:54
A może powinienem jakoś lepiej organizować tą naukę, jakoś oczyścić głowę przed nią? Nie wiem naprawdę. Głowię się nad zadaniem, patrze na rozwiązanie i pukam sobie w głowę jak mogłem na to nie wpaść, po rozpisaniu mi tego rozumiem, ale - łatwo rozumieć jeden przykład, trudniej używać go w innych sytuacjach.
Tak to już jest, ja miałem podobne problemy z matematyką, chodziło tu o takie zadania na myślenie, olimpiadowe, gdzie nie tyle ważna jest wiedza co pomysł (udowodnij, że itd.). Moja już była nauczycielka mówiła mi właśnie, że im więcej zadań zrobie tym lepiej i szybciej będę je rozwiązywał. Wtedy myślałem, że mówi głupoty, no bo jak mam robić szybciej inne zadania, ćwicząc, skoro każde z nich jest inne. Cóż, myliłem się. Są techniki, wzorce czy wspólny mianownik dla większości z nich i napiszą Ci to na każdym forum matematycznym i powie Ci to każda nauczycielka (możesz nawet zapytać się jutro swojej), że tylko ćwiczeniem można wyrobić sobie takie myślenie, a przecież czym jest programowanie jak nie rozwiązywaniem problemów? Im więcej będziesz pisał tym lepiej będzie Ci to szło, na pewno będzie ciężko i na pewno nie będziesz umiał większości zadań, ale z czasem będzie szło Ci coraz lepiej, jeśli czegoś nie umiesz zostaw to i przejdź do kolejnych zadań. Na drugi dzień czy po kilku godzinach wróć do tych ćwiczeń, których nie umiałeś i spróbuj jeszcze raz. Dopiero potem sprawdź rozwiązanie.
Wydaje mi się, że to jedyna droga i nie ma innej.

PS. na dobry początek wymyśliłem zadanie:

napisz program, który wypisuje wszystkie kombinacje zmiennych liczbowych (tylko liczby całkowite) 'i' , 'j' oraz 'k'.  Wartości początkową dla każdej zmiennej podaje użytkownik, i może przybierać ona wartości od (wartości początkowej) do (wartości początkowej + 3)  Cyfry mogą się powtarzać (np. 2,2,3) przy czym należy te kombinacje wypisywać w kolejności od najmniejszej do największej.



przykład: i = 2 j = 3 j = k // i = {2,3,4,5}

2 - 3 - 4 - najmniejsza
5 - 6 - 7 - największa

i = 30 j = 32 k = 40

30 - 32 - 40 - najmniejsza
33 - 35 - 43 - największa
P-164789
wgnsy123
Temat założony przez niniejszego użytkownika
» 2017-09-11 20:02:05
Coś takiego?

C/C++
#include <iostream>
#include <cstdlib>
int main()
{
    int i, j, k;
   
   
   
    std::cout << "Podaj 3 liczby całkowite od najmniejszej do najwiekszej: " << std::endl;
    std::cin >> i;
    std::cin >> j;
    std::cin >> k;
    int si = i + 4;
    int sj = j + 4;
    int sk = k + 4;
   
    for( int a = i; a < si; a++ )
    {
        for( int b = j; b < sj; b++ )
        {
            for( int c = k; c < sk; c++ )
                 std::cout << a << " " << b << " " << c << "\n";
           
        }
       
    }
   
    return 0;
}

P-164802
latajacaryba
» 2017-09-11 20:49:27
Tak, o to chodziło. Na marginesie, nie musiałeś tworzyć si sj sk, można też zrobić to poprzez
i = i + 4; // i += 4
Ale nie jest to błąd.

Wymyślaj sobie/szukaj takie zadania i nie przejmuj się niepotrzebnie. Zawsze możesz napisać na forum jeśli nie będziesz czegoś wiedział/rozumiał. :)
P-164807
1 2 « 3 » 4 5
Poprzednia strona Strona 3 z 5 Następna strona