结构阵列奇数/偶数毛刺

时间:2012-11-30 11:36:55

标签: c++ structure

好的,我的代码很长。但是这个有点棘手,所以在这里和我一起露面。 我的程序所做的是生成一个带有随机数的文本文件,例如:

123
1234
12345
123456

程序接收该文件并将随机数据放入struct数组中。 然后它处理数组并输出一个如下所示的文件:

outfile.txt基于上面的infile.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

但我遇到的问题是,一切都很好,并且按照预期,除了我的奇数/偶数计数停止在每隔一行!例如,第一行,它将输出正确的结果,第二行它不会,第三行它将再次工作,等等。

//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");
    }
}

伙计们,是的,我知道代码非常非结构化和混乱,特别是在处理数组函数中 - 我会尽快清理所有内容但首先,您对此为何发生的专业意见将不胜感激。

-Ace

1 个答案:

答案 0 :(得分:3)

你打电话给i +两次,一次在for(...)内,第二次在for循环体内,在一会儿身体结束之后。