C ++奇偶数组,无限答案

时间:2013-11-13 03:52:38

标签: c++ arrays pointers infinite-loop

该程序应该读取元素和列表的数量,并将数组拆分为偶数和奇数,并显示原始数组中的零数。 我之前发布了一个问题,因为我对这个程序遇到了第一个问题,答案非常有用,因为这是一项任务。但是现在我还有另外一个问题,那就是每次我运行它给我0 'z.的程序时它都会停止,直到我关闭窗口。我认为问题在于计数功能,但我自己无法诊断问题。我补充说:

cout<< odd_num<< "     " << even_num;

在我调用count函数找出问题之后它给了我一个非常大的数字,所以无论错误是什么,它都来自这个函数。

所以请帮帮我!我相信大多数人这是非常基本的,但我刚开始学习这一点,如果你能帮助我,我真的很感激。

编辑:我编辑了这段代码,唯一的问题是额外的零作为输出;查看最后的示例输出。

以下是代码:

int count(const int list[],  int size, int & odd , int & even)

{
    int zero(0); 
    for (int i(0); i<size ; i++)
    {
        if (list[i] == 0)
        {
            zero++; 
        }
        if (list[i]% 2 ==0 & list[i]!=0)
        {
            even++; 
        }
        else if (list[i]% 2 ==1 & list[i]!=0)
        {
            odd++; 
        }
    }
    return  zero;

}


void split(const int list[], int size, int list_even[], int even_num, int list_odd[], int odd_num )
{
    int j(0); 
    int k(0); 

    for (int i(0); i<size; i++)
    {
        if(list[i]%2 == 0)
        {
            list_even[j]= list[i];
            j++;
        }
        else if(list[i]%2 != 0)
        {
            list_odd[k]= list[i];
            k++;
        }
    }
    if (j != even_num || k != odd_num) 
    {
        cerr << "Error.";
    }


}

// function to print an  array
void print_list(int array[], int length)
{
    for (int a=0; a<length; a++)
    {
        cout <<array[a]<<" ";
    }
}

以下是示例答案:

Enter number of elements: 3
Enter list:
2
30
0
Error.Even elements:
2 30 0 0
Odd elements:

There were 1 zeros in the list

另一个例子是:

Enter number of elements: 3
Enter list:
2
1
5
Error.Even elements:
2 2752708
Odd elements:
1 5 2762032 2752708
There were 0 zeros in the list

3 个答案:

答案 0 :(得分:3)

您没有初始化变量尝试:

   int zero_num(0); // number of zeros
   int even_num(0);
   int odd_num(0);

在开始使用之前尝试将它们打印出来(在此修复之前)并查看它们的设置。 :)


修复计数功能:

// function to copy odd and even number to seperate arrays
void split(const int list[], int size, int list_even[], int even_num, int list_odd[], int odd_num )
{
    int j(0);
    int k(0);

    for (int i(0); i<size; i++)
    {
        if (list[i] == 0)
        {   // zeros are not considered even in the count function
            // so they should not be added here.
            continue;
        }
        else if(list[i]%2 == 0)
        {
            list_even[j]= list[i];
            j++;
        }
        else if(list[i]%2 != 0)
        {
            list_odd[k]= list[i];
            k++;
        }
    }

    // test that we have found the right number of even and odd numbers.
    if (j != even_num || k != odd_num)
    {
        cerr << "Error.";
    }

}


并确保多次调用count函数不会弄乱你的数字进行此更改:

//function to count the odd and even numbers and th enumber od zeros
int count(const int list[],  int size, int & odd , int & even)

{
    // reset the even and odd counts before we start.
    odd=0;
    even=0;

    int zero(0); // variable to count zeros
    for (int i(0); i<size ; i++)
    {
        if (list[i] == 0)
        {
            zero++;
        }
        else if (list[i]% 2 == 0 )
        {
            even++;
        }
        else if (list[i]% 2 == 1 )
        {
            odd++;
        }
    }
    return  zero;
}

示例输出:

Enter number of elements: 5
Enter list:
1
2
5
0
0
Even elements: 2

Odd elements: 1
5

There were 2 zeros in the list

另一个在开头和中间用零填充的示例输出:

Enter number of elements: 5
Enter list:
0
2
0
1
7
Even elements: 2

Odd elements: 1
7

There were 2 zeros in the list

答案 1 :(得分:3)

如果条件允许,您使用的是&,它是按位运算符而不是&& Logical AND

请参阅:

if (list[i]% 2 ==0 & list[i]!=0)
    {
        even++;
    }

使用&&来查看它是否有效,否则请给我留言。

答案 2 :(得分:2)

[改进]如何写这样的计数函数,

int count(const int list[],  int size, int & odd , int & even)
{
    int zero(0);
    for (int i(0); i<size; ++i)
    {
        if (list[i]==0)
        {
            ++zero;
        }
        else
        {
            if (list[i]%2==0) ++even;
            else ++odd;
        }
    }
    return zero;
}