CH数组和字符串实用.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《CH数组和字符串实用.pptx》由会员分享,可在线阅读,更多相关《CH数组和字符串实用.pptx(72页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 使用数组,上例程序可改写为:main()float s5,avg=0;int i;for(i=0;i 5;i+)scanf(%f,&si);avg+=si;avg=avg/5.;printf(average score is%6.2fn,avg);第1页/共72页5.1 5.1 一维数组一维数组5.1.1 5.1.1 一维数组的定义和引用一维数组的定义和引用1.一维数组的定义 定义形式:数据类型 数组名常量表达式;如:int a10;数据类型 说明该数组中每个元素的数据类型 数组名 数组的名称,命名规则同变量名 常量表达式 表示该数组具有的元素个数,也称为数组的长度。说明:数组中的第一个元素
2、的下标从0开始。第2页/共72页 数组名(如 a)表示该数组中第一个元素(如 a0)的地址,即a和&a0同值。数组名是地址常量。经过定义的数组,编译后,会分配到一段连续的 内存单元。其首地址即数组名(如 a);数组定义后,编译时无越界保护;数组定义中的常量表达式中不能包 含变量。如以下定义方法是不允许的:int n,m=10;float an,bm;同类型数组可一起定义,用逗号隔开。如:int a10,b20;a,a0 a1 a2 a9第3页/共72页2.一维数组元素的引用 数组不能以整体形式参加数据处理,参加数据处理的只能是数组元素。数组元素的引用方法有两种:下标法 引用的一般形式为:数组名
3、下标 其中的下标为整型常量或整型表达式,可以包含 变量,它表示了元素在数组中的顺序号即位置 指针法(第7章中介绍)【例5.1】输入学生数n(不大于50)及n个学生某门课程的成绩,计算并输出平均成绩(保留1位小数)和高于平均成绩的人数。第4页/共72页main()int i,n,count,score50;float avg;printf(Input the student the number:n);scanf(%d,&n);/*输入学生数输入学生数n*/printf(Input%d score:n,n);for(avg=0,i=0;in;i+)/*输入成绩并输入成绩并累加累加*/scanf(
4、%d,&scorei);avg+=scorei;avg/=n;/*计算平均成绩计算平均成绩*/for(count=i=0;i avg)count+;printf(Average=%.1f Number=%dn,avg,count);第5页/共72页例2:输入一行字符,以回车表示结束。问输入各数 码的个数。#include main()char s80,c;int i,nd10;for(i=0;i=0&si=9)ndsi-0+;/*各数码计数*/for(i=0;i10;i+)printf(nd%d=%dn,i,ndi);第6页/共72页5.1.2 5.1.2 一维数组的初始化一维数组的初始化 数
5、组初始化 是在定义数组时对数组元素赋予初值。一般形式为:类型说明符 数组名常量表达式=值1,值2,值n;中的各值为将依次赋予各对应元素的初值,必须 是常量或常量表达式,且类型应与数组的类型一致 int a10=2,4,6,8,10,12,14,16,18,20;用单个字符作为初值 char b5=C,h,i,n,a;第7页/共72页 用字符串常量作为初值 char c6=China;或 char c6=China;注意:编译系统自动在字符串常量的最后加0 可以不指定数组长度 int a=0,2,4,6,8;相当于 int a5=0,2,4,6,8;char c=China;相当于 char c
6、6=China;允许只给部分元素赋初值(其余元素初始化为0)int a80=0;char b10=C,h,i,n,a;未指定初始化的数组,各元素的值是随机的未知值 但全局数组和静态数组则会自动初始化为0。第8页/共72页【例5.2】从键盘输入日期(yyyy-mm-dd),计算并 输出该日期那天是该年的第几天。分析:基本算法:将1月至m-1月的各月天数累加,再加 上给定的日d。每月的天数可用一个一维数组存放,初始化为平 年的天数,然后再根据y年是否为闰年来修正2月 份的天数。闰年的条件是符合下面两条件之一:能被4整除,但不能被100整除;能被400整除;第9页/共72页main()int a13
7、=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,&y,&m,&d);a2=28+(y%4=0&y%100!=0|y%400=0);while(m12|dam);for(i=1,days=d;im;i+)days+=ai;printf(%dn,days);第10页/共72页运行结果:Input the date(yyyy-mm-dd):2004-9-12256 另一种方法是不用数组来存放每月的天数和循环结构累加各月天数,而是
8、用switch结构直接给出各月天数并实现累加。第11页/共72页main()/*用switch结构 */int y,m,d,days,m2=28;do printf(Input the date(yyyy-mm-dd):n);scanf(%d-%d-%d,&y,&m,&d);a2=28+(y%4=0&y%100!=0|y%400=0);while(m12|dam);days=d;switch(m-1)case 11:days+=30;case 10:days+=31;case 9:days+=30;第12页/共72页 case 8:days+=31;case 7:days+=31;case 6
9、: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);第13页/共72页5.1.35.1.3 程序举例程序举例【例5.3】输入10个整数,按从小到大的顺序输出。这是一个数据排序问题。排序算法有很多种,下面结合上述实例介绍3种常用的简单排序算法:冒泡法、选择法和插入法。1.冒泡法冒泡法 冒泡法排序的基本思想是:依次逐个比较相邻的两个数,如不符合顺序要求,就交换这两个数的位置。通过一轮比较,就能排定一个数的位置,对于n个数,进行n-1轮
10、比较即可完成排序第14页/共72页 冒泡法1:从第n个数开始,依次比较相邻两个数,即第n个与 第n-1个、第n-1个与第n-2个、,每次比较,若不 满足由小到大的顺序,则两者对调位置,通过一轮 比较,参加比较的数中的最小数就“上升”到它们中 最前面的位置,下一轮再把余下的数依次比较,这 样,通过n-1轮比较,就完成了全部n个数的升序排 列。在第i轮比较时,从第 1个位置开始已排序定位 了i-1个数,余下n-i+1个数,需两两比较 n-i次。第15页/共72页冒泡法1流程:输入s各元,i=0ii?sjsj-1?i+j-FFTT输出sFT第16页/共72页#define N 10main()int
11、 sN,i,j,t;for(i=0;i N;i+)scanf(%d,&si);for(i=0;ii;j-)if(sjsj-1)t=sj;sj=sj-1;sj-1=t;for(i=0;i N;i+)printf(%d ,si);/*输出排序输出排序结果结果*/printf(n);第17页/共72页 冒泡法2:从第1个数开始,依次比较相邻两个数,即第1个与 第2个、第2个与第3个、,每次比较,若不满足 由小到大的顺序,则两者对调位置,通过一轮比 较,参加比较的数中的最大数就“下沉”到它们中 最后面的位置,下一轮再把余下的数依次比较,这 样,通过n-1轮比较,就完成了全部n个数的升序排 列。在第i轮
12、比较时,从第 n个位置开始向前已排序 定位了i-1个数,余下n-i+1个数,需两两比较n-i次。第18页/共72页#define N 10main()int s10,i,j,t;for(i=0;i N;i+)scanf(%d,&si);for(i=0;i N-1;i+)/*依次把最依次把最大数右移大数右移*/for(j=0;j sj+1)t=sj;sj=sj+1;sj+1=t;for(i=0;i N;i+)/*输出排序输出排序结果结果*/printf(%d%c,si,i!=N-1?,:n);第19页/共72页2.选择法选择法:选择法排序的基本思想是:通过比较找到最小数,如不是第1个数,则与第1
13、个数交换,再在余下的数中找到最小数,如不是第 2 个数,则与第 2 个数交换位置,再在余下的数中找到最小数,如不是第 3 个数,则与第 3 个数交换位置,依此进行,n 个数经过 n-1 轮比较即可完成排序。第20页/共72页#define N 10 /*每轮比较中:每轮比较中:*/main()/*最小数位置记入最小数位置记入k k,结束再与第,结束再与第i i个对调个对调*/int sN,i,j,k,t;for(i=0;iN;i+)scanf(%d,&si);for(i=0;i N-1;i+)for(k=i,j=i+1;jsj)k=j;if(k!=i)t=si;si=sk;sk=t;for(i
14、=0;iN;i+)printf(%d%c,si,i!=N-1?,:n);第21页/共72页#define N 10 /*每轮比较中:每轮比较中:*/main()/*遇到比第遇到比第i i个小的就与第个小的就与第i i个对调个对调*/int sN,i,j,t;for(i=0;iN;i+)scanf(%d,&si);for(i=0;iN-1;i+)for(j=i+1;jsj)t=si;si=sj;sj=t;for(i=0;iN;i+)printf(%d%c,si,i!=N-1?,:n);第22页/共72页3.插入法插入法 插入法排序基本思想是:开始时第1个数已排好序,首先将第2个数按其与前1个已排
15、好序的数的顺序关系插入到适当位置,然后将第3个数按其与前2个已排好序的数的顺序关系插入到适当位置,接着再将第4个数按其与前3个已排好序的数的顺序关系插入到适当位置,依次进行下去,直到最后一个数也按其与前面所有已排好序的数的顺序关系插入到适当位置。对于n个数,经过n-1轮比较插入即可完成排序。第23页/共72页main()int aN,i,j,k,t;for(i=0;i N;i+)scanf(%d,&ai);for(i=1;i=0&taj;j-)aj+1=aj;aj+1=t;for(i=0;i N;i+)printf(%d ,ai);printf(n);第24页/共72页【例5.4】已知数组a中
16、共有10个已按升序排序的整数。现从键盘输入一数,请用二分法查找数组a中是否有此数,如有则打印出此数在数组中的位置,否则打印找不到。设:待查数在变量x中;变量low 用于存放查找范围的顶部位置;变量m 用于存放查找范围的中间位置;变量high 用于存放查找范围的底部位置;二分法的基本步骤:赋初值:low=0,high9,计算m=(low+high)/2 这样把查找范围分成以am为中点的两段范围。第25页/共72页 判断lowam?如是,则x必定落在后半段。以后半段为新查找范 围,再划分两段范围:lowm+1,high不变,m=(low+high)/2。回到第步。如不是,x必定落在前半段。以前半段
17、为新查找范 围,再划分两段范围:low不变,highm-1,m=(low+high)/2。回到第步。第26页/共72页main()int low,high,m,x;int a10=-54,-34,-8,0,3,12,25,56,68,98;printf(Please input x:);scanf(%d,&x);low=0;high=9;while(lowam)low=m+1;else high=m-1;if(low=high)printf(%d position is%dn,x,m+1);else printf(%d not found.n,x);第27页/共72页【例5.5】n盏灯从1到n
18、按顺序依次编号,有n个人也从1到n依次编号,第一个人(1号)将灯全部关闭,第二个人(2号)将凡是2和2的倍数号的灯打开,第三个人(3号)将凡是3和3的倍数号的灯做相反处理(即该灯如为打开的,将它关闭;如为关闭的,将它打开)。以后的人都和3号一样,将凡是与自己相同编号的灯和是自己编号倍数的灯做相反处理。n(1n1000)从键盘输入,请问:当第n个人操作之后,哪几盏灯是关闭的,输出其编号。第28页/共72页main()int a1000=0,n,i,j;/*第第1个个人人将将灯灯全全部部关闭关闭*/scanf(%d,&n);for(i=2;i=n;i+)/*从从第第2个个到到第第n个人个人*/fo
19、r(j=i;j=n;j+)/*从从第第i号号到到第第n号灯号灯*/if(j%i=0)/*对对i和和i倍倍数数号号的的灯灯做做相相反处理反处理*/aj=!aj;for(i=1;i=n;i+)/*输输出出关关闭闭的的灯灯的的编号编号*/if(ai=0)printf(%d,i);输入:100输出:1 4 9 16 25 36 49 64 81 100第29页/共72页5.2 5.2 二维数组二维数组5.2.1 5.2.1 二维数组的定义和引用二维数组的定义和引用1.二维数组的定义 定义形式:数据类型 数组名常量表达式1 常量表达式2;如:int a34;定义a为34(三行四列)的数组,各个元素皆是整
20、 型量,具体是:a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 在内存中按行存放。第30页/共72页 二维数组是一维数组的数组 可以把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 a22 a23第31页/共72页2.二维数组元素的引用 下标法 引用的一般形式为:数组名下标1 下标2 其中的下标1和下标2为整型常量或整型表达式,可以包含变量,它们分别表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CH 数组 字符串 实用
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内