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

Pętle - przypisywanie wartości zmiennym

Object Storage Arubacloud
–1 głos
715 wizyt
pytanie zadane 4 sierpnia 2015 w C i C++ przez gregorn97 Nowicjusz (120 p.)

Witam, mam pytanie odnośnie odcinka trzeciego kursu w programowaniu proceduralnym. 

#include <iostream>

using namespace std;

int populacja=1; int godzin=0;

int main()
{
    while (populacja <= 1000000000)
    {
        godzin++;
        populacja = populacja*2;

        cout<<"minelo godzin: "<<godzin;
        cout<<" liczba bakterii: "<<populacja<<endl;
    }
    return 0;
}

Mam pytanie o logikę zapisów w tej operacji bo już któryś raz z rzędu oglądam ten film i nie mogę pojąć niektórych rzeczy.

Jeśli wprowadzam nową zmienną w postaci liczby całkowitej [int] to czy to nie jest trochę sprzecznę jeśli przyporządkuję na samym początku(poza pętlą) daną wartość liczbową jeśli to jest zmienna. Sens rozumiem, ale zapisu już nie bardzo. Mam na myśli np:{ int populacja=1 }. Myślałem, że jeśli wprowadzamy zmienną i to jest na samej górze czyli jakby takowe założenie, to jak ono może mieć określoną wartość. Czy wtedy nie jest zmienną?

Albo zapis { populacja=populacja*2 }. Tak na chłopski rozum to jest sprzeczne równanie tak samo jak {godzin=godzin+1}. Tłumacze sobie, że to jest tylko właściwy zapis dla pętli - wewnętrzny. Mam rację, czy to można jakoś inaczej wytłumaczyć?

Pozdrawiam

 

 

3 odpowiedzi

+1 głos
odpowiedź 4 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)

int populacja=1

Owszem może tak być ,ale jeżeli chodzi o populacje, widać, że sens tkwi w tym, aby  się ona zwiększała.
Pojawia się więc pytanie, od jakiej wartości ma się zwiększać ? Jeżeli jej wcześniej nie zadeklarujesz.
Owszem, może tak być, ale w C++ każda niezadeklarowana  wartość liczbowa ma na starcie przypisaną wart.początkową równą zero, niezależnie czy tego dokonasz czy nie ;D
Drugie pytanie, to z czym miałoby to być sprzeczne ?

Podsumowując, chodzi o to, żeby deklarując zmienna od razu nadać jej wartość.
 

 populacja=populacja*2

Matematycznie  owszem jest to sprzeczne, jednak w programowaniu stosuje się pewną zasade, bez znajomości której będzie wydawało Ci się to conajmniej dziwne :P Ma to na celu zwiększanie odpowiednie wartośći, w tym wypadku populacji (z każdym kokiem pętki, zwiększamy populacje dwukrotnie)

Ogólnie chodzi o to, że musisz patrzeć tylko na prawą str rónania, tutaj widzisz że zwiększasz populacje dwukrotnie i ta wartość liczbowa "zapisuje się" jako nowa wartość populacji :D

 

komentarz 4 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)

Łopatologicznie - tak to działa :

int populacja=1   // oszczedzamy linijke kodu
zamiast: 

int populacja
populacja=1;

w 1 kroku
populacja=1*2   (2)

w 2 kroku

populacja=2*2  (4)

w 3 kroku 
pupulacja=2*4 (8)

w 4 kroku 
pupulacja=2*8 (16)

Zauważ że jest to zwykłe potęgowanie 2, zapisane za pomocą pętli :D

komentarz 4 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Czy jeszcze czegoś nie rozumiesz ?
Mam nadzieje,że wszystko jasne :D
komentarz 5 sierpnia 2015 przez gregorn97 Nowicjusz (120 p.)
Dziękuję za pomoc!

Z tego chyba wszystko rozumiem, mam nadzieję :D
Nie wiedziałem, że automatycznie liczbom jest przypisane zero, to by wyjaśniało sprawę.

