题目要求我们处理一组口算题目,每道题目可能包括加法、减法或乘法操作。每道题的输入由两个或三个数据组成,若有三个数据,第一个表示运算符(a
表示加法,b
表示减法,c
表示乘法),接下来的两个数据为参与运算的数值;若只有两个数据,则表示继承上一道题的运算符。
我们需要输出每道题的完整算式,并且输出算式的总长度。以下是题目的完整描述:
4
a 64 46
275 125
c 11 99
b 46 64
64+46=110
9
275+125=400
11
11*99=1089
10
46-64=-18
9
我的实现方法着眼于输入的处理与字符串的拼接,基本流程如下:
i
,然后循环处理每一道算式。每道算式可以是完整的带有运算符的输入,也可以是继承上题的运算符。a
, b
, 或 c
来决定进行加法、减法或乘法操作。+=
)来构造完整的算式表达式,并计算结果。#include <iostream>
#include <string>
using namespace std;
int main()
{
int i;
cin >> i;
int a, b;
string temp, ysf;
while(i--)
{
string s;
cin >> temp;
if(temp == "a" || temp == "b" || temp == "c")
{
cin >> a >> b;
if(temp == "a")
{
s += to_string(a);
s += '+';
s += to_string(b);
s += '=';
s += to_string(a + b);
}
else if(temp == "b")
{
s += to_string(a);
s += '-';
s += to_string(b);
s += '=';
s += to_string(a - b);
}
else if(temp == "c")
{
s += to_string(a);
s += '*';
s += to_string(b);
s += '=';
s += to_string(a * b);
}
ysf = temp;
}
else
{
a = stoi(temp);
cin >> b;
if(ysf == "a")
{
s += to_string(a);
s += '+';
s += to_string(b);
s += '=';
s += to_string(a + b);
}
else if(ysf == "b")
{
s += to_string(a);
s += '-';
s += to_string(b);
s += '=';
s += to_string(a - b);
}
else
{
s += to_string(a);
s += '*';
s += to_string(b);
s += '=';
s += to_string(a * b);
}
}
cout << s << endl;
cout << s.size() << endl;
}
return 0;
}
老师的做法与我的实现思路相似,但有一些不同之处。老师的代码在结构上稍显复杂,特别是在输入和字符串拼接部分的处理上,且做了更多的优化来处理继承运算符的情况。
int main()
{
int n = 0;
cin >> n;
string op;
string num1;
string num2;
string last;
int ret = 0;
while (n--)
{
string ans;
cin >> op;
if (op == "a" || op == "b" || op == "c")
{
cin >> num1 >> num2;
int n1 = stoi(num1);
int n2 = stoi(num2);
ans += num1;
if (op == "a")
{
ret = n1 + n2;
ans += "+";
}
else if (op == "b")
{
ret = n1 - n2;
ans += "-";
}
else
{
ret = n1 * n2;
ans += "*";
}
last = op;
}
else
{
num1 = op;
cin >> num2;
int n1 = stoi(num1);
int n2 = stoi(num2);
ans += num1;
if (last == "a")
{
ret = n1 + n2;
ans += "+";
}
else if (last == "b")
{
ret = n1 - n2;
ans += "-";
}
else
{
ret = n1 * n2;
ans += "*";
}
}
ans += (num2 + "=" + to_string(ret));
cout << ans << endl;
cout << ans.size() << endl;
}
return 0;
}
last_op
来记住上一题的运算符,保证后续算式的正确计算。last
变量)。另外,老师在每次处理完一个算式后,拼接完成的字符串才会输出。+
、-
、*
等运算符拼接进 ans
字符串。stoi
将字符串转换为整数)。last_op
来判断是否使用上一题的运算符。last
变量来确保后续运算使用的是正确的运算符。+=
拼接字符串,但如果问题较为复杂或涉及到更多操作,可能会导致拼接效率不高。可以考虑使用 ostringstream
来拼接字符串,这样可以提高性能。本次学习和讨论了如何用 C++ 语言处理简单的口算算式,通过两种不同的实现方法(我的做法与老师的做法),我们掌握了如何判断运算符、处理继承运算符的情况,并输出结果与算式的总长度。通过对比分析,我们看到了两种做法的异同与各自的优缺点。
在优化方面,我们提出了改进的思路,如何提高代码性能、增强可扩展性,以及如何处理更多复杂的运算符类型。总体来说,这道题目的解决方案为我们提供了一个很好的编程练习机会,帮助我们更好地理解字符串操作、控制流程和输入输出的细节。
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i = 0;
cin >> i;
int opera = 0;
string s;
while(i--)
{
int index = 0, a = 0, b = 0;
while(cin >> s)
{
index++;
if(index == 1)
{
if(s[i] == 'a')
opera = 1;
else if(s[i] == 'b')
opera = 2;
else if(s[i] == 'c')
opera = 3;
else
a = stoi(string(1, s[i])); // 将字符 s[i] 转换为字符串后再使用 stoi
}
if(index == 2 && a != 0)
b = stoi(string(1, s[i]));
else if(index == 2 && a == 0)
a = stoi(string(1, s[i]));
if(index == 3)
b = stoi(string(1, s[i]));
}
if(opera == 1)
cout << a << "+" << b << "=" << (a + b) << endl;
else if(opera == 2)
cout << a << "-" << b << "=" << (a - b) << endl;
else
cout << a << "*" << b << "=" << (a * b) << endl;
}
return 0;
}
还有,要注意变量的作用域
学习C++的建议
C++ 是一门强大且广泛应用的编程语言,无论是系统开发、游戏开发还是高性能计算,它都有不可替代的地位。然而,学习C++的道路可能是陡峭的,为了帮助你更高效地掌握这门语言,我总结了一些学习建议和经验。
1. 理解C++的基础 学习重点:
cin
和 cout
的用法。std::setw
和 std::fixed
。建议:用大量小程序练习这些基础语法,比如写一个计算器、模拟猜数字游戏等。
2. 深入学习C++的特性 学习重点:
new
和 delete
)。std::unique_ptr
和 std::shared_ptr
)。vector
、map
、set
)和算法(如sort
、find
)。try-catch
块处理异常。建议:尝试开发一个小型项目,比如一个学生管理系统,综合应用类、STL、指针和动态内存分配。
3. 掌握进阶内容 学习重点:
std::thread
)。std::mutex
)和条件变量(std::condition_variable
)。char[]
)和C++字符串(std::string
)的转换。建议:在这一阶段,可以挑战更复杂的项目,比如开发一个小型的HTTP服务器,学习网络编程并结合多线程。
4. 学习资源与实践方法 学习资源:
实践方法:
5. 保持耐心与兴趣 学习C++可能会面临以下困难:
如何应对:
小结 学习C++需要一个循序渐进的过程,从基础语法到面向对象编程,再到进阶的模板和并发编程,每一步都需要耐心和实践。通过充分利用学习资源、进行大量编码练习,以及挑战实际项目,你一定可以成为C++的高手。记住,学习的核心在于理解,而非死记硬背。
祝你学有所成,享受C++编程的乐趣!