如何将分数输入到函数内的数组中,使用 -1 中断其输入循环,并使用该数组查找分数=100?

问题描述 投票:0回答:2

**这就是我现在的功能:**

#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;
}
c++ arrays function nested-loops dev-c++
2个回答
3
投票

您的

getScores
功能因多种原因而损坏:

  1. 它不返回值。如果您从函数中获得“正确”值,那纯粹是偶然,因为行为实际上是未定义的。

  2. 您的函数假设数组包含一些确定性值。它做的第一件事是检查

    array[index] != -1
    但实际上该值是未定义的,因为数组未初始化。

  3. 内部循环最多读取 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 个值
  1. 格式化输入失败
  2. 输入为-1
  3. 为了进一步改进你的函数,你不应该假设任何关于数组大小的事情。一种常见的方法是将其提供给函数,这意味着添加另一个参数:

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";
}



-2
投票

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 }

最后一点,在您学习的过程中,我建议您在每一行代码中添加注释来描述它正在做什么,这样当您稍后查看它时,您可以验证代码是否确实按照您的意图进行操作,并且对于您来说更容易同行们查一下就知道每一行的用意了。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.