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

Pętla while - jak zakończyć

Object Storage Arubacloud
+1 głos
1,682 wizyt
pytanie zadane 15 grudnia 2017 w C i C++ przez Hinzeq Użytkownik (860 p.)

Witam,

Niestety nie mogę poradzić sobie z pętlą while. Na początku chciałem zaznaczyć, że dopiero raczkuję w świecie programowania i nie wszystko rozumiem.
Chcę napisać prosty kalkulator: odejmowanie, dodawanie, mnożenie, dzielenie. Wybór opcji użytkownik ma wprowadzić za pomocą cyfr 1-4, jeżeli wpisze inną cyfrę, chciałem by program pokazywał informację: "Prosze wybrac tryb od 1 do 4:" i by użytkownik mógł ponownie wybrać cyfrę od 1 do 4. Niestety u mnie wykonuje się nieskończona pętla ("Prosze wybrac tryb od 1 do 4:"), a nie wiem w jaki sposób zrobić tak by wrócił do wyboru.

#include <iostream>

using namespace std;

string wybor;
int startowa, odejmowana, x, dodawana, mnozenie, dzielenie, y;

int main()
{
    cout << "Witamy w naszym kalkulatorze." << endl;
    cout << "Co chcesz zrobic?" << endl;
    cout << "odejmowanie- 1" << endl;
    cout << "dodawanie- 2" << endl;
    cout << "mnozenie- 3" << endl;
    cout << "dzielenie (zaokragla do pelnej liczby)- 4" << endl;
    cin >> wybor;

    poczatek:
    if(wybor=="1")
    {
        cout << "Wpisz liczbe startowa: ";
        cin >> startowa;

        cout << "Ile chcesz odjac: ";
        cin >> odejmowana;
        x = startowa - odejmowana;

        cout << "Wynik: " << x << endl;
    }

    if(wybor=="2")
    {
        cout << "Wpisz liczbe startowa: ";
        cin >> startowa;

        cout << "Ile chcesz dodac: ";
        cin >> dodawana;
        x = startowa + dodawana;

        cout << "Wynik: " << x << endl;
    }

    if(wybor=="3")
    {
        cout << "Wpisz liczbe startowa: ";
        cin >> startowa;

        cout << "Przez ile chcesz pomnozyc: ";
        cin >> mnozenie;
        x = startowa * mnozenie;

        cout << "Wynik: " << x << endl;
    }

    if(wybor=="4")
    {
        cout << "Wpisz liczbe startowa: ";
        cin >> startowa;

        cout << "Przez ile chcesz podzielic: ";
        cin >> dzielenie;
        x = startowa / dzielenie;
        y = startowa % dzielenie;

        cout << "Wynik: " << x << "," << y << endl;
    }

    while(wybor<="0"||wybor>="05")
    {
      cout << "Prosze wybrac tryb od 1 do 4:" << endl;
    }


    return 0;
}

Przesyłam cały kod, ponieważ jak wspomniałem na początku nie wiem co jest ważne, a co nie w udostępnianym "programie".
Z góry dzięki za odpowiedź :)

5 odpowiedzi

0 głosów
odpowiedź 15 grudnia 2017 przez niezalogowany
wybrane 16 grudnia 2017 przez Hinzeq
 
Najlepsza

Wszystko możesz zrobić pętlami bez korzystania z etykiet i instrukcji goto (w C++ jest to niewskazane). Wyrzuciłem niepotrzebne zmienne:

#include <iostream>
#include <string>

using namespace std;

int main()
{
	cout << "Witamy w naszym kalkulatorze." << endl;
	cout << "Co chcesz zrobic?" << endl;
    cout << "[1] Dodawanie" << endl;
    cout << "[2] Odejmowanie" << endl;
    cout << "[3] Mnozenie" << endl;
    cout << "[4] Dzielenie (ucinanie czesci ulamkowej) " << endl;
	
	bool czy_wybor_poprawny = true;

	do
	{
        string wybor;
		cin >> wybor;

		int num1, num2;
		cout << "Wpisz pierwsza liczbe: ";
		cin >> num1;
		cout << "Wpisz druga liczbe: ";
		cin >> num2;

		if (wybor == "1")
		{
			cout << "Wynik odejmowania: " << num1 - num2 << endl;
		}
		else if (wybor == "2")
		{
			cout << "Wynik dodawania: " << num1 + num2 << endl;
		}
		else if (wybor == "3")
		{
			cout << "Wynik mnozenie: " << num1 * num2 << endl;
		}
		else if (wybor == "4")
		{
			cout << "Wynik dzielenia: " << num1 / num2 << endl;
		}
		else
		{
            cout << "Prosze wybrac tryb od 1 do 4:" << endl;
			czy_wybor_poprawny = false;
		}

	} while (!czy_wybor_poprawny);

}

W zmiennej bool czy_wybor_poprawny przypisuje wartość false gdy wybór nie znajduje się na liście (w przeciwnym razie zawsze jest na true). Pętla do ... while najpierw wykonuje to co między klamrami i będzie wykonywać się tak długo jak wybor jest ustawiony na false. Jeżeli nie potrzebujesz zmiennej z wynikiem działań to przy dzieleniu mógłbyś rzutować wynik do typu float:
 

cout << "Wynik dzielenia: " << (float) num1 / num2 << endl;

 

0 głosów
odpowiedź 15 grudnia 2017 przez hhh Gaduła (4,110 p.)
Hej,

