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

Wyświetla błąd zamiast liczby (kalkulator w konsoli)

Ostatnio zmodyfikowano 2010-02-23 17:54
Autor Wiadomość
lenrokskate
Temat założony przez niniejszego użytkownika
Wyświetla błąd zamiast liczby (kalkulator w konsoli)
» 2010-02-21 13:20:06
Chcę napisać kalkulator w konsoli wg. mojego pomysłu. Jego kod jeszcze nie jest dokończony bo natrafiłem na problem który powoduje że nie napiszę tego kalkulatora w ten sposób. No i mam pytanie: czy da się ten kalkulator napisać wg. mojego pomysłu tak żeby działał? Jeśli nie to czy jest możliwe rozwiązanie tego problemu dzięki WinAPI (bo nawet chcę żeby jak uda mi się to napisać w konsoli to przeniosę do WinAPI żeby wyglądało to bardziej jak kalkulator)?

Kod:

C/C++
#include <iostream>
using namespace std;

string wejscie;
int i;
int ai, bi;
int wielkosc = 50;
char dzialanie;

int main()
{
    cout << "Wpisz dzialanie i zatwierdz znakiem [ENTER] " << endl << endl;
    getline( cin, wejscie );
   
    int aLiczba[ wielkosc ];
    int bLiczba[ wielkosc ];
   
    for( i; i <= wielkosc; i++ )
    {
        if( wejscie[ i ] == '1' )
        { aLiczba[ ai ] = 1; ai++; }
        else if( wejscie[ i ] == '2' )
        { aLiczba[ ai ] = 2; ai++; }
        else if( wejscie[ i ] == '3' )
        { aLiczba[ ai ] = 3; ai++; }
        else if( wejscie[ i ] == '4' )
        { aLiczba[ ai ] = 4; ai++; }
        else if( wejscie[ i ] == '5' )
        { aLiczba[ ai ] = 5; ai++; }
        else if( wejscie[ i ] == '6' )
        { aLiczba[ ai ] = 6; ai++; }
        else if( wejscie[ i ] == '7' )
        { aLiczba[ ai ] = 7; ai++; }
        else if( wejscie[ i ] == '8' )
        { aLiczba[ ai ] = 8; ai++; }
        else if( wejscie[ i ] == '9' )
        { aLiczba[ ai ] = 9; ai++; }
        else if( wejscie[ i ] == '0' )
        { aLiczba[ ai ] = 0; ai++; }
        else if( wejscie[ i ] == '+' )
        { dzialanie = '+'; break; }
        else if( wejscie[ i ] == '-' )
        { dzialanie = '-'; break; }
        else if( wejscie[ i ] == '*' )
        { dzialanie = '*'; break; }
        else if( wejscie[ i ] == '/' )
        { dzialanie = '/'; break; }
    }
   
    for( i; i <= wielkosc; i++ )
    {
        if( wejscie[ i ] == '1' )
        { bLiczba[ bi ] = 1; bi++; }
        else if( wejscie[ i ] == '2' )
        { bLiczba[ bi ] = 2; bi++; }
        else if( wejscie[ i ] == '3' )
        { bLiczba[ bi ] = 3; bi++; }
        else if( wejscie[ i ] == '4' )
        { bLiczba[ bi ] = 4; bi++; }
        else if( wejscie[ i ] == '5' )
        { bLiczba[ bi ] = 5; bi++; }
        else if( wejscie[ i ] == '6' )
        { bLiczba[ bi ] = 6; bi++; }
        else if( wejscie[ i ] == '7' )
        { bLiczba[ bi ] = 7; bi++; }
        else if( wejscie[ i ] == '8' )
        { bLiczba[ bi ] = 8; bi++; }
        else if( wejscie[ i ] == '9' )
        { bLiczba[ bi ] = 9; bi++; }
        else if( wejscie[ i ] == '0' )
        { bLiczba[ bi ] = 0; bi++; }
    }
    cout << bLiczba << dzialanie << bLiczba << endl;
    system( "pause" );
    return EXIT_SUCCESS;
}
P-14002
malan
» 2010-02-21 13:37:44
Jeśli dobrze odczytałem Twój program to chcesz żeby działa tak:
Dane na wejściu: 2+2+5
Dane na wyjściu: 9
Jeden ze sposobów:
1. Wczytujesz działanie jako tekst,
2. Tworzysz 2 tablice: (np. liczby, dzialanie)
3. Do 1 zap. liczby, a do drugie znaki:
Posługując się powyższym przykładem, końcowy efekt będzie taki:
C/C++
liczby[ 0 ] = 2;
liczby[ 1 ] = 2;
liczby[ 2 ] = 5;
// ...
dzialanie[ 0 ] = '+';
dzialanie[ 1 ] = '+';
4. Teraz tylko pozostało sprawdzenie jakie działanie należy wykonać i już :):
C/C++
for( int i = 0; i < ilosc_liczb - 1; i += 2 )
switch( dzialanie[ i ] )
{
case '+': suma += liczby[ i ] + liczby[ i + 1 ]; break;
    //...
}
To oczywiście jest tylko przykład, więc poprawnie działać nie będzie, ale myślę, że Cie nakierowałem :).
P-14003
lenrokskate
Temat założony przez niniejszego użytkownika
» 2010-02-21 20:21:08
troche to pogmatwane ale może spróbuję...

gorzej będzie jak trzeba będzie wprowadzić liczby =<2 - cyfrowe
P-14012
lenrokskate
Temat założony przez niniejszego użytkownika
Refresh
» 2010-02-22 12:41:04
Odświeżam temat ponieważ udało mi się napisać program który dodaje i odejmuje liczby 1-cyfrowe, ale jest problem przy mnożeniu:
2 * 2 = 4
2 * 2 * 2 = 4     ???

Kod programu:
C/C++
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;

vector < int > liczby( 20 );
vector < char > dzialania( 20 );

unsigned char znak;
int wLiczba = 0;
int wDzialanie = 0;
int wynik;

void start();

int main()
{
    start();
    while( znak != '=' )
    {
        znak = getch();
        switch( znak )
        {
        case '1':
            liczby[ wLiczba ] = 1;
            wLiczba++;
            break;
        case '2':
            liczby[ wLiczba ] = 2;
            wLiczba++;
            break;
        case '3':
            liczby[ wLiczba ] = 3;
            wLiczba++;
            break;
        case '4':
            liczby[ wLiczba ] = 4;
            wLiczba++;
            break;
        case '5':
            liczby[ wLiczba ] = 5;
            wLiczba++;
            break;
        case '6':
            liczby[ wLiczba ] = 6;
            wLiczba++;
            break;
        case '7':
            liczby[ wLiczba ] = 7;
            wLiczba++;
            break;
        case '8':
            liczby[ wLiczba ] = 8;
            wLiczba++;
            break;
        case '9':
            liczby[ wLiczba ] = 9;
            wLiczba++;
            break;
        case '0':
            liczby[ wLiczba ] = 0;
            wLiczba++;
            break;
        case '+':
            dzialania[ wDzialanie ] = '+';
            wDzialanie++;
            break;
        case '-':
            dzialania[ wDzialanie ] = '-';
            wDzialanie++;
            break;
        case '*':
            dzialania[ wDzialanie ] = '*';
            wDzialanie++;
            break;
        case 13:
            return( 0 );
            break;
        }
        cout << " " << znak;
    }
    switch( dzialania[ 0 ] )
    {
    case '+':
        wynik = liczby[ 0 ] + liczby[ 1 ];
        break;
    case '-':
        wynik = liczby[ 0 ] - liczby[ 1 ];
        break;
    case '*':
        wynik = liczby[ 0 ] * liczby[ 1 ];
        break;
    }
    for( int i; i <= wLiczba; i++ )
    {
        if( dzialania[ i + 1 ] == '+' )
             wynik += liczby[ i + 2 ];
       
        if( dzialania[ i + 1 ] == '-' )
             wynik -= liczby[ i + 2 ];
       
        if( dzialania[ i + 1 ] == '*' )
             wynik *= liczby[ i + 2 ];
       
    }
    cout << " " << wynik;
    system( "pause > nul" );
    return EXIT_SUCCESS;
}

