cuốn sách gpt4 ai đã làm

Bài toán về máy tính ký hiệu hậu tố (RPN) C++

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 14:00:57 25 4
mua khóa gpt4 Nike

Tôi ghét phải quay lại để được giúp đỡ sau khi nhận được trợ giúp về cùng một chương trình cách đây vài ngày, nhưng tôi thực sự gặp khó khăn khi hoàn thành chương trình này. Nói tóm lại, tôi cần tạo một máy tính ký hiệu hậu tố (RPN) với ngăn xếp danh sách liên kết, cho phép tôi thực hiện các biểu thức như 5 5 5++ (=15). Bây giờ tôi đã hoàn thành thành công phần tính toán chính nhưng tôi đang gặp phải hai lỗi. Một trong số đó là "quá nhiều toán tử" và cái còn lại là "quá nhiều toán hạng". Hiện đang làm việc cho "Too Many Operators" và tôi cảm thấy mình đã đến gần nhưng chưa hoàn toàn ở đó.

Nếu người dùng nhập 5 5++ lần đầu tiên, nó sẽ bắt và báo "Quá nhiều toán hạng". Tuy nhiên, nếu đã có nội dung nào đó trong ngăn xếp được tính toán trước đó và sau đó họ nhập cùng một biểu thức 5 5++, điều đó không có nghĩa là ngăn xếp trống mà câu trả lời được xuất ra bằng cách sử dụng số trước đó. Nếu bất cứ ai có thể thấy tôi sai ở đâu và chỉ cho tôi hướng tìm lỗi khác "quá nhiều toán tử" (ví dụ: 5 5 5 +) thì điều đó sẽ được đánh giá rất cao. Cảm ơn một lần nữa.

(Sau khi loay hoay với nó, có vẻ như tôi càng thực hiện nhiều phép tính thì tôi thực sự càng cần phải đưa vào nhiều toán tử hơn để nó được coi là rỗng. Tôi đoán là tôi cần phải popVal ở đâu đó trước mỗi biểu thức nhưng không chắc chắn nên đặt ở đâu đặt nó vì tôi đã thử nhiều nơi nhưng không được)

#include
#include
#include
#include

using namespace std;

lớpSLLLNode
{
dữ liệu kép;
SLLNode *trên cùng;
SLLNode *ptr;
public:
SLLNode()
{
đầu = KHÔNG;
ptr = KHÔNG;
}

bool isEmpty()
{
trở về đầu == 0;
}

void pushVal(val đôi)
{
SLLNode *next = SLLNode mới;
tiếp theo -> dữ liệu = val;
tiếp theo -> ptr = trên cùng;
đầu = tiếp theo;
}

nhân đôi popVal()
{
nếu (isEmpty())
{
cout << "Lỗi: Quá nhiều toán tử" << endl;
}
khác
{
SLLNode *next = top -> ptr;
ret kép = top -> dữ liệu;
xóa hàng đầu;
đầu = tiếp theo;
return ret;
}

}

in vô hiệu()
{
cout << top -> dữ liệu << endl;
}
};


bool isOperator(chuỗi const & đầu vào)
{
chuỗi ops[] = {"+", "-", "*", "/"};
for(int i = 0; i < 4; i++)
{
if(input == ops[i])
{
trả về đúng sự thật;
}
}
trả về sai;
}


void performanceOp(const string& input, SLLNode& stack)
{
fVal kép, sVal;
int errorCheck = 0;

sVal = stack.popVal();
fVal = stack.popVal();

nếu(đầu vào == "+")
{
stack.pushVal(fVal + sVal);
}
khác nếu (đầu vào == "-")
{
stack.pushVal(fVal - sVal);
}
khác nếu (đầu vào == "*")
{
stack.pushVal(fVal * sVal);
}
khác nếu(đầu vào == "/" && sVal != 0)
{
stack.pushVal(fVal / sVal);
}


if(input == "/" && sVal == 0)
{
cout << "Lỗi: Chia cho 0" << endl;
errorCheck = 1;
}

if(errorCheck == 0)
{
stack.print();
}
}

int main()
{
cout << ":::::::::::::::::RPN TÍNH::::::::::::::::::" << endl;
cout << "::LOẠI VÀO BIỂU TƯỢNG POSTFIX HOẶC 'q' ĐỂ THOÁT::" << endl;
cout << "::::::::::::::::::::::::::::::::::::::::::::: ::::: :" << endl << endl;

đầu vào chuỗi;
Ngăn xếp SLLNode;
trong khi (đúng)
{
cin >> đầu vào;
số đôi;

if(istringstream(input) >> num)
{
stack.pushVal(num);
}
khác nếu (isOperator(input))
{
performanceOp(đầu vào, ngăn xếp);
}
khác nếu (đầu vào == "q")
{
return 0;
}
}
}

câu trả lời hay nhất

Ý tưởng cơ bản là:

  1. Đọc một dòng ( std::getline );
  2. Xử lý dòng này ( std::stringstream );
  3. đưa ra câu trả lời hoặc bất kỳ lỗi nào;
  4. Làm sạch ngăn xếp (hoặc hủy ngăn xếp và tạo ngăn xếp mới ở bước 2);
  5. Tới 1 và lặp lại.

Những gì bạn đang thiếu là bước đầu tiên. Nếu bạn lấy mọi thứ trực tiếp từ stdin, bạn sẽ coi ký tự dòng mới là một khoảng trắng đơn giản.

Về câu hỏi c++ - Máy tính ký hiệu Postfix (RPN) C++, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/19308298/

25 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress