/*学生信息管理问题描述:已知程序要求管理的学生信息包括: 学号(不重复),班级,姓名,年龄,性别,出生日期,地址,电话,E-mail 等。 设计一程序,完成以下功能: (1) 能从键盘输入学生的信息(增加,输入时需要能检查该学号的学生的记录是否已经存在,出生日期格式是否合法(格式为:YYYY-MM-DD,如 2009-01-02)) (2) 能从指定的文件中读入学生的信息 (3) 能按学号查询学生的信息 (4) 能按班级查询学生信息 (5) 能删除指定学号的学生信息
(6) 能将学生信息保存在指定的文件中提示:
l 从文件读入学生信息时,需要先设计好文件的格式,从文件中读取数据后,按照预先设计的格式分析数据,提取学生的信息,读入程序l 定义一个日期结构体保存日期,具体信息为:年、月、日l 判断出生日期的格式是否合法时,需要判断长度是否为 10,第5 位和第8 位是否为’-’,字符,将 1-4 位表示的年份,6-7 位表示的月份,9-10 位表示的日期分别转换成整数。判断是否满足构成日期的条件闰年月份只能是 1-12 之间的数,如果是闰年,二月可以是 29天否则不能大于 28,1,3,5,7,8,10,12 月可以是 31 天, 其余只能小于等于 30(建议写成函数)。*/ #include
/*信息结构体*/ struct student { char number[12]; char myclass[10]; char name[10]; int age; char sex[10]; char date[30]; char telephone[12]; char email[30]; struct student *next; };
/*函数定义声明*/
void search_number(struct student *head); void search_number(struct student *head); void search_class(struct student *head); void Delete(struct student *head); void display(struct student *head);
void menuselect(int choice,struct student * head) {
switch(choice) /*多项选择菜单*/ { case 0:scan_student(head);getchar();break; case 1:search_class(head);getchar();break;/*按班级查询信息*/ case 2:search_number(head);getchar();break;/*按学号查询信息*/ case 3:Delete(head);getchar();break; case 4:fscan_student(head);getchar();getchar();break; case 5:fpint(head);break; case 6:display(head);getchar();break;
case 7:system(\ /*退出*/ printf(\ ######### 谢谢使用!! ############\\n**\\n**\\n**\\n**\\n**\\n\
exit(0); /*如返回值为8,则程序结束*/ } }
/*菜单函数,函数返回值为整数,代表所选的菜单项*/ int menushow() { char s[80]; int c; system(\ printf(\ 欢迎使用学生信息管理系统\\n\\n <<<<请按任何键继续>>>>\\n\\n\\n ...\提示压任意键继续*/ getchar(); /*读入任意字符*/ system(\ /*清屏*/ printf(\ 学生信息系统\\n\\n\ printf(\ 0. 键盘输入信息\\n\\n\ printf(\ 1. 班级查询\\n\\n\ printf(\ 2. 学号查询\\n\\n\ printf(\ 3. 学号删除\\n\\n\ printf(\ 4. 导入\\n\\n\ printf(\ 5. 导出\\n\\n\ printf(\ 6. 全部查询\\n\\n\ printf(\ 7. 退出\\n\\n\ printf(\【输入选择】***************************************\ do
{
printf(\ 请输入0-7之间的数选择需要的操作:\提示输入选项*/ scanf(\ /*输入选择项*/ c=atoi(s); /*将输入的字符串全部转化为整型数*/ }while(c<0||c>6); /*选择项不在0~7之间重输*/ return c; /*返回继续选择*/ }
/******主函数开始*******/ main() { struct student * head; /*定义链表的头节点*/ int size=sizeof(struct student); head=(struct student *)malloc(size); head->next=NULL; system(\ for(;;) /*无限循环*/ { menuselect(menushow(),head); } }
/*查询学生信息*/
void display(struct student *head) { struct student *ptr; if(head->next==NULL) { printf(\没有任何记录\\n\ getchar(); return; } for(ptr=head;ptr->next!=NULL;ptr=ptr->next) printf(\学号:%s 班级:%s 姓名:%s 年龄:%d 性别:%s 日期:%s 电话:%s 电子邮件:%s\ail); getchar(); return; }
/*定义键盘输入学生记录*/
int scan_student(struct student * head) {
struct student *temp,*ptr,*p; int i=0,c; char s[100];
int size=sizeof(struct student); p=head; ptr=head;
temp=(struct student *)malloc(size); temp->next=NULL;
while(ptr->next!=NULL) /*找尾节点*/ { ptr=ptr->next; }
system(\ /*清屏*/ printf(\ <<<<请输入信息>>>> \\n\\n\提示输入记录*/ printf(\ <<<<>>>>\\n\ printf(\学号班级 姓名 年龄 性别 出生日期 电话电子邮件\\n\ printf(\ 性别为woman或man,各输入项用空格隔开\ printf(\
scanf(\ex,temp->date,temp->telephone,temp->email); /*输入记录*/ if((temp->sex[0]=='m'&&temp->sex[1]=='a'&&
temp->sex[2]=='n')||(temp->sex[0]=='w'&&temp->sex[1]=='o'&&temp->sex[2]=='m'&&temp->sex[3]=='a'&&temp->sex[4]=='n')); else { printf(\性别输入有误请重新输入性别:\ scanf(\ } if(judgedate(temp)==1) {
scanf(\ } if(p->next!=NULL) { do { if(strcmp(temp->number,p->number)==0) { printf(\ <<<是否覆盖?是按“0”,直接增加按“1”>>>\\n\ do { printf(\ 请输入0、1选择需要的操作:\/*提示输入
选项*/
scanf(\ /*输入选择项*/ c=atoi(s); /*将输入的字符串转化为整型数*/ }while(c!=0&&c!=1);
switch(c) /*多项选择菜单*/ { case 0: strcpy(p->number,temp->number); strcpy(p->myclass,temp->myclass); strcpy(p->name,temp->name); p->age=temp->age; strcpy(p->sex,temp->sex); strcpy(p->date,temp->date); strcpy(p->name,temp->name); strcpy(p->telephone,temp->telephone); strcpy(p->email,temp->email); i++; break; case 1: ptr->next=temp; i++; break; } if(i>0) break; } p=p->next; }while(p->next!=NULL); if(p->next==NULL) ptr->next=temp; } else p->next=temp; }
/*定义删除函数**/
void Delete(struct student *head) { struct student *p,*ptr1,*ptr2; int i=0; char temp[20]; system(\ p=head->next;