【问题标题】:Function to determine values matching a specific frequency in an array using for loops c++使用for循环c ++确定与数组中特定频率匹配的值的函数
【发布时间】:2018-03-14 04:05:41
【问题描述】:

对于任何明显的错误提前道歉,我在编程方面不是很熟练。我正在编写一个程序来确定数组中以用户搜索的确切频率出现的值的数量。例如,如果数据集包含数字 5、6、6、7、7、8、9、9,并且用户在数组中搜索频率为 2,因为数字 6、7 和 9 都恰好出现 2次,它们匹配 2 的频率,因此程序将输出数组中有 3 个数字与 2 的频率匹配,并列出所有匹配频率的值一次。下面是我的程序中应该执行此计算的函数,但每次我运行程序时,我都会得到一个 0 值,用于匹配应该出现值的频率的值。这两个 for 循环是我的函数的要求,所以我需要它们正常工作,而不是使用不同的方法。我相信一些循环可能需要包含在其他循环中,但我不能完全适应它。任何修复此功能的帮助将不胜感激。

short countOfFrequency (long data[], short dsize, long FreqNumbers[ ], short 
Frequency)
{

short i, j;
short count = 0;
short Value;

/*search above loop
(loop searches above each element in the array, if an element of the same 
value is found above the element, the loop terminates)*/ 
for (i=0; i<dsize; i++)
{
    Value = data[i]; //the variable 'Value' is assigned to each element
    for (j=0; j<i; j++)
    {
        break;
    }
}

/*search below + count loop
(loop searches below each element in the array, if an element is found with 
the same value, the variable 'count' is increased by one)*/
for (j=i+1; j<dsize; j++)
{
    if (Value==data[i])
    {
        count++;
    }   
}

/*(If the count of a value matches the users desired frequency, that value
is stored in the FreqNumbers array)*/ 
if (count==Frequency)
    {
        FreqNumbers[dsize++] = Value;
    }

return FreqNumbers[dsize];
}

【问题讨论】:

  • 您能解释一下您要在代码中执行的操作吗?也许它会更容易理解。
  • @Ashutosh 我在代码中添加了一些 cmets,希望能更容易理解,对此我深表歉意。
  • 您是否保证数组中的数字已经按排序顺序(从低到高)?或者如果没有,你可以排序吗?而且,您是否设想完成后FreqNumbers 持有与请求的频率数相匹配的值?
  • @DavidC.Rankin 数组中的数字不能保证被排序,但我会说它们可以被排序。是的,我希望将与请求频率匹配的值存储在FreqNumbers 中,然后通过程序中的另一个函数返回并显示。

标签: c++ arrays function for-loop frequency


【解决方案1】:

首先,您应该使用向量而不是数组。 其次,如果你想得到一个数字列表,你应该传递 FreqNumbers 作为参考。

#include<iostream>
#include<string>
#include<vector>
#include<map>

void countOfFrequency(std::vector<long> &data, std::vector<long> &FreqNumbers, short Frequency)
{
    short count = 0;
    short Value;
    int dsize = data.size();
    std::map<long, long > mapFreq; // first: for store each value of vector data, second for store it's counter
    mapFreq.insert(std::pair<long, long>(data[0], 1));
    for(int i = 1; i < dsize; i++)
    {
        auto &it = mapFreq.find(data[i]);
        if(it != mapFreq.end())
        {
            it->second++;
        }
        else
        {
            mapFreq.insert(std::pair<long, long>(data[i], 1));
        }
    }
    for(auto it : mapFreq)
    {
        if(it.second == Frequency)
            FreqNumbers.push_back(it.first);
    }
}


int main()
{
    std::vector<long> data = { 5, 6, 6, 7, 7, 8, 9, 9 };
    std::vector<long> FreqNumbers;
    countOfFrequency(data, FreqNumbers, 2);
    if(FreqNumbers.size())
    {
        for(auto number : FreqNumbers)
        {
            std::cout << number << ", ";
        }
    }
}

