C ++从单个函数返回多个

时间:2016-03-10 10:01:02

标签: c++ arrays algorithm

仍然是C ++的新手。 不得不在类中编写一个函数来计算多维数组中每个数字的数量。 现在我没想到你可以从一个被调用的函数中返回多个int值,然后在基于文本的答案中使用所有这些返回值,所以我尝试return取决于一个不同的值请求的值作为每个数字的参数。

以下代码不必要地长,我仍然收到以下错误。

main-1-3.cpp: In function 'int main()':
main-1-3.cpp:12:21: error: too few arguments to function 'int 
count_numbers(int(*)[4], int)'
count_numbers(array);
                 ^
main-1-3.cpp:7:12: note: declared here
extern int count_numbers(int array[4][4], int);

通过一些调试我可能会修复这些编译错误,但我觉得我的方法非常复杂,并且想知道是否可以将函数调用为:

count_number(array[4][4])

(不需要Q参数),然后让count_numbers返回所有十个数字值,然后将它们输出为<< ",3:" << three <<而不是<< ",8:" << count_numbers(array, 8) <<

无论如何,function.cpp和main.cpp如下所示。 如果有人能指出我正确的方向,那将非常感激。只需要知道正确的方法,这样我就可以压缩这段代码。

function.cpp

#include <iomanip>
#include <locale>
#include <sstream>
#include <string>
#include <iostream>

int count_numbers(int array[4][4], int Q)
{
    int X=0;
    int Y=0;
    int zero=0;
    int one=0;
    int two=0;
    int three=0;
    int four=0;
    int five=0;
    int six=0;
    int seven=0;
    int eight=0;
    int nine=0;
while(X<4)
{
    if(array[X][Y]==0)
    {
        zero=zero+1;
    }
    if(array[X][Y]==1)
    {
        one=one+1;
    }
    if(array[X][Y]==2)
    {
        two=two+1;
    }
    if(array[X][Y]==3)
    {
        three=three+1;
    }
    if(array[X][Y]==4)
    {
        four=four+1;
    }
    if(array[X][Y]==5)
    {
        five=five+1;
    }
    if(array[X][Y]==6)
    {
        six=six+1;
    }
    if(array[X][Y]==7)
    {
        seven=seven+1;
    }
    if(array[X][Y]==8)
    {
        eight=eight+1;
    }
    if(array[X][Y]==9)
    {
        nine=nine+1;
    }
    Y++;
    if(Y==4)
    {
        Y=0;
        X++;
    }
}


if(Q==0)
{
    return zero;
}
if(Q==1)
{
    return one;
}
if(Q==2)
{
    return two;
}
if(Q==3)
{
    return three;
}
if(Q==4)
{
    return four;
}
if(Q==5)
{
    return five;
}
if(Q==6)
{
    return six;
}
if(Q==7)
{
    return seven;
}
if(Q==8)
{
    return eight;
}
if(Q==9)
{
    return nine;
}

}

的main.cpp

#include <iomanip>
#include <locale>
#include <sstream>
#include <string>
#include <iostream>

extern int count_numbers(int array[4][4], int);

int array[4][4] = { {1,2,3,4} , {1,2,3,4} , {1,2,3,4} , {1,2,3,4}};
int main()
{
count_numbers(array);
std::cout << ",0:" << count_numbers(array, 0) << ",1:" << count_numbers(array, 1) << ",2:" << count_numbers(array, 2) << ",3:" << count_numbers(array, 3) << ",4:" << count_numbers(array, 4) << ",5:" << count_numbers(array, 5) << ",6:" << count_numbers(array, 6) <<",7:" << count_numbers(array, 7) << ",8:" << count_numbers(array, 8) << ",9:" << count_numbers(array, 9) << std::endl;
}

PS。忽略不正确的缩进,只是粘贴到此站点

PPS。感谢您的帮助。

修改 的 谢谢你&#34;弗拉德来自莫斯科&#34;寻求帮助。 如果我只是从count_number(array);

删除(无意)main.cpp来电,那么我的初始(可怕)代码就会有效

然而,Vlad提出的for循环系统允许我将代码缩小80%。它现在看起来像这样:

