高分求助,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()函数,要求删除选定学生的信息(姓名,学号,数学语文英语成绩,平均分),该怎么搞?求源代码
展开
 我来答
ayunlan
推荐于2018-04-04 · TA获得超过149个赞
知道答主
回答量:47
采纳率:0%
帮助的人:41.6万
展开全部
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 的值。
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
百度网友c4249ef
2009-10-27 · TA获得超过4867个赞
知道大有可为答主
回答量:1855
采纳率:0%
帮助的人:3219万
展开全部
先根据输入信息找到学生在数组中的位置

再把这个位置往后的学生信息全部往前挪一个

应该不难吧,把struct当成普通类型变量来处理就行

相当于一个int数组删除一个元素,该元素后面的数据都往前提前一个位置就行了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式