[讨论]36选7
大家好,以下是我写的一个小程序,我觉得在判断每次随机产生的数字是否已经存在时有些问题,诸如:当j=0时,temp[j-1],temp[j-2]就可能存在错误,我用一个同样可能出现数组下标为负数的数组与其进行比较,解决了问题,可觉得还是不够欠妥,请高手多多指点,有没有什么更好的方法,小弟在这里先谢谢了。/****************************************************************
作者:非凡DZ
创建时间:2007年4月11日
编译环境:VC6.0
描述:36选7体育彩票(第一版)
*****************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int jisuan(int);
void function()
{
int i,j,k,m,n,q,number[50],select,count=0,count1=0,zhushu=0,zhushu1=0,sign;
int a[50],temp1[50],temp[50],temp2,temp3;
int cost1=0,cost2=0;
char ans,ans1;
char x[50];
srand(time(NULL));
do
{
do //判断输入数据是否在0-4之间
{
i=0,sign=1;
printf("\t\t欢迎购买36选7体育彩票\n");
printf("\n0.退出\t1.机选\t2.手选\t3.结算\t4.关于\n");
printf("请选择功能:");
scanf("%s",&x);
while(x[i])
{
if(x[i]<48||x[i]>57)
{
sign=0;
printf("\n输入有误,请在0-4之间选择!\n\n");
break;
}
i++;
}
if(sign==1)
{
break;
}
}while(1);
select=atoi(x); //将字符串转换为整型
switch(select)
{
case 0: //退出程序
if((zhushu>0) || (zhushu1>0))
{
printf("\n您已经购买了彩票,请结算后退出!\n\n");
break;
}
while(1)
{
printf("\n您还未购买彩票,是否退出(y/n)");
scanf(" %c",&ans);
if(ans=='y' || ans=='Y')
{
printf("\n欢迎光临本系统,再见!\n");
break;
}
if(ans=='n' || ans=='N')
{
printf("\n");
break;
}
else
{
printf("\n提示:请在y和n之间进行选择!\n");
continue;
}
}
break;
case 1: //机选号码
if(zhushu>0)
{
printf("您已经购买了机选号码!\n\n");
break;
}
do
{
i=0,sign=1;
printf("请输入要购买的彩票注数:");
scanf("%s",&x);
while(x[i])
{
if(x[i]<48||x[i]>57)
{
sign=0;
printf("\n输入有误!\n\n");
break;
}
i++;
}
if(sign==1)
{
break;
}
}while(1);
zhushu=atoi(x); //将字符串转换为整型
for(i=0;i<zhushu;i++)
{
for(j=0;j<1000;j++)
{
number[j]=rand()%100;
if(count==7)
{
break;
}
if((number[j]<1) || (number[j]>36) || (number[j]==temp[j]) || (number[j]==temp[j-1]) || (number[j]==temp[j-2]) || (number[j]==temp[j-3]) || (number[j]==temp[j-4]) || (number[j]==temp[j-5]) || (number[j]==temp[j-6]))
{
j-=1;
continue;
}
else
{
temp[j]=number[j];
count++;
}
}
count=0;
for(m=0;m<6;m++) //对每注彩票数字进行冒泡排序
{
for(n=6;n>m;n--)
{
if(temp[n]<temp[n-1])
{
temp3=temp[n];
temp[n]=temp[n-1];
temp[n-1]=temp3;
}
}
}
printf("\n第%d注为:",i+1);
for(m=0;m<7;m++)
{
printf("%d ",temp[m]);
}
}
cost1=jisuan(zhushu);
printf("\n\n");
break;
case 2: //手选号码
if(zhushu1>0)
{
printf("您已经购买了手选号码!\n\n");
break;
}
do
{
i=0,sign=1;
printf("请输入要购买的彩票注数:");
scanf("%s",&x);
while(x[i])
{
if(x[i]<48||x[i]>57)
{
sign=0;
printf("\n输入有误!\n\n");
break;
}
i++;
}
if(sign==1)
{
break;
}
}while(1);
zhushu1=atoi(x); //将字符串转换为整型
if(zhushu1>0)
{
printf("请在1-36之间进行选择!\n");
}
for(i=0;i<zhushu1;i++)
{
printf("\n请输入第%d注彩票数字:\n\n",i+1);
for(j=0;j<1000;j++)
{
if(count1==7)
{
break;
}
do
{
q=0,sign=1;
printf("请输入第%d个数:",j+1);
scanf("%s",&x);
while(x[q])
{
if(x[q]<48||x[q]>57)
{
sign=0;
printf("\n输入有误!\n\n");
break;
}
q++;
}
if(sign==1)
{
break;
}
}while(1);
a[j]=atoi(x); //将字符串转换为整型
temp1[j]=a[j];
count1++;
if((a[j]<1) || (a[j]>36) || (a[j]==temp1[j-1]) || (a[j]==temp1[j-2]) || (a[j]==temp1[j-3]) || (a[j]==temp1[j-4]) || (a[j]==temp1[j-5]) || (a[j]==temp1[j-6]))
{
printf("输入数字有误,请重新输入!\n\n");
count1-=1;
j-=1;
continue;
}
}
for(m=0;m<6;m++) //对每注彩票数字进行冒泡排序
{
for(n=6;n>m;n--)
{
if(a[n]<a[n-1])
{
temp2=a[n];
a[n]=a[n-1];
a[n-1]=temp2;
}
}
}
printf("\n第%d注彩票为:\n",i+1); //输出每注彩票
for(k=0;k<7;k++)
{
printf("%d ",a[k]);
}
count1=0;
}
cost2=jisuan(zhushu1);
printf("\n\n");
break;
case 3: //结算程序
if((zhushu>0) || (zhushu1>0))
{
printf("\n您购买了%d注机选号码,%d注手选号码!\n",zhushu,zhushu1);
printf("共%d注彩票,需付%d元!\n",zhushu+zhushu1,cost1+cost2);
while(1)
{
printf("\n是否结算并退出(y/n)");
scanf(" %c",&ans1);
printf("\n");
if(ans1=='y' || ans1=='Y')
{
printf("感谢您对中国体育事业的支持!\n\n");
exit(0); //正常跳出程序
}
if(ans1=='n' || ans1=='N')
{
break;
}
else
{
printf("提示:请在y和n之间进行选择!\n");
continue;
}
}
break;
}
else
{
printf("\n您还未购买彩票,请重新进行选择!\n\n");
break;
}
case 4: //关于
printf("\n\t本系统为36选7体育彩票第一版\n");
printf("\n\t开发者:非凡DZ\n");
printf("\n\t联系方式:daizhenghenry@yahoo.com.cn\n\n\n");
break;
default:
printf("\n输入有误,请在0-4之间选择!\n\n");
}
}while(ans!='y' && ans!='Y');
}
int jisuan(int q) //结算函数
{
int result;
result=2*q;
return result;
}
void main()
{
function();
}
[此贴子已经被作者于2007-5-7 8:15:02编辑过]