Jack's Blog

流淌的心,怎能阻拦,吹来的风,又怎能阻挡。

       说起来倒是奇怪,倒是非常奇怪,现在竟然自己开始写起感言了。或许是希望时光不要过得太快吧,记录下这琐碎的心思。更重要的是希望自己能变得更好,不给只剩不到两年的大学生活留下遗憾。

       之前一直都很反感以成绩作为考核方式的单一评价体系,不知不觉自己也成了其中为成绩努力奋斗的一个。不过,暂时作为学生,还是努力地提高自己的成绩吧,毕竟作为弱势群体,只能去适应这个社会。或许这就是大人口中的成长吧?等长大后再来看这篇文章,或许会有其他看法吧。

       有时候离Excellence真的只差一点点的努力。其实每次考1、2名的同学,他们的确很厉害,差距是肯定要承认的。但是,也一定要有我能成为第一的决心。

       要成为第一二名:“战略上藐视敌人,战术上重视敌人。”我个人认为这句话真的说得太好了,其中有两个内涵,第一个是首先做到有信心,不卑不亢,相信自己的努力与付出是有结果的。另外一个是面对学习这个“敌人”看,要注意方法,不能轻视它。否则,是会经历惨痛教训的。

       在做到以上的要求之后,我们就应该已经达到了中上水平,这时候就可能进入了一个瓶颈期。在这个时候,最重要的是我们的心态。比如说对于我,就会忽然放松自己,学不进去了,但是就差这一点点的努力,离最高分就差不了多远了。再重复一遍,心态,心态,心态!!!这时候也是比毅力的时候,更是拼方法的时候。

       期中没做到上面的要求,希望自己期末做到吧。并且,平时一定要跟上节奏,千万不能落下。

一、背景

我的导师呢,主要工作是进行数值计算的工作,对计算机的要求较高。于是呢便花了80万购置了几台曙光服务器专门跑计算(夸张了点还是叫它超算)。由于超算的噪音很大,同时还要考虑其散热问题,于是我们便专门定制了隔间。然而,他当时给他自己挖下了个大坑,招了5个第三世界的博士生和博士后(唉,其中一个印度人身上简直咖喱味爆棚啊),然后导致...办公室地方紧张,进出超算房间的唯一入口被堵死了。好吧,这下又有任务了,导师叫我试着能不能在局域网内大家自己的电脑(其实主要是我和他的电脑)访问一下这台超算。然而有了之前NAS的经验,我知道,只要将ssh配置好,只要我在校园网内部,就可以使用任意一台智能终端访问这台超算。其实我们有静态IP,理论上从任何一个地方都可以访问这台超算,然而这都是后话了。嘿嘿嘿,等我快毕业了再说吧。

我们的配置有

  • 几台已经安装过Ubuntu并配置成功的服务器
  • 静态IP
  • 一台NETGEAR的高端路由器

还有无数个坐等吃山的师兄(好吧,我是最小的)。

二、方法

要建立ssh隧道

1.需要在服务器端和用户端都安装好ssh

sudo apt-get install openssh-client
sudo apt-get install openssh-server

接着查看进程,看看 ssh-agent 是否运行,如果没有,输入下面指令启动 ssh 服务进程。

sudo service ssh start

关闭进程:

sudo service ssh stop

2.接下来配置sshd

 

3.在局域网路由器内设置映射关系

1)绑定局域网内所连接的IP与电脑的MAC地址。

2)然后,在路由器上找到:转发规则-虚拟服务器,点击添加新条目

端口号写:22,然后加入linux PC所对应的IP地址。(Linux 机器上的端口号是22,所以为了方便Windows下ssh登录方便,故设置为22)

3)保存设置

继续阅读

函数的参数是什么样的?
结构体
struct A指针或引用
链表 数组
线性表
链表——无顺序数组
为什么是零散的状态?
1.可以动态申请内存
链表不需要任何静态的申请
eg.1
1 2 3 4 6 8 10
1 2 3 6 8 10
删除第四位
for(int i=3;i<=n;i++){
    a[i]=a[i+1]
}
链表插入一次就好
数组得挪很多次
链表访问比数组麻烦
链表结构体

声明一个指针函数
Struct link{
    int data;
    link* next;(内置类型的一个东西)
}
link *l;
l=new link();
(*l).data=15(l->data=15);
l->next =NULL;
link *head=new link();
link *push_back(link *p,int x)
{
    link *q= new link();
    q->data = x;
    q->next = NULL;
    p->next = q;
    return p->next;

}
Link *tmp = head;

