1 / 18

C 语言程序设计

C 语言程序设计. 主讲:沈济南. TEL: 13971887071 E-mail: shenjinan@163.com. 第 13 讲. 主讲内容: 程序设计举例(数组). 【 例 6.20】. 【 例 6.20】 输入若干个 0 到 9 之间的整数,统计各整数的个数。 分析:输入整数的个数没有限定,因此在输入时应设置输入结束条件,由于输入的整数范围是 0 到 9 ,因此可以用该范围以外的特殊数作为结束标志,比如 -1 。 。输入过程中,若想结束输入,则可以输入结束标志 -1 ,程序将停止输入,进入下一步处理。.

glenna
Download Presentation

C 语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C语言程序设计 主讲:沈济南 TEL:13971887071 E-mail:shenjinan@163.com

  2. 第13讲 • 主讲内容: • 程序设计举例(数组)

  3. 【例 6.20】 • 【例 6.20】输入若干个0到9之间的整数,统计各整数的个数。 • 分析:输入整数的个数没有限定,因此在输入时应设置输入结束条件,由于输入的整数范围是0到9,因此可以用该范围以外的特殊数作为结束标志,比如-1。 。输入过程中,若想结束输入,则可以输入结束标志-1,程序将停止输入,进入下一步处理。

  4. 统计各整数的个数用一维数组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的个数。

  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++;

  6. /*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*/ }

  7. 程序运行过程: • 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

  8. 【例 6.21】 • 【例 6.21】按下列要求编程序: •   (1)产生10个2位随机正整数并存放在a数组中; •   (2)对数组中的元素按从小到大的顺序排序; •   (3)任意输入一个整数,并插入到数组中,使之仍保持有序; •   (4)任意输入一个0到9之间的整数k,删除a[k]。

  9. 分析: • (1)计算机可以自动产生随机数,那么如何产生满足要求的随机数呢?在C语言库函数中有一个产生1到32767之间随机数的函数rand(),在程序的开头添加命令#include"stdlib.h",就可以在程序中使用该函数。下面是产生a到b之间的随机正整数的方法: rand()%b+a • 例如rand()%90产生0到89之间的整数,所以rand()%90+10产生10到99之间的整数。

  10. (2)对数组元素排序有多种排序方法,这里采用改进的冒泡排序法。flag用作标志每开始新的一轮比较时将flag置为0,若本轮比较有元素发生交换则置flag为1,一轮的比较结束时根据flag的值(为0未发生交换,为1有交换)确定是否继续下一轮的比较。当在某一轮比较后数组已完成排序时,本算法可以提前结束外循环。(2)对数组元素排序有多种排序方法,这里采用改进的冒泡排序法。flag用作标志每开始新的一轮比较时将flag置为0,若本轮比较有元素发生交换则置flag为1,一轮的比较结束时根据flag的值(为0未发生交换,为1有交换)确定是否继续下一轮的比较。当在某一轮比较后数组已完成排序时,本算法可以提前结束外循环。 • (3)为了把一个整数按大小顺序插入已排好序的数组中,需要做好两件事,首先要确定插入位置,因为数组是按递增排序的,这里采用顺序查找的方法把欲插入的数与数组中各数逐个比较,当找到第一个比插入数大的元素i时,该元素的位置即为插入位置。

  11. 然后腾出插入空间,从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素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]。

  12. 下面的程序可以产生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);

  13. /* 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 */ {

  14. /* 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请输入一个待插入的数:");

  15. /* 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;

  16. /* 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 */ }

  17. 程序运行过程: 产生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

  18. C语言程序设计 主讲:沈济南 TEL:13971887071 E-mail:shenjinan@163.com

More Related