信息管理系统的一部分的两个问题:输入信息到地址系统报错;该删的没删,不该删的删了...
#include <stdio.h>int menu();
int insertNewStu(int row);
int getStuRowByNo(char no[]);
int deleteByNo();
void init();
void listStu();
void analyse(char c[]);
/****************************
students保存学员信息,
stu_num表示已经存在的学员个数
*****************************/
char students[50][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++;
break;
case 2:
//printf("\t执行操作:删除学员资料\n");
result=deleteByNo();
stu_num--;
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您输入的选项有误.\n");
}
}
}
int menu()
{
int option;
printf("\n\t---------------------------------");
printf("\n\t学员信息管理系统");
printf("\n\t---------------------------------\n");
printf("\t1.输入学员资料\n");
printf("\t2.删除学员资料\n");
printf("\t3.查找学员资料\n");
printf("\t4.修改学员资料\n");
printf("\t5.输出学员资料\n");
printf("\t0.退出\n");
printf("\t请选择您要进行的操作:");
scanf("%d",&option);
return option;
}
/***********************
初始化2名学员信息
************************/
void init()
{
strcpy(students[0],"2010-$-张学友-$-男-$-香港-$-13601234567-$-98-$-89-$-");
strcpy(students[1],"2011-$-王菲-$-女-$-北京-$-15887654321-$-99-$-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\t\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(i_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("\t手机号码位数不正确.");
continue;
}else
{
strcat(stu_temp[0],c_temp);
strcat(stu_temp[0],"-$-");
flag=5;
}
}
//输入成绩
while(flag==5)
{
printf("\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],i_temp);
strcat(stu_temp[0],"-$-");
flag=6;
}
}
while(flag==6)
{
printf("\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],i_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=1;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***********没有该学员的学号,请核实************");
return -1;
}else
{
for(i=row;i<50;i++)
{
for(j=0;j<300;j++)
students[i][j]=students[i+1][j];
}
printf("\n\t***********删除成功**************");
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];//3是分隔符的位数
}
}