中职C语言程序设计模块六课件_第1页
中职C语言程序设计模块六课件_第2页
中职C语言程序设计模块六课件_第3页
中职C语言程序设计模块六课件_第4页
中职C语言程序设计模块六课件_第5页
已阅读5页,还剩90页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、(中职)C语言程序设计模块六课件数组模块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 aM;”是正确的。用const声

2、明的变量情况。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开始,因此,元素下标的取值范围就是0(元素个数-1)。故

3、该数组的元素序列是: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;”将分配 6212(B),即12个

4、字节的内存空间(对于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); 这是错误的,不可能输出每个元素的值。要输出第6个元

5、素的值,应写为: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;i+)printf(%4d

6、,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(i=0;imax)m

7、ax=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】打鱼还是晒网?三天打鱼两天晒网问题:某人1998年

8、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.1.3一维数

9、组的应用 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个元素比较,条件符合继续交换值第1轮循环完

10、毕,最大的值就保存在最后一个元素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按从小到大的顺序输出。#include

11、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&taj

13、)/*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,

16、t;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,4

17、0,50,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 i

19、s a%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:);sca

21、nf(%d,&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 data

22、4按降序排列的数组(如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)向左移:把最后一个元素值放入临时变量中,各元素依次左移,再把临时变量里的值赋给第一位元素。把第一个元素值放入临时变量中,各元素依次右移,再把临时变量里的值赋给最后一位元素。

23、6.1一 维 数 组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(

24、)static int 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用于存放辗转相除

25、的结果*/printf(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

26、用于存放各个进制*/printf(请输入十进制数:);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为循

27、环变量,j为因子,count用于统计因子个数*/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);/*

28、输出最后1个*/putchar(n);6.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*11

29、1=12321121*121=14641 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;j

30、num;j+)/*对该范围内的数逐个试探*/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(

31、j=0;jnum;j+)/*对该范围内的数逐个试探*/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);p

32、rintf(n); 输出结果:Input a range: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)给所有数组元素初始

33、化。例如:static int a23=10,5,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后面的所有元素值

34、自动赋0*/(4)对全部元素初始化,可以省略第1维的长度。第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

35、(%dn,a23);/*这是错误的,不可能输出每个元素的值*/要输出第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

36、a34=2,14,11,6,8,21,31,5,15,12,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

37、 int a23=1,2,3,4,5,6;int b32,i,j;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;

38、/*每一轮外循环都假设第1个元素值最大*/for(j=0;jmax)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】矩

39、阵相乘。假设有a、b两个矩阵,矩阵相乘的要求是:b的行必须等于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+

40、a02b21=12+21+55=29;c10=a10b00+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的

41、行下标即a的列下标范围*/cij+=ail*blj; /*新矩阵元素的值*/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+)/*第

42、3个球的所有取法*/am0=i;/*将值(04,分别代表不同的球)放入数组元素中,下同*/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

43、(black );break;m+;/*数组行下标递增*/输出结果:NO. 1: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】寻找马鞍点。在一个矩阵中,某个值是一

44、行中的最小值,但是却又是该值所在列中的最大值,该元素就是要找的马鞍点。#include int 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大的值,则中止循环,

45、m不是马鞍点*/break;if(k=3)/*若循环顺利完成,即j列没有元素值比m大,则m是马鞍点*/ 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=

46、10,3,5,7,9;int b6;int i,t,j,k=0;printf(nInput number:);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+;/*将排序后的一维数组元素值依

47、次送入二维数组中*/for(i=0;i2;i+)for(j=0;j3;j+)printf(%d ,aij);/*按序输出该二维数组各元素的值*/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); /*输入要查找的

48、值*/for(i=0;i2;i+)for(j=0;j3;j+)if(aij!=m)6.2二 维 数 组6.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

49、char a10=I,a,m,a,b,o,y;”是对数组元素逐个初始化,字符(包括空格)须用单引号。(1)数组若未指定长度,则必须初始化。长度就为初始化的元素个数。(2)把字符串赋给数组时,系统自动在末尾加结尾符0,占1 B。(3)若有对二维字符数组进行每行单字符和字符串混合赋值,则赋单字符的行必须赋值完整(包括赋结尾符),赋字符串的行不能越界(4)赋字符串时可不用 。(5)同样不可整体赋值。(6)1.字符数组的初始化6.3字 符 数 组6.3.2字符数组的初始化和引用2.字符数组的引用【例6-25】仔细观察下面程序中字符数组的引用。#include int main()static char

50、 ch35=s,e,v,e,n,boy,girl; /*混合赋值,一般不这样赋值*/static char c=We 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:

51、 以单字符形式逐个输入字符数组 m的每个元素*/for(i=0;i10;i+)printf(%c,mi);/*%c: 以单字符形式逐个输出字符数组 m的每个元素*/putchar(n);输出结果:6.3字 符 数 组6.3.3字符数组的输入和输出1.单字符的输入和输出从上面可知,单字符的输入和输出用“%c”格式字符,且必须使用循环语句,跟数值型数组一样。for(i=0;i10;i+)scanf(%c,&mi);/*%c: 以单字符形式逐个输入字符数组 m的每个元素*/for(i=0;i10;i+)printf(%c,mi);/*%c: 以单字符形式逐个输出字符数组 m的每个元素*/6.3字 符

