Lỗi SIGABRT khi nộp trên SPOJ

Em có đề bài như sau:


code của em: https://ideone.com/UZBy47
code của em bị lỗi chỗ nào ạ?

Về logic thì đúng rồi. Mình chỉ viết thêm cho mấy bạn đọc dễ hiểu hơn:

  • st là vector chứa các toán tử (operator)
  • out là biểu thức S dưới dạng postfix.

Từ dòng 60 -> 94 là đoạn code chuyển từ biểu thức infix S thành postfix out: (bỏ bớt " của string cho gọn)

  • S = 6*3+2-(6-4/2), out = { 6, 3, *, 2, +, 6, 4, 2, /, -, - }
  • S = 100+99*22, out = { 100, 99, 22, *, + }
  • S = 6*((4*3)+5), out = { 6, 4, 3, *, 5, +, * }
  • S = 1-2, out = { 1, 2, - }

Từ dòng 91 -> 104 là đoạn code thực hiện tính toán trên biểu thức postfix out, tìm 1 cặp 3 phần tử liên tiếp trong out có dạng { number_1, number_2, operator }, rồi thu gọn thành { number_3 }, với number_3 = number_1 operator number_2:

  • out = { 6, 3, *, 2, +, 6, 4, 2, /, -, - }
    • cặp đầu tiên tìm thấy là { 6, 3, * }, 6 * 3 = 18
  • out = { 18, 2, +, 6, 4, 2, /, -, - }
    • cặp { 18, 2, + }, 18 + 2 = 20
  • out = { 20, 6, 4, 2, /, -, - }
    • cặp {4, 2, / }, 4 / 2 = 2
  • out = { 20, 6, 2, -, - }
    • cặp { 6, 2, - }, 6 - 2 = 4
  • out = { 20, 4, - }
  • out = { 16 }

Về lỗi của bạn, thực sự khó tìm ra lỗi thật, nhưng mình thấy 3 chỗ sau, không biết có giải quyết được không.

Lỗi thứ nhất, ở hàm lv(), bạn chỉ return cho 3 trường hợp, giả sử c không phải là +, -, *, /, ( thì nó sẽ return ra giá trị gì.

Lỗi thứ 2, ở hàm llToString(). Khai báo s[4] không bao quát được điều kiện “các số có giá trị không vượt quá 100”, vì nó chỉ là điều kiện cho các số trong biểu thức S ban đầu. Trong khi s[4] xử lí cho tất cả các giá trị trung gian trong quá trình tính toán, có thể lớn hơn 9999 hoặc nhỏ hơn -999. Do đó, đề có thể đưa ra test case: S = 1-100*100 là chương trình của bạn bị ngỏm :v

Lỗi thứ 3, ở hàm StringToll(), bạn chưa xử lý cho trường hợp s là số âm.

Ngoài 3 lỗi, thì mình có lời khuyên nữa là bạn nên tận dụng các hàm của std::string, như chuyển từ số sang string, string sang số, và tận dụng triệt để để tránh các lỗi về mảng char[].

4 Likes

Anh @hungaya nói đúng đó bạn.
Mình chỉ đưa ra một vài case lỗi cho bạn tiện debug thôi. :slight_smile:

Inp:

5
(1-2)*3
8/(2-4)
6-9+1
1-2+3

Out:

-87
0
-26
-26
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?