Niekończący się program... Dziwne powtarzanie wyświetlania tekstu.

0

Chciałbym napisać pewien program. Nie zagłębiajmy się w jego funkcje, bo to nie ma sensu. Najważniejsze jest to, że po wyborze niepoprawnej opcji, program powtarza 2 linijki tekstu w nieskończoność, nie zatrzymując się po to, aby użytkownik mógł wpisać znak (zmiana wartości zmiennej, która informuje która opcja z menu została wybrana).


#include <conio.h>
#include <std_lib_facilities.h>
#include <string.h>

int cykl2= 0;
int cykl = 0; //odpowiada za to, który raz zostanie wyświetlony komunikat informujący i proszący o wpisanie liczby

void main ()
{
	int wybor1; //definiuje zmienną wybor1, która odpowiada za liczbę która zostanie wybrana w menu
	system ("chcp 1250"); //polskie znaki

	if (cykl == 0)//sprawdza który raz została wywołana funkcja "main"
	{
		cout << "Witaj w programie XYZ.\n";
		cout << "Wybierz tryb (wpisz tylko liczbę):\n";
		cout << "1. Automatyczne dopasowywanie\n";
		cout << "2. Wyszukiwanie informacji\n";
		cout << "Wybieram: "; //wyświetla początkowe informacje, prosi o wybranie trybu
		cin >> wybor1; //mamy możliwość wpisania liczby, przekazywana jest ona do zmiennej
		cykl++; //zwiększa wartość zmiennej cykl

		switch (wybor1) //wykonuje instrukcje zależnie od wyboru
		{
			case 1: dopasowywanie(); break; //przeskakuje do dopasowywania
			case 2: wyszukiwanie(); break; //przeskakuje do wyszukiwania
			default: main(); break; //niepoprawna opcja, przeskakuje do main
		}
	}
	if (cykl > 0) //jako, że podczas pierwszego wyświetlenia zwiększyliśmy wartość zmiennej cykl, teraz program przechodzi tu
	{
		if (cykl2 < 10) //jeżeli cykl2 jest mniejszy od 10 (czyli nie wystąpił błąd) prosi o wpisanie znaku
		{
			cykl2++; //zwiększa wartość cykl2, dzięki temu można przerwać program po określonej ilości cyklów
			cout << "Niepoprawna opcja!\n";
			cout << "Wybierz ponownie tryb: "; //drukuje w konsoli niepoprawności opcji, prosi o ponowne wybranie trybu
			cin >> wybor1; //przekazuje wartość do wybor1
			//początkowo był "switch", ale pomyślałem, że to może coś rozwalać, więc dałem "if"... żadnego efektu
			if (wybor1 == 1) //jeżeli wybrano pierwszą opcję
			{
				dopasowywanie();
			}
			if (wybor1 == 2) //jeżeli wybrano drugą
			{
				wyszukiwanie();
			}
			if (wybor1 != 1 && wybor1 != 2) //jeżeli wybrana opcja jest różna od 1 i 2
			{
				main(); //powtarza prośbę o wpisanie opcji
			}
		}
		else //jeżeli cykl2 wynosi więcej niż 10, czyli wystąpił błąd, po prostu go sygnalizuje
		{
			cout << "\n";
			cout << "____________________________________________\n";
			cout << "BŁĄD!!!!";
			getch();
		}
	}
}
 

Wiem, że wpisanie znaku lub ciągu znaków do zmiennej liczbowej nie jest mądre, aczkolwiek milej by było, gdyby po zrobieniu czegoś takiego cały program nie zaczynał wariować, tylko po prostu prosił o ponowne wpisanie.

0

int main() nie void. (Co za tym idzie return 0; na końcu main)
default: main(); break; //niepoprawna opcja, przeskakuje do main wołanie main w C++ jest niepoprawne. Użyj jakiejś "normalnej" metody...

Jeśli nie chcesz, żeby program "wariował" to napisz sobie po prostu odpowiednią funkcję do pobierania wartości danego typu. Najlepiej szablon, który spróbuje wczytać wartość danego typu, a jeżeli przy wczytywaniu wystąpił błąd, to przeczyta znaki aż do \n włącznie, wypisze ładny komunikat i zacznie czytać od nowa.

0

Void po prostu jest typem zwrotnym bez wartości (nic nie zwraca). Tutaj to nie ma nic do rzeczy. Wracanie do main normalnie działa i nic się nie dzieje, no ale jak nie poprawne to nie poprawne... Co do pisani funkcji, to kwestia, jak ją napisać. Jakich instrukcji warunkowych bym nie dał (a znam "aż" 2 - switch i if) to nie umiem ustawić, żeby ładnie wracało po 1 błędzie do wpisywania. Ta aplikacja nic sobie nie robi z cin, getch i innych, które wymuszają zatrzymanie się.
Umieściłem cały kod na Pastebin'ie (oryginalny). http://4programmers.net/Pastebin/1164 Oczywiście program jest nieukończony, podczas testu mi to wyszło, więc staram się to teraz rozwiązać.

PS: To nie jest do końca oryginalny kod, bo jest rozwalona sprawa zmiennych w "dopasowywaniu", aczkolwiek nie ma to tutaj znaczenia większego.

@Macron Nie wiem nawet co to wektor :D. Pętle znam 3: while, do i for. Nie wiem co się tak uczepiliście tego int, bo u mnie jest wszystko fajnie z void, a jak będzie potrzebne to zmienię :P. WIELKIE DZIĘKI Macron! Wreszcie wszystko działa jak potrzeba i mogę dalej tworzyć swoją aplikację. :)

1
kapi12c napisał(a)

Void po prostu jest typem zwrotnym bez wartości (nic nie zwraca).

Zaś standard języka C++ głosi, że main musi być typu INT.
Wiesz co to pętla? By było łatwiej, jakbyś nauczył się choć jednego rodzaju. Wtedy żadnej rekurencji by nie było :).
Co do wpisywania znaków itp. musisz oczyścić flagę strumienia. Masz tutaj artykuł dotyczący tego: http://4programmers.net/C/FAQ/Zabezpieczenie_przed_wpisywaniem_liter .
Mam nadzieje, że się przyda :D.
PS. Używasz wektorów a nie używasz pętli?

1

Void po prostu jest typem zwrotnym bez wartości (nic nie zwraca). Tutaj to nie ma nic do rzeczy. Wracanie do main normalnie działa i nic się nie dzieje, no ale jak nie poprawne to nie poprawne..

Tyle że ty nie wracasz do maina, a wskakujesz do niego ponownie.

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