Ponowne użycie programu - problem.

0

Musiałem zintegrować kilka programów w jeden, teraz nie bardzo wiem, jak dodać pętlę do while, żeby można było użyć ponownie programu. Ja to robię tak:

int main()
{

     char warunek;
 
     do{
      cout <<"Czy chcesz skorzystać z programu ponownie ('t' - tak, 'n' - nie)";
      cin >> warunek;

    if(warunek == 't' || warunek == 'T')
    {
      system("cls");
     }

         }while(warunek == 't' || warunek == 'T')

}

dodanie znacznika <code class="c"> - @furious programming

0
case 'x'||'X':

to jest case true.

Zapewne getchar zczytuje '\n' spowodowane naciśnięciem entera i przechodzi do wykonania default

0
kq napisał(a):
case 'x'||'X':

to jest case true.

Zapewne getchar zczytuje '\n' spowodowane naciśnięciem entera i przechodzi do wykonania default

Nie rozumiemy się programy z MENU wykonują się dobrze, więc 'znak' dobrze sczytuje problem pojawią się na końcu. O co chodzi z tym 'to jest "case true" ' ??

0

O to, że masz case X, gdzie X to wyrażenie obliczone w czasie kompilacji. U Ciebie X to 'x' || 'X'. Niezależnie od systemu zapisu, przynajmniej jeden z nich jest różny od zera, więc logiczny or takich wartości zwróci zawsze true. Stąd masz case true

0

I co ma to wspólnego z moim problemem?

1

Ma być:

case 'x': case 'X': exit(0);

exitzadziała przy dowolnym 'x' dużym czy małym.
Nie rób tych dziwnych pytań o wyjście, tylko obejmij pętlą całą zawartość main'a (no oprócz getch i return)
i po sprawie.

0

Jak mam nie robić tych dziwnych pytań to skąd użytkownik będzie wiedział co ma nacisnąć 't' czy 'n' ??

0

I co ma to wspólnego z moim problemem?
Nie wiem, napisałeś "nie działa", więc zgaduję co jest problemem. Ten case na pewno nie działa z Twoim oryginalnym zamierzeniem.

0

Jak to nie napisałem co nie działa, nie działa ponowne uruchamianie programu tj. wywołanie komunikatu "Czy chcesz ponownie uruchomić program 't'/'n'" i o ten efekt mi chodzi.

0

Nie będzie tego badziewia wprowadzać, wystarczy ze po ludzku zorganizujesz program:

#include <iostream>
using namespace std;

int main()
  {
   while(true)
     {
      cout<<"1. Opcja jeden"<<endl;
      cout<<"2. Opcja dwa"<<endl;
      cout<<"3. Opcja trzy"<<endl;
      cout<<"4. Opcja cztery"<<endl;
      cout<<"0. Koniec"<<endl;
      cout<<"Wybierasz: ";
      switch(getchar())
        {
         case '\n': cout<<endl; continue;
         case '0': return 0;
         case '1': cout<<"Wykonuje 1"<<endl<<endl; break;
         case '2': cout<<"Wykonuje 2"<<endl<<endl; break;
         case '3': cout<<"Wykonuje 3"<<endl<<endl; break;
         case '4': cout<<"Wykonuje 4"<<endl<<endl; break;
         default: cout<<"Nie ma takiej opcji"<<endl<<endl; break;
        }
      while(getchar()!='\n') {}
     }
  }
0

tj. wywołanie komunikatu "Czy chcesz ponownie uruchomić program 't'/'n'" i o ten efekt mi chodzi.
Podejrzewam, że problemem może być brak kodu wywołującego takie zachowanie we wklejce.

0
kq napisał(a):

tj. wywołanie komunikatu "Czy chcesz ponownie uruchomić program 't'/'n'" i o ten efekt mi chodzi.
Podejrzewam, że problemem może być brak kodu wywołującego takie zachowanie we wklejce.

Podałem kod który dopisałem do wklejki. (1 post)

0

To pokaż cały kod, nie będziemy zgadywali gdzie to dodałeś.

