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))
Gió viết 19:14 ngày 30/09/2018

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àm tinhtoan nên có thể không đúng kq. đơn giản bạn có thể thêm vào như sau

float tinhtoan(string pos)
{
	char ch = '\0';
	stack a;
	int dem1 = 0;
	float data[100000];
	
        ///////// them đoạn này
        char infix[10000];
        char postfix[10000];
        strcpy(infix,pos.c_str());
        conver(infix,postfix);
        pos=postfix;
        /////////////////////////
        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];
}

Stack around the variable ‘data’ was corrupted

Lỗ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 xem

Trịnh Minh Cường viết 19:22 ngày 30/09/2018

Cả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.

Bài liên quan
0