Jack's Blog

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

函数的参数是什么样的?
结构体
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--4

A - A

Time limit : 1 s Memory limit : 32 mb
Submitted : 6 Accepted : 2
64bit Integer Format : %lld

 

Problem Description

FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.
The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and requires F[i] pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get J[i]* a% pounds of JavaBeans if he pays F[i]* a% pounds of cat food. Here a is a real number. Now he is assigning this homework to you: tell him the maximum amount of JavaBeans he can obtain.
 

Input

The input consists of multiple test cases. Each test case begins with a line containing two non-negative integers M and N. Then N lines follow, each contains two non-negative integers J[i] and F[i] respectively. The last test case is followed by two -1's. All integers are not greater than 1000.

Output

For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of JavaBeans that FatMouse can obtain.

Sample Input

5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1

Sample Output

13.333 31.500
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>

struct info{
    double val;
    int pos;
};
int amount(info a[],int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
           if(a[j].val>a[i].val)
           {
               double t;
               t = a[i].val;
               a[i].val=a[j].val;
               a[j].val=t;
               int tt;
               tt=a[i].pos;
               a[i].pos=a[j].pos;
               a[j].pos=tt;
           }
        }
    }
    return 0;
}
int main()
{

    int M,N;
    int i;
    while(1)
    {
        scanf("%d %d",&M,&N);
        if(M==-1&&N==-1)
            break;
        info price[N]={0};
        int F[N]={0},J[N]={0};
        for(i=0;i<N;i++)
        {
            scanf("%d %d",&J[i],&F[i]);
            price[i].val=(double)J[i]/F[i];
            price[i].pos=i;
        }
        amount(price,N);
        double output=0;
        for(i=0;i<N;i++)
        {
            if(M>=F[price[i].pos])
            {
                output+=price[i].val*F[price[i].pos];
                M-=F[price[i].pos];
            }
            else if(M>0&&M<F[price[i].pos])
            {
                output+=price[i].val*M;
                M=0;
                break;
            }
        }
        printf("%.3lf\n",output);
    }
    return 0;
}

然而在oj里面。。。Runtime Error

没办法啊,只好看看哪里可以改进

2.sort

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int MAXN = 1010;
struct node
{
    double j,f;
    double r;
}a[MAXN];
/*
int cmp(const void *a,const void *b)//从大到小排序 
{
    struct node *c=(node *)a;
    struct node *d=(node *)b;
    if(c->r > d->r) return -1;
    else return 1;
}    */
bool cmp(node a,node b)
{
    return a.r  >  b.r;
}    
int main()
{
    int N;
    double M;
    double ans;
    while(scanf("%lf%d",&M,&N))
    {
        if(M==-1&&N==-1) break;
        for(int i=0;i<N;i++)
        {
           scanf("%lf%lf",&a[i].j,&a[i].f);
           a[i].r=(double)a[i].j/a[i].f;
        }    
        //qsort(a,N,sizeof(a[0]),cmp);
        sort(a,a+N,cmp);
        ans=0;
        for(int i=0;i<N;i++)
        {
            if(M>=a[i].f)
            {
                ans+=a[i].j;
                M-=a[i].f;
            }    
            else 
            {
                ans+=(a[i].j/a[i].f)*M;
                break;
            }    
        }   
        printf("%.3lf\n",ans); 
    }    
    return 0;
}

key3:without sort:

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

const int MAXN = 1010;
struct node
{
    double j,f;
    double r;
}a[MAXN];
int cmp(const void *a,const void *b)//从大到小排序 
{
    struct node *c=(node *)a;
    struct node *d=(node *)b;
    if(c->r > d->r) return -1;
    else return 1;
}    
int main()
{
    int N;
    double M;
    double ans;
    while(scanf("%lf%d",&M,&N))
    {
        if(M==-1&&N==-1) break;
        for(int i=0;i<N;i++)
        {
           scanf("%lf%lf",&a[i].j,&a[i].f);
           a[i].r=(double)a[i].j/a[i].f;
        }    
        qsort(a,N,sizeof(a[0]),cmp);
        ans=0;
        for(int i=0;i<N;i++)
        {
            if(M>=a[i].f)
            {
                ans+=a[i].j;
                M-=a[i].f;
            }    
            else 
            {
                ans+=(a[i].j/a[i].f)*M;
                break;
            }    
        }   
        printf("%.3lf\n",ans); 
    }    
    return 0;
}

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-第一题

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问题。。。

five in row

a very interesting game:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>                                      //应用 getch() 函数 函数用途:从控制台读取一个字符,但不显示在屏幕上
#include <string.h>

//定义棋盘大小 标准 15*15棋盘
#define MAXIMUS 15

//存储对局信息 二维数组
int p[MAXIMUS][MAXIMUS];

//输出缓冲器 纵横分别 15*2+1个字符图标  15*4+3个字符图标
//目的:1、显示方形光标 2、打印棋盘(单字符长宽不等)
char buff[MAXIMUS*2+1][MAXIMUS*4+3];

//当前光标位置
int Cx,Cy;

//当前走子的玩家,1代表黑,2代表白
int Now;

//当前写入缓冲器的行数和列数位置
int wl,wp;

//在棋盘中央显示的文字信息
char* showText;

//回合数
int count;

//修改过的字符串复制函数,会忽略末端的\0
char* Copy(char* strDest,const char* strSrc);

//初始化一个对局函数
void Initialize();//Initialize:初始化

//获得棋盘中指定坐标交点位置的字符,通过制表符拼成棋盘
char* getStyle(int i,int j);

//获得指定坐标交点位置左上格的样式,通过制表符来模拟光标的显示
//getCurse:获得图案
char* getCurse(int i,int j);

//向缓冲器写入字符串
void write(char* c);

//缓冲器写入位置提行
void ln();

//将缓冲器内容输出到屏幕
void Display();

//将整个棋盘算出并储存到缓冲器,然后调用Display函数显示出来
void Print();

//在当前光标位置走子,如果非空,则返回0表示失败
int Put();

//胜负检查,即判断当前走子位置有没有造成五连珠的情况
int Check();

//进行整个对局,返回赢家信息
int RunGame();

//主函数
int main()
{
    //设置标题
    system("title 简易五子棋 ——翻转课堂");
    //设置窗口大小
    system("mode con cols=63 lines=32");
    /*设置颜色
     *system("color 0A"); 其中color后面的0是背景色代号,A是前景色代号。各颜色代码如下:
     *0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色 5=紫色 6=黄色 7=白色 8=灰色 9=淡蓝色
     *A=淡绿色 B=淡浅绿色 C=淡红色 D=淡紫色 E=淡黄色 F=亮白色
     */
    system("color 72");
    //循环执行游戏
    while(1)
       {
         RunGame();
       }
}

//修改过的字符串复制函数,会忽略末端的\0   主要考虑到Dispaly函数
char* Copy(char* strDest,const char* strSrc)
{
    char* strDestCopy = strDest;
    while (*strSrc!='\0')
       {
            *strDest++=*strSrc++;
       }
    return strDestCopy;
}

