**这就是我现在的功能:**
#include <iostream>
using namespace std;
int getScores(int array[])
{
cout << "Enter up to 10 scores, separated by pressing [space]\n"
<< "or [enter]. Enter -1 or a non-integer character to quit.\n";
int num = 0;
while(num < 10 && cin >> array[num] && array[num] != -1)
{
num++;
}
return num;
}
int countPerfect(int array[], int numScores)
{
int perfect = 0;
for(int count = 0; count < numScores; count++)
{
if(array[count]==100)
perfect++;
}
return perfect;
}
我要继续搞乱它,但现在就这样了。
我正在用 DevC++ 编写一个程序,它使用两个函数
getScores
和 countPerfect
,允许用户将最多 10 个分数输入到数组中。它还为用户提供了通过输入 -1(在 getScores
函数中)提前结束输入的选项。当我运行该程序并尝试使用 -1 结束它时,它不起作用。它接受 -1 作为输入并继续循环。
不仅如此,我很确定我也错误地执行了
countPerfect
功能。如果我成功退出循环,尽管是错误的(使用我尝试过的 getScores
迭代之一),它会说“您输入的 -1
分数包括 0
完美分数”,无论我的其他分数如何进入数组。
怎样才能让这个程序正常运行?
// Function prototypes
int getScores(int[]);
int countPerfect(int[],int);
int main()
{
const int size = 10;
int array[size];
int numScores;
// Explain program to user
cout << "This program will allow you to enter up to 10 scores. " << endl
<< "Then, it will report how many perfect scores were entered." << endl;
// Call a function to input the scores into array
numScores = getScores(array);
// Report results
cout << "The " << numScores << " scores you entered include "
<< countPerfect(array, numScores) << " perfect scores.\n";
return 0;
}
// Functions
// getScores will retrieve up to 10 scores from user
int getScores(int array[])
{
int index = 0;
while(array[index] != -1)
{
for(int index = 0; index < 10; index++)
{
cout << "Enter a score from 0-100 (-1 to quit): ";
cin >> array[index];
}
}
}
// countPerfect accepts array, then counts and returns the number of perfect scores
// (equal to 100)
int countPerfect(int array[], int numScores)
{
int perfect = 0;
for(int index = 0; index < numScores; index++)
{
if(index==100)
perfect++;
perfect = array[index];
}
return perfect;
}
您的
getScores
功能因多种原因而损坏:
它不返回值。如果您从函数中获得“正确”值,那纯粹是偶然,因为行为实际上是未定义的。
您的函数假设数组包含一些确定性值。它做的第一件事是检查
array[index] != -1
但实际上该值是未定义的,因为数组未初始化。
内部循环最多读取 10 个值,然后循环返回测试
array[index] != -1
。但你从未修改过index
——内部循环隐藏了它并使用了它自己的。如果你“修复”了这个问题,那么你将在索引 10 处进行测试,该索引正在读取数组的末尾。因此,如果您将来进行更改,您要么会出现无限循环,要么会出现潜在的未定义行为。
此外,该函数在输入失败的情况下表现不佳。如果用户输入的内容不是数字,或者流由于某种其他原因而关闭(例如从管道输入),则可能会发生这种情况。检查流是否仍然有效是个好主意。
根据您的编译器实现的 C++ 标准版本,读取值失败将会给您一个零(新行为),或者不写入任何内容(旧行为)。这两个都会有问题。
请注意,您可以通过在编译器中启用警告来捕获#1。然后它会警告类似“并非所有控制路径都返回值”之类的内容。在 GCC 中,使用 -Wall
启用所有警告。最好还使用
-Werror
将所有警告视为错误,这样您就无法忽略它们。要解决所有这些问题只需要一个循环:
int getScores(int array[])
{
int count = 0;
while(count < 10 && cin >> array[count] && array[count] != -1)
{
count++;
}
return count;
}
在这里,它将循环直到发生以下情况之一(按顺序测试):
您已读入 10 个值
int getScores(int array[], int max_count)
{
int count = 0;
while(count < max_count && cin >> array[count] && array[count] != -1)
{
count++;
}
return count;
}
由于您使用的是 C++,因此您应该真正考虑使用
std::array
或
std::vector
而不是 C 数组。例如,您可以完全取消 10 个值的限制,并让用户输入任意数量的分数:#include <algorithm>
#include <iostream>
#include <vector>
std::vector<int> getScores(std::istream& s)
{
std::vector<int> scores;
int score;
while(s >> score && score != -1)
{
scores.push_back(score);
}
return scores;
}
int countPerfect(const std::vector<int>& scores)
{
return std::count(scores.begin(), scores.end(), 100);
}
int main()
{
auto scores = getScores(std::cin);
int perfect = countPerfect(scores);
std::cout << "Perfect scores: " << perfect << "\n";
}
1.- for 循环将从 0 一直执行到数组大小 10,然后再返回到 while 循环 2.- 索引变量将始终为数组的大小。
这是您想要实现的目标的更接近的版本:
// Functions
// getScores will retrieve up to 10 scores from user
const int size = 10;
int getScores(int array[])
{
int index = 0; //set index to first array element
do
{
cout << "Enter a score from 0-100 (-1 to quit): ";
cin >> array[index];
index ++;
}while(array[index - 1] != -1 && index < size ) //compare the value of last input (thus the -1) while the index is lower than the size of the array (thus the && condition)
}
对于 getScores 函数,假设“数组”包含分数,“numScores”是数组中有效分数的数量:
// countPerfect accepts array, then counts and returns the number of perfect scores
// (equal to 100)
int countPerfect(int array[], int numScores)
{
int perfect = 0; //set the number of perfect scores found to 0
for(int index = 0; index < numScores; index++) //for each valid score in the array
{
if(array[index] == 100) //if the score is 100
perfect++; //increment the number of perfect scores found
}
return perfect; //return the number of perfec scores found
}
最后一点,在您学习的过程中,我建议您在每一行代码中添加注释来描述它正在做什么,这样当您稍后查看它时,您可以验证代码是否确实按照您的意图进行操作,并且对于您来说更容易同行们查一下就知道每一行的用意了。
希望有帮助。