好的,我的代码很长。但是这个有点棘手,所以在这里和我一起露面。 我的程序所做的是生成一个带有随机数的文本文件,例如:
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
答案 0 :(得分:3)
你打电话给i +两次,一次在for(...)内,第二次在for循环体内,在一会儿身体结束之后。