//进行整个对局,返回赢家信息(虽然有用上)
int RunGame()
{
  //输入变量
  int input;
  //赢家信息
  int victor;
  //初始化对局
  Initialize();
  //开始无限回合的死循环,直到出现胜利跳出
  while(1)
  {
   //打印棋盘
   Print();
   //等待键盘按下一个字符
   //getch 从控制台读取一个字符,但不显示在屏幕上
   input=getch();
   //如果是ESC则退出程序,ESC的ASCLL码为27
  if(input==27)
     {
        //正常退出
        exit(0);
     }
//如果是空格则开始走子
  else if(input==0x20)
     {
//如果走子成功则判断胜负
//put判断当前位置能否走子,即是否已经走过子
       if(Put())
       {
            victor=Check();
            //轮换当前走子玩家,3-1=2,3-2=1
            Now=3-Now;
            //对局数+1
            count++;
   //如果黑方达到胜利,显示提示文字并等待一次按键,返回胜利信息
     if(victor==1)
         {
            showText="黑方获得了胜利!";
            //重新输出棋盘 且中间为showText文字
            Print();
            /*When reading a function key or an arrow key,
             *each function must be called twice;
             *the first call returns 0 or 0xE0,
             *and the second call returns the actual key code.
             */
            if(getch()==0xE0)
            {
                getch();
            }
            return Now;     //并无实际意义,只是结束循环
         }
//如果白方达到胜利,显示提示文字并等待一次按键,返回胜利信息
     else if(victor==2)
         {
            showText="白方获得了胜利!";
            Display();
            if(getch()==0xE0)
            {
                getch();
            }
            return Now;
         }
//如果回合数达到了棋盘总量,即棋盘充满,即为平局
     else if(count==MAXIMUS*MAXIMUS)
         {
            showText="平局!";
            Display();
            if(getch()==0xE0)
            {
                getch();
            }
            return 0;
         }
       }
     }
//如果按下的是方向键,会填充两次输入,第一次为0xE0表示按下的是控制键
   else if(input==0xE0)
     {
    //获得第二次输入信息
    input=getch();
    //判断方向键方向并移动光标位置
    switch(input)
         {
           case 0x4B:
           Cx--;
           break;
           case 0x48:
           Cy--;
           break;
           case 0x4D:
           Cx++;
           break;
           case 0x50:
           Cy++;
           break;
         }
//如果光标位置越界则移动到对侧
if(Cx<0)Cx=MAXIMUS-1;
if(Cy<0)Cy=MAXIMUS-1;
if(Cx>MAXIMUS-1)Cx=0;
if(Cy>MAXIMUS-1)Cy=0;
     }
   }
}

//初始化一个对局函数
void Initialize()
{
    //循环变量
    int i,j;
    //重置显示信息
    showText="";
    //回合数归零
    count=0;
    //重置对局数据
    for(i=0;i<MAXIMUS;i++)
        {
             for(j=0;j<MAXIMUS;j++)
             {
                p[i][j]=0;          //各处走子归零
             }
        }
    //重置光标到中央
    Cx=Cy=MAXIMUS/2;
    //重置当前为黑方
    Now=1;
}

//获得棋盘中指定坐标交点位置的字符,通过制表符拼成棋盘
char* getStyle(int i,int j)
{
    //1为黑子
    if(p[i][j]==1)
    return "●";
    //2为白子
    else if(p[i][j]==2)
    return "○";
    //以下为边缘棋盘样式
    else if(i==0&&j==0)
    return "┏";
    else if(i==MAXIMUS-1&&j==0)
    return "┓";
    else if(i==MAXIMUS-1&&j==MAXIMUS-1)
    return "┛";
    else if(i==0&&j==MAXIMUS-1)
    return "┗";
    else if(i==0)
    return "┠";
    else if(i==MAXIMUS-1)
    return "┨";
    else if(j==0)
    return "┯";
    else if(j==MAXIMUS-1)
    return "┷";
    //中间的空位
    return "┼";
}

//获得指定坐标交点位置左上格的样式,通过制表符来模拟光标的显示
char* getCurse(int i,int j)
{

    if(i==Cx)
       {
         if(j==Cy)
         return "┏";
         else if (j==Cy+1)
         return "┗";
       }
    else if(i==Cx+1)
       {
         if(j==Cy)
         return "┓";
         else if (j==Cy+1)
         return "┛";
       }
    //如果不在光标附近则为空
         return " ";
}

//向缓冲器写入字符串
void write(char* c)
{
    //字符串复制 (地址,地址),修改 wl、wp 处的字符为*c所指字符
    strcpy(buff[wl]+wp,c);
    //移至下一列  通过ln函数移动至下一行
    wp+=strlen(c);
}

//缓冲器写入位置 提行
void ln()
{
    //行数+1
    wl+=1;
    //列数归0
    wp=0;
}

//将缓冲器内容输出到屏幕
void Display()
{
//循环变量,中间文字信息的长度
//showText 在RunGame函数里写出
    int i,l=strlen(showText);
//算出中间文字信息居中显示所在的横坐标位置
    int Offset=MAXIMUS*2+2-l/2;
//如果位置为奇数,则移动到偶数,避免混乱
    if(Offset%2==1)
   {
      Offset--;
   }
//讲中间文字信息复制到缓冲器
//由于 没有 \0 可以顺利输出缓冲期中showText后的其余字节
    Copy(buff[MAXIMUS]+Offset,showText);
//如果中间文字长度为半角奇数,则补上空格,避免混乱
    if(l%2==1)
   {
      *(buff[MAXIMUS]+Offset+l)=0x20;   //空格的ASCLL码 为16进制 0x20
   }
//清理屏幕,准备写入
   system("cls");     //system("CLS")可以实现清屏操作。
//循环写入每一行
   for(i=0;i<MAXIMUS*2+1;i++)
   {
   printf("%s",buff[i]);    //buff[i] 在Print函数里写入
//写入完每一行需要换行
   if(i<MAXIMUS*2)
   printf("\n");
   }
}

//将整个棋盘算出并储存到缓冲器(即buff 二维字符数组,寄存各位置字符),然后调用Display函数显示出来
//Print 为 写入各位置buff字符 但并不输出 Display 显示
void Print()        //Print 之后 Display
{
//循环变量
    int i,j;
    wl=0;
    wp=0;
//写入出交点左上角的字符,因为需要打印棋盘右下角,所以可以横纵各多一次循环
for(j=0;j<=MAXIMUS;j++)                 //第j行  j为行数
   {
    for(i=0;i<=MAXIMUS;i++)             //第i列  i为列数
      {
         //写入左上角字符
         write(getCurse(i,j));          //判断i,j是否在光标位置 如果不是 getCurse函数返回“  ”填充棋盘
//如果是棋盘上下边缘则没有连接的竖线,用空格填充位置
         if(j==0||j==MAXIMUS)
           {
               if(i!=MAXIMUS)           // != 暂无特殊含义
               write("  ");             //最上 最下 各空一行
           }
//如果在棋盘中间则用竖线承接上下
         else
           {
              //左右边缘的竖线更粗
               if(i==0||i==MAXIMUS-1)
               write("┃");
          //中间的竖线
         else if(i!=MAXIMUS)
               write("│");
           }
      }
//如果是最后一次循环,则只需要处理边侧字符,交点要少一排
         if(j==MAXIMUS)
           {
               break;
           }
//提行开始打印交点内容
         ln();
      //用空位补齐位置      左侧一列 补为空
         write("  ");

//按横坐标循环正常的次数
    for(i=0;i<MAXIMUS;i++)
      {
//写入交点字符
         write(getStyle(i,j));
//如果不在最右侧则补充一个横线承接左右
         if(i!=MAXIMUS-1)
           {
              if(j==0||j==MAXIMUS-1)
                {
               //上下边缘的横线更粗
                   write("━");
                }
              else
                {
               //中间的横线
                   write("—");
                }
           }
      }
//写完一行后提行
    ln();
   }
//将缓冲器内容输出到屏幕
    Display();
}