0
_13th_Dragon napisał(a):

Nie będzie tego badziewia wprowadzać, wystarczy ze po ludzku zorganizujesz program:

#include <iostream>
using namespace std;

int main()
  {
   while(true)
     {
      cout<<"1. Opcja jeden"<<endl;
      cout<<"2. Opcja dwa"<<endl;
      cout<<"3. Opcja trzy"<<endl;
      cout<<"4. Opcja cztery"<<endl;
      cout<<"0. Koniec"<<endl;
      cout<<"Wybierasz: ";
      switch(getchar())
        {
         case '\n': cout<<endl; continue;
         case '0': return 0;
         case '1': cout<<"Wykonuje 1"<<endl<<endl; break;
         case '2': cout<<"Wykonuje 2"<<endl<<endl; break;
         case '3': cout<<"Wykonuje 3"<<endl<<endl; break;
         case '4': cout<<"Wykonuje 4"<<endl<<endl; break;
         default: cout<<"Nie ma takiej opcji"<<endl<<endl; break;
        }
      while(getchar()!='\n') {}
     }
  }

Widzę, że jednak ciężko żebyśmy się zrozumieli. Chodzi o pętlę, która pod koniec programu zapyta użytkownika czy chce ponownie uruchomić program, jeśli tak, wyczyści konsolę i uruchomi program od początku - rozumiesz?

Poza tym występuje błąd w 'case' z continue.

kq napisał(a):

To pokaż cały kod, nie będziemy zgadywali gdzie to dodałeś.

Zaraz dodam.

CAŁY KOD: http://wklej.org/id/1496456/

0
if (warunek = 't' || warunek == 'T')

Przypisujesz 't' zamiast porównać.

Wciąż masz błędny case.

Ta pętla nie ma sensu, bo nigdy z niej nie wyjdziesz, i jedynie czyścisz ekran (jeśli cls jest dostępne). Jak chcesz wrócić do początku programu, przestudiuj jeszcze raz kod @_13th_Dragon​a

1
friizi napisał(a):

Widzę, że jednak ciężko żebyśmy się zrozumieli. Chodzi o pętlę, która pod koniec programu zapyta użytkownika czy chce ponownie uruchomić program, jeśli tak, wyczyści konsolę i uruchomi program od początku - rozumiesz?
Ja rozumiem, to tobie się w głowie nie mieści że nie potrzebujesz tego pytania skoro masz w menu opcje Koniec/Wyjście.

friizi napisał(a):

Poza tym występuje błąd w 'case' z continue.
Chrzani waść: http://ideone.com/ZbSova

0
kq napisał(a):
if (warunek = 't' || warunek == 'T')

Przypisujesz 't' zamiast porównać.

Wciąż masz błędny case.

Ta pętla nie ma sensu, bo nigdy z niej nie wyjdziesz, i jedynie czyścisz ekran (jeśli cls jest dostępne)

To tylko literówka, może raz chociaż poświęciłbyś kilka sekund swojego życia i skopiowałbyś ten cały kod i sprawdził u siebie? Nawet jeśli daje =='t' to i tak wykonuje się to samo.

Dlaczego uważasz, że pętla nie ma sensu, jak dla mnie jeśli osoba wprowadzi dowolną literę zamiast 't' lub 'T' pętla się nie wykona, zostawię case 'x': tylko ale to nie ma tu nic do rzeczy rozumiesz?

To poprawiony kod -> sprawdź go proszę: http://wklej.org/id/1496475/

Teraz wciskam 1, program się wykonuję, wciskam t, drukuje się ponownie menu, ale mam "Twój wybór", wciskam byle co i znów przechodzi do pytania czy rozpocząć ponownie program.

1

Mści się tobie mieszanie trzech zupełnie różnych technik wprowadzenia a mianowicie _getch(), scanf(), cin>>.
Jeżeli dasz rady doprowadzić do stanu działania jedną z opcji to z druga już działać nie będzie.
Przerób całość na użycie jednej z technik.

0

