c语言清华大学,清华大学C语言教学课件共16个第4个

《清华大学C语言教学课件共16个第4个》由会员分享,可在线阅读,更多相关《清华大学C语言教学课件共16个第4个(30页珍藏版)》请在人人文库网上搜索。

1、1,计算机程序设计基础,第四讲,数组,2,三、数组,中秋佳节,有贵客来到草原,主人要从羊群中选一只肥羊,宴请宾客,当然要选最重者。这样就要记录每只羊的重量,如果有成千上万只羊,不可能用一般变量来记录。可以,用带有下标的变量,也就是这里要讲的,数组,问题:哪只羊最重,3,我们先看例子:用键盘输入,10,只羊的重量存放到一个,名为,sheep,的数组中,include,void main(,主函数,float sheep10,数组,有,10,个浮点类型元素,用于存,10,只羊每一只的重量,float max,浮点类型变量,存放最肥羊的重量,int i,k,整型变量,i,用于计数循环,k,用于记录最。

2、肥羊的号,max = 0.0,赋初值,0,for ( i=0; i10; i=i+1,计数循环,循环,开始,printf,请输入羊的重量,sheep%d=”, i,提示用,scanf(“%f”,输入第,i,只羊的重量,if ( max sheepi,max = sheepi,让第,i,只羊为当前最肥羊,k=i,纪录第,i,只羊,循环结束,printf(“max=%f,n”, max,输出最肥羊的重量,printf(“number=%d,n”, k,输出最肥羊的编号,4,程序框图,max = 0.0,将记录最重的羊的重量置,0,for ( i=0; i10; i=i+1,提示输入第,i,只羊的重。

3、量,键入第,i,只羊的重量,sheepi,max sheepi,是,否,max = sheepi,k = i,存重者,记录第,i,只,输出,max,最重的羊的重量,输出,k,最重的羊是第,k,只,5,三、数组,数组的定义,类型说明符,数组名,常量表达式,例,float sheep10,int a20011000,说明,1,数组名的第一个字符应为英文字母,2,用方括号将常量表达式括起,3,常量表达式定义了数组元素的个数,6,三、数组,4,数组下标从,0,开始。如果定义,5,个元素,是从第,0,个元,素至第,4,个元素,例如,int a5,定义了,5,个数组元素如下,a0, a1, a2, a3,。

4、 a4,这是,5,个带下标的变量,这,5,个变量的类型是相同的,5,常量表达式中不允许包含变量,例如,int n,n = 5,int an,不合法,a,下标,0,1,2,3,4,7,三、数组,数组初始化,是定义数组完成赋初值的任务,例如,int a5 = 3, 5, 4, 1, 2,a0 = 3; a1 = 5; a2 = 4,a3 = 1; a4 = 2,a,3,5,4,1,2,下标,0,1,2,3,4,8,1,include,void main(,int a4,声明项,printf(“a0=%d; a1=%d; a2=%d,a3=%d,n”, a0, a1, a2, a3,2,其他不变,改。

5、变声明项为,int a4 = 0, 1, 2, 3,请自己上机做,6,个实验,9,3,其他不变,改变声明项为,int a4 = 3, 8,4,其他不变,改变声明项为,int a4 = 2, 4, 6, 8, 10,5,其他不变,改变声明项为,int a4 = 2, 4, 6, d,6,其他不变,改变声明项为,int n=4,int an = 0, 1, 2, 3,10,讨论问题:使用筛法求,100,以内的所有素数,三、数组,思路,1,想象将,100,个数看作沙子和小石头子,让小石头子权,称素数;让沙子当作非素数。弄一个筛子,只要将沙,子筛走,剩下的就是素数了,2,非素数一定是,2,3,4,的倍。

6、数,3,使用数组,让下标就是,100,以内的数,让数组元素的,值作为筛去与否的标志。比如筛去以后让元素值为,1,0,1,2,3,4,5,6,7,99,100,0,0,1,0,1,0,1,1,11,方法的依据,1,至,100,这些自然数可以分为三类,单位数:仅有一个数,1,素数,是这样一个数,它大于,1,且只有,1,和它自身这样两,个正,因数,合数,除了,1,和自身以外,还有其他正因数,1,不是素数,除,1,以外的自然数,当然只有素数与合数,筛法实际上是筛去合数,留下素数,为了提高筛选法效率,注意到,令,n,为合数(这里是,100,c,为,n,的最小正因数,则据,初等数论,只要找到,c,就可以确。

7、认,n,为合数,将其筛去,n,c,1,12,程序框图如下,for ( c=2; c=100; c=c+1,for ( c=2; c=100; c=c+1,d = 2,初始化,primec = 0,do while,d = sqrt ( 100,primek = 1,k = k + d,While ( k = 100,k = k + d,yes,primek = 0,no,k = d,yes,primec = 0,no,printf (“%d;”, c,d = d + 1,13,上述框图很清晰地描述了筛法的思路,1,第一块是一个计数型的循环语句,功能是将,prime,数,组清零,primec =。

8、 0,c = 2, 3, ,100,2,第二块是正因数,d,初始化为,d = 2,3,第三块是循环筛数。这里用了一个,do while,语句,属于一种直到型循环,其一般形式为,do,循环体语句块,while,表达式,14,直到型循环框图如下,直到表达式为假,时才退出循环,循环体,语句块,表达式,真,假,当表达式为真时,继续循环,循环体,语句块,15,三、数组,例,求,的近似值,用变量,pi,表示,的值,令,表示括号中的每个项,当最后一项的绝对值小于等于,时,忽略掉以后的项,7,1,5,1,3,1,1,4,a,b,c,1,7,5,3,为,1,b,a,6,10,16,include,include。

9、,void main(,主函数,int sum,整型变量,总项数,float pi, a, b, c,浮点变量,a,为分母,b,为分子,c,为,b,除以,a,pi = 0; sum = 0,初始化,a = 1.0; b = 1.0; c = 1.0,初始化,do,直到型循环,循环体,开始,pi = pi + c,累加每一项,sum = sum + 1,a = a + 2.0,计算每一项的分母,b = -b,分子变正负号,c = b / a,计算每一项,循环体结束,while ( fabs(c) 1e-6,当,c,的绝对值大于,10,的,6,次方时,继续,执行循环体,否则退出,pi = 4 * 。

10、pi,得到最终结果,printf(“pi=%f,n”, pi,输出,pi,值,printf(“sum=%d,n”, sum,输出总项数,参考程序如下,17,运行结果,pi = 3.141594,sum = 500001,提问,这种循环当表达式的值,永远为真,时,会如何,答:会构成,死循环,即无休止地执行循环体,请实验,1,将,b,定义为,int,型看看执行结果并分析为什么,2,将,1e-6,变为,1e-7,或,1e-4,看看结果,18,下面还要介绍另一种循环,当循环,一般形式,while,表达式,语句块,循环体,While,表达式,循环体,语句块,循环体,语句块,表达式,真,假,19,分析:假。

11、定有,x,y,且,xy,设最小公倍数为,z,1. z,一定会,x,2. z = kx, k = 1,2,3. z,一定会被,y,整除,用两个最简单的数试一下就可以找到算法,比如,x=5, y=3,举例:求两个整数的最小公倍数,20,第一步,z = x,z % y != 0,不能整除,5,5 % 3 != 0,第二步,z = z + x,不能整除,10, 10 % 3 != 0,第三步,z = z + x,15, 15 % 3 = 0,能整除,找到了,z,15,就是,5,和,3,的最小公倍数,21,include,include,void main(,主函数,int x, y, z, w,整型变。

12、量,scanf(“%d%d”,键盘输入两整数,x, y,if ( x y,让,x,表示两者中的大数,w = x,x = y,y = w,z = x,将一个大数赋给,z,while ( z % y != 0,当,z,不能被,y,整除时,就让,z,累加,x,z = z + x,printf(“%d,n”, z,输出最小公倍数,参考程序如下,22,请同学们去比较三种循环的异同之处,1. for,循环(计数型循环,2,当型循环,while,循环,3,直到型循环,do while,循环,上机将挑肥羊的程序和筛出素数的程序完成,自学与比较,23,i=1 i=2 i=3 i=4 i=5 i=6,a1 a2 。

13、a3 a4 a5 a6,初始值 1 8 3 2 4 9,18; 1,8互换 1 8 3 2 4 9,8 1 3 2 4 9,13; 1,3互换 8 1 3 2 4 9,8 3 1 2 4 9,12; 1,2互换 8 3 1 2 4 9,8 3 2 1 4 9,14; 1,4互换 8 3 2 1 4 9,8 3 2 4 1 9,19; 1,9互换 8 3 2 4 1 9,1到达位置 8 3 2 4 9 1,j=1,83;顺序不动 8 3 2 4 9 1,32;顺序不动 8 3 2 4 9 1,24; 2,4互换 8 3 2 4 9 1,8 3 4 2 9 1,29; 2,9互换 8 3 4 2 。

14、9 1,2到达位置 8 3 4 9 2 1,j=2,问题:将几个数从大到小排序并输出,介绍冒泡排序法,24,i=1 i=2 i=3 i=4 i=5 i=6,a1 a2 a3 a4 a5 a6,中间结果 8 3 4 9 2 1,83;顺序不动 8 3 4 9 2 1,34; 3,4互换 8 3 4 9 2 1,8 4 3 9 2 1,39; 3,9互换 8 4 3 9 2 1,3到达位置 8 4 9 3 2 1,j=3,84;顺序不动 8 4 9 3 2 1,49; 4,9互换 8 4 9 3 2 1,4到达位置 8 9 4 3 2 1,j=4,89; 8,9互换 8 9 4 3 2 1,8到达。

15、位置 9 8 4 3 2 1,j=5,25,从表中可以看出最小的一个数第一遍扫描就交换到,a6,中。如果将,a1,视为水底,a6,视为水面,最轻的,最小的,一个数,1,最先浮到水面,交换到,a6,次轻的,2,第二遍扫描交换到,a5,再轻的,3,第三遍扫描交换到,a4,依此类推,有,6,个数,前,5,个数到位需,5,遍扫描,第,6,个最,重的数自然落在,a1,中。因此,6,个数只需,5,遍扫描,即,j=n-1, n=6,冒泡排序算法分析,26,再看在每遍扫描中,相邻两数组元素的比较次数,当,j=1,时,i=1,2,n-j,n=6,时,比较,5,次之后,a6,中,有一个最小数到达,这时,a6,不必。

16、再参与比较了,因此在第二遍搜索时,j=2, i=1,2,n-j,即,i=1,2,3,4,比较,4,次之后次小的一个数到达了,a5,这,时,a5,不必再参与比较了,因此,j=3,时,i=1,2,3,j=4,时,i=1,2,j=5,时,i=1,理出上述规律后,程序就不难编了,冒泡排序算法分析,27,为了表述方便,定义以下,3,个变量,n,待排序的数的个数,这里,n=6,j,扫描遍数,j=1,2,n-1,i,第,j,遍扫描待比较元素的下标,i=1,2,n-j,冒泡排序算法设计,28,采用两重计数型循环,步骤,1,将待排序的数据放入数组中,步骤,2,置,j,为,1,步骤,3,让,i,从,1,到,n-j。

17、,比较,ai,与,ai+1,如果,ai = ai+1,位置不动,如果,ai ai+1,位置交换,即,p=ai; ai=ai+1; ai+1=p,步骤,3,结束后,an-j+1,中的数为最小的数,步骤,4,让,j=j+1,只要,j!=n,就返回步骤,3,将,an-j+1,的值排好。当,j=n,时执行步骤,5,步骤,5,输出排序结果,冒泡排序算法设计,29,include,void main(,主函数,int i, j, p, a7,整型变量,for (i=1; i=6; i=i+1,键入,6,个数,放入,a,数组中,printf,请输入待排序的数,a%d=”, i,提示,scanf (“%d”,用键盘输入整数赋给,ai,for ( j=1; j=5; j=j+1,冒泡排序,外层循环,for ( i=1; i=6-j; i=i+1,内层循环,循环体,开始,if ( ai ai+1,如果,ai ai+1,p = ai,让,ai,与,ai+1,交换,ai = ai+1,ai+1 = p,循环体结束,for ( i=1; i=6; i=i+1,输出排序结果,printf(“%d,n”, ai,格式输出,ai,参考程序如下,30,结,束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值