zhanghuiyyds 2021-06-21 19:16 采纳率: 100%
浏览 54
已采纳

考务管理程序的设计与实现源代码c语言

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#define QUIT 0//退出程序的功能代码 
#define CLEAR_INPUT_BUFF(c)while((c=getchar())!=EOF&&c!='\n'//清除控制台输入缓存
#define CODE 18//学校代码
//存储学生信息的结构体
typedef struct
{
    int num;
    char name[20] ;
    char testID[9];//准考证号8位,最后一位 '\0'
 } Student;
 //表示学生单链表结构体
 typedef struct StuNode
 {
     Student student;
     struct StuNode*next;//指向下一个学生信息节点 
  } StudentNode;
//表示学生单链表结构体
typedef struct
{
    StudentNode*firstNode;
    StudentNode*endNode;
    int length;
 } StudentChain;
 //创建一个存储考生信息的单链表
 StudentChain*CreateStudentChain()
 {
     StudentChain*stuChain=(StudentChain*)malloc(sizeof(StudentChain));
     if(NULL==stuChain)
       return NULL;
    else
    {
        stuChain->firstNode=NULL;
        stuChain->length=0;
    }
    return stuChain;
  } 
//根据传入的一个考生信息动态创建一个StudentNode节点并返回
StudentNode*CreateStudentNode(int num,char name[]) 
{
    StudentNode*stuNode=(StudentNode*)malloc(sizeof(StudentNode));
    if(NULL==stuNode)
       return NULL;
    else 
    {
        stuNode->student.num=num;
        strncpy(stuNode->student.name,name,20);
        stuNode->student.name[19]='\0';
        stuNode->student.testID[0]='\0';
        stuNode->next=NULL;
    }
    return stuNode;
}
//把一个考生信息节点添加到单链表末尾
void ChainAppendNode(StudentChain*stuChain,StudentNode*node) 
{
    if(NULL==stuChain||NULL==node)
       return;
    if(stuChain->length==0)
    {
        stuChain->firstNode=node;
        stuChain->endNode=node;
        stuChain->length=1; 
    }
    else
    {
        stuChain->endNode->next=node;
        stuChain->endNode=node;
        stuChain->length++;
    }
}
//根据索引值返回考生信息节点
StudentNode*GetStudentNodeByIndex(StudentChain*stuChain,int index)
{
    int i=0;
    StudentNode*tmpP=NULL;
    if(NULL==stuChain||index<0||stuChain->length<=index)return NULL;
    tmpP=stuChain->firstNode;
    for( ;i<index;i++)
    {
        tmpP=tmpP->next;
    }
    return tmpP;
 } 
 //销毁单链表(释放内存)
 void DestroyChain(StudentChain*stuChain)
 {
     StudentNode*tmpNode=NULL;
     StudentNode*curNode=NULL;
     if(NULL==stuChain||stuChain->length==0)
         return;
     curNode=stuChain->firstNode;
     tmpNode=curNode->next;
     for( ;curNode!=NULL; )
     {
         free(curNode);
         curNode=tmpNode;
         tmpNode=curNode->next;
     }
     free(stuChain);
  } 