【讨论】:

    【解决方案2】:

    这实际上取决于您可以使用多少 C++ 的优点。鉴于您现有的代码,所使用的 C++ 没有什么独特之处。这可能是你的导师在你课堂的这个阶段想要的。如果是这种情况,那么一个简单的手动排序例程,然后调用一个传递数据的函数,数据的大小,一个相同大小的数组来保存与请求的频率匹配的值,并且要查找的频率是基本的你可以得到。例如

    #include <iostream>
    
    using namespace std;
    
    int countfreq (int *data, int dsize, int *freqvals, int freq)
    {
        int last = *data,   /* set last to first value in data */
            idx = 0,        /* index for freqvals to return */
            seq = 1;        /* sequential values count */
    
        if (freq <= 0 || freq > dsize)  /* is requested freq valid? */
            return 0;
    
        for (int i = 1; i < dsize; i++) {   /* loop 2nd value to end */
            if (last == data[i])            /* if last == current */
                seq++;                      /* increment sequential count */
            else {  /* otherwise */
                if (seq == freq)            /* sequential count == freq? */
                    freqvals[idx++] = last; /* add last value to freqvals */
                seq = 1;                    /* reset sequential count 1 */
            }
            last = data[i];                 /* set last = current */
        }
        if (seq == freq)                    /* handle last value in data */
            freqvals[idx++] = last;
    
        return idx;     /* return freqvals index */
    }
    
    /* simple insertion sort */
    void inssort (int *arr, int size)
    {
        for (int i = 0; i < size; i++)
            for (int j = i - 1; j >= 0; j--)
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                }
                else
                    break;
    }
    
    int main (void) {
    
        int data[] = { 8, 9, 5, 6, 7, 6, 7, 9 },    /* unsorted data */
            dsize  = sizeof data / sizeof *data,    /* number of elements */
            *freqvals = new int[dsize],             /* allocate for freqvals */
            freq  = 0,      /* frequency from user  */
            nfreq = 0;      /* return from function */
    
        for (int i = 0; i < dsize; i++)         /* zero the freqvals array */
            freqvals[i] = 0;
    
        inssort (data, dsize);                  /* sort data */
    
        cout << "enter requested frequency: ";  /* prompt for frequency input */
        if (!(cin >> freq)) {
            cerr << "error: invalid input.\n";
            return 1;
        }
    
        /* call function saving return in nfreq */
        if ((nfreq = countfreq (data, dsize, freqvals, freq))) {
            cout << "the values matching requested frequency were: ";
            for (int i = 0; i < nfreq; i++)     /* output csv */
                if (i)
                    cout << ", " << freqvals[i];
                else
                    cout << freqvals[i];
            cout << "\n";
        }
        else    /* otherwise, no values matched requested frequency */
            cout << "no values appear with the requested frequency.\n";
    
        delete[] freqvals;  /* free allocated memory */
    }
    

    除了使用 cin/coutnew/delete 之外,没有任何 C++ 固有的解决方案,fgets/printfmalloc/free 也可以使用 stdio.hstdlib.h 代替 iostream .

    如果您确实能够为您的数组使用vector,那么您可以利用C++ 提供的细节。您可以简单地 sort 您的向量并通过仅传递对您的 data 向量的常量引用和要查找的频率来简化函数参数。您可以从您的函数返回一个向量,然后简单地测试返回向量的.size() 以确定是否找到任何具有请求频率的值。逻辑是相同的,你必须使用的工具更方便一些,例如

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    vector<int> countfreq (vector<int>& data, int freq)
    {
        vector<int> freqvals;       /* vector to return */
        int dsize = data.size(),    /* size of initial check */
            last = data.front(),    /* first value in data */
            count = 0,              /* count flag for range loop */
            seq = 1;                /* sequential values counted */
    
        if (freq <= 0 || freq > dsize)  /* is freq valid? */
            return freqvals;
    
        for (auto& i : data) {      /* loop over data */
            if (!count) {           /* if first iter, set flag continue */
                count++;
                continue;
            }
            if (last == i)          /* if current equals last */
                seq++;              /* increment sequential count */
            else {  /* otherwise */
                if (seq == freq)    /* if sequential count == freq */
                    freqvals.push_back(last);   /* add value to vector */
                seq = 1;            /* reset sequential count = 1 */
            }
            last = i;               /* update last */
        }
        if (seq == freq)            /* handle last value in data */
            freqvals.push_back(last);
    
        return freqvals;            /* return vector */
    }
    
    int main (void) {
    
        vector<int> data = { 8, 9, 5, 6, 7, 6, 7, 9 };  /* unsorted data */
        int freq;   /* the frequency of values to find */
    
        sort (data.begin(), data.end());    /* sort data */
    
        cout << "enter requested frequency: ";  /* prompt for freq input */
        if (!(cin >> freq)) {
            cerr << "error: invalid input.\n";
            return 1;
        }
    
        vector<int> frequency = countfreq (data, freq); /* call function */
        if (frequency.size()) {             /* does return have elements? */
            int count = 0;                  /* flag for output control */
            cout << "the values matching requested frequency were: ";
            for (auto& i : frequency)       /* loop over values in return */
                if (count)
                    cout << ", " << i;      /* output as csv */
                else {
                    cout << i;
                    count = 1;
                }
            cout << "\n";
        }
        else    /* otherwise, handle no values returned */
            cout << "no values appear with the requested frequency.\n";
    
    }
    

    注意:您提供的值未按顺序用于data的内容)

    无论你使用哪个,输出都是一样的,例如

    使用/输出示例

    $ ./bin/frequency
    enter requested frequency: 0
    no values appear with the requested frequency.
    
    $ ./bin/frequency
    enter requested frequency: 1
    the values matching requested frequency were: 5, 8
    
    $ ./bin/frequency
    enter requested frequency: 2
    the values matching requested frequency were: 6, 7, 9
    
    $ ./bin/frequency
    enter requested frequency: 3
    no values appear with the requested frequency.
    

    查看一下,如果您还有其他问题,请告诉我。有很多方法可以解决这个问题,所以不要认为你仅限于这种方法。您可以随意拼凑拼图的各个部分。

    【讨论】:

    • 我们还没有在课堂上介绍vector,但第一个解决方案效果很好。感谢您的宝贵时间。
    • 当然,很高兴为您提供帮助。使用 C/C++ 剥皮猫的方法总是不止一种。祝你编码好运。 (如果有帮助,请不要忘记选择答案作为回答您的问题,如果没有,请选择其他答案,但请选择一个,这样该问题就不会继续在未回答的队列中反复出现)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多