0

我的功能有问题。当我使用一个函数来操作一个数组,并打印它并移动到下一个操作函数时,它使用之前操作的数组而不是原始数组。例如,当我的函数将每个负数转换为正数时,我调用下一个函数将所有偶数清零,并且我的数组打印出所有零,而不是使用原始数组。

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

#define NUMS_PER_LINE 10    // maximum numbers to be printed on each line.

int numbers[100];   // array to hold upto 100 integer numbers.
int numcnt;     // actual count (<=100) of numbers in above array.

// reads file content into array

void read_array_from_file (const char filename[])
{
    ifstream inpfile(filename);

    if (!inpfile.is_open())
    {
        cout << "Can't open file : " << filename << endl;
        exit(1);
    }

    numcnt=0;   // Initialise count of read numbers

    // Read numbers from the file into array.
    inpfile >> numbers[numcnt];

    while (!inpfile.eof())      // Read until EOF is reached.
    {
        numcnt++;   // Got one more number from input file.
        inpfile >> numbers[numcnt];
    }

    inpfile.close();

    return;
}

// Print out all the values in the array

void print_array_content (int numsinaline)
{
    int i;

    for (i=0; i<numcnt+1; i++)
    {
        if ((i % numsinaline) == 0)
            cout << endl;
        cout << numbers[i] << " ";
    }

    cout << endl << endl;

    return;
}

// calculate average

double calculate_average ()
{
    int i;
    float sum=0;

    for (i=0; i<(numcnt-1); i++)
    {
       sum += numbers[i];
    }

    return (sum/(numcnt-1));
}

// Find numbers larger and smaller than the average.

void find_numbers_smaller_and_larger_than_average (int &larger, int &smaller, int  average)
{
    int i;

    for (i=0; i<(numcnt-1); i++)
    {
        if (numbers[i] < average)
            smaller++;
        else if (numbers[i] > average)
            larger++;
    }

    return;
}

// Convert negative numbers to positive in the array 'numbers'.

void convert_negative_to_positive ()
{
    int i;

    for (i=0; i<(numcnt-1); i++)
    {
        if (numbers[i] < 0)
            numbers[i] *= -1;
    }

    return;
}



// Convert all even numbers into zero.
void zero ()
{
    int i;

    for (i=0; i<numcnt; i++)
    {
        if (numbers[i] > 0)
            numbers[i] *= 0;
    }

    return;
}
4

5 回答 5

1

首先,您为数组使用了一个全局变量,因此您永远不会将它传递给您的函数。当您更改函数中的全局变量时,它会更改数组中的数据。您应该将该数据传递给函数,而不是使用全局变量。

while(!inpFile.eof())不好!不要这样做。

对于文件流:

std::vector<int> numbers;
std::ifstream fin("myfile");
std::copy(std::istream_iterator<int>(fin), std::istream_iterator(),  std::back_inserter<vector<int> >(numbers));

这 3 行会将整个文件读入向量“数字”中。

第三,在声明函数时,传递数组:

void myFunction(const std::vector<int>& vec); // if you aren't going to change the vector

或 void myFunction(std::vector& vec); //如果你要改变它

你可以简单地调用它:

myFunction(numbers);
于 2013-09-10T19:51:51.743 回答
0

您直接在函数内部操作数组,因为它是全局定义的,而不是作为参数传入副本。

void modify(int[] array) {

    //Modify copied array here

}

int main() {
    int numbers[100];
    int copyNumbers[100];
    //Copy numbers
    memcpy(copyNumbers, numbers, sizeof(numbers));

    modify(copyNumbers);
    //Use modified array
    memcpy(copyNumbers, numbers, sizeof(numbers)); //Set back to original
    modify(copyNumbers);  //Modify copy again as original
}
于 2013-09-10T19:52:14.200 回答
0

“它使用先前操作的数组而不是原始数组。”

显然是因为您已全局声明了数组

int numbers[100];

在所有功能之外。

当您对该数组执行一项操作时,元素会被修改,新值将用于下一个函数。

取而代之的是,保存原始数组的副本,然后在您希望处理原始数组时使用此副本

于 2013-09-10T19:47:41.167 回答
0

您的所有操作都作用于单个全局变量numbers. 如果您在任何函数中修改它,它的值也将在每隔一次出现时发生变化。

相反,提供一种方法来告诉您的函数您要使用哪个数组,它包含多少个元素并使用多个数组。这也使您能够摆脱全局变量。

例子:

#include <iostream>

using namespace std;

typedef unsigned int array_size_t;

void print_array(int array[], array_size_t size){
  for(array_size_t i = 0; i < size; ++i){
    cout << array[i] << endl;
  }
}

int main(){
  int a1[] = {1,2,3,4};
  int a2[] = {1,3,3,7,0,0,0,0};
  print_array(a1,4);
  print_array(a2,8);  
}

评论

如果您被允许使用标准容器,例如std::vector。上面的解决方案更像是 C 而不是类 C++。

于 2013-09-10T19:48:15.540 回答
0

您正在使用全局变量。您对数字的所有操作,无论指数如何,都会改变您特定位置的价值。

另一个潜在的风险是如果你的输入文件包含超过 100 个整数,你会这样做

inpfile >> numbers[100];

或某些大于 100 的索引号。这将导致分段错误。

使用全局变量时应该非常小心

于 2013-09-10T20:00:28.060 回答