żeby program wrócił do wyboru, umieść cały program w nieskończonej pętli (np.: z warunkiem true). Tak swoją drogą, poczytaj o switch'u, dzięki temu możesz zrobić ten kalkulator lepiej, kod byłby wtedy czytelniejszy.
0 głosów
odpowiedź 15 grudnia 2017 przez Fenix Nałogowiec (26,750 p.)
-Zamiast "0" użyj typu int tzn. 0
-Istnieje takie coś jak else if().

-Nie używamy etykiet (poczatek:)

-W pętli musiałbyś umieścić całą konstrukcję nie tylko, samo info na koniec. W jaki sposób chciałbyś zmienić wartość w środku pętli? Cały czas będzie taka sama, i się zapętli.
0 głosów
odpowiedź 15 grudnia 2017 przez Chess Szeryf (76,710 p.)
edycja 15 grudnia 2017 przez Chess

Oczywiście w moim kodzie występuje zjawisko redundancji i należałoby poprawić go, aby był zgodny z formułą DRY (Don't Repeat Yourself).

#include <iostream>
 
int main(){ 

	int first_digit,second_digit;
	int choice;
	bool check = true;
	
	std::cout<<"1: add"<<std::endl;
	std::cout<<"2: sub"<<std::endl;
	std::cout<<"3: mul"<<std::endl;
	std::cout<<"4: div"<<std::endl;
	std::cout<<"5: ret"<<std::endl;
	while(check){ 
		std::cin>>choice;
		switch(choice){ 
			case 1:
			std::cin>>first_digit;
			std::cin>>second_digit;
			std::cout<<"Result: ";std::cout<<first_digit+second_digit<<std::endl;
			break;
			
			case 2:
			std::cin>>first_digit;
			std::cin>>second_digit;
			std::cout<<"Result: ";std::cout<<first_digit-second_digit<<std::endl;
			break;
			
			case 3: 
			std::cin>>first_digit;
			std::cin>>second_digit;
			std::cout<<"Result: ";std::cout<<first_digit*second_digit<<std::endl;
			break;
			
			case 4: 
			std::cin>>first_digit;
			std::cin>>second_digit;
			std::cout<<"Result: ";std::cout<<(first_digit)/(second_digit)<<std::endl;
			break;
			
			case 5: 
			std::cout<<std::endl;
			check = false;
			break;
	
			default: 
			std::cout<<"Digit must be from range 1-4"<<std::endl;
			break;
		}
		
	}

	return 0;
}

Assembly x86 (8086), Nasm, Windows 32-bit:

global _main
extern _printf 
extern _scanf
extern _putchar 
SECTION .data
msg0: db "%d",0

msg1: db "1: add",0xa,"2: sub",0xa,"3: mul",0xa,"4: div",0xa,0xa,0
integer1: times 4 db 0
integer2: times 4 db 0
integer3: times 4 db 0
msg2: db "true",0
var dd 0
SECTION .text
_main: 

	push eax 
	push msg1 
	call _printf 
	add esp,8
	
 
	Loop1: 
	 
		 
		
		push integer1
		push msg0 
		call _scanf 
		pop eax 
		pop eax 
		
		mov eax,[integer1]
		
		cmp eax,1
		je addition
		cmp eax,2 
		je subtraction
		cmp eax,3 
		je multiplication
		cmp eax,4 
		je division
		cmp eax,5
		je exit_exit
	jmp Loop1 
	
	ret 
	
	addition: 
	
		push integer1
		push msg0 
		call _scanf
		pop eax 
		pop eax 
		
		push integer2
		push msg0 
		call _scanf
		pop eax 
		pop eax 
		
		mov eax,[integer1]
		mov ebx,[integer2]
		
		add eax,ebx 
		
		push eax 
		push msg0 
		call _printf 
		add esp,8
		 
		ret 
		
	subtraction: 
	
		push integer1
		push msg0 
		call _scanf
		pop eax 
		pop eax 
		
		push integer2
		push msg0 
		call _scanf
		pop eax 
		pop eax 
		
		mov eax,[integer1]
		mov ebx,[integer2]
		
		sub eax,ebx 
		
		push eax 
		push msg0 
		call _printf 
		add esp,8
		 
		ret 
		
	
	multiplication: 
	
		push integer1
		push msg0 
		call _scanf
		pop eax 
		pop eax 
		
		push integer2
		push msg0 
		call _scanf
		pop eax 
		pop eax 
		
		mov eax,[integer1]
		mov ebx,[integer2]
		
		mul ebx 
		
		push eax 
		push msg0 
		call _printf 
		add esp,8
		 
		ret 
		
		division: 
	
		push integer1
		push msg0 
		call _scanf
		pop eax 
		pop eax 
		
		push integer2
		push msg0 
		call _scanf
		pop eax 
		pop eax 
		
		mov eax,[integer1]
		mov ebx,[integer2]
		
		div ebx 
		
		push eax 
		push msg0 
		call _printf 
		add esp,8
		 
		ret 
		
		exit_exit: 
		
		ret 
 
	
	
	
	
SECTION .bss 
; win 32 bit nasm, asm x86

 

0 głosów
odpowiedź 16 grudnia 2017 przez Hinzeq Użytkownik (860 p.)
Dzięki Wam za pomoc :)
Już wiem gdzie zrobiłem błędy, teraz tylko przeanalizować co trzeba poprawić i dalej tworzyć.

Pozdrawiam,

Podobne pytania

0 głosów
2 odpowiedzi 553 wizyt
pytanie zadane 18 czerwca 2019 w C i C++ przez Eryk Słowiński Początkujący (280 p.)
0 głosów
1 odpowiedź 682 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Kacper Lasota Początkujący (250 p.)
–2 głosów
1 odpowiedź 678 wizyt
pytanie zadane 26 października 2018 w C i C++ przez xFreezQ Nowicjusz (150 p.)

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

61,957 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...