#include
#include
int menu();
void init();
void listStu();
int insertNewStu(int row);
int getStuRowByNo(char no[]);
int deleteByNo();
void analyse(char c[]);
/*****************************************************
students保存学生信息,最多50名
一行代表一个学员信息,每列通过-$-字符串将各项信息分开
stu_num表示已存在的学生数目,假设初始存在2名学员
******************************************************/
char students[5][200];
int stu_num=2;
void main()
{
int opt;
int result=1;
init();
while(result){
opt=menu();
if(result==0)
{
break;
}
switch(opt)
{
case 1:
//printf("\t执行输入学员信息\n");
result=insertNewStu(stu_num);
stu_num=stu_num+1;
break;
case 2:
//printf("\t执行删除学员信息\n");
result=deleteByNo();
stu_num=stu_num-1;
break;
case 3:
printf("\t执行查找学员信息\n");
break;
case 4:
printf("\t执行修改学员信息\n");
break;
case 5:
//printf("\t执行输出学员信息数据\n");
listStu();
break;
case 0:
printf("\t谢谢使用!\n");
result=0;
break;
default:
printf("\t您的输入有误。");
}
}
}
/*打印系统菜单*/
int menu()
{
int option;
printf("\n\t--------------------------------------\n");
printf("\t\t学员信息管理系统\n");
printf("\t--------------------------------------\n");
printf("\t1.输入学员资料\n");
printf("\t2.删除学员资料\n");
printf("\t3.查找学员资料\n");
printf("\t4.修改学员资料\n");
printf("\t5.输出学员信息数据\n");
printf("\t0.退出\n\n");
printf("\t请选择您要进行的操作:");
scanf("%d",&option);
return option;
}
/*初始化2名学员信息*/
void init()
{
strcpy(students[0],"2010-$-张学友-$-男-$-香港-$-13601234567-$-80-$-60-$-");
strcpy(students[1],"2011-$-王菲-$-女-$-北京-$-13678904567-$-60-$-100-$-");
}
/*输出学员所有信息*/
void listStu()
{
//printf("%s\n",students[0]);
//printf("%s\n",students[1]);
//printf("%s\n",students[2]);
int i;
char temp[200]="";
printf("\n\t******现存的学员信息******\n");
printf("学号\t");
printf("姓名\t");
printf("性别\t");
printf("地址\t");
printf("手机\t\t");
printf("Java\t");
printf(".Net\n");
//针对每一行学生信息进行处理
for(i=0;i<stu_num;i++)
{
strcpy(temp,students[i]);
while(strlen(temp)!=0)
{
analyse(temp);
}
printf("\n");
}
}
/*输入学员信息*/
int insertNewStu(int row)
{
char stu_temp[1][200];//暂存该学员的信息
char n_temp[20];
char a_temp[30];
char c_temp[20];
int i_temp;
int flag=0;//用来标识前一项信息是否输入完成
int i;
//输入学号
while(flag==0)
{
printf("\n\t请输入学号:");
scanf("%d",&i_temp);
if(i_temp<1000 || i_temp>9999)
{
printf("\t学号非法,必须4位数字!");
continue;
}else
{
sprintf(c_temp,"%d",i_temp);
strcpy(stu_temp[0],c_temp);
strcat(stu_temp[0],"-$-");
flag=1;
}
}
//输入姓名
while(flag==1)
{
printf("\n\t请输入姓名:");
scanf("%s",&n_temp);
if(strlen(n_temp)>20)
{
printf("\t姓名长度过大!");
continue;
}else
{
strcat(stu_temp[0],n_temp);
strcat(stu_temp[0],"-$-");
flag=2;
}
}
//输入性别
while(flag==2)
{
printf("\n\t请输入性别(1男 2女):");
scanf("%d",&i_temp);
if(i_temp!=1 && i_temp!=2)
{
printf("\t性别选择错误!");
continue;
}else
{
if(i_temp==1)
{
strcat(stu_temp[0],"男");
}else
{
strcat(stu_temp[0],"女");
}
strcat(stu_temp[0],"-$-");
flag=3;
}
}
//输入地址
while(flag==3)
{
printf("\n\t请输入地址:");
scanf("%s",&a_temp);
if(strlen(a_temp)>30)
{
printf("\t地址长度过大!");
continue;
}else
{
strcat(stu_temp[0],a_temp);
strcat(stu_temp[0],"-$-");
flag=4;
}
}
//输入手机号码
while(flag==4)
{
printf("\n\t请输入手机号码:");
scanf("%s",&c_temp);
//判断是否存在非数字等非法字符
for(i=0;i<strlen(c_temp);i++)
{
if(c_temp[i]<'0' || c_temp[i]>'9')
{
printf("\t手机号码中包括非数字字符。");
break;
}
}
if(strlen(c_temp)!=11)
{
printf("\n\t手机号码位数不正确。");
continue;
}else
{
strcat(stu_temp[0],c_temp);
strcat(stu_temp[0],"-$-");
flag=5;
}
}
//输入Java的成绩
while(flag==5)
{
printf("\n\t请输入Java的成绩:");
scanf("%d",&i_temp);
if(i_temp<0 || i_temp>100)
{
printf("\t成绩必须在0-100之间。");
continue;
}else
{
sprintf(c_temp,"%d",i_temp);
strcat(stu_temp[0],c_temp);
strcat(stu_temp[0],"-$-");
flag=6;
}
}
//输入.Net的成绩
while(flag==6)
{
printf("\n\t请输入.Net的成绩:");
scanf("%d",&i_temp);
if(i_temp<0 || i_temp>100)
{
printf("\t成绩必须在0-100之间。");
continue;
}else
{
sprintf(c_temp,"%d",i_temp);
strcat(stu_temp[0],c_temp);
strcat(stu_temp[0],"-$-");
flag=7;
}
}
//确认信息
printf("\n\t*********确认学员信息如下*********\n");
printf("%s",stu_temp);
printf("\n\t确认学员信息么(y|n)?");
scanf("%s",&c_temp);
if(strcmp(c_temp,"y")==0 || strcmp(c_temp,"Y")==0)
{
strcpy(students[row],stu_temp[0]);
}else
{
insertNewStu(row);
}
return flag;
}
/*指定学员的存储位置,即所在的行位置*/
int getStuRowByNo(char no[])
{
int i,j;
int pos=-1;
char temp[5]="";
for(i=0;i<stu_num;i++)
{
for(j=0;j<strcspn(students[i],"-$-");j++)
{
temp[j]=students[i][j];
}
if(strcmp(no,temp)==0)
{
pos=i;
break;
}
}
return pos;
}
/*删除指定学号的学员信息*/
int deleteByNo()
{
char no[5];
int row;
int i,j;
printf("\n\t请输入要删除的学员学号:");
scanf("%s",&no);
row=getStuRowByNo(no);
if(row==-1)
{
printf("\n\t**********没有该学号的学员信息,请核实**********\n");
return -1;
}else
{
for(i=row;i<50;i++)
{
for(j=0;j<200;j++)
{
students[i][j]=students[i+1][j];
}
}
printf("\n\t********删除成功!********\n");
return 1;
}
}
/*解析学员的信息行*/
void analyse(char c[])
{
int i,j;
int token;
char p_temp[100]="";
token=strcspn(c,"-$-");
//该行第一个分隔符之前的信息项进行解析
for(i=0;i<token;i++)
{
p_temp[i]=c[i];
}
printf("%s\t",p_temp);
//去掉已经解析出的信息项,即将后面的信息项依次前移
for(j=0;j<strlen(c)-token;j++)
{
c[j]=c[token+3+j];
}
}
运行后显示主菜单,输入5,显示现存的学员信息,但是成绩显示不出来,成绩如果能显示,还需要显示主菜单。求解决。