高分求助,C语言中关于结构体数组中,学生信息的删除
structstudent{charnum[10];charname[10];floatchinese;floatenglish;floatmath;floatavp;}...
struct student
{ char num[10];
char name[10];
float chinese;
float english;
float math;
float avp;
}stu1[SIZE],stu2,stu3,stu4;
FILE *fp;
void save()
{
fp=fopen("student information","w");
if(fp==NULL)
{
printf("File Open Error");
exit(0);
}
printf("请依次输入学号,姓名,语文,外语,数学成绩:\n");
int i;
for(i=0;i<SIZE;i++)
{
scanf("%s%s%f%f%f",stu1[i].num,stu1[i].name,&stu1[i].chinese,&stu1[i].english,&stu1[i].math);
stu1[i].avp=(stu1[i].chinese+stu1[i].english+stu1[i].math)/3;
fwrite(&stu1[i],sizeof(student),1,fp);
printf("----------------------------------\n");
}
fclose(fp);
}
void main()
{
int n;
while(n!=6)
{
printf("欢迎来到学生成绩管理系统界面\n");
printf(" \n");
printf("请输入数字,按回车确认:\n");
printf("1.学生成绩信息的输入\n");
printf("2.按学号查询个人成绩\n");
printf("3.按学号修改个人成绩\n");
printf("4.按学号删除个人成绩\n");
printf("5.按课程查询课程平均成绩\n");
printf("6.退出学生成绩管理系统\n");
scanf("%d",&n);
switch(n)
{
case 1:save();break;
case 2:search();break;
case 3:redress();break;
case 4:dele();break;
case 5:avc();break;
case 6:printf("系统已经退出\n");break;
default:printf("请输入正确的数字");
}
}
}
里面dele()函数,要求删除选定学生的信息(姓名,学号,数学语文英语成绩,平均分),该怎么搞?求源代码 展开
{ char num[10];
char name[10];
float chinese;
float english;
float math;
float avp;
}stu1[SIZE],stu2,stu3,stu4;
FILE *fp;
void save()
{
fp=fopen("student information","w");
if(fp==NULL)
{
printf("File Open Error");
exit(0);
}
printf("请依次输入学号,姓名,语文,外语,数学成绩:\n");
int i;
for(i=0;i<SIZE;i++)
{
scanf("%s%s%f%f%f",stu1[i].num,stu1[i].name,&stu1[i].chinese,&stu1[i].english,&stu1[i].math);
stu1[i].avp=(stu1[i].chinese+stu1[i].english+stu1[i].math)/3;
fwrite(&stu1[i],sizeof(student),1,fp);
printf("----------------------------------\n");
}
fclose(fp);
}
void main()
{
int n;
while(n!=6)
{
printf("欢迎来到学生成绩管理系统界面\n");
printf(" \n");
printf("请输入数字,按回车确认:\n");
printf("1.学生成绩信息的输入\n");
printf("2.按学号查询个人成绩\n");
printf("3.按学号修改个人成绩\n");
printf("4.按学号删除个人成绩\n");
printf("5.按课程查询课程平均成绩\n");
printf("6.退出学生成绩管理系统\n");
scanf("%d",&n);
switch(n)
{
case 1:save();break;
case 2:search();break;
case 3:redress();break;
case 4:dele();break;
case 5:avc();break;
case 6:printf("系统已经退出\n");break;
default:printf("请输入正确的数字");
}
}
}
里面dele()函数,要求删除选定学生的信息(姓名,学号,数学语文英语成绩,平均分),该怎么搞?求源代码 展开
2个回答
展开全部
void del(void)
{
FILE *fp;
char a[10];
char ch;
int i,j,k;
system("cls");
printf("请输入要删除的学生姓名:");
scanf("%s",a);
system("cls");
fp=fopen("F:\\x.txt","r");
for(i=0;i<count;i++)//找到删除人所在的位置
{
fscanf(fp,"%s %d %d %d %d\n",s[i].name,&s[i].no,&s[i].score1,&s[i].score2,&s[i].score3);
if(!strcmp(s[i].name ,a))
{
printf("\t\t姓名 %s 学号 %d 成绩1 %d 成绩2 %d 成绩3 %d\n",s[i].name ,s[i].no ,s[i].score1 ,s[i].score2 ,s[i].score3 );
printf(" \t\t\t该同学的信息已成功删除!\n");
printf("\n");
break;
}
}
fclose(fp);
if(i==count)
{
printf("\t\t很抱歉,没有您所要查找的同学记录!\n");
printf("\n");
}
else
{
for(j=i;j<count-1;j++)
{
for(k=0;k<10;k++)
{
s[j].name[k]=s[j+1].name[k];
}
s[j].no=s[j+1].no;
s[j].score1=s[j+1].score1;s[j].score2=s[j+1].score2;s[j].score3=s[j+1].score3;
}
fp=fopen("F:\\x.txt","w");
fclose(fp);
fp=fopen("F:\\x.txt","a");
for(j=0;j<2;j++)
{
fprintf(fp,"%s %d %d %d %d\n",s[j].name,s[j].no,s[j].score1,s[j].score2,s[j].score3);
}
fclose(fp);
}
count=count-1;
}
这是我以前做的时候的代码,基本思想已经有了,将学籍信息从文件载入到结构体中,就是找到要删除的同学所在的位置,然后从该同学后面将其他人的信息依次向前挪一个,实现对该同学信息的覆盖。最后再将修改后的信息在重新存到文件中。
将文件中的内容读到结构体中时一开始就做了。设置了一个全局变量count,用于记录动态变化的学生的人数,每次操作完成后将count的值写到另一个文件夹中。每次程序开始执行时也要读入count 的值。
{
FILE *fp;
char a[10];
char ch;
int i,j,k;
system("cls");
printf("请输入要删除的学生姓名:");
scanf("%s",a);
system("cls");
fp=fopen("F:\\x.txt","r");
for(i=0;i<count;i++)//找到删除人所在的位置
{
fscanf(fp,"%s %d %d %d %d\n",s[i].name,&s[i].no,&s[i].score1,&s[i].score2,&s[i].score3);
if(!strcmp(s[i].name ,a))
{
printf("\t\t姓名 %s 学号 %d 成绩1 %d 成绩2 %d 成绩3 %d\n",s[i].name ,s[i].no ,s[i].score1 ,s[i].score2 ,s[i].score3 );
printf(" \t\t\t该同学的信息已成功删除!\n");
printf("\n");
break;
}
}
fclose(fp);
if(i==count)
{
printf("\t\t很抱歉,没有您所要查找的同学记录!\n");
printf("\n");
}
else
{
for(j=i;j<count-1;j++)
{
for(k=0;k<10;k++)
{
s[j].name[k]=s[j+1].name[k];
}
s[j].no=s[j+1].no;
s[j].score1=s[j+1].score1;s[j].score2=s[j+1].score2;s[j].score3=s[j+1].score3;
}
fp=fopen("F:\\x.txt","w");
fclose(fp);
fp=fopen("F:\\x.txt","a");
for(j=0;j<2;j++)
{
fprintf(fp,"%s %d %d %d %d\n",s[j].name,s[j].no,s[j].score1,s[j].score2,s[j].score3);
}
fclose(fp);
}
count=count-1;
}
这是我以前做的时候的代码,基本思想已经有了,将学籍信息从文件载入到结构体中,就是找到要删除的同学所在的位置,然后从该同学后面将其他人的信息依次向前挪一个,实现对该同学信息的覆盖。最后再将修改后的信息在重新存到文件中。
将文件中的内容读到结构体中时一开始就做了。设置了一个全局变量count,用于记录动态变化的学生的人数,每次操作完成后将count的值写到另一个文件夹中。每次程序开始执行时也要读入count 的值。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询