skeet 发表于 2015-9-8 21:15:03

C语言中输入任意个数数字记录每个数字出现的次数

用C语言实现输入任意个数的数字,记录这些数字出现的次数。
要求:
1、不能用数组进行记录输入的数字,而是通过while(cin>>i)这个语法输入数字。

疑问:有没有什么办法让缓存里面的数据进行循环遍历。

0xAA55 发表于 2015-9-9 08:52:20

cin是个class,不是C语言的东西,C语言没有class,C++才有。

skeet 发表于 2015-9-9 13:00:41

额,知道,只是免了麻烦就用C++的输入流而已

skeet 发表于 2015-9-9 13:02:44

0xAA55 发表于 2015-9-9 08:52
cin是个class,不是C语言的东西,C语言没有class,C++才有。

额,知道。只是免了麻烦就用C++的输入函数,请问有什么思想可以解决这个问题吗

0xAA55 发表于 2015-9-11 00:17:25

不能用数组可以用文件。直接用文件来存储数字和其次数即可。

cyycoish 发表于 2015-9-14 02:20:36

算法请参考这里:
http://www.0xaa55.com/forum.php?mod=viewthread&tid=1281&extra=

skeet 发表于 2015-9-14 12:24:23

cyycoish 发表于 2015-9-14 02:20
算法请参考这里:
http://www.0xaa55.com/forum.php?mod=viewthread&tid=1281&extra=

谢谢你的参考,学习中!!!!!

cyycoish 发表于 2015-9-18 02:20:04

帮你写好了,没有用到任何数组,除了该死的指针操作使用C的stdlib库,完全面向对象:
算法思想曾经发过链接,实测有效,你来使用一下:
#include <iostream>
#include <stdlib.h>
#define _INP_
#define _OUP_
#define _UMR_
#define DECLARE__
using namespace std;

typedef struct
{
        int source;
        int times;
}HIPPO;

class Hippocampus
{
public:
        int ctr; //索引
        HIPPO* hippo = NULL; //海马体
        DECLARE__ ~Hippocampus( //析构函数
        _UMR_   void
                );
        DECLARE__ void CheckItems( //检查记忆
        _INP_   const int num//要检查的数字
                );
        DECLARE__ void PrintReport( //打印结果
        _UMR_   void //没有参数
                );
};

int main()
{
        Hippocampus *hippocampus = new Hippocampus();
        int i;
        while (cin >> i)
        {
                hippocampus->CheckItems(i);
                //显示结果
                cout << "\t输入完毕,结果如下:" << endl;
                hippocampus->PrintReport();
        }
        //释放资源
        delete hippocampus;
}

void Hippocampus::CheckItems(
        _INP_ const int num
        )
{
        int k, j;
        //海马体空
        if (hippo == NULL)
        {
                //初始化索引
                ctr = 1;
                //申请内存
                hippo = (HIPPO*)malloc(sizeof(HIPPO));
                //添加记忆
                hippo->source = num;
                hippo->times = 1;
                return;
        }
        //遍历,指针已经位于开始
        bool bFinded = true;
        for (k = 0; k < ctr; k++, hippo++)
        {
                if (num == hippo->source) //找到记忆
                {
                        //次数+1
                        hippo->times++;
                        //跳出循环
                        break;
                }
                else
                        bFinded = false;
        }
        //指针指向开始
        for (j = k; j > 0; j--, hippo--);
        //没有记忆
        if (!bFinded)
        {
                //长度加一
                ctr++;
                hippo = (HIPPO*)realloc(hippo, ctr * sizeof(HIPPO));
                //指针指向末尾
                for (j = 0; j < ctr - 1; j++, hippo++);
                //添加记忆
                hippo->source = num;
                hippo->times = 1;
                //指针恢复开始
                for (j = 0; j < ctr - 1; j++, hippo--);
        }
        return;
}

void Hippocampus::PrintReport(
        void
        )
{
        int k, j;
        //遍历打印
        for (k = 0; k < ctr; k++, hippo++)
        {
                cout << "\t数字::" << hippo->source << ",";
                cout << "\t频率::" << hippo->times << endl;
        }
        //恢复指针指向开始
        for (j = k; j > 0; j--, hippo--);
}

Hippocampus::~Hippocampus( //析构函数
        void
        )
{
        //释放资源
        free(hippo);
        hippo = NULL;
}

0xAA55 发表于 2015-9-18 18:35:41

cyycoish 发表于 2015-9-18 02:20
帮你写好了,没有用到任何数组,除了该死的指针操作使用C的stdlib库,完全面向对象:
算法思想曾经发过链接 ...

这是C和C艹的混合语言,并不推荐这么写。C语言正是因为没有class我才用它的。
页: [1]
查看完整版本: C语言中输入任意个数数字记录每个数字出现的次数