//在当前光标位置走子,如果非空,则返回0表示失败
int Put()
{
    if(p[Cx][Cy]==0)
   {
    //改变该位置数据
    p[Cx][Cy]=Now;          //标记当前走子:走子位置写入1/2
    //返回1表示成功
    return 1;
   }
    else
   {
    return 0;
   }
}

//胜负检查,即判断当前走子位置有没有造成五连珠的情况
int Check()
{
//累计横竖正斜反斜四个方向的连续相同棋子数目
int w=1,x=1,y=1,z=1,i;
//向下检查
for(i=1;i<5;i++)if(Cy+i<MAXIMUS&&p[Cx][Cy+i]==Now)w++;else break;
//向上检查
for(i=1;i<5;i++)if(Cy-i>0&&p[Cx][Cy-i]==Now)w++;else break;
//若果达到5个则判断当前走子玩家为赢家
if(w>=5)return Now;

//向右检查
for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&p[Cx+i][Cy]==Now)x++;else break;
//向左检查
for(i=1;i<5;i++)if(Cx-i>0&&p[Cx-i][Cy]==Now)x++;else break;
//若果达到5个则判断当前走子玩家为赢家
if(x>=5)return Now;

//向右下检查
for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&Cy+i<MAXIMUS&&p[Cx+i][Cy+i]==Now)y++;else break;
//向左上检查
for(i=1;i<5;i++)if(Cx-i>0&&Cy-i>0&&p[Cx-i][Cy-i]==Now)y++;else break;
//若果达到5个则判断当前走子玩家为赢家
if(y>=5)return Now;

//向右上检查
for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&Cy-i>0&&p[Cx+i][Cy-i]==Now)z++;else break;
//向左下检查
for(i=1;i<5;i++)if(Cx-i>0&&Cy+i<MAXIMUS&&p[Cx-i][Cy+i]==Now)z++;else break;
//若果达到5个则判断当前走子玩家为赢家
if(z>=5)return Now;

//若没有检查到五连珠,则返回0表示还没有玩家达成胜利
return 0;
}

 

暗文密码输入系统

Write before:

Have you ever feel amazed when you settle to think about the principles when you entering your password?

I haver always been curious about that.

So lets' uncover the mystery now!


#include <stdio.h>
#include <conio.h>
#define MAX_PSD_LEN 20

char PassWord[MAX_PSD_LEN],*p=PassWord,ch;
int count=0;
 main()
{
    ch=getch();
    while(ch!=13&&count<MAX_PSD_LEN-1)       /*当按下回车键或密码长度达到19,则退出循环*/
    {
        if(ch==8)                       /*如果按下的是向前删除键,则...*/
        {
            if(count)              /*如果密码串中字符数大于零,则向前删除一个字符*/
            {
                p--;
                count--;
                printf("\b ");/*光标回退一格,将星号(*)改为空格*/
                printf("\b"); /*光标重新回退一格*/
            }
        }
        else if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a')||(ch<='9'&&ch>='0'))
                                                  /*如果输入的是密码的有效字符*/
        {
            printf("*");          /*输出一个星号*/
            count++;
            *p=ch;                /*记录密码内容*/
            p++;
        }
        ch=getch();                    /*等待输入下一个字符*/
    }
    PassWord[count]=0;
    printf("\nThe Password you input is:\n");
    printf("%s\n",PassWord);
}

哈尔滨工业大学

 

  1. 实验目的

熟悉一维、二维数组、结构体做函数参数,排序、查找、统计分析等常用算法,自顶向下、逐步求精的模块化设计思想以及增量测试方法,同时发挥出学生个人的主管能动性,创造出有意思的新功能,提高程序的健壮性和可移植性。

  1. 实验内容和要求

1.实验内容

学生成绩管理系统V6.0

某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。参考学生成绩管理系统V5.0,定义结构体类型,用结构体数组作函数参数,如果能够把用户输入的数据存盘,下次运行时读出,那就更有用了,编程实现如下菜单驱动的学生成绩管理系统:

(1)录入每个学生的学号、姓名和各科考试成绩;

(2)计算每门课程的总分和平均分;

(3)计算每个学生的总分和平均分;

(4)按每个学生的总分由高到低排出名次表;

(5)按每个学生的总分由低到高排出名次表;

(6)按学号由小到大排出成绩表;

(7)按姓名的字典顺序排出成绩表;

(8)按学号查询学生排名及其考试成绩;

(9)按姓名查询学生排名及其考试成绩;

(10)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;

(11)输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分;

(12)将每个学生的记录信息写入文件;

(13)从文件中读出每个学生的记录信息并显示。

要求程序运行后先显示如下菜单,并提示用户输入选项:

Management for Students' scores

1.Input record

2.Caculate total and average score of every course

3.Caculate total and average score of every student

4.Sort in descending order by score

5.Sort in ascending order by score

6.Sort in ascending order by number

7.Sort in dictionary order by name

8.Search by number

9.Search by name

10.Statistic analysis

11.List record

12.Write to a file

13.Read from a file

0.Exit

Please Input your choice:

然后,根据用户输入的选项执行相应的操作。

 

请按照下面的定义及函数原型编程

#define   MAX_LEN  10                     /* 字符串最大长度 */

#define   STU_NUM 30                       /* 最多的学生人数 */

#define   COURSE_NUM 6                     /* 最多的考试科目数 */

typedef struct student

{

    long num;  /* 每个学生的学号 */

    char name[MAX_LEN];                   /* 每个学生的姓名 */

    float score[COURSE_NUM];      /* 每个学生COURSE_NUM门功课的成绩 */

    float sum;                       /* 每个学生的总成绩 */

    float aver;                   /* 每个学生的平均成绩 */

}STU;

int   Menu(void);

void  ReadScore(STU stu[], int n, int m);

void  AverSumofEveryStudent(STU stu[], int n, int m);

void  AverSumofEveryCourse(STU stu[], int n, int m);

void  SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b));

int   Ascending(float a, float b);

int   Descending(float a, float b);

void  SwapFloat(float *x, float *y);

void  SwapLong(long *x, long *y);

void  SwapChar(char x[], char y[]);

void  AsSortbyNum(STU stu[], int n, int m);

void  SortbyName(STU stu[], int n, int m);

void  SearchbyNum(STU stu[], int n, int m);

void  SearchbyName(STU stu[], int n, int m);

void  StatisticAnalysis(STU stu[], int n, int m);

void  PrintScore(STU stu[], int n, int m);

 

输入格式:

( 1 )录入学生的人数:

                 **要求输入数据格式为:"%d"

                 **提示信息为:"Input student number(n<30):\n"

( 2 )录入课程数:

               **要求输入数据格式为:"%d"

               **提示信息为:"Input course number(m<=%d):\n"

( 3 )录入每个学生的学号、姓名和考试成绩: 

               **要求学号、姓名的输入数据格式为:"%ld%s"

               **要求考试成绩的输入数据格式为:"%f"

               **提示信息为:"Input student's ID, name and score:\n"             

 

输出格式:

计算每门课程的总分和平均分:

              **要求输出总分与平均分格式为:"course %d:sum=%.0f,aver=%.0f\n"