To tylko literówka, może raz chociaż poświęciłbyś kilka sekund swojego życia i skopiowałbyś ten cały kod i sprawdził u siebie?

Mea culpa. Źle przeczytałem, myślałem, że pętla zaczyna się w linii 178.

getchar() zwraca '\n' wprowadzone przez Ciebie jako enter na klawiaturze. Dlatego jest while(getchar() != '\n') w wymienionym wyżej poście.

0
_13th_Dragon napisał(a):

Mści się tobie mieszanie trzech zupełnie różnych technik wprowadzenia a mianowicie _getch(), scanf(), cin>>.
Jeżeli dasz rady doprowadzić do stanu działania jedną z opcji to z druga już działać nie będzie.
Przerób całość na użycie jednej z technik.

Jak mam niby zamienić _getch(), który służy mi tylko do pobrania znaku, żeby okienko zbyt szybko się nie zamknęło, na scanf czy cin?

Poza tym jakoś nie wydaje mi się, żeby to było problemem.

0
friizi napisał(a):

Jak mam niby zamienić _getch(), który służy mi tylko do pobrania znaku, żeby okienko zbyt szybko się nie zamknęło, na scanf czy cin?

na:

while(cin.get()!='\n') {} cin.get();

lub:

while(getchar()!='\n') {} getchar();

Możesz z tego zrobić funkcję.

friizi napisał(a):

Poza tym jakoś nie wydaje mi się, żeby to było problemem.
To po kiego mistrz programowania na forum pyta skoro wszystko wie?

1

Nie potrzebujesz _getch, bo i tak pytasz użytkownika czy kontynuować.

mści się, bo jesteś niedoświadczony i nie wiesz z czym wiąże się używanie konkretnych rozwiązań. Np. właśnie getchar (lub cin >> char) wczytają znak nowej linii jako znak, natomaist gdybyś wczytywał za pomocą cina liczbę, np. int, to nowa linia zostałaby zignorowana.

0
kq napisał(a):

To tylko literówka, może raz chociaż poświęciłbyś kilka sekund swojego życia i skopiowałbyś ten cały kod i sprawdził u siebie?

Mea culpa. Źle przeczytałem, myślałem, że pętla zaczyna się w linii 178.

getchar() zwraca '\n' wprowadzone przez Ciebie jako enter na klawiaturze. Dlatego jest while(getchar() != '\n') w wymienionym wyżej poście.

Ale twoja pętla while nawet nie wiem co robi. Rozumiesz już o co mi chodzi?

_13th_Dragon napisał(a):
friizi napisał(a):

Jak mam niby zamienić _getch(), który służy mi tylko do pobrania znaku, żeby okienko zbyt szybko się nie zamknęło, na scanf czy cin?

na:

while(cin.get()!='\n') {} cin.get();

lub:

while(getchar()!='\n') {} getchar();

Możesz z tego zrobić funkcję.

friizi napisał(a):

Poza tym jakoś nie wydaje mi się, żeby to było problemem.
To po kiego mistrz programowania na forum pyta skoro wszystko wie?

Drogi mistrzu, słuchaj mnie uważnie.

Podsumujmy jedyną zmianę jaką wprowadziłem to

scanf("%s", &znak)

zamiast znak=getchar();
teraz po wybraniu:

  1. program się wykonuje, i mogę wybrać ponownie co chcę robić // działa
  2. // działa
  3. jeśli wyraz nie jest palindromem // działa
    jeśli wyraz jest palindromem // nie działa (zamyka się natychmiast po wykonaniu)

Problem drodzy ludzie tkwi w tej części:

for (int x = 1; x < dlugosc + 1; x++)
	{
		if (tyl[x - 1] != napis[(dlugosc)-x])
		{
			cout << "\n\nTen napis nie jest palindromem.";
			_getch();
			exit(0);

		}

	}
	cout << "\n\nTen napis jest palindromem.";
	_getch();

Jak pozbyć się tego exit(0), który wychodzi z programu omijając pytanie o ponowne uruchomienie? Nie mogę go usunąć, bo będzie z każdą iteracją wypisywał mi "Ten napis nie jest palindromem" a na końcu jeszcze "Ten napis jest palindromem" -> Jaka komenda ominie mi tzn. zakończy wykonywanie funkcji natychmiast i przejdzie do dalszego kodu????

  1. wykonuje się program, a zaś wyskakuje okienko z takim błędem: "Run-Time Check Failure #2 - Stack around the variable 'znak' was corrupted." - o co chodzi?
4
friizi napisał(a):

Jak pozbyć się tego exit(0), który wychodzi z programu omijając pytanie o ponowne uruchomienie?

Ręce opadają:
Masz trzy możliwości:

  1. wynająć fachowca dla rozwiązania tego problemu - 50 zł styknie.
  2. zmienić kierunek na dziennikarstwo - smarować na forum już umiesz
  3. przeczytać pierwsze parę stron dowolnego kursu i rozwiązać ten problem samodzielnie.
0

Ręce to opadają jak widzę twoje błędne rady, radziłeś żebym zmieniał wszystkie getchar() cin, scanf, na jeden typ, a jak widzisz to nie było problemem. Jak masz pokazywać tu swoje prymitywne zachowania i wyżywanie się na innych to nie pisz w ogóle jak nie masz ochoty pomóc. Go to, nie pozwala nam używać., 'return' nie mogę użyć, bo to funkcja 'void', getchar(); nic nie da. Więc?

taka mała uwaga, został się jeszcze błąd z '4' .

A mistrzu jeśli masz na myśli 'break' to jak widzisz wyjdzie mi z funkcji 'if', ale zaczepi jeszcze o cout<<"Ten napis jest palindromem";

0

No i bardzo dobrze, bo goto to jest oznaka braku jakiegokowliek pojecia w dziedzinie programowania (imho). 13th_Dragon Ci napisal (kilkakrotnie), ze ten program jest zle zaprojektowany i najlepiej zaczac od drobnego refactoringu. Nawet jak ten jeden problem teraz rozwiazesz to duza szansa, ze pojawi sie wkrotce nastepny

0

scanf i %s pobiera nieograniczonego wielkościowo stringa, ogranicz do do jednego znaku - %1s

0
friizi napisał(a)

'return' nie mogę użyć, bo to funkcja 'void'

Co?

1
friizi napisał(a):

... jeśli masz na myśli 'break' to jak widzisz wyjdzie mi z funkcji 'if' ...

OMG!
Człowieku czytać jakiś kurs, bo wypisujesz same brednie i herezje i nie rozumiesz co do ciebie się mówi.
if - nie jest funkcją
break - nie wyjdzie z if'a

0
kq napisał(a):

scanf i %s pobiera nieograniczonego wielkościowo stringa, ogranicz do do jednego znaku - %1s

Ok poradziłem sobie w ten sposób:

for (int x = 1; x < dlugosc + 1; x++)
	{
		if (tyl[x - 1] != napis[(dlugosc)-x])
		{
			cout << "\n\nTen napis nie jest palindromem.";
			_getch();
			z = 0;
			break;

		}

	}

	if (z != 0)
	{

		cout << "\n\nTen napis jest palindromem.";
		_getch();
	}

Co z tym błędem - po wciskaniu '4'? -> Uruchamia się, wykonuje, wyświetla komunika to ponowne uruchomienie i -> "Run-Time Check Failure #2 - Stack around the variable 'znak' was corrupted."

_13th_Dragon napisał(a):
friizi napisał(a):

... jeśli masz na myśli 'break' to jak widzisz wyjdzie mi z funkcji 'if' ...

OMG!
Człowieku czytać jakiś kurs, bo wypisujesz same brednie i herezje i nie rozumiesz co do ciebie się mówi.
if - nie jest funkcją
break - nie wyjdzie z if'a

Jakbyś nie zauważył if jest w pętli for, więc wyjdzie, już sobie poradziłem z tym, wolałbym żebyś pomógł mi z błędem z '4'.

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