//显示功能菜单,等待用户输入功能代码
//返回值说明:返回功能号
int SelectCommand()
{
    int cmdNum=0;
    int ch=0;
    printf("\n");
    printf("[1]输入考生信息\n");
    printf("[2]生成准考证号并显示(座位号随机生成)\n");
    printf("[3]考试日程表的查询\n");
    printf("[0]退出(注:输入非数字字符也可以退出)\n");
    scanf("%d",&cmdNum);
    CLEAR_INPUT_BUFF(ch);
//清除控制台输入缓存
    if (cmdNum!=1&&cmdNum!=2&&cmdNum!=0&&cmdNum!=3) 
    {
        printf("输入的功能编号不正确(应该为1、2或者0)!\n\n");
    }
    else
        return cmdNum;    
 } 
 //显示考生信息
 void DisplayStuInfo(StudentChain*stuChain)
 {
     StudentNode*curNode=NULL;
     char testId[9];
     if(NULL==stuChain||stuChain->length==0)
     {
         printf("当前没有任何考生信息!请录入\n");
         return;
     }
     printf("******************************************************************\n");
     printf("学号\t姓名\t准考证号\t考场号\t座位号\n");
     printf("------------------------------------------------------------------\n");
     for(curNode=stuChain->firstNode;curNode!=NULL;curNode=curNode->next)
     {
         strncpy(testId,curNode->student.testID,9);
         if('\0'==testId[0])
         {
             printf("%d\t%s\t%s\t%s\t%s",
             curNode->student.num,
             curNode->student.name,
             "","","\n");
         }
         else
         {
             printf("%d\t%s\t%s\t%c%c\t%c%c\n",
             curNode->student.num,
             curNode->student.name,
             curNode->student.testID,
             curNode->student.testID[0],
             curNode->student.testID[1],
             curNode->student.testID[6],
             curNode->student.testID[7]);
         }
      } 
      printf("******************************************************************\n");
}
//获得用户输入的考生信息并且保存到结构体参数中
//返回值说明:-1输入不正确,0表示不想继续录入,1表示继续录入       
      int InputStudentInfo(int*num,char name[20]) 
{
    int ch=0;
    int quit='\0';
    name[0]='\0';
    printf(">");
    scanf("%d,%s",num,name);
    CLEAR_INPUT_BUFF(ch);
    if(*num<10)
    {
        printf("~~~~输入错误:学号必须于少于两位数!\n");
        return -1;
    }
    if(strlen(name) ==0
    {
        printf("~~~~输入错误:考生姓名不能为空!\n");
        return -1;
    }
    printf("保存成功!是否继续录入?(y/n)");
    quit = getchar();
    CLEAR_INPUT_BUFF(ch);
    if(quit != 'y' && quit != 'Y')
       return 0;
    return 1;    
}
//随机生成俩整数间的整数(包括sNum,eNum)
//返回值说明:-1表示参数不正确
int RandNum(int sNum,int eNum) 
{
    int num = -1;
    if(sNum <0 || eNum <0 || eNum<sNum) return num;
    if(sNum == eNum) return sNum;
    num = rand() % (eNum - sNum +1) + sNum;
    return num;
}
//在一个整数数组查找findNum,如果找到则返回索引值,否则返回-1
int IndexOf(int findNum,int *nums,int count) 
{
    int i=0;
    if(NULL == nums || count<=0) return -1;
    for(; i<count ; i++)
    {
        if(findNum == nums[i]) return i;
    }
    return -1;
}
//生成sNum-eNum之间(包含sNum,eNum)的count个随机数
//参数说明:-1表示参数不正确,-2表示内存不足
int  CreatRandNums(int sNum,int eNum,int * nums,int count) 
{
    int i=0;
    int * tmpNums = NULL;
    int tmpRandNum = -1;
    if(sNum <0 ||eNum<0|| eNum<sNum || count<0 || NULL == nums || eNum - sNum +1< count) return -1;
    if(NULL ==(tmpNums = (int *)malloc(sizeof(int) * count))) return -2;
    for( ; i<count ; i++)
    {
        tmpRandNum = RandNum(sNum,eNum);
        if(-1 == IndexOf(tmpRandNum , tmpNums , count))
        {
            tmpNums[i] = tmpRandNum;
        }
        else
            i--; //座位号已被分配,重新生成 
    }
    //复制生成的座位号
    memcpy(nums,tmpNums,sizeof(int) * count) ;
    free(tmpNums);//释放内存
    return 0; 
}
//生成准考证号
//返回值说明:-1表示参数不正确,-2表示内存不足
int CreateTestId(StudentChain * stuChain,int maxStuCount) 
{
    int i=0 , j=0;
    int maxExamRoom=0;
    //int remain = 0;
    int * seats = NULL;
    int arranged = 0;//表示已被安排座位的考生人数
    int remain = 0;//剩余考生人数
    int curRoomStus = 0;//当前考场人数
    char num[20];//学号
    StudentNode * tmpStuNode = NULL;
    if(NULL == stuChain || maxStuCount<=0) return -1;
    seats = (int *)malloc(sizeof(int) * maxStuCount);
    if(NULL ==(seats = (int *)malloc(sizeof(int) * maxStuCount))) return -2;
    //计算最多需要几个考场 
    maxExamRoom = stuChain->length / maxStuCount;
    remain = stuChain->length % maxStuCount;
    if(remain >0) maxExamRoom ++;
    //对每个考场进行座位安排    
    for(i=1 ; i<=maxExamRoom ; i++) 
    {
        remain = stuChain->length - arranged;
        curRoomStus = (remain > maxStuCount?maxStuCount:remain);
        if(CreateRandNums(1,curRoomStus,seats,curRoomStus)>=0)
           {
               for(j=0;j<curRoomStus;j++)
               {
                   if((tmpStuNode = GetStudentNodeByIndex(stuChain,arranged)) !=NULL)               
                {
                    num[sprintf(num,"%d",tmpStuNode->student.num)] = '\0';
                    if(strlen(num)<2) contiune;
                    //准考证组成:两位考场号 两位学校代码 考生学号前两位 两位座位号 
                    sprintf(tmpStuNode->student.testID,"%02d%02d%c%c%02d", i ,CODE , num[0] , num[1] , seats[j]);
                    arranged ++;
                }
            }
        }
    }
    free(seats);
    return 0;
}
int main()
{ int cmdNum = 0;//用于存储功能号
  int t;
  int errorCode = 0;//用于存储函数返回的错误号
  int num = 0;//学号
  char name[20];//考生姓名
  int maxStuCount = 0;//考场最多容纳考生人数
  int ch=0;//用于清楚输入缓存
  StudentChain * stuChain = CreateStudentChain();
  if(NULL==stuChain)
      return 1;
  while((cmdNum=SelectCommand()) != QUIT)
  {
      switch(cmdNum) 
      { 
      case1:
          printf("\n考生信息录入(输入格式:学号,姓名)\n");
          while(1)
          {
              errorCode = InputStudentInfo(&num,name);
              if(errorCode==-1)
                break;
              else
              {
                  StudentNode *stuNode= CreateStudentNode(num,name);
                  ChainAppendNode(stuChain,stuNode);
                  if(errorCode ==0)
                  {
                      printf("\n当前共%d条考生信息\n\n",stuChain->length);
                      break;
                }
            }
        }
       break;
    case 2:
         printf("\n生成准考证号\n");
         printf(">考场最多容纳考生人数:");
         scanf("%d",&maxStuCount);
         CLEAR_INPUT_BUFF(ch);//清除输入缓存
         if(maxStuCount<=0) 
         {
             printf("~~~~~~考场最多容纳考生人数必须大于0\n");
         }
         CreateTestId(stuChain,maxStuCount);
         DisplayStuInfo(stuChain);
         break;
    case 0:
        return 0;
        break;
    case 3:printf("\n输入日期(1~3号)\n");
        scanf("%d",&t);
         switch(t)
    {
    case 1:printf("\n1号上午考c++和下午考历史\n");break;
    case 2:printf("\n2号上午考英语和下午考管理学\n");break;
    case 3:printf("\n3号上午考数据结构和下午考数学\n");break;
        }
        break;
      }
   } 
   return 0;
}

你好,能把我这里面七个错误改了吗?

  • 写回答

2条回答 默认 最新

  • 暖晴的天 2021-06-21 19:24
    关注

    如果满意请采纳,谢谢 

    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define QUIT 0//退出程序的功能代码 
    #define CLEAR_INPUT_BUFF(c)while((c=getchar())!=EOF&&c!='\n');//清除控制台输入缓存
    #define CODE 18//学校代码
    
    //存储学生信息的结构体
    typedef struct
    {
        int num;
        char name[20];
        char testID[9];//准考证号8位,最后一位 '\0'
    } Student;
    //表示学生单链表结构体
    typedef struct StuNode
    {
        Student student;
        struct StuNode* next;//指向下一个学生信息节点 
    } StudentNode;
    //表示学生单链表结构体
    typedef struct
    {
        StudentNode* firstNode;
        StudentNode* endNode;
        int length;
    } StudentChain;
    //创建一个存储考生信息的单链表
    StudentChain* CreateStudentChain()
    {
        StudentChain* stuChain = (StudentChain*)malloc(sizeof(StudentChain));
        if (NULL == stuChain)
            return NULL;
        else
        {
            stuChain->firstNode = NULL;
            stuChain->length = 0;
        }
        return stuChain;
    }
    //根据传入的一个考生信息动态创建一个StudentNode节点并返回
    StudentNode* CreateStudentNode(int num, char name[])
    {
        StudentNode* stuNode = (StudentNode*)malloc(sizeof(StudentNode));
        if (NULL == stuNode)
            return NULL;
        else
        {
            stuNode->student.num = num;
            strncpy(stuNode->student.name, name, 20);
            stuNode->student.name[19] = '\0';
            stuNode->student.testID[0] = '\0';
            stuNode->next = NULL;
        }
        return stuNode;
    }
    //把一个考生信息节点添加到单链表末尾
    void ChainAppendNode(StudentChain* stuChain, StudentNode* node)
    {
        if (NULL == stuChain || NULL == node)
            return;
        if (stuChain->length == 0)
        {
            stuChain->firstNode = node;
            stuChain->endNode = node;
            stuChain->length = 1;
        }
        else
        {
            stuChain->endNode->next = node;
            stuChain->endNode = node;
            stuChain->length++;
        }
    }
    //根据索引值返回考生信息节点
    StudentNode* GetStudentNodeByIndex(StudentChain* stuChain, int index)
    {
        int i = 0;
        StudentNode* tmpP = NULL;
        if (NULL == stuChain || index < 0 || stuChain->length <= index)return NULL;
        tmpP = stuChain->firstNode;
        for (; i < index; i++)
        {
            tmpP = tmpP->next;
        }
        return tmpP;
    }
    //销毁单链表(释放内存)
    void DestroyChain(StudentChain* stuChain)
    {
        StudentNode* tmpNode = NULL;
        StudentNode* curNode = NULL;
        if (NULL == stuChain || stuChain->length == 0)
            return;
        curNode = stuChain->firstNode;
        tmpNode = curNode->next;
        for (; curNode != NULL; )
        {
            free(curNode);
            curNode = tmpNode;
            tmpNode = curNode->next;
        }
        free(stuChain);
    }
    //显示功能菜单,等待用户输入功能代码
    //返回值说明:返回功能号
    int SelectCommand()
    {
        int cmdNum = 0;
        int ch = 0;
        printf("\n");
        printf("[1]输入考生信息\n");
        printf("[2]生成准考证号并显示(座位号随机生成)\n");
        printf("[3]考试日程表的查询\n");
        printf("[0]退出(注:输入非数字字符也可以退出)\n");
        scanf("%d", &cmdNum);
        CLEAR_INPUT_BUFF(ch);
        //清除控制台输入缓存
        if (cmdNum != 1 && cmdNum != 2 && cmdNum != 0 && cmdNum != 3)
        {
            printf("输入的功能编号不正确(应该为1、2或者0)!\n\n");
        }
        else
            return cmdNum;
    }
    //显示考生信息
    void DisplayStuInfo(StudentChain* stuChain)
    {
        StudentNode* curNode = NULL;
        char testId[9];
        if (NULL == stuChain || stuChain->length == 0)
        {
            printf("当前没有任何考生信息!请录入\n");
            return;
        }
        printf("******************************************************************\n");
        printf("学号\t姓名\t准考证号\t考场号\t座位号\n");
        printf("------------------------------------------------------------------\n");
        for (curNode = stuChain->firstNode; curNode != NULL; curNode = curNode->next)
        {
            strncpy(testId, curNode->student.testID, 9);
            if ('\0' == testId[0])
            {
                printf("%d\t%s\t%s\t%s\t%s",
                    curNode->student.num,
                    curNode->student.name,
                    "", "", "\n");
            }
            else
            {
                printf("%d\t%s\t%s\t%c%c\t%c%c\n",
                    curNode->student.num,
                    curNode->student.name,
                    curNode->student.testID,
                    curNode->student.testID[0],
                    curNode->student.testID[1],
                    curNode->student.testID[6],
                    curNode->student.testID[7]);
            }
        }
        printf("******************************************************************\n");
    }
    //获得用户输入的考生信息并且保存到结构体参数中
    //返回值说明:-1输入不正确,0表示不想继续录入,1表示继续录入       
    int InputStudentInfo(int* num, char name[20])
    {
        int ch = 0;
        int quit = '\0';
        name[0] = '\0';
        printf(">");
        scanf("%d,%s", num, name);
        CLEAR_INPUT_BUFF(ch);
        if (*num < 10)
        {
            printf("~~~~输入错误:学号必须于少于两位数!\n");
            return -1;
        }
        if (strlen(name) == 0)
        {
            printf("~~~~输入错误:考生姓名不能为空!\n");
                return -1;
        }
    
        printf("保存成功!是否继续录入?(y/n)");
        quit = getchar();
        CLEAR_INPUT_BUFF(ch);
        if (quit != 'y' && quit != 'Y')
            return 0;
        return 1;
    }
    //随机生成俩整数间的整数(包括sNum,eNum)
    //返回值说明:-1表示参数不正确
    int RandNum(int sNum, int eNum)
    {
        int num = -1;
        if (sNum < 0 || eNum < 0 || eNum < sNum) return num;
        if (sNum == eNum) return sNum;
        num = rand() % (eNum - sNum + 1) + sNum;
        return num;
    }
    //在一个整数数组查找findNum,如果找到则返回索引值,否则返回-1
    int IndexOf(int findNum, int* nums, int count)
    {
        int i = 0;
        if (NULL == nums || count <= 0) return -1;
        for (; i < count; i++)
        {
            if (findNum == nums[i]) return i;
        }
        return -1;
    }
    //生成sNum-eNum之间(包含sNum,eNum)的count个随机数
    //参数说明:-1表示参数不正确,-2表示内存不足
    int CreateRandNums(int sNum, int eNum, int* nums, int count)
    {
        int i = 0;
        int* tmpNums = NULL;
        int tmpRandNum = -1;
        if (sNum < 0 || eNum < 0 || eNum < sNum || count < 0 || NULL == nums || eNum - sNum + 1 < count) return -1;
        if (NULL == (tmpNums = (int*)malloc(sizeof(int) * count))) return -2;
        for (; i < count; i++)
        {
            tmpRandNum = RandNum(sNum, eNum);
            if (-1 == IndexOf(tmpRandNum, tmpNums, count))
            {
                tmpNums[i] = tmpRandNum;
            }
            else
                i--; //座位号已被分配,重新生成 
        }
        //复制生成的座位号
        memcpy(nums, tmpNums, sizeof(int) * count);
        free(tmpNums);//释放内存
        return 0;
    }
    //生成准考证号
    //返回值说明:-1表示参数不正确,-2表示内存不足
    int CreateTestId(StudentChain* stuChain, int maxStuCount)
    {
        int i = 0, j = 0;
        int maxExamRoom = 0;
        //int remain = 0;
        int* seats = NULL;
        int arranged = 0;//表示已被安排座位的考生人数
        int remain = 0;//剩余考生人数
        int curRoomStus = 0;//当前考场人数
        char num[20];//学号
        StudentNode* tmpStuNode = NULL;
        if (NULL == stuChain || maxStuCount <= 0) return -1;
        seats = (int*)malloc(sizeof(int) * maxStuCount);
        if (NULL == (seats = (int*)malloc(sizeof(int) * maxStuCount))) return -2;
        //计算最多需要几个考场 
        maxExamRoom = stuChain->length / maxStuCount;
        remain = stuChain->length % maxStuCount;
        if (remain > 0) maxExamRoom++;
        //对每个考场进行座位安排    
        for (i = 1; i <= maxExamRoom; i++)
        {
            remain = stuChain->length - arranged;
            curRoomStus = (remain > maxStuCount ? maxStuCount : remain);
            if (CreateRandNums(1, curRoomStus, seats, curRoomStus) >= 0)
            {
                for (j = 0; j < curRoomStus; j++)
                {
                    if ((tmpStuNode = GetStudentNodeByIndex(stuChain, arranged)) != NULL)
                    {
                        num[sprintf(num, "%d", tmpStuNode->student.num)] = '\0';
                        if (strlen(num) < 2) continue;
                        //准考证组成:两位考场号 两位学校代码 考生学号前两位 两位座位号 
                        sprintf(tmpStuNode->student.testID, "%02d%02d%c%c%02d", i, CODE, num[0], num[1], seats[j]);
                        arranged++;
                    }
                }
            }
        }
        free(seats);
        return 0;
    }
    int main()
    {
        int cmdNum = 0;//用于存储功能号
        int t;
        int errorCode = 0;//用于存储函数返回的错误号
        int num = 0;//学号
        char name[20];//考生姓名
        int maxStuCount = 0;//考场最多容纳考生人数
        int ch = 0;//用于清楚输入缓存
        StudentChain* stuChain = CreateStudentChain();
        if (NULL == stuChain)
            return 1;
        while ((cmdNum = SelectCommand()) != QUIT)
        {
            switch (cmdNum)
            {
            case1:
                printf("\n考生信息录入(输入格式:学号,姓名)\n");
                while (1)
                {
                    errorCode = InputStudentInfo(&num, name);
                    if (errorCode == -1)
                        break;
                    else
                    {
                        StudentNode* stuNode = CreateStudentNode(num, name);
                        ChainAppendNode(stuChain, stuNode);
                        if (errorCode == 0)
                        {
                            printf("\n当前共%d条考生信息\n\n", stuChain->length);
                            break;
                        }
                    }
                }
                break;
            case 2:
                printf("\n生成准考证号\n");
                printf(">考场最多容纳考生人数:");
                scanf("%d", &maxStuCount);
                CLEAR_INPUT_BUFF(ch);//清除输入缓存
                if (maxStuCount <= 0)
                {
                    printf("~~~~~~考场最多容纳考生人数必须大于0\n");
                }
                CreateTestId(stuChain, maxStuCount);
                DisplayStuInfo(stuChain);
                break;
            case 0:
                return 0;
                break;
            case 3:printf("\n输入日期(1~3号)\n");
                scanf("%d", &t);
                switch (t)
                {
                case 1:printf("\n1号上午考c++和下午考历史\n"); break;
                case 2:printf("\n2号上午考英语和下午考管理学\n"); break;
                case 3:printf("\n3号上午考数据结构和下午考数学\n"); break;
                }
                break;
            }
        }
        return 0;
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题