C语言原创实验项目简单案例一(模拟彩票抽奖)

//本程序是博主学习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日 -------------------------------

猜你喜欢

转载自blog.csdn.net/m0_46181359/article/details/105772686