如何使用成员函数将整数数组返回为动态整数数组

时间:2018-10-23 04:33:03

标签: c++ arrays pointers dynamic-arrays member-functions

我正在编写的程序使用表示分数的类。 我有一个类成员函数,该函数从类成员变量中获取两个整数(分子和分母),并对它们进行比较以找出是否有不常见的数字。

(分子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):

如您所见,当我遍历成员函数中的数组时,我得到了很好的结果。 返回数组的副本后遍历数组时,我什么也没得到。

任何对我做错事的建议都将不胜感激。

1 个答案:

答案 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;
}