【文档说明】C语言程序设计教程第7章课件.ppt,共(71)页,408.501 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44519.html
以下为本文档部分文字说明:
7.1一维数组7.2二维数组7.3数组的应用7.4字符数组与字符串7.5数组作为函数的参数7.6程序举例第7章数组C语言程序设计教程第7章数组2022/11/24C语言程序设计教程21.数组的引入在前面的程序
设计中,所涉及和处理的数据都非常简单,对这些数据采用C语言的基本类型(整型、实型、字符型)来描述就行,但在实际应用中,需要处理的数据往往是复杂多样的。问题:输入中南大学2003级4500名学生的C语言成绩,按成绩从高分
到低分排序,输出平均成绩及高于平均成绩的学生成绩。如何编程呢?C语言提供了用户自定义数据的描述方法,即构造类型:由若干基本类型数据按一定的规则构成复杂数据对象。如数组类型。构造数据类型的引入,使我们能较方便地解决上面的问题。第7章数组2022/11/24C语言程序设计教程32.数组的概念数组:具
有相同类型的数据组成的序列,是有序集合。数组中的每一个数据称数组元素数组分量下标变量数组元素由其所在的位置序号(称数组元素的下标)来区分。用数组名与下标可以用统一的方式来处理数组中的所有元素,从而方便的实现处理
一批具有相同性质数据的问题。注意:数组元素有序不是指元素大小顺序第7章数组2022/11/24C语言程序设计教程47.1一维数组7.1.1一维数组的定义一维数组:只有一个下标的数组。定义格式:存储类别类型标识符数组名[元素个数];说明:1.存储类别:说明数组的存储属性,即数组的作用域与生成期,可以
是静态型(static),自动型(auto)及外部型(extern)。当使用auto型时可以省略。2.类型标识符:数组元素的类型。3.数组名的命名规则:与标识符的命名规则相同。4.数组“元素个数”:即数组长度,只能是一个整型常量
表达式。可以是符号常量。第7章数组2022/11/24C语言程序设计教程5例:inta[5];定义了一个自动型整型数组:数组的元素为整型;数组名为a;元素个数为5;下面是合法的数组定义:①charstr[20];/*定义一个有20个元素的字符
型数组str*/②floatscore[8];/*定义一个有8个元素的浮点型数组score*/③#defineN5longdata[N];/*定义一个有5个元素的长整型数组data*/shortz[4*N];/*定义了一个有20个元素的短
整型数组z*/其中③的数组长度使用的是符号常量下面的定义是非法的:intn=10;charc[n];/*数组长度不能使用变量*/第7章数组2022/11/24C语言程序设计教程6例:试判断下列数组定义是否合法:intstudent[35];charname[20];floatscor
e[35];#definestudent35floatn_student[student];intscore_student[student*3];intperson(10);intn=10,a[n];第7章数组2022/11/24C语言程序设计教程7a[5]=80;a[2.5]
=60;?定义了数组以后,就可使用它了。但不能利用数组名来整体引用一个数组,只能单个的使用数组元素。数组元素的描述:由数组名加方括号中的下标组成,即:数组名[下标]下标:数组元素在数组中的顺序号,使用整序型表达式。取值范围:从0到元素
个数-1。C语言不对下标越界作语法检查。若有定义:inta[5];则数组a的元素分别为:a[0]、a[1]、a[2]、a[3]、a[4];但a[5]不是。每个元素都可作为一个整型变量来使用。如:a[0
]=5;a[3]=a[1]+4;a[‟D‟-‟B‟]=3;第7章数组2022/11/24C语言程序设计教程87.1.2数组元素的引用定义了数组以后,就可使用它了。但不能利用数组名来整体引用一个数组,只能单个的使用数组元素数组元素的描述
:由数组名加方括号中的下标组成,即:数组名[下标]下标:数组元素在数组中的顺序号,使用整序型表达式。取值范围:从0到元素个数-1。C语言不对下标越界作语法检查。若有定义:inta[5];则数组a的元素分别为:a[0]、a[1]
、a[2]、a[3]、a[4];但a[5]不是。每个元素都可作为一个整型变量来使用。如:a[0]=5;a[3]=a[1]+4;a[‟D‟-‟B‟]=3;scanf(“%d”,&a[4]);a[5]=80;a[2.5
]=60;?第7章数组2022/11/24C语言程序设计教程9#include<stdio.h>main(){intn,a[15];for(n=0;n<15;n++)scanf(“%d”,&a[n]);printf(“\n”);for(n=1
4;n>=0;n--)printf(“%4d”,a[n]);}输入:123456789101112131415输出:151413121110987654321根据数组的有序性,往往使用循环语句来对数组进行处理,用循环控制变量作为数组下标,
从而可以以统一的方式来访问数组元素。例7.1从键盘输入15个整数,再反序输出。问:不用数组能否完成,如何实现?假设是1000个数据呢?注意:1.循环控制变量的初值、终值及控制条件。2.不能整体输入/出数组
如:printf(“%d”,a);学会如何对数组进行输入输出第7章数组2022/11/24C语言程序设计教程107.1.3一维数组的存储结构与初始化1.一维数组的存储结构数组变量在内存中分配一片连续的存储单元,数组元素按数组下标从小到大连续存放。a代表首地址(数组起始地址),每个
元素字节数相同,因此,根据数组元素序号可以求得数组各元素在内存的地址,并可对数组元素进行随机存取。数组元素地址=数组首地址+元素下标*sizeof(数组类型)例inta[5];设a的首地址为1000,数组a存储示意图如右图所示1006a[0]a[1]a[2]a[3]a[4]内存1000a[
3]的地址=1000+3×2=1006第7章数组2022/11/24C语言程序设计教程112.一维数组的初始化含义:在定义数组的同时,对数组各元素指定初值。初始化是编译阶段完成。注意:用赋值语句或输入语句也可给数组素指定初值,是在运行时完成。初始化数组格式:[
static]<类型标识符><数组名[元素个数]>={<初值列表>};或<类型标识符><数组名[元素个数]>={<初值列表>};说明:①<初值列表>是用逗号分隔的数组元素的初始值(常量)。②<初值列表>中数值的类型必须与<类型标识符>一致。第7章数组2022/1
1/24C语言程序设计教程12若不对auto数组进行初始化,则其初值是不可知的。若一个static或外部数组未进行初始化,则对数值型数组元素,初值为0,而对字符型数组元素,初值为空字符‘\0’.对数组初始化的几种方法:①在定义数组时,对全部数组元素赋予初值。例:inta[5]={0,
1,2,3,4};②在定义数组时,对部分数组元素赋予初值。例:inta[5]={1,2};等价a[0]=1,a[1]=2;其它赋0③对全部数组元素赋初值时,可省数组长度,系统自动确定。例:inta[]={0,1,2,3,4};等价于inta[5]=
{0,1,2,3,4};a[0]a[1]a[2]a[3]a[4]01234初始化第7章数组2022/11/24C语言程序设计教程13例7.2数组初始化与未初始化比较#include<stdio.h>main(){inti,a[5]={3,4,5},b[5];printf(“\narra
yais:”)for(i=0;i<5;i++)printf(“%6d”,a[i]);printf(“\narraybis:”)for(i=0;i<5;i++)printf(“%6d”,b[i]);}运行结果:arrayais:345
00arraybis:-321398401170454考虑:数组b的值的含义?第7章数组2022/11/24C语言程序设计教程14#defineN5#include<stdio.h>main(){inti,j,k,max,min;staticinta[5
];for(i=0;i<5;i++)scanf("%d",&a[i]);max=min=a[0];/*假定第一个元素既是最大的,也是最小的*/j=k=0;/*对分别记录最大,最小元素下标的变量j,k初始化*/for(i=0
;i<5;i++){if(max<a[i]){max=a[i];j=i;}/*把当前最大值送max,下标送j*/elseif(min>a[i]){min=a[i];k=i;}}printf("max:a[%d]=%d,min:a[%d]=%d",j,ma
x,k,min);}例7.3从键盘上输入5个数,输出最大、最小的元素以及它们的下标若输入:823120-10↙输出为:max:a[2]=312,min:a[4]=-10第7章数组2022/11/24C语言程序设计教程15若一个一维数组,它的每一个元素亦是类
型相同的一维数组时,便构成二维数组。数组的类型相同:是指数组大小、元素类型相同。数组的维数:是指数组的下标个数,一维数组元素只有一个下标,二维数组元素有两个下标。7.2.1二维数组的定义1.定义形式:存储类别类型标识符数组名[行数][列数];例:floatb[5][
3];定义了一个5×3的数组b,即数组为5行3列,可存放15个实型数据。7.2二维数组第7章数组2022/11/24C语言程序设计教程16例:inta[2][3];定义了一个2×3的数组a,即数组为2行3列,可存放6个整型数据。2.二维数组元素的表示
形式:数组名[下标1][下标2]下标1称第一维下标,下标2称第二维下标。二维数组类似于数学中的矩阵,由行、列组成。把所有第一维下标相同的元素称为行,所有第二维下标相同的元素称为列。数组a的6个元素如下:a[0][0]a
[0][1]a[0][2]a[1][0]a[1][1]a[1][2]第7章数组2022/11/24C语言程序设计教程173.多维数组的定义•根据二维数组的定义,我们可以类推出多维数组的定义。staticintb[2][2][3];/*定义了一个3维的静态整型数
组*/floatc[2][3][2][2];/*定义了一个4维浮点型数组*/•在数组定义时,多维数组的维从左到右第一个[]称第一维,第二个[]称第二维,依此类推。多维数组元素的顺序仍由下标决定。下标的变化是先变最右边的,再依次变化
左边的下标。•三维数组b的12个元素是:b[0][0][0]b[0][0][1]b[0][0][2]b[0][1][0]b[0][1][1]b[0][1][2]b[1][0][0]b[1][0][1]b[1][0][2]b[1][1][0]b[1][1][
1]b[1][1][2]第7章数组2022/11/24C语言程序设计教程181.二维数组元素的引用形式:数组名[下标1][下标2]下标1称第一维下标(或称行),下标2称第二维下标(或称列)。下标从0开始变化,其值分别小
于数组定义中的常量表达式1与常量表达式2。7.2.2二维数组元素的引用在二维数组中,一个元素的位置由其下标决定。对floata[4][3];其12个元素是:第(0)行:a[0][0],a[0][1],a[0][2]第(1)行:a[
1][0],a[1][1],a[1][2]第(2)行:a[2][0],a[2][1],a[2][2]第(3)行:a[3][0],a[3][1],a[3][2]二维数组的每一个元素都可以作一个变量来使用。如:printf(“%d”,a[0][0]);scanf("%d",&a[1][1]);a[1]
[0]+=a[0][0]+3*a[0][1];第7章数组2022/11/24C语言程序设计教程19例7.4二维数组输入输出main{inta[2][3];printf(”\nInputarraya:”);for(j=0;j<2;j++)for(k=0;k<3;k+
+)scanf(“%d”,&a[j][k]);/*输入数据到二维数组中*/printf(”\nOutputarraya:\n”);for(j=0;j<2;j++){for(k=0;k<3;k++)/*循环三次,输出一行共三个元素*/printf(“%4d”
,a[j][k]);printf(“\n”);/*输出一行后换行,再输出下一行*/}}输入:Inputarraya:123456↙输出:Outputarraya:123456对二维数组的输入输出多使用二层循环
结构来实现。外层循环处理各行,循环控制变量j作为数组元素的第一维下标;内层循环处理一行的各列元素,循环控制变量k作为元素的第二维下标。第7章数组2022/11/24C语言程序设计教程207.2.3二维数组的存储结构设有定义inta[2]
[3];floatb[3][2];a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]第0行第1行第1行B[0][0]b[0][1]b[1][0]b[1][1]b[2][0]b[2][1]第0行第2行系统为数组在内存中分配
一片连续的内存空间,将二维数组元素按行的顺序存储在所分配的内存区域。数组a与b的各元素的存储顺序如右图所示元素a[i][j]的地为:a+(i×n+j)×元素字节数第7章数组2022/11/24C语言程序设计教程21例7.5从键盘上输入9个整数,保存在二维数组中,按数组原来位置输出
第一行和第一列的所有元素。123456789第0行第1行第2行0列1列2列分析:1、输入数组。2、输出数组时要考虑不是所有数据都输出。思考:应该输出的数据在位置关系上有何特点?(关键!)第7章数组2022/11/24C语言程序设计教程22#include<stdio.h>main(){inti,
j,a[3][3];for(i=0;i<3;i++)/*输入数组*/for(j=0;j<3;j++){printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j];}for(i=0;i<3;i++)/*输出数组*/{for(j
=0;j<3;j++)if(i==1||j==1)printf("%-6d",a[i][j]);elseprintf("%-6c",''‟);printf(“\n”);}}24568运行结果第7章数组2022/11/24C语言程序设计教程237.2.4、二维数组的初
始化①分行给二维数组赋初值,每个花括号内的数据对应一行元素。例:inta[2][3]={{1,2,3},{2,3,4}};②将所有初值写在一个花括号内,顺序给各元素赋值。例:inta[2][3]={1,2,3,2,3,4};③只对部分元
素赋值,没有初值对应的元素赋0值或空字符(字符数组)。例:inta[2][3]={{1,2},{4}};④给全部元素赋初值或分行初始化时,可不指定第一维大小,其大小系统可根据初值数目与列数(第二维)自动确定;
但必须指定第二维的大小。例:inta[][3]={1,2,3,4,5,6};inta[][3]={{0},{0,5}};第一维的大小为多少?第7章数组2022/11/24C语言程序设计教程24例7.6用如下的3×3矩阵初始化
数组a[3][3],求矩阵的转置矩阵。123147456258789369转置矩阵:是将原矩阵元素按行列互换形成的矩阵方法1:转置矩阵是将原矩阵元素按行列互换形成的。123147456258789369方法
2:沿主对角线将对称位置元素互换即可。主对角线第7章数组2022/11/24C语言程序设计教程25程序如下:#include<stdio.h>main(){intj,k;inta[3][3]={1,2,3,4,5,6,7,8,9},b[3][3];for(j=0;j<3;j
++)for(k=0;k<3;k++)b[j][k]=a[k][j];for(j=0;j<3;j++){for(k=0;k<3;k++)printf(“%6d”,b[j][k]);printf(“\n”);}}第7章数组2022/11/24C语言程
序设计教程267.3数组的应用1.利用数组求fiboncaci数列的前n项例7.7求fiboncaci数列的前20项:f0=1f1=1┆fi=fi-1+fi-2(i=2,3,…n)将前20项输出到屏幕上,每行五项。分析:根据这个数列的组成规律:从第三项开始,每个数据项的值为
前两个数据项的和,采用递推方法来实现。可以用一个一维整型数组fib[20]来保存这个数列的前20项。第7章数组2022/11/24C语言程序设计教程27#include<stdio.h>#include<conio.h>main(){inti,fib[20];fib[0]=1;fib[1]=1;f
or(i=2;i<=19;i++)fib[i]=fib[i-1]+fib[i-2];printf("FibonaciNumbersare:\n");for(i=0;i<20;i++){if(i%5==0)printf("
\n");printf("%7d",fib[i]);}getch();}FibonaciNumbersare:11235813213455891442333776109871597258441816765第7章数组2022/11/24C语言程序设计教
程282.利用数组处理批量数据例7.8从键盘上输入若干学生(不超过100人)的成绩,计算平均成绩,并输出高于平均分的人数及成绩。输入成绩为负时结束。分析:根据题意,可以定义一个有100个元素的一维数组score,先将成绩输入到数组中,并计算平均成绩。然后,将数组中的成绩值
一个个与平均值比较,输出高于平均分的成绩。第7章数组2022/11/24C语言程序设计教程29程序如下:#include<stdio.h>main(){floatscore[100],ave,sum=0,x;in
ti,n=0,count;printf("Inputscore:");scanf("%f",&x);while(x>=0&&n<=100){sum+=x;score[n++]=x;/*输入的成绩保存在数组score中*/scanf("%f",&x);}ave
=sum/n;printf("average=%f\n",ave);/*输出平均分*/第7章数组2022/11/24C语言程序设计教程30/*接上页*/for(count=0,i=0;i<n;i++)if(score[
i]>ave){printf("%f\n",score[i]);/*输出高于平均分的成绩*/count++;/*统计高于平均分成绩的人数*/if(count%5==0)printf(“\n”);/*每行输出成绩达5个时换
行*/}printf("count=%d\n",count);/*输出高于平均分的人数*/}第7章数组2022/11/24C语言程序设计教程313.利用数组排序例7.9从键盘上输入10个整数,用选择法将其按由小到大的顺序排列并输出基本思想:(1
)从第0个位置到第9个位置中选择出最小的一个与第0个位置的数交换。(2)从第1个位置到第9个位置中选择出最小的一个与第1个位置的数交换。…(9)从第8个位置到第9个位置中选择出最小的一个与第8个位置的数交换。第7章数组202
2/11/24C语言程序设计教程32513393222812321①1135(3)9322283(1)2321②131393222852321③135932228132321④135832229132321⑤135892232132321⑥1
35891332222321⑦135891321222332⑧135891321222332⑨135891321222332输入数据:513393222812321排序过程如下:第7章数组2022/11/24C语言程序设计教程33#include<stdio.
h>main(){intI,j,t,a[10];for(I=0;I<10;I++)scanf(“%d”,&a[I]);/*输入数据到数组*/内循环:在(I,10)内选择最小数外循环:控制选择的次数for(I=0;I<9;I++)for(j=I+1;j
<10;j++)if(a[I]>a[j]){t=a[I];a[I]=a[j];a[j]=t;}printf(“\n”);for(I=0;I<10;I++)printf(“%6d”,a[I]);/*输出排
序后的数据*/}第7章数组2022/11/24C语言程序设计教程34分析:从程序可知:1.程序使用两重循环来实现排序。2.外循环控制排序趟数。若数组有N个元素,则共进行N-1趟排序。第一趟,I=0;第二趟,I=1,···3.内循环完成在[I,9]的区间内选择最小数。比较次
数随趟数增大而减少。4.在每一趟选择中,当后面元素较小时,马上进行交换。而这种交换是不必要的。事实上,只要记住较小元素的位置,即下标,在内循结束后做一次交换即可,这样可大大节省程序运行时间。第7章数组2022/11/24C语言程序设计教程35改进排序过程如下:513393
222812321①113393222852321②131393222852321③135932228132321④135832229132321⑤135892232132321⑥135891332222321⑦135891321222332⑧135891321222332⑨135
891321222332改进后的程序见下页,注意与前一程序比较第7章数组2022/11/24C语言程序设计教程36#include<stdio.h>main(){intI,j,k,a[10];for(I=0;I<10;I++)scanf(“%d”,&
a[I]);for(I=0;I<9;I++){k=I;for(j=I+1;j<10;j++)if(a[k]>a[j])k=j;if(k!=I){t=a[I];a[I]=a[k];a[k]=t;}}printf(“\n
”);for(I=0;I<10;I++)printf(“%6d”,a[I]);}内循环外循环K是最小元素之下标第7章数组2022/11/24C语言程序设计教程374.利用数组进行数据查找--折半查找法介绍适应
情况:在一批有序数据中查找某数基本思想:选定这批数中居中间位置的一个数与所查数比较,看是否为所找之数,若不是,利用数据的有序性,可以决定所找的数是在选定数之前还是在之后,从而很快可以将查找范围缩小一半。以同样的方法在选定的区域中进行查找,每次都会将查找范围缩小一半,从而
较快地找到目的数例7.10假设在数组a中的数据是按由小到大顺序排列的:-120616235680100110115,从键盘上输入一个数,判定该数是否在数组中,若在,输出所在序号;若不在,输出相应信息。第7章数组2022/11/24C语言程序设计教程38
查找过程如下:第一步:设low、mid和high三个变量,分别指示数列中的起始元素、中间元素与最后一个元素位置,其初始值为low=0,high=9,mid=4,判断mid指示的数是否为所求,mid指示的数是23,不是要找的80,须继续进行查找。[-12
0616235680100110115]↑low↑mid↑high第二步:确定新的查找区间。因为80大于23,所以查找范围可以缩小为23后面的数,新的查找区间为[5680100110115],low,mid,high分别指向新区间的开始、中间与最后一个
数。实际上high不变,将low(low=mid+1)指向56,mid(mid=(low+high)/2)指向100,还不是要找的80,仍须继续查找。-12061623[5680100110115]↑low↑mid↑high第7章数组202
2/11/24C语言程序设计教程39继续查找:第三步:上一步中,所找数80比mid指示的100小,可知新的查找区间为[5680],low不变,mid与high的值作相应修改。mid指示的数为56,还要继续查找。-12061623[5680]100110115↑low↑h
igh↑mid第四步:根据上一步的结果,80大于mid指示的数56,可确定新的查找区间为[80],此时,low与high都指向80,mid亦指向80,即找到了80,到此为止,查找过程完成。-1206162356[80]100110115↑low↑mid↑high若在查找过程中,出现
low>high的情况,则说明,序列中没有该数,亦结束查找过程。第7章数组2022/11/24C语言程序设计教程40程序为:#defineM10#include<stdio.h>main(){staticinta[M]={-12,0,6,16,23,56,80,100,110,
115};intn,low,mid,high,found;low=0;high=M-1;found=0;printf("Inputanumbertobesearched:");scanf("%d",&n);第7章数组2022/1
1/24C语言程序设计教程41while(low<=high){mid=(low+high)/2;if(n==a[mid]){found=1;break;}/*找到,结束循环*/elseif(n>a[mid])low=mid+1;elsehigh=mid-1;}if(found==1
)printf("Theindexof%dis%d",n,mid);elseprintf("Thereisnot%d",n);}输入:80↙输出:Theindexof80is6第7章数组2022/11/24C语言程序设计教程427.4字符数组与字符串7.4.1字符数组的定义与初始化1.字
符数组的定义字符数组:其元素类型为字符类型的数组,其定义与前面介绍的数组定义相同。例如:charstr[40];定义一个有40个元素的字符数组,每个元素相当于一个字符变量。第7章数组2022/11/24C语言程序设计教程432.字符数组的初始化方法:将字符常量以
逗号分隔写在花括号中①在定义字符数组时进行初始化charch[7]={„s‟,‟t‟,‟u‟,‟d‟,‟e‟,‟n‟,‟t‟};②在对全部元素指定初值时,可省写数组长度。charch[]={„s‟,‟t‟,‟u‟,‟d‟,‟e‟,‟n‟,‟t‟};第7章数组2022/11/24C语
言程序设计教程447.4.2字符串的概念及存储1.字符串的概念字符串:若干有效字符的序列;可包含转义字符、ASCⅡ码表中的字符;形式为:用双引号括起来的字符序列;例:"Iamastudent.","Hello""a
[5]=";"%f\n"。字符串的结束标志:‘\0‟。注:C语言无字符串类型,字符串是存放在字符数组中的。第7章数组2022/11/24C语言程序设计教程452.用字符串来直接初始化字符数组可直接把字符串写在花括号中来初始化字符数组.如:charch[9]={“student”};stu
dent\0几点说明:(1)字符串结束标志'\0'仅用于判断字符串是否结束,输出字符串时不会输出。(2)在对有确定大小的字符数组用字符串初始化时,数组长度应大于字符串长度。如:chars[7]={"student"};是错误的.(3)在初始化一个一维字符数组时,可以省略花括号。如:chars
[8]="student";(4)不能直接将字符串赋值给字符数组。下面的操作是错误的。s=”student”;系统将双撇号括起来的字符依次赋给字符数组的各个元素,并自动在末尾补上字符串结束标志字符'\0'。第7章数组2022/11/24C语言程
序设计教程467.4.3字符串的输入输出1.字符串的输出方法(1)用printf函数用printf输出字符串时,要用格式符‚%s”,输出时从数组的第一个字符开始逐个字符输出,直到遇到第一个‘\0‟为止。例:charst[15]=“Iamaboy!”printf(
“st=%s,%c,%c”,st,st[3],st[7]);输出结果:Iamaboy!mb第7章数组2022/11/24C语言程序设计教程47例7.11字符串输出示例#include<stdio.h>main(){staticcharstr[20]={”Howdoyoudo?”};int
k;printf(“%s”,str);/*输出str中的字符串*/for(k=0;str[k]!=’\0’;k++)printf(“%c”,str[k]);/*一个一个地输出字符*/}输出结果为:Howdoyoudo?Howdoyoudo?使用printf()函数的"%s"格式符来
输出字符串,从数组的第一个字符开始逐个输出,直到遇到第一个'\0'为止。使用”%c”格式时,用循环实现每个元素的输出。第7章数组2022/11/24C语言程序设计教程48(2)用puts函数输出字符串函数原型:intp
ut(char*str);调用格式:puts(str);函数功能:将字符数组str中包含的字符串或str所指示的字符串输出,同时将'\0'转换成换行符。例:charch[]="student";puts(ch);puts("Hello");将字符数组中包含的
字符串输出,然后再输出一个换行符。因此,用puts()输出一行,不必另加换行符'\n'。函数puts每次只能输出一个字符串,而printf可以输出几个:printf("%s%s",str1,str2);第7章数组2022/11/24C语言程序设计教程492.
字符串的输入(1)使用scanf函数输入字符串例:charst[15];sacnf(“%s”,st);但:scanf(“%s”,&st);是错误的;因为st就代表了该字符数组的首地址。注:输入时,以回车或空格作为结束标志
;即:用scanf输入的字符串中不能含有空格。若按如下方法输入:Howdoyoudo?↙执行语句:scanf("%s",st);则s的内容为:How\0使用格式字符串"%s"时会自动加上结束标志'\0'。第一个空格后的字符
没有输入st中。第7章数组2022/11/24C语言程序设计教程50(2)使用函数gets()输入字符函数原型:char*gets(char*str);调用格式:gets(str);str是一个字符数组或指针。函数功能:从键盘读入一个字符串到str中,并自动在末尾加字符串结束标志符’\0’。
输入字符串时以回车结束输入,这种方式可以读入含空格符的字符串如:chars[14];gets(s);若输入的字符串为:Howdoyoudo?↙则s的内容为:Howdoyoudo?\0第7章数组2022
/11/24C语言程序设计教程51例7.12字符串输入输出示例#include<stdio.h>main(){chars[20],s1[20];scanf(“%s”,s);printf(“%s\n”,s);scanf(“%s%s”,s,s1);printf(“s=
%s,s1=%s”,s,s1);puts(“\n”);gets(s);puts(s);}程序运行过程:Howdoyoudo?↙HowHowdoyoudo?↙s=How,s1=doHowdoyoudo?↙Howdoyoudo?第7章数组2022/11/24C
语言程序设计教程527.4.4字符处理函数C语言库函数中除了前面用到的库函数gets()与puts()之外,还提供了一些常用的库函数,其函数原型说明在string.h中1.字符串拷贝函数:strcpy()调用格式:strcpy(d_str,s_str);功能:将源字符串s_str复
制到目标字符数组d_str中。说明:d_str的长度应不小于s_str的长度,d_str必须写成数组名形式。s_str可以是字符串常量或字符数组名形式。例:chars1[10],s2[8]=“student”,s3[6];strcpy(s1,s2);strcpy(s3,"okey");将s2中的
"student"赋给s1(连同结束标志‘\0’),"okey"赋给s3;s2的值不变。注意:不能直接使用赋值语句来实现拷贝或赋值。如:s1=s2;s1=“student”;都是不允许的第7章数组2022/11/24C语言程序设计教程532.字符串连接函数strcat()调用格式:strc
at(d_str,s_str);功能:将s_str连同‘\0’连接到d_str的最后一个字符(非‘\0’字符)后面。结果放在d_str中。例:chars1[14]=“Iama”};chars2[5]=“boy.”;strcat(s1,s2);连接前:s1:s2:连接后:s1Iama\0boy
.\0Iamaboy.\0第7章数组2022/11/24C语言程序设计教程543.字符串比较函数strcmp()调用格式:strcmp(str1,str2);功能:若str1=str2,则函数返回值为0;若str1>str2,则函数返回值为正整数;若str1<str2,则函
数值返回为负整数。比较规则:●两个字符串自左至右逐个字符比较,直到出现不同字符或遇到‘\0’为止。●如字符全部相同,则两个字符串相等;若出现不同字符,则遇到的第一对不同字符的ASCⅡ大者为大。比较两字符串是否相等一般用以下形式
:if(strcmp(str1,str2)==0){…};而if(str1==str2){…};是错误的。第7章数组2022/11/24C语言程序设计教程554.字符长度函数strlen()调用格式:strlen(字符串);功能:求字符串的实际长度即所含字符个数(不包括'\
0')。例:charstr[10]=“student”;intlength,strl;length=strlen(str);(=7)strl=strlen(“verygood”);(=9)结果:length=7strl=
9第7章数组2022/11/24C语言程序设计教程56例7.13从键盘上输入两个字符串,若不相等,将短的字符串连接到长的字符串的末尾并输出。#include<stdio,h>#include<string.h>main(){intlen1,len2chars1[80],s2[80];gets
(s1);gets(s2);if(strcmp(s1,s2)!=0){if(strlen(s1)>strlen(s2)){strcat(s1,s2);puts(s1);}else{strcat(s2,s1);puts(s2);}}输入:you↙Thank↙输出:Tha
nkyou第7章数组2022/11/24C语言程序设计教程577.5数组作为函数的参数数组作为函数参数主要有两种情况:数组元素作为函数的实参:这种情况与普通变量作实参一样,是将数组元素的值传给形参。形参的变化不会影响实参数组
元素,我们称这种参数传递方式为“值传递”。数组名作实参:要求函数形参是相同类型的数组或指针,这种方式是把实参数组的起始地址传给形参数组,形参数组的改变也是对实参数组的改变,称这种参数传递方式为“地址传递”。第7章数组202
2/11/24C语言程序设计教程581.数组元素做函数实参数组元素作为函数实参与简单变量相同,是将元素的值传给函数形参,是单向值传递;函数形参使用简单变量。例7.13从键盘上输入两个字符串,不用字符串函数strcmp()比较两者的大小分析
:(1)输入两个字符串,分别存放在str1与str2中;(2)设计函数compstr()比较两字符,返回ASCII码之差,赋给主函数的变量flag;(3)用do……while循环依次比较两个字符串的对应字符,结束的条件是两字符串至少有一个结束,或者比较字符不相等。(4)当循环结束时flag的
值为0或为第一个不相等的字符的ASCII码值之差,由此可以判断出字符串的大小。第7章数组2022/11/24C语言程序设计教程59程序如下:#include<stdio.h>main(){inti,flag;intcompstr(char,char);charstr1[80],str2[8
0];gets(str1);gets(str2);i=0;do{flag=compstr(str1[i],str2[i]);/*数组元素作实参*/i++;}while((str1[i]!='\0')&&(str2[i]!='\0')&&(flag==0));
/*只要有一个字符串到了末尾比较结束*/第7章数组2022/11/24C语言程序设计教程60if(flag==0)printf("%s=%s",str1,str2);elseif(flag>0)printf(
"%s>%s",str1,str2);elseprintf("%s<%s",str1,str2);}intcompstr(charc1,charc2){intt;t=c1-c2;returnt;}输入:verywell↙verygood↙输出:ver
ywell>verygood第7章数组2022/11/24C语言程序设计教程612、数组名作函数参数数组名作函数参数时形参与实参都应使用数组名,且分别在被调用函数与主调函数中的说明。实参与形参类型要一致。实
参数组与形参数组大小可以不一致,形参数组可不指定大小。C编译程序不检查形参数组的大小。(1)在一维形参数组名后面可只跟一对空方括号。为在被调用函数中处理数组元素的需要,可另设一参数来传递数组元素个数。如:intlenst
r(charstr1[],intk);/*k为要处理的字符数*/(2)对多维数组而言,形参的第一维可不指定,但其它维必须指定。如:chargrade(floatscore[][4],intk);k为数组行数第7章数组2022/
11/24C语言程序设计教程62数组名做函数参数时是把实参数组的起始地址传给了形参数组,即:形参数组与实参数组对应同一段内存单元。利用这个特点,可用数组返回多个值。例7.13用冒泡法将10个数按由小到大排序冒泡法的基本思想:相邻两数比较,若前面数
大,则两数交换位置,直至最后一个元素被处理,最大的元素就“沉”到最下面,即在最后一个元素位置。这样,如有n个元素,共进行n-1轮,每轮让剩余元素中最大的元素“沉”到下面,从而完成排序。事实上,n-1轮是最多的排序轮数,只要在某一轮排序中没有进行元素交换,说明已排好序,可以提前退出外循环,结束排序。
第7章数组2022/11/24C语言程序设计教程63程序如下:#include<stdio.h>#defineN80main(){inta[N];inti,m;voidsort(intb[],intk);voidprint(intb[],intk);printf
("\nInputm(<80):");scanf("%d",&m);/*输入要排序的元素的个数*/for(i=0;i<m;i++)scanf("%d",&a[i]);/*输入m个元素到数组a中*/sort(a,m);
print(a,m);}第7章数组2022/11/24C语言程序设计教程64voidsort(intb[],intk){inti,j,t,flag;for(j=0;j<k-1;j++){flag=0;fo
r(i=0;i<k-j-1;i++)if(b[i]>b[i+1]){t=b[i];/*相邻元素交换位置*/b[i]=b[i+1];b[i+1]=t;flag=1;/*有元素交换,标志置1*/}if(flag==0)break;/*没有交换元素,结束循环*/}}第
7章数组2022/11/24C语言程序设计教程65voidprint(intb[],intk){inti;for(i=0;i<k;i++){if(i%4==0)putchar(’\n’);printf("%-6d",b[i]);}}输入:Inputm(<80):8↙120–40815
344-24↙输出:-24–40120445381第7章数组2022/11/24C语言程序设计教程66例7.14求数组元素的最大值与最小值,并把它们分别放在第一、第二个元素中#include<stdio.h>maxmin(intb[
][4]){intI,j,max,min;max=min=b[0][0];for(I=0;I<3;I++)for(j=0;j<4;j++)if(b[I][j]>max)max=b[I][j];elseif(b[I][j]<min)m
in=b[I][j];b[0][0]=max;b[0][1]=min;return(max);}main(){inta[3][4]={1,0,-32,21,10,4,4,4,345,2,12,0};p
rintf(“max=%d\n”,maxmin(a));printf(“max=%d”,a[0][0]);printf(“min=%d”,a[0][1]);}第7章数组2022/11/24C语言程序设计
教程677.6程序举例例7.15从键盘上输入一个正整数,判断其是否为回文数。所谓回文数是顺读与反读都一样的数,如:12321,23455432都是回文数。解题的基本思想:将数n按位对10求模,求出每一位数字并按顺序保存在数组digit中;根据回文数的特点,将分解出的数字序列的左、右两端
数字两两比较,并向中间靠拢;用i,k两个变量记录两端数字序号,若直到位置重叠时各位数字都相等,则为回文数,否则,不是。第7章数组2022/11/24C语言程序设计教程68程序如下:#include“stdio.h”#incl
ude"string.h"main(){inti,k,digit[10];longn,m;puts("输入一个正整数:");scanf("%ld",&n);m=n;k=0;do{digit[k++]=m%10;m/
=10;}while(m!=0);k--;第7章数组2022/11/24C语言程序设计教程69接上页:for(i=0;i<k;i++,k--)if(digit[i]!=digit[k])break;/*不相等,则不是回文数,退出循环*/if(i<k)printf(
"%ld不是一个回文数",n);elseprintf("%ld是一个回文数",n);}输入:134431输出:134431是一个回文数第7章数组2022/11/24C语言程序设计教程70#include<stdio.h>main(0{charc,string[
81];intI,num=,word=0;gets(string);for(I=0;(c=sting[I])!=„\0‟;I++)if(c==„‟)word=0;elseif(word==0){word=1;num++;}pr
intf(“Thereare%dwordsintheline.\n”,num);}例7.16输入一行字符,统计其中有多少个单词,单词之间用空格隔开。运行情况:输入:Iamaboy.输出:Thereare4wor
dsintheline.第7章数组2022/11/24C语言程序设计教程71再见