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

Написать строковый калькулятор - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Бинарное дерево поиска http://www.cyberforum.ru/cpp-beginners/thread837092.html
Пишу программу - Бинарное дерево поиска для Bag class. Заголовочный файл: #ifndef BAG6_H #define BAG6_H #include <cstdlib> // Provides NULL and size_t #include "bintree.h" // Provides binary_tree_node and related functions namespace main_savitch_10
C++ Перегрузка оператора умножения числа на матрицу Доброго дня суток. Хочу перегрузить оператор умножение числа на матрицу. Перегрузил сначала в классе вот так: matrix operator*(const double ); а вне класса(в том же хидере) написал вот так: matrix operator*(const double & arg_double, const matrix & arg_matrix) { return ((arg_matrix)*(arg_double)); } VS ругается,что нету оператора "*" для таких типов. http://www.cyberforum.ru/cpp-beginners/thread837071.html
Некорректность работы программы при считывании текстовых данных с файла C++
Здравствуйте!) Помогите, пожалуйста, решить данную проблему... Почему при следующем варианте кода, программа просто-напросто не работает и вылетает. В чём ошибка при считывании? Подскажите, пожалуйста #include "stdafx.h" #include "iostream" #include <fstream> #include <conio.h> #include <string> #include <locale.h>
Работа с tinyxml ошибки LNK 2019 и LNK 2001 C++
всем привет! скачал архив tinyxml, разархивировал в папку проекта затем написал следующий код: #include "stdafx.h" #include "tinyxml/tinyxml.h" #include <iostream> int _tmain(int argc, _TCHAR* argv) {
C++ Узнать указывает ли указатель http://www.cyberforum.ru/cpp-beginners/thread837020.html
Доброго времени суток. Постановка задачи такова: есть указатель на массив, надо удалить массив, а потом создать новый, но не ясно указывает ли указатель уже куда-то. Как с этим побороться? Спасибо!
C++ Сортировка Нужно написать алгоритмы для Selection, Insertion, Shell, Quick, Merge, Heap сортировок для любых типов данных. Например, сравнить машины и их объемы двигателей. Сам начинающий, не знаю, как сделать. Может кто-то помочь написать любой алгоритм для примера? подробнее

Показать сообщение отдельно
Simpson_
15 / 15 / 3
Регистрация: 06.02.2013
Сообщений: 52
14.04.2013, 01:11     Написать строковый калькулятор
Через стек.
Записать исходный пример в массив. Перевести в постфиксную форму, и оценить постфиксное фыражение.

Вот пример но он только для целых чисел и без проверки на корректность ввода.


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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
//РАБОТАЕТ ТОЛЬКО С ЦЕЛЫМИ ЧИСЛАМИ
 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
 
struct stackNode                                //для перевода в постфиксную форму
   {
    char data;
    struct stackNode* nextPtr;
   };
 
struct numberStackNode                          //стэк для калькулятора
   {
    int data;
    struct numberStackNode* nextPtr;
   };
 
typedef struct stackNode StackNode;                //для перевода в постфиксную форму
typedef StackNode* StackNodePtr;
 
typedef struct numberStackNode NumberStackNode;    //для калькулятора
typedef NumberStackNode* NumberStackNodePtr;
 
 
void convertToPostfix(char*, char*);          //переводит выражение и инфиксной в постфиксную запись
int isOperator(char);                         //определяет, является ли символ оператором
int precedence(char, char);                   //сравнивает по приоритету
 
void push(StackNodePtr*, char);
void pushInt(NumberStackNodePtr*, int);              //добавляет в стэк
 
char pop(StackNodePtr*);
int popInt(NumberStackNodePtr*);                      //выбирает из стэка
 
char stackTop(StackNodePtr);                  //смотрит верхнее значение стэка
int isEmpty(StackNodePtr);                    //проверяет пуст ли стэк
void printStack(NumberStackNodePtr);                //вывоит стэк(не используется)
int evaluatePostfixExpression(char*);             //создаёт элементарные выражения для calculate()
int calculate(int, int, char);                    //считает элементарные выражения
 
int main(void)
{
   char string[100];
   char postString[100];
   int i;
 
   printf("Enter infix string: ");
   gets(string);
   convertToPostfix(string, postString);
   printf("Postfix string: ");
   puts(postString);
   printf("Rezult: %d\n", evaluatePostfixExpression(postString));
 
   system("pause");
   return 0;
}
 
void push(StackNodePtr* topPtr, char value)
{
   StackNodePtr newPtr;
 
   newPtr=malloc(sizeof(StackNode));
 
   if(newPtr!=NULL)
     {
      newPtr->data=value;
      newPtr->nextPtr=*topPtr;
      *topPtr=newPtr;
     }
   else
      printf("%c not inserted. No memory available.\n", value);
}
 
void pushInt(NumberStackNodePtr* topPtr, int value)
{
   NumberStackNodePtr newPtr;
 
   newPtr=malloc(sizeof(NumberStackNode));
 
   if(newPtr!=NULL)
     {
      newPtr->data=value;
      newPtr->nextPtr=*topPtr;
      *topPtr=newPtr;
     }
   else
      printf("%d not inserted. No memory available.\n", value);
}
 
char pop(StackNodePtr* topPtr)
{
   StackNodePtr tempPtr;
   char popValue;
 
   tempPtr=*topPtr;
   popValue=(*topPtr)->data;
   *topPtr=(*topPtr)->nextPtr;
  // printf("%c", tempPtr->data);
   free(tempPtr);
 //  printf("\n");
   return popValue;
}
 
 
int popInt(NumberStackNodePtr* topPtr)
{
   NumberStackNodePtr tempPtr;
   int popValue;                                  
 
   tempPtr=*topPtr;
   popValue=(*topPtr)->data;
   *topPtr=(*topPtr)->nextPtr;
  // printf("%c", tempPtr->data);
   free(tempPtr);
 //  printf("\n");
   return popValue;
}
 
void printStack(NumberStackNodePtr currentPtr)
{
   if(currentPtr==NULL)
      printf("The stack is empty.\n\n");
   else
     {
     printf("The stack is:\n");
 
      while(currentPtr!=NULL)
         {
          printf("%d --> ", currentPtr->data);
          currentPtr=currentPtr->nextPtr;
         }
 
      printf("NULL\n\n");
     }
}
 
int isEmpty(StackNodePtr topPtr)
{
   return topPtr==NULL;
}
 
char stackTop(StackNodePtr topPtr)
{
  return topPtr->data;
}
 
int precedence(char operator1, char operator2)                //ничё другого не пришло в голову...
{
   char oper[]={'+', '-', '*', '/', '^', '%'};
   int prior[]={0, 0, 1, 1, 2, 2};
   int counter=-1, op1, op2;
 
   while(++counter<6)
      {
       if(oper[counter]==operator1)
          op1=prior[counter];
 
       if(oper[counter]==operator2)
          op2=prior[counter];
      }
 
   if(op2==op1)
      return 0;
   else if(op1<op2)
      return -1;
   else if(op1>op2)
      return 1;
 
}
 
int isOperator(char c)
{
   if(c=='+' || c=='-' || c=='*' || c=='/' || c=='^' || c=='%')
      return 1;
 
   return 0;
}
 
void convertToPostfix(char* infix, char* postfix)
{
   StackNodePtr stackPtr=NULL;
   int len, i=0, j=0;
   char temp;
 
   push(&stackPtr, '(');
   len=strlen(infix);
   *(infix+len)=')';
   *(infix+len+1)='\0';
 
   while(stackPtr!=NULL)
      {
       if(isdigit(*(infix+i)))
         {
          *(postfix+j++)=*(infix+i++);
 
          while(isdigit(*(infix+i)))
             *(postfix+j++)=*(infix+i++);
 
          *(postfix+j++)=' ';
         }                                     
       else if(*(infix+i)=='(')
         {
          push(&stackPtr, '(');
          i++;
         }
       else if(isOperator(*(infix+i)))
         {
          while(isOperator(stackPtr->data) && precedence(stackPtr->data, *(infix+i))!=-1)
             {
              *(postfix+j++)=pop(&stackPtr);
              *(postfix+j++)=' ';
             }
 
          push(&stackPtr, *(infix+i++));
         }
       else if(*(infix+i)==')')
         {
          while(stackPtr->data!='(')
             {
              *(postfix+j++)=pop(&stackPtr);
              *(postfix+j++)=' ';
             }
 
          temp=pop(&stackPtr);
          i++;
         }
      }
 
   *(postfix+j)='\0';
}
 
int evaluatePostfixExpression(char *postfixString)
{
   NumberStackNodePtr stackPtr=NULL;
   int x=0, y=0;
   int i=0;
   char *resPtr;
 
   while(*(postfixString+i)!='\0')
      {
       if(*(postfixString+i)==' ')
         {
          i++;
          continue;
         }
 
       if(isdigit(*(postfixString+i)))
         {
          pushInt(&stackPtr, strtol(postfixString, &resPtr, 0));
 
          if(resPtr[0]==' ')
             postfixString=&resPtr[1];
         else
             postfixString=resPtr;
         }
       else
         {
          y=popInt(&stackPtr);
          x=popInt(&stackPtr);
          printf("x=%d %c y=%d =%d\n", x, *(postfixString+i),y, calculate(x, y, *(postfixString+i)));
          pushInt(&stackPtr, calculate(x, y, *(postfixString+i)));
          postfixString+=2;
         }
      }
 
   return popInt(&stackPtr);
}
 
int calculate(int x, int y, char opr)
{
   int rez=0;
 
   switch(opr)
      {
       case '+':
          rez=x+y;
          break;
       case '-':
          rez=x-y;
          break;
       case '*':
          rez=x*y;
          break;
       case '/':
          if(y==0)
          rez=0;
          else
          rez=x/y;
          break;
       case '^':
          rez=pow(y, x);
          break;
       case '%':
          rez=x%y;
       default:
          break;
      }
 
   return rez;
}
 
Текущее время: 00:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru