[C++] Problem z konczeniem pracy programu

0

Napisałem sobie taki program i chce żeby po nacisnieciu "k" program konczyl prace niezaleznie od miejsca w ktorym sie znajduje. Wyczerpałem swoje pomysly. Nic mi nie działało. Pomóżcie.

#include<cstdlib>
#include<iostream>
#include<conio.h>
#include<math.h>


using namespace std;
int lit;
float fun()
           {   
           float liczba1, liczba2;
           cout<<"Zadanie trzecie:"<<endl;
           cout<<"Podaj pierwsza liczbe"<<endl;
           cin>>liczba1;
           cout<<"Podaj druga liczbe"<<endl;
           cin>>liczba2;
           cout<<"Podwojna suma liczb "<<liczba1<<" i "<<liczba2<<" to: "<<2*(liczba1+liczba2)<<endl<<endl;
           return 0;
           }
int main (void)
{   do{
  
    cout<<"1. "<<endl<<"Sprawdza czy podana litera jest litera 'a'  "<<endl<<endl;
    cout<<"2. "<<endl<<"Tablice. Wprowadzanie, sumowanie, srednia, min, max, odwotnosc."<<endl<<endl;
    cout<<"3. "<<endl<<"Funkja. Podwojna suma dwoch liczb"<<endl<<endl;
    cout<<"Wprowadzenie 'k' konczy program"<<endl<<endl;
    int opcja;
    cin>>opcja;
    switch (opcja)
    { 
          default:
               cout<<"Nie ma takiej opcji!"<<endl<<endl; 
break;  
           case 1: 
                char literka;
                cout<<"Zadanie pierwsze:"<<endl;
                cout<<"Prosze podaj litere 'a'."<<endl;
                cin>>literka;
                if (literka=='a'||literka=='A')
                cout<<"Tak. To jest literka 'a'. Dziekuje :)"<<endl<<endl;
                else
                cout<<"Nieprawidlowa literka. :("<<endl<<endl;  
break;
          
           case 3:  
            fun();
break;
          case 2:
               cout<<"Zadanie drugie:"<<endl;
               cout<<"Podaj wielkosc tablicy."<<endl;
               int n, liczba;
               cin>>n;
               cout<<"Wpisz "<<n<<" wartosci do tablicy. Po kazdej nacisnij enter."<<endl;
               float* tablica;
               tablica= new float[n];
               int i=0;
               // Wpisywanie:
               while (i<n)
               {
                     cin>>liczba;
                     tablica[i]=liczba;
                     i=i+1;
               } 
               // Wyswietlanie tablicy:
               cout<<" Twoja tablica wyglada tak: "<<endl;
               for (i=0; i<n; i++)
               {
               cout<<" "<<tablica[i];
               }  
               // Suma:
               float suma=0;
               for(i=0; i<n; i++)
               {
                       suma=suma+tablica[i];
               }
               // Max:
               float max;
               max=tablica[0];
               for (i=0; i<n; i++)
               {
                   if (tablica[i]>max)
                   max=tablica[i];
               }
               // Min:
               float min;
               min=tablica[0];
               for (i=0; i<n; i++)
               {
                   if (tablica[i]<min)
                   min=tablica[i];
               } 
               // Od konca:
               cout<<endl;
               cout<<" Wypisanie tablicy od konca: "<<endl;
               for (i=n-1; i>=0; i--)
               {
               cout<<" "<<tablica[i];
               }              
               cout<<endl;  
               cout<<" Suma wszystkich wartosci z tablicy: "<<suma<<endl;
               cout<<" Srednia artmetyczna liczb w tablicy: "<<suma/n<<endl;
               cout<<" Wartosc maksymalna: "<<max<<endl;
               cout<<" Wartosc minimalna: "<<min<<endl<<endl;
               delete[] tablica;
break;
}
system("PAUSE");
return 0;
}while(cin.get() == 'k');
}
0

Do tego jest specjalna funkcja, która nie wchodzi w skład standardu, ale nie pamiętam, jak się nazywa. Jak sobie przypomnę to napiszę.

O juz wiem.
kbhit()

0

ale \kbhit sprawdza czy w tym momęcie( musiał by w całym programie wklepać kbhit) została wciśnięta literka czy coś tam innego

0

Ogólnie w funkcji main powinno być jak najmniej rzeczy... zdekomponuj może trochę ten kod...? aż się o to prosi a do takiego przerywania może służyć jak pisali przedmówcy kbhit()

0

myślę, że powinieneś zdefiniować najpierw coś tam w ten sposób

char ch;

a potem zaraz po otwarciu pierwszej klamry pod main zrobić tak

while ((ch = getchar()) != 'k')
{
  // twoje polecenia 
 }
0

Wszystkie poprzednie odpowiedzi zupełnie nie tyczą się tematu. Ale nie bardzo widzę sposób żeby zrobić to "łatwo". Widzę dwa rozwiązania:

  • wymusić w jakiś sposób aby wciśnięcie tego klawisza generowało wyjątek / sygnał (musiałbyś mieć drugi proces w tle który by to monitorował)
  • przesiadka na jakieś okienka, tam obsługa zdarzeń to standard
0

Jak to przecież niedawno robiłem takie coś na lekcji i działało co jest z moim rozwiązaniem nie tak???

0

Poniewaz tutaj chodzi o wygenerowanie zdarzenia czy cos podobnego. Bo gdy wcisniesz klawisz k podczas np. liczenia najwiekszej wartosci zupelnie nic sie nie bedzie dzialo. Nalezy skorzystac z rad @Shalom'a. Twoje rozwiazanie zadziala tylko w momencie wywolania funkcji getchar() i tylko tutaj.

pozdro.

0

jesli piszesz w konsoli to jest to raczej malo mozliwe jesli uzytkownik czesto cos wpisuje, a jesli cos sie dzieje w petli i czekasz na wynik obliczen i chcesz w razie co przerwac to na poczatku petli umieszczasz warunek
if (kbhit() && getch()=='k')
return 0;

lub ew zamiast return 0 jakies zwalnianie pamieci et cetera.

jesli czesto uzytkownik cos wpisuje to musialbys zaimplementowac cos w stylu kontrolki w konsoli tj. zamiast uzywac scanf, musialbys najpierw uzywajac kbhit, getch, itp zrobic mozliwosc wpisywania tekstu, nastepnie moglbys ten wpisany tekst ewentualnie rpzetworzyc w prosty sposob sscanf'em. jesli jest to aplikacja okienkowa to:
w kazdej kontrolce sprawdzasz nacisniecia klawiszy (ewentualnie przekazujesz komunkaty do jednej kontrolki i tam sprawdzasz) albo zakladasz globalnego hooka na program (niektore antywirusy wykrywaja to jako wywolywanie podejrzanych funkcji - podejrzanie o bycie keyloggerem). program robi dokladnie to co mu karzesz. jesli chcesz zeby reagowal na klawisz w kazdym miejscu musisz sprawdzac w kazdym miejscu jego naciskanie.

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