[C++] Obsługiwanie wejścia z klawiatury. Czym różni się '+' i '-' od reszty znaków?

0

Witajcie,

Jestem tu nowy, więc proszę o wyrozumiałość, jeżeli niepotrzebnie stworzyłem nowy wątek.

Jestem w trakcie pisania programu zawierającego m.in. ONP. Program finalnie ma realizować minimalizację funkcji. Wczoraj zacząłem pisać i pojawił się pewien problem przy podawaniu danych.. Używam stosu doubli. Na wejściu mają byc podane zarówno liczby jak i znaki, więc po kolei:

  1. Podaję daną i traktuję ją jako zmienną typu double.
  2. Sprawdzam cin.ignore()cin.good(), jeśli true to dodaję na stos, jeśli** false** to wczytuję ją do chara i następnie wykonuję odpowiednią operację(tu oparte o switch/case).

Mój problem polega na tym, że po wpisaniu '+' lub '-' nic się nie dzieje.. Dopiero po ponownym wpisaniu znaku program oblicza sumę/różnicę, np. 1 2 3 + , nie zadziała (a powinno wykonać 2 + 3), 1 2 3 + + , zadziała (i zsumuje 2 i 3). Najlepsze w tym wszystkim jest to, że np. '*' oraz '/' działa za pierwszym wczytaniem..

Może rozwiązanie problemu jest proste, ale czasem można się zawiesić na prostych rzeczach. :P

Pozdrawiam i proszę o pomoc!
Patryk

P.S. Jeżeli macie jakieś ciekawe i fajne pomysły na wczytywanie danych w tym przypadku, to również proszę o sugestie. :)

EDIT!

  1. Sprawdzam cin.good() oczywiście nie cin.ignore().. Wybaczcie już dość późno było jak pisałem ten post... :)
  2. Nie mogę korzystać ze stringów.
0
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    double x;
    stringstream ss; // strumień łańcuchowy
    string s;        // łańcuch;

    cin >> s;        // czytamy łańcuch znaków
    ss << s;         // odczytany łańcuch umieszczamy w strumieniu
    if(ss >> x)      // konwertujemy na liczbę i sprawdzamy, czy konwersja była poprawna
      cout << "LICZBA\n";
    else
      cout << "NIE LICZBA\n";
    return 0;
}  
0

Ehh.. zapomniałem dodać, że nie mogę korzystać ze stringów... Ale dzięki za odpowiedź :)

0

Tak to wygląda obecnie.

#include <iostream>

using namespace std;

struct stos
{
	stos * poprzedni;
	double dana;
};

void dodaj(stos ** root, double dana)
{
	stos * tmp = new stos;

	tmp->dana = dana;
	tmp->poprzedni = *root;
	//cout << tmp->dana << "\n";
	*root = tmp;
}

void wyswietl(stos *root)
{
	stos * tmp = root;
	while (true){
		cout << tmp->dana << "\n";
		tmp = tmp->poprzedni;
		if (tmp->poprzedni == NULL){
			break;
		}
	}
}

double top(stos *root)
{
	stos * tmp = root;
	return tmp->dana;
}

void usun(stos **root)
{
	if (*root){
		stos * tmp = *root;
		*root = (*root)->poprzedni;
		//cout << tmp->dana << endl;
		delete tmp;
	}
}

int main()
{
	stos * S = new stos;
	S->poprzedni = NULL;
	double a = 0, pi = 3.14;
	char b;
	double v1 = 0, v2 = 0;
	//int dana = 0;
	while (true){
		cin >> a;
		if (cin.good()){
			dodaj(&S, a);
			cout << S->dana << endl;

		}
		else{
			cin.clear();
			cin.ignore(0, ' ');
			//cin.sync();
			cin >> b;
			if (b == '='){
				cout << top; break;
			}
			switch (b){
			case 'p':
				cin >> b;
				if (b == 'i'){
					cout << "dodaje: " << endl;
					dodaj(&S, pi);
					cout << "top:" << top(S) << endl;
				}
				else{
					break;
				}
				break;
			case 'n':
				cin.sync();
				v1 = top(S);
				dodaj(&S, -v1);
			case 'e':
				cin.sync();
				cout << "exp";
				break;
            case 's':
                cin >> b;
                if(b == 'i'){
                        break;
                }else{
                    //cin.sync();
                    cin >> b;
                    cin >> b;
                    if(b == '\n' || b == ' '){
                        //cin >> b;
                        cout << "sqrt";
                    }else{
                        cout << "sqr";
                    }
                }
				//cin.sync();

				break;
			}

			cout << "Znak ASCII: " << (int)b << endl;

			v1 = top(S);
			usun(&S);
			v2 = top(S);
			usun(&S);
			switch (b){
			case '+':
				v1 += v2;
				break;
			case '-':
				v1 -= v2;
				break;
			case '*':
				v1 *= v2;
				break;
			case '/':
				v1 /= v2;
				break;
			case 'o': // potęgowanie
				cin >> b;
				cout << "liczę: " << endl;
				v1 += v2;
			case 'i': // sinus
			    cin.sync();
				//cin.clear();
				cout << "sinus";
				break;
			case 'c': // cosinus
				cin.sync();
				cout << "cosinus";
				break;

			}
			//cout << "przed: " << top(S) << endl;

			dodaj(&S, v1);

			cout << "po: " << top(S) << endl;
			cout << "wynik: " << v1 << endl;
			cout << "Stos:\n";
			wyswietl(S);
			cout << "Koniec stosu:\n";
		}
	}

	for (int i = 1; i <= 10; i++){
		usun(&S);
	}
}
 

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