#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个错误