pętla for wyjaśnienie

0

Witam. Na początek informuję, iż moja przygoda z programowaniem jest dosyć krótka, ale do rzeczy. Mam problem z pewnym kodem dotyczącym potęgowania w C:

#include <stdio.h>
long int potega(long int podstawa, int wykladnik)
{
    int i;
    int wynik = 1;
        for (i = 0; i<wykladnik; i++)
            wynik= podstawa*wynik;
        return wynik;

}
int main()
{
    int a,b;
    printf("Wprowadz podstawe i wykladnik\n");
    scanf("%d%d", &a, &b);
    printf("Potega wynosi %d", potega(a,b));
    return 0;
}

konkretnie chodzi mi o ten fragment:

#include <stdio.h>
long int potega(long int podstawa, int wykladnik)
{
    int i;
    int wynik = 1;
        for (i = 0; i<wykladnik; i++)
            wynik= podstawa*wynik;
        return wynik;

}

Czy ktoś mógłby mi krok po kroku wyjaśnić jak działa ten właśnie fragment? Dlaczego dajemy zmienną i, dlaczego w instrukcji pętli for i ma być mniejsze od wykładnika? A potem dlaczego jest dane takie równanie, że wynik=wynik*podstawa?
Z góry dziękuję za pomoc.

0

w pętli for masz 3 segmenty-w pierwszej dajesz ustawiasz zmienną w drugiej masz warunek dla którego ta pętla się wykonuje i w trzeciej modyfikujesz zmienną. W twoim wypadku po prostu ustawiasz i na 0, pętla wykonujesz póki i jest mniejsze od wykładnika i po każdym przejściu pętli zwiększasz i o 1

0

Dlaczego dajemy zmienną i

Taka konwencja - i od iterator/index. Równie dobrze mogłoby być for(iLoveColdplay = 0; ...), ale po co tracić na czytelności? Poza tym to także niepotrzebnie zwiększałoby rozmiar kodu.

dlaczego w instrukcji pętli for i ma być mniejsze od wykładnika

Ponieważ zaczynasz wykonywać pętlę od zera, a nie jedynki (od zera właśnie jest prawidłowo), zatem jeśliby warunek brzmiał <= to pętla wykonywałaby się o jeden raz za dużo.

A potem dlaczego jest dane takie równanie, że wynik=wynik*podstawa?

To nie jest równanie, a przypisanie.
wynik *= podstawa; (bo tak wygląda to skrócone) oznacza po prostu mnożenie wyniku cały czas przez podstawę określoną liczbę razy, ponieważ o to właśnie chodzi w potęgowaniu:

2^1 = 2
2^2 = 2*2
2^3 = 2*2*2
2^4 = 2*2*2*2
i tak dalej
0
Patryk27 napisał(a):

Taka konwencja - i od iterator

Wydaję mi się, że i jest od index natomiast od iterator jest it, inaczej nie miałoby sensu aby iterator byl zwykłą liczbą (np., int i).

Patryk27 napisał(a):

Ponieważ zaczynasz wykonywać pętlę od zera, a nie jedynki //(od zera właśnie jest prawidłowo)

Dlaczego od zera jest prawidłowo? Wydaje mi się, że tak się przyjęło ponieważ tablice są indeksowane od zera. Nie widzę błędu w np. takiej pętli for (int i = 1; i <= 10; ++i).

0
Michał K napisał(a)

Dlaczego od zera jest prawidłowo? Wydaje mi się, że tak się przyjęło ponieważ tablice są indeksowane od zera

W takim właśnie kontekście rozpatruję tak jest prawidłowo - bo tak się przyjęło wszem i wobec. W podanej przez Ciebie pętli nie ma błędu i również jest czytelna.
Wiadomo - jeśli trzeba na przykład indeksować od trójki, to nie ma sensu robić for (int i=0; i<cośtam-3; i++) po to tylko, aby 'trzymać się zasad'.

1 użytkowników online, w tym zalogowanych: 0, gości: 1