Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2012, 17:54   #1
Avicii
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 10
По умолчанию Строки С++

Помогите доделать программу,не знаю как вычислить арифметическое выражение в данной строке
Само Задание: Дана строка, содержащая текст и арифметическое выражение со знаками +,-,*,/.Выписать арифметическое выражение и вычислить его значение.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char* temp = "Esli ne shkolnik to reshi 2+2*2";
char* str = (char*)malloc(strlen(temp)+1), *old;
strcpy(str,temp);
printf("%s\n",str);
old = str;
temp = strtok(str," ");
while(temp)
{
if(strchr(temp,'* - + *'))
printf("%s ",temp);
temp = strtok(NULL," ");
}
printf("\n");
free(old);
return 0;
}
Avicii вне форума Ответить с цитированием
Старый 03.12.2012, 03:23   #2
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Я тут накидал бесскобочный вариант с небольшими тестами.
Код:
#include <stdio.h>
#include <iostream>
#include <vector>
using std::cout;
using std::vector;


struct svar {
    double n; // значение-число
    char   c; // арифметическая операция +-/*
    svar(void): c(0) {}
    svar(double n, char c) {
        this->n = n;
        this->c = c;
    }
};

bool  is_chmath(const char* s);
double calculate(const char* s);



int main(void)
{
   char s[] = "Esli ne shkolnik to reshi -900/2.5+10*10/2.5-2.999";

   for(char* p = strtok(s, " "); p; p = strtok(NULL, " ")) {
       if(is_chmath(p))
           cout << "result:\t" << calculate(p) << '\n';
   }

   double test = -900/2.5+10*10/2.5-2.999;
   cout << "test:\t" << test << '\n';

   // ещё тест
   cout << calculate("100+200/2+10*2") << '=' << (100+200/2+10*2) << '\n';
   cout << calculate("-2*-2+1000-4/0.2") << '=' << (-2*-2+1000-4/0.2) << '\n';
   cout << calculate("9*2-3.14*0.9876+10") << '=' << (9*2-3.14*0.9876+10) << '\n';
   return 0;
}


// беглая проверка на паршивость арифметического выражения
bool  is_chmath(const char* s) {
    const char* t = "0123456789.+/*-";
    while(*s) {
        if(strchr(t, *s) == NULL)
               return false;
        *s++;
    }
    return true;
}


// обработка арифм-выражений без скобок
double calculate(const char* s) {
   vector<svar> vars;
   double n = 0.0;
   int p    = 0;

   while(sscanf(s, "%lf%n", &n, &p) == 1) {
       s += p;
       vars.push_back( svar(n, *s) );
       if(! *s)
           break;
       *s++;
   }

   if(vars.empty())
       return 0.0;
   vars.back().c = 0;

   for(size_t i = 0u; i < vars.size(); i++) {
        p = 0;
        if(vars[i].c == '*') {
            vars[i].n *= vars[i + 1].n;
            p = 1;
        } else if(vars[i].c == '/') {
            vars[i].n /= vars[i + 1].n;
            p = 1;
        }

        if(p) {
            vars[i + 1].n = vars[i].n;
            vars.erase(vars.begin() + i);
            --i;
        }
   }

   for(size_t j = 0u; j < vars.size(); j++) {
        p = 0;
        if(vars[j].c == '+') {
            vars[j].n += vars[j + 1].n;
            p = 1;
        } else if(vars[j].c == '-') {
            vars[j].n -= vars[j + 1].n;
            p = 1;
        }

        if(p) {
            vars[j + 1].n = vars[j].n;
            vars.erase(vars.begin() + j);
            --j;
        }
   }

   n = vars.front().n;
   vars.clear();
   return n;
}
Nuklon вне форума Ответить с цитированием
Старый 03.12.2012, 07:41   #3
Avicii
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 10
По умолчанию

Слишком тяжело для моих познаний))не разберу что к чему....
Avicii вне форума Ответить с цитированием
Старый 21.12.2012, 16:27   #4
Avicii
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 10
По умолчанию

можно попроще?) или хотя бы отдельно пример как вычислять арфметическое выражение из строки
Avicii вне форума Ответить с цитированием
Старый 21.12.2012, 19:15   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
можно попроще?)
Вот вроде у Nuklon не так много сообщений, но в каждом идеально наглядный код.
Куда уж проще)
EUGY вне форума Ответить с цитированием
Старый 22.12.2012, 07:04   #6
Avicii
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 10
По умолчанию

я только на первом курсе,еще не знаю многое,поэтому многого не понимаю
Avicii вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на языке "Ассемблер" - ввод строки, анализ длины строки, добавление точки в конец строки Алексей_2012 Помощь студентам 1 05.04.2012 11:26
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности kris__tina БД в Delphi 1 09.06.2011 15:31
Создание пустой строки и копирование в неё содержимое предыдущей строки Gvaridos Microsoft Office Excel 2 29.10.2010 13:33
Определять максимальную длину той части строки s, которая не содержит символы из строки s1. Александе еть я Общие вопросы C/C++ 5 13.04.2010 20:54
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10