中国儿童失联守护站:c语言程序设计

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/05 20:02:23
要求
假设有一个班级学生n人,期末考试老师要对成绩从高到低列出,并对各科的考试成绩求出其最高分、最低分和平均成绩。试设计一个成绩管理程序,按要求显示输出学生的记录和相关的成绩。
(1)学生成绩的数据来源于程序的结构数组,定义若干个(不少于10)学生的记录,学生记录包括:学号、姓名、三至五门科目的考试成绩;
(2)使用一种排序算法对上述某门科目的成绩进行排序;
(3)将排序后的成绩,以每个学生记录的形式显示输出;
(4)求出每门科目的最高分、最低分和平均分的信息;
(5)输出的数据要清晰,排列整齐。

#include <iostream.h>
#include <iomanip.h>
#define SN 10 // 学生人数
#define CN 3 // 课程数目
int course; // 要排序的那门课程
struct student
{ int num;
char name[10];
int score[CN];
};
void bubble(struct student *pstu) //冒泡排序(从大到小)
{ struct student tmp;
for (int i = 0; i < SN; i++) // 要排SN个数,则应排SN遍:
{
for(int j = 0; j < SN - i - 1; j++)
{
if(pstu[j+1].score[course] > pstu[j].score[course]) //比较相邻的两个数:
{ tmp = pstu[j+1];
pstu[j+1]= pstu[j];
pstu[j]= tmp;
} //对调两个数,需要有"第三者"参以
}
}
}
void output(struct student *pstu)
{
cout<<setw(8)<<"学号";
cout<<setw(10)<<"姓名";
cout<<setw(8)<<"语文";
cout<<setw(8)<<"数学";
cout<<setw(8)<<"外语"<<endl;
for(int i=0;i<SN;i++)
{ cout<<setw(8)<<pstu[i].num;
cout<<setw(10)<<pstu[i].name;
for (int j=0;j<CN;j++)
cout<<setw(8)<<pstu[i].score[j];
cout<<endl;}
}
void avgscore(struct student *pstu)
{
int sum[CN],n;
for(n=0; n<CN; n++)
{ sum[n]=0;
for(int j=0; j<SN; j++)
sum[n]+=pstu[j].score[n];
}
cout<<"各科课程的平均成绩:";
for(n=0;n<CN; n++)
cout<<setw(5)<<sum[n]/SN;
cout<<endl;
}
void maxmin(struct student *pstu)
{
int max[CN],min[CN],n;
for(n=0; n<CN; n++)
{ max[n]=0;
min[n]=100;
for(int j=0; j<SN; j++)
{ if (pstu[j].score[n]>max[n])
max[n]=pstu[j].score[n];
if (pstu[j].score[n]<min[n])
min[n]=pstu[j].score[n];
}
}
cout<<"各科课程的最高分: ";
for(n=0;n<CN; n++)
cout<<setw(5)<<max[n];
cout<<endl;
cout<<"各科课程的最低分: ";
for(n=0;n<CN; n++)
cout<<setw(5)<<min[n];
cout<<endl;
}
void main()
{
struct student stu[SN]={
{2004101,"张大志",89,67,90},
{2004102,"杨小敏",65,80,56},
{2004103,"李 兵",76,66,71},
{2004104,"周星华",60,76,88},
{2004105,"王小青",82,90,78},
{2004106,"陈江海",70,81,93},
{2004107,"刘慧姗",85,60,76},
{2004108,"张真真",80,76,61},
{2004109,"林华强",70,66,98},
{2004110,"郭云风",62,60,87},
};
int n;
cout<<setw(30)<<"*** 学生成绩管理 ***"<<endl<<endl;
cout<<"要对第几门课程的成绩排序: ";
cin>>n; //输入要排序的第几门课程
course=n-1;
struct student *pstu=stu;
cout<<endl;
bubble(pstu);
output(pstu);
cout<<endl;
maxmin(pstu);
avgscore(pstu);
}

