⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 analy.c

📁 这是一个基于控制台的彩票管理系统
💻 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 + -