Program nie działa tak jak powinien

0

Cześć, uczę się c++ i postanowiłem napisać program, który będzie moim harmonogramem dnia, będę mógł dodać do niego wydarzenia, a także zobaczyć co mam zaplanowane. Na razie mam tylko główny szkielet, ale program nie działa tak jak chce, a mianowicie:
1.Po wpisaniu w konsole 'exit' program się nie zamyka, a powinien.
2.Po wpisaniu w konsole 'dodaj /?' wyświetla się tekst z innej funkcji.
3.Po wpisaniu w konsole 'zobacz /?' nic się nie dzieje, a powinien pojawić się tekst.

#include <iostream>
#include <string>
using namespace std;

//Zmienne i ich dlugosci
string dodaj  = "dodaj";
string zobacz = "zobacz";
int dodaj_i = 5;
int zobacz_i = 6;
string akcja;
string dodaj_akcja;
string zobacz_akcja;


//funkcja dodajaca do harmonogramu zadania
void dodaj_f(string dodaj_akcja)
{
     if(dodaj_akcja == "/?")
     {
      cout<<"help dla dodaj"<<endl;
     }

}



//funkcja wyswietlajaca harmonogram
void zobacz_f(string zobacz_akcja)
{

     if(zobacz_akcja == "/?")
     {
      cout<<"help dla zobacz"<<endl;
     }

}


void main()
{
    
cout<<"///Harmonogram v0.01///"<<endl;

//Dopuki nie zostanie wprowadzona oporawna wartosc program bedzie sie wykonywal
while(akcja != "exit")
{
cout<<">: ";
getline(cin, akcja);



//Jezeli znajde 'dodaj' we wpisanym przez uzytkownika poleceniu, zostanie wywolana funkcja dodaj
if(akcja.find(dodaj))
     {
      dodaj_akcja = akcja.erase(0, dodaj_i);
      dodaj_f(dodaj_akcja);
     }
//w przeciwynm wypadku ezeli znajde 'zobacz' we wpisanym przez uzytkownika poleceniu, zostanie wywolana funkcja zobacz
else if(akcja.find(zobacz))
     {
      zobacz_akcja = akcja.erase(0, zobacz_i);
      zobacz_f(zobacz_akcja);
     }

//Jezeli uzytkownik nie wpisal zadnych ze znanych komend zostanie wyswietlony 'Blad'
else
     {
      cout<<endl<<"Blad!"<<endl;
     }


}



}

Z góry dziękuje za pomoc
Pozdrawiam

0

Czy jesteś pewien działania poniższej linijki ?

if(dodaj_akcja == "/?") 

Jak dla mnie, to porównujesz std::string z const char*, to nie ma prawa działać.

To samo tyczy się tego:

if(zobacz_akcja == "/?") 

i tego:

while(akcja != "exit") 

Zrób np. tak:

while(strcmp(akcja.c_str(), "exit") != 0) 
0

Jak dla mnie, to porównujesz std::string z const char*, to nie ma prawa działać.

To działa. Nie zapominaj, że string także zbudowany jest z tablic typu char.

Kod ogółem pisany jest szyfrem. Po chwili jego czytania, nadal nie wiedziałem co do czego. Jednym zdaniem: przerzuć się na klasy.

0

Co do tej pętli "while" to można użyć czegoś w tym stylu:

int done=1;
while(done){

cin>>akcja;
done=akcja.compare("exit");

//cała reszta...
}
0

czytałeś w ogóle jak działa funkcja find i erase? czytając kursy c++ nie spotkałeś się ze zdaniem że używanie wcięć zwiększa czytelność kodu?

http://www.cplusplus.com/reference/string/string/find/
zwróc uwagę na return value. zwrócona wartość będzie ujemna jeśli nie znaleziono, a C++ wartości niezerowe (czyli też ujemne) traktuje jako prawda

http://www.cplusplus.com/reference/string/string/erase/

a propos to wrzucając parametr do funkcji radzę używać obcinania białych z lewej i z prawej (trim):
http://www.cplusplus.com/forum/beginner/863/

w funkcjach powinienes zrobic:

else cout <<"nie podano parametrow funkcji";

zawsze powinno sie cos wyswietlac, zeby wiadomo bylo co sie dzieje

proponuje Ci zrobic tablice struktur które posiadają pola:
string nazwa; // nazwa polecenia
void (*funkcja)(string akcja); // funkcja ktora ma sie wywolac przy danej nazwie, gdy nazwa wystapi na pierwszej pozycji to wywolujesz funkcje. forem przelatujesz po wszystkich elementach i sprawdzasz czy nazwa sie zgadza i jesli sie zgadza to robisz "break;" (wiem ze da sie to przyspieszyc, ale nie ma sensu tracic czasu na pisanie funkci kora przyspieszy wyszukiwanie elementow w tablicy <10 elementow)

poprawiony z grubsza kod:

#include <iostream>
#include <string>
using namespace std;

//funkcja dodajaca do harmonogramu zadania
void dodaj_f(string akcja)
{
     if(akcja == "/?")
     {
      cout<<"help dla dodaj"<<endl;
     }

}

//funkcja wyswietlajaca harmonogram
void zobacz_f(string akcja)
{

     if(akcja == "/?")
     {
      cout<<"help dla zobacz"<<endl;
     }

}


int main()
{
  //Zmienne i ich dlugosci
  string dodaj  = "dodaj";
  string zobacz = "zobacz";
  int dodaj_i = 5+1; // spacji nie policzyles
  int zobacz_i = 6+1;
  string akcja;


  cout<<"///Harmonogram v0.01///"<<endl;

  //Dopuki nie zostanie wprowadzona oporawna wartosc program bedzie sie wykonywal
  while(1)
  {
    cout<<">: ";
    getline(cin, akcja);
    if (akcja=="exit")
      break;

    //Jezeli znajde 'dodaj' we wpisanym przez uzytkownika poleceniu, zostanie wywolana funkcja dodaj
    else if(akcja.find(dodaj)==0)
        dodaj_f(akcja.erase(0, dodaj_i));

    //w przeciwynm wypadku ezeli znajde 'zobacz' we wpisanym przez uzytkownika poleceniu, zostanie wywolana funkcja zobacz
    else if(akcja.find(zobacz)==0)
      zobacz_f(akcja.erase(0, zobacz_i));

    //Jezeli uzytkownik nie wpisal zadnych ze znanych komend zostanie wyswietlony 'Blad'
    else
     {
      cout<<endl<<"Blad!"<<endl;
     }
  }

  return 0;
}

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