Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Zrozumienie działania pętli for

Ostatnio zmodyfikowano 2017-06-01 14:16
Autor Wiadomość
kolt
Temat założony przez niniejszego użytkownika
[C++] Zrozumienie działania pętli for
» 2017-05-31 12:59:40
Cześć.
Jest to mój pierwszy post więc witam wszystkich użytkowników. Jestem świeżynką jeśli chodzi o programowanie i dopiero uczę się podstaw. Zacząłem od kursów na tej oraz innych stronach, potem w moje ręce trafiła książka Prata Język C++ - Szkoła programowania. Przerabiam ją rozdział po rozdziale i czasami nie wszystko rozumiem (przechodzę jednak dalej bo zauważyłem, że przerabiając kolejne rozdziały rozjaśnia mi się to co było wcześniej niezrozumiałe). Obecnie jestem przy rozdziale 6 i mam problem ze zrozumieniem działania programu z Listingu 6.14:

C/C++
//PRATA R 6 - L 6.14

#include <iostream>

const int Max = 5;

int main()
{
    using namespace std;
   
    // get data
    int golf[ Max ];
   
    cout << "Please enter your golf scores.\n";
    cout << "You must enter " << Max << " rounds.\n";
   
    int i;
    for( i = 0; i < Max; i++ )
    {
        cout << "round #" << i + 1 << ": ";
       
        while( !( cin >> golf[ i ] ) )
        {
            cin.clear(); // reset input
            while( cin.get() != '\n' )
                 continue; // get rid of bad input
           
            cout << "Please enter a number: ";
        }
    }
   
    // calculate average
    double total = 0.0;
   
    for( i = 0; i < Max; i++ )
         total += golf[ i ];
   
    // report results
    cout << total / Max << " = average score "
    << Max << " rounds\n";
   
    return 0;
}

Rozumiem jak działa pętla czyszcząca strumień w przypadku podania nieprawidłowych danych ale nie rozumiem kolejności działania pętli która zlicza sumę potrzebną do średniej (tutaj nazwana "//calculate average"). Czy obie pętle for działają równocześnie, tzn. kiedy wprowadzamy poprawne dane to od razu są one sumowane tutaj: total += golf(i) ?

Chodzi mi o wyjaśnienie w jakiej kolejności dokładnie się to odbywa. Będę wdzięczny jeśli ktoś mógłby mi łopatologiczne napisać co się po kolei dzieje w tym programie (im dokładniej, tym lepiej).

pozdrawiam
P-161852
darko202
» 2017-05-31 13:46:23
Zapoznaj się z technika debugowania programu
to pozwoli prześledzić program krok po kroku
oraz oglądać stany zmiennych po wykonaniu każdej linii programu

np.
http://cezarywalenciuk.pl/blog​/programing/post​/breakpoints-i-debugowanie-kodu-w-visual-studio-2010
https://www.matematyka.pl​/336440.htm
jest dostępne dla wszystkich kompilatorów C++
P-161854
pekfos
» 2017-05-31 14:23:59
Czy obie pętle for działają równocześnie, tzn. kiedy wprowadzamy poprawne dane to od razu są one sumowane tutaj: total += golf(i) ?
Nic nie jest wykonywane równolegle samo z siebie. Wszystkie pętle w C++ działają tak samo. Możesz zapisać while za pomocą for i vice versa.
P-161856
kolt
Temat założony przez niniejszego użytkownika
» 2017-05-31 14:28:27
Dziękuję darko202, na pewno używanie debugera będzie mi się przydawać w przyszłości. Z przeprowadzonych testów wyszło mi, że jest tak jak pisałem - czyli każda poprawna wartość jest wprowadzana do tablicy i sumowana z totalem (a wartości niepoprawne pomijane). Obie pętle for działają niemal jednocześnie.

Przerobiłem lekko program i również działa poprawnie (wsadziłem wszystko w jedną pętlę for):

C/C++
//PRATA R 6 - L 6.14

#include <iostream>

const int Max = 5;

int main()
{
    using namespace std;
   
    // get data
    int golf[ Max ];
   
    cout << "Please enter your golf scores.\n";
    cout << "You must enter " << Max << " rounds.\n";
   
    int i;
    double total = 0.0;
   
    for( i = 0; i < Max; i++ )
    {
        cout << "round #" << i + 1 << ": ";
       
        while( !( cin >> golf[ i ] ) )
        {
            cin.clear(); // reset input
            while( cin.get() != '\n' )
                 continue; // get rid of bad input
           
            cout << "Please enter a number: ";
        }
       
        total += golf[ i ];
    }
   
    // calculate average
    //double total = 0.0;
   
    //for (i = 0; i < Max; i++)
    //  total += golf[i];
   
    // report results
    cout << total / Max << " = average score "
    << Max << " rounds\n";
   
    return 0;
}

Czy mój przerobiony program ma jakieś wady w stosunku do pierwszego? Z testów wynika, że działa tak samo.
P-161857
pekfos
» 2017-05-31 14:47:30
Teraz tablica jest niepotrzebna.
P-161859
kolt
Temat założony przez niniejszego użytkownika
» 2017-05-31 14:57:32
Faktycznie pekfos, nie zauważyłem tego. Działa teraz bez tablicy. W takim razie ostatnie pytanie - które rozwiązanie jest preferowane, z tablicami czy bez? Czy w ogóle jest sens się nad tym zastanawiać czy raczej to kwestia preferencji programisty?
P-161860
pekfos
» 2017-05-31 16:30:08
Jeśli się da, nie wczytuj wszystkich elementów, żeby dopiero potem coś z nimi zrobić. W ten sposób nie masz ograniczenia na ilość elementów, a kod jest prostszy. Czasami charakterystyka zadania wymaga zastosowania tablicy, np wczytaj elementy i wypisz w odwrotnej kolejności, albo posortowane.
P-161863
kolt
Temat założony przez niniejszego użytkownika
» 2017-06-01 14:16:33
Rozumiem i dzięki za wszystkie porady.
P-161924
« 1 »
  Strona 1 z 1