My program generates a text file with random numbers, for eg:
123
1234
12345
123456
And the program takes in that file and puts the random data into a struct array. It then processes the array and outputs a file that looks like this:
outfile.txt produced based in the above 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
But the problem I'm running into is that everything comes out fine and as intended, except that my odd/even count stops working on the every other line! For instance, the first line, it would output the correct results, the second line it wouldn't, the third line it would work again and so on.
//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++;
}
Here is the code in it's entirety.
#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");
}
}
你可以调用i ++两次,一次在for(...)中,第二次在for循环体内,在while体的结尾之后。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.