CH5数组和字符串.ppt
《CH5数组和字符串.ppt》由会员分享,可在线阅读,更多相关《CH5数组和字符串.ppt(73页珍藏版)》请在三一办公上搜索。
1、五、数组和字符串,例:求5名学生某门功课的平均成绩.main()float s1,s2,s3,s4,s5,avg;printf(Enter the 5 scores:);scanf(%f%f%f%f%f,数组是按序排列的同类型变量的集合,是一组具有 相同名字,不同下标的下标变量。下标变量形式 数组名下标 如 s0、s2、s3、s6、s10 数组名表示整个数组,如:s 下标变量又称数组元素 下标指出某个数组元素在数组中的位置 下标可以用常量表示,也可以用变量表示 有1个下标的下标变量所组成的数组称为一维数组;有2个下标的下标变量所组成的数组称为二维数组;如:x1、y5 数组x和y都是一维数组 a
2、12、b23 数组a和b都是二维数组,使用数组,上例程序可改写为:main()float s5,avg=0;int i;for(i=0;i 5;i+)scanf(%f,5.1 一维数组5.1.1 一维数组的定义和引用,1.一维数组的定义 定义形式:数据类型 数组名常量表达式;如:int a10;数据类型 说明该数组中每个元素的数据类型 数组名 数组的名称,命名规则同变量名 常量表达式 表示该数组具有的元素个数,也称为数组的长度。说明:数组中的第一个元素的下标从0开始。,数组名(如 a)表示该数组中第一个元素(如 a0)的地址,即a和,2.一维数组元素的引用 数组不能以整体形式参加数据处理,参加
3、数据处理的只能是数组元素。数组元素的引用方法有两种:下标法 引用的一般形式为:数组名下标 其中的下标为整型常量或整型表达式,可以包含 变量,它表示了元素在数组中的顺序号即位置 指针法(第7章中介绍)【例5.1】输入学生数n(不大于50)及n个学生某门课程的成绩,计算并输出平均成绩(保留1位小数)和高于平均成绩的人数。,main()int i,n,count,score50;float avg;printf(Input the student the number:n);scanf(%d,例2:输入一行字符,以回车表示结束。问输入各数 码的个数。#include main()char s80,c
4、;int i,nd10;for(i=0;i=0,5.1.2 一维数组的初始化,数组初始化 是在定义数组时对数组元素赋予初值。一般形式为:类型说明符 数组名常量表达式=值1,值2,值n;中的各值为将依次赋予各对应元素的初值,必须 是常量或常量表达式,且类型应与数组的类型一致 int a10=2,4,6,8,10,12,14,16,18,20;用单个字符作为初值 char b5=C,h,i,n,a;,用字符串常量作为初值 char c6=China;或 char c6=China;注意:编译系统自动在字符串常量的最后加0 可以不指定数组长度 int a=0,2,4,6,8;相当于 int a5=0
5、,2,4,6,8;char c=China;相当于 char c6=China;允许只给部分元素赋初值(其余元素初始化为0)int a80=0;char b10=C,h,i,n,a;未指定初始化的数组,各元素的值是随机的未知值 但全局数组和静态数组则会自动初始化为0。,【例5.2】从键盘输入日期(yyyy-mm-dd),计算并 输出该日期那天是该年的第几天。分析:基本算法:将1月至m-1月的各月天数累加,再加 上给定的日d。每月的天数可用一个一维数组存放,初始化为平 年的天数,然后再根据y年是否为闰年来修正2月 份的天数。闰年的条件是符合下面两条件之一:能被4整除,但不能被100整除;能被40
6、0整除;,main()int a13=0,31,28,31,30,31,30,31,31,30,31,30,31;int y,m,d,i,days;do printf(Input the date(yyyy-mm-dd):n);scanf(%d-%d-%d,运行结果:Input the date(yyyy-mm-dd):2004-9-12256 另一种方法是不用数组来存放每月的天数和循环结构累加各月天数,而是用switch结构直接给出各月天数并实现累加。,main()/*用switch结构*/int y,m,d,days,m2=28;do printf(Input the date(yyyy-
7、mm-dd):n);scanf(%d-%d-%d,case 8:days+=31;case 7:days+=31;case 6:days+=30;case 5:days+=31;case 4:days+=30;case 3:days+=31;case 2:days+=m2;case 1:days+=31;printf(n=%dn,days);,5.1.3 程序举例,【例5.3】输入10个整数,按从小到大的顺序输出。这是一个数据排序问题。排序算法有很多种,下面结合上述实例介绍3种常用的简单排序算法:冒泡法、选择法和插入法。1.冒泡法 冒泡法排序的基本思想是:依次逐个比较相邻的两个数,如不符合顺序
8、要求,就交换这两个数的位置。通过一轮比较,就能排定一个数的位置,对于n个数,进行n-1轮比较即可完成排序,冒泡法1:,从第n个数开始,依次比较相邻两个数,即第n个与 第n-1个、第n-1个与第n-2个、,每次比较,若不 满足由小到大的顺序,则两者对调位置,通过一轮 比较,参加比较的数中的最小数就“上升”到它们中 最前面的位置,下一轮再把余下的数依次比较,这 样,通过n-1轮比较,就完成了全部n个数的升序排 列。在第i轮比较时,从第 1个位置开始已排序定位 了i-1个数,余下n-i+1个数,需两两比较 n-i次。,冒泡法1流程:,#define N 10main()int sN,i,j,t;fo
9、r(i=0;i i;j-)if(sjsj-1)t=sj;sj=sj-1;sj-1=t;for(i=0;i N;i+)printf(%d,si);/*输出排序结果*/printf(n);,冒泡法2:从第1个数开始,依次比较相邻两个数,即第1个与 第2个、第2个与第3个、,每次比较,若不满足 由小到大的顺序,则两者对调位置,通过一轮比 较,参加比较的数中的最大数就“下沉”到它们中 最后面的位置,下一轮再把余下的数依次比较,这 样,通过n-1轮比较,就完成了全部n个数的升序排 列。在第i轮比较时,从第 n个位置开始向前已排序 定位了i-1个数,余下n-i+1个数,需两两比较n-i次。,#define
10、 N 10main()int s10,i,j,t;for(i=0;i sj+1)t=sj;sj=sj+1;sj+1=t;for(i=0;i N;i+)/*输出排序结果*/printf(%d%c,si,i!=N-1?,:n);,2.选择法:,选择法排序的基本思想是:通过比较找到最小数,如不是第1个数,则与第1个数交换,再在余下的数中找到最小数,如不是第 2 个数,则与第 2 个数交换位置,再在余下的数中找到最小数,如不是第 3 个数,则与第 3 个数交换位置,依此进行,n 个数经过 n-1 轮比较即可完成排序。,#define N 10/*每轮比较中:*/main()/*最小数位置记入k,结束再
11、与第i个对调*/int sN,i,j,k,t;for(i=0;isj)k=j;if(k!=i)t=si;si=sk;sk=t;for(i=0;iN;i+)printf(%d%c,si,i!=N-1?,:n);,#define N 10/*每轮比较中:*/main()/*遇到比第i个小的就与第i个对调*/int sN,i,j,t;for(i=0;isj)t=si;si=sj;sj=t;for(i=0;iN;i+)printf(%d%c,si,i!=N-1?,:n);,3.插入法,插入法排序基本思想是:开始时第1个数已排好序,首先将第2个数按其与前1个已排好序的数的顺序关系插入到适当位置,然后将第
12、3个数按其与前2个已排好序的数的顺序关系插入到适当位置,接着再将第4个数按其与前3个已排好序的数的顺序关系插入到适当位置,依次进行下去,直到最后一个数也按其与前面所有已排好序的数的顺序关系插入到适当位置。对于n个数,经过n-1轮比较插入即可完成排序。,main()int aN,i,j,k,t;for(i=0;i=0,【例5.4】已知数组a中共有10个已按升序排序的整数。现从键盘输入一数,请用二分法查找数组a中是否有此数,如有则打印出此数在数组中的位置,否则打印找不到。设:待查数在变量x中;变量low 用于存放查找范围的顶部位置;变量m 用于存放查找范围的中间位置;变量high 用于存放查找范围
13、的底部位置;二分法的基本步骤:赋初值:low=0,high9,计算m=(low+high)/2 这样把查找范围分成以am为中点的两段范围。,判断lowam?如是,则x必定落在后半段。以后半段为新查找范 围,再划分两段范围:lowm+1,high不变,m=(low+high)/2。回到第步。如不是,x必定落在前半段。以前半段为新查找范 围,再划分两段范围:low不变,highm-1,m=(low+high)/2。回到第步。,main()int low,high,m,x;int a10=-54,-34,-8,0,3,12,25,56,68,98;printf(Please input x:);sc
14、anf(%d,【例5.5】n盏灯从1到n按顺序依次编号,有n个人也从1到n依次编号,第一个人(1号)将灯全部关闭,第二个人(2号)将凡是2和2的倍数号的灯打开,第三个人(3号)将凡是3和3的倍数号的灯做相反处理(即该灯如为打开的,将它关闭;如为关闭的,将它打开)。以后的人都和3号一样,将凡是与自己相同编号的灯和是自己编号倍数的灯做相反处理。n(1n1000)从键盘输入,请问:当第n个人操作之后,哪几盏灯是关闭的,输出其编号。,main()int a1000=0,n,i,j;/*第1个人将灯全部关闭*/scanf(%d,输入:100输出:1 4 9 16 25 36 49 64 81 100,5
15、.2 二维数组5.2.1 二维数组的定义和引用,1.二维数组的定义 定义形式:数据类型 数组名常量表达式1 常量表达式2;如:int a34;定义a为34(三行四列)的数组,各个元素皆是整 型量,具体是:a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 在内存中按行存放。,二维数组是一维数组的数组 可以把a看作含有a0、a1和a2共3个元素的一 维数组,而a0、a1和a2又都是含有4个元素的 一维数组,a0、a1和a2就是这3个一维数组的 名字,即:a0:a00 a01 a02 a03 a1:a10 a11 a12 a13 a2:a20 a21 a
16、22 a23,2.二维数组元素的引用 下标法 引用的一般形式为:数组名下标1 下标2 其中的下标1和下标2为整型常量或整型表达式,可以包含变量,它们分别表示了元素在数组中的 行、列位置。例如:a12-a 数组第2行第3列元素 a03-a 数组第1行第4列元素 指针法(第7章中介绍),【例5.6】编程计算并输出一个54的整数矩阵周边各元之和,矩阵各元从键盘输入。main()int a54,i,j,sum=0;for(i=0;i5;i+)/*输入并计算矩阵各元之和*/for(j=0;j4;j+)scanf(%d,5.2.2 二维数组的初始化,按行分段给二维数组元素赋初值 int a34=8,4,2
17、,1,5,7,0,3,4,0,9,6;按行连续给二维数组元素赋初值 int a34=8,4,2,1,5,7,0,3,4,0,9,6;允许只给部分元素赋初值(其余元素初始化为0)int a34=8,4,5,4;int a34=8,4,2,1,5;,用字符或字符串常量为初值给字符数组初始化 char s25=b,o,y,0,g,i,r,l,0;char s25=boy,girl;当用按行分段方法给出了所有行,或者当用按行 连续方法给出全部数组元素初始化值时,可以省 略第一个下标的长度 char s5=boy,girl;int a4=8,4,5,4;int a4=8,4,2,1,5,7,0,3,4,
18、0,9,6;未指定初始化的数组,各元素的值是随机的未知 值。全局数组和静态数组则会自动初始化为0。,5.2.3 程序举例,【例5.7】把整型矩阵A(2x3)转置成B(3x2)后输出,矩阵A的各元从键盘输入。矩阵转置的基本算法是:把原矩阵A的i行j列的元素,转置成矩阵B的j行i列的元素。main()int a23,b32,i,j;printf(Please input A:n);for(i=0;i2;i+)/*输入矩阵A*/for(j=0;j3;j+)scanf(%d,for(i=0;i2;i+)/*矩阵A转置成B*/for(j=0;j3;j+)bji=aij;printf(Result B:n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CH5 数组 字符串
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5341212.html