(中职)C语言程序设计模块六电子课件.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)
《(中职)C语言程序设计模块六电子课件.pptx》由会员分享,可在线阅读,更多相关《(中职)C语言程序设计模块六电子课件.pptx(95页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、YCF正版可修改PPT(中职)C语言程序设计模块六ppt电子课件LOGO数组模块66.1一 维 数 组定义几个整型变量,如“int a1,a2,a3,a4,a5,a6;”共6个变量。变量名是无所谓先后的。这6个整型变量可以换一种形式定义如下:int a6;这就是一个整型一维数组。一维数组形式:6.1.1一维数组的定义(1)数组名的命名规则与变量相同。(2)关于数组长度标注(以下简称长度标注),要掌握以下几种情况:长度标注只能是常量表达式,不能是变量。例如,“int m=3;int am;”是错误的,m是变量。宏名可以做长度标注,因为它仅是代字符常量。例如,若有#define M 10,则“in
2、t aM;”是正确的。用const声明的变量情况。const是C语言的关键字之一,其作用是:限定一个变量不允许被改变,产生静态作用。例如,若“const int m=10;”,则再进行“m=8;”就是错误的。过去的编译器同样不允许const声明的变量成为下标,但VS 2015改变了这一状况,允许const声明的变量成为数组的长度标注。故“const int m=10;int am;”在VS 2015中是允许的。6.1一 维 数 组6.1.1一维数组的定义长度标注表示数组的长度,即元素个数,具体的元素则用下标来区别,如a2就代表数组中顺序号为2的那个单元。元素序列(下标)从0开始,因此,元素下标
3、的取值范围就是0(元素个数-1)。故该数组的元素序列是:a0,a1,a2,a3,a4,a5。a:元素值36109712元素及其下标a0a1a2a3a4a56.1一 维 数 组6.1.1一维数组的定义下标在其取值范围内变化,表示数组相应的成员。所以,在同一数组中构成该数组的成员又称为下标变量。若用整型变量i表示数组a的成员,即ai,则i的范围是0i5。数组维数:长度标注的个数称为数组的维数,长度标注只能用。a.只一个长度标注,如“int a6;”称为一维数组。b.有两个长度标注,如“int a23;”称为二维数组。数组内存长度的分配:每个元素按数据类型的长度进行内存空间的分配。故“int a6;
4、”将分配 6212(B),即12个字节的内存空间(对于int型,不同的编译环境下有不同的内存空间分配情况)。6.1一 维 数 组6.1.1一维数组的定义(1)(2)(3)(4)6.1一 维 数 组6.1.2一维数组的初始化和引用1.一维数组的初始化给所有数组元素初始化。给部分数组元素初始化,其他元素系统自动赋0值。若没有长度标注而初始化了,则数组长度等于初始化的元素个数。给所有数组元素初始化为0。6.1一 维 数 组6.1.2一维数组的初始化和引用(1)不能引用整个数组,只能逐个引用元素。例如:static int a6=1,2,3,4,5,6;printf(%dn,a6);这是错误的,不可能
5、输出每个元素的值。要输出第6个元素的值,应写为:printf(%d,a5);(2)引用元素时要注意下标不能越界。例如:printf(%dn,a6);a6就越界了,因为根本不存在a6这个元素。2.一维数组的引用6.1一 维 数 组6.1.2一维数组的初始化和引用(3)如果只定义数组而没有初始化,要给每个数组元素赋值,常使用for循环语句。例如,数组元素逐个赋值:int a6;a0=1;a1=2;a2=3;a3=4;a4=5;a5=6;再如,用for循环语句输入和输出:int a6,i;for(i=0;i6;i+)scanf(%d,&ai);/*注意输入时不要忘了地址与运算符&*/for(i=0;
6、i6;i+)printf(%4d,ai);事实上,for循环语句几乎是数组的标配。上面数组中的下标变量i是对数组元素的引用而不是定义。这点要区分开来,不能混淆。6.1一 维 数 组6.1.3一维数组的应用【例6-1】从键盘输入5个数,输出最大的数。/*数组形式*/#include int main()int i,a5,max;for(i=0;i5;i+)scanf(%d,&ai);max=a0;/*假设第1个元素最大*/for(i=1;imax)max=ai;printf(MAX=%d,max);/*普通变量形式*/#include int main()int i,max=-32768,n;f
7、or(i=0;imax)max=n;printf(MAX=%d,max);6.1一 维 数 组6.1.3一维数组的应用【例6-2】处理斐波那契数列问题:按每行5个输出该数列前20项。#include int main()int i,a20=1,2;printf(%-8d%-8d,a0,a1);/*输出第1、2项*/for(i=2;i20;i+)ai=ai-1+ai-2;/*从第3项开始,每一项是前两项之和*/printf(%-8d,ai);if(i+1)%5=0)/*按每行5个输出*/putchar(n);6.1一 维 数 组6.1.3一维数组的应用【例6-3】打鱼还是晒网?三天打鱼两天晒网问
8、题:某人1998年1月9日在打鱼,问2015年2月2日他在打鱼还是在晒网?分析:本题关键是要分析出是先打鱼还是先晒网。其于1998年1月9日打鱼,则说明他是先晒2天网,再打3天鱼。#include int main()int year,month,day,i,days=0;static int m13=0,31,28,31,30,31,30,31,31,30,31,30,31;printf(Input year/month/day:);scanf(%d%d%d,&year,&month,&day);if(month=1)days=day;/*如果为1月,直接赋天数*/else6.1一 维 数
9、组6.1.3一维数组的应用 for(i=0;i2)/*闰年2月为29天*/days=days+1;printf(days=%dn,days);i=days%5;if(i0&i3)printf(He was sleeping!);/*两天晒网三天打鱼*/elseprintf(He was fishing!);6.1一 维 数 组6.1.4一维数组的排序联系到前面所学的临时变量用法。具体方法:假设有数组“int a6;”,对其元素要按从小到大的顺序排序,具体思路是:通过循环嵌套:(1)先第1、2个元素比较,条件符合(前大后小)就借助临时变量交换值,不符合就不交换;再第2、3个元素比较,条件符合继续
10、交换值第1轮循环完毕,最大的值就保存在最后一个元素a5中。1.冒泡法排序6.1一 维 数 组6.1.4一维数组的排序(2)第2轮循环原理同上,但应缩减1次循环,即第1轮循环结果不再参加循环,以此类推。假设两个循环变量分别为j和i,则可得到如下循环嵌套:for(j=0;j5;j+)for(i=0;i5-j;i+)内循环范围i6-j 就保证了下标的递减,使得前面已找到的值不再参加下一轮循环。就这样,最终实现排序顺利完成。简言之,外层循环决定数组在内层循环的循环范围,内层循环通过循环范围的递减实现对数组的排序。6.1一 维 数 组6.1.4一维数组的排序【例6-4】对整型数组a按从小到大的顺序输出。
11、#include int main()static int a6=3,5,10,9,7,12;int i,t,j;/*t为临时变量*/for(j=0;j5;j+)for(i=0;iai+1)/*如果前一元素的值大于后一元素的值*/t=ai;/*前一元素放在临时变量t中*/ai=ai+1;/*后一元素赋给前一元素*/ai+1=t;/*前一元素的值赋给后一元素。这样,元素值便进行了交换。内循环每一次全循环,最大的值都保存在该次循环范围的最后一个元素中*/for(i=0;i6;i+)printf(%-3d,ai);/*输出各元素的值(左对齐,位宽3,不足补空格)。这时的元素值已是按从小到大的顺序排列
12、了*/具体方法:以上述数组为例,排序过程中的某一中间时刻,数组a被分成两个区间a0,1i-1和ai,i+1,,前一个区间是已排好序的有序区,后一个区间是无序区,直接插入排序的操作是将无序区第1个元素ai插入有序区中适当的位置上,最终完成整个数组的排序。6.1一 维 数 组6.1.4一维数组的排序2.直接插入法排序6.1一 维 数 组6.1.4一维数组的排序【例6-5】对整型数组a按从小到大的顺序排序并输出。#include int main()static int a6=3,5,10,9,7,12;int i,j,t;for(i=1;i6;i+)/*i=1,意思是把数组分成两个区*/if(ai
13、=0&taj)/*t里面放的是无序区的小值,拿该值与有序区的元素值进行比较*/6.1一 维 数 组6.1.4一维数组的排序【例6-5】对整型数组a按从小到大的顺序排序并输出。aj+1=aj;/*如果有序区aj元素的值大于了t里面的值,该有序区元素就向后移一位。此时j位置实际上空了出来*/j-;/*下标递减,到了空位置的前一位置。该位置元素值再与t里面的值进行比较,符合条件(大于t里面的值)该元素也向后移,不符合则退出循环*/aj+1=t;/*此时j+1位置是空的,也是无序区小值应插入的地方*/for(i=0;i=1)for(i=k;i=0&taj)aj+k=aj;/*元素值右移*/j-=k;/
14、*向左移动k个位置*/aj+k=t;/*在确定的位置插入*/k/=2;/*把增量变为原来的一半*/for(i=0;in;i+)printf(%d,ai);/*通过临时变量t插入*/6.1一 维 数 组6.1.4一维数组的排序【例6-6】对整型数组a按从小到大的顺序排序输出。#include int main()static int i,j,k,a7=0,3,5,10,9,7,12;int n=6;k=n/2;while(k=1)for(i=k+1;i=0&a0aj)aj+k=aj;j-=k;aj+k=a0;k/=2;for(i=1;i7;i+)printf(%d,ai);/*直接把a0位置作为
15、缓冲区,起临时变量t的作用*/6.1一 维 数 组6.1.4一维数组的排序4.选择法排序具体方法:每一次从待排序的数组元素中选出最小(升序)或最大(降序)的一个元素存放在序列的起始位置,直到全部待排序的数据元素排完。选择法排序和冒泡法排序的相同之处是:值的交换都是通过临时变量来实现的,不同之处则是:冒泡法把找到的值从最末元素位置依次向前放置,选择法则把找到的值从第1个元素位置依次向后放置。6.1一 维 数 组6.1.4一维数组的排序【例6-7】对整型数组a按从小到大的顺序排序输出。#include int main()static int a6=3,5,10,9,7,12;int i,j,t;
16、for(i=0;i5;i+)/*ai循环存放找到的值*/for(j=i+1;jaj)t=ai;ai=aj;aj=t;for(i=0;i6;i+)printf(%dt,ai);6.1一 维 数 组6.1.4一维数组的排序5.归并排序归并排序亦称二路合并法,是将两个已按序排好的一维数组合并为一个数组的方法。前提是两个待合并的数组都已排好了序(若没有排序则需先排序)。【例6-8】将下列a、b两个数组合并为一个名为c的一维数组。#include#define M 5#define N 8int main()static int aM=5,9,19,20,34,bN=4,15,17,25,28,40,5
17、0,55;int c20,i,j,k;i=j=k=0;while(jN&iM)if(bjai)/*两个数组里面的元素值进行比较,小的放入数组c中(下面中的语句)*/6.1一 维 数 组6.1.4一维数组的排序ck=bj+;elseck=ai+;k+;while(iM)/*数组a中还没有排序的元素放入数组c中*/ck=ai;i+;k+;while(jN)/*数组b中还没有排序的元素放入数组c中*/ck=bj;j+;k+;for(i=0;ik;i+)printf(%3d,ci);具体方法:在有n个元素的数组a中,查找值为x的元素位置,并返回其下标。实现方法是用变量x的值按序与数组a的元素值进行比较
18、,通过比较定位数组下标。【例6-9】通过键盘输入要在数组中查找的值,查到了就输出该值的元素位置,查不到就输出“Not found!”。6.1一 维 数 组6.1.5一维数组元素值的查找1.顺序查找法6.1一 维 数 组6.1.5一维数组元素值的查找#include int main()static int a10=5,9,12,4,6,23,54,33,68,28;int x,i=0;/*i为下标,初始为0*/scanf(%d,&x);while(i10&ai!=x)/*例如,查找9,a0!=9,i+,i得1;a1=9,停止i+,i的值仍为1*/i+;if(i10)printf(%d is a
19、%d,x,i);elseprintf(Not found!);结果:输入:23输出:23 is a56.1一 维 数 组6.1.5一维数组元素值的查找具体方法:二分查找也称为折半查找,仅适合于已排序的数组,所以如果要使用二分查找,必须先对数组进行排序。假如一个按升序排列的数组(如a10),最低位下标变量为low(0),最高位下标变量为high(9),先折半,(low+high)/2=4。如果要找的值等于a4,就找到了;如果小于a4,则改变最高位为(low+high)/2-1,即high=(low+high)/2-1。也就是说大于a4的高位部分全部丢弃再进行折半查找;如果大于a4,则改变最低位为
20、(low+high)/2+1,即low=(low+high)/2+1,也就是说小于a4的低位部分全部丢弃再进行折半查找。2.二分查找法6.1一 维 数 组6.1.5一维数组元素值的查找【例6-10】在升序数组data10中查找元素值。#include stdio.hint main()int key,flag=0;/*flag用作标记*/static int data10=1,3,5,7,8,9,13,18,22,28;int low=0,high=9,mid;/*mid为中位数(下标)*/printf(input you want to find the number:);scanf(%d,
21、&key);while(low=high)mid=(high+low)/2;/*取中位下标*/if(datamid=key)printf(%d is data%d,key,mid);flag=1;/*找到了给标记赋1*/6.1一 维 数 组6.1.5一维数组元素值的查找if(keydatamid)high=mid-1;/*升序数组的关键:查找值小于中间元素的值,丢弃左边的元素*/elselow=mid+1;/*升序数组的关键:查找值大于中间元素的值,丢弃右边的元素*/if(flag=0)printf(n%d no find!n,key);结果:输入:8输出:8 is data4按降序排列的数组
22、(如a10),则只需改变“high=”和“low”这两条关键语句即可,即if(keydatamid)low=mid+1;elsehigh=mid-1;6.1一 维 数 组6.1.6一维数组元素的位移所谓数组元素的位移,就是数组元素整体向左或向右移动几位。向右移时,最后1位将变为第1位,第1位则变为第2位,以此类推;向左移则是第1位变为最后1位,第2位则变为第1位,以此类推。具体方法如下:(1)向右移:(2)向左移:把最后一个元素值放入临时变量中,各元素依次左移,再把临时变量里的值赋给第一位元素。把第一个元素值放入临时变量中,各元素依次右移,再把临时变量里的值赋给最后一位元素。6.1一 维 数
23、组6.1.6一维数组元素的位移【例6-11】将整型数组a的元素依次向右移动3位。#include int main()static int a6=1,2,3,4,5,6;int i,j,t;for(j=1;j0;i-)/*注意i0*/ai=ai-1;/*外循环1次,从a0到a4整体向右移动1位*/a0=t;/*每次移动都把临时变量里的值赋给第1个元素*/for(i=0;i6;i+)printf(%dt,ai);输出结果:4 5 6 1 2 36.1一 维 数 组6.1.6一维数组元素的位移【例6-12】将整型数组a的元素依次向左移动2位。#include int main()static in
24、t a6=1,2,3,4,5,6;int i,j,t;for(j=1;j=2;j+)t=a0;/*每次移动都把第一个元素值放在临时变量t中*/for(i=0;i5;i+)/*注意i5*/ai=ai+1;/*外循环1次,从a5到a1整体向左移动1位*/a5=t;/*每次移动都把临时变量里的值赋给最后一个元素*/for(i=0;i6;i+)printf(%dt,ai);输出结果:3456126.1一 维 数 组6.1.7一维数组解决实际问题举例【例6-13】辗转相除法解决各进制的相互转化。#include int main()int x,i,a16;/*数组a用于存放辗转相除的结果*/printf
25、(Input x:);scanf(%d,&x);for(i=0;x;)ai=x%2;/*辗转相除法化二进制*/x/=2;i+;/*注意上面的i运算完最后一次要再增1。下面从高位输出二进制,下同*/for(-i;i=0;i-)printf(%d,ai);6.1一 维 数 组6.1.7一维数组解决实际问题举例在上面的情形中,我们只需更改除数为8和16,便可分别得到八进制和十六进制的运算结果。下面的程序可以同时得到三种进制的运算结果:#include int main()int a16,i,x,t;/*数组a用于存放各进制结果*/int b3=2,8,16,j;/*数组b用于存放各个进制*/prin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 模块 电子 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内