180 likes | 404 Views
C 语言程序设计. 主讲:沈济南. TEL: 13971887071 E-mail: shenjinan@163.com. 第 13 讲. 主讲内容: 程序设计举例(数组). 【 例 6.20】. 【 例 6.20】 输入若干个 0 到 9 之间的整数,统计各整数的个数。 分析:输入整数的个数没有限定,因此在输入时应设置输入结束条件,由于输入的整数范围是 0 到 9 ,因此可以用该范围以外的特殊数作为结束标志,比如 -1 。 。输入过程中,若想结束输入,则可以输入结束标志 -1 ,程序将停止输入,进入下一步处理。.
E N D
C语言程序设计 主讲:沈济南 TEL:13971887071 E-mail:shenjinan@163.com
第13讲 • 主讲内容: • 程序设计举例(数组)
【例 6.20】 • 【例 6.20】输入若干个0到9之间的整数,统计各整数的个数。 • 分析:输入整数的个数没有限定,因此在输入时应设置输入结束条件,由于输入的整数范围是0到9,因此可以用该范围以外的特殊数作为结束标志,比如-1。 。输入过程中,若想结束输入,则可以输入结束标志-1,程序将停止输入,进入下一步处理。
统计各整数的个数用一维数组b记录,由于输入的整数范围是0到9,我们可以利用b[0]记录0的个数,用b[1]记录1的个数,……,用b[9]记录9的个数。即用数组元素(b[i])作为计数器来统计各整数的个数。设输入的整数存放在数组a中,则b[a[k]]存放的就是整数a[k]的个数。如a[k]=5,则b[a[k]]=b[5]即整数5的个数。统计各整数的个数用一维数组b记录,由于输入的整数范围是0到9,我们可以利用b[0]记录0的个数,用b[1]记录1的个数,……,用b[9]记录9的个数。即用数组元素(b[i])作为计数器来统计各整数的个数。设输入的整数存放在数组a中,则b[a[k]]存放的就是整数a[k]的个数。如a[k]=5,则b[a[k]]=b[5]即整数5的个数。
/*源程序名:CH0620.C*/ • /*01*/ #include<stdio.h> • /*02*/ #define N 100 /* 至多输入100个整数*/ • /*03*/ void main( ) • /*04*/ { • /*05*/ int i,j,k,a[N],b[10]; • /*06*/ k=0; • /*07*/ printf("Input a integer(0--9),end with -1\n"); • /*08*/ scanf("%d",&j); • /*09*/ while(j>=0 && j<=9) /* 输入整数并存放到a数组中 */ • /*10*/ { • /*11*/ a[k]=j; • /*12*/ k++;
/*13*/ scanf("%d",&j); • /*14*/ } • /*15*/ for(i=0;i<10;i++) • /*16*/ b[i]=0; /* b数组各数组元素初始化为0,以便统计各整数的个数*/ • /*17*/ for(i=0;i<k;i++) b[a[i]]+=1; • /*18*/ for(i=0;i<10;i++) /* 输出各整数的个数 */ • /*19*/ printf("%d: %d\n",i,b[i]); • /*20*/ }
程序运行过程: • Input a integer(0--9),end with –1 • 2536924746274954786384674-1↙ • 0: 0 • 1: 0 • 2: 3 • 3: 2 • 4: 6 • 5: 2 • 6: 4 • 7: 4 • 8: 2 • 9: 2
【例 6.21】 • 【例 6.21】按下列要求编程序: • (1)产生10个2位随机正整数并存放在a数组中; • (2)对数组中的元素按从小到大的顺序排序; • (3)任意输入一个整数,并插入到数组中,使之仍保持有序; • (4)任意输入一个0到9之间的整数k,删除a[k]。
分析: • (1)计算机可以自动产生随机数,那么如何产生满足要求的随机数呢?在C语言库函数中有一个产生1到32767之间随机数的函数rand(),在程序的开头添加命令#include"stdlib.h",就可以在程序中使用该函数。下面是产生a到b之间的随机正整数的方法: rand()%b+a • 例如rand()%90产生0到89之间的整数,所以rand()%90+10产生10到99之间的整数。
(2)对数组元素排序有多种排序方法,这里采用改进的冒泡排序法。flag用作标志每开始新的一轮比较时将flag置为0,若本轮比较有元素发生交换则置flag为1,一轮的比较结束时根据flag的值(为0未发生交换,为1有交换)确定是否继续下一轮的比较。当在某一轮比较后数组已完成排序时,本算法可以提前结束外循环。(2)对数组元素排序有多种排序方法,这里采用改进的冒泡排序法。flag用作标志每开始新的一轮比较时将flag置为0,若本轮比较有元素发生交换则置flag为1,一轮的比较结束时根据flag的值(为0未发生交换,为1有交换)确定是否继续下一轮的比较。当在某一轮比较后数组已完成排序时,本算法可以提前结束外循环。 • (3)为了把一个整数按大小顺序插入已排好序的数组中,需要做好两件事,首先要确定插入位置,因为数组是按递增排序的,这里采用顺序查找的方法把欲插入的数与数组中各数逐个比较,当找到第一个比插入数大的元素i时,该元素的位置即为插入位置。
然后腾出插入空间,从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素i即可。如果被插入数比所有的元素值都大则插入最后位置。然后腾出插入空间,从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素i即可。如果被插入数比所有的元素值都大则插入最后位置。 • (4)在一个长度为n的有序数组a中删除下标为k的数组元素,我们可以把a[i](i=k+1,k+2,……,n-1)依次向前移动一个位置。注意,应从前往后依次移动元素,不然会破坏原来的数据。即先将原a[k+1]移到a[k],这样原a[k]消失,客观上原a[k]被删除。然后原a[k+2]移到a[k+1],……,原a[n-1]移到a[n-2]。
下面的程序可以产生10个2位随机整数并从小到大排序,然后在这些数中插入一个数和删除一个数,并使它们仍然保持有序。下面的程序可以产生10个2位随机整数并从小到大排序,然后在这些数中插入一个数和删除一个数,并使它们仍然保持有序。 /*源程序名:CH0621.C*/ /* 01 */ #include "stdlib.h" /* 02 */ #include "stdio.h" /* 03 */ #define N 10 /* 04 */ void randdata(int v[],int n) /* 产生随机数并输出 */ /* 05 */ { /* 06 */ int i; /* 07 */ printf("产生%d个2位随机整数组成数组:",n);
/* 08 */ for(i=0;i<n;i++) /* 09 */ { /* 10 */ v[i]=rand( )%90+10; /* 11 */ printf("%4d",v[i]); /* 12 */ } /* 13 */ } /* 14 */ void sort(int v[],int n) /*对数组元素排序*/ /* 15 */ { /* 16 */ int i,j,flag,t; /*flag用作标志*/ /* 17 */ for(i=0;i<n-1;i++) /* 18 */ { /* 19 */ flag=0;/* 标志位初始化为0 */ /* 20 */ for(j=0;j<n-i-1;j++) /* 21 */ if(v[j]>v[j+1]) /* 22 */ {
/* 23 */ t=v[j]; /* 24 */ v[j]=v[j+1]; /* 25 */ v[j+1]=t; /* 26 */ flag=1; /* 有交换,标志位置为1 */ /* 27 */ } /* 28 */ if(!flag) break; /* flag若为0,说明本轮比较未发生交换,排序已完成*/ /* 29 */ } /* 30 */ printf("\n从小到大排序后的数组:"); /* 31 */ for(i=0;i<n;i++) /* 32 */ printf("%4d",v[i]); /* 33 */ } /* 34 */ void insert(int v[],int n) /* 35 */ { /* 36 */ int i,j,k; /* 37 */ printf("\n请输入一个待插入的数:");
/* 38 */ scanf("%d",&k); /* 39 */ for(i=0;i<n;i++) /* 40 */ if(k<v[i]) break; /* 查找插入位置i */ /* 41 */ for(j=n;j>i;j--) /* 42 */ v[j]=v[j-1]; /* v[n-1],v[n-2],…,v[i]依次后移一个位置,腾出v[i] */ /* 43 */ v[i]=k; /* 将 k 插入到 v[i] */ /* 44 */ printf("插入数据后的数组各元素:"); /* 45 */ for(i=0;i<n+1;i++) /* 46 */ printf("%4d",v[i]); /* 47 */ } /* 48 */ void del(int v[],int n) /* 49 */ { /* 50 */ int i,k;
/* 51 */ printf("\n输入要删除数组元素的下标:"); • /* 52 */ scanf("%d",&k); • /* 53 */ for(i=k;i<n-1;i++) • /* 54 */ v[i]=v[i+1]; /* v[k+1],v[k+2],…,v[n-1]依次前移一个位置*/ • /* 55 */ printf("删除后的数组是:"); • /* 56 */ for(i=0;i<n-1;i++) • /* 57 */ printf("%4d",v[i]); • /* 58 */ } • /* 59 */ void main( ) • /* 60 */ { int n,a[N+1]; • /* 61 */ n=N; • /* 62 */ randdata(a,n); /*产生满足要求的随机数*/ • /* 63 */ sort(a,n); /*对数组a排序*/ • /* 64 */ insert(a,n); /*在数组a中插入一个数据*/ • /* 65 */ n=n+1; /* 数组长度增加一 */ • /* 66 */ del(a,n); /*删除数组a中的一个元素*/ • /* 67 */ getchar(); • /* 68 */ }
程序运行过程: 产生10个2位随机整数组成数组: 51 27 44 50 99 74 58 28 62 84 从小到大排序后的数组: 27 28 44 50 51 58 62 74 84 99 请输入一个要插入的数:35↙ 输出插入后的a数组各元素: 27 28 35 44 50 51 58 62 74 84 99 输入要删除数组元素的下标:5↙ 删除后的数组是: 27 28 35 44 50 58 62 74 84 99
C语言程序设计 主讲:沈济南 TEL:13971887071 E-mail:shenjinan@163.com