#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;
}
你好,能把我这里面七个错误改了吗?