链表访问复杂度较高(频繁插入删除,不频繁查找)
for(int i=1;i<10;i++)
{
    tmp = push_back(tmp,i);
}
栈 stack(抽象数据结构)
只能在顶端进行插入和删除
先进后出
队列(抽象数据结构)
可以用数组,也可用链表
数据结构
1.数据形态
2.数据操作

#include <iostream>

using namespace std;
struct A{
    int a;
    int b;
}A1={0};
struct A my_swap(int a1,int b1)
{
    A1.a=b1;
    A1.b=a1;
    return A1;
}

int main()
{
    int a=1,b=2;
    A A2= my_swap(a,b);
    my_swap(a,b);
    printf("%d %d",a,b);
    return 0;
}

用结构体实现了swap

其实最简单的还是用指针来写swap

my_swap(int &a,int &b)
my_swap(int *a,int *b)
/×
两种写法等价

然而直接用

my_swap(int a,int b);
是不能交换函数值的

因为虽然在这个函数虽然在这个函数内部互换了函数值,但是这仅仅局限与函数内部,对于整个main函数的调用并没有使用返回值。

我在想如果用内联函数进行展开是不是可以交换呢。读者们可以亲自试试。
inline int swap(int a,int b);

 

acm--3

输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。

你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。        

初玩can,接触第三天的一道水题

第一程序为最初所写,第二个为参考优化后,

#include"stdio.h"
main()
{
    char c;
    while((scanf("%c",&c))!=EOF)
    {
         char a[1300];
         long long int b[1300],sum=0;
         int state=0,temp,k=0,i,j,l;
        for(i=0;c!='\t'&&c!='\n'&&c!=' ';i++)
        {
            a[i]=c;
            scanf("%c",&c);
        }
        a[i]='\0';
        for(j=0;j<i;j++)
        {
            if(a[j]=='5')
            {
                  if(state==1)
                    b[k++]=sum;
                  state=0;
                  sum=0;
            }
            else if(a[j]=='0')
              {
                   state=1;
                sum=sum*10+a[j]-'0';
              }
            else
                {
                   sum=sum*10+a[j]-'0';
                   state=1;
                }
        }
        if(state==1)
            b[k++]=sum;
            k--;
        for(j=0;j<k;j++)
            for(l=0;l<k-j;l++)
        {
            if(b[l]>b[l+1])
            {
                temp=b[l];
                b[l]=b[l+1];
                b[l+1]=temp;
            }
        }
        for(i=0;i<=k-1;i++)
        {
            printf("%lld ",b[i]);
        }
        printf("%lld\n",b[i]);
    }
}

2.

#include"stdio.h"
#include"string.h"
main()
{
 
    int i,len,k,n,temp,j,l;
     char s[5005];
     while(scanf("%s",s)!=EOF)
    {
        int a[5005];
        n=0;
        k=0;
        len=strlen(s);
         s[len]='5';
         i=0;
         while(s[i++]=='5');  //跳过前缀5,防止多输出0
        for(i--;i<=len;++i)
        {
             if(i>0&&s[i]=='5'&&s[i-1]=='5') //忽略连续的5,防止多输出0
                 continue;
            if(s[i]!='5')
                 k=k*10+s[i]-'0';
            else            //遇到5就增加一个数
            {
                 a[n++]=k;
               k=0;
            }
        }
        for(j=0;j<n-1;j++)
            for(l=0;l<n-j-1;l++)
        {
            if(a[l]>a[l+1])
            {
                temp=a[l];
                a[l]=a[l+1];
                a[l+1]=temp;
            }
        }
        for(i=0;i<n-1;i++)
        {
            printf("%d ",a[i]);
        }
        printf("%d\n",a[i]);
    }
}

ACM--C++初学

       对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std

       这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义。其作用就在于避免发生重命名的问题。

#include <iostream>
using namespace std;
 
namespace ZhangSan
{
    int a=10; //张三把10赋值给了变量a
}
namespace LiSi
{
    int a=5; //李四把10赋值给了变量a
}
 
void main()
{
    int a=1;
    cout<<"张三定义的a="<<ZhangSan::a<<endl;
    cout<<"李四定义的a="<<LiSi::a<<endl;
    cout<<"主函数定义的a="<<a<<endl;   
}

