(中职)C语言程序设计模块六课件.pptx

上传人:春哥&#****71; 文档编号:87295913 上传时间:2023-04-16 格式:PPTX 页数:95 大小:3.45MB
返回 下载 相关 举报
(中职)C语言程序设计模块六课件.pptx_第1页
第1页 / 共95页
(中职)C语言程序设计模块六课件.pptx_第2页
第2页 / 共95页
点击查看更多>>
资源描述

《(中职)C语言程序设计模块六课件.pptx》由会员分享,可在线阅读,更多相关《(中职)C语言程序设计模块六课件.pptx(95页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、(中中职职)C语语言程序言程序设计设计模模块块六六课课件件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,则“int a

2、M;”是正确的。用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;i6;

6、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;for(

7、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一 维 数 组6.

9、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按从小到大的顺序输出。#in

11、clude 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=0&

13、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;for

16、(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,50,5

17、5;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%d,

19、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,则改变最低位为(lo

20、w+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,&ke

21、y);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按降序排列的数组(如a

22、10),则只需改变“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一 维 数 组6.

23、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 int a

24、6=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(In

25、put 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用于存放各个进制*/printf(

26、请输入十进制数:);scanf(%d,&x);for(j=0;j=0;i-)if(ai=10&ai=15)/*十六进制的输出情况*/printf(%c,ai+87);elseprintf(%d,ai);putchar(n);6.1一 维 数 组6.1.7一维数组解决实际问题举例【例6-14】对合数分解质因数。在模块5中讲解了用continue语句分解质因数的方法,该例是把查到的因子直接输出。在本例中,利用数组,把查到的因子先放在数组中,然后通过输出数组元素值的形式输出结果。#include int main()int x,i,j,count=0;/*i为循环变量,j为因子,count用于统计因

27、子个数*/int a10;/*数组a用于保存因子*/printf(Input x:);scanf(%d,&x);for(i=0,j=2;j=x;)/*从最小的质因数2开始。注意:当“被除数=除数”时,模运算为0,也是因子,将送入数组中。因此,j=x*/if(x%j=0)6.1一 维 数 组6.1.7一维数组解决实际问题举例ai+=j;count+;x/=j;continue;j+;printf(x=);/*按算式输出*/for(i=0;icount-1;i+)/*不输出最后1个*/printf(%d*,ai);printf(%d,acount-1);/*输出最后1个*/putchar(n);6

28、.1一 维 数 组6.1.7一维数组解决实际问题举例【例6-15】求回文数。求出10200的数的平方是有对称性的回文数,如11,1111121。#include int main()int a6,i,n,t;long sum,j;for(n=10;n=0;i-)/*对位数进行反序求和,如个位变最大位*/sum+=ai*t;t*=10;if(sum=n*n)/*判断并输出结果*/printf(%d*%d=%ld,n,n,n*n);putchar(n);输出结果:11*11=12122*22=48426*26=676101*101=10201111*111=12321121*121=14641 6

29、.1一 维 数 组6.1.7一维数组解决实际问题举例【例6-16】求自守数。所谓自守数,是指一个数的平方的尾数等于该数自身的自然数,如:252625,7625 776,则25和76就是自守数。编程求一定范围内(如10 000以内)的所有自守数。#include int main()long i,j,k1,k2,k3;static long a10=0;long num,m,n,sum;printf(Input a range:n);scanf(%ld,&num);/*输入要求的范围*/printf(The result is:n);for(j=0;jnum;j+)/*对该范围内的数逐个试探*/

30、m=j;6.1一 维 数 组6.1.7一维数组解决实际问题举例【例6-16】求自守数。所谓自守数,是指一个数的平方的尾数等于该数自身的自然数,如:252625,7625 776,则25和76就是自守数。编程求一定范围内(如10 000以内)的所有自守数。#include int main()long i,j,k1,k2,k3;static long a10=0;long num,m,n,sum;printf(Input a range:n);scanf(%ld,&num);/*输入要求的范围*/printf(The result is:n);for(j=0;jnum;j+)/*对该范围内的数逐

31、个试探*/m=j;6.1一 维 数 组6.1.7一维数组解决实际问题举例n=1;sum=0;k1=10;k2=1;while(m=0)/*判断该数的位数*/an=j%k1;/*将分离出的数存入数组中*/n+;k1*=10;m=m/10;k1=k1/10;k3=k1;for(i=1;i=n-1;i+)sum+=(ai/k2*an-i)%k1*k2;/*求每一部分积之和*/k2*=10;k1/=10;6.1一 维 数 组6.1.7一维数组解决实际问题举例sum=sum%k3;/*求和的后n-1位*/if(sum=j)printf(%5ld,sum);printf(n);输出结果:Input a r

32、ange:10000The result is:0156257637662593766.2二 维 数 组6.2.1二维数组的定义在讲述一维数组时已有表明:带两个长度标注就是二维数组。相对于一维数组,二维数组多了一个列,即二维数组由行和列组成。二维数组形式如图6-1所示。定义了一个2行3列的整型二维数组a。和一维数组一样,二维数组的行下标和列下标均从0开始。例如:故该数组的元素依次是:a00,a01,a02,a10,a11,a12。图6-1二维数组形式6.2二 维 数 组6.2.2二维数组的初始化和引用1.二维数组的初始化(1)给所有数组元素初始化。例如:static int a23=10,5,

33、6,9,7,11;/*定义一个2行3列的整型二维数组a,并初始化各元素*/该数组各元素位置如下:各元素及其值按序依次是:a00=10,a01=5,a02=6,a10=9,a11=7,a12=11。(2)分行初始化。static int a23=10,5,6,9,7,11;6.2二 维 数 组6.2.2二维数组的初始化和引用(3)部分初始化,其余元素值自动赋0。每行第1个元素初始化,其余自动赋0。例如:static int a23=10,9;前面元素初始化,后面自动赋0。例如:static int a23=10,9;/*a01后面的所有元素值自动赋0*/(4)对全部元素初始化,可以省略第1维的长

34、度。第2维的长度任何情况下都不能省略。static int a 3=10,5,6,9,7,11;/*等价于static int a23=10,5,6,9,7,11;*/要特别注意,在定义数组时,若没有初始化,则行下标不能省略。例如:int a3;/*这是错误的*/同样不能给二维数组整体赋值。例如:int a23;a23=10,5,6,9,7,11;/*这是错误的,要切记*/6.2二 维 数 组6.2.2二维数组的初始化和引用(1)不能引用整个数组,只能逐个引用元素。例如:static int a23=1,2,3,4,5,6;printf(%dn,a23);/*这是错误的,不可能输出每个元素的值

35、*/要输出第6个元素的值,应写为:printf(%d,a12);(2)引用元素时要注意下标不能越界。例如:printf(%dn,a23);/*行和列都越了界,因为根本不存在a23这个元素,该数组元素最大下标为a12*/2.二维数组的引用6.2二 维 数 组6.2.3二维数组的应用在应用二维数组(也称矩阵)时,因为有行和列,因而必须定义两个循环变量。行在外,列在里。【例6-17】求元素最大值及其行列下标。有一个34的矩阵如下,求出所有元素中的最大值及它所在的行和列。#include stdio.hint main()static int a34=2,14,11,6,8,21,31,5,15,12

36、,3,19;int i,j,c=0,l=0;int max=a00;/*假设第1个元素值最大*/for(i=0;i3;i+)for(j=0;jmax)max=aij;c=i;l=j;/*把最大值的行和列另行存放*/printf(The Max is a%d%d:%d,c,l,max);输出结果为:The Max is a12:316.2二 维 数 组6.2.3二维数组的应用【例6-18】矩阵转置。行列互换。有一个34的矩阵如下,把该矩阵的行列互换,保存到另一个矩阵中。#include stdio.hint main()static int a23=1,2,3,4,5,6;int b32,i,j

37、;for(i=0;i2;i+)for(j=0;j3;j+)bji=aij;/*行列互换*/for(i=0;i3;i+)for(j=0;j2;j+)printf(%d,bij);printf(n);输出出结果:果:1 42 53 66.2二 维 数 组6.2.3二维数组的应用【例6-19】元素筛选。在二维数组中选出各行最大的元素组成一个一维数组。#include int main()static int a33=1,2,3,4,5,6,7,8,9;int b3;int max,i,j,k=0;for(i=1;i3;i+)max=ai0;/*每一轮外循环都假设第1个元素值最大*/for(j=0;j

38、max)max=aij;bk+=max;for(i=0;i3;i+)printf(%dt,bi);输出出结果:果:3696.2二 维 数 组6.2.3二维数组的应用【例6-20】矩阵相乘。假设有a、b两个矩阵,矩阵相乘的要求是:b的行必须等于a的列。相乘的结果是得到一个以a的行为行,b的列为列的新的矩阵,如下:int a23,b32,c22;b的行等于a的列,即都是3。ab可得到c。计算的方法是:对应的元素两两相乘之和。相乘规则:a的行与b的列对应的排名相同的两个元素相乘。例如:6.2二 维 数 组6.2.3二维数组的应用【例6-20】矩阵相乘。假设有a、b两个矩阵,矩阵相乘的要求是:b的行必

39、须等于a的列。相乘的结果是得到一个以a的行为行,b的列为列的新的矩阵,如下:int a23,b32,c22;b的行等于a的列,即都是3。ab可得到c。计算的方法是:对应的元素两两相乘之和。相乘规则:a的行与b的列对应的排名相同的两个元素相乘。例如:static int a23=1,2,5,0,3,4,b32=0,2,3,1,4,5,c22;6.2二 维 数 组6.2.3二维数组的应用a、b相乘得数组 c,则c的各元素计算如下:c00=a00b00+a01b10+a02b20=10+23+54=26;c01=a00b01+a01b11+a02b21=12+21+55=29;c10=a10b00+

40、a11b10+a12b20=00+33+44=25;c11=a10b01+a11b11+a12b21=02+31+45=23。6.2二 维 数 组6.2.3二维数组的应用程序如下:#include int main()static int a23=1,2,5,0,3,4,b32=0,2,3,1,4,5;static int c22=0;/*注意新矩阵各元素要初始化为0,以便求和*/int i,j,l;for(i=0;i2;i+)/*a的行下标范围*/for(j=0;j2;j+)/*b的列下标范围*/for(l=0;l3;l+)/*b的行下标即a的列下标范围*/cij+=ail*blj;/*新矩

41、阵元素的值*/for(i=0;i2;i+)for(j=0;j2;j+)printf(c%d%d=%dt,i,j,cij);6.2二 维 数 组6.2.3二维数组的应用【例6-21】球的取法。玻璃瓶中红、黄、蓝、白、黑色球各1个,任意取出3个,问可以有多少种不同的取法(顺序不限)?#include int main()int i,j,k,m=0,n,a1003;/*数组a用于存放取法*/for(i=0;i5;i+)/*第1个球的所有取法*/for(j=i+1;j5;j+)/*第2个球的所有取法*/for(k=j+1;k5;k+)/*第3个球的所有取法*/am0=i;/*将值(04,分别代表不同的

42、球)放入数组元素中,下同*/am1=j;am2=k;printf(nNO.%2d:,m+1);/*从第1种开始输出*/for(n=0;n3;n+)/*三个球,即数组列下标为3*/switch(amn)/*对数组元素的值进行匹配,输出相应的球*/6.2二 维 数 组6.2.3二维数组的应用case 0:printf(red);break;case 1:printf(yellow);break;case 2:printf(blue);break;case 3:printf(white);break;case 4:printf(black);break;m+;/*数组行下标递增*/输出结果:NO.1

43、:red yellow blueNO.2:red yellow whiteNO.3:red yellow blackNO.4:red blue whiteNO.5:red blue blackNO.6:red white blackNO.7:yellow blue whiteNO.8:yellow blue blackNO.9:yellow white blackNO.10:blue white black6.2二 维 数 组6.2.3二维数组的应用【例6-22】寻找马鞍点。在一个矩阵中,某个值是一行中的最小值,但是却又是该值所在列中的最大值,该元素就是要找的马鞍点。#include int

44、main()int a34=2,3,12,8,13,4,9,7,23,5,10,6;int i=0,j=0,k=0,m,count=0;for(i=0;i3;i+)m=ai0;/*假设每行第1个元素值最小*/*下面寻找每行的最小值*/for(j=0;j4;j+)if(aijm)m=aij;/*下面定位最小值m所在的列*/for(j=0;j4;j+)if(aij=m)/*下面判断m是否是j列的最大值*/6.2二 维 数 组6.2.3二维数组的应用for(k=0;km)/*若有比m大的值,则中止循环,m不是马鞍点*/break;if(k=3)/*若循环顺利完成,即j列没有元素值比m大,则m是马鞍点

45、*/printf(a%d%d(%d)是马鞍点,i,j,m);count+;printf(n共计有%d个马鞍点!,count);输出结果:a21(5)是马鞍点共计有1个马鞍点!6.2二 维 数 组6.2.4二维数组的排序关于二维数组的排序,是按照一维数组排序的思路,即先将二维数组放入一维数组中,对该一维数组排序后再将值依次送入二维数组中。故此处二维数组的排序本质上仍是一维数组的排序模式。6.2二 维 数 组6.2.4二维数组的排序#include int main()static int a23=10,3,5,7,9;int b6;int i,t,j,k=0;printf(nInput numb

46、er:);scanf(%d,&a12);for(i=0;i2;i+)for(j=0;j3;j+)bk+=aij;/*将二维数组的元素值送入一维数组*/for(j=0;j6;j+)for(i=0;ibi+1)t=bi;bi=bi+1;【例6-23】给二维数组插入一个元素值,然后按升序对该二维数组进行排序。6.2二 维 数 组6.2.4二维数组的排序bi+1=t;/*对该一维数组进行排序*/k=0;for(i=0;i2;i+)for(j=0;j3;j+)aij=bk+;/*将排序后的一维数组元素值依次送入二维数组中*/for(i=0;i2;i+)for(j=0;j3;j+)printf(%d,ai

47、j);/*按序输出该二维数组各元素的值*/printf(n);输出结果:输入:4结果显示:Input number:434579106.2二 维 数 组6.2.5二维数组元素值的查找【例6-24】在数组中查找某一数值,找到了便输出,找不到输出“None”。#include int main()static int a23=10,3,5,7,9,12;int i,j,m,t,k,flag=0;printf(nPlease input number:);scanf(%d,&m);/*输入要查找的值*/for(i=0;i2;i+)for(j=0;j3;j+)if(aij!=m)6.2二 维 数 组6

48、.2.5二维数组元素值的查找continue;t=i;k=j;/*把找到的行列下标另行存放*/flag=1;/*找到了,标记赋1*/if(flag=1)printf(a%d%d:%d,t,k,atk);elseprintf(None);字符数组的定义格式一样,更改数据类型为字符类型char即可。一维字符数组定义举例:char ch5。二维字符数组定义举例:char ch23。6.3字 符 数 组6.3.1字符数组的定义6.3字 符 数 组6.3.2字符数组的初始化和引用“static char a10=I,a,m,a,b,o,y;”是对数组元素逐个初始化,字符(包括空格)须用单引号。(1)数组

49、若未指定长度,则必须初始化。长度就为初始化的元素个数。(2)把字符串赋给数组时,系统自动在末尾加结尾符0,占1 B。(3)若有对二维字符数组进行每行单字符和字符串混合赋值,则赋单字符的行必须赋值完整(包括赋结尾符),赋字符串的行不能越界(4)赋字符串时可不用。(5)同样不可整体赋值。(6)1.字符数组的初始化6.3字 符 数 组6.3.2字符数组的初始化和引用2.字符数组的引用【例6-25】仔细观察下面程序中字符数组的引用。#include int main()static char ch35=s,e,v,e,n,boy,girl;/*混合赋值,一般不这样赋值*/static char c=W

50、e are boysnYou are girls;char m10;int i,j;for(i=0;i3;i+)for(j=0;j5;j+)printf(%c,chij);/*%c:以单字符形式逐个输出二维字符数组ch 的每一行*/putchar(n);6.3字 符 数 组6.3.2字符数组的初始化和引用printf(%s,c);/*%s:以字符串形式输出一维字符数组c(字符串)*/putchar(n);for(i=0;i10;i+)scanf(%c,&mi);/*%c:以单字符形式逐个输入字符数组 m的每个元素*/for(i=0;i10;i+)printf(%c,mi);/*%c:以单字符形

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