刚好最近也做了这个课程设计
参考一下吧 但是不要完全照搬哦 自己思考一下吧```~~

#include "stdio.h"
void menu();
void tongji();
void list();
void add();
void del();
void update();
void select();
void high();
void highest();
void sumt();
void allt();

typedef struct
{ char number[10];
char name[10];
int point;
char teacher[10];
} CLASS;
char filename[]="class.db";

main()
{ int i;
FILE *fp;
fp=fopen(filename,"rb");
if(fp==NULL)
{printf("打开文件失败 \n\n");
printf("键入数字 1 创建课程数据库文件\n");
printf("其它任意键离开\n");
scanf("%d",&i);
if(i==1)
{fp=fopen(filename,"wb");
menu();
}

}
else menu();
}

void menu()
{ int ks;
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("9. 统计教师学分 \n");
printf("0. 各教师课程数 \n");
printf("请选择所需要的功能 :");
scanf("%d",&ks);
if(ks==1)tongji();
else if(ks==2)list();
else if(ks==3)add();
else if(ks==4)del();
else if(ks==5)update();
else if(ks==6)select();
else if(ks==7)high();
else if(ks==8)highest();
else if(ks==9)sumt();
else if(ks==0)allt();
else printf("输入有误!!!!");
}

void tongji()
{ int num=0,key;
FILE *fp;
CLASS ac;
fp=fopen(filename,"rb");
if(fp==NULL)
{printf("打开文件失败 ");
return;
}
while(!feof(fp))
{
fread(&ac,sizeof(CLASS),1,fp);
num++;
}
printf("\n共有%d门课程\n\n",num-1);
fclose(fp);

printf("0. 退出 \n");
printf("其他任意数字键返回主菜单 \n");
scanf("%d",&key);
if(key==0);
else menu();
}

void list()
{ int num=0,n,key;
FILE *fp;
CLASS ac;
fp=fopen(filename,"rb");
if(fp==NULL)
{printf("打开文件失败 ");
return;
}
while(!feof(fp))
{
fread(&ac,sizeof(ac),1,fp);
num++;
}
fclose(fp);

fp=fopen(filename,"rb");
for(n=0;n<num-1;n++)
{
fread(&ac,sizeof(CLASS),1,fp);
printf("\n%10s%10s%5d%10s\n",ac.number,ac.name,ac.point,ac.teacher);
}
fclose(fp);

printf("0. 退出 \n");
printf("其他任意数字键返回主菜单 \n");
scanf("%d",&key);
if(key==0);
else menu();

}

void add()
{ int num=0,n,key=0;
FILE *fp;
CLASS ac[100],ab;
fp=fopen(filename,"rb");
if(fp==NULL)
{
printf("打开文件失败 ");
return;
}
printf("\n输入所要添加的课程代号,课程名称,学分,任课老师:\n");
scanf("%s %s %d %s",ab.number,ab.name,&ab.point,ab.teacher);
while(!feof(fp))
{
fread(&ac[num],sizeof(CLASS),1,fp);
if(strcmp(ab.name,ac[num].name)==0||strcmp(ab.number,ac[num].number)==0)
{
printf("\n\n此课程号或名已经存在,请重新添加\n\n");
key++;
break;
}
num++;
}
fclose(fp);

fp=fopen(filename,"ab");
if(key==0)
{
fwrite(&ab,sizeof(CLASS),1,fp);
printf("添加成功! \n");
}
fclose(fp);

printf("1. 继续添加 \n");
printf("0. 退出 \n");
printf("其他任意数字键返回主菜单 \n");
scanf("%d",&key);
if(key==0);
else if(key==1)add();
else menu();
}

void del()
{ int num=0,n,key;
char c[10];
FILE *fp;
CLASS ac[100];
fp=fopen(filename,"rb");
if(fp==NULL)
{printf("打开文件失败 ");
return;
}
while(!feof(fp))
{
fread(&ac[num],sizeof(CLASS),1,fp);
num++;
}
fclose(fp);

fp=fopen(filename,"wb");
printf("\n输入想删除课程的代号: ");
scanf("%s",c);
for(n=0;n<num-1;n++)
{
if(strcmp(c,ac[n].number)!=0)
fwrite(&ac[n],sizeof(CLASS),1,fp);

}
printf("\n删除成功 \n");
fclose(fp);

printf("1. 继续删除 \n");
printf("0. 退出 \n");
printf("其他任意数字键返回主菜单 \n");
scanf("%d",&key);
if(key==0);
else if(key==1)del();
else menu();

}

void update()
{ int num=0,k=-1,key;
char c[10];
FILE *fp;
CLASS ac[10];
fp=fopen(filename,"rb");
if(fp==NULL)
{printf("打开文件失败 ");
return;
}
printf("\n输入想修改课程的代号: ");
scanf("%s",c);

while(!feof(fp))
{
fread(&ac[num],sizeof(CLASS),1,fp);
if(strcmp(c,ac[num].number)==0)k=num;
num++;

}
fclose(fp);
if(k==-1)
{
printf("\n无此课程号!!!!\n");
update();
}
fp=fopen(filename,"wb");
printf("新的课程名称: ");
scanf("%s",c);
strcpy(ac[k].name,c);
for(k=0;k<num-1;k++)
fwrite(&ac[k],sizeof(CLASS),1,fp);
printf("\n修改成功 \n\n");
fclose(fp);
printf("1. 继续修改 \n");
printf("0. 退出 \n");
printf("其他任意数字键返回主菜单 \n");
scanf("%d",&key);
if(key==0);
else if(key==1)update();
else menu();
}

void select()
{ int num=0,k=0,key;
char c[10];
FILE *fp;
CLASS ac;
fp=fopen(filename,"rb");
if(fp==NULL)
{printf("打开文件失败 ");
return;
}
printf("\n输入想要查询的课程名称 :");
scanf("%s",c);

while(!feof(fp))
{
fread(&ac,sizeof(CLASS),1,fp);

if(strcmp(c,ac.name)==0)
{
printf("\n%10s%10s%5d%10s\n",ac.number,ac.name,ac.point,ac.teacher);
k++;
break;
}
num++;
}
if(k==0)printf("\n无所要查询的信息\n\n");
fclose(fp);

printf("1. 继续查询 \n");
printf("0. 退出 \n");
printf("其他任意数字键返回主菜单 \n");
scanf("%d",&key);
if(key==0);
else if(key==1)select();
else menu();

}
void high()
{ int num=0,n=0,key;
FILE *fp;
CLASS ac[100];
fp=fopen(filename,"rb");
if(fp==NULL)
{printf("打开文件失败 ");
return;
}
while(!feof(fp))
{
fread(&ac[num],sizeof(CLASS),1,fp);
if(ac[num].point>=2) n++;
num++;
}
printf("\n共有%d门高学分课程\n\n",n);
fclose(fp);

printf("0. 退出 \n");
printf("其他任意数字键返回主菜单 \n");
scanf("%d",&key);
if(key==0);
else menu();
}

void highest()
{ int num=0,n,i,max,key;
FILE *fp;
CLASS ac[100],ab;
fp=fopen(filename,"rb");
if(fp==NULL)
{printf("打开文件失败 ");
return;
}
while(!feof(fp))
{
fread(&ac[num],sizeof(CLASS),1,fp);
num++;
}
fclose(fp);

max=ac[0].point;
for(n=0;n<num-1;n++)
if(ac[n].point>max)
{max=ac[n].point;
i=n;
}

ab=ac[num-2];
ac[num-2]=ac[i];
ac[i]=ab;

fp=fopen(filename,"wb");
for(key=0;key<num-1;key++)
fwrite(&ac[key],sizeof(CLASS),1,fp);
printf("\n成功的放置到了尾端\n\n");
fclose(fp);
printf("0. 退出 \n");
printf("其他任意数字键返回主菜单 \n");
scanf("%d",&key);
if(key==0);
else menu();
}

void sumt()
{ int num=0,sum=0,key=0;
char c[10];
FILE *fp;
CLASS ac[100];
fp=fopen(filename,"rb");
if(fp==NULL)
{printf("打开文件失败 ");
return;
}
printf("\n输入所要查询教师的姓名\n");
scanf("%s",c);
while(!feof(fp))
{
fread(&ac[num],sizeof(CLASS),1,fp);
if(strcmp(c,ac[num].teacher)==0)
{sum+=ac[num].point;
key++;
}
num++;
}
if(key!=0)printf("\n教师 %s 所授课程的总学分为: %d \n\n",c,sum);
else printf("\n输入的教师姓名无效!!\n\n");
fclose(fp);
printf("0. 退出 \n");
printf("其他任意数字键返回主菜单 \n");
scanf("%d",&key);
if(key==0);
else menu();
}

void allt()
{ int num=0,n,s,i,key;
FILE *fp;
CLASS ac[100],ab;
fp=fopen(filename,"rb");
if(fp==NULL)
{printf("打开文件失败 ");
return;
}
printf("\n");
while(!feof(fp))
{
fread(&ac[num],sizeof(CLASS),1,fp);
num++;
}
fclose(fp);
for(n=0;n<num-1;n++)
{
ab=ac[n];
i=0;
s=0;
for(key=0;key<n;key++)
{
if(strcmp(ab.teacher,ac[key].teacher)==0)
{
i=1;
break;
}
}
for(key=n;key<num-1;key++)
{
if(i==1) break;
if(strcmp(ab.teacher,ac[key].teacher)==0)
s++;
}

if(i!=1) printf(" %s 所授课程数为 %d\n",ab.teacher,s);

}
printf("0. 退出 \n");
printf("其他任意数字键返回主菜单 \n");
scanf("%d",&key);
if(key==0);
else menu();
}

呵呵,这个东西上学的时候做过的,当时还得了个高分,只不过好多年不碰了,忘了。我试试翻翻以前的书,看还能想起来不了。