52、 数 组6.3.3字符数组的输入和输出2.字符串的输入和输出字符串的输入和输出:用“%s”格式字符;数组名表示首元素首地址(第1个字符的首地址),故在输入和输出时可直接使用数组名(输入时不必再加地址与运算符&)。例如:#include int main()char c5,d5,e5,f5;scanf(%s%s%s%s,c,d,e,f);/*直接调用数组名,不必加地址与运算符&*/printf(%s-%s-%s-%s,c,d,e,f);输出结果:输入:we like going out 输出:We-like-going-out6.3字 符 数 组6.3.3字符数组的输入和输出【例6-26】在二维

53、字符数组中,每一行的首元素就代表该行的首地址,因而输出该行时只须直接引用该行首元素即可。#include int main()static char a310=China,American,England;printf(%sn,a0);/*输出China*/printf(%sn,a1);/*输出American */printf(%sn,a2);/*输出England */等同于用 for循环以“%c”格式输出#include int main()static char a310=China,American,England;int i,j;6.3字 符 数 组6.3.3字符数组的输入和输出f

54、or(i=0;i3;i+) for(j=0;j10;j+)printf(%c,aij);printf(n);也可用for循环单行输出#include int main()static char a310=China,American,England;int i;for(i=0;i3;i+)printf(%sn,ai);6.3字 符 数 组6.3.4字符串和字符处理函数1.puts()字符串输出函数格式:puts(数组名);功能:把字符数组中的字符串输出到显示器。遇到字符串中的0时自动换行。#include int main() static char c=goodntime,d=birthda

55、y;puts(c);puts(d);输出:goodtimebirthday6.3字 符 数 组6.3.4字符串和字符处理函数2.gets()字符串输入函数格式:gets(数组名);#include int main() char e10;gets(e);puts(e);printf(%s,e);输入:China is a beautiful country 输出:China is a beautiful countryChina is a beautiful country6.3字 符 数 组6.3.4字符串和字符处理函数3.strcat字符串连接函数格式:strcat(字符数组名1,字符数组

56、名2);功能:把字符数组2连接到字符数组1的后面,并删掉字符数组1的结尾符0,返回字符数组1的首地址。要保证字符数组1有足够的长度,否则不能全部装入被连接的字符串(个别编译器对此忽略)。#include #include int main()static char d100=birthday,e=sunshine;strcat(d,e);puts(d);输出:birthdaysunshine6.3字 符 数 组6.3.4字符串和字符处理函数4.strcpy字符串复制函数格式:strcpy(字符数组名1,字符数组名2);功能:把字符数组2连同结尾符0一起复制并覆盖字符数组1的字符串,相当于把字符

57、数组2的字符串赋给字符数组1。#include #include int main()static char d100=birthday,e=sunshine;strcpy(d,e);puts(d);输出:sunshine6.3字 符 数 组6.3.4字符串和字符处理函数5.strcmp字符串比较函数格式:strcmp(字符数组名1,字符数组名2);功能:按照ASCII顺序比较两个数组中的字符串,并由函数返回值比较结果,也可直接比较字符串常量。比较方法是:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇为止。串1串2,返回值0;串1串2,返回值0;串1串2,返

58、回值0;ANSI标准规定,返回值为正数、负数、0,而确切数值是依赖不同的C编译器实现的。#include #include int main()static char d100=godo,e=goko;printf(%dn,strcmp(d,e);/*遇到d,k不同,d-k=-7,输出-7,结果为godobook*/6.3字 符 数 组6.3.4字符串和字符处理函数6.strlen测试字符串长度函数格式:strlen(字符数组名);功能:测试字符串的实际长度(不含结尾符0)并作为函数返回值。这个实际长度和数组长度是两个概念,不能等同。#include #include int main()st

59、atic char d100=good boy,e=beautiful girl;printf(%d-%dn,strlen(d),strlen(e); /*计算字符串的实际长度*/printf(%d-%dn,sizeof(d),sizeof(e); /*计算数组的内存长度*/输出结果:8-14100-156.3字 符 数 组6.3.4字符串和字符处理函数7.strncpy字符串复制函数格式:strncpy(str,p,n);功能:从指针位置p处开始复制n个字符给字符数组str(其实就复制了一个串,带0)。【例627】从p+3处复制5个字符到数组b中。#include #include main

60、() static char a=abcdefghijklmn;char *p=a;char b100;strncpy(b,p+3,5);puts(b);/*输出defgh*/ 6.3字 符 数 组6.3.4字符串和字符处理函数8.isdigit数字字符测试函数格式:isdigit(字符变量);功能:测试字符是否是数字09,如果是,返回1;否则,返回0。【例6-28】对输入的字符进行判断,如果是09的字符,就输出它的ASCII码值,否则原样输出。输入小写字符z就退出循环。#include #include int main()char ch;ch=getchar();while(ch!=z)

温馨提示

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

评论

0/150

提交评论