Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Реализовать программный калькулятор - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Работа с файлами... http://www.cyberforum.ru/cpp-beginners/thread37710.html
Методом простой итерации решить систему n линейных алгебраиче-ских уравнений c n неизвестными. Матрица коэффициентов системы и вектор свободных членов хранятся в двух файлах Помогите...
C++ Работа со списками Создать два списка целых чисел. Рассортировать каждый из них, используя алгоритм обмена. Из двух рассортированных списков путём их слияния получить новый рассортированный список, не используя третий... http://www.cyberforum.ru/cpp-beginners/thread37707.html
C++ Списка. Стеки, очереди, Кольца
Помогите написать программу для удаления последнего введенного элемента из списка (стеку).
C++ Шифратор текста, работа с файлами.
Шифратор Цезаря. Разработать программу, которая кодирует вводимый с клавиатуры или из файла исходный текст f1 и сохраняет его в выходном файле f2. В шифре Цезаря каждая i-я буква алфавита в исходном...
C++ Сложение матриц http://www.cyberforum.ru/cpp-beginners/thread37687.html
Помогите, пожалуйста. Даны две матрицы размером . Надо выполнить их сложение
C++ работа с файлами + небольшое шифрование Текст шифруется по следующему правилу: из исходного текста выбирается 1-й, 4-й, 7-й, 10-й и т. д. символы, затем 2-й, 5-й, 8, 11-й и т. д. символы, затем 3-й, 6-й, 9-й, 12-й и т. д. символы.... подробнее

Показать сообщение отдельно
ZZZed...
Сообщений: n/a
14.06.2009, 18:58
Цитата Сообщение от Хакер Посмотреть сообщение
Весь гугл облазил,ничего толкового не нашел...может у кого-то есть хороший учебник по с++,где все написано,все функции и тд...потому что хорошего материала по строкам найти не могу...Страуструп это вообще отдельный разговор,там у него такой бред,что черт ногу сломит...
Есть похожий пример в книге Р.Лафоре "ООП в С++"
Только тут без переменных.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// parse.cpp
// программа разбора арифметических выражений
#include <iostream>
#include <cstring>
using namespace std;
const int LEN = 80;       // максимальная длина выражения
const int MAX = 40;       //
///////////////////////////////////////////////////////////
class Stack
{
  private:
    char st [ MAX ];      // массив данных
    int top;              // количество сохраненных данных
  public:
    Stack ( )              // конструктор
      { top = 0; }
    void push ( char var ) // поместить в стек
      { st [ ++top ] = var; }
    char pop ( )           // взять из стека
      { return st [ top-- ]; }
    int gettop ( )         // узнать количество элементов
      { return top; }
};
///////////////////////////////////////////////////////////
class express
{
  private:
    Stack s;                   // стек данных
    char* pStr;                // строка для ввода
    int len;                   // длина строки
  public:
    express ( char* ptr )      // конструктор
      {
        pStr = ptr;            // запоминаем указатель на строку
        len = strlen ( pStr ); // устанавливаем длину
      }
    void parse ( );            // разбор выражения
    int solve ( );             // получение результата
}
///////////////////////////////////////////////////////////
void express::parse ( ) // добавляем данные в стек
{
  char ch;              // символ из строки
  char lastval;         // последнее значение
  char lastop;          // последний оператор
 
  for ( int j = 0; j < len; j++ ) // для всех символов в строке
  {
    ch = pStr [ j ];    // получаем символ
 
    if ( ch >= '0' && ch <= '9' ) // если это цифра,
      s.push ( ch - '0' );        // то сохраняем ее значение
    else
    if ( ch == '+' || ch == '-' || ch == '*' || ch == '/' )
    {
      if ( s.gettop ( ) == 1 ) // если это первый оператор,
        s.push ( ch );         // помещаем его в стек
      else // иначе
      {
        lastval = s.pop ( ); // получаем предыдущее число
        lastop = s.pop ( );  // получаем предыдущий оператор
        // если это * или /, а предыдущий был + или -, то
        if ( ( ch == '*' || ch == '/' ) && ( lastop == '+' || lastop == '-' ) )
        {
          s.push ( lastop ); // отменяем последние два взятия из стека
          s.push ( lastval );
        }
        else
        {
          // помещаем в стек результат операции
          switch ( lastop )
          {
            case '+': s.push ( s.pop ( ) + lastval ); break;
            case '-': s.push ( s.pop ( ) - lastval ); break;
            case '*': s.push ( s.pop ( ) * lastval ); break;
            case '/': s.push ( s.pop ( ) / lastval ); break;
            default: cout << "\nНеизвестный оператор"; exit ( 1 );
          }
        }
        s.push ( ch ); // помещаем в стек текущий оператор
      }
    }
    else               // какая-то ерунда...
    {
      cout << "\nНеизвестный символ";
      exit ( 1 );
    }
  }
}
///////////////////////////////////////////////////////////
int express::solve ( ) // убираем данные из стека
{
  char lastval;        // предыдущее значение
 
  while ( s.gettop ( ) > 1 )
  {
    lastval = s.pop ( ); // получаем предыдущее значение
    switch ( s.pop ( ) ) // получаем предыдущий оператор
    {
      case '+': s.push ( s.pop ( ) + lastval ); break;
      case '-': s.push ( s.pop ( ) - lastval ); break;
      case '*': s.push ( s.pop ( ) * lastval ); break;
      case '/': s.push ( s.pop ( ) / lastval ); break;
      default: cout << "\nНеизвестный оператор"; exit ( 1 );
    }
  }
  return int ( s.pop ( ) ); // последний оператор в стеке – это результат
}
///////////////////////////////////////////////////////////
int main ( )
{
  char ans;            // 'д' или 'н'
  char string [ LEN ]; // строка для разбора
 
  cout << "\nВведите арифметическое выражение в виде 2+3*4/3-2"
          "\nЧисла должны быть из одной цифры"
          "\nНе используйте пробелы и скобки";
 
  do
  {
    cout << "\nВыражение: ";
    cin >> string;                          // вводим строку
    express* eptr = new express ( string ); // создаем объект для разбора
    eptr->parse ( );                        // разбираем
    cout << "\nРезультат: "
         << eptr->solve ( );                // решаем
    delete eptr;                            // удаляем объект
    cout << "Еще одно выражение (д/н)? ";
    cin >> ans;
  }
  while ( ans == 'д' );
  return 0;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru