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

0

グローバル変数を使用しています。インデックスが何であれ、数値に対するすべての操作は、特定のポジションの値を変更します。

もう 1 つの潜在的なリスクは、入力ファイルに 100 を超える整数が含まれている場合です。

inpfile >> numbers[100];

または 100 より大きいインデックス番号。これにより、セグメンテーション違反が発生します。

グローバル変数を使用するときは細心の注意を払う必要があります

于 2013-09-10T20:00:28.060 に答える
0

「元の配列ではなく、以前に操作された配列を使用します。」

明らかに、配列がグローバルに宣言されているためです

int numbers[100];

すべての関数の外側。

この配列に対して 1 つの操作を実行すると、要素が変更され、新しい値が次の関数に使用されます。

これの代わりに、元の配列のコピーを保存し、元の配列で作業したいときはいつでもこのコピーを使用してください

于 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

配列はグローバルに定義されているため、コピーをパラメーターとして渡すのではなく、関数内で直接操作しています。

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 に答える