清华大学C语言教学课件(16个)第4个_第1页
清华大学C语言教学课件(16个)第4个_第2页
清华大学C语言教学课件(16个)第4个_第3页
清华大学C语言教学课件(16个)第4个_第4页
清华大学C语言教学课件(16个)第4个_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

floatmax; //浮点类型变量,存放最肥羊的重量

inti,k; //整型变量,i用于计数循环,k用于记录最肥羊的号 max=0.0; //赋初值0 for(i=0;i<10;i=i+1) //计数循环

{ //循环,开始 printf(“请输入羊的重量sheep[%d]=”,i); //提示用 scanf(“%f”,&(sheep[i])); //输入第i只羊的重量 if(max<sheep[i]) { max=sheep[i]; //让第i只羊为当前最肥羊

k=i; //纪录第i只羊

}

} //循环结束 printf(“max=%f\n”,max); //输出最肥羊的重量 printf(“number=%d\n”,k);//输出最肥羊的编号}3我们先看例子:用键盘输入10只羊的重量存放到一个名为she4程序框图4程序框图5三、数组数组的定义 类型说明符 数组名[常量表达式]例: floatsheep[10]; inta2001[1000];说明1.数组名的第一个字符应为英文字母;2.用方括号将常量表达式括起;3.常量表达式定义了数组元素的个数;5三、数组数组的定义6三、数组4.数组下标从0开始。如果定义5个元素,是从第0个元素至第4个元素;

例如 inta[5]定义了5个数组元素如下:

a[0],a[1],a[2],a[3],a[4]

这是5个带下标的变量,这5个变量的类型是相同的5.常量表达式中不允许包含变量;

例如 intn; n=5; inta[n]; 不合法!6三、数组4.数组下标从0开始。如果定义5个元素,是从第0个7三、数组数组初始化

是定义数组完成赋初值的任务 例如

inta[5]={3,5,4,1,2}; a[0]=3;a[1]=5;a[2]=4; a[3]=1;a[4]=2;7三、数组数组初始化81.#include<stdio.h> voidmain() { inta[4]; //声明项 printf(“a[0]=%d;a[1]=%d;a[2]=%d; a[3]=%d\n”,a[0],a[1],a[2],a[3]); }2.其他不变,改变声明项为

inta[4]={0,1,2,3};请自己上机做6个实验81.#include<stdio.h>请自己上机做6个实93.其他不变,改变声明项为

inta[4]={3,8};4.其他不变,改变声明项为

inta[4]={2,4,6,8,10};5.其他不变,改变声明项为

inta[4]={2,4,6,d};6.其他不变,改变声明项为

intn=4; inta[n]={0,1,2,3};93.其他不变,改变声明项为10讨论问题:使用筛法求100以内的所有素数三、数组思路1.想象将100个数看作沙子和小石头子,让小石头子权称素数;让沙子当作非素数。弄一个筛子,只要将沙子筛走,剩下的就是素数了。2.非素数一定是2、3、4……

的倍数。3.使用数组,让下标就是100以内的数,让数组元素的值作为筛去与否的标志。比如筛去以后让元素值为1。10讨论问题:使用筛法求100以内的所有素数三、数组思路11方法的依据:

1至100这些自然数可以分为三类:单位数:仅有一个数1。素数:是这样一个数,它大于1,且只有1和它自身这样两 个正因数。合数:除了1和自身以外,还有其他正因数。1不是素数,除1以外的自然数,当然只有素数与合数。筛法实际上是筛去合数,留下素数。 为了提高筛选法效率,注意到: 令n为合数(这里是100),c为n的最小正因数,则据初等数论

只要找到c就可以确认n为合数,将其筛去。11方法的依据:1不是素数,除1以外的自然数,当然只有素数与12程序框图如下:12程序框图如下:13上述框图很清晰地描述了筛法的思路:1.第一块是一个计数型的循环语句,功能是将prime数组清零。

prime[c]=0; c=2,3,…,1002.第二块是正因数d初始化为d=2。3.第三块是循环筛数。这里用了一个dowhile

语句,属于一种直到型循环,其一般形式为:

do {

循环体语句块 }

while(表达式) 13上述框图很清晰地描述了筛法的思路:14直到型循环框图如下:直到表达式为假时才退出循环14直到型循环框图如下:直到表达式为假时才退出循环15三、数组例.求π的近似值

