Problem z pętlą...

0

Witam. Troche sie zacząłem uczyć c++... Udało mi sie skombinować 3 tomy Symfoni c++ J.Grebosza. Do tego jakieś fora(m.in. 4.programmers). I mam problem, zrobiłem taki niby kalkulator do obliczania różnych pól itd. I chce, żeby działał on non stop, do czasu, kiedy nie zostanie kliknięta litera S, zrobiłem to tak:

#include <iostream>
#include <windows.h>
using namespace std;
main()
{
	char litera;
	int wybor;
	do
	{
	cout << "Podaj dzialanie, ktore chcesz wykonac, wynik bedzie widoczny przez 7 sekund!\n"
	<<"1. Dodawanie\n"
		<<"2. Odejmowanie\n"
			<<"3. Mnozenie\n"
				<<"4. Dzielenie\n"
					<<"5. Potega drugiego i trzeciego stopnia\n"
						<< "6. Obliczanie pola kola z jego promienia\n"
							<< "7. Obliczanie obwodu kola z jego promienia\n"
								<< "8. Obliczanie pola trojkata\n"
									<< "9. Obliczanie pola trapezu\n"
										<< "10. Klinij - S - aby zakonczyc\n";
	cin >> wybor;
	switch(wybor)
		{
			case 1:
				float a, b, wynik;
				cout << "Podaj pierwsza i druga liczbe: \n";
				cin >> a;
				cin >> b;
				wynik = a + b;
				cout << "Wynik dzialania: " << a << " + " << b << " wynosi:  " << wynik;
				break;
			case 2:
				float c, d, wynik_2;
				cout << "Podaj odjemna i odjemnik: \n";
				cin >> c;
				cin >> d;
				wynik_2 = c - d;
				cout << "Wynik dzialania: " << c << " - " << d << " wynosi: " << wynik_2;
				break;
			case 3:
				float e, f, wynik_3;
				cout << "Podaj liczby, ktore chcesz pomnozyc: \n";
				cin >> e;
				cin >> f;
				wynik_3 = e * f;
				cout << "Wynik dzialania: " << e << " * " << f << " wynosi: " << wynik_3;
				break;
			case 4:
				float g, h, wynik_4;
				cout << "Podaj dzielna i dzielnik: \n";
				cout << "Dzielna: ";
				cin >> g;
				cout << "Dzielnik: ";
				cin >> h;
				wynik_4 = g / h;
				cout << "Wynik dzialania: " << g << " / " << h << " wynosi: " << wynik_4;
				break;
			case 5:
				float pot, wynik_pot_2, wynik_pot_3;
				cout << "Podaj liczbe, z ktorej chcesz znac potege: \n";
				cin >> pot;
				wynik_pot_2 = pot * pot;
				wynik_pot_3 = pot * pot * pot;
				cout << "Potega dla liczby " << pot << " drugiego stopania wynosi: "
					 << wynik_pot_2 << " a trzeciego stopnia: " << wynik_pot_3;
				break;
			case 6:
				float promien, wynik_6;
				cout << "Aby obliczyc pole kola, podaj mi jego promien(pi~3.14159): ";
				cin >> promien;
				wynik_6 = promien * promien * 3.14159;
				cout << "Pole kola o promieniu: " << promien << " wynosi: " << wynik_6;
				break;
			case 7:
				float promien_2, wynik_7;
				cout << "Podaj promien, aby obliczyc obwod kola(pi~3.14159): ";
				cin >> promien_2;
				wynik_7 = 2 * 3.14159 * promien_2;
				cout << "Obwod kola o promieniu: " << promien_2 << " wynosi: " << wynik_7;
				break;
			case 8:
				float x, y, wynik_8;
				cout << "Aby obliczyc pole trojkata podaj jego: \n"
				<< "Dlugosc podstawy: ";
				cin >> x;
				cout << "Wysokosc: ";
				cin >> y;
				wynik_8 = x * y / 2;
				cout << "Pole trojkata i podstawie: " << x << " i wysokosci: " << y << 
						" wynosi: " << wynik_8;
				break;
			case 9:
				float m, n, o, wynik_9_a, wynik_9_b, wynik_9_c;
				cout << "Aby obliczyc pole trapezu podaj mi:\n"
					 << "Podstawe nr 1: ";
				cin >> m;
				cout << "Podstawe nr 2: ";
				cin >> n;
				cout << "Wysokosc: ";
				cin >> o;
				wynik_9_a = m + n;
				wynik_9_b = wynik_9_a * o;
				wynik_9_c = wynik_9_b / 2;
				cout << "Pole trapezu o bokach: " << m << ", " << n << " i wysokosci: " << o;
				cout <<	" wynosi: " << wynik_9_c;
				break;
		}
		::Sleep(4 * 1000);
		system("cls");
	}
while(litera == 'S');			
}

