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

Niezmiennik pętli while

Object Storage Arubacloud
0 głosów
340 wizyt
pytanie zadane 15 listopada 2020 w C i C++ przez p_wika Nowicjusz (190 p.)
edycja 15 listopada 2020 przez p_wika

Witam, czy ktoś mógłby mi powiedzieć jaki jest niezmiennik tej pętli? Jest to program wyliczający najmniejszą liczbę naturalną n spełniającą nierówność 1+1/2+1/3+...+1/n>10

#include <stdio.h>
int main()
{   
    int licznik = 0;
    double suma = 0;
    double n = 1;
    while(suma < 10) /*Pętla wykonuje się tyle razy ile wynosi
                      najmniejsza liczba n spełniająca warunek zadania*/
    {
       suma = suma + odwr;  
       n = n+1;
       licznik++;
    }
    
    printf ("Najmniejsza liczba spełniająca warunek zadania wynosi %d\n", licznik);
}

 

1 odpowiedź

0 głosów
odpowiedź 15 listopada 2020 przez Wiciorny Ekspert (273,810 p.)
Czym jest niezmiennik? Jest to "coś" w dla pętli w tym wypadku będzie to np. wyrażenie, dla którego po każdym wykonaniu iteracji tej pętli, zdanie dotyczące np tej zmiennej/wyrażenia  - > jej wartości/wartości wyrażenia jest prawdziwe, to znaczy przy założeniu że liczba x= 10;
po iteracji pętli prawdą będzie że x =10, wtedy jest to X niezmiennik pętli.  Ale takie zadanie jest trywialne.

Zdanie logiczne przed obiegiem ma byc równe zdaniu po obiegu.
Ten program nie jest poprawny, więc na razie  licznik jest niezmiennikiem pętli gdyż przed obiegiem wynosi 0, i po obiegu pętli wynosi zero, potem na 1-szym obiegu pętli wynosi 1, i po zakonczeniu 1 :)
komentarz 15 listopada 2020 przez p_wika Nowicjusz (190 p.)
Ok, mniej więcej zaczynam rozumieć :) A w takim razie dlaczego ten program jest niepoprawny?
komentarz 15 listopada 2020 przez tkz Nałogowiec (42,020 p.)

Bo źle zaimplementowałaś wzór. Spójrz jeszcze raz na wyrażenie, w sensie matematyczne. To 1+1/2+1/3+...+1/n>10 nie jest równoważne z tym zapisem 

suma = suma + odwr;  
n = n+1;
licznik++;

 

komentarz 15 listopada 2020 przez p_wika Nowicjusz (190 p.)
Teraz poprawiłam, myślę że powinno być ok.
2
komentarz 15 listopada 2020 przez tkz Nałogowiec (42,020 p.)

To ma być pseudokod, czy ma w pełni działać? Zmienna "odwr" nie istnieje. No i kod jest nadal niepoprawny. Ciekawszym problemem może okazać się dokładność liczb zmiennoprzecinkowych w C, która swoją drogą jest okropna. 

    long double suma = 1;
    long double mianownik = 1;
    const unsigned niezmiennik = 10;
    while(suma<=niezmiennik)
    {
        suma+=1/mianownik;
        ++mianownik;
    }

 

Podobne pytania

0 głosów
1 odpowiedź 493 wizyt
pytanie zadane 23 października 2019 w Rozwój zawodowy, nauka, praca przez Tedi Użytkownik (580 p.)
0 głosów
5 odpowiedzi 351 wizyt
0 głosów
1 odpowiedź 249 wizyt
pytanie zadane 9 lutego 2023 w C i C++ przez Mefer Nowicjusz (140 p.)

92,760 zapytań

141,684 odpowiedzi

320,470 komentarzy

62,104 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

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!

...