计算每个学生的总分和平均分:

              **要求输出总分与平均分格式为:"student %d: sum=%.0f,aver=%.0f\n"

按成绩由高到低排出名次表:

              **要求学号、姓名的输出格式为:"%ld\t%s\t"

              **要求成绩的输出格式为:"%.0f\t"

              **要求总分及平均分的输出格式为:"%.0f\t%.0f\n"

              **提示信息为:"Sort in descending order by score:\n"

按成绩由低到高排出名次表:   

              **要求学号、姓名的输出格式为:"%ld\t%s\t"

              **要求成绩的输出格式为:"%.0f\t"

              **要求总分及平均分的输出格式为:"%.0f\t%.0f\n"

              **提示信息为:"Sort in ascending order by score:\n"

按学号由小到大排出成绩表:     

              **要求学号、姓名的输出格式为:"%ld\t%s\t"

              **要求成绩的输出格式为:"%.0f\t"

              **要求总分及平均分的输出格式为:"%.0f\t%.0f\n"

              **提示信息为:"Sort in ascending order by number:\n"

按姓名的字典顺序排出成绩表      

              **要求学号、姓名的输出格式为:"%ld\t%s\t"

              **要求成绩的输出格式为:"%.0f\t"

              **要求总分及平均分的输出格式为:"%.0f\t%.0f\n"

              **提示信息为:"Sort in dictionary order by name:\n"

按学号查询学生排名及其考试成绩:

               **如果未查到此学号的学生,提示信息为:"Not found!\n";

               **如果查询到该学生

                   # 要求学号、姓名的输出格式为:"%ld\t%s\t"

                   # 要求成绩的输出格式为:"%.0f\t"

                   # 要求总分及平均分的输出格式为:"%.0f\t%.0f\n"

               **提示信息为:"Input the number you want to search:\n"

按姓名查询学生排名及其考试成绩;

               **如果未查到此学号的学生,提示信息为:"Not found!\n";

               **如果查询到该学生

                   # 要求学号、姓名的输出格式为:"%ld\t%s\t"

                   # 要求成绩的输出格式为:"%.0f\t"

                   # 要求总分及平均分的输出格式为:"%.0f\t%.0f\n"

               **提示信息为:"Input the name you want to search:\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"

                **提示信息为: "For course %d:\n"

输出每个学生的学号、姓名、考试成绩,以及课程总分和平均分             

              **要求学号、姓名的输出格式为:"%ld\t%s\t"

              **要求成绩的输出格式为:"%.0f\t"

              **要求总分及平均分的输出格式为:"%.0f\t%.0f\n"

选择退出(菜单项0)

                **提示信息:"End of program!"

菜单项选择错误(不在0-11之间)

                **提示信息:"Input error!\n"

 

2.实验要求

采用自顶向下、逐步求精的模块化设计思想设计一个学生管理系统。要求按系统的需求分析、系统设计(总体设计、各个模块的设计)、系统实现(各个模块的实现)、系统测试等过程组织报告内容,说明采用了什么数据结构和算法,遇到哪些问题,这些问题是如何解决的,本设计的亮点和难点在哪里,实验结果如何,有哪些收获和学习体会。

3.系统功能需求分析

学生成绩管理系统 V6.0

(1)录入每个学生的学号、姓名和各科考试成绩;

(2)计算每门课程的总分和平均分;

(3)计算每个学生的总分和平均分;

(4)按每个学生的总分由高到低排出名次表;

(5)按每个学生的总分由低到高排出名次表;

(6)按学号由小到大排出成绩表;

(7)按姓名的字典顺序排出成绩表;

(8)按学号查询学生排名及其考试成绩;

(9)按姓名查询学生排名及其考试成绩;

(10)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;

(11)输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分;

(12)将每个学生的记录信息写入文件;

(13)从文件中读出每个学生的记录信息并显示。

要求程序运行后先显示如下菜单,并提示用户输入选项:

4.实验环境

采用了Windows 10 操作系统,使用了Codeblocks16.01的开发环境。

所需要函数库文件有<stdio.h>,<string.h>,<stdlib.h>。

  1. 系统设计

  1. 系统功能模块划分

下图是学生成绩管理系统V6.0的程序结构图

展示了该程序系统各个模块之间的结构图

 

2. 算法设计

<>1)2)3)

 

其中比较有亮点的是暗文密码输入系统,保证了输入的安全性。

3. 数据结构设计

3.1数据流图:

 

 

 

3.2顶层数据字典:

采用了结构体储存学生个人信息

#define   MAX_LEN  10                               /* 字符串最大长度 */

#define   STU_NUM 30                                   /* 最多的学生人数 */

#define   COURSE_NUM 6                          /* 最多的考试科目数 */

typedef struct student

{

      long num;                                                 /* 每个学生的学号 */

    char name[MAX_LEN];                   /* 每个学生的姓名 */

    float score[COURSE_NUM];        /* 每个学生COURSE_NUM门功课的成绩 */

    float sum;                                /* 每个学生的总成绩 */

    float aver;                                   /* 每个学生的平均成绩 */

} STU;

 

序号

字段名

字段含义

类型

长度

默认值

说明

  1.  

num

学生学号

long

10

 

 

 

0

 

 

  1.  

name

学生的姓名

char []

10

 

  1.  

score

学生每门功课的成绩

float []

6

 

  1.  

sum

学生总成绩

float

 

 

  1.  

aver

学生品均成绩

float

 

 

  1.  

stu

储存学生信息的结构体

struct []

 

 

 

4.各模块(函数)的功能和接口设计:

4.1各个模块之间的逻辑关系图

模块逻辑关系图如下:

 

  

4.2各个模块的外部接口设计

学生成绩管理系统V6.0:

  1. Main(void):

功能:完成学生数目,课程数目的录入,显示部分信息和函数调用的功能

参数:void

函数返回值:无

  1. int Menu(void);

功能:显示主菜单

参数:void

函数返回值:a(使用者选择函数的功能序号)

  1. void input(STU stu[],int stunum,int cosnum);

功能:录入每个学生的学号、姓名和各科考试成绩;

参数:

STU stu[]:存放学生信息的结构体

int stunum:学生数目的形参

int cosnum:课程数目的形参

函数返回值:无

  1. void  AverSumofEveryStudent(STU stu[], int n, int m);

功能:计算每门课程的总分和平均分;

参数:

STU stu[]:存放学生信息的结构体

int m:学生数目的形参

int n:课程数目的形参

函数返回值:无

  1. void  AverSumofEveryCourse(STU stu[], int n, int m);

功能:计算每个学生的总分和平均分

参数:

STU stu[]:存放学生信息的结构体

int m:学生数目的形参

int n:课程数目的形参

函数返回值:无

  1. void  SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b));

功能:按所给函数参数的顺序排出名次表

参数:

STU stu[]:存放学生信息的结构体

int n: 学生数目的形参

int m: 课程数目的形参

int (*compare)(float a,float b): 函数指针compare指向另一个两个浮点型形参的函数。

函数返回值:无

  1. int   Ascending(float a, float b);

功能:按每个学生的总分由低到高排出名次表

参数:

float a: 存放浮点类型数据形参

float b: 存放浮点类型数据形参

函数返回值:a<b

  1. int   Descending(float a, float b);

功能:按每个学生的总分由高到低排出名次表

参数:

float a: 存放浮点类型数据形参

