Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Operatory działania (+,-,/,*) w danych wejściowych.

Ostatnio zmodyfikowano 2020-12-25 15:10
Autor Wiadomość
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.


C/C++
#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; // czemu trzeba dac spaaaaaaaaacje :((((((((
       
if( znak == '+' )
       
{
           
cout << dodawanie( pierwszaLiczba, drugaLiczba ) << endl;
           
i++;
       
}
       
/*else
           if(znak == '*')
            {
                cout << mnozenie(pierwszaLiczba,drugaLiczba) << endl;
                //int x = pierwszaLiczba.length();
               // cout << x << endl;
                //int pierwszaPozycja = pierwszaLiczba.length() - (pierwszaLiczba.length() - 1);
                //cout << pierwszaPozycja << endl;
                i++;
            }
        /*else
            if(znak == '*')
            {

                i++;
            }
        else
            if(znak == '/')
            {

                i++;
            }*/
       
   
}
   
   
return 0;
}

/*string dodawanie(string  pierwszaLiczba, string drugaLiczba) // no to liczenie na stringach, to  pisemne
    {
        int pierwszaPozycja = pierwszaLiczba.length();
        int drugaPozycja = drugaLiczba.length();

        int n = pierwszaPozycja;

        if(drugaPozycja < pierwszaPozycja)
        {
            n = drugaPozycja;
        }

        string wynik = "";
        int przeniesienie = 0;
        for(int i = 1; i<=n; i++)
        {
            int wartosc = (int)(pierwszaLiczba[--pierwszaPozycja]) + (int)(drugaLiczba[--drugaPozycja]) + przeniesienie -96;
            przeniesienie = wartosc / 10;
            wynik = (char)((wartosc % 10) + 48) + wynik;
        }
        while(pierwszaPozycja)
        {
            int wartosc = pierwszaLiczba[--pierwszaPozycja] + przeniesienie - 48;
            przeniesienie = wartosc / 10;
            wynik = (char)((wartosc % 10) + 48) + wynik;
        }
        while(pierwszaPozycja)
        {
            int wartosc = drugaLiczba[--drugaPozycja] + przeniesienie - 48;
            przeniesienie = wartosc / 10;
            wynik = (char)((wartosc % 10) + 48) + wynik;
        }
        if(przeniesienie > 0)
        {
            wynik = (char)(przeniesienie + 48) + wynik;
        }
        if(wynik == "")
            wynik = "0";
        return wynik;
    }*/

string dodawanie( string pierwszaLiczba, string drugaLiczba ) // no to liczenie na stringach, to  pisemne
{
   
   
int pierwszaPozycja = pierwszaLiczba.length() - 1; // zaczynamy od konca, wiec ostatnia pozycja
   
int drugaPozycja = drugaLiczba.length() - 1;
   
   
string wynik = ""; // czyli 0
   
   
   
int przeniesienie = 0; // to to przeniesienie przy dodawaniu pisemnym, jak jest wiecej niz 9 to sie przenosi wartosc na lewo :)
   
   
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 )
{
   
}


P-177874
DejaVu
» 2020-12-23 17:05:17
C/C++
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)

C/C++
#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
P-177876
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.
P-177877
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.
P-177878
pekfos
» 2020-12-25 11:43:24
Jako że poprawnych operatorów jest kilka, lepsze od find() może być find_first_of().
https://en.cppreference.com/w/cpp/string/basic_string/find_first_of
P-177879
Adyn
Temat założony przez niniejszego użytkownika
» 2020-12-25 15:10:37
Wszystko działa, ślicznie dziękuję panom :)
P-177880
« 1 »
  Strona 1 z 1