编写一个抽奖程序,1到1000以内的数反复滚动,随机按下一个键,显示这个数,只要尾数为8就中奖。
思路:可以不用中断。你只要写个段码的数值,然后在数组里加一个变量。比如“uchardm[]={0xc0,0xa4,0xf9.}“每次按下一个键数组里的变量就加一。做按键的时候要记住去斗。归0的按键就更好写了,只要按下数组里的变量等于0就行了
#include<stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <time.h>
#define AWARDER_NUM 10
typedef struct tag_award
{
char ID[20];
char name[20];
char telNo[20];
char address[50];
}AWARDER;
AWARDER * awarder = new AWARDER[AWARDER_NUM];
int first_award[1] = {-1};
int second_award[2] = {-1,-1};
int third_award[5] ={-1,-1,-1,-1,-1};
int awarder_num = 0;
void info_login()
{
if(awarder_num >= AWARDER_NUM)
{
AWARDER * new_awarder = new AWARDER[awarder_num + AWARDER_NUM];
memcpy(new_awarder,awarder,awarder_num*sizeof(AWARDER));
delete awarder;
awarder = new_awarder;
}
printf("身份证号:");
scanf("%s",awarder[awarder_num].ID);
printf("姓名:");
scanf("%s",awarder[awarder_num].name);
printf("电话号码:");
scanf("%s",awarder[awarder_num].telNo);
printf("家庭住址:");
scanf("%s",awarder[awarder_num].address);
awarder_num++;
}
void info_delete()
{
char name[20];
printf("输入您要删除的抽奖者的姓名:");
scanf("%s",name);
for(int i=0;i<awarder_num;i++)
{
if (strcmp(awarder[i].name,name) == 0)
{
printf("您选择删除的抽奖者的信息如下:\n");
printf("身份证号:%s\n",awarder[i].ID);
printf("姓名:%s\n",awarder[i].name);
printf("电话号码:%s\n",awarder[i].telNo);
printf("家庭住址:%s\n",awarder[i].address);
break;
}
}
if(i == awarder_num)
{
printf("没有找到您输入的抽奖者!\n");
}
else
{
char c;
printf("您确定要删除吗?(Y//N)");
fflush(stdin);
scanf("%c",&c);
if(c == 'Y' || c == 'y')
{
AWARDER * new_award = new AWARDER[awarder_num-1];
if(i <= 0)
memcpy(new_award,awarder+1,sizeof(AWARDER) * (awarder_num - 1));
else if( i >= awarder_num -1)
memcpy(new_award,awarder,sizeof(AWARDER) * (awarder_num - 1));
else
{
memcpy(new_award,awarder,sizeof(AWARDER) * i);
memcpy(new_award+i,awarder+i+1,sizeof(AWARDER) * (awarder_num - i - 1));
}
awarder_num--;
delete awarder;
awarder = new_award;
}
}
}
void info_modify()
{
char name[20];
printf("输入您要修改的抽奖者的姓名:");
scanf("%s",name);
for(int i=0;i<awarder_num;i++)
{
if (strcmp(awarder[i].name,name) == 0)
{
printf("您选择的抽奖者的信息如下:\n");
printf("身份证号:%s\n",awarder[i].ID);
printf("姓名:%s\n",awarder[i].name);
printf("电话号码:%s\n",awarder[i].telNo);
printf("家庭住址:%s\n",awarder[i].address);
break;
}
}
if(i == awarder_num)
{
printf("没有找到您输入的抽奖者!\n");
}
else
{
printf("请输入该抽奖者的新信息:\n");
printf("身份证号:");
scanf("%s",awarder[i].ID);
printf("姓名:");
scanf("%s",awarder[i].name);
printf("电话号码:");
scanf("%s",awarder[i].telNo);
printf("家庭住址:");
scanf("%s",awarder[i].address);
}
}
bool check_over(int cur_award,int awarderNo)
{
if(awarderNo == 1)
{
if(cur_award == first_award[0])
return true;
}
else if(awarderNo <= 3)
{
if(cur_award == first_award[0])
return true;
for(int i=0;i<awarderNo-1;i++)
if(cur_award == second_award[i])
return true;
}
else if(awarderNo <= 8)
{
if(cur_award == first_award[0])
return true;
for(int i=0;i<2;i++)
if(cur_award == second_award[i])
return true;
for(i=0;i<awarderNo-3;i++)
if(cur_award == third_award[i])
return true;
}
return false;
}
void award()
{
if(awarder_num < 8)
{
printf("人数太少,请添加足够的人再抽奖!\n");
return;
}
srand((long)time(0));
char hit_id[20];
printf("\n开始抽第一等奖(1名),按任意键开始...\n");
getch();
while(!kbhit())
{
first_award[0] = rand() % awarder_num;
memcpy(hit_id,awarder[first_award[0]].ID,18);
printf("\r ");
printf("\r %s",hit_id);
}
printf("\n\n开始抽第二等奖(2名)");
for (int i=0;i<2;i++)
{
printf("\n第%d个二等奖,按任意键开始...\n",i+1);
getch();
while(!kbhit())
{
second_award[i] = rand() % awarder_num;
while(check_over(second_award[i],1+i))
second_award[i] = rand() % awarder_num;
memcpy(hit_id,awarder[second_award[i]].ID,18);
printf("\r ");
printf("\r %s",hit_id);
}
}
printf("\n\n开始抽第三等奖(5名)");
for (i=0;i<5;i++)
{
printf("\n第%d个三等奖,按任意键开始...\n",i+1);
getch();
while(!kbhit())
{
third_award[i] = rand() % awarder_num;
while(check_over(third_award[i],3+i))
third_award[i] = rand() % awarder_num;
memcpy(hit_id,awarder[third_award[i]].ID,20);
printf("\r ");
printf("\r %s",hit_id);
}
}
}
void info_show()
{
printf("一等奖获得者:\n");
printf("\t身份证号:%s\n",awarder[first_award[0]].ID);
printf("\t姓名:%s\n",awarder[first_award[0]].name);
printf("\t电话号码:%s\n",awarder[first_award[0]].telNo);
printf("\t家庭住址:%s\n",awarder[first_award[0]].address);
printf("二等奖获得者:\n");
for (int i=0;i<2;i++)
{
printf("第%d个二等奖获得者:\n");
printf("\t身份证号:%s\n",awarder[second_award[i]].ID);
printf("\t姓名:%s\n",awarder[second_award[i]].name);
printf("\t电话号码:%s\n",awarder[second_award[i]].telNo);
printf("\t家庭住址:%s\n",awarder[second_award[i]].address);
}
printf("三等奖获得者:\n");
for (int i=0;i<5;i++)
{
printf("第%d个三等奖获得者:\n");
printf("\t身份证号:%s\n",awarder[third_award[i]].ID);
printf("\t姓名:%s\n",awarder[third_award[i]].name);
printf("\t电话号码:%s\n",awarder[third_award[i]].telNo);
printf("\t家庭住址:%s\n",awarder[third_award[i]].address);
}
}
/*提示信息*/
bool raise()
{
printf("\n请输入你需要的操作代号:\n");
printf("\t1.录入:完成抽奖者信息的输入;\n");
printf("\t2.删除:完成抽奖者信息的删除;\n");
printf("\t3.修改:允许对已经录入的数据重新进行编辑、修改;\n");
printf("\t4.抽奖:开始抽奖!\n");
printf("\t5.显示:显示所有中奖者的信息;\n");
printf("\t6.退出。\n");
printf("==>");
int operate;
fflush(stdin);
scanf("%d",&operate);
switch(operate)
{
case 1:
info_login();
break;
case 2:
info_delete();
break;
case 3:
info_modify();
break;
case 4:
award();
break;
case 5:
info_show();
break;
case 6:
return false;
default:
break;
}
printf("\n操作完成。\n");
return true;
}
void main()
{
while(raise());
}
采用多线程编写的代码,主线程显示抽奖码,子线程等待键盘输入,vs2008编译。代码及效果图如下:如有帮助,请采纳一下,谢谢。
#include <Windows.h>
#include <process.h>
#include <stdlib.h>
int g_stopwork = 0; //0暂停,1开始抽奖,2显示抽奖结果,3结束抽奖
int g_d = 0;
void* DoMyJob(void* p)
{
while(true)
{
char c;//[100]={0};
if (g_stopwork == 0)
{
scanf("%c",&c);
if (c == 'Y' || c == 'y')
{
scanf("%c",&c);
g_stopwork = 1; //开始抽奖
}else
{
g_stopwork = 3; //结束抽奖
//printf("结束抽奖...\n");
return 0;
}
}else if (g_stopwork == 1)
{
scanf("%c",&c);
g_stopwork = 2;
Sleep(200);
}else if (g_stopwork == 2)
{
Sleep(100);
}
else if (g_stopwork == 3)
{
return 0;
}
}
return 0;
}
int main()
{
printf("是否开始抽奖:Y/N\n");
int i;
HANDLE hOut;
COORD pos = {0,0};
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci; //定义结构体
GetConsoleCursorInfo(hOut, &cci); //获取光标信息
cci.dwSize = 1; //设置光标大小
cci.bVisible = 0; //设置光标不可见 FALSE
SetConsoleCursorInfo(hOut, &cci); //设置(应用)光标信息
SetConsoleTextAttribute(hOut, 0x0004|0x0008|0x8000); //设置字体属性
pos.X = 25;
pos.Y = 5;
SetConsoleCursorPosition(hOut,pos); //设置光标坐标
printf("%2d",0);
SetConsoleCursorPosition(hOut,pos);
printf("%2d",g_d);
HANDLE hWnd = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DoMyJob, 0, 0, 0);
CloseHandle(hWnd);
while(true)
{
switch(g_stopwork)
{
case 0:
Sleep(100);
break;
case 1:
g_d = rand() % 1000;
SetConsoleCursorPosition(hOut,pos);
printf("%2d",g_d);
Sleep(100);
break;;
case 2:
if (g_d%10 == 8 )
{
printf("中奖了,是否继续抽奖:Y/N\n");
}else
printf("未中奖,是否继续抽奖:Y/N\n");
g_stopwork = 0;
break;
case 3:
return 0;
}
}
return 0;
}
效果图:
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
#include "stdio.h"
#include "conio.h"
int main(){
int i=1;
//键盘不按下一直循环
while(1){
//如果用户没有按下键,一直循环
if(!kbhit()) {
i++;
//循环到1000,回到1
if(i==1000){
i=1;
}
}else{
getch();
if(i==8 || i%10==8 || i%100%10==8){
printf("恭喜中奖");
}
printf("i=%d\n",i);
}
}
return 0;
}
代码如上,万望采纳。