📄 analy.c
字号:
/***************************/
/*彩票号码分析模块*/
/**************************/
/**菜单函数***************/
/***********************/
#include "head.h"
void analy(DATA * head)
{
int sel;
char menu[]=
{
"1.彩票号码中连号出现比例情况\n"
"2. 彩票号码在各区间出现比例情况\n"
"3.彩票号码中奇数出现比例情况\n"
"0.结束.\n"
};
if(head==NULL)
{
printf("没有任何号码可被统计分析,按任意键返回!\n");
getch();
return;
}
while(1)
{
printf("%s",menu);
printf("请选择:");
scanf("%d",&sel);
if(sel==0)
break;
if(sel!=1&&sel!=2&&sel!=3)
{
printf("输入错误,按任意键返回上层菜单\n");
getch();
break;
}
switch(sel)
{
case 1:sister_num(head);break;
case 2:during_num(head);break;
case 3:odd_num(head);break;
default:break;
}
}
}
/***************************/
/*********连号函数**********/
/************************/
void sister_num(DATA * head)
{
int a[38]={0};/*使下标与37个数字对应,用a[1]记录1和2的连号,依次类推*/
int i,n,j;
n=0;
p2=p1=head;/**指向头指针**/
if(head==NULL)
{
printf("没有彩票的数据,按任意键返回上层菜单\n");
getch();
return;
}
else
{ /**判断是否有连号,并且有则记录**/
while(p1!=NULL)
{
/**记录数据个数**/
n++;
/***由于彩票号码是由小到大排列的**/
/*所以如前一个号码是后一个号码减1则为连号*/
for(i=0,j=1;i<=6,j<=7;i++,j++)
if(p1->number[i]==(p1->number[j]-1))
a[p1->number[i]]++;/**记录连号,比如若5和6在同一期号码中,
为连号,则将以5为下标的数组加1**/
p1=p1->next;/*下一个结点*/
}
}
printf("彩票号码中连号出现情况:\n");
for(i=1;i<37;i++)
{
if(i%3==0)
printf("\n\n");
//a[i]中记录的是a[i]和a[i+1]的连号情况
//将该记录转化为占彩票号码总期数的百分比输出
printf("%d~%d---:%4.2f%% ",i,i+1,(float)(a[i]*100/n));
}
printf("\n显示完毕,按任意键返回上层菜单!\n");
getch();
}
/**************************/
/*****区间号码模块********/
/****************************/
void during_num(DATA * head)
{
int a[38]={0};/*使下标与37个数字对应,如彩票号码中出现7,则a[7]加1依次类推*/
int high,low,mid,n,i,m;
high=37;/*a[37]是第一个数*/
low=1;/*a[1]是第一个数*/
n=0;
if(head==NULL)
{
printf("没有任何号码可被统计分析,按任意键返回!\n");
getch();
return;
}
/**p1指向头指针**/
p1=head;
//采用对分查找的方法
//前提是1到37已是从小到大排列
while(p1!=NULL)
{
for(i=0;i<=7;i++)/*查找的次数为7次*/
{
high=37;/*最大的数是37,彩票号码的个数也是37个*/
low=1;
while(1)
{
mid=(low+high)/2;/*取整mid为中间的数*/
if(p1->number[i]<mid)/*往小于mid的方向查找*/
high=mid-1;
else
if(p1->number[i]>mid) /*往大于mid的方向查找*/
low=mid+1;
else /*既不大于也不小于,则相等*/
{
a[mid]++;/*比如找到了数字7,则此时mid等于7,a[mid]加1*/
break;
}
}
}
p1=p1->next;/*下一个结点*/
n++;/*记录总的期数*/
}
m=0;
printf("彩票号码在各区间出现比例如下:\n");
for(i=1;i<=35;i++)
{
/*mid记录每5个数组元素的总和*/
m+=a[i];
/**5个5个为一个区间,到第五个则输出该区间号码占总的号码个数的百分比**/
if(i%5==0)
{
printf("%d~~~%d: %4.2f%%\n",i-4,i,(m/(n*8.0)));
m=0;
}
}
/*第36个和第37个独立输出*/
m=a[i]+a[i+1];
printf("%d~~~%d: %4.2f%\n",36,37,(m/(n*8.0)));
printf("显示完毕,按任意键返回上层菜单!\n");
getch();
}
/****************************/
/*****奇数号码***************/
/****************************/
void odd_num(DATA * head)
{
int n,i;
int a[38]={0};/*使下标与37个数字对应*/
n=0;
p2=p1=head;
/**没有彩票的数据**/
if(head==NULL)
{
printf("没有彩票的数据,按任意键返回上层菜单\n");
getch();
return;
}
/**有彩票的数据**/
else
{
while(p1!=NULL)
{
n++; /*n记录总的期数*/
for(i=0;i<=7;i++)
{
if(p1->number[i]%2!=0) /*找到该奇数后,以它为下标的数组元素加1*/
a[p1->number[i]]++;
}
p1=p1->next;/*下一个结点*/
}
}
printf("彩票号码中奇数号码出现情况:\n\n");
for(i=1;i<=37;i++)
{
if(i%3==0)
printf("\n");
/*若为奇数则输出该奇数出现的次数占总的号码个数的百分比*/
if(i%2!=0)
printf("%d :--%4.2f%% ",i,(a[i]/(n*8.0)));
}
printf("\n显示完毕,按任意键返回上层菜单!\n\n");
getch();
}
/***********结束***********/
/***************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -