第二次作业: 二维数组

简介: 高级语言程序设计报告 实习题目第二次作业: 二维数组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. 心得体会和自我对程序的评价。

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

相关文章
|
4月前
|
Java
java有3个独立的线程,一个只会输出A,一个只会输出L,一个只会输出I。在三个线程同时启动的情况下,如何让它们按顺序打印ALIALI。
java有3个独立的线程,一个只会输出A,一个只会输出L,一个只会输出I。在三个线程同时启动的情况下,如何让它们按顺序打印ALIALI。
53 1
|
19小时前
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
4 0
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
|
4月前
|
Java
【java作业2】统计字符串中连续相同最大个数 & 连续相同数组元素
一、统计字符串中连续相同最大个数 问题描述 编写方法实现统计一个字符串中连续相同的字符中最长的字符及其长度;然后编写程序测试该方法;
51 0
【java作业2】统计字符串中连续相同最大个数 & 连续相同数组元素
|
9月前
|
存储
学C的第二十三天【继续深度剖析数据在内存中的存储:3. 浮点型在内存中的存储(重点);练习:1. 有序序列判断;2. 获得月份天数(多组输入);3. 使用指针打印数组内容;4. 使用指针使字符串逆序】-2
(4). 取出内存中的 指数E(三种情况):E全为1 指数E 是通过 真实值+中间值 算出来的,如果E全是1,(32位系统)说明E的真实值是 128,指数是128说明这个值是非常大的。 这时,如果 有效数字M 全为0,表示 ±无穷大(正负取决于符号位s)
|
9月前
学C的第三天(多组输入的一种方法;简单了解函数,数组,多种操作符)-2
10.2:移位操作符(移动的是二进制位): >>(右移) <<(左移) 10.3:位操作符(操作的额也是二进制位): &(按位与) ^(按位异或) |(按位或)
|
10月前
根据输入的二位数组的行数和列数,动态地为该数组分配存储空间;其次,向二维数组中输入数据;最后输出该数组中的所有原色
根据输入的二位数组的行数和列数,动态地为该数组分配存储空间;其次,向二维数组中输入数据;最后输出该数组中的所有原色
|
11月前
斐讯面试记录—三线程交替打印ABC
斐讯面试记录—三线程交替打印ABC
46 0