学生成绩信息包括:学号、姓名、C语言成绩。试设计一选修课程系统,使之能提供以下功能:
系统以菜单方式工作(用键盘输入1~5之间的数来选择功能)
(1)成绩信息录入功能(成绩信息用文件保存)
(2)成绩信息浏览功能
(3)查询功能:按学号查询或按成绩段查询(至少一种查询方式)
(4)成绩信息的删除:(按学号进行删除某学生的成绩)
(5)成绩信息的修改:(按成绩修改,把55~59分之间的成绩都加上5分)
(6)自定义题目
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
char name[20];
char number[20];
double math;
double english;
double chinese;
double program;
} s[50];
void head()
{
printf("*******************************************************************\n");
printf("*** 学生成绩管理系统 ***\n");
printf("*** ***\n");
printf("*** 1.成绩信息录入 ***\n");
printf("*** 2.成绩信息统计 ***\n");
printf("*** 3.成绩信息浏览 ***\n");
printf("*** 4.成绩信息查询 ***\n");
printf("*** 5.成绩信息排序 ***\n");
printf("*** 6.成绩信息删除 ***\n");
printf("*** 7.成绩信息修改 ***\n");
printf("*** 8.更新成绩信息 ***\n");
printf("*** 0.退出成绩系统 ***\n");
printf("*** ***\n");
printf("*******************************************************************\n");
}
void daoru(struct student s[],int* n)
{
FILE *p;
if((p=fopen("data.txt","r"))==NULL)
{
printf("打开失败!");
exit(1);
}
else
{
while(!feof(p))
{
fscanf(p, " %s %s %lf %lf %lf %lf \n", s[*n].name, s[*n].number, &s[*n].math, &s[*n].english, &s[*n].chinese, &s[*n].program);
++(*n);
}
}
fclose(p);
}
void daochu(struct student s[], int n)
{
FILE *p;
int i=0;
if((p=fopen("data.txt", "w"))==NULL)
{
printf("无法打开此文件!");
}
else
{
while(n-- && n > 1)
{
fprintf(p, "%s %s %lf %lf %lf %lf\n", s[i].name, s[i].number, s[i].math, s[i].english, s[i].chinese, s[i].program);
}
fprintf(p, "%s %s %lf %lf %lf %lf", s[0].name, s[0].number, s[0].math, s[0].english, s[0].chinese, s[0].program);
}
fclose(p);
}
void dayin(struct student s[],int n)
{
int i;
double all;
printf("\n姓名\t\t学号\t\t数学\t英语\t语文\t程序\t总分\n");
for(i=0; i<n; i++)
{
all=s[i].math+s[i].english+s[i].chinese+s[i].program;
printf("%\s\t\t %s\t\t %.1lf\t %.1lf\t %.1lf\t %.1lf\t %.1lf\n", s[i].name, s[i].number, s[i].math, s[i].english, s[i].chinese, s[i].program, all);
}
}
void shuru(struct student s[], int* n)
{
int i=*n,j,k,m;
printf("请输入学生姓名:");
scanf("%s", s[i].name);
printf("请输入学生学号:");
for (j=0; ; j++)
{
m=0;
scanf("%s",s[i].number);
for (k=0; k<i; k++)
{
if (strcmp(s[i].number, s[k].number)==0)
{
m=m+1;
printf("学号重复,请重新输入学号:");
break;
}
}
if(m==0)
{
break;
}
}
printf("请输入数学成绩:");
scanf("%lf", &s[i].math);
printf("请输入英语成绩:");
scanf("%lf", &s[i].english);
printf("请输入语文成绩:");
scanf("%lf", &s[i].chinese);
printf("请输入程序成绩:") ;
scanf("%lf", &s[i].program);
printf("添加信息成功!\n");
*n=*n+1;
daochu(s,*n);
}
void paixu(struct student s[], int n)
{
int i,j;
double all1,all2;
struct student stu;
for(i=0; i<n-1; i++)
{
for(j=j+1; j<n; j++)
{
all1=s[i].math+s[i].english+s[i].chinese+s[i].program;
all2=s[j].math+s[j].english+s[j].chinese+s[j].program;
if(all1<all2)
{
stu=s[i];
s[i]=s[j];
s[j]=stu;
}
}
}
printf("排序后的数据:\n");
dayin(s, n);
}
void chazhao(struct student s[], int n)
{
char name[20], num[20];
int m1, m2=0,i,j;
printf("1.按姓名查找\n2.按学号查找\n选择查询方式(1或2):");
scanf("%d", &m1);
if (m1==1)
{
printf("请输入您要查找的学生姓名:");
scanf("%s",name);
for (i=0; i<n; i++)
{
if (strcmp(s[i].name, name)==0)
{
m2=m2+1;
if(m2==1)
{
printf("\n姓名\t\t学号\t数学\t英语\t语文\t程序\n");
}
printf("%s\t\t%s\t\t%f\t\t%f\t\t%f\t\t%f\n",s[i].name,s[i].number, s[i].math, s[i].english, s[i].chinese, s[i].program);
}
}
if(m2==0)
{
printf("没有此学生信息!\n");
}
}
else if(m1==2)
{
printf("请输入您要查找的学生学号:");
scanf("%s", num);
j=0;
for (i=0; i<n; i++)
{
if (strcmp(s[i].number, num)==0)
{
m2=m2+1;
if(m2==1)
{
printf("\n姓名\t\t学号\t数学\t英语\t语文\t程序\n");
}
printf("%s\t\t%s\t\t%f\t\t%f\t\t%f\t\t%f\n", s[i].name, s[i].number, s[i].math, s[i].english, s[i].chinese, s[i].program);
}
}
if(m2==0)
{
printf("没有此学生信息!\n");
}
}
}
void shanchu(struct student s[], int* n)
{
char num[20];
int m=0,i,j;
printf("请输入您要删除的学生学号:");
scanf("%s",num);
for(i=0; i<=*n; i++)
{
if (strcmp(s[i].number, num)==0)
{
m=m+1;
for(j=i; j<*n; j++)
{
s[j]=s[j+1];
}
*n=*n-1;
}
}
if(m==0)
{
printf("没有此学生信息!\n");
}
else
{
daochu(s,*n);
printf("删除完毕!\n");
}
}
void allAndAver(struct student s[], int n)
{
int i;
double all,aver;
for(i=0; i<n; i++)
{
all=s[i].math+s[i].english+s[i].chinese+s[i].program;
aver=all/4;
printf("%s\t\t%s\t\t%.1lf\t%.1lf\n", s[i].name, s[i].number, all, aver);
}
}
void Fail(struct student s[], int n)
{
int i, fail[4]= {0};
for (i=0; i<n; i++)
{
if (s[i].math<60)
{
fail[0]++;
}
if (s[i].english<60)
{
fail[1]++;
}
if (s[i].chinese<60)
{
fail[2]++;
}
if (s[i].program<60)
{
fail[3]++;
}
}
printf("\n不及格信息:\n");
printf("数学不及格人数为:%d人\n",fail[0]);
printf("英语不及格人数为:%d人\n",fail[1]);
printf("语文不及格人数为:%d人\n",fail[2]);
printf("程序不及格人数为:%d人\n",fail[3]);
}
void Max(struct student s[],int n)
{
int i, counter[4]= {0};
double max[4]= {s[0].math, s[0].english, s[0].chinese, s[0].program};
for (i=0; i<n; i++)
{
if (s[i].math>max[0])
{
max[0]=s[i].math;
}
if (s[i].math>max[1])
{
max[1]=s[i].math;
}
if (s[i].math>max[2])
{
max[2]=s[i].math;
}
if (s[i].math>max[3])
{
max[3]=s[i].math;
}
}
for (i=0; i<n; i++)
{
if (s[i].math==max[0])
{
counter[0]++;
}
if (s[i].math==max[1])
{
counter[1]++;
}
if (s[i].math==max[2])
{
counter[2]++;
}
if (s[i].math==max[3])
{
counter[3]++;
}
}
printf("\n最高分信息:\n");
printf("数学最高分为:%.1lf, 人数为:%d人\n", max[0], counter[0]);
printf("英语最高分为:%.1lf, 人数为:%d人\n", max[1], counter[1]);
printf("语文最高分为:%.1lf, 人数为:%d人\n", max[2], counter[2]);
printf("程序最高分为:%.1lf, 人数为:%d人\n", max[3], counter[3]);
}
void Min(struct student s[],int n)
{
int i,counter[4]= {0};
double min[4]= {s[0].math, s[0].english, s[0].chinese, s[0].program};
for (i=0; i<n; i++)
{
if (s[i].math<min[0])
{
min[0]=s[i].math;
}
if (s[i].math<min[1])
{
min[1]=s[i].math;
}
if (s[i].math<min[2])
{
min[2]=s[i].math;
}
if (s[i].math<min[3])
{
min[3]=s[i].math;
}
}
for (i=0; i<n; i++)
{
if (s[i].math==min[0])
{
counter[0]++;
}
if (s[i].math==min[1])
{
counter[1]++;
}
if (s[i].math==min[2])
{
counter[2]++;
}
if (s[i].math==min[3])
{
counter[3]++;
}
}
printf("\n最低分信息:\n");
printf("数学最低分为:%.1lf, 人数为:%d人\n", min[0], counter[0]);
printf("英语最低分为:%.1lf, 人数为:%d人\n", min[1], counter[1]);
printf("语文最低分为:%.1lf, 人数为:%d人\n", min[2], counter[2]);
printf("程序最低分为:%.1lf, 人数为:%d人\n", min[3], counter[3]);
}
void update(struct student s[], int n)
{
char str[80];
int m=0,i=0;
printf("\n请输入要修改的学生的学号:");
scanf("%s",str);
for(i = 0; i < n;++i)
{
if(strcmp(s[i].number,str) == 0)
{
m = i;
break;
}
}
printf("\n请输入修改后的\"学号\"");
scanf("%s",s[m].number);
printf("\n请输入修改后的\"姓名\"");
scanf("%s",s[m].name);
printf("\n请输入修改后的\"数学成绩\":");
scanf("%lf",&s[m].math );
printf("\n请输入修改后的\"英语成绩\":");
scanf("%lf",&s[m].english );
printf("\n请输入修改后的\"语文成绩\":");
scanf("%lf",&s[m].chinese );
printf("\n请输入修改后的\"编程成绩\":");
scanf("%lf",&s[m].program );
}
void tongji(struct student s[], int n)
{
printf("统计信息如下:\n");
printf("\n姓名\t\t学号\t\t总分\t平均分\n");
allAndAver(s, n);
Max(s, n);
Min(s, n) ;
Fail(s, n);
}
int main()
{
int k,n=0;
daoru(s,&n);
while(1)
{
head();
printf("\n请按对应的键选择相应的功能:");
scanf("%d",&k);
switch(k)
{
case 1:
shuru(s, &n);
break;
case 2:
tongji(s, n);
break;
case 3:
dayin(s, n);
break;
case 4:
chazhao(s, n);
break;
case 5:
paixu(s, n);
break;
case 6:
shanchu(s, &n);
break;
case 7:
update(s, n);
break;
case 8:
daochu(s,n);
break;
case 0:
exit(1);
break;
default :
printf("请输入正确的命令!\n");
}
system("pause");
system("cls");
}
return 0;
}
心得体会:
感觉好辛苦,在看到这个程序时以为很简单就没有太在意,当真正写出来的时候发现有好多错误,感觉好悲伤,但是要有耐心,经历了半天的时间再加上舍友的帮忙终于改好了,不容易啊。在写程序是我们要有一颗卑微的心,不要太过骄傲,不懂就要问。