Operatory działania (+,-,/,*) w danych wejściowych.
Ostatnio zmodyfikowano 2020-12-25 15:10
Adyn Temat założony przez niniejszego użytkownika |
Operatory działania (+,-,/,*) w danych wejściowych. » 2020-12-23 14:19:38 Dzień dobry, Mój problem polega na tym ze w programie liczącym wielkie liczby musze sprawic aby program działał z danymi od użytkownika które mają wyglądać tak: a+b, czyli liczba a,operator działania oraz liczba b, bez żadnych spacji miedzy nimi. Mój program ma ten problem, że bez spacji nie działa, natomiast ze spacjami (a + b) już wszystko się ładnie kompiluje. Poniżej zamieszczam kod i byłbym wdzięczny za jakąkolwiek pomoc i nakierowanie jak mogę uzyskać pożądany format. #include <iostream> #include <string>
using namespace std;
string dodawanie( string pierwszaLiczba, string drugaLiczba ); string mnozenie( string pierwszaLiczba, string drugaLiczba );
int main() { int liczbaPowtorzen; char znak; string pierwszaLiczba; string drugaLiczba; cout << "Wprowadz liczbe powtorzen: "; cin >> liczbaPowtorzen; if( liczbaPowtorzen > 200 || liczbaPowtorzen < 1 ) { cout << "Bledna liczba powtorzen.\n"; do { cout << "Wprowadz odpowiednia liczbe powtorzen, przedzial 0-200\n"; cin >> liczbaPowtorzen; } while( liczbaPowtorzen > 200 || liczbaPowtorzen < 0 ); } cout << "Zaczynajmy.\n"; for( int i = 0; i < liczbaPowtorzen; ) { cin >> pierwszaLiczba >> znak >> drugaLiczba; if( znak == '+' ) { cout << dodawanie( pierwszaLiczba, drugaLiczba ) << endl; i++; } } return 0; }
string dodawanie( string pierwszaLiczba, string drugaLiczba ) { int pierwszaPozycja = pierwszaLiczba.length() - 1; int drugaPozycja = drugaLiczba.length() - 1; string wynik = ""; int przeniesienie = 0; while( pierwszaPozycja >= 0 || drugaPozycja >= 0 ) { int wartoscPierwsza, wartoscDruga, wartosc; if( pierwszaPozycja >= 0 ) { wartoscPierwsza = pierwszaLiczba[ pierwszaPozycja ] - 48; } else { wartoscPierwsza = 0; } if( drugaPozycja >= 0 ) { wartoscDruga = drugaLiczba[ drugaPozycja ] - 48; } else { wartoscDruga = 0; } wartosc = wartoscPierwsza + wartoscDruga + przeniesienie; wynik = "0" + wynik; wynik[ 0 ] = 48 + wartosc % 10; przeniesienie = wartosc / 10; pierwszaPozycja--; drugaPozycja--; } if( przeniesienie == 1 ) { wynik = "1" + wynik; } return wynik; } string mnozenie( string pierwszaLiczba, string drugaLiczba ) { }
|
|
DejaVu |
» 2020-12-23 17:05:17 cin >> pierwszaLiczba >> znak >> drugaLiczba;
Najwyraźniej std::cin nie wczytuje poprawnie albo liczby albo znaku w sytuacji, którą opisałeś :) Opcje: - wczytywać jako tekst, a potem parsować tekst do postaci liczb i operatora - spróbować doczytać dlaczego std::cin nie zachowuje się zgodnie z Twoimi oczekiwaniami i być może zmusić go, aby zadziałał tak jak chcesz (o ile to możliwe) #include <iostream>
using namespace std;
int main() { int x = 0; char y = 0; int z = 0; cin >> x; cin >> y; cin >> z; cout << "x = " << x << "; y = " << y << "; z = " << z << endl; return 0; }
Działa jak trzeba pod linuxem: https://www.onlinegdb.com/online_c++_compiler |
|
Adyn Temat założony przez niniejszego użytkownika |
» 2020-12-23 18:19:27 W tym podanym wyżej przykladzie w którym to działa, działa dlatego, że zmienna x i z są typu int, a u mnie są 2 typy string i jeden char. Czy da sie to tak zrobic na zmiennych typu string?
Pozdrawiam. |
|
DejaVu |
» 2020-12-23 21:21:43 A... no to skoro czytasz liczby jako tekst to w sumie prosta sprawa. Wczytaj cały wiersz do std::string (np. getline). Potem wyszukaj w tym wierszu operatora. Metody potrzebne do zadania:
find |
Wyszukuje pierwszego wystąpienia danego łańcucha znaków. (metoda) |
substr |
Zwraca podciąg łańcucha znaków. (metoda) |
Możesz wyszukać sobie pozycję znaku za pomocą zwykłej pętli for, a potem wytniesz sobie pierwszą i drugą liczbę z tekstu za pomocą substr. |
|
pekfos |
» 2020-12-25 11:43:24 |
|
Adyn Temat założony przez niniejszego użytkownika |
» 2020-12-25 15:10:37 Wszystko działa, ślicznie dziękuję panom :) |
|
« 1 » |