【问题标题】:Returning Array from C++ Function从 C++ 函数返回数组
【发布时间】:2013-11-10 02:00:49
【问题描述】:

我正在自学 C++ 并从教科书中解决问题。到目前为止,我已经介绍了数据类型、声明、显示、赋值、交互式输入、选择(if-else)和重复(for/while 循环...)、函数和数组等基础知识。我没有对指针做过任何事情,但我知道它们是什么......

我遇到了这个问题:

真假测试的答案如下: T T F F T. 给定一个二维答案数组,其中每一行对应于一个测试提供的答案,编写一个接受二维数组的函数并测试数作为参数,并返回一个包含每个测试成绩的一维数组。 (每个问题 5 分,因此最高可能分数为 25。)使用以下数据测试您的功能:

我的理解是 C++ 函数不能返回数组——至少这是我在这个论坛的其他帖子上读到的。它是否正确?如果是这样,他们如何期望你解决这个问题,因为我还没有涉及指针。我认为可能的唯一另一种方法是通过引用传入数组....但问题干只说函数有2个参数,所以我认为可能排除了该方法。该方法需要第三个参数,它是您修改的数组,因此它会隐式返回。

我有一些代码,但它不正确(只有我的 calcgrade 函数需要工作),我不确定如何继续前进。有人可以建议吗?谢谢!!

#include<iostream>

// Globals
const int NROW = 6, NCOL = 5;
bool answers[NCOL] = {1, 1, 0, 0, 1};
bool tests[][NCOL] = {1, 0, 1, 1, 1,
                      1, 1, 1, 1, 1,
                      1, 1, 0, 0, 1,
                      0, 1, 0, 0, 0,
                      0, 0, 0, 0, 0,
                      1, 1, 0, 1, 0};
int grade[NROW] = {0};

// Function Proto-Types
void display1(bool []);
void display2(bool [][NCOL]);
int calcgrade(bool [][NCOL], int NROW);


int main()
{


    calcgrade(tests, NROW);
    display2(tests);

    return 0;
}

// Prints a 1D array
void display1(bool answers[])
{
    // Display array of NCOL
    for(int i = 0; i < NCOL; i++)
        std::cout << std::boolalpha << answers[i] << std::endl;
    return;
}

// Print 2d Array
void display2(bool answers[][NCOL])
{
    // Display matrix:  6x5
    for(int i = 0; i < NROW; i++)
    {
        for(int j= 0; j < NCOL; j++)
        {
            std::cout << std::boolalpha << answers[i][j] << std::endl;
        }
        std::cout << std::endl;
    }

    return;
}

int calcgrade(bool tests[][NCOL], int NROW)
{

    for(int i = 0; i < NROW; i++)
    {
        for(int j = 0; j < NROW; j++)
        {
            if(tests[i][j]==answers[j])
                grade[i] += 5;
        }
        printf("grade[%i] = %i", i, grade[i]);
    }

    return grade;
}

【问题讨论】:

  • 正确答案是返回一个vector。如果你的教科书教你的是数组而不是vectors,那作者就不应该再写了。
  • 我的书甚至没有谈论矢量.... :(
  • 如果您有一本 C++ 书籍,其中没有涵盖 C++ 标准库的章节,并且在 std::vector&lt;&gt; 的情况下,可以说是所有现代 C++ 程序中该库中最常用的类型,您需要另一本书(并且该作者需要不同的职业)。
  • 不,您不能返回数组。是的,他们希望你想出可怕的黑客。不,你不应该学习它们。

标签: c++ arrays function


【解决方案1】:

尝试使用std::vector

向量是表示可以改变大小的数组的序列容器。

你可以这样做:

vector<bool> function()
{
  vector<bool> vec;

  vec.push_back(true);
  vec.push_back(false);
  vec.push_back(true);

  return vec;
}

【讨论】:

    【解决方案2】:

    如果您将测试次数作为第二个参数传递,则意味着您实际上知道测试次数,因此您无需使用vector。您可以返回一个动态分配的数组(使用newmalloc)。

    代码如下所示:

    int* calcgrade(bool tests[][NCOL], int NROW){
      int* array = new int[NROW];
      for(int i=0;i<NROW;i++)
        array[i] = calculatedGrade;
      return array;
    }
    

    【讨论】:

      【解决方案3】:

      你可以:

      • 如您所说,返回指向动态分配数组的指针,
      • 您可以使用包含静态数组的单词 struct 创建结构类型,在 C++ Reference 上阅读更多内容并返回/作为您类型的参数结构。

      【讨论】:

      • 谢谢。我想知道您提到的方法是否有任何替代方法,因为我尚未涵盖任何这些主题。我只是想看看我到目前为止所读到的内容是否遗漏了什么......
      【解决方案4】:

      另一种方法是在主函数中创建 Answer 数组,然后将其与 T/F 数组一起传递给评分函数。然后,您的评分函数可以对 Answer 数组进行操作,甚至不需要返回任何内容。

      本质上,当您在函数中传递数组时,您实际上是在传递指向数组的指针,因此您可以对它们进行操作,就好像它们是通过引用传递(它们是)一样。

      半伪代码前:

      void getGrades( const int answerVector, int gradeVector ) {
          // code that computes grades and stores them in gradeVector
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 2015-02-09
        • 2021-03-29
        • 2012-06-17
        • 2023-04-08
        • 2014-09-16
        相关资源
        最近更新 更多