基于链表的上课随机抽取回答问题系统

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h>
#include<unistd.h>

//每个学生的结构体函数
struct student{
  int num;
  char name[10];

  struct student *next;
};

struct student *list_head()
{
  //给头节点申请空间
  struct student *head =malloc(sizeof(struct student));
  if(head == NULL)
  printf("malloc head error!\n");

  //给头节点的指针域赋值
  head->next = NULL;

  //返回一个head
  return head;
}

//插入新节点函数
void student_new(struct student *head)
{
  //给新节点申请空间
  struct student *new = malloc(sizeof(struct student));
  if(new == NULL)
  printf("malloc new error!\n");

  //给新节点的指针域和数据域赋值
  //数据域赋值
  printf("pls input your num :\n");
  scanf("%d",&new->num);//输入学号

  printf("pls input your name :\n");
  scanf("%s",new->name);//输入名字

  printf("--------------------------------------------\n");

  //指针域赋值
  new->next = NULL;

  //找到最后一个节点
  struct student *p = NULL;
  for (p = head ; p->next != NULL; p = p->next );

  //把最后一个节点的指针指向新节点
  p->next = new;

  return ;
}

//游戏规则函数
int game_fun(struct student *head)
{
  //定义一个字符数组,用来存放go或end
  char gui_ze[10];
  //用来存放随机数
  int a;
  //用来存放学生个数
  int b = 0;

  //定义一个结构体指针来循环寻找相应的节点
  struct student *p = NULL;

  //判断出一共有多少个学生
  for (p = head; p->next != NULL; p = p->next)
  {
     b++;
  }
  printf("--------------------------------------------\n");
  printf(" 学生个数为:%d \n",b);//打印一下一共有多少个学生
  printf("--------------------------------------------\n");

  while(1)//死循环
  {
    //打印一下游戏规则
    printf("开始游戏则输入(go),结束游戏则输入(end)!\n");

    //在这里输入
    printf("请输入:");
    scanf("%s",gui_ze);//从键盘中获取go来开始游戏,输入end来结束游戏

    if(strcmp(gui_ze,"go") == 0 )//判断是go,正确
    {
head:
      //取随机数
      srand((unsigned)time(NULL));
      a = rand()%b;

      //判断如果a等于0,就直接跳回取随机数
      if ( a == 0 )
        goto head;
      //否则继续运行程序
      else
        goto end;

end:
      //循环对比学号,找到是哪个同学
      for (p = head->next ; p->num != a ; p = p->next);
      //打印出那个同学起来回答问题
      printf("请%s同学起来回答问题!\n",p->name);
      printf("--------------------------------------------\n");

    }

    else if(strcmp(gui_ze,"end")==0)//判断是end,正确
    {
      return 1;
    }

    else//输入的东西既不是go,也不是end
    {
      printf("输入错误,请从新输入!\n");
    }

  }

}

//开机页面
void kai_ji_catoon()
{
  printf("------------------------------------------------\n");
  printf(" \n");
  printf(" \n");
  printf(" 欢迎使用随机抽同学回答问题系统 \n");
  printf(" \n");
  printf(" \n");
  printf("------------------------------------------------\n");

  sleep(2);//延迟3秒
  return ;
}

//系统主页面
void zhu_ye_mian()
{
  printf("------------------------------------------------\n");
  printf(" \n");
  printf(" 1、加入新的同学进行游戏 \n");
  printf(" 2、进入游戏 \n");
  printf(" 3、退出程序 \n");
  printf(" \n");
  printf("------------------------------------------------\n");

  return ;
}

//主函数
int main(int argc, char const *argv[])
{
  //调用开机动画函数
  kai_ji_catoon();

  //初始化头节点
  struct student *head = NULL;
  head = list_head();

  int choice;//用来输入选择的选项
  //是循环加分支,连完成功能的选择
  while (1)
  {
    //调用系统主页面函数
    zhu_ye_mian();

    //输入你的选项
    printf("请输入你的选择:\n");
    scanf("%d",&choice);

    //分支选项
    switch (choice)
    {
      case 1:
        //插入新节点,也就是注册新的同学进行游戏
        student_new(head);
      break;

      case 2:
        //调用游戏函数
        game_fun(head);
      break;

      case 3:
        printf("结束游戏中。。。。。。\n");
        sleep(3);
        return 0;

      default:
        printf("输入错误,请重新输入:\n");
      break;
    }

  }

}

posted @ 2022-01-18 11:52  yio先生  阅读(132)  评论(0)    收藏  举报