Słyszałem, że c++ opiera się na logice i matematyce, stąd gdzie widzę znak równości to biorę to dosłownie. Czyli z tego chyba wynika, że jeśli ten warunek jest zapisany umownie, to zmieniając stronami to równanie, wtedy się wszystko popsuje lub będzie dzielił przez 2. Muszę to sprawdzić... :D

np: populacja*2=populacja /// i czy wtedy to bedzie to samo ==>  populacja=0,5*populacja

Jeszcze raz dziękuje!
komentarz 5 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Wtedy program się wykrzaczy z prostego powodu, po prawej str bedzie caly czas 1, ktore ma byc przypisane wartosci populacja*2, wteedy to jest bez sensu.

Pamietaj, to jest programowanie, a nie matematyka, to są te różnice, znaczne, aby osiągnać zamierzony cel.
komentarz 5 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Reasumując wszystko :
W matematyce taki zapis k=c, jest równoważny z zapisem c=k, a w programowaniu tak nie jest :D
+1 głos
odpowiedź 4 sierpnia 2015 przez kotfuterkowy Dyskutant (9,220 p.)

Przyporządkowanie wartości zmiennej poza pętlą ma oczywiście sens. Gdybyś napisał 

int populacja;

zamiast

int populacja=1;

to program zrozumie (przynajmnie w Visualu), że populacja na samym początku jest równa 0 i pętla ciągle mnożyłaby 0*2 i populacja była by równa 0;

A tak -> na początku masz 1, potem 2*1=2, potem 2*2=4 itp.

Co do:

populacja=populacja*2;

oraz:

godzin=godzin+1;

to nie są równania, tylko przyporządkowanie. Z każdym obiegiem pętli program robi 2 rzeczy:

 - bierze zmienną populacja i przyporządkowuje jej liczbę 2 razy większą od niej samej

 - bierze zmienną godzin i przyporządkowuje jej liczbę o 1 większą od niej samej

Mam nadzieję, że pomogłem.

komentarz 5 sierpnia 2015 przez gregorn97 Nowicjusz (120 p.)
Oczywiście że pomogłes, dziękuję!
+1 głos
odpowiedź 4 sierpnia 2015 przez Krawiec91 Pasjonat (19,600 p.)

Co do ostatniego punktu. Operator "=" to operator przypisania, działa on zawsze tak samo, bez względu na to czy jest w pętli, instrukcji warunkowej, funkcji czy czymkolwiek innym. Jeśli chodzi o zapis matematyczny, to faktycznie wygląda, że nie ma logiki.;) W programowaniu to inaczej wygląda.
Tłumacząc to możliwie prosto, operator przypisania, przypisuje ,to co stoi po jego prawej stronie temu co stoi po jego lewej stronie. Zmienne zmiennymi, również dobrze możesz powiedzieć, że dany samochód ma 100 KM. Czyli jego właściwości jaką jest moc, przypisujesz wartość liczbową. Inaczej możesz powiedzieć, że samochód A ma 2 razy koni mechanicznych to samochód B, czyli mocy samochodu A przypisujesz moc samochodu B pomnożoną przez 2. W przypadku programu, który zamieściłeś, np.
 

populacja=populacja*2;

Do zmiennej populacja zostaje przypisana jej obecna wartość pomnożona przez 2. Należy pamiętać o tzw. priorytetach operatorów w C/C++ czy jakimkolwiek innymi języku programowania. Może to górnolotne określenia ("priorytety operatorów"). W praktyce sprowadza się to do tego samego jak kolejność działań (dodawanie, odejmowanie, mnożenie, dzielenie) jak w podstawówce.;) A więc w przypadku fragmentu kodu, zamieszczonego wyżej, mnożenie jest wykonywane przed przypisaniem.

