1

私のプログラムは、乱数を含むテキストファイルを生成します。例:

123
1234
12345
123456

そして、プログラムはそのファイルを取り込んで、ランダムデータを構造体配列に入れます。次に、配列を処理し、次のようなファイルを出力します。

上記のinfile.txtに基づいて作成されたoutfile.txt:

No      Type Odd Even Sum Digit
1234    Even 2   2    10  4
23467   Odd  2   3    22  5
123     Odd  2   1    6   3

しかし、私が直面している問題は、奇数/偶数のカウントが1行おきに機能しなくなることを除いて、すべてが正常に意図したとおりに出力されることです。たとえば、最初の行は正しい結果を出力し、2番目の行は出力せず、3番目の行は再び機能します。

//oddcount, evencount. (WORKS, BUT ONLY EVERY OTHER LINE)

int countEven;
int countOdd;

for (int i = 0; i < size; i++)
{
    countEven = 0;
    countOdd = 0;
    while (t[i].no > 0)
    {
        if (t[i].no % 2 == 1)
        {
            countOdd++;
            t[i].no/= 10;
        }
        else
        {
            countEven++;
            t[i].no/=10;
        }
        n[i].oddDigits = countOdd;
        n[i].evenDigits = countEven;
    } i++;

}

これが全体のコードです。

#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <iomanip>

using namespace std;

const int MAX = 100;

enum NumType {Odd, Even};

struct Number
{
    int no;
    NumType type;
    int oddDigits;
    int evenDigits;
    int sumDigits;
    int noDigits;
};

void arrayToOutfile (ofstream&, char [], Number [], int);
void constructInfile (fstream&, char []);
int constructArray (fstream&, char [], Number []);
void processArray (Number [], int);
NumType whatType (int);
void getStringLabel (NumType, char []);

int main ()
{
    srand (time_t(NULL));
    fstream inFile;
    char fileName [MAX];

    cout << "Enter filename: ";
    cin >> fileName;

    constructInfile (inFile, fileName);

    cout << "----------------------------------------" << endl;

    Number n [MAX];

    int size = constructArray(inFile, fileName, n);

    processArray (n, size);

    cout << "----------------------------------------" << endl;

    ofstream outFile;

    cout << "Enter the output filename: ";
    cin >> fileName;

    arrayToOutfile (outFile, fileName, n, size);
}

void constructInfile (fstream& inFile, char fileName[])
{
    inFile.open (fileName, ios::out);

    if (!inFile)
    {
        cout << fileName << " cant be created for write"
        << endl;

        exit (-1);
    }

    int size = rand() % 51+ 50;
    for (int i = 0; i < size; i++)
    {
        inFile << rand () % 901 + 100 << endl
        << rand () % 90001 + 10000 << endl
        << rand () % 900001 + 100000 << endl;
        i++;
    }

    cout << "written to outfile successfully" << endl;

    inFile.close();

}

int constructArray (fstream& inFile, char fileName[], Number n[])
{
    inFile.open (fileName, ios::in);

    if (!inFile)
    {
        cout << fileName << " cant be accessed for array creation."
        << endl;
        exit (-1);
    }
    cout << "Begin file to array" << endl;
    int i = 0;
    while (inFile >> n[i].no)
    {
        ++i;
    }

    inFile.close();
    cout << "File to array transfer success" << endl;

    return i;

}

void processArray (Number n [], int size)
{

    cout << "Begin processing array" << endl;
    //Odd or Even Enum Label
    for (int i = 0; i < size; i++)
    {
        n[i].type = whatType (n[i].no);
    }


//copy number n array to temp n array
    Number t [MAX];

    for (int i = 0; i < size; i++)
    {
        t[i].no = n[i].no;
    }

    for (int i = 0; i <size; i++)
    {
        n[i].evenDigits = 0;
        n[i].oddDigits = 0;
    }

//oddcount, evencount. (WORKS, BUT ONLY EVERY OTHER LINE)

    int countEven;
    int countOdd;

    for (int i = 0; i < size; i++)
    {
        countEven = 0;
        countOdd = 0;
        while (t[i].no > 0)
        {
            if (t[i].no % 2 == 1)
            {
                countOdd++;
                t[i].no/= 10;
            }
            else
            {
                countEven++;
                t[i].no/=10;
            }
            n[i].oddDigits = countOdd;
            n[i].evenDigits = countEven;
        } i++;

    }

    //copy number n array to temp n array again.
    for (int i = 0; i < size; i++)
    {
        t[i].no = n[i].no;
    }

    //Sum digits    (WORKS!!!)
    //SET TO DEFAULT 0 FOR SUMDIGITS

    for (int i = 0; i <size; i++)
    {
        n[i].sumDigits = 0;
    }

    for (int i = 0; i < size;)
    {
        while (t[i].no > 0)
        {
            n[i].sumDigits = n[i].sumDigits + t[i].no % 10;
            t[i].no /= 10;
        }i++;
    }

    //copy number n array to temp n array again.
    for (int i = 0; i < size; i++)
    {
        t[i].no = n[i].no;
    }
    //SET TO DEFAULT 0 for COUNT DIGITS
    for (int i = 0; i <size; i++)
    {
        n[i].noDigits = 0;
    }

    //DIGIT COUNT
    for ( int i = 0; i < size; i++)
    {
        int countDigits = 0;

        while (t[i].no != 0)
        {
            t[i].no /= 10;
            countDigits++;
        }
        n[i].noDigits = countDigits;
    }


    for (int i = 0; i < size; i++)
    {

    }

    cout << "The array was processed" << endl;
}
//Enumerated Number type.
NumType whatType (int n)
{

    if (n % 10 % 2 == 1)
        return Odd;
    else
        return Even;
}
//From Array to Outfile.
void arrayToOutfile (ofstream& outFile, char fileName[], Number n[], int size)
{
    outFile.open (fileName);

    if (!outFile)
    {
        cout << "Array to " << fileName << " failed" << endl;
        exit (-1);
    }

    cout << "Begin from array to " << fileName << endl;

    cout << fixed << showpoint << setprecision (3);

   char label [MAX];


    outFile << "No" << "\t"
    << "Type" << "\t"
    << "Odd" << "\t"
    << "Even" << "\t"
    << "Sum" << "\t"
    << "Digit"
    << endl;


    for (int i = 0; i < size; i++)
    {
        getStringLabel (n[i].type, label);

        outFile << n[i].no << "\t"
        << label << "\t"
        << n[i].oddDigits << "\t"
        << n[i].evenDigits << "\t"
        << n[i].sumDigits << "\t"
        << n[i].noDigits << endl;
    }

    outFile.close();

    cout << "Array to outfile OK" << endl;
}

//Enumeration String label
void getStringLabel (NumType type, char label[])
{

        switch (type)
    {
        case Odd:   strcpy (label, "Odd");
            break;
        case Even:  strcpy (label, "Even");
            break;
        default:    strcpy (label, "err");
    }
}
4

1 に答える 1

3

i ++を2回呼び出します。1回はfor(...)内で、2回目はforループの本体で、whileの本体の終了後に呼び出します。

于 2012-11-30T11:43:56.037 に答える