用变量pi表示π的值。

令 表示括号中的每个项当最后一项的绝对值小于等于时,忽略掉以后的项15三、数组例.求π的近似值16#include<stdio.h>#include<math.h>voidmain() //主函数{ intsum;

//整型变量,总项数

floatpi,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*pi; //得到最终结果 printf(“pi=%f\n”,pi); //输出pi值 printf(“sum=%d\n”,sum); //输出总项数}参考程序如下:16#include<stdio.h>参考程序如下:17运行结果pi=3.141594,sum=500001提问:这种循环当表达式的值永远为真时,会如何?答:会构成死循环,即无休止地执行循环体请实验:1.将b定义为int型看看执行结果并分析为什么2.将1e-6变为1e-7或1e-4看看结果17运行结果pi=3.141594,sum=518下面还要介绍另一种循环“当循环”一般形式: while(表达式) { 语句块;(循环体) }18下面还要介绍另一种循环“当循环”19分析:假定有x,y且x>y,设最小公倍数为z1.z一定会>=x2.z=kx,k=1,2,…3.z一定会被y整除用两个最简单的数试一下就可以找到算法.比如x=5,y=3.举例:求两个整数的最小公倍数19分析:假定有x,y且x>y,设最小公倍数为z举例:求两个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的最小公倍数20第一步z=x,z%y!=0 不能21#include<stdio.h>#include<math.h>voidmain() //主函数{ intx,y,z,w;

//整型变量

scanf(“%d%d”,&x,&y); //键盘输入两整数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); //输出最小公倍数}参考程序如下:21#include<stdio.h>参考程序如下:22 请同学们去比较三种循环的异同之处1.for循环(计数型循环) 2.当型循环(while循环)3.直到型循环(dowhile循环)上机将挑肥羊的程序和筛出素数的程序完成自学与比较22 请同学们去比较三种循环的异同之处自学与比较23问题:将几个数从大到小排序并输出,介绍冒泡排序法23问题:将几个数从大到小排序并输出,介绍冒泡排序法242425从表中可以看出最小的一个数第一遍扫描就交换到a[6]中。如果将a[1]视为水底,a[6]视为水面:最轻的(最小的)一个数1最先浮到水面,交换到a[6];次轻的2第二遍扫描交换到a[5];再轻的3第三遍扫描交换到a[4];

…依此类推,有6个数,前5个数到位需5遍扫描,第6个最重的数自然落在a[1]中。因此,6个数只需5遍扫描,即j=n-1,n=6。冒泡排序算法分析:25从表中可以看出最小的一个数第一遍扫描就交换到a[6]中。26再看在每遍扫描中,相邻两数组元素的比较次数。当j=1时,i=1,2,…,n-j。n=6时,比较5次之后a[6]中有一个最小数到达,这时a[6]不必再参与比较了。因此在第二遍搜索时,j=2,i=1,2,…,n-j,即i=1,2,3,4。比较4次之后次小的一个数到达了a[5]。这时a[5]不必再参与比较了。因此,j=3时,i=1,2,3;j=4时,i=1,2;j=5时,i=1。理出上述规律后,程序就不难编了冒泡排序算法分析:26再看在每遍扫描中,相邻两数组元素的比较次数。冒泡排序算法27为了表述方便,定义以下3个变量:n——

待排序的数的个数,这里n=6

j——

扫描遍数,j=1,2,…,n-1

i——

第j遍扫描待比较元素的下标,i=1,2,…,n-j冒泡排序算法设计:27为了表述方便,定义以下3个变量:冒泡排序算法设计:28采用两重计数型循环:步骤1: 将待排序的数据放入数组中;步骤2: 置j为1;步骤3: 让i从1到n-j,比较a[i]与a[i+1], 如果a[i]>=a[i+1],位置不动; 如果a[i]<a[i+1],位置交换,即

p=a[i];a[i]=a[i+1];a[i+1]=p;

步骤3结束后a[n-j+1]中的数为最小的数步骤4: 让j=j+1;只要j!=n就返回步骤3, 将a[n-j+1]的值排好。当j==n时执行步骤5步骤5: 输出排序结果冒泡排序算法设计:28采用两重计数型循环:冒泡排序算法设计:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论