Niby to działa, ale nie tak jak chce... Gdy klikne "S" to program sie wyłącza, po 4 sec(o to mi chodzi), ale gdy zrobie jakieś działanie, to wtedy po 4 sekundach program też sie wyłącza... Co ja żle tutaj wpisałem? while(litera == 'S') oznacza że gdy klikne S to sie pętla kończy, czy to jest jakoś inaczej?(prawde mówiąc, mam problem z pętlami...)

P.S Nie czepiajcie sie, że program jest tak pogmatwany, robie go swoim sposobem(chce aby był jak najdłuższy kod, wtedy pojęcia wchodzą mi do głowy).

Z góry dziękuje za pomoc...

1

Twój warunek jest taki: powtarzaj pętle tak długo, jak długo litera == 'S'. Oznacza to, że wciśnięcie S powoduje powrót na początek. Wszystko inne kończy program. Weź pod uwagę, że 'S' to co innego niż 's', które zapewne wciskasz.

Zmień warunek na przeciwny.

Wytłumaczyć możesz sobie to tak: powiedz na głos co znaczy Twój kod: do { ... } while(litera == 'S'): rób { ... } dopóki(litera równa się 'S'). Ale Ty chcesz, żeby to działało inaczej: rób { ... } dopóki(litera jest różna od 'S') (bo S oznacza wyjście). Słownik tak mówi o słowie dopóki - "do końca czasu, w którym coś trwa". Oznacza to, że pętla do ... while jest wykonywana tak długo, jak długo wartość wyrażenia w warunku jest true.

Edit: tego, że zmiennej litera nie wczytujesz poprawnie nie zauważyłem, @sig niżej dobrze mówi. Żeby naprawić Twoje rozwiązanie najprościej w pętli while wykorzystać zmienną wybor - wartość 0 może np. oznaczać wyjście.

1

Nigdzie nie wczytujesz litera, więc nie ma prawa działać. Lepiej zrób wyjście jako jeden z wyborów w pętli, masz tu gotowca bo widać że się starasz i większość sam zrobiłeś

