C语言学习----07 数组的应用举例

一堆数组的应用举例

        程序员在程序设计时常常需要对存储在数组中的大量数据进行处理,如统计、排序、查找、插入与删除等。                                                                                                                                         1.统计                                                                                                                                                  统计是指搜集、整理和分析客观事物总体数量方面资料的工作过程,这里的统计是指合计、总计。例如,无记名投票选班干部,统计人口数量,统计在一定时间内过往数量的次数,等等。             某学院在学生会换届选举中由全体学生无记名投票选举学生会主席,共有10名候选人,每个人的代号分别是1,2,3,…,10   。每个学生填写一张选票,若同意某名候选人(只能选一个)则在其姓名后花圆圈。编写一个程序,根据所有选票统计出每位候选人所得票数,其中每张选票上所投候选人的代号从键盘输入,当输入完所有选票后,用-1作为数据输入结束的标志。                    分析:由于需要同时使用10个变量分别统计存储10位候选人的票数,为了方便处理,应该利用数组来存储和统计。这里可以定义一个具有11个元素的一维整型数组 vote 来统计每个候选人的票数,其中忽略第一个数组元素  vote[0],因为用数组元素 vote[1]对应代号为1的候选人票数比用元素 vote[0]更好理解。这样用10个数组元素,即vote[1]~vote[10]来分别统计对应代号为1~10的10位候选人的票数。当输入某一个代号x(1<=x>=10)时,表示该候选人得一票,则数组元素 vote[x]加1(直接用代号x作为数组元素的下标,即该候选人票数所对应的数组元素是  vote[x])。从键盘输入一个代号序列(输入-1表示结束),当程序运行结束后,每个数组元素 vote[x]的值就是代号为x的候选人最后所得的票数。程序代码如下:

#include<stdio.h>
int main()
{
   int x,vote[11]={0};
   printf("请依次输入每张选票上投选的代号(1~10): \n")
   scanf("%d",&x);         //输入第一张选票信息
   while(x!=-1)            //当输入x的值为-1时,程序结束
   { 
       if(x>=1&&x<=10)
          vote[10]++;
         scanf("%d",&x);
   }
   printf("\n")
   for(x=1;x<=10;x++)
   printf("%d号候选人的票数为: %d\n",x,vote[x]);
   return 0;
}
      

     2 .排序                                                                                                                                                   排序是把一系列无序的数据按照特定的顺序(升序或降序)重新排列为有序序列的过程。对数据进行排序是数组重要的应用之一,如期末时要对学生成绩进行排序,以便了解学生的学习情况。实际生活中的很多问题都需要对数据进行排序。在计算机科学领域中,排序问题吸引力很多科学家的关注。至今已有许多比较成熟的排序算法,如交换法、选择法、插入法、冒泡法、快速排序等。本次只介绍冒泡法和选择法。                                                                                                                   (1)冒泡法                                                                                                                                               冒泡法的基本思路如下。                                                                                                               1)将N个无序的数放入一个数组a中,比较第一个数与第二个数,若为逆序(即a[10]>a[1]),则交换;然后比较第二个数与第三个数;以此类推,直至第(N-1)个数和第N个数比较为止——第一轮冒泡排序,结果最大的数被安置在最后一个元素位置上。                                          2)对前(N-1)个数进行第二轮冒泡排序,结果是使次大的数被安置在第(N-1)个元素位置上。                                                                                                                                                          3)重复上述过程,共经过(N-1)轮冒泡排序后,排序结束。                                                      例如,以数组 int  a[5]={9,8,3,7,2}为例,重复4轮比较后就可以完成对数组a中的5个数从小到大的排序,排序过程如下所示:

      第一轮比较中,第一个元素9为最大值,以此它在每次比较时都会发生位置交换,最后都放到最后一个位置;第二轮比较与第一轮过程类似,元素8被放到倒数第二个位置;第三轮比较中,第一次比较没有发生位置交换,在第二次比较时才发生位置交换,元素7被放到倒数第三个位置。后面的以此类推,直至数组中的所有元素完成排序。                                                                                   通过上面的算法描述和实例分析可知,这种排序算法之所以称为冒泡法,是因为在排序的过程中,较小的数好像气泡一样逐渐往上冒,大的数逐渐往后沉,最终完成排序。如果按从大到小排序,只需要将算法实现中每次比较两数时,前者大于后者改为前者小于后者即可。(代码略)

#include<stdio.h>

 (2)选择法                                                                                                                                             选择法是从算法优化的角度对冒泡法的改进。冒泡法排序要将数组中的数两两比较,每次比较时将较小的数向前“冒”,如此进行(N-1)次操作后将N个数中最大的数到数组最后一个位置上。选择法排序改进和实现的思想是:经过两两比较后,并不马上交换位置,而是找到最小的数后,记下最小的数所在的位置,待一轮比较完后,再将最小的数一次交换到位。选择法的基本思想如下:              1)将N个无序的数放入一堆数组a中,找到数组中最大(小)元素,将该最大(下)元素与数组中第一个元素交换位置。此为第一轮选择排序,结果最大(下)的数被安置在数组中第一个元素位置上。                                                                                                                                                   2)对后(N-1)个数进行第二轮选择排序,结果是使次大(下)的数被安置在第二个元素位置上。                                                                                                                                                            3)重复上述过程,共经过(N-1)轮排序后,排序结束。(代码略)

  

