#include <iostream>
#include <stdlib.h>
#include <string>
#include <fstream>
using namespace std;
const int max = 200;
int ktuutien(char a)
{
if (a == '-')
return 0;
if (a == '+')
return 0;
if (a == '*')
return 1;
if (a == '/')
return 1;
}
bool kiemtraso(char a)
{
if ((int(a) >= '0' && int(a) <= '9') || a == '.')
return true;
return false;
}
bool kttoantu(char ch)
{
if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
return true;
return false;
}
class stack
{
char data[max];
int top;
public:
bool isempty()
{
return top == -1;
}
stack()
{
top = -1;
}
bool push(const char&a)
{
if (top == max)
return false;
top++;
data[top] = a;
return true;
}
bool pop(char&a)
{
if (top == -1)
return false;
a = data[top];
top--;
}
char get_top()const
{
return data[top];
}
void print()const
{
for (int i = 0; i <= top; i++)
cout << data[i] << " ";
}
};
bool toanhang(char a)
{
if (a >= 48 && a <= 57)
return true;
return false;
}
/*********************ham` chuyen tu 1 bieu thuc trung to--->hau to *************/
bool conver(char a[], char b[])
{
stack k;
int dem = 0;
for (int i = 0; i < strlen(a); i++)
{
if (kttoantu(a[i]) && kttoantu(a[i + 1])) ///kiem tra du lieu dau vao`
return false;
if ((a[i] >= 97 && a[i] <= 122) || (a[i] >= 65 && a[i] <= 90))
return false;
}
for (int i = 0; i < strlen(a); i++)
{
char ch = a[i];
if (kiemtraso(ch))
{
b[dem++] = ch;
if (kttoantu(a[i + 1]))
b[dem++] = ' '; //dau cach dung de Phan biet giua cac so co nhieu` chu so voi nhau
}
if (ch == '(')
k.push(ch);
if (kttoantu(ch))
{
if (!k.isempty())
{
if ((kttoantu(k.get_top())) && (ktuutien(ch) == ktuutien(k.get_top()) || ktuutien(ch) < ktuutien(k.get_top()))) // cau lenh nay` kiem tra do uu tien giua cac toan tu
{
char m;
k.pop(m);
b[dem++] = m;
k.push(ch);
}
else
{
k.push(ch);
}
}
else
k.push(ch);
}
if (ch == ')') // neu Phat hien dau ) thi ta pop cho toi khi gap dau '(" thi` dung`
{
char d;
while (1)
{
k.pop(d);
if (d == '(')
break;
b[dem++] = d;
}
}
}
// cau lenh nay dung de lay toan tu con lai trong stack..
while (!k.isempty())
{
char m;
char n;
k.pop(m);
b[dem++] = m;
}
b[dem] = '\0';
}
float doi(char a)
{
switch (a)
{
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case '0': return 0;
}
}
//// ham` bien doi chuoi sang dang so
float biendoi(char a[])
{
float d = 0;
int n = strlen(a);
if (strlen(a))
{
for (int i = 0; i < n; i++)
{
if (a[i] == '.')
{
int dem = 1;
float bd1 = 1, bd = 0;
for (int j = i + 1; j < n; j++)
{
for (int i = 0; i < dem; i++)
bd1 = bd1 * 10;
bd = bd + doi(a[j]) / bd1;
}
d = d + bd;
break;
}
else
d = d * 10 + doi(a[i]);
}
return d;
}
return 0;
}
float tinhtoan(string pos)
{
char ch = '\0';
stack a;
int dem1 = 0;
float data[100000];
int n = pos.length();
for (int i = 0; i < n;)
{
char b[100];
int dem = 0;
while (pos[i] != ' '&&i < n&&!kttoantu(pos[i]))
{
b[dem++] = pos[i++];
}
if (dem)
{
b[dem] = '\0';
data[dem1++] = biendoi(b);
}
if (kttoantu(pos[i]))
{
a.push(ch);
switch (pos[i])
{
case '+':
{
float temp = data[dem1 - 1] + data[dem1 - 2];
data[dem1 - 2] = temp;
dem1--;
}break;
case '-':
{
float temp = data[dem1 - 2] - data[dem1 - 1];
data[dem1 - 2] = temp;
dem1--;
}break;
case '*':
{
float temp = data[dem1 - 1] * data[dem1 - 2];
data[dem1 - 2] = temp;
dem1--;
}
break;
case '/':
{
float temp = data[dem1 - 2] / data[dem1 - 1];
data[dem1 - 2] = temp;
dem1--;
}break;
}
}
i++;
}
return data[0];
}
void main()
{
float result;
fstream FileIn;
string expression;
FileIn.open("input.txt", ios_base::in);
getline(FileIn, expression);
result = tinhtoan(expression);
cout << "Ket qua: " << result;
FileIn.close();
}
em đang làm một bài về ký pháp Balan và biểu thức thì lấy trong file input.txt
và khi chạy chương trình thì bị lỗi là Stack around the variable 'data' was corrupted
mọi người kiểm tra code dùm em và cho em hỏi là em đã sai chỗ nào ạ :’( tình hình là em đang gấp nên rối trí chẳng tìm được ra lỗi, nên nhờ mọi người kiểm tra tiếp em ạ, 8h là em phải nộp bài rồi. Em cảm ơn trước ạ.
Và File input.txt
của em là thế này:
(800-((29+(41*24)-(28/4))/2)-7))