void start()
{
    system( "cls" );
    cout
    << "Kalkulator C++ by lenroskate" << endl
    << "----------------------------" << endl
    << "----------------------------" << endl
    << "----------------------------" << endl
    << endl
    << "-->";
};
P-14020
lenrokskate
Temat założony przez niniejszego użytkownika
Refresh
» 2010-02-22 12:42:45
Odświeżam temat ponieważ udało mi się napisać program który dodaje i odejmuje liczby 1-cyfrowe, ale jest problem przy mnożeniu:
2 * 2 = 4
2 * 2 * 2 = 4     ???

Pewnie przy czytaniu source tego kalkulatora zdziwisz się dlaczego użyłem wektorów a nie zwykłych tablic... zrobiłem tak ponieważ przerobię ten program później tak by obsługiwał także liczby 2 i więcej cyfrowe, a do tego przyda się dynamiczny wektor.

Kod programu:
C/C++
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;

vector < int > liczby( 20 );
vector < char > dzialania( 20 );

unsigned char znak;
int wLiczba = 0;
int wDzialanie = 0;
int wynik;

void start();

int main()
{
    start();
    while( znak != '=' )
    {
        znak = getch();
        switch( znak )
        {
        case '1':
            liczby[ wLiczba ] = 1;
            wLiczba++;
            break;
        case '2':
            liczby[ wLiczba ] = 2;
            wLiczba++;
            break;
        case '3':
            liczby[ wLiczba ] = 3;
            wLiczba++;
            break;
        case '4':
            liczby[ wLiczba ] = 4;
            wLiczba++;
            break;
        case '5':
            liczby[ wLiczba ] = 5;
            wLiczba++;
            break;
        case '6':
            liczby[ wLiczba ] = 6;
            wLiczba++;
            break;
        case '7':
            liczby[ wLiczba ] = 7;
            wLiczba++;
            break;
        case '8':
            liczby[ wLiczba ] = 8;
            wLiczba++;
            break;
        case '9':
            liczby[ wLiczba ] = 9;
            wLiczba++;
            break;
        case '0':
            liczby[ wLiczba ] = 0;
            wLiczba++;
            break;
        case '+':
            dzialania[ wDzialanie ] = '+';
            wDzialanie++;
            break;
        case '-':
            dzialania[ wDzialanie ] = '-';
            wDzialanie++;
            break;
        case '*':
            dzialania[ wDzialanie ] = '*';
            wDzialanie++;
            break;
        case 13:
            return( 0 );
            break;
        }
        cout << " " << znak;
    }
    switch( dzialania[ 0 ] )
    {
    case '+':
        wynik = liczby[ 0 ] + liczby[ 1 ];
        break;
    case '-':
        wynik = liczby[ 0 ] - liczby[ 1 ];
        break;
    case '*':
        wynik = liczby[ 0 ] * liczby[ 1 ];
        break;
    }
    for( int i; i <= wLiczba; i++ )
    {
        if( dzialania[ i + 1 ] == '+' )
             wynik += liczby[ i + 2 ];
       
        if( dzialania[ i + 1 ] == '-' )
             wynik -= liczby[ i + 2 ];
       
        if( dzialania[ i + 1 ] == '*' )
             wynik *= liczby[ i + 2 ];
       
    }
    cout << " " << wynik;
    system( "pause > nul" );
    return EXIT_SUCCESS;
}

void start()
{
    system( "cls" );
    cout
    << "Kalkulator C++ by lenroskate" << endl
    << "----------------------------" << endl
    << "----------------------------" << endl
    << "----------------------------" << endl
    << endl
    << "-->";
};
P-14021
malan
» 2010-02-22 16:48:56
Ja bym Ci radził zmienić algorytm wczytujący liczby, bo będziesz miał problem (jak wspomniałeś) przy liczbach kilku cyfrowych ;p . Wczytaj całe działanie, a potem dopiero rozdzielaj do tablic, a nie wczytujesz znak po znaku ;p. Popraw to, a potem wrócimy do mnożenia :).
P-14026
pekfos
» 2010-02-23 16:29:06
P-14052
lenrokskate
Temat założony przez niniejszego użytkownika
» 2010-02-23 17:54:10
dla mnie to za duży hardcore z takimi parserami...
P-14066
« 1 »
  Strona 1 z 1