是否有办法使这段代码更短,我刚开始学习c++


#include <iostream>
using namespace std;
int main()
{
double mark1, mark2, mark3, mark4, mark5, mark6, mark7, mark8, mark9, mark10, average;
cout << "Input mark for learner 1";
cin >> mark1;
cout << "Input mark for learner 2";
cin >> mark2;
cout << "Input mark for learner 3";
cin >> mark3;
cout << "Input mark for learner 4";
cin >> mark4;
cout << "Input mark for learner 5";
cin >> mark5;
cout << "Input mark for learner 6";
cin >> mark6;
cout << "Input mark for learner 7";
cin >> mark7;
cout << "Input mark for learner 8";
cin >> mark8;
cout << "Input mark for learner 9";
cin >> mark9;
cout << "Input mark for learner 10";
cin >> mark10;
average = (mark1 + mark2 + mark3 + mark4 + mark5 + mark6 + mark7 + mark8 + mark9 + mark10) / 10;
cout << "The class average mark is:" << average << endl;
return 0;
}

使用数组并遍历其元素,您可以使用:

const int count = 10;
double mark[count];
double sum = 0;
for (int i = 0; i < count; i++)
{
cout << "Input mark for learner " << (i+1) << ": ";
cin >> mark[i];
sum += mark[i];
}
double average = sum / count;

如果你不需要单独的mark,你可以在循环中使用一个本地的mark

const int count = 10;
double sum = 0;
for (int i = 0; i < count; i++)
{
double mark;
cout << "Input mark for learner " << (i+1) << ": ";
cin >> mark;
sum += mark;
}
double average = sum / count;

您可以使用多个标准库函数,从而有机会同时学习它们。

#include <algorithm>
#include <array>
#include <iostream>
#include <numeric>
int main() {
std::array<double,10> mark; // use std::vector if the number of entries is variable
std::for_each(begin(mark), end(mark), [i = 0](auto& m) mutable {
std::cout << "Input mark for learner " << ++i << "n";
std::cin >> m;
});
std::cout << std::reduce(begin(mark), end(mark)) << "n";
}

这里是文档供您阅读:

  • std:: for_each
  • std::减少
  • λ

避免使用using namespace std;

欢迎来到社区!首先,对代码使用缩进是个好主意,这样其他人也能读懂。如果你只想计算平均值,那么你可以用下面的代码来做。我已经尽量让你觉得简单了。

编辑:添加了新的功能来获取最大输入值。

#include <iostream>
using namespace std;
int main()
{
int numberOfMarks = 10;
double temp, maxValue = -1, average = 0;
for (int i = 0; i < numberOfMarks; ++i)
{
cout << "Input mark for learner " << i + 1 << ": ";
cin >> temp;
average = average + temp; // Same as average += temp
// Store the maximum value
if (maxValue < temp)
{
maxValue = temp;
}
}
average = average / numberOfMarks;
cout << endl << "The class average mark is: " << average << endl;
cout << "The maximum value is: " << maxValue << endl;
return 0;
}

欢迎来到c++的世界,有些东西已经在其他评论中提到了,但我将尝试总结和解释。好吧,让我们从c++开始,我们建议避免使用C风格数组,因为c++提供了更好的解决方案,std::vector是STL的一部分,STL是c++的核心和重要部分。

我还想建议,在一般情况下,当你写软件的时候,尽量避免硬编码的限制是很重要的,例如,你为每个学生声明一个变量,但更通用的是,你可以在运行时声明有多少学生将是。如果你想扩展你的项目该怎么办?假设您还想打印输入的所有标记?这样就很容易遍历std::vector中的数据了!(这比在动态循环时将总和存储在变量中更可取)

另一件事是尽量使你的程序稳定,例如,如果用户不小心写了12w而不是127,你可以使用异常来检查你的输入。(使用std::stod检查输入的正确性)

也很好地知道没有必要重新发明轮子,因为c++有非常多的算法,适合许多任务。例如,std::accumulate可以将vector对象中从begin()到end()的所有值相加。(都是迭代器)。

代码中的一些东西很可能对你来说不熟悉,但不要害怕。因为你可以一个接一个地覆盖它们,注释你想要启用禁用的部分,并了解它们是如何工作的,你也可以尝试改进我给出的例子。

和最后是支付你有什么编译器,因为例如std::reduce在c++ 17中可用,不能在旧的c++版本中编译。

下面是用更稳定和通用的

重写的程序
#include <iostream>
#include <vector>
#include <numeric>
int main()
{
size_t numberOfStudents;
std::cout << "How many learners there is in Class : ";
std::cin >> numberOfStudents;

std::vector<double> grades;
grades.reserve(numberOfStudents); // read about reserve when you learn how vector work.

for(size_t studentIndex = 0; studentIndex < numberOfStudents; ++studentIndex)
{
double mark;
std::string input;
std::cout << "Input mark for learner [" << studentIndex << "] : ";
std::cin >> input;
try
{
mark = std::stod(input); // std::stod will throw exception if the input is wrong.
}
catch(const std::invalid_argument& ex)
{
std::cout << "Error: input is Incorrect=[" << input << "]." << std::endl;
return -1;
}
grades.push_back(mark);
}

// when possible is it good practice to use const
const double totalSum = std::accumulate(grades.begin(), grades.end(),0.0);
std::cout << "Average: " << totalSum / numberOfStudents << std::endl;
return 0;
}

总结一下。

  1. 避免使用std::命名空间,实际使用std::
  2. 首选使用std::vector<>
  3. 使用exception和or检查输入的值是否不正确,数组边界,除零等
  4. 使用STL并学习如何在需要编写循环时使用STL算法。(在这种情况下,而不是编写循环,将在std::vector中总结双精度值)。
  5. 考虑编写通用、易读和可扩展的软件。

希望这对你有帮助!祝你好运!

相同的实现,但使用动态数组<;)

int main(){
//this is our 10 mark variables
int* arr = new int[10]
int avr = 0;
for (int i = 0; i < 10; ++i)
{
cout << "Input mark for learner " << i + 1 << ": ";
cin >> arr[i];
avr += arr[i];
}
cout << "The class average mark is:" << avr/10<< endl;
delete[] arr;
}

最新更新