上例中的“ZhangSan::a”和“LiSi::a”分别表示了调用张三命名空间中的a变量和李四命名空间中的a变量。这样的好处显而易见,那就是虽然张三和李四这两个程序员都定义了一个变量a,但是并不会出现重名的危险。

 2. 关于using namespace *

  顾名思义,using namespace * 就表示释放命名空间* 中间的东西。好处在于我们在程序里面就不用在每个函数的头上都加上*::来调用。比如说如果上面那个程序,如果我们不在using namespace std,那么我们就需要在主函数中的标准输出流cout函数前面加上std,写成
 
std::cout
表示调用std空间里面的标准输出流cout。但是有些时候我们也不能图这个方便,比如说如果在主函数中将命名空间ZhangSan和LiSi的中所定义的变量释放出来,如下例1:
#include <iostream>
using namespace std;
 
namespace ZhangSan
{
    int a=10; //张三把10赋值给了变量a
}
namespace LiSi
{
    int a=5; //李四把10赋值给了变量a
}
 
void main()
{
    int a=1;
    using namespace ZhangSan;
    using namespace LiSi;
    cout<<a<<endl;
}
如果我们在主函数中把 int a=1给删除,如下例2:
#include <iostream>
using namespace std;
 
namespace ZhangSan
{
    int a=10; //张三把10赋值给了变量a
}
namespace LiSi
{
    int a=5; //李四把10赋值给了变量a
}
 
void main()
{
    using namespace ZhangSan;
    using namespace LiSi;
    cout<<a<<endl;
}
会发现根本就不会通过编译,输出的错误信息为:
error C2872: “a”: 不明确的符号
  分析可以看出,上面这个例2会引起歧义。因为ZhangSan中间的a被释放出来,同理LiSi中间的a也被释放出来了。那么编译器就不知道到底哪个才是需要输出的a,自然就会引起歧义了。同理,在例1中,编译器同样不知道到底哪个才是需要输出的a,于是它只采用了主函数中自己定义的a,这样程序也不会报错,但是只会输出1,自然结果就如上面的图所示了。
摘自:http://www.cnblogs.com/uniqueliu/archive/2011/07/10/2102238.html

 

acm-第一题

Problem Description

对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。

Input

输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。

Output

对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。

Sample Input

0 1 0 0

Sample Output

OK
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int is_prime(int a)
{
    int j;
    for(j=2;j<=sqrt(a);j++)
    {
        if(a % j ==0)
        {
            return 1;
        }
    }
    return 0;
}

int main()
{

    int x,y;
    while(1)
    {
        int flag=0;
        scanf("%d%d",&x,&y);
        int i;
        if(x==0&&y==0)
            return 0;
        if(x>y)
        {
            int t=y;
            y=x;
            x=t;
        }

        for(i=x;i<=y;i++)
        {
            int s;
            s = i*i+i+41;
            if(is_prime(s))
            {
                flag++;
                break;
            }
        }
        if(flag == 0)
            printf("OK\n");
        else
            printf("Sorry\n");
        }
    return 0;
}



很简单的一道题,发出来纯粹是因为无聊。这个题一直不能Accept,本来以为是我写错了,最后老师查出来是hoj问题。。。

强制认证门户的绕过方法

【注意】本文粗体字母为矢量。

磁场看不见摸不着,又实实在在的存在着,它的本质到底是什么,往往给人有很神秘的感觉。现在主流科学界认为磁场是一种特殊的物质。

相对论认为,一个电荷相对于某一个观察者运动, 在这个观察者看来,该电荷在周围空间除产生电场外,还产生磁场,但在另外一个随电荷一同运动的观察者看来,这电荷是静止的,它周围就不存在磁场了。磁场既然是一种物质,怎么可能在一个人看来是有的,在另一个人看来是没有的?
大家想一想,自然界中有什么物质在一个人看来是有的,在另一个人看来是没有的?
有一个物体存在于空间中某个地方,一个人说它是真实存在的,一个人说它是不存在的,而且两人的说法都是正确的,这怎么可能呢?

很多人马上就说相对论是错误的,事情没有那么的简单。如果我们假定相对论是正确的,我们抓住了这种认识上的矛盾性,实际上就可以给磁场的本质做出判断。

我认为我们不应该把电磁场的本质看作是一种特殊物质,场的本质是物质相对于我们观察者运动所表现出的一种性质而不是物质本身。

