考务管理程序的设计与实现源代码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;
}

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

如果满意请采纳,谢谢 

#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;
}

 

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