l.....a
l.....a
Pytanko co do kodu: https://pastebin.com/vZt7LHRZ

Czy drugie for zaczyna się wykonywać kiedy pierwszy for będzie fałszywe?
+ co dokładnie robi drugie for? Czemu inicjacja zmiennej to j=n-1? I po co tam ten if w forze?
Czy klamry tutaj mają większe znaczenie, tj. czy jakby ich nie było to czy kod pokazywałby to samo?

#ansic #cpp #naukaprogramowania
  • Najlepsze
  • Wszystkie komentarze
Cilthal
Cilthal
@laczka: Samo modulo nie pomija to służy do obliczenia reszty z dzielenia.

for (int j=n-1; j>=0; j--) - initializacja petli, warunek poczatkowy to j=n(wartosc wyzej obliczona) - 1; petla dziala do momentu przekroczenia/zrownania j z 0; j maleje co "obieg"
{
if (j%2 == 1) - jezeli reszta z dzielenia j przez 2 bedzie rowna 1 wykona sie ponizsza
l.....a
l.....a
@Cilthal: @Oo-oO: @Kooneer: dzięki panowie, już rozumiem ᕙ(⇀‸↼‶)ᕗ
Cilthal
Cilthal
@laczka: Paniczu, nie jestem jeszcze Panem ( ͡° ͜ʖ ͡°)
A co do tego kodu to jeszcze
Cilthal
Cilthal
@laczka: zmienna do for moze miec dowolna literke (moze miec tez wiele liter). j%2 - sprawdza parzystosc. Drugi for zaczyna sie zawsze, bo on nie ma warunku z 1 fora. Klamry musza byc, znaczy sie nie koniecznie bo przy if'ach mozna to inaczej rozpisac. Edit: for też może być bez klamr pozniej ale to jest generalnie nie stosowane.
Oo-oO
Oo-oO
1
@laczka drugi "for" się wykonuje gdy pierwszy się zakończy, czyli wczyta się n liczb. "For" nie jest fałszywy, zmienna może być. Drugie "for" czyta zapisane liczby w tablicy od końca, bo taka jest treść zadania stąd też taka inicjalizacja j; pomija co drugą - po to ten "if" w pętli. Klamry mają znaczenie, zwłaszcza w drugiej pętli, ich brak zmieni wynik. Na koniec ciekawostka, tab[n] to nie jest standard "ansi c"
Kooneer
@laczka:

a)

Czy drugie for zaczyna się wykonywać kiedy pierwszy for będzie fałszywe

Nie, drugi for będzie wykonywał
Cilthal
Cilthal
@laczka: bo jak masz liczbe nieparzysta to % (modulo) da 0 przy nie parzystej da 1. Modulo to reszta z dzielenia, jak podzielisz 10 : 7 to masz wynik 1 i resztę 3. Przy dzieleniu 10 : 2 masz wynik 5 reszte 0. Przy dzieleniu 11 : 2 masz wynik 5 reszte 1.
Cilthal
Cilthal
@Kooneer: Nowoczesny kompilator potraktuje to jednakowo.
@laczka: A co do tego mojego pisania o modulo (reszcie z dzielenia) to poczytaj sobie o operacjach binarnych (bitwise). Żeby było jasne % nie jest operacją binarne ale one też są ważne i warto wiedzieć jak działają.
Kooneer
@Cilthal:
1)
Właśnie chyba zboczenie. Po prostu łatwiej się sprawdza czy reszta z dzielenia jest równa zeru (jedna cyfra), czy jakiejś innej, gdzie jest 9 innych (1 - 9), natomiast w tym wypadku będzie zawsze zwracać wynik zero - jeden.

2) właśnie nie jestem pewien czy przy pierwszym okrążeniu pętli nie zastosuje preinkrementacji na początku, co może poskutkować tym, że zaczniemy wpisywać zmienne od indeksu 1.
Kooneer
@laczka: Spójrz:
Twoja tablica jest indeksowana w zakresie <0; n-1>. Więc masz 0,1,2,3,4... n.
Czyli jeśli chciałabyś sprawdzić resztę z dzielenia to twój wynik zawsze będzie równy 0 (indeks parzysty + zero) lub (1 indeks nieparzysty). Dlaczego? Łatwo to pokazać na pierwszych indeksach:
2 - reszta 0
3 - reszta 1
4 -
Kooneer
@laczka: Spójrz:
Twoja tablica jest indeksowana w zakresie <0; n-1>. Więc masz 0,1,2,3,4... n.
Czyli jeśli chciałabyś sprawdzić resztę z dzielenia to twój wynik zawsze będzie równy 0 (indeks parzysty + zero) lub (1 indeks nieparzysty). Dlaczego? Łatwo to pokazać na pierwszych indeksach:
2 - reszta 0
3 - reszta 1
4 -
Oo-oO
Oo-oO
1
@Oo-oO oops korekta, tu w drugiej pętli akurat nie zmieni się wynik jak nie będzie klamer, ale ich brak, lub wcięcia takie jak masz prowadzą do takich właśnie błędów których czasem nie widać, lub trudno zauważyć.
@laczkalaczka skoro wiesz co robi modulo, to widzisz że jeśli j maleje od n-1 o jeden w każdym obiegu pętli to by wybrać i wypisać co drugą liczbę trzeba to ograniczyć co właśnie robi
l.....a
l.....a
@Cilthal: ale czemu j%2 musi być 1?
Kooneer
@Kooneer: Nie przeczytałem dokładnie zadania i kodu. Zostawiłbym to j%2 == 1, jest gites
Cilthal
Cilthal
@Kooneer: Właśnie miałem ci napisać ( ͡° ͜ʖ ͡°) Chociaż mi tłukł ojciec żeby sprawdzać do 0, ale to pewnie jakieś zboczenie.
Co do for to może być też tak:

for(i = 1; i <= 10; i++ )
jedna_powtarzana_instrukcja;

@laczka:
Z tym, że tutaj można wstawić tylko 1 instrukcję, wiec chcąc zrobić tak jak u ciebie musiałabyś wrzucić to co się dzieje w forze
Kooneer
@laczka: Natomiast w pierwszym forze zmieniłbym z ++i na i++
l.....a
l.....a
@Kooneer: @Cilthal: wiem co robi modulo ale nie wiem czemu on tam się pojawił :/ w sensie pomija co drugą liczbę ale czemu akurat kiedy reszta wynosi 1 a nie 0?