举例来讲:我们眼前的一棵树、一条河是“物”,树的生长、河水的流动是“事”,这就是我们常说的事物。
物质就像一棵树、一条河,是“物”,场就像树的生长、河水的流动是“事"。
场的本质就是物质相对于我们观察者运动变化的一种表现,你把场看成是一种特殊的物质,这就是“事”和“物”不分的思想。
把场的本质看成是“事”,就像是上面所说的河水的流动,我们就很容易理解磁场相对于一个人是存在的,相对于另一个人是不存在的。
我们说一条河相对于一个人是存在的,相对于另一个人是不存在的,这肯定是荒唐的。
我们说河水的流动相对于一个人是存在的,相对于另一个人(随水流动的人)是不存在的,这肯定是有可能的。

认定场的本质就是物质相对于我们观察者运动变化的一种表现,那是什么物质在运动?

我的回答是空间!

我们只要假定:宇宙中任何一个相对于我们观察者静止的物质点周围空间都是以光速辐射式的运动,就可以解释电磁场的一切规律。

我们习惯了描述物体在空间中的运动,那我们又如何定性定量的描述空间本身的运动?

一条直线,我们可以看则是由无数个点构成,一个平面我们也可以看则是由无数个点构成,同样道理,我们可以把三维空间看则是由许多个点构成,称之为空间几何点,描述这些几何点的运动,就可以描述出空间的运动。

下面,我们来结合数学中场的定义来给出电磁场本质正确、精确的解释。

在数学中场的定义为:若空间中(或空间的某一部分),每一个点对应一个确定的量,则称这样的空间为场,当空间中每一点所对应的量为数量时,则该空间为数量场,当空间中每一个点所对应的量是一个矢量时,则称这样的空间为矢量场。

从数学中场的定义可知,场是用空间的点函数来表示的,反之,若给出空间中某一个点函数,就给出了一个场。

把场看成是运动的空间,结合数学中场的定义,我们给物理中重力场、电磁场、核力场下一个统一的定义:

相对于我们观察者,物质点周围空间中任意一个空间几何点指向该物质点的位移矢量随空间位置变化或者随时间变化,这样的空间称为物理场,也可以叫物理力场。

简单一句话,物理三大场本质就是运动变化的空间,从以上的定义可以知道,物理三大场都是矢量场。

首先我们用运动空间来定义电荷、电场:

设想一个物质点O相对于我们观测者静止,在某一个时刻,任意一个几何点P从O点出发,以光速度C【光速某些情况下可以看成矢量,用粗字体C表示矢量光速度,而标量光速用细字体C表示】沿某一个方向直线运动,射向周围无限远处空间。

从O点指向P点的矢径为R。让点O处于直角坐标系xyz的原点,矢径R是xyz和时间t的函数,随xyz的变化又随t的变化而变化,记为R = R(x,y,z,t)。

在我们观测者看来,物质点O具有正电量q是指周围有N条几何点的光速度C射向无限远处空间【负电荷是几何点从无限远处空间汇聚到电荷上的】,并且光速度C呈辐射状均匀分布。在O点周围以R的长度为半径作一个高斯包围面S,把S分割成N块,每一块面元ds上有dn条光速度C垂直穿过去。

E = k dn C/ds

上式中E就是正电场,K为比例常数。E的方向和光速度C方向一致。

也可以用把高斯面S无限分割成许多矢量面元ds我们规定指向S内侧为负,外侧为正】,用ds的方向来表示E的方向。

E = k dn C【s】/ds

s】为沿ds方向的单位矢量。

如果把n取1,式E = k dn C/ds

可以为:E = k C/△S【E】或者E = k C/△S

【E】为沿E方向的单位矢量。△S为高斯面S其中的一小块。

E = k C/△S【E】或者E = k C/△S可以称为电场的几何定义方程。

如果用【c】表示C的单位矢量,上也可以写成:

E = k C【c】/△S

由式E = k dn C/ds可以导出式E·ds =k C dn

对式E·ds = k C dn两边积分,结果为k’q=∮E·ds= k C N

K’为比例常数,∮为包围O点封闭曲面积分,q就是正电荷的电量,电荷的电量几何意义就是O点周围有N条几何点的光速C。

我们接着来给磁场下一个几何定义。

以上的点电荷O,相对于我们观察者静止,在周围空间P处产生了静电场E,当O点相对于我们观察者以速度v运动的时候,在O点周围空间P处还产生了磁场B

