做了一个成绩管理,但在进行delate函数后再进行输入,发现浏览时中间会有一堆0,无法解决
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
long class_1;//班级
long number;//学号
char name[20];//姓名
float math;//数学
float c_program;//C 语言
float physics;//大学物理
float english;//大学英语
float polity;//政治
float sport;//体育
float summary;//总分
float average;//平均分
}Student;
Student stud[100];//定义结构体数组变量的大小
static int i = 0;//i 用于记录输入的学生的个数
int menu()//菜单函数
{
int a;
printf("***********************学生信息管理系统*************************\n");//菜单选择
printf("\t\t【1】输入学生信息\n");
printf("\t\t【2】浏览学生信息\n");
printf("\t\t【3】查找学生信息\n");
printf("\t\t【4】修改学生信息\n");
printf("\t\t【5】删除学生信息\n");
printf("\t\t【6】读取学生信息\n");
printf("\t\t【7】保存学生信息\n");
printf("\t\t【8】按平均分排序\n");
printf("\t\t【9】输出挂科名单\n");
printf("\t\t【0】退出本系统\n");
printf("\t\t电信211 马梁 208210634\n");
printf("***********************学生信息管理系统*************************\n");
printf("请选择你要的操作【0-9】:");
scanf("%d", &a);//读入一个数
while (a < 0 || a>9)
{
printf("输入错误!请重新输入。\n");
scanf("%d", &a);//循环
}system("cls");//清屏
return(a);//返回 a 的值
}
int input(Student stud[])//输入学生信息
{
char flag = 'Y';
while (flag == 'y' || flag == 'Y')//判断
{
printf("请输入该学生的班级:"); //交互输入学生信息
scanf("%ld", &stud[i].class_1);
printf("请输入该学生的学号:");
scanf("%ld", &stud[i].number);
printf("请输入该学生的姓名:");
scanf("%s", &stud[i].name);
printf("请输入该学生的“数学”分数:");
scanf("%f", &stud[i].math);
printf("请输入该学生的“C 程序设计语言”分数:");
scanf("%f", &stud[i].c_program);
printf("请输入该学生的“大学物理”分数:");
scanf("%f", &stud[i].physics);
printf("请输入该学生的“大学英语”分数:");
scanf("%f", &stud[i].english);
printf("请输入该学生的“体育”分数:");
scanf("%f", &stud[i].sport);
printf("请输入该学生的“政治”分数:");
scanf("%f", &stud[i].polity);
getchar();//用于消除回车键
stud[i].summary = stud[i].math + stud[i].c_program + stud[i].physics
+ stud[i].english + stud[i].sport + stud[i].polity;
stud[i].average = stud[i].summary / 6;
printf("该学生的总分为:%6.2f\t 平均分为:%6.2f\n", stud[i].summary, stud[i].average);
i++;
printf("继续输入学生信息请按:Y or y,退出请按:N or n.\n");
scanf("%c", &flag);//判断是否继续输入
}
printf("按任意键回主菜单\n");
getchar();
system("cls");
return(i);
}
void Display(Student stud[], int n)//显示所有记录
{
int k;
if (n == 0)
printf("暂无学生记录!\n");
else
{
printf(" 班别 学号 姓名 数学 C语言 物理 英语 体育 政治 总分 平均分\n");
for (k = 0; k < n; k++)//循环输出
{
printf("%7ld", stud[k].class_1);
printf("%7ld", stud[k].number);
printf("%9s", stud[k].name);
printf("%7.2f", stud[k].math);
printf("%7.2f", stud[k].c_program);
printf("%7.2f", stud[k].physics);
printf("%7.2f", stud[k].english);
printf("%7.2f", stud[k].sport);
printf("%7.2f", stud[k].polity);
printf("%7.2f", stud[k].summary);
printf("%8.2f\n", stud[k].average);
}
}
system("pause");
system("cls");
}
void Sort(Student stud[], int i)//按平均分排序
{
int m, n, k;//m,n 为循环变量
Student t;
for (m = 0; m < i - 1; m++)//排序
for (n = m + 1; n < i; n++)
if (stud[m].average < stud[n].average)
{
t = stud[m];
stud[m] = stud[n];
stud[n] = t;
}
printf("排序后的顺序为:\n");
printf(" 班别 学号 姓名 数学 C语言 物理 英语 体育 政治 总分 平均分\n");
for (k = 0; k < i; k++)//循环输出
{
printf("%7ld", stud[k].class_1);
printf("%7d", stud[k].number);
printf("%9s", stud[k].name);
printf("%7.2f", stud[k].math);
printf("%7.2f", stud[k].c_program);
printf("%7.2f", stud[k].physics);
printf("%7.2f", stud[k].english);
printf("%7.2f", stud[k].sport);
printf("%7.2f", stud[k].polity);
printf("%7.2f", stud[k].summary);
printf("%8.2f\n", stud[k].average);
}
system("pause");
system("cls");
}
void Search(Student stud[], int i)//查找并显示一个记录
{
int p, k;//p 为要查找的学生学号,t 为循环 节,s 用来判断循环是否结束
char flag = 'y';
while (flag == 'y' || flag == 'Y')
{
printf("请输入要查找的学生学号:");
scanf("%d", &p);
getchar();
for (k = 0; p != stud[k].number && k < i; k++);
if (k == i)printf("该学号不存在!\n");
else {
printf("该学生的信息为:\n");
printf(" 班别 学号 姓名 数学 C语言 物理 英语 体育 政治 总分 平均分\n");
printf("%7ld", stud[k].class_1);
printf("%7ld", stud[k].number);
printf("%9s", stud[k].name);
printf("%7.2f", stud[k].math);
printf("%7.2f", stud[k].c_program);
printf("%7.2f", stud[k].physics);
printf("%7.2f", stud[k].english); printf("%7.2f", stud[k].sport);
printf("%7.2f", stud[k].polity);
printf("%7.2f", stud[k].summary);
printf("%8.2f\n", stud[k].average);
}
printf("继续查找学生信息请输入:Y or y,退出输入:N or n\n");
scanf("%c", &flag);//判断是否继续输入
}
system("cls");
}
void flunk()
{
int k;
FILE* fp;//定义文件指针
char flunk[100];//定义文件名
for (k = 0; k< i; k++)
{
if (stud[k].math < 60 || stud[k].c_program < 60 || stud[k].physics < 60 || stud[k].english < 60 || stud[k].polity < 60 || stud[k].sport < 60)
{
printf("该学生的信息为:\n");
printf(" 班别 学号 姓名 数学 C语言 物理 英语 体育 政治 总分 平均分\n");
printf("%7ld", stud[k].class_1);
printf("%7ld", stud[k].number);
printf("%9s", stud[k].name);
printf("%7.2f", stud[k].math);
printf("%7.2f", stud[k].c_program);
printf("%7.2f", stud[k].physics);
printf("%7.2f", stud[k].english); printf("%7.2f", stud[k].sport);
printf("%7.2f", stud[k].polity);
printf("%7.2f", stud[k].summary);
printf("%8.2f\n", stud[k].average);
if ((fp = fopen("flunk", "wb")) == NULL)//打开文件
{
printf("保存失败!\n");
}
else printf("保存到文件flunk成功\n");
fwrite(&stud[k], sizeof(Student), 1, fp);
fclose(fp);
}
else printf("没有挂科学生!\n");
}
system("pause");
system("cls");
}
int Delete(Student stud[], int i)//根据输入的学号删除学生的信息
{
long s;
int t;
Student * p;
p = &stud[100];
char a = 'Y';//判断循环是否继续
while (a == 'y' || a == 'Y')
{
printf("请输入需要删除学生的学号:\n");//采用交互式删除
scanf("%ld", &s);
getchar();//消除回车键的影响
for (t = 0; t < i && s != stud[t].number; t++);
if (s == stud[t].number)
{
for (p=stud +t; p <stud+ i; p++)
*p= *(p+1);
i = i - 1;
printf("删除成功!\n");
}
else printf("没有找到要删除的学号!\n");
printf("是否继续删除,继续请按'Y'或'y',退出请按'N'或'n'.\n");
a = getchar();//判断是否继续
getchar();//清除缓冲区的字符-回车。
}
system("cls"); return(i);
}
void change(Student stud[], int i)//修改学生的信息
{
long p = 0;//p 用来表示要删除的学生的学号
int k;//k 为循环变量
char a = 'y';
while (a == 'y' || a == 'Y')
{
printf("\t\t 学生信息修改:\n");
printf("请输入要修改的学生的学号:\n");
scanf("%ld", &p);
for (k = 0; p != stud[k].number && k < i; k++);
if (k == i)printf("无法找到该学生的信息\n");
else {
printf("该学生的信息为:\n");
printf(" 班别 学号 姓名 数学 C语言 物理 英语 体育 政治 总分 平均分\n");
printf("%7ld", stud[k].class_1);
printf("%7ld", stud[k].number);
printf("%9s", stud[k].name);
printf("%7.2f", stud[k].math);
printf("%7.2f", stud[k].c_program);
printf("%7.2f", stud[k].physics);
printf("%7.2f", stud[k].english);
printf("%7.2f", stud[k].sport);
printf("%7.2f", stud[k].polity);
printf("%7.2f", stud[k].summary);
printf("%8.2f\n", stud[k].average);
printf("请输入该学生的新信息:\n");
printf("请输入该学生的班级:");//交互输入学生信息
scanf("%d", &stud[k].class_1);
printf("请输入该学生的学号:");
scanf("%d", &stud[k].number);
printf("请输入该学生的姓名:");
scanf("%s", &stud[k].name);
printf("请输入该学生的“数学”分数:");
scanf("%f", &stud[k].math);
printf("请输入该学生的“C 程序设计语言”分数:");
scanf("%f", &stud[k].c_program); printf("请输入该学生的“大学物理”分数:");
scanf("%f", &stud[k].physics);
printf("请输入该学生的“大学英语”分数:");
scanf("%f", &stud[k].english);
printf("请输入该学生的“体育”分数:");
scanf("%f", &stud[k].sport);
printf("请输入该学生的“政治”分数:");
scanf("%f", &stud[k].polity);
getchar();
stud[k].summary = stud[k].math + stud[k].c_program + stud[k].physics
+ stud[k].english + stud[k].sport + stud[k].polity;
stud[k].average = stud[k].summary / 6;
printf("修改成功!\n");
}
printf("是否继续修改,继续请按'Y'或'y',退出请按'N'或'n'.\n");
a = getchar();//判断是否继续
}
system("pause");
system("cls");
}
int Read(Student stud[], int i)//从文件中读入学生信息
{
int k = i;
FILE* fp;//定义一个文件类型的指针
char filename[20];//定义文件名
printf("请输入文件名:\n");
scanf("%s", &filename);//输入文件名
if ((fp = fopen(filename, "rb")) == NULL)//打开文件
{
printf("无法打开该文件!\n");//打开失败信息
return 0;
}
printf("从文件%s 中读入的数据为:\n", filename);
printf(" 班别 学号 姓名 数学 C语言 物理 英语 体育 政治 总分 平均分\n");
while (fread(&stud[k], sizeof(Student), 1, fp))
{
printf("%7ld", stud[k].class_1); printf("%7ld", stud[k].number);
printf("%9s", stud[k].name);
printf("%7.2f", stud[k].math);
printf("%7.2f", stud[k].c_program);
printf("%7.2f", stud[k].physics);
printf("%7.2f", stud[k].english);
printf("%7.2f", stud[k].sport);
printf("%7.2f", stud[k].polity);
printf("%7.2f", stud[k].summary);
printf("%8.2f\n", stud[k].average);
k++;
//fread(&stud[k], sizeof(Student), 1, fp);
}
fclose(fp);
printf("读入成功,\n");
system("pause");
system("cls");
return(k);
}
void Save(Student stud[], int i)//将所有记录写入文件
{
int k = 0;
FILE* fp;//定义文件指针
char filename[20];//定义文件名
printf("请输入你要存储学生信息的文件名:");//输入文件名
scanf("%s", &filename);
if ((fp = fopen(filename, "wb")) == NULL)//打开文件
{
printf("无法打开该文件!\n");//打开失败信息
return;
}
printf("保存到文件%s 里的信息为:\n", filename);
while (k < i)
{
fwrite(&stud[k], sizeof(Student), 1, fp);
printf("%7ld", stud[k].class_1);
printf("%7d", stud[k].number);
printf("%9s", stud[k].name);
printf("%7.2f", stud[k].math);
printf("%7.2f", stud[k].c_program);
printf("%7.2f", stud[k].physics); printf("%7.2f", stud[k].english);
printf("%7.2f", stud[k].sport);
printf("%7.2f", stud[k].polity);
printf("%7.2f", stud[k].summary);
printf("%8.2f\n", stud[k].average);
k++;
}
////fclose(fp);
printf("信息保存成功,");
system("pause");
system("cls");
}
int main()//主函数
{
int n = 0;
while (1)
{
switch (menu())//选择判断要执行的语句
{
case 1:
printf("\n*******录入学生信息*******\n");
n = input(stud); break;
case 2:
printf("\n*******浏览学生信息*******\n");
Display(stud, n); break;
case 3:
printf("\n*******查询学生信息*******\n");
Search(stud, n); break;
case 4:
printf("\n*******修改学生信息*******\n");
change(stud, n); break;
case 5:
printf("\n*******删除学生信息*******\n");
n = Delete(stud, n); break;
case 6:
printf("\n*******读取学生信息*******\n");
n = Read(stud, n); break;
case 7:
printf("\n*******保存学生信息*******\n");
Save(stud, n); break;
case 8:
printf("\n*******按平均分排序*******\n");
Sort(stud, n); break;
case 9:
printf("\n*******输出挂科名单*******\n");
flunk(); break;
case 0:
printf("\n*******感谢您的使用*******\n");
exit(0);
}
}
return 0;
}
没有报错,但是中间的0无法消除
一开始以为是i的问题,定义了static但是发现问题依然存在。
删除后在进行输入可以没有0
运行截图贴一张?有点没看懂操作流程是什么
用sizeof(结构体总大小)/sizeof(结构体数组[0])获取元素个数
或者自定义函数len返回数组长度