Создаю я калькулятор...

Здравствуйте! Я начинающий программист на языке С++.
Пытаюсь сделать калькулятор, который мог бы решать примеры типа 123+123 или 432*2343 и т.п. (два числа, одно действие).

Пример вводится с помощью строки(массив типа char). Попытался написать что-то типа:

#include <iostream>
#include <conio.h>
#include <string.h>
#include <cstdlib>

using namespace std;

bool is_chis( char chr ) 
{
    int i = chr;
     if ( i < 57 || i > 48 ) 
     {
          return true;
      }
     else
     {
         return false; 
     }
 }

void nullmasschar( char buff[], int j )
{
    for ( int i = 0; i <= j; i++ )
    {
        buff[i] = 0; 
    }
}

int main()
{
    long long x,y; 
    int temp=0, i = 0, i2=0; 
    char str[200], buff[200];
    nullmasschar( buff, 200 ); 
    cin >> str; 
    while ( is_chis(str[temp]) ) 
    {
           temp++;          
    }
    for ( i = 0; i < temp; i++ ) 
    {
        buff[i] = str[i];
    } 
    x = atof ( buff ); 
    nullmasschar( buff, 200 ); 
    for ( i = i + 1; i < strlen(str); i++ ) 
    {
        buff[i2] = str[i]; 
        i2++;  
    } 
    y = atof ( buff ); 
    switch ( str[temp] ) 
    {
        case '+' : x = x + y; break; 
        case '-' : x = x - y; break; 
        case '*' : x = x * y; break; 
        case '/' : x = x / y; break; 
    }
    cout << x; 
    getch();
    return 0;
}

Компиляция проходит на ура. Но после ввода строки windows выдаёт ошибку о том, что программа завершила свою работу.

Если убрать

while ( is_chis(str[temp]) ) 
    {
           temp++;
    }

то программа работает, но естественно неправильно.

Не могу понять в чём моя ошибка.Помогите пожалуйста...

З.Ы. Использую DevCpp 5.4.2

(1) Ошибка в ф-ции is_chis(). Должно быть так:

bool is_chis( char chr ) 
{
    int i = chr;
     if ( i >= '0' && i <= '9' ) 
     {
          return true;
      }
     else
     {
         return false; 
     }
 }

а лучше так:

inline bool is_chis( char chr ) 
{
     return chr >= '0' && chr <= '9';
}

(2) Ошибка в функции nullmasschar() — выход за границу массива. Должно быть так:

void nullmasschar( char buff[], int j )
{
    for ( int i = 0; i < j; i++ ) // <- здесь у тебя была лишняя итерация цикла
    {
        buff[i] = '\0'; // надо быть аккуратным
    }
}

Сейчас эта ошибка не проявляется, но она может давать очень забавные эффекты ))

А вообще, эту программу можно записать гораздо короче (уж разрешите выпендрится ;-)

#include <iostream>
#include <conio.h>
#include <cstdlib>

using namespace std;

inline bool is_chis( char chr ) 
{
     return chr >= '0' && chr <= '9';
}

int main()
{
    long long x, y; 
    char str[200];

    cin >> str;

    x = atof(str);

    char *ptr = str;
    while (is_chis(*ptr++))
        ;
    ptr--;

    char op = *ptr++;

    y = atof(ptr);

    switch ( op ) 
    {
        case '+' : x = x + y; break; 
        case '-' : x = x - y; break; 
        case '*' : x = x * y; break; 
        case '/' : x = x / y; break; 
    }
    cout << x; 
    getch();
    return 0;
}

А заодно и задачка на сообразительность на тему «работа с указателями» )))

Кстати, а вот маленький пример чудес выхода за границу массива:

#include <iostream>
#include <conio.h>

using namespace std;

void nullmasschar( char buff[], int j )
{
    for ( int i = 0; i <= j; i++ )
    {
        buff[i] = 'b'; 
    }
}

int main()
{
    char buff[15];
    char ch = 'A';

    cout << ch << endl;

    nullmasschar(buff, 15);

    cout << ch << endl;

    getch();
    return 0;
}

Эффект проявляется под Dev-C++ 5.5.3.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.