欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用数组来存储信息

程序员文章站 2022-07-13 08:36:38
...

一、统计选票信息

1.题目描述

某次选举,要从五个候选人(编号分别为1、2、3、4、5)中选一名厂长。请编程完成统计选票的工作。

2.算法思路

(1)虽然选票发放的数量一般是已知的,但收回的数量通常是无法预知的,所以算法采用随机循环,设计停止标志为“-1”。
(2)统计过程的一般方法为:先为五个候选人各自设置五个“计数器”S1,S2,S3,S4,S5,然后根据录入数据通过多分支语句或嵌套条件语句决定为某个“计数器”累加1, 这样做效率太低。
现在把五个“计数器”用数组代替,选票中候选人的编号xp正好做下标,执行A(xp)=A(xp)+1就可方便地将选票内容累加到相应的“计数器”中。也就是说数组结构是存储统计结果的,而其下标正是原始信息。
(3)考虑到算法的健壮性,要排除对1——5之外的数据进行统计。

3.算法的伪码描述

vote(  )
{ 
    int i,xp,a[6];
    print(“input data until input -1);
    input(xp );
    while(xp!=-1)
    {
        if (xp>=1 and xp<=5 )
            a[xp]=a[xp]+1;
        else
            print(xp, "input error!"); 
        input(xp );
    }
   for (i=1;i<=5;i++)
      print(i,"number get", a[i], "votes");
} 

二、统计身高信息

1.题目描述

编程统计身高(单位为厘米)。统计分150-154;155-159;160-164;165-169;170-174;175-179及低于150、 高于179共八档次进行。

2.算法思路

输入的身高可能在50——250之间,若用输入的身高数据直接作为数组下标进行统计,即使是用PASCAL语言可设置上、下标的下界,也要开辟200多个空间,而统计是分八个档次进行的,这样是完全没有必要的。

由于统计区间的大小是5,这样用“身高/5-29”做下标,则只需开辟8个元素的数组,对应八个统计档次,即可完成统计工作。

3.算法的伪码描述

main(  )
{ 
    int i,sg,a[8];
    print(“input height data until input -1);
    input(sg  );
    while (sg<>-1{
        if  (sg>179)    { a[7]=a[7]+1}
        else if  (sg<150)   { a[0]=a[0]+1}
            else    { a[sg/5-29]=a[sg/5-29]+1}
        input( sg  );
      }
    for (i=0;i<=7;i=i+1)
        print(i+1 ,“field the number of people: ”,a[i]);
}

三、统计及格学生学号信息

1.题目描述

一次考试共考了语文、代数和外语三科。某小组共有九人,考后各科及格名单如下表,请编写算法找出三科全及格的学生的名单(学号)—21个记录。
用数组来存储信息

2.算法思路

2.1思路一

从语文及格名单中逐一抽出各及格学生学号,先在代数及格名单核对,若有该学号(说明代数也及格了),再在外语及格名单中继续查找,看该学号是否也在外语及格名单中。若仍在,说明该号属全及格学生的学号,否则就是至少有一科不及格的。若语文及格名单中就没有某生的号,显然该生根本不在比较之列,自然不属全及格学生。方法采用了枚举尝试的方法
A,B,C三组分别存放语文、代数、外语及格名单,尝试范围为三重循环:

I循环,
初值0, 终值6, 步长1

J循环,
初值0, 终值5, 步长1

K循环,
初值0, 终值7, 步长1

定解条件: A[I]=B[J]=C[K] 共尝试768=336次。

2.2思路二

用数组A的九个下标分量作为各号考生及格科目的计数器。将三科及格名单共存一个数组,当扫描完毕总及格名单后,凡下标计数器的值为3的就是全及格的,其余则至少有一科不及格的.该方法同样也采用了枚举尝试的方法。

3.算法的伪码描述

3.1思路一的伪码

main( )  
 {
    int   a[7], b[6], c[8],i,j,k,v,flag;
    for( i =0;i<=6;i=i+1)     input(a[i]);
    for( i =0;i<=5;i=i+1)     input(b[i]);
    for( i =0;i<=7;i=i+1)     input(c[i]);
    for( i =0;i<=6;i=i+1)
    {v=a[i];
        for( j =0;j<=5;j=j+1)
            if ( b[j]=v )  
                for(k =0;k<=7;k=k+1)
                    if(c[k]=v) 
                    {print(v); break;}
   }
}

3.2思路二的伪码

main( )
{
    int  a[10],i,xh;
    for(i =1;i<=21;i=i+1)   //21个记录
    {
        input(xh);
        a[xh]=a[xh]+1;
    }
    for(xh =1;xh<=9;xh=xh+1)
        if(a[xh] =3 )
            print(xh);
} 

四、统计数字对出现的频率

1.题目描述

输入N(2≤N≤100)个数字(在0与9之间),然后统计出这组数中相邻两数字组成的链环数字对出现的次数。例如:
输入:N=20
{表示要输入数的数目}
0
1 5 9
8 7 2
2 2 3
2 7 8
7 8 7
9 6 5
9
输出:(7,8)=2 (8,7)=3 {指(7,8)、(8,7)数字对出现次数分别为2次、3次
(7,2)=1
(2,7)=1
(2,2)=2
(2,3)=1 (3,2)=1

2.算法思路

其实并不是只有一维数组这样的数据结构可以在算法设计中有多彩的应用,根据数据信息的特点,二维数组的使用同样可以使算法易于实现,此题就正是如此。

用10*10的二维数组(行、列下标均为0-9),存储统计结果,i行j列存储数字对(i,j)出现的次数,无需存储原始数据,用其做下标,在数据输入的同时就能统计出问题的结果。

3.算法的伪码描述

main( )
{
    int a[10][10],m,i,j,k1,k0;
    print(“How many numbers?);
    input(n);
    print(“Please input these numbers:);
    input(k0);
    for (i=2;i<=n;i=i+1) 
    {
        input(k1);   
        a[k0][k1]=a[k0][k1]+1; 
        k0=k1;
    }
    for (i=0;i<=9;i=i+1)
        for (j=0;j<=9;j=j+1)
            if (a[i][j]<>0 and a[j][i]<>0)      
                print((,i,j,)=,a[i][j],,(,j,i,)=,a[j][i]);
}