Tôi có nhiệm vụ này:
Viết một chương trình máy tính thậm chí còn tốt hơn calc3.cpp có thể hiểu được các số bình phương. Chúng ta sẽ sử dụng ký hiệu đơn giản X^ để biểu thị X2. Ví dụ: 10^ + 7 - 51^ có nghĩa là 10^2 + 7 − 51^2. .
Giả sử bạn có một tệp tin Formula.txt có công thức tính tổng sau:
5^; = 25 1000 + 6^ - 5^ + 1 = 1012;
Lúc đầu, tôi sử dụng các câu lệnh switch/case, nó không hoạt động chính xác và quá khó để tôi hiểu. Bây giờ tôi đang sử dụng các câu lệnh if. Tôi không chắc có gì sai với các câu lệnh if của mình, tôi nghĩ còn nhiều điều nữa. cần thêm vào từng câu lệnh if bên trong câu lệnh + và -, nhưng tôi không biết là gì.
Cảm ơn bạn rất nhiều!
cin >> tổng;
tổng == đúngNum;
trong khi (cin >> op) {
nếu(op == '^') {
tổng += rightNum * rightNum;
cin >> op;
}
nếu(op == '+') {
cin >> rightNum;
cin >> op;
nếu(op == '^') {
tổng += rightNum * rightNum;
}
khác {
tổng += đúngNum;
}
}
nếu(op == '-') {
cin >> rightNum;
cin >> op;
nếu(op == '^') {
tổng -= rightNum * rightNum;
}
khác {
tổng -= rightNum;
}
}
if(op == ';') {
cout << tổng << endl;
cin >> tổng;
}
}
Vì bạn đã tích hợp việc thu thập và thực hiện thao tác tiếp theo vào mã xử lý thao tác trước đó nên bạn đã xây dựng một chương trình không mở rộng quy mô một cách hiệu quả. Thay vào đó, hãy lặp qua các toán tử và lấy toán hạng chính xác, sau đó, nếu có thể bỏ qua mức độ ưu tiên của toán tử, hãy thực hiện thao tác trên kết quả và toán hạng trước đó. Nếu bạn phải xem xét mức độ ưu tiên của toán tử, hãy bỏ qua câu trả lời này và bắt đầu xem xét các hàng đợi và cây ưu tiên.
hơi giống
cin >> result; // lấy toán hạng đầu tiên. Nếu không có toán tử thì đây là câu trả lời.
while (true) // lặp mãi mãi!
{
cin >> op;
nếu (op == ';')
{
in kết quả và thoát khỏi vòng lặp.
}
cin >> toán hạng;
chuyển đổi (op)
{
trường hợp '+':
kết quả += toán hạng;
phá vỡ;
trường hợp '-':
kết quả -= toán hạng;
phá vỡ;
các hoạt động khác ở đây
}
}
Bây giờ chúng ta đã có một khung cơ bản có thể xử lý bất kỳ số lượng thao tác nào, chúng ta có thể xử lý ^. Tốt hơn hết là đừng nghĩ nó là một thao tác vì nó không được sử dụng như một thao tác. Nó giống như một công cụ sửa đổi hơn.
Nếu cú pháp trông giống như 10^2 thì bạn sẽ có một toán tử, nhưng 10^ sẽ không có toán hạng bên phải, điều này sẽ làm rối cấu trúc toán hạng bên trái, toán tử, toán hạng bên phải cho phần còn lại của mã.
Vậy chúng ta phải làm gì? Bất cứ khi nào bạn đọc một số từ người dùng, hãy nhìn vào ký tự tiếp theo. Nếu là ^ thì nhân số đọc được với chính nó.
Sẽ T
Thay thế bằng bất kỳ loại nào bạn muốn.
T số đọc()
{
giá trị T;
cin >> val;
nếu (cin.peek() == '^')
{ // đã tìm thấy ^
val *= val; // bình phương giá trị
cin.ignore() // xóa ^ để không ai khác vấp phải nó
}
trả lại giá trị;
}
Lưu ý rằng đoạn mã trên hoàn toàn bỏ qua việc xác thực đầu vào và sẽ xử lý sai đầu vào xấu một cách hài hước. Người dùng nổi tiếng là những người đánh máy ngu ngốc và tệ hại. Đừng tin tưởng người dùng sẽ cung cấp thông tin đầu vào tốt cho chương trình. Nói chung là không tin tưởng người dùng chút nào.
用 số đọc
thay thế cin >>
Chúng tôi nhận được một cái gì đó như
kết quả = số đọc();
trong khi (đúng)
{
cin >> op;
nếu (op == ';)
{
in kết quả và thoát khỏi vòng lặp.
}
toán hạng = số đọc();
chuyển đổi (op)
{
trường hợp '+':
kết quả += toán hạng;
phá vỡ;
trường hợp '-':
kết quả -= toán hạng;
phá vỡ;
các hoạt động khác ở đây
}
}
Lưu ý phụ: xem xét thêm cin
Thay thế bằng chung chung std::istream
, để có thể sử dụng các hàm này với bất kỳ loại luồng nào.
Khuyến nghị dựa trên đánh giá:
tính toán int(istream & in)
{
kết quả = số đọc(trong);
trong khi (đúng)
{
trong >> op;
nếu (op == ';)
{
phá vỡ;
}
toán hạng = số đọc(trong);
chuyển đổi (op)
{
trường hợp '+':
kết quả += toán hạng;
phá vỡ;
trường hợp '-':
kết quả -= toán hạng;
phá vỡ;
các hoạt động khác ở đây
}
}
trả về kết quả;
}
tính toán
Sau đó, nhập vòng lặp và lặp lại cuộc gọi cho đến khi sử dụng hết tất cả đầu vào.
Lời khuyên bổ sung: sử dụng std::getline
Nhận các câu lệnh được phân tách bằng dấu ";"
câu lệnh chuỗi;
while (getline(in, câu lệnh, ';'))
{
tính toán (chuỗi dòng (câu lệnh));
}
đường dây nhận
Xóa ';' để không thể dùng để thoát tính toán
loop in , nhưng điều này thực sự làm mọi việc dễ dàng hơn một chút: bạn có thể làm dòng chuỗi
Thoát khi trống hoặc ở trạng thái không thành công,
Tôi là một lập trình viên xuất sắc, rất giỏi!