我正在编写的程序使用表示分数的类。 我有一个类成员函数,该函数从类成员变量中获取两个整数(分子和分母),并对它们进行比较以找出是否有不常见的数字。
(分子123和分母110035将有3个不常见的数字,分别是2和0和5,因为这些数字是其int唯一的)。
我的成员函数必须输出一个数组,该数组包含以下数据:有多少个不常见的数字,具体是哪些数字,以及该数字在其各自的int(分子或分母)中出现了多少次。
我在名为uncommonDigitArray的成员函数中有一个数组,其格式如下:
索引0包含一个整数,表示有多少个不寻常的数字
索引1-10表示数字0-9,并且它们包含表示以下内容的整数 怎么样 该数字多次出现在分子中。
索引11-20代表数字0-9,并且它们包含代表以下内容的整数 该数字在分母中出现多少次。
我需要将该数组传递给另一个函数,然后对其进行迭代以正确输出信息。
这是创建数组的成员函数:
int Fraction::extractUncommonDigit() {
int numDigitCounterArray[10] = { 0 };
int denomDigitCounterArray[10] = { 0 };
int digitCounterArray[20] = { 0 };
int uncommonDigitArray[21] = { 0 };
int tempDigit;
int numInt{ num };
int denomInt{ denom };
int numLength{ 0 };
int denomLength{ 0 };
int uncommonDigitCounter = 0;
do {
tempDigit = numInt % 10;
digitCounterArray[tempDigit] += 1;
numInt /= 10;
numLength++;
} while (numInt != 0);
do {
tempDigit = denomInt % 10;
digitCounterArray[tempDigit + 10] += 1;
denomInt /= 10;
denomLength++;
} while (denomInt != 0);
for (int i = 0; i < 10; i++) {
if ((digitCounterArray[i] == 0 && digitCounterArray[i + 10] > 0) ||
(digitCounterArray[i] > 0 && digitCounterArray[i + 10] == 0)) {
uncommonDigitCounter++;
}
}
uncommonDigitArray[0] = uncommonDigitCounter;
for (int i = 0; i < 10; i++) {
if (digitCounterArray[i] > 0 && digitCounterArray[i + 10] == 0) {
uncommonDigitArray[i+1] = digitCounterArray[i];
}
if (digitCounterArray[i] == 0 && digitCounterArray[i + 10] > 0) {
uncommonDigitArray[i + 11] = digitCounterArray[i + 10];
}
}
cout << "\nuncommonDigitsArray" << endl;
for (int i = 0; i < 21; i++) {
cout << uncommonDigitArray[i];
}
cout << "\n\ndigitCounterArray\n";
for (int i = 0; i < 20; i++) {
cout << digitCounterArray[i];;
}
return (*uncommonDigitArray);
}
这是我要获取该数组并对其进行迭代的地方。在情况3中,我调用成员函数提取不常见的数字:
void runMenu3(void) {
int option;
int n;
int d;
Fraction* frPtr{ nullptr };
int *uncommonDigitArray = new int[21];
do {
cout <<
"*****************************************\n"
"* Menu - HW #1 *\n"
"* 1. Creating/Updating Fraction *\n"
"* 2. Displaying the Fraction *\n"
"* 3. Displaying Uncommon Digit(s) *\n"
"* 4. Quit *\n"
"*****************************************\n"
"Enter your option (1 through 4): ";
cin >> option;
switch (option) {
case 1:
if (frPtr == nullptr) {
cout << "\nEnter an int for num: ";
cin >> n;
cout << "\nEnter an int for denom: ";
cin >> d;
frPtr = new FractionGeorgeMS(n, d);
}
else if (frPtr != nullptr) {
runHWMenu4(frPtr);
}
break;
case 2:
frPtr->print();
break;
case 3:
frPtr->print();
*uncommonDigitArray = frPtr->extractUncommonDigit();
cout << "\n\nuncommonDigitArray after copying" << endl;
for (int i = 0; i < 21; i++) {
cout << uncommonDigitArray[i] << endl;
}
cout << "Using the results from extractUncommonDigit() -\n"
<< " The uncommon digit array has " <<
uncommonDigitArray[0] << " uncommon digit(s) of\n"
<< " from num --\n";
for (int i = 0; i < 10; i++) {
if (uncommonDigitArray[i] > 0) {
cout << i << " (occured " << uncommonDigitArray[i + 1]
<< " time(s))" << endl;
}
}
for (int i = 10; i < 20; i++) {
if (uncommonDigitArray[i] > 0) {
cout << i << " (occured " << uncommonDigitArray[i + 11]
<< " time(s))" << endl;
}
}
break;
}
} while (option != 4);
}
这是我的输出:
*****************************************
* Menu - HW #1 *
* 1. Creating/Updating Fraction *
* 2. Displaying the Fraction *
* 3. Displaying Uncommon Digit(s) *
* 4. Quit *
*****************************************
Enter your option (1 through 4): 1
Enter an int for num: 123
Enter an int for denom: 110035
123 / 110035
A call to Fraction(int, int) was made to build a Fraction!
num : 123
denom : 110035
*****************************************
* Menu - HW #1 *
* 1. Creating/Updating Fraction *
* 2. Displaying the Fraction *
* 3. Displaying Uncommon Digit(s) *
* 4. Quit *
*****************************************
Enter your option (1 through 4): 3
The current Fraction object has
num : 123
denom : 110035
uncommonDigitsArray
300100000002000010000
digitCounterArray
01110000002201010000
uncommonDigitArray after copying
3
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
-842150451
Using the results from extractUncommonDigit() -
The uncommon digit array has 3 uncommon digit(s) of
from num --
0 (occured -842150451 time(s))
*****************************************
* Menu - HW #1 *
* 1. Creating/Updating Fraction *
* 2. Displaying the Fraction *
* 3. Displaying Uncommon Digit(s) *
* 4. Quit *
*****************************************
Enter your option (1 through 4):
如您所见,当我遍历成员函数中的数组时,我得到了很好的结果。 返回数组的副本后遍历数组时,我什么也没得到。
任何对我做错事的建议都将不胜感激。
答案 0 :(得分:0)
我的直接想法是返回一个结构而不是单个整数。像这样:
struct UncommonDigits {
int uncommon_count;
int numerator_freq[10];
int denominator_freq[10];
};
那样,您无需解释数组的索引0的含义,因为“数组索引”现在具有名称。
当您将结构作为参数传递或从函数返回时,它将被复制。这正是您所需要的。另一方面,在这些非常常见的情况下,数组的行为会很奇怪。因此,将它们包装在结构中通常是一个好主意。
UncommonDigits Fraction::extractUncommonDigit() {
UncommonDigits result = {0, {0}, {0}};
result.uncommon_count = ...;
result.nominator_freq[3] = ...;
return result;
}