float b: 存放浮点类型数据形参

函数返回值:a>b

  1. void  SwapFloat(float *x, float *y);

功能:交换两个浮点型数据的值

参数:

float *x: 存放浮点类型指针的形参

float *y: 存放浮点类型指针的形参

函数返回值:无

  1. void  SwapLong(long *x, long *y);

功能:交换两个长整型数据的值

参数:

long *x: 存放长整型类型指针的形参

long *y: 存放长整型类型指针的形参

函数返回值:无

  1. void  SwapChar(char x[], char y[]);

功能:交换两个字符串的内容

参数:

char x[]:存放字符串类型数据的形参

char y[]:存放字符串类型数据的形参

函数返回值:无

  1. void  AsSortbyNum(STU stu[], int n, int m);

功能:按学号由小到大排出成绩表;

参数:

STU stu[]:存放学生信息的结构体

int m:学生数目的形参

int n:课程数目的形参

函数返回值:无

  1. void  SortbyName(STU stu[], int n, int m);

功能:按姓名的字典顺序排出成绩表

参数:

STU stu[]:存放学生信息的结构体

int m:学生数目的形参

int n:课程数目的形参

函数返回值:无

  1. void  SearchbyNum(STU stu[], int n, int m);

功能:按学号查询学生排名及其考试成绩

参数:

STU stu[]:存放学生信息的结构体

int m:学生数目的形参

int n:课程数目的形参

函数返回值:无

  1. void  SearchbyName(STU stu[], int n, int m);

功能:按姓名查询学生排名及其考试成绩

参数:

STU stu[]:存放学生信息的结构体

int m:学生数目的形参

int n:课程数目的形参

函数返回值:无

  1. void  StatisticAnalysis(STU stu[], int n, int m);

功能:按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比

参数:

STU stu[]:存放学生信息的结构体

int m:学生数目的形参

int n:课程数目的形参

函数返回值:无

  1. void  PrintScore(STU stu[], int n, int m);

功能:输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分

参数:

STU stu[]:存放学生信息的结构体

int m:学生数目的形参

int n:课程数目的形参

函数返回值:无

  1. void Writetofile(STU stu[],int n,int m);

功能:将每个学生的记录信息写入文件

参数:

STU stu[]:存放学生信息的结构体

int m:学生数目的形参

int n:课程数目的形参

函数返回值:无

  1. void Readfromfile(STU stu[],int *n,int *m);

功能:从文件中读出每个学生的记录信息并显示

参数:

STU stu[]:存放学生信息的结构体

int m:学生数目的形参

int n:课程数目的形参

函数返回值:无

  1. 系统实现

1.系统的总流程图:

菜单驱动的系统的主流程一般为:

 

 

 

开始

 

输入学生数据

 

此学生的序数是否大于学生总数

 

从第一个学生开始排序

 

此学生成绩至少比前几位学生中一位成绩低?

 

交换与该学生位置

 

对下一位学生进行排序

 

结束

 

N

 

Y

 

N

 

Y

 

 

开始

输入所查找学生的学号

输入学号与该学生相同

从第一个学生的学号开始匹配

对下一位学生进行匹配

输出该学生的 学号 姓名 成绩

输出未查询到相关信息

结束

学号是否存在

Y

N

Y

N

 

开始

输入学生信息

目前学生数i+1

i达到最大值?

输出插入后的信息

结束

Y

N

开始

输入学生信息

程序是否进行

回车键继续

输出学生学号姓名成绩

结束

Y

N

2.程序的全部源代码:

学生管理系统V6.0

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>


#define MAX_PSD_LEN 20

#define   MAX_LEN  10                      /* 字符串最大长度 */

#define   STU_NUM 30                       /* 最多的学生人数 */

#define   COURSE_NUM 6                     /* 最多的考试科目数 */

typedef struct student

{

    long num; /* 每个学生的学号 */

    char name[MAX_LEN];                /* 每个学生的姓名 */

    float score[COURSE_NUM]; /* 每个学生COURSE_NUM门功课的成绩 */

    float sum;                       /* 每个学生的总成绩 */

    float aver;                   /* 每个学生的平均成绩 */

} STU;

inline int Menu(void)

{

    int a;

    printf("======================Welcome to the to the student info manage system v6.0==========================\n");

    printf("Management for Students' scores\n");

    printf("1.Input record\n");

    printf("2.Caculate total and average score of every course\n");

    printf("3.Caculate total and average score of every student\n");

    printf("4.Sort in descending order by score\n");

    printf("5.Sort in ascending order by score\n");

    printf("6.Sort in ascending order by number\n");

    printf("7.Sort in dictionary order by name\n");

    printf("8.Search by number\n");

    printf("9.Search by name\n");

    printf("10.Statistic analysis\n");

    printf("11.List record\n");

    printf("12.Write to a file\n");

    printf("13.Read from a file\n");

    printf("14.Sign up to Admin\n");

    printf("0.Exit\n");

    printf("=======================================================================================================\n");

    printf("Please Input your choice:\n");

STAT :

    {

        int ret=scanf(" %d",&a);

        if(ret!=1)

        {

            printf("Input Error!\nPlease enter again:\n");

            fflush(stdin);

            goto STAT;

        }

    }

    return a;

}


inline void input(STU stu[],int stunum,int cosnum)

{

    int i,j;

    printf("Input student's ID, name and score:\n");

    for (i=0; i< stunum; i++)

    {

        scanf("%ld%s",&stu[i].num,&stu[i].name);

        for(j=0; j<cosnum; j++)

        {

            scanf("%f",&stu[i].score[j]);

        }

    }

    for (i=0; i<stunum; i++)

    {

        for(j=0; j<cosnum; j++)

        {

            stu[i].sum+=stu[i].score[j];

        }

        stu[i].aver=stu[i].sum/cosnum;

    }

    return 0;

}


inline void ReadScore(STU stu[], int n, int m)

{



}


inline void AverSumofEveryStudent(STU stu[], int n, int m)

{

    int i,j;


    for (i=0; i<n; i++)

    {

        printf("student %d: sum=%.0f,aver=%.0f\n",i+1,stu[i].sum,stu[i].aver);

    }

    return 0;

}


inline void AverSumofEveryCourse(STU stu[], int n, int m)

{

    int i,j;

    float sum[COURSE_NUM]= {0},av[COURSE_NUM]= {0};

    for (i=0; i<m; i++)

    {

        for(j=0; j<n; j++)

        {

            sum[i]+=stu[j].score[i];

        }

        av[i]=sum[i]/n;

        printf("course %d:sum=%.0f,aver=%.0f\n",i+1,sum[i],av[i]);

    }


    return 0;

}

inline void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b))

{

    int i,j,k,ii;


    for(i=0; i<n-1; i++)

    {

        k=i;

        for(j=i+1; j<n; j++)

        {

            if((*compare)(stu[j].aver,stu[k].aver))

                k=j;

        }

        if(k!=i)

        {

            SwapFloat(&stu[k].aver,&stu[i].aver);

            SwapFloat(&stu[k].sum,&stu[i].sum);

            SwapChar(stu[k].name,stu[i].name);

            SwapLong(&stu[k].num,&stu[i].num);

            for(ii=0; ii<m; ii++)

            {

                SwapFloat(&stu[k].score[ii],&stu[i].score[ii]);

            }

        }

    }

    return 0;

}


inline int Ascending(float a, float b)    /*按每个学生的总分由高到低排出名次表*/

{

    return a<b;

}


inline int Descending(float a, float b)

{

    return a>b;

}


inline void SwapFloat(float *x, float *y)

{

    float t2;


    t2=*x;

    *x=*y;

    *y=t2;

    return 0;

}

inline void SwapLong(long *x, long *y)

{

    long t1;


    t1=*x;

    *x=*y;

    *y=t1;

    return 0;

}

inline void SwapChar(char x[], char y[])

{

    char str[MAX_LEN];


    strcpy(str,x);

    strcpy(x,y);

    strcpy(y,str);

    return 0;

}

inline void AsSortbyNum(STU stu[], int n, int m)

{

    int i,j,k,ii;


    for(i=0; i<n-1; i++)

    {

        k=i;

        for(j=i+1; j<n; j++)

        {

            if(stu[j].num<stu[k].num)

                k=j;

        }

        if(k!=i)

        {

            SwapFloat(&stu[k].aver,&stu[i].aver);

            SwapFloat(&stu[k].sum,&stu[i].sum);

            SwapChar(stu[k].name,stu[i].name);

            SwapLong(&stu[k].num,&stu[i].num);

            for(ii=0; ii<m; ii++)

            {

                SwapFloat(&stu[k].score[ii],&stu[i].score[ii]);

            }

        }

    }

    return 0;

}

inline void SortbyName(STU stu[], int n, int m)

{

    int i,j,k,ii;


    for(i=0; i<n-1; i++)

    {

        k=i;

        for(j=i+1; j<n; j++)

        {

            if(strcmp(stu[j].name,stu[k].name)<0)

                k=j;

        }

        if(k!=i)

        {

            SwapFloat(&stu[k].aver,&stu[i].aver);

            SwapFloat(&stu[k].sum,&stu[i].sum);

            SwapChar(stu[k].name,stu[i].name);

            SwapLong(&stu[k].num,&stu[i].num);

            for(ii=0; ii<m; ii++)

            {

                SwapFloat(&stu[k].score[ii],&stu[i].score[ii]);

            }

        }

    }



}

inline void SearchbyNum(STU stu[], int n, int m)

{

    long number;

    int i,j,ii;


    printf("Input the number you want to search:\n");

    scanf("%ld",&number);

    for(i=0; i<n; i++)

    {

        if(stu[i].num==number)

        {

            printf("%ld\t%s\t",stu[i].num,stu[i].name);

            for(j=0; j<m; j++)

                printf("%.0f\t",stu[i].score[j]);


            printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver);

            return 0;

        }

    }

    printf("Not found!\n");

    return 0;

}

inline void SearchbyName(STU stu[], int n, int m)

{

    int i,j;

    char stuname[MAX_LEN];


    printf("Input the name you want to search:\n");

    scanf("%s",stuname);

    for(i=0; i<n; i++)

    {

        if(!strcmp(stuname,stu[i].name))

        {

            printf("%ld\t%s\t",stu[i].num,stu[i].name);

            for(j=0; j<m; j++)

                printf("%.0f\t",stu[i].score[j]);


            printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver);

            return 0;

        }

    }

    printf("Not found!\n");

    return 0;

}

inline void StatisticAnalysis(STU stu[], int n, int m)

{

    int i,j,total;

    for(j=0; j<m; j++)

    {

        int t[COURSE_NUM]= {0};

        printf("For course %d:\n",j+1);

        for(i=0; i<n; i++)

        {

            if(stu[i].score[j]>=0&&stu[i].score[j]<60)

                t[0]++;

            else if(stu[i].score[j]<70)

                t[1]++;

            else if(stu[i].score[j]<80)

                t[2]++;

            else if(stu[i].score[j]<90)

                t[3]++;

            else if(stu[i].score[j]<100)

                t[4]++;

            else if(stu[i].score[j]==100)

                t[5]++;

        }

        for(i=0; i<6; i++)

        {

            if(i==0)

                printf("<60\t%d\t%.2f%%\n",t[i],(float)t[i]/n*100);

            else if(i==5)

                printf("%d\t%d\t%.2f%%\n",(i+5)*10,t[i],(float)t[i]/n*100);

            else

            {

                printf("%d-%d\t%d\t%.2f%%\n",(i+5)*10,(i+5)*10+9,t[i],(float)t[i]/n*100);

            }

        }

    }

    return 0;

}


inline void PrintScore(STU stu[], int n, int m)

{

    int i,j;

    for (i=0; i< n; i++)

    {

        printf("%ld\t%s\t",stu[i].num,stu[i].name);

        for(j=0; j<m; j++)

            printf("%.0f\t",stu[i].score[j]);


        printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver);

    }

}


inline void Writetofile(STU stu[],int n,int m)

{

    FILE *fp;

    int i,j;


    if((fp=fopen("student.txt","w"))== NULL)

    {


        printf("Failure to open score.txt! \n");

        exit(1);

    }

    fprintf(fp,"%d\t%d\n",n,m);

    for(i=0; i<n; i++)

    {

        fprintf(fp,"%10ld%10s",stu[i].num,stu[i].name);

        for(j=0; j<m; j++)

        {


            fprintf(fp,"%10.0f",stu[i].score[j]);

        }

        fprintf(fp,"%10.0f%10.0f\n",stu[i].sum,stu[i].aver);

    }

    fclose(fp);

    return 0;

}


inline void Readfromfile(STU stu[],int *n,int *m)

{

    FILE *fp;

    int i,j;


    if((fp=fopen("student.txt","r"))== NULL)

    {


        printf("Failure to open score.txt! \n");

        exit(1);

    }

    fscanf(fp,"%d\t%d",n,m);

    for(i=0; i<*n; i++)

    {

        fscanf(fp,"%10ld",&stu[i].num);

        fscanf(fp,"%10s",stu[i].name);

        for(j=0; j<*m; j++)

        {


            fscanf(fp,"%10f",&stu[i].score[j]);

        }

        fscanf(fp,"%10f%10f\n",&stu[i].sum,&stu[i].aver);

    }

    fclose(fp);

    return 0;

}


inline admin(STU stu[],int n,int m)

