关于c语言的编程解答

编写一个抽奖程序,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;
} 

代码如上,万望采纳。