//谢鹏 07036052
//学生信息管理
//2005/3/8
#include "stdlib.h"
#include "malloc.h"
#include "conio.h"
#include "string.h"
#include "ctype.h"
#include "stdio.h"
#define LEN sizeof(struct student)
struct student
{
char No[10],name[10],sex[5],age[4];
char className[10],address[100],email[50],QQ[20],tel[15];//20->10?
struct student*next;
};
struct student*head;
//function prototype declaration
int add(void);
int deleteStu(void);
int repair(void);
int verificationIdentity(void);
int maintain(void);
int findname(void);
int findnumber();
int find(void);
int findaddrapart(void);
int InitStuInfo(void);
int main(int argc, char* argv[])
{
int initFlag,quitFlag,maintainFlag,findFlag;
char ch;
quitFlag=1;
initFlag=InitStuInfo();
if(initFlag)
while(quitFlag)
{
printf("\n\t\t*****通信工程学院1--02学生信息查询系统*****\n");
printf("\t\t* 1.查询 *\n");
printf("\t\t* 2.维护 *\n");
printf("\t\t* 0.退出 *\n");
printf("\t\t*******************************************\n");
printf("请选择(1/2/0):\n");
ch=getch();
switch(ch)
{
case'1':findFlag=find();
//about finding
break;
case'2':maintainFlag=maintain();
//about maintaining
break;
case'0':quitFlag=0;
break;
default: printf("\n输入错误,请重新选择\n\n\n");
break;
}
}
else
{
printf("initilization fail!");
return 1;
}
printf("Successful.bye bye!\n");
printf("press any key to END");
getch();
return 0;
}
int add(void)
{
struct student*p3,*p2;
char ch;
int addFlag;
p2=head;
while(p2->next!=NULL)
p2=p2->next;
ch='y';
while(tolower(ch)=='y')
{
p3=(struct student*)malloc(LEN);
printf("\n请按如下格式输入:\n");
printf("学号:");
gets(p3->No);
printf("姓名:");
gets(p3->age);
printf("性别:");
gets(p3->sex);
printf("班级:");
gets(p3->className);
printf("家庭住址:");
gets(p3->address);
printf("E-mail:");
gets(p3->email);
printf("QQ:");
gets(p3->QQ);
printf("电话:");
gets(p3->tel);
printf("请确认上述输入[y/Y],否则按其他任意键继续?");
ch=getch();
if(tolower(ch)=='y')
{
p2->next=p3;
p2=p3;
p3=NULL;
printf("追加学生信息成功!!按任意键继续------");
getch();
putch('\n');
addFlag=1;
}else
{
printf("未能追加学生信息!!按任意键继续------");
getch();
putch('\n');
addFlag=2;
}
printf("是否增加下一个学生信息,如果是,键入[y/Y];否则键入[n/N]:");
ch=getch();
}
p2=NULL;
return addFlag;
}
int deleteStu(void)
{
char ch,stuNo[10];
int deleteFlag;
struct student*p,*q;
ch='y';
while(tolower(ch)=='y')
{
printf("请输入待删除的学生的学号(用 回车 确认):");
gets(stuNo);
p=head;
q=NULL;
while(p!=NULL)
{
if(strcmp(p->No,stuNo))
{
q=p;
p=p->next;}
else
{
printf("您要删除的学生的姓名是:%s\n",p->name);
printf("请您再次确认[y/Y]:");
ch=getch();
if(tolower(ch)=='y')
{
q->next=p->next;
deleteFlag=3;
}
else
deleteFlag=4;
}
}
if(p==NULL)
{
printf("\n不存在您要删除的学生信息,按任意键继续-------\n");
deleteFlag=4;
getch();
}
printf("是否继续删除下一个学生的信息[y/Y],不删除按其他任意键--------\n");
ch=getch();
}
return(deleteFlag);
}
int repair(void)
{
int repairFlag;
char ch,stuNo[10];
struct student*p,*q;
do
{
printf("请输入待修改学生的学号(用 回车 确认):");
gets(stuNo);
p=head;
q=NULL;
while(p!=NULL)
{
if(strcmp(p->No,stuNo))
p=p->next;
else break;
}
while(1)
{
printf("您要修改的学生的原始信息是:\n");
printf("%s\t%s\t%s\t%s\t%s\t\n",
p->No,p->name,p->sex,p->age,p->className);
printf("%s\t%s\t%s\t%s\t\n",p->address,p->email,p->QQ,p->tel);
printf("请输入所要修改的信息名称:\n");
printf("1.学号 2.姓名 3.年龄 4.性别 5.班级 6.家庭住址 7.E-mail 8.QQ 9.电话\n");
printf("请选择:\n");
ch=getch();
switch(ch)
{
case'1':printf("\n请输入新的信息(回车结束):");
gets(p->No);repairFlag=6;break;
case'2':printf("\n请输入新的信息(回车结束):");
gets(p->name);repairFlag=6;break;
case'3':printf("\n请输入新的信息(回车结束):");
gets(p->age);repairFlag=6;break;
case'4':printf("\n请输入新的信息(回车结束):");
gets(p->sex);repairFlag=6;break;
case'5':printf("\n请输入新的信息(回车结束):");
gets(p->className);repairFlag=6;break;
case'6':printf("\n请输入新的信息(回车结束):");
gets(p->address);repairFlag=6;break;
case'7':printf("\n请输入新的信息(回车结束):");
gets(p->email);repairFlag=6;break;
case'8':printf("\n请输入新的信息(回车结束):");
gets(p->QQ);repairFlag=6;break;
case'9':printf("\n请输入新的信息(回车结束):");
gets(p->tel);repairFlag=6;break;
default: printf("\n输入错误,请重新输入:\n");
repairFlag=5;break;
}
printf("是否还要修改该学生的信息[y/n]:\n");
ch=getch();
if(tolower(ch)=='y')
continue;
else
break;
}
printf("是否还要修改其他学生的信息[y/n]:\n");
ch=getch();
}
while(tolower(ch)=='y');
return repairFlag;
}
int verificationIdentity(void)
{
char userID[20],passWord[20];//from keyboard
char superUID[20],passWD[20];//from user file
int i,legalUser;
char ch;
FILE*fp;
legalUser=0;
fp=fopen("superUser.txt","r");
if(fp==NULL)
{
printf("superuser file does not exist\n");
printf("press any key to continue");
getch();
// superUserFlag=0;
}
else
{
do
{
printf("请输入用户名(<18个字符/数字):");
i=0;
while(isalpha(ch=getch())&&(i<18))
{
putchar(ch);
userID[i]=ch;
i++;
}
userID[i]='\0';
printf("请输入用户名(<18个字符/数字):");
i=0;
while(isalpha(ch=getch())&&(i<18))
{
putchar('*');
passWord[i]=ch;
i++;
}
passWord[i]='\0';
rewind(fp);
while(!feof(fp))
{
fscanf(fp,"%s\t%s\t\n",superUID,passWD);
if((strcmp(userID,superUID)==0)&&(strcmp(passWord,passWD)==0))
{
legalUser=1;
break;
}
}
if(legalUser)
break;
else
{
printf("是否重新输入用户名和密码?(y/n)");
ch=getch();
}
}
while((ch=='y')||(ch=='Y'));
}
return(legalUser);
}
int save(void)
{
FILE*fp;
struct student*p;
p=head;
if((fp=fopen("FILE.DAT","w"))==NULL)
{
printf("保存文件不正常,请核对文件名!\n");
fclose(fp);
return 1;
}
else
{
rewind(fp);
while(p!=NULL)
{
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n",
p->No,p->name,p->age,p->sex,p->className,p->address,
p->email,p->QQ,p->tel);
p=p->next;
}
fclose(fp);
return 0;
}
}
int maintain(void)
{
char ch;
int success,saveFlag,maintainR=4;
success=verificationIdentity();//用户权限校验
if(success==0)
{
printf("您是无权用户!!!");
maintainR=5;//maintainR=5:无权维护
}
else
{
do
{
printf("\t\t************* 维护 *************\n");
printf("\t\t* 1.增加 *\n");
printf("\t\t* 2.删除 *\n");
printf("\t\t* 3.修改 *\n");
printf("\t\t* 0.退出 *\n");
printf("*请输入选择(1/2/3/0):\n");
ch=getch();
switch(ch)
{
case'1':maintainR=add();//maintainR=1:增加学生信息
break;
case'2':maintainR=deleteStu();//maintainR=2:删除学生信息
break;
case'3':maintainR=repair();//maintainR=3:修改学生信息
break;
case'0':maintainR=0;//maintainR=0:
break;
default:printf("\n输入错误,请重新输入您的选择:");
break;
}
}
while(maintainR!=0);
printf("\n您已经完成了对学生信息的维护,\n");
printf("请您确认是否永久性保存您所做的修改(y/n):\n");
ch=getch();
if(tolower(ch)=='y')
{
saveFlag=save();
if(saveFlag)
maintainR=4;///maintainR=4:成功保存
}
}
return(maintainR);
}
int findaddrapart(void)
{
return 0;
}
int findname(void)
{
char sname[20];
struct student*p;
int flag;
flag=2;//don't find
p=head;
printf("\n请输入您想要查找学生的姓名:\n");
gets(sname);
while(p!=NULL)
{
if(strcmp(sname,p->name)==0)
{
printf("%s\n",p->No);
printf("%s\n",p->name);
printf("%s\n",p->age);
printf("%s\n",p->sex);
printf("%s\n",p->className);
printf("%s\n",p->address);
printf("%s\n",p->email);
printf("%s\n",p->QQ);
printf("%s\n",p->tel);
flag=1;//finded
}
p=p->next;
}
return(flag);
}
int findnumber()
{
char sno[10];
struct student*p;
int flag;
flag=2;//don't find
p=head;
printf("\n请输入您想要查找的学生的学号[01000000-01004000]\n");
gets(sno);
while(p!=NULL)
{
if(strcmp(sno,p->No)==0)
{
printf("%s\n",p->No);
printf("%s\n",p->name);
printf("%s\n",p->age);
printf("%s\n",p->sex);
printf("%s\n",p->className);
printf("%s\n",p->address);
printf("%s\n",p->email);
printf("%s\n",p->QQ);
printf("%s\n",p->tel);
flag=1;//finded
}
p=p->next;
}
return(flag);
}
int find(void)
{
char ch;
int flag;
flag=4;
while(flag)
{
printf("\t\t***************** 查询 *****************\n");
printf("\t\t* 1.学号 *\n");
printf("\t\t* 2.姓名 *\n");
printf("\t\t* 3.住址/系别 *\n");
printf("\t\t* 0.退出 *\n");
printf("*请输入选择(1/2/3/0):\n");
ch=getch();
switch(ch)
{
case'1':
flag=findnumber();
break;
case'2':
flag=findname();
break;
case'3':
flag=findaddrapart();
break;
case'0':
flag=0;
break;
default:
printf("\n输入错误,请重新输入:");
flag=4;
break;
}
if(flag=5)
{
printf("您所查找的学生不存在!\n");
printf("是否继续查找?[y/n]\n");
ch=getch();
if(tolower(ch)=='y')
continue;
else flag=0;
}
}
return flag;
}
//the InitStuInfo() function performs the initilization of student information link
int InitStuInfo(void)
{
FILE*fp;
struct student*p1,*p2;
fp=fopen("FILE.DAT","r");
if(fp==NULL)
{
printf("未能初始化学生信息\n");
//fclose(fp);
return 0;
}
else
{
p1=(struct student*)malloc(LEN);
head=p1;
while(!feof(fp))
{
fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n",
p1->No,p1->name,p1->age,p1->sex,p1->className,p1->address,
p1->email,p1->QQ,p1->tel);
p2=p1;
p1=(struct student*)malloc(LEN);
p2->next=p1;
}
p2->next=NULL;
p2=NULL;
free(p1);
p1=NULL;
p1=head;
while(p1!=NULL)
{
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n",
p1->No,p1->name,p1->age,p1->sex,p1->className,p1->address,
p1->email,p1->QQ,p1->tel);
p1=p1->next;
}
printf("________________________________________________________________________________");
printf("以上为初始化的文件信息");
getch();
system("cls");
fclose(fp);
return 1;
}
}
评论