您好,欢迎光临本网站![请登录][注册会员]  
文件名称: 从零开始学C语言(四).pdf.pdf
  所属分类: 其它
  开发工具:
  文件大小: 7mb
  下载次数: 0
  上传时间: 2019-09-13
  提 供 者: weixin_********
 详细说明:从零开始学C语言(四).pdfpdf,从零开始学C语言(四).pdf第10章数组133 10.23一维数组的引用 数组必须先定义后引用,在定义了数组变量后,我们就可以引用其中的每个元素了。一维 数组的引用格式如下: 数组名[下标表达式] 数组元素实际上是一种带下标的变量,简称下标变量。它与简单变量(不带下标的变量) 在使用上并无不同。在C语言中,不允许一次引用整个数组,只能逐个引用每个数组元素。同 时,由于每个数组元素的作用相当于一个同类型的简单变量。所以,对基本数据类型的变量所 能进行的各种运算也都适合于同类型的数组元素。 请比较: int m, n,p, aji a[2]=5 n=2*m a[1]=a[2]*3; scanf(“a”,&p); scanf(“暑d”,&a[4]); 它们之间的效果是一样的,都是一个变量。 上例中,我们使用数组时采用了具体的值。我们强调,在定义中不允许使用变量动态定义 数组,但是我们在实际应用中,更常用的引用数组的形式是用变量进行引用的。如:ail。这里 要将定义和引用区分开来。 在引用数组元素时,常用的形式是:al[il 若i=0,a[i>a[0 若 >a1 引用数组所有的元素称为遍历,遍历数组是通过循环来改变下标进行的。例如: 读入:for(i=0;i<5;计+) scant("%d",&ai]) 输出:for(i=4>=0;-) printf("%3d",a[i]) 在程序设计中,我们是无法知道分配给数组的具体地址的,C语言中不允许使用正整数作 为数组或变量的地址。若在程序中需要数组首地址或数组元素的地址,则只能用下列方式来表 示地址: 数组元素的地址 数组名[i〕或数组名+ 数组首地址 数组名或数组名[0] 例如 int x[5]: *定义一个整型数组x,含有5个数组元素* X *表示数组的首地址* x[0] *表示数组的首地址* &x[i] ′*表示数组元素x[i]地址即第i+1元素的地址*/ X+1 /*表示数组元素x[i]地址即第i+1元素的地址*/ 【实例10-3】数组元素的引用。例如:输入/输出数组中的元素。 #include void main() int a[10], sum=0,ii for(i=0;i<10;i++ /*循环输入数组元素的值* scanf("d”,&a[i]); fr(1=0;i<10;i++) /*循环取出数组中每个元素的值并求和* sum=sum+a[lI printf("Sum=&a\n", sun) /*输出最终结果* 运行程序,输入: 12345678910 输出结果: Sum=55 【实例10-4】分析下面的程序,体会数组元素的引用。 Include void main() inta[8]=1,0,1,0,1,0,1,0},i;/*定义一个整型数组元素a,和一个整型变量i*/ for(i=2:i<8;i++) a[i]+=a[i-1]+a[i-2] /*利用数组元素进行运算+/ for(i=0;i<8;i++) printf("gd ",a[il): /*将数组中的元素输出*/ printf("\n") 程序的运行结果为: 1022571320 从上例中,我们可以看到数组元素可以像一般的变量一样,进行各种运算 “a[i]+=a[i-1]+a[i-2]”将运算的结果再赋值给数组元素。 10.24一维数组的程序举例 【实例105】输入10个整数存入一维数组,按逆序重新存放后再输出。 #include void main( 第10章数组135 int a[101, x, i: for(i=0:i<10:i++) scant(·岩d",&a[i]); /*输入数组元素的值* for(i=0;i<5;主++) /*将数组元素逆序+ x=alil [i】=a[9-i]; a[9-i]=x for(i=0;i<10;i++) printf(“告d",a[i]); /*输出数组元素*/ } printf " \n " 程序分析: (1)定义一个整型数组长度为10,使用for语句向数组输出元素。 (2)将一维数组中的元素按逆序重新存放,即将第一个元素和最后一个元素调换一下位置, 第二个和倒数第二个调换位置,依此类推,如图10-3所示。 1与10调换位置 2与9调换位置 678 3与8调换位置 4与7调换位置 5与6调换位置 图10-3位置调换 变量i从0到4,表示数组中的第一个到第五个数组元素,与之对应的要进行调换的数组元 素位置为(9-i),将两个位置上的元素进行调换。 xealil a[i]=a[9-i]; a[9-i]=x; (3)然后将逆序后的数组元素进行输出 【实例106】用选择法对10个整数排序(从小到大)。 选择法思路如下: 设有10个元素a[]-a[10],将a[与a2}-a10比较,若a[1比a[2]-a[10]都小,则不进行交 换。若a[2]}~a[10中有一个以上比a[小,则将其中最小的一个与a1交换,此时a1中存放了 10个最小的数。依此类推,共进行9轮比较,就按照由小到大的顺序存放了。 井inc1ude< stdio.h void main() int i,, min, temp, a[11] printf ("enter data: \n"Ii+4 for(i=1;i<=10;i++/*输入数据*/ printf("a[gd]=",i)i scanf("id", &a[i]): printf("\n"): printf(the orginal numbers: \n") for(i=1:i<=10;i++ /*输出未排列数据* printf("85d",a[i])i 136m从零开始学C语冒 ==-========= printf("\n"); for(主=1;i<=9;i++) /*选择法排序* nln=l for(=i+1;j<=10;j++) if (a[min]>a[3]) min=) temp=a[]: a[i]=a[minl a [min]=tempi printf("\n”); for(=1;i<=10;i+) /*输出排序结果* printf ("s5d",a[i]): printf("\n"); 运行程序 enter data a[1]=5 a[2]=3 a[3]=2 a[4]=9 a[5]=8 a[6]=10 a[7]=1 a[8]=23 a[9]=7 a【10]=5 the orginal number: 32981012375 123557891023 【实例107】对10个数进行排序(从小到大)。 为加深对数字排序的理解,我们用两种方法来解答:冒泡法、遍历法。 1.用冒泡法对数据进行排序 冒泡发的基本思路:将相邻两个数比较,将小的调到前面。 具体为:(1)第一次从第一个数开始相互比较直到最后一个数,则小的数已经上浮,而最 大数已经下沉到底;(2)第二次从第一个数开始相互比较直到倒数第二个数,则小的数又上浮, 而第二大的数已经下沉到倒数第二位……依次进行,所有数就可按顺序排列好。例如图104所 示的数组。 988888 2 895555 8 444 4522 559444 44822 2 00 444922 22280 0005 222290 00008 00000 图10-4冒泡法 第10章数组137 程序分析: (1)对6个数排序,则每次做两两比较的对数为:5,4,3,2,1。 (2)比较趟数为5趟。 (3)参加比较的个数为:6,5,4,3,2。 #⊥nc1ude< stdio.h void main() int a[10],1,3,ti printf("Input 10 numbers: \n") for(i=0:1<10;1++) /*输入排序数* ( scanf("暑d",&a[1] printf("\n"); for(=0:1<9;1++) /*控制比较趟数*/ for(i=0;i<9-;i++) /*控制比较对数* if(a[i]>a[i+1]) t=a[1]; a[i]=a[i+1] a[i+1]=t } printf(" The sorted number \n")i fr(主=0;i<10;i++) /输出已排序的数*/ printf("sd"r a[il) i 运行程序,结果如下: Input 10 numbers: 912-557621202369-100 The sorted numbers: 100-512923576269120 在上述比较中可以发现,不管数字的排列比较是否已经完成,都会按照正常的循环语句进 行排序。直至循环语句完成。我们可以通过设置一个标记来简化程序的运行过程。例如: #include v。 id main() int j, n, change, a[10],ti for付=0;<10:3++) scanf("d",&a[j) change=l i while( n>0 & change==1) change=0; for (i=0 i ja[j+11) 138从零开始学c语會 t=alil a[j]=a[3+lli a[j+1]=t; change=l n--: } 在程序中,我们设置了一个标记 change,在每次for循环语句之前先赋值0,在每次for循 环中需要交换数字,即整个循环没有排列完毕时,赋值为1。当 change=0时,说明所有顺序已 经交换完毕,此时可以直接跳出循环,整体上减少了程序的运行时间 运行产生的结果和上述未设置 change标记的情况一样,在此不再赘述。 2.用遍历法对数据进行排序 遍历法排序的思路:第一次从第一个开始找出最小的一个585444 作为第一个元素,第二次从第二个开始找出第二小的元素……458955 依次进行,得出排序结果,如图105所示。 程序编写如下: 图10-5遍历法 排 include< stdio.h> void main() inta[10],1,j,t; printf("Input 10 numbers: \n")i for(i=0;i<10;i++) /*输入排序数* scanf("8d”,&a[i] printf("\n): for(j=0;j<9;j++) /*控制比较趟数+ for(i=j+1;i<10;i++ *控制比较对数* if(a[j]a[il t=a[jl: a[j]=a[i]: a[il=t printf("The sorted number \n") for(i=0:i<10;i++) /*输出已排序的数* printf(sd a[i]): 排序是C语言中比较重要的一类题目,需要我们仔细思考和掌握。此程序是对10个数进行 排序,在平常的应用中,我们可以更改此程序。 for(j=0:<9;j++ /*控制比较趟数*/ 【 for(i=j+1;i<10;i++) /*控制比较对数* 第10章数组139 if(a[j]a[i1 j t=a[j]: a[j]=a[i]; a【i]=t } 可以更改为: for(3=0 ; ja[1]) t=a[j]; a[j]=a[i]; ali=ti n代表所要排列的数字数目。当有n个数时,则要进行n1次比较,在第j趟比较中,要进 行n次比较。 【实例108】用筛选法求100以内的素数。 所谓筛选,指的是在一张纸上写上1到100的全部整数,然后逐个判断它们是否为素数, 找出一个非素数,就把它挖掉,最后剩下的就是素数,如图10-6所示。 1234567891011121314151617181920212223 具体做法是: (1)先将1挖掉。 初始化数组 a[1]=0 (2)用2去除它后面的各个数,把能被2整除的数挖掉,也就 i:2-sqr(100) 是把2的倍数挖掉。 J1+1-100 (3)用3去除它后面的各个数,把3的倍数挖掉。 a[=0且a= (4)用4、5、…各数去除这些数以后的各个数。这个过程一 ajl%ai]=0 直进行到在除数后面的数全部被挖掉为止。 a]=0 例如: 本题要求100以内的素数,故一直进行到97为止。但事实上, for(i=l;<=100;i++) a[]0 可以简化除数的范围。除数的范围只要是1~sqrt(m)即可。对本题而 言,只要到10即可。 打印a[i 因此上面的算法可以表示为: 图10-6求素数流程图 (1)挖去1。 (2)用下一个未被挖去的p去除p后面的各数,把p的倍数挖掉 (3)检查p是否小于(int)sqr(m),如果是,返回2。 (4)继续执行,否则就结束。 (5)剩下的数字都为素数。 #includesstdio. h> include
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 输入关键字,在本站1000多万海量源码库中尽情搜索: