30/09/2018, 17:12
[Giúp đỡ] Ký pháp Balan đảo (Trung tố -> hậu tố)
#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] = ' ';
}
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 = ' ';
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] = ' ';
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))
Bài liên quan
Mình nghĩ bạn nên bình tĩnh lại. Bạn chưa sử dụng hàm
conver
trong hàmtinhtoan
nên có thể không đúng kq. đơn giản bạn có thể thêm vào như sauLỗi này có thể là do
float data[100000];
có kích thước lớn. bạn giảm kích thước lại xemCảm ơn anh để em thử ạ, cái bài này là quyết định sống còn của em nên thấy gần deadline, nên hơi bị hoảng.