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

考务管理程序的设计与实现源代码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 无用
    打赏 举报
  • CSDN专家-link 2021-06-21 19:25

    可以,请告诉我是哪7个错误

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题