Co do zmiennych, nie wiem czy akurat trafiłem w to co chciałbyś wiedzieć, ale może się uda. Zadeklarowane zmienne mogą mieć dowolną wartość w przypadku zmiennych lokalnych (czyli definiowanych wewnątrz np. funkcji) lub mogą być automatycznie zerowane w przypadku zmiennych globalnych, czyli mówiąc łopatologicznie zaraz po includach. A mówiąc bardziej "fachowo" poza funkcjami. Użycie zmiennej z przypadkową wartością (czyli jak nie przypisujesz tej zmiennej jakiejkolwiek wartości), może powodować dziwne, nieoczekiwane działania programu, np. niewykonywanie pętli, która powinna się wykonywać i inne nieoczekiwane sytuacje.

komentarz 5 sierpnia 2015 przez gregorn97 Nowicjusz (120 p.)
Dziękuję za wyczerpującą odpowiedź. Trafiłeś w to co chciałem wiedzieć :)

"mnożenie jest wykonywane przed przypisaniem" ... ciężko się przestawić, bo w matematyce znaku równości nie łączymy z kolejnością wykonywania działań. Więc przypisanie jest na końcu jeśli chodzi o polecenia.

Dziękuję jeszcze raz za odpowiedzi i pozostaje mi przetestowanie tych rzeczy w praktyce :D
komentarz 5 sierpnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Operator przypisania ma jeden z najniższych priorytetów, więc zbyt wielkich problemów z przestawieniem się nie powinno być. Z operatorami wiąże się raz, że priorytety a dwa łączność, która też sporo mówi o działaniu operatora, choćby co do czego jest przypisywane jeśli chodzi o operator =, dlaczego to co po prawej stronie operatora do tego co po lewej stronie, a nie odwrotnie. Operator = ma łączność od prawej do lewej, czyli to co po prawej stroniej przypisuje do tego co po lewej stronie.
http://stackoverflow.com/questions/20767745/who-defines-c-operator-precedence-and-associativity
komentarz 5 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Za bardzo myślisz :"matematycznie" :P
Wszystko się sprowadza do tego, tak jak napisał Krawiec91, najpierw wykonuje się to co jest po prawej stronie "=" i ta wyliczona wartość jest "nową" wartością populacji.

Rozumiem, że to jest mało intuicyjne, szczególnie tak jest, ale gdybyśmy chcieli rozważyć ten problem typowo matematycznie, to potrzebowalibyśmy bardzo dużo zmiennych, które by działały w ten sposób:
a-2*populacja (2*1)
b=2*a (2*2)
c=2*b (2*4)
d=2*c (2*8) i tak dalej z użyciem tysiąca zmiennych :P
Ten zapis "populacja=populacja*2" załątwia sprawę,bez potrzeby rozpisywania tego w tak tragiczny sposob :D

Coś czuję,że jak dojdziesz do rekurencji, to dopiero będzie ciekawie :D :)
komentarz 5 sierpnia 2015 przez gregorn97 Nowicjusz (120 p.)
Dziękuje za dokładne wyjaśnienie. Im więcej się rozumie skąd się co bierze, a nie na ślepo stosuje, to tym większa motywacja i przyjemność z zabawy ;)

~Dragonet.17 rzeczywiście zapis odrobinę krótszy, tylko muszę się przestawić :D
No muszę powiedzieć, że zmotywowałeś mnie tą rekurencja, ryje banie nieźle :D
komentarz 5 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Masz podobne podejście do mojego,jak zaczynałem więc wiem jak to jest :P

Podobne pytania

0 głosów
2 odpowiedzi 227 wizyt
pytanie zadane 7 sierpnia 2015 w PHP przez niezalogowany
0 głosów
1 odpowiedź 94 wizyt
pytanie zadane 29 stycznia 2018 w Matematyka, fizyka, logika przez must Bywalec (2,980 p.)
0 głosów
1 odpowiedź 266 wizyt
pytanie zadane 15 grudnia 2018 w C# przez ProCat Początkujący (310 p.)

92,539 zapytań

141,382 odpowiedzi

319,480 komentarzy

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

...