|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Luker 于 2018-12-9 14:49 编辑
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student
{
unsigned number; //学生学号
char name[10]; //学生姓名
int math; //数学成绩
int english; //英语成绩
int sport; //体育成绩
int computer; //计算机成绩
float time; //录入时间
struct student *next; //指向下一个结点的指针
};
void print(); //成绩录入
void count(); //统计分数情况
void inquiry(); //通过学号查询成绩
void del(); //删除学生信息
void change(); //修改学生信息
struct student *sense(); //创建链表并将文件内容导入链表中
void fail(); //获取不及格学生姓名
void high(); //统计各科最高分情况
void leading(struct student *); //将修改后的数据重新导入文件中
void rankingmath(int); //数学成绩排序
void rankingenglish(int); //英语成绩排序
void rankingsport(int); //体育成绩排序
void rankingcomputer(int); //计算机成绩排序
int n;
unsigned Number;
char Name[10];
int Math;
int English;
int Sport;
int Computer;
float Time;
int main(void)
{
int a;
int key;
printf("1.学生成绩录入\n");
printf("2.学生信息删除\n");
printf("3.学生成绩查询\n");
printf("4.学生成绩修改\n");
printf("输入序号并回车进入对应功能:\n");
scanf("%d",&a);
switch(a)
{
case 1:
{
print(); //文件操作,录入学生信息
break;
}
case 2:
{
del(); //删除特定学生信息,将文件的信息导出并用链表储存导出的学生信息,将有特定学生信息的结点删除,再将新的链表以重写的形式写入文件
break;
}
case 3:
{
inquiry(); //查询特定学生信息,将学生信息导出并存储在链表中,从链表中找到对应学生的信息
break;
}
case 4:
{
change(); //修改特定学生信息,将学生信息导出并存储在链表中,从链表中找到对应学生的信息进行修改
break;
}
default:
printf("操作已执行完成.");
}
return 0;
}
struct student *sense() //创建链表,将文件中的学生信息读入到链表中
{
int n=0;
FILE *fp;
struct student *head,*p1,*p2;
if(NULL==(fp=fopen("D:\\student","rt")))
{
printf("学生成绩信息为空!!!");
exit(0);
}
while(!feof(fp))
{
p1=(struct student *)malloc(LEN);
n++;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
fscanf(fp,"%u %s %d %d %d %d %f",&Number,Name,&Math,&English,&Sport,&Computer,&Time);
p1->number=Number;
strcpy(p1->name,Name);
p1->math=Math;
p1->english=English;
p1->sport=Sport;
p1->computer=Computer;
p1->time=Time;
}
p1->next=NULL;
fclose(fp);
return head;
}
void print()
{
FILE *fp=fopen("D:\\student","at");
printf("学生学号:");
scanf("%u",&Number);
printf("学生姓名:");
scanf("%s",Name);
printf("数学成绩:");
scanf("%d",&Math);
printf("英语成绩:");
scanf("%d",&English);
printf("体育成绩:");
scanf("%d",&Sport);
printf("计算机成绩:");
scanf("%d",&Computer);
printf("录入时间;");
scanf("%f",&Time);
fprintf(fp,"%u %s %d %d %d %d %2.2f\n",
Number,Name,Math,English,Sport,Computer,Time);
fclose(fp);
}
void inquiry()
{
unsigned i;
struct student *p;
p=sense();
printf("请输入要查询的学生的学号;");
scanf("%u",&i);
while(p)
{
if(p->number==i)
{
break;
}
else
{
p=p->next;
}
}
if(p)
{
printf("该学生的成绩信息为: 学号:%u,姓名:%s,数学成绩:%d,英语成绩:%d,体育成绩:%d,计算机成绩:%d,录入时间:%2.2f\n",
p->number,p->name,p->math,p->english,p->sport,p->computer,p->time);
rankingmath(p->math);
rankingenglish(p->english);
rankingsport(p->sport);
rankingcomputer(p->computer);
}
else
{
printf("该学号不存在.");
}
}
void del()
{
unsigned i;
struct student *head,*p1,*p2; //声明三个指向结构体的指针
head=sense(); //将带有学生信息的链表头指针赋给head
p2=head; //将head赋给p2
p1=head->next; //将头结点的下个结点的指针赋值个p1
printf("请输入要删除的学生信息的学号;");
scanf("%u",&i);
if(p2->number==i) //如果头结点的学生学号符合所要删除的学生学号
{
head=p1; //将p1即头结点的下一个结点赋给head,让其成为新的头结点
}
else
{
while(p1!=NULL) //当p1不指向空时
{
if(p1->number!=i) //p1指向的结点的学生学号不为所要的学生学号
{
p2->next=p1; //将p2移动到下一个结点
p1=p1->next; //将p1移动到下一个结点
}
else //当p1指向的结点的学生学号尾所要的学生学号
{
p2->next=p1->next; //删除该结点
break; //跳出循环
}
}
}
leading(head); // 将删除后的链表重新导入文件的函数
}
void change() //修改学生信息
{
unsigned i;
struct student *head,*p1; //声明两个指向结构体的指针
p1=sense(); //将从文件中读取到学生信息的链表表头指针赋给p1
head=p1; //将p1赋给head
printf("请输入要修改的学生的学号:");
scanf("%u",&i);
while(p1->number!=i && p1->next!=NULL) //当结点的学号不为输入的 i 且该节点不为尾结点时
{
p1=p1->next; //移动到下一结点
}
if(p1->next==NULL) //如果移动到了尾节点
{
printf("该学号不存在,请重新输入!!!");
}
else //如果找到对应所要寻找的学生信息的结点
{
printf("请重新输入该学生的成绩信息:"); //修改该学生的信息
printf("数学成绩:");
scanf("%d",&Math);
printf("英语成绩:");
scanf("%d",&English);
printf("体育成绩:");
scanf("%d",&Sport);
printf("计算机成绩:");
scanf("%d",&Computer);
printf("录入时间;");
scanf("%.2f",&Time);
p1->math=Math;
p1->english=English;
p1->sport=Sport;
p1->computer=Computer;
p1->time=Time;
}
leading(head); // 将修改后的链表重新导入文件的函数
}
void count()
{
struct student *p;
int n,m,e,s,c,toalmath,toalenglish,toalsport,toalcomputer,passmath,passenglish,passsport,passcomputer;
n=m=e=s=c=0;
p=sense();
do
{
toalmath+=p->math;
if(p->math>60)
{
passmath+=p->math;
m++;
}
toalenglish+=p->english;
if(p->english>30)
{
passenglish+=p->english;
e++;
}
toalsport+=p->sport;
if(p->sport>60)
{
passsport+=p->sport;
s++;
}
toalcomputer+=p->computer;
if(p->computer>60)
{
passcomputer+=p->computer;
c++;
}
n++;
p=p->next;
}while(p);
printf("学生成绩平均分为:%d\n",(toalmath+toalenglish+toalsport+toalcomputer)/n);
printf("各科及格情况:数学及格人数为%d,英语及格人数为%d,体育及格人数为%d,计算机及格人数为%d\n",m,e,s,c);
printf("各科平均分情况:数学平均分为%d,英语平均分为%d,体育平均分为%d,计算机平均分为%d\n",toalmath/n,toalenglish/n,
toalsport/n,toalcomputer/n);
printf("各科目及格率情况:数学及格率为%.2f,英语及格率为%.2f,体育及格率为%,2f,计算机及格率为%.2f\n",m/n,e/n,s/n,c/n);
high();
fail();
}
void high()
{
struct student *p1,*p2,*p3,*p4;
int highmath,highenglish,highsport,highcomputer;
char creat1[10],creat2[10],creat3[10],creat4[10];
p1=p2=p3=p4=sense();
highmath=p1->math;
while(p1->next!=NULL)
{
p1=p1->next;
if(p1->math>highmath)
{
highmath=p1->math;
creat1[10]=p1->name[10];
}
}
highenglish=p2->english;
while(p2->next!=NULL)
{
p2=p2->next;
if(p2->english>highenglish)
{
highenglish=p2->english;
creat2[10]=p2->name[10];
}
}
highsport=p3->sport;
while(p3->next!=NULL)
{
p3=p3->next;
if(p3->sport>highsport)
{
highsport=p3->sport;
creat3[10]=p3->name[10];
}
}
highcomputer=p4->computer;
while(p4->next!=NULL)
{
p4=p4->next;
if(p4->computer>highcomputer)
{
highcomputer=p4->computer;
creat4[10]=p4->name[10];
}
}
printf("数学最高分的学生是%s,成绩为%d\n",creat1[10],highmath);
printf("英语最高分的学生是%s,成绩为%d\n",creat2[10],highenglish);
printf("体育最高分的学生是%s,成绩为%d\n",creat3[10],highsport);
printf("计算机最高分的学生是%s,成绩为%d\n",creat4[10],highcomputer);
}
void fail()
{
struct student *p1,*p2,*p3,*p4;
p1=p2=p3=p4=sense();
printf("数学不及格的学生:");
while(p1->next!=NULL)
{
if(p1->math<60)
{
printf("%s ",p1->name);
}
p1=p1->next;
}
printf("\n");
printf("英语不及格的学生:");
while(p2->next!=NULL)
{
if(p2->english<60)
{
printf("%s ",p2->name);
}
p2=p2->next;
}
printf("\n");
printf("体育不及格的学生:");
while(p3->next!=NULL)
{
if(p3->sport<60)
{
printf("%s ",p3->name);
}
p3=p3->next;
}
printf("\n");
printf("计算机不及格的学生:");
while(p4->next!=NULL)
{
if(p4->computer<60)
{
printf("%s ",p4->name);
}
p4=p4->next;
}
printf("\n");
}
void leading(struct student *head)
{
struct student *p; //声明一个指向结构体的指针
p=head; //将链表头指针赋给p
FILE *fp=fopen("D:\\student","wt+"); //以重写的形式打开文件
if(fp==NULL)
{
perror("fopen");
exit(0);
}
else
{
while(p!=NULL)
{
fprintf(fp,"%u %s %d %d %d %d %2.2f\n", //将学生信息写入文件
p->number,p->name,p->math,p->english,p->sport,p->computer,p->time);
p=p->next;
}
}
printf("该学生信息已删除.\n");
fclose(fp);
}
void rankingmath(int a)
{
int i,tmp;
int n=0;
int rank=0;
struct student *head,*p,*p1,*p2;
head=p=sense();
p1=head->next;
p2=head;
while(p)
{
n++;
p=p->next;
}
for(i=1;i<n;i++)
{
while(p1!=NULL)
{
if(p2->math<p1->math)
{
tmp=p1->math;
p1->math=p2->math;
p2->math=tmp;
}
p1=p1->next;
}
p2=p2->next;
p1=p2->next;
}
if(head->math==a)
{
printf("数学排名为1 ");
}
else
{
while(head->math!=a)
{
rank++;
head=head->next;
}
printf("数学排名为:%d ",rank+1);
}
}
void rankingenglish(int a)
{
int i,tmp;
int n=0;
int rank=0;
struct student *head,*p,*p1,*p2;
head=p=sense();
p1=head->next;
p2=head;
while(p)
{
n++;
p=p->next;
}
for(i=1;i<n;i++)
{
while(p1!=NULL)
{
if(p2->english<p1->english)
{
tmp=p1->english;
p1->english=p2->english;
p2->english=tmp;
}
p1=p1->next;
}
p2=p2->next;
p1=p2->next;
}
if(a==head->english)
{
printf("英语排名为:1 ");
}
else
{
while(head->english!=a)
{
rank++;
head=head->next;
}
printf("英语排名为:%d ",rank+1);
}
}
void rankingsport(int a)
{
int i,tmp;
int n=0;
int rank=0;
struct student *head,*p,*p1,*p2;
head=p=sense();
p1=head->next;
p2=head;
while(p)
{
n++;
p=p->next;
}
for(i=1;i<n;i++)
{
while(p1!=NULL)
{
if(p2->sport<p1->sport)
{
tmp=p1->sport;
p1->sport=p2->sport;
p2->sport=tmp;
}
p1=p1->next;
}
p2=p2->next;
p1=p2->next;
}
if(a==head->sport)
{
printf("体育排名为:1 ");
}
else
{
while(head->sport!=a)
{
rank++;
head=head->next;
}
printf("体育排名为:%d ",rank+1);
}
}
void rankingcomputer(int a)
{
int i,tmp;
int n=0;
int rank=0;
struct student *head,*p,*p1,*p2;
head=p=sense();
p1=head->next;
p2=head;
while(p)
{
n++;
p=p->next;
}
for(i=1;i<n;i++)
{
while(p1!=NULL)
{
if(p2->computer<p1->computer)
{
tmp=p1->computer;
p1->computer=p2->computer;
p2->computer=tmp;
}
p1=p1->next;
}
p2=p2->next;
p1=p2->next;
}
if(a==head->computer)
{
printf("计算机排名为:1 ");
}
else
{
while(head->computer!=a)
{
rank++;
head=head->next;
}
printf("计算机排名为:%d ",rank+1);
}
}
一个学生管理系统,里面有写入,删除,查询,修改学生信息的功能,不过不知道为什么,我不能进行修改与删除,希望有大佬帮我看一下我里面进行信息查询的change函数和del函数,现在调用到它就给我显示文件不存在。
void leading(struct student *); 函数里打开文件 FILE *fp=fopen("D:\\student","wt+"); //以重写的形式打开文件
冒号是中文里的冒号。这种文件名建议#define FileName "D:\\student".
|
-
|