| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1674 人关注过本帖, 1 人收藏
标题:不知道咋概括,自己看吧。
只看楼主 加入收藏
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:565
专家分:3690
注 册:2019-7-29
结帖率:93.75%
收藏(1)
已结贴  问题点数:100 回复次数:5 
不知道咋概括,自己看吧。
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define MAX 10

int  names_io(const void *a,const void *b);

struct DATA
{
    int dot;
    int value;
};

int main()
{
    int i=0;
    struct DATA data[MAX]= {0,0};
    int olddot[3]={0},check[3]={0};

    srand(time(0));

    while(1)
    {
        for(i=0; i<MAX; i++)            //数据一直在变化
        {
            data[i].dot=i;
            data[i].value=rand()%30;
        }

        qsort(&data,MAX,sizeof(struct DATA),names_io);  //数据从大到小排序

        /***************这部分不知道如何处理*********************/
        for(i=0; i<3; i++)
        {

            if(olddot[i]==data[i].dot)
            {
                check[i]++;
            }
            else
            {
                olddot[i]=data[i].dot;
                check[i]=0;
            }

            if(check[i]>=10)
            {
                /*********************
                    程序处理部分
                **********************/
                check[i]=0;
            }
        }
        /************************************************/
    }

    return 0;
}

int  names_io(const void *a,const void *b)
{

    float rs;

    rs=(*( struct DATA *)b).value-(*( struct DATA *)a).value;
    if(fabs(rs)<=0.001)
        return 0;
    else
        return rs>0?1:-1;
}


现在有10个数据点及相对应的数据,然后使用函数按数据值大小进行排序。现在取排序后最大的三个点的点号与上次得到的最大的三个点的点号进行比较,如果新的数据的三个点号中某个点的值和上一次的三个点中某个点的点号一样,就分别check记录一次,如果连续10次最大的三个点号都有这个点,那么将check清零进入我的程序处理部分。
A        B        C

a    b    c    d    e
就像这样有三个槽,第一次最大的三个值得点号填进去,第二次判断a b c三个点是否是上次的点号,如果是,就check加一,如果不是,就把ABC中abc不存在的点号清除,换成新的点号,并将check清零计数。

[此贴子已经被作者于2020-3-4 20:32编辑过]

搜索更多相关主题的帖子: check DATA 数据 struct int 
2020-03-04 20:12
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1685
专家分:4252
注 册:2007-12-27
收藏
得分:10 
字面上,初始化数组得带花括号。
另外,一会儿叫olddot一会儿叫olddata是头晕吧。

你的问题在于没想清楚check不是[3]的。
万一一次是a b c,下次是c a e你要check到哪儿啊?
所以是有多少name就有多大的check的。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-03-04 20:29
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:565
专家分:3690
注 册:2019-7-29
收藏
得分:0 
回复 2楼 forever74
字面上,初始化数组得带花括号。
另外,一会儿叫olddot一会儿叫olddata是头晕吧。

这个是疏忽,这个程序只是起到个环境的作用,具体是星号部分的问题。

我现只是提供了check、olddot用来表述我所存在的问题,具体是不是[3]是无所谓的,只要能解决我的问题就行。
万一一次是a b c,下次是c a e你要check到哪儿啊?

这个就是我所需要问的,我需要得到一个点,连续10次都存在在a b c中。如果多于1个点连续10次在a b c中,那就取第10次为最大的值的点。

[此贴子已经被作者于2020-3-4 20:45编辑过]


一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-03-04 20:38
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1685
专家分:4252
注 册:2007-12-27
收藏
得分:70 
以下是引用forever74在2020-3-4 20:29:39的发言:

字面上,初始化数组得带花括号。
另外,一会儿叫olddot一会儿叫olddata是头晕吧。

你的问题在于没想清楚check不是[3]的。
万一一次是a b c,下次是c a e你要check到哪儿啊?
所以是有多少name就有多大的check的


您只看末节,把关键部分轻轻放过了。
这句话的意思是说有多少个点,check就有多少个元素,每个元素对应一个点,最后看看哪个元素得10就行。
这和数一篇文章里有多少大写字母多少小写字母多少数字多少标点没啥本质区别。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-03-05 09:24
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
用随机数连续3个10次dot排位一致,估计到下个世纪也不需要你做处理。
如果没理解错的话,可以修改数据结构为:
struct DATA
{
    int dot;
    int value;
    int one    '排第一位计数
    int two    '排第二位计数
    int three  '排第三位计数
}
然后不需要排序,因为排序会改变dot在数组中的顺序,增加判断复杂度(不改变顺序,似乎结构中的dot元素也是多余的)。只需要扫描三次得到三个排位(由于没有负数,你可以把每次扫到的最大数变成负数,这样下次就不会重新把该数判断为最大),根据前三的排位分别对one++...three++,同时清理其它排位计数。

能编个毛线衣吗?
2020-03-05 20:31
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:10 
我试着理解一下这段程序想做什么:
    1.随机生成max个数字
    2.记录前3大的数字所在序列号
    3.不断重复1.2.步骤,直到 1sd/2nd/3rd 中任何一个位置连续十次录得相同的序列号
-----------------------------------------------------
如果我的理解没错的话,这段代码可以换成如下思路:
程序代码:
int dot[3];//用于存放每次随机获得的前三大value所在dot,即序列号
int flag[3]={0};//用于记录上一次前三dot序列号
int times[3]={0};//分别记录三个flag已经连续重复出现多少次了 
while(true){
    for(int i =0;i<3;i++){
        dot[i]=rand()%Max;//随机生成一个序列号,表示该序列号就是第i大的数字所在位置
        if dot[i]==flag[i]{//表示这一次第i大的value和表格里上一次记载的序列号一样
            if(++times[i]>=10){ //找到了,.......  }
            }else{flag[i]=dot[i];  //不相等的话,就要更新第i大的序列号
                   times[i]=1;//序列重复次数  重置为1
                    }
     }
   
}


同样是随机,我的代码里不用每次都随机MAX个value数据,而是直接随机生成第i大的value所在dot。
这样也不用排序了,相对来说,会省些计算机性能。


-----------------------



[此贴子已经被作者于2020-3-5 22:36编辑过]


φ(゜▽゜*)♪
2020-03-05 22:33
快速回复:不知道咋概括,自己看吧。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017529 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved