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

Niezmiennik pętli while

Konkurs Mistrz Programowania
0 głosów
469 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 (282,600 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,040 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,040 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ź 629 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 1,365 wizyt
0 głosów
1 odpowiedź 480 wizyt
pytanie zadane 9 lutego 2023 w C i C++ przez Mefer Nowicjusz (140 p.)

93,657 zapytań

142,577 odpowiedzi

323,100 komentarzy

63,174 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

Kursy INF.02 i INF.03
...