第二次作业: 二维数组

简介: 高级语言程序设计报告 实习题目第二次作业: 二维数组P228计算机双学位第8章实验题:学生成绩管理系统l 在上次作业的基础上,改为每学生2门课,用二维数组编程实现相应功能,相应功能所有涉及分数的均需可以处理每门课程分数及每个学生课程总分。

高级语言程序设计报告

 

实习题目

第二次作业: 二维数组

    1. P228计算机双学位第8章实验题:学生成绩管理系统

l 在上次作业的基础上,改为每学生2门课,用二维数组编程实现相应功能,相应功能所有涉及分数的均需可以处理每门课程分数及每个学生课程总分。

l 涉及到排序的,均需提供冒泡及选择两种排序方法,可增加菜单项。

l 功能5中按学号查询学生排名及成绩,要求用折半法,为此你的学生数据可以多一点。

l 数组中可以事先有数据(省却每次输入数据浪费时间),为此输入数据菜单可以改造为增加数据菜单。

l 在一次运行过程中,菜单功能应该可以循环多次使用,直到确定退出。

l 程序输入界面应该是美观、友好的。

l 本题无需在ACM系统中完成。

 

 

    1. 你的代码、注释及运行结果贴图。

#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);

}

 

 

 

    1. 设计及调试过程遇到的问题及解决方案。

    不会折半查找,不知道冒泡排序就是交换法,开始时遇到的各种高级问题,从没见过,还有对二维数组的使用真是尴尬,连调用都不会,后来才慢慢从书上边抄边学,明白了二维数组的调用注意什么,其实每次报告都会知道许多注意事项,然后就会用了,折半查找完全是从书上copy下来的,抄完也就会的差不多了,区分冒泡和交换是问同学的,那个高级问题其实我没有解决,后来直接按书上的抄下来,也就对了,波波老师死活不肯告诉我。看了刘兴的程序后震惊了,自己又添加了美化的零件,弥补了一些细节,让使用者不仅用的舒服,而且看得舒服,才是一个好的程序猿。

    1. 心得体会和自我对程序的评价。

还是万事开头难,刚开始真不知道怎么下手,慢慢一点一点才搞出来的,有了第一个,就继续我的复制粘贴大业了,首先一定要迈出第一步,老拖着什么都做不成,这不狠下心来不也做成了吗,费劲,也要努力去抠。我感觉作报告真的很有用,能一下让我知道很多东西,以前不懂得都懂了,对于我的程序,和刘兴的相比真是不敢望其项背,在外观和实用性上有待改善,总之提升空间很大很大,加油,许恺,要做就做一个优质的程序员。

相关文章
|
6月前
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
49 0
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
|
5月前
1049 数列的片段和 (20 分) //运行超时
1049 数列的片段和 (20 分) //运行超时
|
6月前
|
Java 大数据 数据处理
获取到数据循环写文件
这段代码是一个Java方法,用于分批处理数据。它定义了初始值和每批处理的数量,然后通过`PageInfo`对象获取数据。如果总数小于1,则直接返回空列表。否则,循环处理数据,防止环境中的多次空跳过,并在处理完一批数据后更新页码。代码中还提到,这个过程可以用于减少大数据操作带来的风险。此外,配有一张动图,可能表示数据处理的过程。
43 1
|
6月前
|
Java
【java作业2】统计字符串中连续相同最大个数 & 连续相同数组元素
一、统计字符串中连续相同最大个数 问题描述 编写方法实现统计一个字符串中连续相同的字符中最长的字符及其长度;然后编写程序测试该方法;
97 0
【java作业2】统计字符串中连续相同最大个数 & 连续相同数组元素
|
存储
学C的第二十三天【继续深度剖析数据在内存中的存储:3. 浮点型在内存中的存储(重点);练习:1. 有序序列判断;2. 获得月份天数(多组输入);3. 使用指针打印数组内容;4. 使用指针使字符串逆序】-2
(4). 取出内存中的 指数E(三种情况):E全为1 指数E 是通过 真实值+中间值 算出来的,如果E全是1,(32位系统)说明E的真实值是 128,指数是128说明这个值是非常大的。 这时,如果 有效数字M 全为0,表示 ±无穷大(正负取决于符号位s)
如何在把创建临时变量的前提下交换两个数(直接上代码)
如何在把创建临时变量的前提下交换两个数(直接上代码)
|
C语言
指针数组等作业
指针数组等作业
105 0
指针数组等作业