Wpis z mikrobloga

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
l.....a - Pytanko co do kodu: https://pastebin.com/vZt7LHRZ

Czy drugie for zaczyna...

źródło: comment_dTAhAl4xXCUj9kdIT0xG08FFREbQDviS.jpg

Pobierz
  • 19
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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.
  • Odpowiedz
  • 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"
  • Odpowiedz
@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.
  • Odpowiedz
@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
  • Odpowiedz
@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ą.
  • Odpowiedz
@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.
  • Odpowiedz
@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 -
  • Odpowiedz
@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 -
  • Odpowiedz
  • 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
  • Odpowiedz
@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
  • Odpowiedz