本次代码我个人编写,代码存在 更优解 有些复杂化了。
请帮我优化,对于提交作业,是 肯定满足要求的
//学生成绩管理系统
include <stdio.h>
include <string.h>
int sum=0;//统计记录条数
struct student
{
char name[100];
char xuehao[9];
char xb[3];// xingbie
char age[4];//nianling
char bj[8];//banji
char xy[20];//xueyuan
char zy[10];zhuanye
char jtzz[100];jiatingzhuzhi
};
struct student stu[100]; //定义结构体数组 stu【100】
int build()
{
int x;
printf(“请输入你要创建的信息的条数,并键入:”);//
scanf("%d",&x);
printf(“学号 姓名 性别 年龄 班级 学院 专业 家庭地址\n”);
for(int i=0;i<x;i++)// 输入到 信息结构体数组
{
scanf("%s%s%s%s%s%s%s%s",&stu[i].xuehao,&stu[i].name,&stu[i].xb,&stu[i].age,&stu[i].bj,&stu[i].xy,&stu[i].zy,&stu[i].jtzz);
}
sum=x;//同统计 数据 总量 (总条数——)
return 0;
}
int add()
{
int n=0,i,sumx;
int x;
sumx=sum; //继承sum的值 作为 for循环上限
printf(“请输入你想添加的记录条数:”);
scanf("%d",&n);
printf(“学号-姓名-性别-年龄-班级-学院-专业-家庭地址\n”);
for(i=sumx;i<sumx+n;i++)
{
scanf("%s",&stu[i].xuehao);
scanf("%s%s%s%s%s%s%s",&stu[i].name,&stu[i].xb,&stu[i].age,&stu[i].bj,&stu[i].xy,&stu[i].zy,&stu[i].jtzz);//录入数据。只支持 添加到最后
sum=sum+1; // sumx的作用就是 怕sum的改变影响循环的进行
}
printf("add模式已经退出\n");
return 0 ;
}
int find()
{
int flag=0,i;
int n;
char mc[10];
printf("请输入你要查找的 类别:");
printf("1 学号 2 姓名 ");//两种情况 if语句
scanf("%d",&n);
printf("输入对应数据: ");
scanf("%s",&mc);
if(n==1);
{
for(i=0;i<sum;i++);//遍历所有结构体数组
{//strcmp 作用是比较两个字符串,若相同返回0
if(strcmp(mc,stu[i].xuehao)==0)printf("%s%s%s%s%s%s%s%s",stu[i].xuehao,stu[i].name,stu[i].xb,stu[i].age,stu[i].bj,stu[i].xy,stu[i].zy,stu[i].jtzz);
flag =1; // 用于 判断所有结构体数组中是否有 相同的,有则为1,0的话下一句 输出一句话
}
if(flag==0)printf("无相同数据");
}
else if(n==2)
{
for(i=0;i<strlen(stu[i].name);i++);
{
if(strcmp(mc,stu[i].name)==0)printf("%s%s%s%s%s%s%s%s",stu[i].xuehao,stu[i].name,stu[i].xb,stu[i].age,stu[i].bj,stu[i].xy,stu[i].zy,stu[i].jtzz);
flag =1;
}
if(flag==0)printf("无相同数据");
}
return 0;
}
int print()
{
int i;
printf(“序号:学号-姓名-性别-年龄-班级-学院-专业-家庭地址\n”);
for(i=0;i<sum;i++)
{
printf("%d “,i+1); //for循环 打印出所有数据 (<sum 的值)
printf(”%s-%s-%s-%s-%s-%s-%s-%s\n",stu[i].xuehao,stu[i].name,stu[i].xb,stu[i].age,stu[i].bj,stu[i].xy,stu[i].zy,stu[i].jtzz);
}
return 0;
}
int delete1()
{
int x,i;
printf(“请输入你要删除的序号:”);
scanf("%d",&x);
for(i=x-1;i<sum;i++) //删除的本质就是 结构体数组 选定序号(如stu【5】) 后的数组全部前移 用strcpy 函数,因为 移动对象都是 字符数组
{
strcpy(stu[i].xuehao,stu[i+1].xuehao);
strcpy(stu[i].name,stu[i+1].name);
strcpy(stu[i].xb,stu[i+1].xb);
strcpy(stu[i].age,stu[i+1].age);
strcpy(stu[i].xy,stu[i+1].xy);
strcpy(stu[i].zy,stu[i+1].zy);
strcpy(stu[i].jtzz,stu[i+1].jtzz);
sum=sum-1;
printf(“更新为:”);
print();
}
return 0 ;
}
int change()
{
int n;
printf(“请输入你要修改的序号:”);
scanf("%d",&n);
printf(“请输入你要修改的内容:”);
for(int i=0;i<sum;i++)
{
if((i+1)==n) //找到与 序号相同,因为i从 0开始,序号从1开始。所以需要 i+1、
{
scanf("%s%s%s%s%s%s%s%s",&stu[i].xuehao,&stu[i].name,&stu[i].xb,&stu[i].age,&stu[i].bj,&stu[i].xy,&stu[i].zy,&stu[i].jtzz);//直接输入
}
}
printf("更新为:");
print();
return 0 ;
}
int main()
{
int n ,flag=1,i=0;
char ch;
FILE *fp; //定义文件指针 fp
printf("********************欢迎来到学生信息管理系统 v1.0 made by wangwei********************\n");
while(flag!=0) //while 循环通过改变flag的量 来控制是否退出程序
{
printf("\t\t\t\t\t1 创建\n\t\t\t\t\t2 添加\n\t\t\t\t\t3 查询\n\t\t\t\t\t4 修改\n\t\t\t\t\t5 删除\n\t\t\t\t\t6 显示\n\t\t\t\t\t7 从文件导入\n\t\t\t\t\t8 导出到文件\n\t\t\t\t\t9 退出\n请选择:");
scanf("%d",&n);
if(n==1) //通过选择判断 执行步骤
{
build();
}
else if(n==2)
{
add();
}
else if(n==3)
{
find();
}
else if(n==4)
{
change();
}
else if(n==5)
{
delete1();
}
else if(n==6)
{
print();
}
else if(n==7)
{
fp = fopen("学生.text","rt+");//用读写模式 打开文件。xxxx
if(fp==NULL)//文件指针 没有打开文件的话(返回值为NULL的话则打印错误)
{
printf("Error opening file file Ex1216\n");
}
i=0;
while(!feof(fp))// feof(fp)判断 指针是否到最后 ,此句意思是 没到最后则。录入一行
{
fscanf(fp,"%s %s %s %s %s %s %s %s",stu[i].xuehao,stu[i].name,stu[i].xb,stu[i].age,stu[i].bj,stu[i].xy,stu[i].zy,stu[i].jtzz);
printf("已输入数据:%s %s %s %s %s %s %s %s",stu[i].xuehao,stu[i].name,stu[i].xb,stu[i].age,stu[i].bj,stu[i].xy,stu[i].zy,stu[i].jtzz);
i=i+1; //用于判断是否是空文件,否的话 则 用sum-1限制。
sum=sum+1; //总数+1
}
printf("************************导入成功!*********************\n",i+1);
if(i>0)sum=sum-1; //因为 会多录入一行 奇怪的乱码 用sum来控制这一行乱码不被输出
fclose(fp);//关闭文件
}
else if(n==8)
{
fp = fopen("学生.text","rt+");
if(fp==NULL)
{
printf("Error opening file file Ex1216\n");
}
for(i=0;i<sum;i++) //写入
{
/*fwrite(stu[i].xuehao, sizeof(stu[i].xuehao) , 1, fp );
fwrite(stu[i].name, sizeof(stu[i].name) , 1, fp );
fwrite(stu[i].xb, sizeof(stu[i].xb) , 1, fp );
fwrite(stu[i].age, sizeof(stu[i].age) , 1, fp );
fwrite(stu[i].bj, sizeof(stu[i].bj) , 1, fp );
fwrite(stu[i].zy, sizeof(stu[i].zy) , 1, fp );
fwrite(stu[i].xy, sizeof(stu[i].xy) , 1, fp );
fwrite(stu[i].jtzz, sizeof(stu[i].jtzz) , 1, fp );*/ //使用fwrite这个函数输出又丑又长,还没找到方法控制两个字符间距离。
fprintf(fp,"%s %s %s %s %s %s %s %s\n",stu[i].xuehao,stu[i].name,stu[i].xb,stu[i].age,stu[i].bj,stu[i].zy,stu[i].xy,stu[i].jtzz);//fprint可以控制字符间距离
printf("******************导出第%d次完成!*********************\n",i+1);
}
//printf("******************导出完成!*******************\n");
}
else if(n==9)
{
printf("Thanks for your using.");
flag=0;
}
else printf("输入出错误请重新输入:\n");
}
fclose(fp);
return 0;
}