int count_numbers(int array[4][4], int Q)
{
int ans=0;
for(int i=0; i<4; i++)
{
    for(int j=0; j<4; j++)
    {
        ans += array[i][j] ==Q;
    }
}
return ans;
}

感谢您提供的帮助非常棒,我开始编写Python代码,因此我对C ++中的循环缺乏了解,这是真正的问题。 无论如何,问题解决了..

2 个答案:

答案 0 :(得分:3)

此次电话

count_numbers(array);

没有意义,而且无效,因为该函数需要两个参数而不是一个。

函数本身可以按以下方式编写

const size_t N = 4;

size_t count_number( const int ( &a )[N][N], int value )
{
    size_t n = 0;

    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            n += a[i][j] == value;
        }
    }

    return n;
}

并调用

std::cout << "0: "   << count_number( array, 0 ) 
          << ", 1: " << count_number( array, 1 ) 
          << ", 2: " << count_number( array, 2 ) 
          << ", 3: " << count_number( array, 3 ) 
          << ", 4: " << count_number( array, 4 ) 
          << ", 5: " << count_number( array, 5 ) 
          << ", 6: " << count_number( array, 6 ) 
          << ", 7: " << count_number( array, 7 ) 
          << ", 8: " << count_number( array, 8 ) 
          << ", 9: " << count_number( array, 9 ) 
          << std::endl;

这是一个示范程序

#include <iostream>

const size_t N = 4;

size_t count_number( const int ( &a )[N][N], int value )
{
    size_t n = 0;

    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            n += a[i][j] == value;
        }
    }

    return n;
}

int main()
{
    int array[N][N] = 
    { 
        { 1, 2, 3, 4 } , 
        { 1, 2, 3, 4 } , 
        { 1, 2, 3, 4 } , 
        { 1, 2, 3, 4 } 
    };

    bool first = true;
    for ( int value = 0; value < 10; ++value )
    {
        size_t n = count_number( array, value );

        if ( n )
        {
            std::cout << ( first ? first = false, "" : ", " )
                      << value << ": "  << n; 
        }
    }        
    std::cout << std::endl;
}

它的输出是

1: 4, 2: 4, 3: 4, 4: 4

更通用的方法可以采用以下方式

#include <iostream>
#include <iterator>
#include <algorithm>

template <typename InputIterator, typename T>
size_t count_number( InputIterator first, 
                     InputIterator last, 
                     const T &value )
{
    size_t n = 0;

    for ( ; first != last; ++first )
    {
        n += std::count( std::begin( *first ), std::end( *first ), value );
    }        

    return n;
}

int main()
{
    const size_t N = 4;
    int array[N][N] = 
    { 
        { 1, 2, 3, 4 } , 
        { 1, 2, 3, 4 } , 
        { 1, 2, 3, 4 } , 
        { 1, 2, 3, 4 } 
    };

    bool first = true;
    for ( int value = 0; value < 10; ++value )
    {
        size_t n = count_number( std::begin( array ), std::end( array ), value );

        if ( n )
        {
            std::cout << ( first ? first = false, "" : ", " )
                      << value << ": "  << n; 
        }
    }        
    std::cout << std::endl;
}

程序输出与上面显示的相同。

如果数组只包含您需要计数的数字,那么该函数可能看起来像

const size_t N = 4;

void count_digits( const int ( &a )[N][N], size_t ( &digits)[10] )
{
    for ( size_t &x : digits ) x = 0;

    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            ++digits[a[i][j]];
        }
    }
}

要调用该函数,您需要在main中声明一个数组,例如

size_t digits[10];

答案 1 :(得分:1)

您可以使用c ++ return int[]更好地返回vector<int>或事件。

在你的功能中你可以用

之类的东西替换一,二......
vector<int> result(10);

这将创建一个包含10个条目的向量,所有条目都为0。 然后将three = three + 1之类的内容替换为result[3] = result[3] + 1或更加精简result[3]++

然后在结束时你可以写... << ",0:" << result[0] << ...或甚至做一个for循环,如:

for (int i = 0; i < 10; ++i) count << "," << i << ":" << result[i];

如果需要,您可以使用int[]完成所有这些操作,但是您需要注意分配和释放内存。 vector会简化您的代码。