我们的大致思路是:O点相对于我们静止时候,周围空间以光速辐射式的运动,我们用一个高斯面S包围O点,S上一小块面积△S垂直穿过几何点的光速度C的条数反映了这个地方的电场强度E,也就是E =k C/△S。

当O点相对于我们以速度v运动,会引起v垂直方向的电场的变化,磁场的本质就是电场变化的那部分。

从实验发现,磁场B的方向和电场E方向、电荷运动速度v方向相互垂直时候,磁场最强,可以判断,BEv满足于叉乘关系。

B = a’(v ×E)

a’为常数,由于光速度CE平行,因而式B = a’(v ×E)可以写为:B = a(v ×C).

接下来我们来确定常数a的值。

B的数量应该取决于速度v和光速度C 数量的比值,还有,B描述的是空间局部性质,因而和电场一样是空间位置函数,随空间位置【这里是矢量面元ds或者高斯面S其中一小块面积△S】而变化。

可以说,B的数量应该为:B = 常数(v /C △S)

B的方向由式B = a(v×C)决定。综合两式,可以得出:

B = 常数(v ×C/ C 2△S

或者B = 常数(v ×【c】)/ C △S

这个就是磁场B 的几何定义方程。注意,以上的沿v垂直平面内分布许多条的光速度C,这样还产生沿v垂直方向许多条B,呈环绕状。所以,磁场是环绕形状的。

利用以上的电场几何定义式E = k C/△S和磁场几何定义式B = 常数(v ×C/ C2△S

很容易导出磁场B是电场E的相对论性效应:

B = v × E/ C2

学生管理系统V1.0

Q3134.(10分)第8章实验1:学生成绩管理系统V1.0
某班有最多不超过30人(具体人数由键盘输入)参加某门课程的考试,用一维数组作函数参数编程实现如下学生成绩管理:
(1)录入每个学生的学号和考试成绩;
(2)计算课程的总分和平均分;
(3)按成绩由高到低排出名次表;
(4)按学号由小到大排出成绩表;
(5)按学号查询学生排名及其考试成绩;
(6)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,统计每个类别的人数以及所占的百分比;
(7)输出每个学生的学号、考试成绩。

程序运行结果示例:
Input student number(n<30):
6↙
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
1↙
Input student's ID, name and score:
11003001 87↙
11003005 98↙
11003003 75↙
11003002 48↙
11003004 65↙
11003006 100↙
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
2↙
sum=473,aver=78.83
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
3↙
Sort in descending order by score:
11003006 100
11003005 98
11003001 87
11003003 75
11003004 65
11003002 48
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
4↙
Sort in ascending order by number:
11003001 87
11003002 48
11003003 75
11003004 65
11003005 98
11003006 100
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
5↙
Input the number you want to search:
11003004
11003004 65
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
6↙
<60 1 16.67%
60-69 1 16.67%
70-79 1 16.67%
80-89 1 16.67%
90-99 1 16.67%
100 1 16.67%
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
7↙
11003001 87
11003002 48
11003003 75
11003004 65
11003005 98
11003006 100
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
8↙
Input error!
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
0↙
End of program!

输入格式:
( 1 )录入学生的人数:
                 **输入数据格式:"%d"
                 **提示信息:"Input student number(n<30):\n"
( 2 )录入每个学生的学号和考试成绩:
               **输入数据格式:"%ld%f"
               **提示信息:"Input student's ID, name and score:\n"
输出格式:
菜单项的输出显示:
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
计算课程的总分和平均分:
              **输出总分与平均分格式:"sum=%.0f,aver=%.2f\n"
按成绩由高到低排出名次表:
              **输出格式:"%ld\t%.0f\n"
              **提示信息:"Sort in descending order by score:\n"
按学号由小到大排出成绩表:
              **输出格式:"%ld\t%.0f\n"
              **提示信息:"Sort in ascending order by number:\n"
按学号查询学生排名及其考试成绩:
               **如果未查到此学号的学生,提示信息:"Not found!\n"
               **如果查询到该学生,输出格式:"%ld\t%.0f\n"
按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,统计每个类别的人数以及所占的百分比:
                **成绩<60输出格式:"<60\t%d\t%.2f%%\n"
                **成绩=100输出格式:"%d\t%d\t%.2f%%\n"
                **其他输出百分比格式:"%d-%d\t%d\t%.2f%%\n"

#include"stdio.h"
int input(unsigned long *p,float *q,int k)
{
   int i,j;
   printf("Input student's ID, name and score:\n");
   for (i=0;i< k;i++)
       scanf("%ld%f",p+i,q+i);
   return 0;
}
int cal(float *p,int k)
{
   int i;float sum=0,av=0;
   for (i=0;i< k;i++)
       sum+=*(p+i);
   av=sum/k;
   printf("sum=%.0f,aver=%.2f\n",sum,av);
   return 0;
}
int swap(unsigned long *p,float *q,int i,int j)
{
   unsigned long t1;float t2;
   t1=*(p+i);
   *(p+i)=*(p+j);
   *(p+j)=t1;
   t2=*(q+i);
   *(q+i)=*(q+j);
   *(q+j)=t2;
 
   return 0;
}
int sortsc(unsigned long *p,float *q,int k)
{
   int i,j,max;
   for (i=0;i< k-1;i++)
   {
       max=i;
       for (j=i+1;j< k;j++)
           if (*(q+j)>*(q+max)) max=j;
       swap(p,q,i,max);
   }
 
   return 0;
}
int sortst(unsigned long *p,float *q,int k)
{
   int i,j,max;
   for (i=0;i< k-1;i++)
   {
       max=i;
       for (j=i+1;j< k;j++)
           if (*(p+j)<*(p+max)) max=j;
       swap(p,q,i,max);
   }
 
   return 0;
}
int sebn(unsigned long *p,float *q,int k)
{
   unsigned long sc;
   int i,ans=k;
   printf("Input the number you want to search:\n");
   scanf("%ld",&sc);
   for (i=0;i< k;i++)
       if (*(p+i)==sc) ans=i;
   if (ans!=k) printf("%ld\t%.0f\n",*(p+ans),*(q+ans));
   else printf("Not found!\n");
 
   return 0;
}
int stan(float *q,int k)
{
   int num[6],i;
   for (i=0;i< 6;i++) num[i]=0;
   for (i=0;i< k;i++)
   {
       if (*(q+i)>99) {num[0]++;continue;}
       if (*(q+i)>89) {num[1]++;continue;}
       if (*(q+i)>79) {num[2]++;continue;}
       if (*(q+i)>69) {num[3]++;continue;}
       if (*(q+i)>59) {num[4]++;continue;}
                      {num[5]++;}
   }
   printf("<60\t%d\t%.2f%%\n",num[5],100.0*num[5]/k);
   printf("60-69\t%d\t%.2f%%\n",num[4],100.0*num[4]/k);
   printf("70-79\t%d\t%.2f%%\n",num[3],100.0*num[3]/k);
   printf("80-89\t%d\t%.2f%%\n",num[2],100.0*num[2]/k);
   printf("90-99\t%d\t%.2f%%\n",num[1],100.0*num[1]/k);
   printf("100\t%d\t%.2f%%\n",num[0],100.0*num[0]/k);
 
   return 0;
}
int main()
{
  int n,flag=1,a,i;
  float sc[30];
  unsigned long st[30];
  printf("Input student number(n<30):\n");
  scanf("%d",&n);
  while(flag)
  {
       printf("Management for Students' scores\n");
       printf("1.Input record\n");
       printf("2.Caculate total and average score of course\n");
       printf("3.Sort in descending order by score\n");
       printf("4.Sort in ascending order by number\n");
       printf("5.Search by number\n");
       printf("6.Statistic analysis\n");
       printf("7.List record\n");
       printf("0.Exit\n");
       printf("Please Input your choice:\n");
       scanf("%d",&a);
       switch (a)
       {
           case 1:
               input(st,sc,n);
               break;
           case 2:
               cal(sc,n);
               break;
           case 3:
               sortsc(st,sc,n);
               printf("Sort in descending order by score:\n");
               for (i=0;i< n;i++)
                   printf("%ld\t%.0f\n",st[i],sc[i]);
               break;
           case 4:
               sortst(st,sc,n);
               printf("Sort in ascending order by number:\n");
               for (i=0;i< n;i++)
                   printf("%ld\t%.0f\n",st[i],sc[i]);
               break;
           case 5:
               sebn(st,sc,n);
               break;
           case 6:
               stan(sc,n);
               break;
           case 7:
               for (i=0;i< n;i++)
                   printf("%ld\t%.0f\n",st[i],sc[i]);
               break;
           case 0:
               flag=0;
               printf("End of program!\n");
               break;
           default:
               printf("Input error!\n");
       }
 
  }
 
  return 0;
}