《计算机语言与程序设计 (4).ppt》由会员分享,可在线阅读,更多相关《计算机语言与程序设计 (4).ppt(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计算机程序设计基础计算机程序设计基础第四讲第四讲 数组数组1三、数组三、数组中秋佳节,有贵客来到草原,主人要从羊群中秋佳节,有贵客来到草原,主人要从羊群中选一只肥羊宴请宾客,当然要选最重者。中选一只肥羊宴请宾客,当然要选最重者。这样就要记录每只羊的重量,如果有成千上这样就要记录每只羊的重量,如果有成千上万只羊,不可能用一般变量来记录。可以用万只羊,不可能用一般变量来记录。可以用带有下标的变量,也就是这里要讲的带有下标的变量,也就是这里要讲的数组数组。问题:哪只羊最重?问题:哪只羊最重?2我们先看例子:用键盘输入我们先看例子:用键盘输入10只羊的重量存放到一个只羊的重量存放到一个名为名为shee
2、p的数组中的数组中#include#include.hvoid main()void main()/主函数主函数主函数主函数 float sheep10float sheep10;/数组,有数组,有数组,有数组,有10101010个浮点类型元素,个浮点类型元素,个浮点类型元素,个浮点类型元素,/用于存用于存用于存用于存10101010只羊每一只的重量只羊每一只的重量只羊每一只的重量只羊每一只的重量float max;float max;/浮点类型变量,存放最肥羊的重量浮点类型变量,存放最肥羊的重量浮点类型变量,存放最肥羊的重量浮点类型变量,存放最肥羊的重量int int i,k;i,k;/整型
3、变量,整型变量,整型变量,整型变量,i i i i用于计数循环,用于计数循环,用于计数循环,用于计数循环,k k k k用于记录最肥羊的号用于记录最肥羊的号用于记录最肥羊的号用于记录最肥羊的号max=0.0;max=0.0;/赋初值赋初值赋初值赋初值0 0 0 0for(i=0;i10;i=i+1)for(i=0;i10;i=i+1)/计数循环计数循环计数循环计数循环 /循环,开始循环,开始循环,开始循环,开始printfprintf(“(“请输入羊的重量请输入羊的重量请输入羊的重量请输入羊的重量sheep%sheep%d=”,d=”,i);i);/提示用提示用提示用提示用scanfscanf
4、(“%f”,&(sheepi);(“%f”,&(sheepi);/输入第输入第输入第输入第i i i i只羊的重量只羊的重量只羊的重量只羊的重量if(max sheepi)if(max sheepi)max=sheepi;max=sheepi;/让第让第让第让第i i i i只羊为当前最肥羊只羊为当前最肥羊只羊为当前最肥羊只羊为当前最肥羊k=i;k=i;/纪录第纪录第纪录第纪录第i i i i只羊只羊只羊只羊 /循环结束循环结束循环结束循环结束printfprintf(“max=%fn”,max);(“max=%fn”,max);/输出最肥羊的重量输出最肥羊的重量输出最肥羊的重量输出最肥羊的重
5、量printfprintf(“number(“number=%dn”,=%dn”,k);k);/输出最肥羊的编号输出最肥羊的编号输出最肥羊的编号输出最肥羊的编号 3程序框图程序框图4三、数组三、数组数组的定义数组的定义类型说明符类型说明符类型说明符类型说明符数组名数组名数组名数组名 常量表达式常量表达式常量表达式常量表达式 例:例:例:例:float sheep10;float sheep10;float sheep10;float sheep10;intintintint a20011000;a20011000;a20011000;a20011000;说明说明1.1.1.1.数组名的第一个字
6、符应为英文字母;数组名的第一个字符应为英文字母;数组名的第一个字符应为英文字母;数组名的第一个字符应为英文字母;2.2.2.2.用方括号将常量表达式括起;用方括号将常量表达式括起;用方括号将常量表达式括起;用方括号将常量表达式括起;3.3.3.3.常量表达式定义了数组元素的个数;常量表达式定义了数组元素的个数;常量表达式定义了数组元素的个数;常量表达式定义了数组元素的个数;5三、数组三、数组4.4.4.4.数组下标从数组下标从数组下标从数组下标从0 0 0 0开始。如果定义开始。如果定义开始。如果定义开始。如果定义5 5 5 5个元素,是从第个元素,是从第个元素,是从第个元素,是从第0 0 0
7、 0个元个元个元个元素至第素至第素至第素至第4 4 4 4个元素;个元素;个元素;个元素;例如例如例如例如intintintint a5 a5 a5 a5 定义了定义了定义了定义了5 5 5 5个数组元素如下:个数组元素如下:个数组元素如下:个数组元素如下:a0,a1,a2,a3,a4a0,a1,a2,a3,a4a0,a1,a2,a3,a4a0,a1,a2,a3,a4这是这是这是这是5 5 5 5个带下标的变量,这个带下标的变量,这个带下标的变量,这个带下标的变量,这5 5 5 5个变量的类型是相同的个变量的类型是相同的个变量的类型是相同的个变量的类型是相同的5.5.5.5.常量表达式中不允许
8、包含变量;常量表达式中不允许包含变量;常量表达式中不允许包含变量;常量表达式中不允许包含变量;例如例如例如例如intintintint n;n;n;n;n=5;n=5;n=5;n=5;int int int int an;an;an;an;不合法不合法!6三、数组三、数组数组初始化数组初始化是定义数组完成赋初值的任务是定义数组完成赋初值的任务是定义数组完成赋初值的任务是定义数组完成赋初值的任务例如例如例如例如int int int int a5=3,5,4,1,2;a5=3,5,4,1,2;a5=3,5,4,1,2;a5=3,5,4,1,2;a0=3;a1=5;a2=4;a0=3;a1=5;a
9、2=4;a0=3;a1=5;a2=4;a0=3;a1=5;a2=4;a3=1;a4=2;a3=1;a4=2;a3=1;a4=2;a3=1;a4=2;71.1.1.1.#include include.hvoid main()void main()intint a4;a4;/声明项声明项声明项声明项printfprintf(“a0=%d;a1=%d;a2=%d;(“a0=%d;a1=%d;a2=%d;a3=%dn”,a0,a1,a2,a3);a3=%dn”,a0,a1,a2,a3);2.2.2.2.其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为int i
10、nt a4=0,1,2,3;a4=0,1,2,3;请自己上机做请自己上机做6个实验个实验83.3.3.3.其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为int int a4=3,8;a4=3,8;4.4.4.4.其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为intint a4=2,4,6,8,10;a4=2,4,6,8,10;5.5.5.5.其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为intint a4=2,4,6,d;a4=2,4,6,d;6.6.6.6.其他不变,
11、改变声明项为其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为int int n=4;n=4;intint an=0,1,2,3;an=0,1,2,3;9讨论问题:使用筛法求讨论问题:使用筛法求100100以内的所有素数以内的所有素数三、数组三、数组思路思路1.1.1.1.想象将想象将想象将想象将100100100100个数看作沙子和小石头子,让小石头子权个数看作沙子和小石头子,让小石头子权个数看作沙子和小石头子,让小石头子权个数看作沙子和小石头子,让小石头子权称素数;让沙子当作非素数。弄一个筛子,只要将沙称素数;让沙子当作非素数。弄一个筛子,只要将沙称素数;让沙子当作非素数。
12、弄一个筛子,只要将沙称素数;让沙子当作非素数。弄一个筛子,只要将沙子筛走,剩下的就是素数了。子筛走,剩下的就是素数了。子筛走,剩下的就是素数了。子筛走,剩下的就是素数了。2.2.2.2.非素数一定是非素数一定是非素数一定是非素数一定是2 2 2 2、3 3 3 3、4 4 4 4 的倍数。的倍数。的倍数。的倍数。3.3.3.3.使用数组,让下标就是使用数组,让下标就是使用数组,让下标就是使用数组,让下标就是100100100100以内的数,让数组元素的以内的数,让数组元素的以内的数,让数组元素的以内的数,让数组元素的值作为筛去与否的标志。比如筛去以后让元素值为值作为筛去与否的标志。比如筛去以后
13、让元素值为值作为筛去与否的标志。比如筛去以后让元素值为值作为筛去与否的标志。比如筛去以后让元素值为1 1 1 1。10方法的依据:方法的依据:1 1 1 1至至至至100100100100这些自然数可以分为三类:这些自然数可以分为三类:这些自然数可以分为三类:这些自然数可以分为三类:单位数:仅有一个数单位数:仅有一个数单位数:仅有一个数单位数:仅有一个数1 1 1 1。素数:素数:素数:素数:是这样一个数,它大于是这样一个数,它大于是这样一个数,它大于是这样一个数,它大于1 1 1 1,且只有,且只有,且只有,且只有1 1 1 1和它自身这样两和它自身这样两和它自身这样两和它自身这样两个正因数
14、。个正因数。个正因数。个正因数。合数:合数:合数:合数:除了除了除了除了1 1 1 1和自身以外,还有其他正因数。和自身以外,还有其他正因数。和自身以外,还有其他正因数。和自身以外,还有其他正因数。1 1 1 1不是素数,除不是素数,除不是素数,除不是素数,除1 1 1 1以外的自然数,当然只有素数与合数。以外的自然数,当然只有素数与合数。以外的自然数,当然只有素数与合数。以外的自然数,当然只有素数与合数。筛法实际上是筛去合数,留下素数。筛法实际上是筛去合数,留下素数。筛法实际上是筛去合数,留下素数。筛法实际上是筛去合数,留下素数。为了提高筛选法效率,注意到:为了提高筛选法效率,注意到:为了提
15、高筛选法效率,注意到:为了提高筛选法效率,注意到:令令令令n n为合数(这里是为合数(这里是为合数(这里是为合数(这里是100100100100),),),),c c为为为为n n的最小正因数,则据的最小正因数,则据的最小正因数,则据的最小正因数,则据初等数论初等数论初等数论初等数论只要找到只要找到只要找到只要找到c c就可以确认就可以确认就可以确认就可以确认n n为合数,将其筛去。为合数,将其筛去。为合数,将其筛去。为合数,将其筛去。11程序框图如下:程序框图如下:12上述框图很清晰地描述了筛法的思路:上述框图很清晰地描述了筛法的思路:1.1.1.1.第一块是一个计数型的循环语句,功能是将第
16、一块是一个计数型的循环语句,功能是将第一块是一个计数型的循环语句,功能是将第一块是一个计数型的循环语句,功能是将primeprime数数数数组清零。组清零。组清零。组清零。primec=0;primec=0;c=2,3,100c=2,3,1002.2.2.2.第二块是正因数第二块是正因数第二块是正因数第二块是正因数d d初始化为初始化为初始化为初始化为 d=2d=2。3.3.3.3.第三块是循环筛数。这里用了一个第三块是循环筛数。这里用了一个第三块是循环筛数。这里用了一个第三块是循环筛数。这里用了一个 do whiledo while 语句,语句,语句,语句,属于一种直到型循环,其一般形式为:
17、属于一种直到型循环,其一般形式为:属于一种直到型循环,其一般形式为:属于一种直到型循环,其一般形式为:dodo 循环体语句块循环体语句块循环体语句块循环体语句块 while(while(表达式表达式表达式表达式)13直到型循环框图如下:直到型循环框图如下:直到表达式为假直到表达式为假时才退出循环时才退出循环14三、数组三、数组例例.求求的近似值的近似值 用变量用变量用变量用变量pipipipi表示表示表示表示的值。的值。的值。的值。令令令令表示括号中的每个项表示括号中的每个项表示括号中的每个项表示括号中的每个项当最后一项的绝对值小于等于当最后一项的绝对值小于等于当最后一项的绝对值小于等于当最后
18、一项的绝对值小于等于 时,忽略掉以后的项时,忽略掉以后的项时,忽略掉以后的项时,忽略掉以后的项15#include#include.h#include#include void main()void main()/主函数主函数主函数主函数 int int sum;sum;/整型变量,总项数整型变量,总项数整型变量,总项数整型变量,总项数float pi,a,b,c;float pi,a,b,c;/浮点变量,浮点变量,浮点变量,浮点变量,a a a a为分母,为分母,为分母,为分母,b b b b为分子为分子为分子为分子,c c c c为为为为b b b b除以除以除以除以a a a api=0
19、;sum=0;pi=0;sum=0;/初始化初始化初始化初始化a=1.0;b=1.0;c=1.0;a=1.0;b=1.0;c=1.0;/初始化初始化初始化初始化do do/直到型循环直到型循环直到型循环直到型循环 /循环体,开始循环体,开始循环体,开始循环体,开始pi=pi+cpi=pi+c;/累加每一项累加每一项累加每一项累加每一项sum=sum+1;sum=sum+1;a=a+2.0;a=a+2.0;/计算每一项的分母计算每一项的分母计算每一项的分母计算每一项的分母b=-b;b=-b;/分子变正负号分子变正负号分子变正负号分子变正负号c=b/a;c=b/a;/计算每一项计算每一项计算每一项
20、计算每一项/循环体结束循环体结束循环体结束循环体结束while(while(fabsfabs(c)1e-6);(c)1e-6);/当当当当c c c c的绝对值大于的绝对值大于的绝对值大于的绝对值大于10101010的的的的-6-6-6-6次方时,继续次方时,继续次方时,继续次方时,继续/执行循环体,否则退出执行循环体,否则退出执行循环体,否则退出执行循环体,否则退出pi=4*pi;pi=4*pi;/得到最终结果得到最终结果得到最终结果得到最终结果printfprintf(“pi=%fn”,pi);(“pi=%fn”,pi);/输出输出输出输出pipipipi值值值值printfprintf(
21、“sum=%dn”,sum);(“sum=%dn”,sum);/输出总项数输出总项数输出总项数输出总项数 参考程序如下:参考程序如下:16运行结果运行结果 pi=3.141594pi=3.141594,sum=500001 sum=500001提问提问:这种循环当表达式的值这种循环当表达式的值永远为真永远为真时,时,会如何?会如何?答:会构成答:会构成死循环死循环,即无休止地执行循环体,即无休止地执行循环体请实验:请实验:1.1.1.1.将将将将b b b b定义为定义为定义为定义为intintintint型看看执行结果并分析为什么型看看执行结果并分析为什么型看看执行结果并分析为什么型看看执行
22、结果并分析为什么2.2.2.2.将将将将1 1 1 1e-6e-6e-6e-6变为变为变为变为1 1 1 1e-7e-7e-7e-7或或或或1 1 1 1e-4e-4e-4e-4看看结果看看结果看看结果看看结果17下面还要介绍另一种循环下面还要介绍另一种循环“当循环当循环”一般形式:一般形式:while(while(表达式表达式表达式表达式)语句块;语句块;语句块;语句块;(循环体循环体循环体循环体)18分析:假定有分析:假定有x,y且且xy,设最小公倍数为设最小公倍数为z1.z 一定会一定会=x2.z=kx,k=1,2,3.z 一定会被一定会被 y 整除整除用两个最简单的数试一下就可以找到算
23、法用两个最简单的数试一下就可以找到算法.比如比如 x=5,y=3.举例:求两个整数的最小公倍数举例:求两个整数的最小公倍数19第一步第一步 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的最小公倍数的最小公倍数20#include#include.h#include#include void main()void main()/主函数主函数主函数主函数 int int x,y,z,w;x,y,z,w;/整型变量整型变量整型
24、变量整型变量scanfscanf(“%d%d”,&x,&y);(“%d%d”,&x,&y);/键盘输入两整数键盘输入两整数键盘输入两整数键盘输入两整数 x,yx,yx,yx,yif(x y)if(x=ai+1ai=ai+1ai=ai+1ai=ai+1,位置不动;位置不动;位置不动;位置不动;如果如果如果如果 ai ai+1ai ai+1ai ai+1ai ai+1,位置交换,即位置交换,即位置交换,即位置交换,即p=ai;ai=ai+1;ai+1=p;p=ai;ai=ai+1;ai+1=p;p=ai;ai=ai+1;ai+1=p;p=ai;ai=ai+1;ai+1=p;步骤步骤步骤步骤3 3
25、3 3结束后结束后结束后结束后 an-j+1an-j+1an-j+1an-j+1中的数为最小的数中的数为最小的数中的数为最小的数中的数为最小的数步骤步骤步骤步骤4 4 4 4:让让让让j=j+1j=j+1j=j+1j=j+1;只要只要只要只要j!=nj!=nj!=nj!=n就返回步骤就返回步骤就返回步骤就返回步骤3 3 3 3,将将将将an-j+1an-j+1an-j+1an-j+1的值排好。当的值排好。当的值排好。当的值排好。当j=nj=nj=nj=n时执行步骤时执行步骤时执行步骤时执行步骤5 5 5 5步骤步骤步骤步骤5 5 5 5:输出排序结果输出排序结果输出排序结果输出排序结果冒泡排序
26、算法设计:冒泡排序算法设计:28#include#include.hvoid main()void main()/主函数主函数主函数主函数 int int i,j,p,a7;i,j,p,a7;/整型变量整型变量整型变量整型变量for(i=1;i=6;i=i+1)for(i=1;i=6;i=i+1)/键入键入键入键入6 6 6 6个数,放入个数,放入个数,放入个数,放入a a a a数组中数组中数组中数组中 printfprintf(“(“请输入待排序的数请输入待排序的数请输入待排序的数请输入待排序的数a%a%d=”,d=”,i);i);/提示提示提示提示scanfscanf(“%d”,&ai)
27、;(“%d”,&ai);/用键盘输入整数赋给用键盘输入整数赋给用键盘输入整数赋给用键盘输入整数赋给aiaiaiai|for(j=1;j=5;j=j+1)for(j=1;j=5;j=j+1)/冒泡排序,外层循环冒泡排序,外层循环冒泡排序,外层循环冒泡排序,外层循环for(i=1;i=6-j;i=i+1)for(i=1;i=6-j;i=i+1)/内层循环内层循环内层循环内层循环/循环体,开始循环体,开始循环体,开始循环体,开始if(ai ai+1)if(ai ai+1)/如果如果如果如果 ai ai+1ai ai+1 p=aip=ai;/让让让让 ai ai 与与与与 ai+1 ai+1 交换交换交换交换ai=ai+1;ai=ai+1;ai+1=p;ai+1=p;/循环体结束循环体结束循环体结束循环体结束for(i=1;i=6;i=i+1)for(i=1;i=6;i=i+1)/输出排序结果输出排序结果输出排序结果输出排序结果printfprintf(“%dn”,ai);(“%dn”,ai);/格式输出格式输出格式输出格式输出 aiaiaiai 参考程序如下:参考程序如下:29结结 束束30
限制150内