{

    printf("========================Welcome to the to the admin version=========================\n");

    printf("You have 2 options.\n");

    printf("1.login.\n");

    printf("2.exit.\n");

    printf("3.change your password.\n");

printf("=====================================================================================\n");

    char pw[MAX_PSD_LEN]="admin",pw2[MAX_PSD_LEN]="123456";

    int a;

    char PassWord[MAX_PSD_LEN],*p=PassWord,ch;

    char PassWord1[MAX_PSD_LEN],*p1=PassWord1,*p2=pw2;

    int count=0;


    printf("Please select your option!\n");

    scanf("%d",&a);


    if(a==1)

    {

        printf("Please Enter your password:\n");

        ch=getch();

        while(ch!=13&&count<MAX_PSD_LEN-1)       /*当按下回车键或密码长度达到19,则退出循环*/

        {

            if(ch==8)                       /*如果按下的是向前删除键,则...*/

            {

                if(count)              /*如果密码串中字符数大于零,则向前删除一个字符*/

                {

                    p--;

                    count--;

                    printf("\b ");/*光标回退一格,将星号(*)改为空格*/

                    printf("\b"); /*光标重新回退一格*/

                }

            }

            else if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a')||(ch<='9'&&ch>='0'))

                /*如果输入的是密码的有效字符*/

            {

                printf("*");          /*输出一个星号*/

                count++;

                *p=ch;                /*记录密码内容*/

                p++;

            }

            ch=getch();                    /*等待输入下一个字符*/

        }

        PassWord[count]=0;

        printf("\n");

        if(strcmp(PassWord,pw)==0)

        {


            printf("You have successfully login!\n");

            n=adminsystem(stu,n,m);

            return n;

        }

        else

        {

            printf("Your password isn't correct!\n");

            return n;

        }

    }


    else if(a==2)

    {


        printf("You have successfully exit the Admin system!\n");

        return n;

    }

    else if(a==3)

    {

        count=0;

        printf("Please enter your old password:\n");

        ch=getch();

        while(ch!=13&&count<MAX_PSD_LEN-1)       /*当按下回车键或密码长度达到19,则退出循环*/

        {

            if(ch==8)                       /*如果按下的是向前删除键,则...*/

            {

                if(count)              /*如果密码串中字符数大于零,则向前删除一个字符*/

                {

                    p--;

                    count--;

                    printf("\b ");/*光标回退一格,将星号(*)改为空格*/

                    printf("\b"); /*光标重新回退一格*/

                }

            }

            else if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a')||(ch<='9'&&ch>='0'))

                /*如果输入的是密码的有效字符*/

            {

                printf("*");          /*输出一个星号*/

                count++;

                *p=ch;                /*记录密码内容*/

                p++;

            }

            ch=getch();                    /*等待输入下一个字符*/

        }

        PassWord[count]=0;

        printf("\n");

        if(strcmp(PassWord,pw)==0)

        {

            count=0;


            printf("Congratulations!Please enter your new password:\n");

            ch=getch();

            while(ch!=13&&count<MAX_PSD_LEN-1)       /*当按下回车键或密码长度达到19,则退出循环*/

            {

                if(ch==8)                       /*如果按下的是向前删除键,则...*/

                {

                    if(count)              /*如果密码串中字符数大于零,则向前删除一个字符*/

                    {

                        p2--;

                        count--;

                        printf("\b ");/*光标回退一格,将星号(*)改为空格*/

                        printf("\b"); /*光标重新回退一格*/

                    }

                }

                else if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a')||(ch<='9'&&ch>='0'))

                    /*如果输入的是密码的有效字符*/

                {

                    printf("*");          /*输出一个星号*/

                    count++;

                    *p2=ch;                /*记录密码内容*/

                    p2++;

                }

                ch=getch();                    /*等待输入下一个字符*/

            }

            pw2[count]=0;

            printf("\n");

            printf("Please enter again:\n");


            count=0;

            ch=getch();

            while(ch!=13&&count<MAX_PSD_LEN-1)       /*当按下回车键或密码长度达到19,则退出循环*/

            {

                if(ch==8)                       /*如果按下的是向前删除键,则...*/

                {

                    if(count)              /*如果密码串中字符数大于零,则向前删除一个字符*/

                    {

                        p1--;

                        count--;

                        printf("\b ");/*光标回退一格,将星号(*)改为空格*/

                        printf("\b"); /*光标重新回退一格*/

                    }

                }

                else if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a')||(ch<='9'&&ch>='0'))

                    /*如果输入的是密码的有效字符*/

                {

                    printf("*");          /*输出一个星号*/

                    count++;

                    *p1=ch;                /*记录密码内容*/

                    p1++;

                }

                ch=getch();                    /*等待输入下一个字符*/

            }

            PassWord1[count]=0;

            printf("\n");

            if(!strcmp(PassWord1,pw2))

            {

                strcpy(pw,PassWord1);

                printf("Your password has been successfully changed!\n");

                return n;

            }

            else

                printf("tow times does NOT match!\n");

                return n;

            }


        else

        {

            printf("Your password isn't correct!\n");

            return n;

        }


    }

    else

    {

        printf("Input Error!\n");

        return n;

    }


}

inline adminsystem(STU stu[],int n,int m)

{

    int n1;

    long num;

    char x;


    printf("1.add a student info\t\n");

    printf("2.delete a student info\t\n");

    printf("3.exit\n");

    scanf("%d",&n1);

    switch(n1)

    {

    case 1:

    {

        printf("please enter the student number you want to add:");

        num=-1;

        while(num<0)

        {

            scanf("%ld",&num);

            printf("\n");

            if(num<=0)

                printf("Input Error!\n""Please enter again:\n");

        }


        int i,j;


        printf("Input to be added student's ID, name and score:\n");

        for (i=0; i<num; i++)

        {

            scanf("%ld%s",&stu[n+i].num,&stu[n+i].name);

            for(j=0; j<m; j++)

            {

                scanf("%f",&stu[i+n].score[j]);

            }

        }

        for (i=0; i<num; i++)

        {

            for(j=0; j<m; j++)

            {

                stu[i+n].sum+=stu[i+n].score[j];

            }

            stu[i+n].aver=stu[i+n].sum/m;

            n=n+num;

            return n;

        }

        break;

        case 2:

        {

            printf("Please enter the student's student number you want to delete:\n");

            scanf("%ld",&num);


            int i,j;

            for(i=0; i<n; i++)

            {

                if(stu[i].num==num)

                {

                    printf("%ld\t%s\t",stu[i].num,stu[i].name);

                    for(j=0; j<m; j++)

                        printf("%.0f\t",stu[i].score[j]);


                    printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver);


                    printf("Are you SURE to delete(y/n)?\n");

                    scanf(" %c",&x);

                    char name1[MAX_LEN]= {0};


                    if(x=='y'||x=='Y')

                    {

                        stu[i].num=0;

                        strcpy(stu[i].name,name1);

                        for(j=0; j<m; j++)

                            stu[i].score[j]=0;


                        stu[i].sum=0;

                        stu[i].aver=0;

                        return n=n-1;

                    }

                    else if(x=='n'||x=='N')

                    {


                        return n;

                    }

                    else

                        printf("Input Error!\n");

                    return n;

                }

            }

            printf("Not found!\n");

            return n;

        }

        break;

        case 3:

            return n;

        default:

            printf("Input Error!");

            return n;

        }


    }

}

int main()

{

    int stunum=-1,cosnum=-1;


    while(stunum<0||stunum>30)

    {

        printf("Input student number(n<=30):\n");

        scanf("%d",&stunum);

        if(stunum<0||stunum>30)

        {


            printf("Input Error!Please Enter Again:\n");

        }

    }

    while(cosnum<0||cosnum>6)

    {

        printf("Input course number(m<=%d):\n",COURSE_NUM);

        scanf("%d",&cosnum);

        if(cosnum<0||cosnum>6)

        {


            printf("Input Error!Please Enter Again:\n");

        }

    }


    STU stu[STU_NUM]= {0};


    int flag=1,a,i,j;

    while(flag)

    {

        a=Menu();

        switch (a)

        {

        case 1:

            input(stu,stunum,cosnum);

            break;

        case 2:

            AverSumofEveryCourse(stu,stunum,cosnum);

            break;

        case 3:

            AverSumofEveryStudent(stu,stunum,cosnum);

            break;

        case 4:

            SortbyScore(stu,stunum,cosnum,Descending);

            printf("Sort in descending order by score:\n");

            for (i=0; i< stunum; i++)

            {

                printf("%ld\t%s\t",stu[i].num,stu[i].name);

                for(j=0; j<cosnum; j++)

                    printf("%.0f\t",stu[i].score[j]);


                printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver);

            }

            break;

        case 5:

            SortbyScore(stu,stunum,cosnum,Ascending);

            printf("Sort in ascending order by score:\n");

            for (i=0; i< stunum; i++)

            {

                printf("%ld\t%s\t",stu[i].num,stu[i].name);

                for(j=0; j<cosnum; j++)

                    printf("%.0f\t",stu[i].score[j]);


                printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver);

            }

            break;

        case 6:

            printf("Sort in ascending order by number:\n");

            AsSortbyNum(stu,stunum,cosnum);

            for (i=0; i< stunum; i++)

            {

                printf("%ld\t%s\t",stu[i].num,stu[i].name);

                for(j=0; j<cosnum; j++)

                    printf("%.0f\t",stu[i].score[j]);


                printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver);

            }

            break;

        case 7:

            printf("Sort in dictionary order by name:\n");

            SortbyName(stu,stunum,cosnum);

            for (i=0; i< stunum; i++)

            {

                printf("%ld\t%s\t",stu[i].num,stu[i].name);

                for(j=0; j<cosnum; j++)

                    printf("%.0f\t",stu[i].score[j]);


                printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver);

            }

            break;

        case 8:

            SearchbyNum(stu,stunum,cosnum);

            break;

        case 9:

            SearchbyName(stu,stunum,cosnum);

            break;

        case 10:

            StatisticAnalysis(stu,stunum,cosnum);

            break;

        case 11:

            PrintScore(stu,stunum,cosnum);

            break;

        case 12:

            Writetofile(stu,stunum,cosnum);

            break;

        case 13:

            Readfromfile(stu,&stunum,&cosnum);

            break;

        case 14:

            stunum=admin(stu,stunum,cosnum);

            break;

        case 0:

            printf("End of program!\n");

            flag=0;

            exit(0);

        default:

            printf("Input error!\n");

        }

    }

    return 0;

}
  1. 系统测试

1.程序调试中遇到的问题和解决方法及思路

在调试过中,我并没有碰到一些难点问题。只是程序调试的过程中会出现一些小错误,我通过单步执行,一点点找到错误,分析出错误的原因,然后逐个地更正错误,最后让程序更加完善。

举个例子,在用户在菜单界面进行选择菜单输入数字时候,不小心输成了英文,这会使得scanf读取错误,系统会无限循环,进而造成程序安乐死。

于是,我通过使用scanf函数的return值来进行判断,是否带到要求,并同时用fflush(stdin)进行清空缓冲区,这样问题就完美解决了。

2.实验结果

略。

  1. 分析总结、收获和体会

通过这次C语言实验设计,我发现其实设计一个如此长的系统并不是一件非常难的事情,然而将这个系统完善好才是比较难的一件事。尤其是在Debug过程中出现了许多问题,有些问题,一找就是一两个小时,十分令人头疼。写程序容易改程序难啊!

在写程序的过程中,了解到了之前没学过的一些知识,比如

  1. system(“cls”);是一个清屏函数;

  2. getchar();是程序停滞时使用的;

  3. 学习编写了暗文密码的输入系统,原来我们平时日常生活中经常输入的账户密码看不见原来是这个原理;

  4. 学会了文件的基本操作;

  5. inline (内联函数)的使用:内联函数的代码会在任何调用它的地方展开,使得程序占用内存空间更少;

  6. 采用了函数指针,将程序中的升序和降序两个函数抽象成一个独立的通用排序函数,使程序更加简洁,提高了程序的通用性,减少了重复代码。

在写程序的过程中我也总结出来了几点经验:

  1. 在程序的开始或者相关函数调用的时候增加一段错误处理代码。可以增加整个工程的容错性,提高程序的使用性能;

  2. 将程序中的绝对路径引用改为相对路径引用可以提高整个程序的移植性能;

  3. 多打备注有利于检查;

  4. 函数的模块化思想有利于程序的debug,也有利于提高程序的通用性,减少重复代码。

在这次设计中,我的优点不仅是将上述的经验和知识运用到我的代码中去,而且我也将程序写的非常标准,不省略任何一个return 0;对程序健壮性也做了优化,即使在输入菜单时不小心输入错了,程序也不会卡死,会重新让用户输入。

当然,在写代码的时候我也发现了我的许多不足,比如说一些基本功不扎实,老犯一些低级错误,导致程序出错,要解决这个问题,编程序的时候一定要细心,多看看书,多看些典型的算法,扎实基本功。还有一件重要的事情就是程序的美观性,以后的系统可以通过使用不同的颜色,不同的样式,更多的图片,来使得程序更加美观,让用户使用的时候心情舒畅。

完成这次大作业后,我不惧怕再编一个更长甚至更复杂的系统,只要静下心来,将系统划分成各个模块,分别击破,一个更宏大的操作系统就完成了,并非想象中的那么困难,原来我也可以编出这样的系统。将编程当做一件快乐的事情去做。

通往一名合格的程序员之路还有很长,在计算机编程中还有好多新的东西等待我们去探索,更底层的语言值得我们学习,更高级的语言值得我们去寻味。因此,我打算在今后的两年里面逐步学习JAVA,PYTHON,APP开发,汇编语言学习等等,极大地开发自己在计算机领域的兴趣。

要成为一名高级程序员,我还需要一路披荆斩棘,克服困难,不懈努力!

参考文献

[1] 苏小红,王宇颖,孙志岗.C语言程序设计(第3版)[M].北京:高等教育出版社.2015

[2] 苏小红,王宇颖,孙志岗.C语言程序设计学习指导(第3版)[M].北京:高等教育出版社.2015

[3] Stephen Prata.C Primer Plus中文版(第六版)[M].北京:人民邮电出版社.2016

C language programming learning 8

1.编程统计候选人的得票数。设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。
例如:
Input vote 1:li
Input vote 2:li
Input vote 3:Zhang
Input vote 4:wang
Input vote 5:zhang
Input vote 6:Wang
Input vote 7:Zhang
Input vote 8:wan
Input vote 9:li
Input vote 10:lii
Election results:
      li:3
   zhang:3
    wang:2
Wrong election:2

#include<stdio.h>
 
#include<string.h>
 
#define TheNumberOfTheELECTORATE 10
 
#define TheNumberOfTheCANDIDATE 3
 
struct candidate
 
{
 
char name[20];
 
int count;
 
}CANDIDATE[3]={"li",0,"zhang",0,"wang",0};
 
int main()
 
{
 
int i,j,flag=1,wrong=0;
 
char name[20];
 
for(j=1;j<=TheNumberOfTheELECTORATE;j++)
 
{
 
printf("Input vote %d:",j);
 
scanf("%s",name);
 
strlwr(name);
 
flag=1;
 
for(i=0;i<TheNumberOfTheCANDIDATE;i++)
 
{
 
if(strcmp(name,CANDIDATE[i].name)==0)
 
{
 
CANDIDATE[i].count++;
 
flag=0;
 
}
 
}
 
if(flag)
 
{
 
wrong++;
 
flag=0;
 
}
}
printf("Election results:\n");
for(i=0;i<TheNumberOfTheCANDIDATE;i++)
 
{
 
printf("%8s:%d\n",CANDIDATE[i].name,CANDIDATE[i].count); }
printf("Wrong election:%d\n",wrong);
 
return 0;
 
}

 

学生管理系统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;
}