#

      3.查找

       使用数据库时,用户可能需要频繁地通过输入关键字来查找相应的记录。在数据中搜索一个特定元素的处理过程称为查找。本节介绍两种查找算法:顺序查找和二分查找。                                      (1)顺序查找。顺序查找使用查找的关键字逐个与数组元素进行比较以实现查找。其查找的基本过程:利用循环顺序遍历整个数组,依次将数组中每个元素与待查找的数进行比较;若找到,则停止循环,输出其位置;若所有元素比较后仍未找到指定的数据,则结束循环,输出“未找到”的提示信息。                                                                                                                                                     例:从键盘输入10个数存入数组,然后在数组中查找一个给定的数。分析:输入10个整数存入数组a,再输入一个要查找的数x,然后从数组中第一个元素开始,依次访问数组中的每个元素,把它与要查找的数x进行比较,如果相等则查找成功,输出相应数组元素的下标;否则,输出“Not Found!”。程序伪代码如下:

#include<stdio.h>
#define  N 10
int main()
{
/*定义变量,flag为查找标记,初值为0,查找成功为1*/
    int  a[N],i,x,flag=0;
/*使用循环语句,输入数组中各元素的值*/
    printf("Please input 10 integers: ");
    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
/*输入待查找的数x*/
     printf("Input  x:");
     scanf("%d",&x);
/*使用循环语句,遍历数组元素,在数组中查找x*/
     for(i=0;i<N;i++)
         if(a[i]==x)         //查找成功,flag值赋1,退出循环
         {
          flag=1;
          break;
         }
/*输出查找结果*/
     if(flag==1) //查找成功,循环变量i即为查找到的数组元素的下标          
     printf("Index   is   %d\n",i);
     else
          printf("Not  Found!\n");
     return 0;
}

 (2)二分查找。当待查找的信息有序排列时,二分查找法比顺序查找法的速度要快。二分查找也称为折半查找,其基本思想:首先选取位于数组中间的元素,将其与查找键进行比较。如果相等,则查找键被找到,返回数组中间元素的下标。否则,查找的区间缩小为原来区间的一半,即在一半的数组元素中查找。假设数组元素已按升序排序,如果查找键小于数组的中间元素值,则在前一半数组元素中继续查找,否则在后一半数组元素中继续查找。如果在该子数组(原数组的一个片断)中仍未找到查找键,则算法将在原数组的1/4大小的子数组中继续查找。每次比较之后,都将目标数组中一半的元素排除在比较范围之外。不断重复这样的查找过程,直到查找键等于某个数组中间元素的值(找到查找键),或者子数组只包含一个不等于查找键的元素(即没有找到查找键)时为止。              例:用二分查找法实现在有序数组中查找某一指定的数。分析:输入10个有序整数存入数组a,再输入一个要查找的数x,按二分查找法查找值为x的数组元素,如果查找成功,输出相应数组元素的下标;否则,输出“Not  Found!”。程序伪代码如下:

#include<stdio.h>
#define N 10
int main()
{
   /*定义变量,find为查找标记,初值为0,查找成功为1,low和high是查找区间的起点和终点下标*/
   int a[N],i,x,find=0;
   int low=0,high=N-1,mid;
   /*输入待查找的数 x*/
   printf("Input x: ");
   scanf("%d",&a[i]);
   /* 使用二分查找法,在数组中查找 x*/
   while(low<=high)
   {
       mid=(low+high)/2;     //待查找区间中间元素的下标
       if(x==a[mid])         //如果x等于a[mid],则查找完毕,结束查找过程
       {
           find=1;     break;
       }
        else   if(x>a[mid])   //如果x大于a[mid],则只需再查找a[mid]后面的元素,
                              //修改区间下界low=mid+1
           low=mid+1;
         else                 //如果x小于a[mid],则只需再查找a[mid]前面的元素
                              //修改区间上界high=mid-1
            high=mid-1;
   }
       /*输出查找结果*/
   if(find==1)                //查找成功时,循环变量mid即为查找到的数组元素的下标
        printf("Index  is  %d\n",mid)
   else
        printf("Not Found!\n");
    return 0;
}
 

    4 . 插入与删除 

       在数组中,经常要对数组中的元素进行插入和删除操作。例如,在学生成绩管理系统中,班级有学生转入、转出;在手机通讯录中,增加或删除联系人。数组在内存中的连续存储的特点,决定了有元素增删时需要移动部分元素。                                                                                                          插入就是把待插入的数据插入数据序列的指定位置,其基本思想:首先在数据序列中找到待插入的位置,然后从后向前把插入点后面的数据依次向后移动一个位置,最后把待插入的数据插入指定位置。                                                                                                                                                  删除就是在数据序列中删除指定位置元素,其基本思想:首先在数据序列中找到指定的元素位置,然后把指定位置后面的元素逐一向前移动一个位置。                                                                      例:数组score中递增存入10个学生的成绩,在数组中插入一个新成绩x,使得插入后的数组中数据有序。                                                                                                                                             分析:定义一个数组score用于存放10个学生的成绩,输入待插入的成绩x,查找待插入成绩x在数组score中应插入的位置location,从最后一个元素开始向前直到下标为location的元素依次往后移动一个位置,将待插入的成绩x值赋给下标为location的数组元素,同时数组元素的个数增加1,最后输出数组score中所有元素的值。

#include<stdio.h>
#define SIZE 10
int main()
{
/*定义变量并初始化*/
int i,x,location,score[SIZE]={55,58,60,65,68,78,80,85,90};
/*输入插入的成绩*/
printf("Input the insert score value: ");
scanf("%d",&x);
/*查找待插入成绩x在数组score中的位置*/
for(i=0;i<SIZE-1;i++)
     if(x<score[i])
          break;
    location=i;
/*将插入点后的每一个数组元素依次向后移动一个位置*/
for(i=SIZE-2;i>=location;i--)
     score[i+1]=score[i];
/*插入成绩x*/
score[location]=x;
/*输出插入后所有学生的成绩*/
printf("After insertion,the scores are:\n");
for(i=0;i<SIZE;i++)
    printf("%4d",score[i]);
printf("\n");
return 0;
}

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值