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

Lekcja 17 zadanie 2

Ostatnio zmodyfikowano 2014-03-04 18:08
Autor Wiadomość
poprawka
Temat założony przez niniejszego użytkownika
Lekcja 17 zadanie 2
» 2014-03-04 16:01:08
Witam

Jak w temacie zadanie 2 z lekcji 17, przedstawiam niżej, wydaje się działać poprawnie lecz mam jedno pytanie. Chodzi mi mianowicie o to iż Kiedy wpisujemy:
Podaj liczbe nr " to kolejne koło pętli nie zmienia numerów na kolejne.
Próbowałem na wiele sposobów lecz nie udało mi się osiągnąć zamierzonego efektu. Jesli ktoś może mi podpowiedzieć jak zrobić żeby wyglądało to
Podaj liczbe nr 1
Podaj liczbe nr 2
...

C/C++
#include <iostream>
#include <cstdlib>
using namespace std;

int wczytajLiczbe()
{
    bool sukces;
    int a;
    int i = 0;
    ++i;
    do {
        cout << "Podaj  liczbe: " << "nr " << i << endl;
        cin.clear();
        cin.sync();
        cin >> a;
        sukces = cin.good();
       
    }
    while( sukces != true );
   
    return a;
}

int main()
{
    int wybor;
    while( true )
    {
        do {
            cout << "######## MENU ########" << endl
            << "Jakie dzialanie chcesz wykonac?" << endl
            << "Wybierz [1] Dodawanie" << endl
            << "Wybierz [2] Odejmowanie" << endl
            << "Wybierz [3] Mnozenie" << endl
            << "Wybierz [4] Dzielenie" << endl
            << "Wybierz [5] Rezygnuje" << endl << endl;
           
            cout << "Wybieram: ";
            cin.clear();
            cin.sync();
            cin >> wybor;
           
        } while( wybor <= 0 || wybor >= 6 );
       
        switch( wybor )
        {
        case 5:
            return 0;
        }
       
        switch( wybor )
        {
        case 1:
            cout << "Wynik dodawania = " << wczytajLiczbe() + wczytajLiczbe() + wczytajLiczbe() << endl << endl;
            break;
        case 2:
            cout << "Wynik odejmujmowania = " << wczytajLiczbe() - wczytajLiczbe() << endl << endl;
            break;
        case 3:
            cout << "Wynik mnozenia = " << wczytajLiczbe() * wczytajLiczbe() << endl << endl;
            break;
        case 4:
            cout << "Wynik dzielenia = " << wczytajLiczbe() / wczytajLiczbe() << endl << endl;
            break;
        }
    }
}
P-105622
SeaMonster131
» 2014-03-04 16:04:13
Możesz umieścić licznik liczb globalnie lub przekazywać go przez referencję, np coś takiego:
C/C++
int wczytajLiczbe( int & licznik )
{
    ..
    do {
        ++licznik;
    } while();
}

int main()
{
    int licznik = 0;
    wczytajLiczbe( licznik );
   
}
P-105623
poprawka
Temat założony przez niniejszego użytkownika
» 2014-03-04 16:17:55
Dodałem to do kodu lecz same błędy się pojawiły.

Czy możesz to wstawić do mojego kodu, tak aby działało, a wtedy sobie przeanalizuje, co robię źle.

__________
Nadal nie iwem jak to zrobić.

I czy może mi ktoś wytłumaczyć dlaczego w kolejnym zadaniu z tej lekcji, czyli zadanie 3 lekcja 17.

Zmienia mi się numer kolejności przy losowanych liczbach. Czyli tak jak właśnie chce zastosować w tym zadaniu wyżej. Dlaczego tu działa a tam nie.


C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int losujliczbe()
{
    srand( time( NULL ) );
    int a = 0;
    int i = 1;
    do
    {
        int losuj =( rand() % 11 ) + 50;
        cout << "nr " << i << " liczba " << losuj << endl;
        i++;
        a++;
    }
    while( a < 6 );
   
}
int main()
{
    losujliczbe();
}
P-105628
leon_w
» 2014-03-04 18:08:07
Za każdym razem, jak wchodzisz w jakąś funkcje ( tu losujliczbe() ), zmieniasz jakieś zmienne w tej funkcji, lecz gdy wychodzisz z funkcji, wszystkie zmienne są "zerowane" (a raczej nadawane są wartości przypisane do niej). Można temu zapobiec, dodając przed deklaracją zmiennej przedrostek "static" (np: static int a = 0;). Niestety tutaj napotkasz kolejny problem, ponieważ zmienna nie będzie się zerowała, tylko pokazywała kolejne liczby, nawet przy  juz następnym działaniu.

Dość dobrym rozwiązaniem (chociaż pewnie do tej części kursu jeszcze nie doszedłeś) jest zastosowanie referencji.
Deklarujesz zmienną (np: int licznik = 0; ) w funkcji main().
Dodajesz argument dla funkcji wczytajliczbe()  ( int wczytajliczbe(int & i) ), nazwa zmiennej może być dowolna, nie musi być taka jak przy wywołaniu jej z funkcji main().
Później w mainie w każdym wywołaniu funcji wczytajliczbe(), musisz dodać argument w postaci zmiennej "licznik" ( wczytajliczbe(licznik) ).
Jeszcze po każdym działaniu musisz wyzerować zmienną "licznik"(w każdym case, ale przed break)


Co do drugiego pytania: w drugim przykładzie licznik się zmienia, ponieważ działanie wykonuję się w pętli, cały czas w danej funkcji, bez wychodzenia z niej. Przy następnym losowaniu liczenie zacznie się od zera, ale puki instrukcja (tutaj sześciokrotnie) wykonuje się w danej funkcji, licznik się nie zeruje, dopiero przy wyjściu z tej funcji.
P-105637
« 1 »
  Strona 1 z 1