#include <iostream>
//***************pod Linuxem windows.h niema
//#include <windows.h>
using namespace std;
main()
{
         //i tak nie wczytujesz
        //char litera;
        int wybor=0;
        //************************zmiana***************************************
        while(wybor !=10)
        {
        cout << "Podaj dzialanie, ktore chcesz wykonac, wynik bedzie widoczny przez 7 sekund!\n"
        <<"1. Dodawanie\n"
                <<"2. Odejmowanie\n"
                        <<"3. Mnozenie\n"
                                <<"4. Dzielenie\n"
                                        <<"5. Potega drugiego i trzeciego stopnia\n"
                                                << "6. Obliczanie pola kola z jego promienia\n"
                                                        << "7. Obliczanie obwodu kola z jego promienia\n"
                                                                << "8. Obliczanie pola trojkata\n"
                                                                        << "9. Obliczanie pola trapezu\n"
                                                                                << "10  - aby zakonczyc\n";
        cin >> wybor;
        switch(wybor)
                {
                        case 1:
                                float a, b, wynik;
                                cout << "Podaj pierwsza i druga liczbe: \n";
                                cin >> a;
                                cin >> b;
                                wynik = a + b;
                                cout << "Wynik dzialania: " << a << " + " << b << " wynosi:  " << wynik;
                                break;
                        case 2:
                                float c, d, wynik_2;
                                cout << "Podaj odjemna i odjemnik: \n";
                                cin >> c;
                                cin >> d;
                                wynik_2 = c - d;
                                cout << "Wynik dzialania: " << c << " - " << d << " wynosi: " << wynik_2;
                                break;
                        case 3:
                                float e, f, wynik_3;
                                cout << "Podaj liczby, ktore chcesz pomnozyc: \n";
                                cin >> e;
                                cin >> f;
                                wynik_3 = e * f;
                                cout << "Wynik dzialania: " << e << " * " << f << " wynosi: " << wynik_3;
                                break;
                        case 4:
                                float g, h, wynik_4;
                                cout << "Podaj dzielna i dzielnik: \n";
                                cout << "Dzielna: ";
                                cin >> g;
                                cout << "Dzielnik: ";
                                cin >> h;
                                wynik_4 = g / h;
                                cout << "Wynik dzialania: " << g << " / " << h << " wynosi: " << wynik_4;
                                break;
                        case 5:
                                float pot, wynik_pot_2, wynik_pot_3;
                                cout << "Podaj liczbe, z ktorej chcesz znac potege: \n";
                                cin >> pot;
                                wynik_pot_2 = pot * pot;
                                wynik_pot_3 = pot * pot * pot;
                                cout << "Potega dla liczby " << pot << " drugiego stopania wynosi: "
                                         << wynik_pot_2 << " a trzeciego stopnia: " << wynik_pot_3;
                                break;
                        case 6:
                                float promien, wynik_6;
                                cout << "Aby obliczyc pole kola, podaj mi jego promien(pi~3.14159): ";
                                cin >> promien;
                                wynik_6 = promien * promien * 3.14159;
                                cout << "Pole kola o promieniu: " << promien << " wynosi: " << wynik_6;
                                break;
                        case 7:
                                float promien_2, wynik_7;
                                cout << "Podaj promien, aby obliczyc obwod kola(pi~3.14159): ";
                                cin >> promien_2;
                                wynik_7 = 2 * 3.14159 * promien_2;
                                cout << "Obwod kola o promieniu: " << promien_2 << " wynosi: " << wynik_7;
                                break;
                        case 8:
                                float x, y, wynik_8;
                                cout << "Aby obliczyc pole trojkata podaj jego: \n"
                                << "Dlugosc podstawy: ";
                                cin >> x;
                                cout << "Wysokosc: ";
                                cin >> y;
                                wynik_8 = x * y / 2;
                                cout << "Pole trojkata i podstawie: " << x << " i wysokosci: " << y <<
                                                " wynosi: " << wynik_8;
                                break;
                        case 9:
                                float m, n, o, wynik_9_a, wynik_9_b, wynik_9_c;
                                cout << "Aby obliczyc pole trapezu podaj mi:\n"
                                         << "Podstawe nr 1: ";
                                cin >> m;
                                cout << "Podstawe nr 2: ";
                                cin >> n;
                                cout << "Wysokosc: ";
                                cin >> o;
                                wynik_9_a = m + n;
                                wynik_9_b = wynik_9_a * o;
                                wynik_9_c = wynik_9_b / 2;
                                cout << "Pole trapezu o bokach: " << m << ", " << n << " i wysokosci: " << o;
                                cout <<        " wynosi: " << wynik_9_c;
                                break;

                //*********************************************stąd zmiany*******************************************
                //sleeepa i system zakomentowałem bo ja spod Linuksa i tu nie działają. odkomentuj u siebie
                       case 10:
                                //::Sleep(4 * 1000);
                                //system("cls");
                                break;
                }
        }

//while(litera == 'S');
}

 
0

Dzięki wielkie ^^ Program działa i mam do zamiar "udoskonalać" z biegiem czasu. Endrju, wielkie dzięki za wytłumaczenie do...while :D Prawde mówiąc, najlepiej mi to wytłumaczyłeś ^^

I pytanie z całkiem innej beczki, a jak coś to nowy temat założe.
Czy w jezyku c++ można zrobić program wyliczający pierwiastek z liczby? Bo przeszukałem internet i sie lekko zdziwiłem... Znalazłem kilka kodów, ale każdy miał jakieś wady... Czy ten wzór sie sprawdzi? http://pl.wikipedia.org/wiki/Pierwiastek_kwadratowy#Wz.C3.B3r_algebraiczny
Bo jeżeli tak, to chyba go przepisze... Przydało by mi sie takie cuś ^^

1

Służy do tego funkcja sqrt z biblioteki math.h, opis z przykładem użycia masz tutaj http://www.cplusplus.com/reference/clibrary/cmath/sqrt/. Własną funkcję też oczywiście możesz napisać tylko po co skoro już jest gotowa, sprawdzona etc?

1

Jeżeli chcesz po prostu policzyć pierwiastek to możesz wykorzystać bibliotekę standardową: http://www.cplusplus.com/reference/clibrary/cmath/sqrt/

Spis różnorodnych metod jest np. tutaj: http://en.wikipedia.org/wiki/Methods_of_computing_square_roots ale nie ma sensu ich wykorzystywać, jeżeli zadaniem nie jest implementacja którejś z nich (a tylko potrzeba wartości pierwiastka).

0

Dzięki, można na Ciebie liczyć(właściwie na Was :D)( jeszcze trzeba to tylko ogarnąć )^^ Bo na innych stronach różne rzeczy znajdywałem...
Jeszcze raz dzięki, to chyba koniec moich pytań(chociaż "Kto pyta, nie błądzi" ^^)

@Edit
Wszystko działa idealnie! Thanks for all!

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