2019.12.3
如图为运行效果
抢红包.png
输入的名字的时候即可中文也可英文
1.输入中文:打完拼音后按下空格键即可
2.输入英文需两次回车,也可先shift,再输入,再回车
该程序用到的知识
1.for循环:主要是对循环变量i的灵活使用,另外就是寻找运气王用到了选择排序的模板
2.数组:主要是二维数组存储名字,用二维数组的首地址可以很方便的存储字符串,输出也一样
3.rand函数:与rand函数相关的东西之前写的很详细,这里只补充说明rand函数的参数必须是整型值,所以对于带小数的红包需要强制转换,涉及到精度问题,精度没把握好很容易导致红包金额不对,所以采取先扩大后还原的方法,另外就是对浮点数值的计算结果先保存一下,再进行类型转换
#include
#include
#include
int main(){
unsigned seed=time(NULL);
srand(seed);
printf("请输入参与者姓名数量:");//确定红包数量
int num=0;
scanf("%d",&num) ;
printf("\n");
printf("请输入参与者姓名:\n");
char name[50][50]={};
//用二维数组来储存名字
for(int i=0;i
scanf("%s",name[i]);
printf("\n");
}
//利用循环输入玩家名字
printf("请输入金额:");
int total;
scanf("%d",&total);//输入总金额
double sum=0.0;
//用sum记录已被获取的红包金额总和
double get[100]={};
//用浮点型数组存储每个玩家抢到的红包
for(int i=0;i
if(i==num-1){
get[i]=total-sum;
break;
//如果是最后一个玩家的话,直接用总金额减去获取的红包总和即可
}
float x=(float)((total-sum)*100+1-(num-i));
/*对计算结果声明一下,不至于导致精度丢失
由于rand函数参数为整型,所以扩大一百倍,避免小数部分丢失*/
get[i]=(rand()%(int)x+1)/100.0;
//对x进行强转,计算结果除以100复原
sum+=get[i];
//累加已获红包金额
}
double sum1=0.0;
for(int i=0;i
printf("%s抢到:%.2f\n",name[i],get[i]);
printf("\n") ;
sum1+=get[i];
}//对所有红包进行求和,并输出每个人抢到的红包
int temp=0;//记录get数组最大元素的下标
float t=get[temp];
for(int i=0;i
if(t
t=get[i+1];
temp=i+1;
}
/*取出第一个元素默认最大,然后逐个比较
发现比它大的元素便交换,temp跟着变*/
}
printf("\n");
printf("恭喜%s成为本次红包运气王!\n",name[temp]);
printf("总金额:%.1f\n",sum1);
fflush(stdin);
printf("请按任意键结束!");
getchar();
return 0;
}
为了照顾手速慢的玩家,红包最小金额设置为0.01元