第二次作业: 二维数组
高级语言程序设计报告
实习题目 |
第二次作业: 二维数组
l 在上次作业的基础上,改为每学生2门课,用二维数组编程实现相应功能,相应功能所有涉及分数的均需可以处理每门课程分数及每个学生课程总分。 l 涉及到排序的,均需提供冒泡及选择两种排序方法,可增加菜单项。 l 功能5中按学号查询学生排名及成绩,要求用折半法,为此你的学生数据可以多一点。 l 数组中可以事先有数据(省却每次输入数据浪费时间),为此输入数据菜单可以改造为增加数据菜单。 l 在一次运行过程中,菜单功能应该可以循环多次使用,直到确定退出。 l 程序输入界面应该是美观、友好的。 l 本题无需在ACM系统中完成。 |
- 你的代码、注释及运行结果贴图。
#include <stdio.h>
#include <stdlib.h>
#define N 30
#define M 4
void paixu(int a[][M],int m);
void shuxuepaiming(int a[][M],int m);
void yingyupaiming(int a[][M],int m);
void zongfenpaiming(int a[][M],int m);
void xuehaopaiming(int a[][M],int m);
void fenlei(int a[][M],int m);
int chazhao(int a[][M],int m);
void shuru(int a[][M],int m);
int jisuan(int a[][M],int m);
void shuchu(int a[][M],int m);
int main()
{
int x,o,y,n,z,m,a[N][M];
printf(" 欢迎进入学生成绩管理系统\n");//进入系统
printf("请输入人数 m:");
scanf("%d",&m);
for(o=0;o<m;o++)
{
a[o][0]=2014011000+o;
a[o][1]=rand()%90+10;
a[o][2]=rand()%90+10;
a[o][3]=a[o][1]+a[o][2];
}
for(y=0;y>=0;y++) //选择菜单
{
printf("1.手动输入数据\n");
printf("2.计算总分和平均分\n");
printf("3.按分数排名\n");
printf("4.按学号排名\n");
printf("5.按学号查找\n");
printf("6.数据分析\n");
printf("7.清单记录\n");
printf("0.退出系统\n");
printf("请输入您的选择:");
scanf("%d",&n);
switch(n) //选择结果
{
case 1:shuru(a,m);
break;
case 2:jisuan(a,m);
break;
case 3:paixu(a,m);
break;
case 4:xuehaopaiming(a,m);
break;
case 5:x=chazhao(a,m);
printf("数学:%d 英语:%d 总分:%d\n",a[x][1],a[x][2],a[x][3]);
break;
case 6:fenlei(a,m);
break;
case 7:shuchu(a,m);
break;
case 0:break;
}
if(n==0) break; //退出系统
}
return 0;
}
void shuru(int a[][M],int m) //手动输入数据函数
{
int i,n,o;
printf("请输入数据\n");
for(i=0;i<m;i++)
{
printf("学号 数学 英语\n");
scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);
if(a[i][0]<0) break;
a[i][3]=a[i][1]+a[i][2];
printf("个人总分:%d\n",a[i][3]);
}
}
int jisuan(int a[][M],int m) //计算各种分函数
{
int i,s=0,y=0,z=0;
for(i=0;i<m;i++)
{
s=s+a[i][1];
y=y+a[i][2];
z=z+a[i][3];
}
printf("数学总分:%d 数学平均:%d 英语总分:%d 英语平均:%d\n",s,s/m,y,y/m);
printf(" 总分数:%d 平均分:%d\n",z,z/m);
return (z);
}
void paixu(int a[][M],int m) //排序函数
{
int t;
printf("按数学排名输入1,按英语排名输入2,按总分排名输入3\n"); //选择排序方法
scanf("%d",&t);
if(t==1) shuxuepaiming(a,m);
else {
if(t==2) yingyupaiming(a,m);
else zongfenpaiming(a,m);
}
}
void shuxuepaiming(int a[][M],int m)//数学排序函数
{
int i,t,p,q,o,g;
printf("请选择排序方法:1.冒泡法 2.选择法");//选择排序方法
scanf("%d",&g);
if(g==2)
{
for(i=0;i<m;i++)//选择排序法
{
q=i;
for(t=i+1;t<m;t++)
{
if(a[t][1]>a[i][1])
{
q=t;
}
}
if(q!=i)
{
a[q][1]=a[q][1]+a[i][1];
a[i][1]=a[q][1]-a[i][1];
a[q][1]=a[q][1]-a[i][1];
}
}
}
else
{
for(i=0;i<m;i++)//冒泡排序法
{
for(t=i+1;t<m;t++)
{
if(a[t][1]<a[i][1])
{
a[t][1]=a[t][1]+a[i][1];
a[i][1]=a[t][1]-a[i][1];
a[t][1]=a[t][1]-a[i][1];
}
}
}
}
printf("学号 数学 英语 总分\n");
for(p=0;p<m;p++)
{
printf("%d * %d * %d * %d\n",a[p][0],a[p][1],a[p][2],a[p][3]);
}
}
void yingyupaiming(int a[][M],int m)//英语排序函数
{
int i,t,p,q,o,g;
printf("请选择排序方法:1.冒泡法 2.选择法");
scanf("%d",&g);
if(g==2)
{
for(i=0;i<m;i++)//选择排序法
{
q=i;
for(t=i+1;t<m;t++)
{
if(a[t][2]>a[i][2])
{
q=t;
}
}
if(q!=i)
{
a[q][2]=a[q][2]+a[i][2];
a[i][2]=a[q][2]-a[i][2];
a[q][2]=a[q][2]-a[i][2];
}
}
}
else
{
for(i=0;i<m;i++)//冒泡排序法
{
for(t=i+1;t<m;t++)
{
if(a[t][2]<a[i][2])
{
a[t][2]=a[t][2]+a[i][2];
a[i][2]=a[t][2]-a[i][2];
a[t][2]=a[t][2]-a[i][2];
}
}
}
}
printf("学号 数学 英语 总分\n");
for(p=0;p<m;p++)
{
printf("%d * %d * %d * %d\n",a[p][0],a[p][1],a[p][2],a[p][3]);
}
}
void zongfenpaiming(int a[][M],int m)//总分排序函数
{
int i,t,p,q,o,g;
printf("请选择排序方法:1.冒泡法 2.选择法");
scanf("%d",&g);
if(g==2)
{
for(i=0;i<m;i++)//选择排序法
{
q=i;
for(t=i+1;t<m;t++)
{
if(a[t][3]>a[i][3])
{
q=t;
}
}
if(q!=i)
{
a[q][3]=a[q][3]+a[i][3];
a[i][3]=a[q][3]-a[i][3];
a[q][3]=a[q][3]-a[i][3];
}
}
}
else
{
for(i=0;i<m;i++)//冒泡排序法
{
for(t=i+1;t<m;t++)
{
if(a[t][3]<a[i][3])
{
a[t][3]=a[t][3]+a[i][3];
a[i][3]=a[t][3]-a[i][3];
a[t][3]=a[t][3]-a[i][3];
}
}
}
}
printf("学号 数学 英语 总分\n");
for(p=0;p<m;p++)
{
printf("%d * %d * %d * %d\n",a[p][0],a[p][1],a[p][2],a[p][3]);
}
}
void xuehaopaiming(int a[][M],int m)//学号排序函数
{
int i,t,p,q,o,g;
printf("请选择排序方法:1.冒泡法 2.选择法");
scanf("%d",&g);
if(g==2)
{
for(i=0;i<m;i++)//选择排序法
{
q=i;
for(t=i+1;t<m;t++)
{
if(a[t][0]>a[i][0])
{
q=t;
}
}
if(q!=i)
{
a[q][0]=a[q][0]+a[i][0];
a[i][0]=a[q][0]-a[i][0];
a[q][0]=a[q][0]-a[i][0];
}
}
}
else
{
for(i=0;i<m;i++)//冒泡排序法
{
for(t=i+1;t<m;t++)
{
if(a[t][0]<a[i][0])
{
a[t][0]=a[t][0]+a[i][0];
a[i][0]=a[t][0]-a[i][0];
a[t][0]=a[t][0]-a[i][0];
}
}
}
}
printf("学号 数学 英语 总分\n");
for(p=0;p<m;p++)
{
printf("%d * %d * %d * %d\n",a[p][0],a[p][1],a[p][2],a[p][3]);
}
}
void fenlei(int a[][M],int m)//按成绩分类函数
{
int i,t,p=0,q=0,r=0,s=0;
printf("数学分类输入1,英语分类输入2\n");
scanf("%d",&i);
for(t=0;t<m;t++)//优秀的
{
if(a[t][i]>=90) p++;
}
for(t=0;t<m;t++)//良好的
{
if(a[t][i]>=80&&a[t][i]<=89) q++;
}
for(t=0;t<m;t++)//中等的
{
if(a[t][i]>=70&&a[t][i]<=79) r++;
}
for(t=0;t<m;t++)//及格的
{
if(a[t][i]>=60&&a[t][i]<=69) s++;
}
printf(" 优秀:%d 良好:%d 中等:%d 及格:%d 不及格:%d\n",p,q,r,s,m-p-q-r-s);
printf("百分率:%d%% %d%% %d%% %d%% %d%%\n",100*p/m,100*q/m,100*r/m,100*s/m,100*(m-p-q-r-s)/m );
}
int chazhao(int a[][M],int m)//按学号查找函数
{
int b,c,d=0,e,f=0,low=0,high=m-1,mid;
printf("请选择查找方法:1.折半查找 2.顺序查找\n");//选择查找方法
scanf("%d",&e);
if(e==1)
{
printf("请输入学生学号:");//折半查找
scanf("%d",&b);
do
{
while(low<=high)
{
mid=(high+low)/2;
if(b>a[mid][0])
low=mid+1;
else if(b<a[mid][0])
high=mid-1;
else {return mid ;f++;}
}
if(f!=0) {
break;}
printf("无此学生成绩,请重试,若输入0,则退出:");
scanf("%d",&b);
if(b==0) break;
}while(b==0);
}
else
{
printf("请输入学生学号:");//顺序查找
scanf("%d",&b);
do
{
for(c=0;c<m;c++)
{
if(b==a[c][0])
{
printf("数学:%d 英语:%d 总分:%d\n",a[c][1],a[c][2],a[c][3]);
d++;
}
}
if(d==1) break;
printf("无此学生成绩,请重试,若输入0,则退出:");
scanf("%d",&b);
if(b==0) break;
}while(d==0);
}
}
void shuchu(int a[][M],int m)//输出成绩单函数
{
int i,s=0,y=0,z=0,b;
for(b=0;b<m;b++)
{
printf("学号:%d 数学:%d 英语:%d 总分:%d\n",a[b][0],a[b][1],a[b][2],a[b][3]);
}
for(i=0;i<m;i++)
{
s=s+a[i][1];
y=y+a[i][2];
z=z+a[i][3];
}
printf("数学总分:%d 数学平均:%d 英语总分:%d 英语平均:%d\n",s,s/m,y,y/m);
printf(" 总分数:%d 平均分:%d\n",z,z/m);
}
- 设计及调试过程遇到的问题及解决方案。
不会折半查找,不知道冒泡排序就是交换法,开始时遇到的各种高级问题,从没见过,还有对二维数组的使用真是尴尬,连调用都不会,后来才慢慢从书上边抄边学,明白了二维数组的调用注意什么,其实每次报告都会知道许多注意事项,然后就会用了,折半查找完全是从书上copy下来的,抄完也就会的差不多了,区分冒泡和交换是问同学的,那个高级问题其实我没有解决,后来直接按书上的抄下来,也就对了,波波老师死活不肯告诉我。看了刘兴的程序后震惊了,自己又添加了美化的零件,弥补了一些细节,让使用者不仅用的舒服,而且看得舒服,才是一个好的程序猿。
- 心得体会和自我对程序的评价。
还是万事开头难,刚开始真不知道怎么下手,慢慢一点一点才搞出来的,有了第一个,就继续我的复制粘贴大业了,首先一定要迈出第一步,老拖着什么都做不成,这不狠下心来不也做成了吗,费劲,也要努力去抠。我感觉作报告真的很有用,能一下让我知道很多东西,以前不懂得都懂了,对于我的程序,和刘兴的相比真是不敢望其项背,在外观和实用性上有待改善,总之提升空间很大很大,加油,许恺,要做就做一个优质的程序员。