//本程序是博主学习C Primer Plus时无意中想到的一个小点子;
//使用的均是C标准库(可移植程序);
//可在Linux/Mac os/Windows下运行;
//未经允许严禁抄袭以及转载;
//源代码奉上,希望能够对您有所启发;
//C语言彩票抽奖小程序.c
#include <stdio.h>
#include <time.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#define LEN 99
#define SLEN 6
int show_menu(void); //显示抽奖菜单;
int get_first(void); //获取用户输入;
void init(int ar[], int len); //抽奖号码初始化;
void show_result(void); //显示用户是否中奖;
void show_datas(void); //显示用户抽奖的数据;
void delay(void); //延迟时间;
void random_pick(int ar[], int len, int picks);
void random_result(int ar[], int len, int picks);
int times = 0; //统计用户抽奖次数;
int win_award = 0; //统计用户中奖次数;
float winning_percent = 0.0f; //统计用户获奖率;
int store_result[SLEN], store_temp[SLEN]; //储存用户和抽奖结果的数据;
int main(void)
{
int ch, choices[LEN];
init(choices, LEN);
while ((ch = show_menu()) != 'n')
{
random_pick(choices, LEN, SLEN);
delay();
random_result(choices, LEN, SLEN);
show_result();
}
show_datas();
return 0;
}
void delay(void)
{
clock_t start = clock();
clock_t end = clock();
printf("正在抽奖中...请稍候...\n");
while (((double)(end - start) / CLOCKS_PER_SEC) < 1) //延迟1秒;
{
end = clock();
}
return;
}
void show_datas(void)
{
puts("抽奖完成!以下为您的抽奖数据:");
if (0 == times)
{
printf("抽奖次数:0次\n中奖次数:0次\n获奖率:0\n");
}
else if (times > 0)
{
winning_percent = (float)win_award / times;
printf("抽奖次数:%d次\n中奖次数:%d次\n获奖率:%.2f\n", times, win_award, winning_percent);
}
return;
}
int show_menu(void)
{
int ch;
puts("=======================================");
puts(" 欢迎进入彩票抽奖系统! ");
puts(" 规则如下: ");
puts(" 一等奖: 6个号码全中 (100元)");
puts(" 二等奖: 中了5个号码 (50元)");
puts(" 三等奖: 中了3或4个号码 (20元)");
puts(" 鼓励奖: 中了1或2个号码 (5元)");
puts("=======================================");
printf("请输入选择是否开始抽奖(y/n): ");
ch = get_first();
while (strchr("yn", ch) == NULL)
{
printf("抱歉,您的选择无效,请您重新输入: ");
ch = get_first();
}
return ch;
}
int get_first(void)
{
int ch;
do
{
ch = tolower(getchar());
} while (isspace(ch));
while (getchar() != '\n')
continue;
return ch;
}
void init(int ar[], int len)
{
int i;
for (i = 0; i < len; i++)
{
ar[i] = i + 1;
}
return;
}
void random_pick(int ar[], int len, int picks) //用户抽奖结果;
{
int count = 0;
int i, br[len];
memcpy(br, ar, len * sizeof(int)); //使用一个临时数组保护原数组内容;
srand((unsigned int)time(0));
printf("您抽奖的%d个数字是:\n", picks);
while (picks > 0)
{
i = rand() % len;
if (0 == br[i]) //判断是否重复;
{
continue;
}
else
{
store_temp[count++] = br[i];
printf("%-8d", br[i]);
br[i] = 0; //置0避免获取重复数字;
--picks; //递减获取数字的个数;
}
}
putchar('\n');
return;
}
void random_result(int ar[], int len, int picks) //本期开奖结果;
{
int count = 0;
int i, br[len];
memcpy(br, ar, len * sizeof(int));
srand((unsigned int)time(0) * 100);
printf("本期开奖结果是:\n");
while (picks > 0)
{
i = rand() % len;
if (0 == br[i])
{
continue;
}
else
{
store_result[count++] = br[i];
printf("%-8d", br[i]);
br[i] = 0;
--picks;
}
}
putchar('\n');
return;
}
void show_result(void)
{
int i, temp;
for (i = temp = 0; i < SLEN; i++)
{
if (store_result[i] == store_temp[i]) //全局变量判断用户的抽奖结果;
{
temp++;
}
}
//↓若中奖则统计次数;
switch (temp)
{
case 0:
{
printf("抱歉!您没有中奖!感谢您的支持!\n");
break;
}
case 1:
case 2:
{
printf("请再接再厉!您获得了鼓励奖!\n");
++win_award;
break;
}
case 3:
case 4:
{
printf("恭喜中奖!您获得了三等奖!\n");
++win_award;
break;
}
case 5:
{
printf("恭喜中奖!您获得了二等奖!\n");
++win_award;
break;
}
case 6:
{
printf("恭喜中奖!您获得了一等奖!\n");
++win_award;
break;
}
}
++times; //累增抽奖次数;
printf("\n\n\n\n");
return;
}
//-------------
//----------------------------2020年4月26日 -------------------------------