You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++奇偶数列求和程序故障求助:函数异常及N>3时失效问题

C++奇偶分离求和程序问题排查与修复

问题描述

作为C++新手,我编写了一个程序,目标是实现输入数字列表、分离奇偶数列并计算各自的和,但evenodd函数未按预期工作,且当输入数字数量N>3时程序完全无法正常运行。

原代码

#include <iostream>
using namespace std;
int n=0, E=0, O=0; // E and O index counter
void accept ();
void evenodd (int[]);
int sumEven (int[]);
int sumOdd (int[]);
void display(int[],int[],int[],int,int);
    int main()
    {
        cout<<"Enter How Many Number You Want to Add \n";
        cin>>n;
        accept();
        return 0;
    }
    void accept()
    {
        int num[n];
        for (int x=0;x<n;x++)
        {
            cout<<"Enter The Number \n";
            cin>>num[x];
        }
        evenodd(num);
    }
    void evenodd (int num[])
    {
        int evens[E] , odds[O];
        for( int x=0;x<n;x++)
        {
            if (num[x]%2==0)
            {
                evens[E]=num[x];
                E++;
            }
            else 
            {
                odds[O]=num[x];
                O++;
            }
        }
        int sumE=sumEven(evens);
        int sumO=sumOdd(odds);
        display(num,evens,odds,sumE,sumO);
    }
    int sumEven (int evens[])
    {
        int sumE=0;
        for(int x=0;x<E;x++)
            sumE+=evens[x];
        return sumE;
    }
    int sumOdd (int odds [])
    {
        int sumO=0;
        for (int x=0;x<O;x++)
            sumO+=odds[x];
        return sumO;
    }
    void display ( int num[], int evens[], int odds[], int sumE, int sumO)
    {
        cout<<"The list of numbers to be added is \n";
        for (int x=0;x<n;x++)
            cout<<num[x];
        cout<<"\n The list of Even numbers to be added is \n";
        for (int x=0;x<E;x++)
            cout<<evens[x];
        cout<<"\n The list of Odds numbers to be added is \n";
        for (int x=0;x<O;x++)
            cout<<odds[x];
        cout<<"\n The Sum of Even numbers is "<<sumE<<endl;
        cout<<"\n The Sum of Odd numbers is "<<sumO<<endl;
    }

核心问题分析

  1. 非标准变长数组(VLA)使用:C++标准不支持int num[n]这种运行时确定长度的数组,部分编译器虽兼容但会引发未定义行为,N增大时内存问题会暴露。
  2. evenodd函数数组初始化错误:int evens[E] , odds[O];中E、O初始值为0,相当于创建了长度为0的空数组,后续赋值操作直接越界访问内存,这是N>3时程序崩溃的根本原因。
  3. 全局变量滥用:n、E、O作为全局变量,导致函数间耦合过高,状态变化不可控,容易引发逻辑混乱。
  4. 数组越界访问:在evenodd函数中,往evens[E]、odds[O]赋值时,数组长度为0,每一次赋值都破坏了内存结构,导致程序异常。

修复后的代码

使用C++标准容器std::vector替代原生数组,避免变长数组和越界问题,同时减少全局变量的使用:

#include <iostream>
#include <vector>
using namespace std;

void accept(int n, vector<int>& num);
void evenodd(const vector<int>& num, vector<int>& evens, vector<int>& odds);
int sumEven(const vector<int>& evens);
int sumOdd(const vector<int>& odds);
void display(const vector<int>& num, const vector<int>& evens, const vector<int>& odds, int sumE, int sumO);

int main()
{
    int n;
    cout << "Enter How Many Number You Want to Add \n";
    cin >> n;
    vector<int> num;
    accept(n, num);
    
    vector<int> evens, odds;
    evenodd(num, evens, odds);
    
    int sumE = sumEven(evens);
    int sumO = sumOdd(odds);
    
    display(num, evens, odds, sumE, sumO);
    return 0;
}

void accept(int n, vector<int>& num)
{
    num.resize(n);
    for (int x = 0; x < n; x++)
    {
        cout << "Enter The Number \n";
        cin >> num[x];
    }
}

void evenodd(const vector<int>& num, vector<int>& evens, vector<int>& odds)
{
    for (int x = 0; x < num.size(); x++)
    {
        if (num[x] % 2 == 0)
        {
            evens.push_back(num[x]);
        }
        else
        {
            odds.push_back(num[x]);
        }
    }
}

int sumEven(const vector<int>& evens)
{
    int sumE = 0;
    for (int num : evens)
        sumE += num;
    return sumE;
}

int sumOdd(const vector<int>& odds)
{
    int sumO = 0;
    for (int num : odds)
        sumO += num;
    return sumO;
}

void display(const vector<int>& num, const vector<int>& evens, const vector<int>& odds, int sumE, int sumO)
{
    cout << "The list of numbers to be added is \n";
    for (int x : num)
        cout << x << " ";
    cout << "\n The list of Even numbers to be added is \n";
    for (int x : evens)
        cout << x << " ";
    cout << "\n The list of Odds numbers to be added is \n";
    for (int x : odds)
        cout << x << " ";
    cout << "\n The Sum of Even numbers is " << sumE << endl;
    cout << "\n The Sum of Odd numbers is " << sumO << endl;
}

修复说明

  • 用std::vector替代原生数组,支持动态扩容,彻底避免数组越界和变长数组的非标准问题。
  • 移除全局变量,改为函数参数传递,降低耦合性,逻辑更清晰。
  • 使用范围for循环简化代码,提升可读性。
  • 调整函数调用流程,将数据的存储和处理分离,符合C++的编程规范。

内容的提问来源于stack exchange,提问作者Santa_Ethiopia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:25:01