《c语言程序设计第7章.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计第7章.ppt(73页珍藏版)》请在三一办公上搜索。
1、第七章 数 组,本章要点:1.建立数组的概念;2.掌握一维数组和多维数组的定义;3.掌握数组的初始化和引用;4.掌握字符串与字符数组.5.掌握用数组进行编程的技术。,数组的概念,1.问题的提出 假设我们将26个数分别存放在26个变量中,要计算26个变量的和,如何做?将26个变量逐个加起来?能否使用循环语句?for(sum=0,i=0;i26;i+)sum=sum+ai;正确吗?,2.使用数组解决问题定义一个变量,包含26个数据,称为数组变量。main()int i,sum=0,a26;for(i=0;i 26;i+)scanf(“%d”,一、回顾我们前面使用的数据类型都属于基本类型(整型、实型
2、、字符型)其存储特点是:每个变量单独存储,亦称为简单变量如:x=a;y1=0;y2=-2*x;各变量之间独立存放,无任何联系。,二、构造类型的基本概念 在C语言中,变量类型除了前面已介绍的几种基本类型职位,还有另外一些复杂类型,合称为构造类型。构造类型:有基本类型构造而成的。(如数组、结构体、共同体、枚举型)构造类型的每一个分量是一个变量,它就可以是一个简单类型或构造类型。构造类型的分量使用方法与简单变量相同。构造类型的分量占用相邻的存储空间。对于构造类型的变量来说,重点是访问其分量的方法。,三、数组概念 计算机处理数据时,经常出现数据是用某种有序的形式进行组织的情况。例如 随温度而改变的实验
3、数据 按学号排列的成绩表 这些数据具有共同的特征:1)都是由若干个分量组成的 2)数据的诸分量都是统一类型(可取任何数据类型)3)这些分量是按一定的顺序排列的 数组:一组具有相同数据类型的数据的有序的集合。,线性方程组的mn系数矩阵,数组的基本概念:,1、数组:一组具有相同数据类型的数据的有序的集合。2、数组元素:数组中的元素。数组中的每一个数组元素具有相同的名称,不同的下标,可以作为单个变量使用。在定义一个数组后,在内存中使用一片连续的空间依次存放数组的各个元素。,3、数组的下标:是数组元素的位置的一个索引或指示。4、数组的维数:数组元素下标的个数。根据数组的维数可以将数组分为一维、二维、三
4、维、多维数组。数组是同类型变量的集合,共用一个名字,用下标区分;每个变量称作数组元素;按下标递增顺序在内存中存放;使用几个下标区分变量,就称是几维数组。一维数组与数学中的数列对应,二维数组与矩阵对应。很少使用三维及三维以上的数组。,7.1 一位数组的定义和引用7.1.1一维数组的定义定义方式:类型说明符 数组名 常量表达式例:int a10表示数组名为a,此数组有10个元素每个元素都是整数说明:(1)数组名定义规则和变量名相同;(2)数组名的常量表达式用方括弧而不是圆括弧括起来(3)常量表达式表示元素的个数,即数组长度。例如:a10表示a数组共有10个元素,下标从0开始分别为:a0,a1,a2
5、,a3,a4,a5,a6,a7,a8,a9 注意:没有a10(4)常量表达式中可以包括常量和符号常量,不能包含 变量,即数组的大小不能依赖于程序过程中变量的值。,一维数组的存储c编译程序是怎样管理一个数组呢?用连续的内存单元存放各个元素如:int a5;其内存存储为:保存数组所需内存量与数组元素的基本类型和数组大小有关如上例:总字节数=2*5=107.1.2 一维数组元素的引用 C语言规定,只能逐个引用数组元素而不能一次引用整个数组。数组元素的表示形式为:数组名下标其中下标可以是整型常量或整型表达式。例如:a0=a5+a7-a2*3,例7.1 数组元素的引用main()int i,a10;fo
6、r(i=0;i=0;i-)printf(“%d”,ai);本例使a0到a9的值为09,然后按逆序输出。,7.1.3 一维数组的初始化,1、在定义数组时对数组元素赋以初值方法:将初值依次写在花括号 内。例如:int a4=2,4,6,8,其中:a0=2,a1=4,a2=6,a3=8,(1)可以只给一部分元素赋值。例如:int a10=0,1,2,3,4;其中:a0=0,a1=1,a2=2,a3=3,a4=4,a5=0,a6=0,a7=0,a8=0,a9=0(2)如果想使一个数组中全部元素值为0,可以写成:int a10=0,0,0,0,0,0,0,0,0,0不能写成:int a10=0*10,注
7、意:定义成static数组,不赋初值,系统会自动将全部元素赋以0值。(此处后面有介绍),(3)在对全部数组元素赋初值时,可以不指定数组长度。例如:int a5=0,1,2,3,4可以写成:int a=0,1,2,3,4但是如果被定义的数组长度与提供初值的个数不相同时,则数组长度不能省略。例如:int a10=0,1,2,3,4;只初始化了前5个元素,后5个元素为0。,例7-2:数组的初始化#include void main()int a5=1,2,3,4,5;int b5=1,2,3;int c=1,2,3,4,5;int e5;int i;for(i=0;i5;i+)printf(%d”,
8、ai);printf(“n”);for(i=0;i5;i+)printf(%d”,bi);printf(“n”);for(i=0;i5;i+)printf(%d”,ci);printf(“n”);for(i=0;i5;i+)printf(%d”,ei);printf(“n”);,1234512300123450000-32575,例6.7 求Fibonacci数列的40个数。Fibonacci数列为:,1,1,2,3,5,8,13,7.1.4 一维数组程序举例,例7.2 用数组来处理求Fibonacci数列问题。main()int i;int f20=1,1;for(i=2;i 20;i+)f
9、i=fi-2+fi-1;for(i=0;i 20;i+)if(i%5=0)printf(“n”);printf(“%12d”,fi);,fi=fi-2+fi-1i=220,例3 统计全班某门功课期末考试的平均分数和最高分数(设全班人数为30)#define N 30main()int i,sum=0,high=0,score;float average;printf(“input everyones scoren”);for(i=0,ihigh)high=score;average=(float)sum/N;printf(“average=%fn”,average);printf(“highe
10、st=%dn”,high);,用简单变量实现,分析:定义一个整型数组score30放全班每位同学的成绩用for循环读入分数,并求出总分和平均分定义变量high存放当前得到的最高分每得到一个分数都要与high的值比较,若比high大,则放入high中,这样最后high值一定是最高分,用数组实现#define N 30main()int i,sum=0,high,score30;float average;printf(“input everyones scoren”);for(i=0,ihigh)high=scorei;average=(float)sum/N;printf(“average=%
11、fn”,average);printf(“highest=%dn”,high);,for(high=score0,i=0;ihigh)high=scorei;,用数组实现#define N 30main()int i,sum=0,high,score30;float average;printf(“input everyones scoren”);for(i=0,ihigh)high=scorei;average=(float)sum/N;printf(“average=%fn”,average);printf(“highest=%dn”,high);,补充:找出n个数中超过平均数的那些数,例
12、7.5 统计选票,设候选人有8人,其编号为18,约定0为统计结束标志分析:若用简单变量做,则需8个变量分别存放8个候选人的票数 读入一张选票,则进行判断,累加即8条这样的语句。,main()int x,n1,n2,n3,n4,n5,n6,n7,n8;printf(“input number:”);scanf(“%d”,输出候选人选票,用数组统计定义一个数组n9 若:n1元素中存放1号的票数 n2元素中存放2号的票数 n3元素中存放3号的票数 n8元素中存放8号的票数可发现数组元素的下标与要统计的候选人的编号想吻合,故可直接采用:nx=nx+1,main()static int x,n9 pri
13、ntf(“input number:”);scanf(“%d”,由此可知:利用数组作为一组计数器,通过将统计对象的值与存放该统计值的下标挂起钩来,这样既可以使程序简洁,又提高效率,例7.3 用冒泡法对10个数排序(由小到大)。冒泡法:对将进行排序的数,相邻两个数进行比较,如果满足次序要求,保持两者位置不变,否则交换位置,将小的调到前面;,第一次比较,第二次比较,第三次比较,第四次比较,第五次比较,第一次冒泡排序的结果,n个数经过一次冒泡排序后,最大数(最小数)将被交换到最后位置,但前面n-1数仍然无序。下一次排序最后一位不必参加排序。,第一次冒泡排序,算法结论:如果有n个数参加冒泡排序,则要进
14、行n-1趟比较。在第j趟比较中有n-j+1个数参加排序,(因为已有j-1个数排好序)要进行n-j次两两比较。本例中第2趟有5个数参加排序,进行了4次比较。,第一次比较,第二次比较,第三次比较,第四次比较,第二次冒泡排序的结果,第二次冒泡排序,main()int a10;int i,j,t;printf(“input 10 numbers:n”);for(i=0;i ai+1)t=ai;ai=ai+1;ai+1=t;printf(“the sorted numbers:n”);for(i=0;i 10;i+)printf(“%d”,ai);,由前面分析可知;要排序的数必须放入数组中用二重循环控制
15、排序过程 外循环j控制比较趟数(n-1)趟 内循环i控制一趟比较的次数(n-j)次,7.2 二维数组的定义和引用,7.2.1 二维数组的定义二维数组定义的一般形式:类型说明符 数组名 常量表达式 常量表达式 例:float a34,b510;此句定义了一个名为a的3行4列的实数数组和一个名为b的5行10列的实数的数组。注意:不能写成:float a3,4,b5,10;在C语言中,可以把二维数组看成特殊的一维数组,即把把一行看成一个元素,这些特殊的元素组成以一个特殊的一维数组。比如:我们可以把二维数组a34看成一个由 a0,a1,a2元素组成的数组,每个元素又由四个元素组成,例如a0由a00,a
16、01,a02,a03组成。,二维数组的存放顺序:在C语言中,二维数组中的元素是按行存放的。例如:整型数组a23的存放形式为,二维数组是多维数组的基础。其它多维数组的定义和元素存放形式类似二维数组。,2000,2002,2004,2006,2008,2010,数组元素的实际存放顺序是:右边下标比左边下标变化的快,a34,7.2.2 二维数组的引用,二维数组的元素的表示形式为:数组名 下标 下标 例如:a23表示的是a二维数组的第3行第4列的元素。此处我们要特别注意下标不要超界。注意:1)下标可以是整型表达式,如a2-12*2-1;b12=a13/2 2)不能写成a2,3的形式;,7.2.3 二维
17、数组的初始化,(1)按行给二维数组赋初值。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;(2)可以将所有数据写在一个花扩弧内,系统将按数组排 列顺序对各元素赋初值。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;(3)可以对部分元素赋初值。例如:int a34=1,2,3 以存放顺序赋值 int a34=1,5,9;以行赋值 它的作用是只对每行第一列赋初值,其他元素自动为0,结果为:,也可以对各行中的某一元素赋初值,其他元素自动为0:int a34=1,0,6,0,0,11;结果为:,(4)如果对全部元素都赋初值,则定义数组时对第一维的
18、长度可以不指定,但第二维的长度不能省。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;可以写成:int a 4=1,2,3,4,5,6,7,8,9,10,11,12;,例7.4 二维数组的输入和输出一般而为数组的处理用二重循环来实现,用循环变量的值控制数组元素的下标,#include void main()int a33,i,j;for(i=0;i=2;i+)for(j=0;j=2;j+)scanf(“%d”,for(i=0;i=2;i+)for(j=0;j=2;j+)scanf(“%d”,for(i=0;i=2;i+)for(j=0;j=2;j+)if(i+j)%
19、2)printf(“%5d”,aij);,for(i=0;i=2;i+)printf(“%5d”,aii);,1 4 72 5 83 6 9,1 2 34 5 67 8 9,2 4 6 8,7.2.4 二维数组程序举例,例7.4 将二维数组 行和列元素互换,存到另一个二 维数组中。(转置),算法:1)a数组初始化(或赋值)并输出2)用二重循环进行转置 bji=aij2)输出b数组,例7.4 将二维数组 行和列元素互换,存到另一个二 维数组中。,7.2.4 二维数组程序举例,main()int a23=1,2,3,4,5,6;int b32,i,j;printf(“array a:n”);for
20、(i=0;i=1;i+)for(j=0;j=2;j+)printf(“%5d”,aij);bji=aij;printf(“n”);,printf(“array b:n”);for(i=0;i=2;i+)for(j=0;j=1;j+)printf(“%5d”,bij);printf(“n”);,对于n*n的二维数组,可以在同一个数组进行矩阵转置操作,转置,思路:对称于主对角线的元素两两交换,#define N 3main()int aNN=1,2,3,4,5,6,7,8,9;int i,j,t;for(i=0;i N;i+)for(j=0;j i;j+)t=aij;aij=aji;aji=t;f
21、or(i=0;i N;i+)for(j=0;j N;j+)printf(“%5d”,aij);printf(“n”);,例7.5 有一个3X4的矩阵,要求编程求出其中最大的那个元素的值,以及其所在的行号和列号;,main()int i,j,row=0,colum=0,max;int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;max=a00;for(i=0;i max)max=aij;row=i;colum=j;printf(“max=%d,row=%d,colum=%dn”,max,row,colum);,7.3 字符数组,7.3.1 字符数组的定义 在c语言中,没有专门
22、的字符串变量,而是将字符串存入字符数组处理。即用一个一维数组来存放一个字符串,每一个元素存放一个字符。字符数组是数组的一个特殊情况,但它的定义方法与上述介绍的类似,引用方法可以与上述介绍的同,也有其独特的引用方法。,定义形式:char 数组名常量表达式常量表达式;如:char c5;c0=h;c1=a;c2=p;c3=p;c4=y;在C语言中,字符型和整型是互相通用的,因此上述定义句可以写为:int c5;c0=h;c1=a;c2=p;c3=p;c4=y;,字符数组的初始化1.用字符常量赋初值(即;逐个字符赋给数组中的各元素)char c5=C,h,i,n,a;char c10=C,h,i,n
23、,a;,注:0表示空字符null(ASCII为0),char diamond55=,*,*,*,*,*,*,*,*,定义和初始化一个二维字符数组,7.3.4 字符串和字符结束标志在C语言中,将字符串作为字符数组来处理。为了测定字符串的实际长度C语言规定了一个“字符结束标志”,以字符0代表,由它前面的字符组成字符串。系统字符串常量也自动加一个0作为结束符。例如“C Program”共有9个字符,但在内存中占10个字节,最后一个字节0是由系统自动加上的。结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志,2.使用字符串常量给字符数组赋初值例:char c6=“store”;或 char
24、 c6=“store”;或 char c=“store”;结果注:以字符串方式赋值时,必须保证数组元素个数字符个数+1(字符串后面自动加上一个0)上述字符串占用的空间长度是6而不是5上述的初始化与下面的初始化等价。char c=s,t,o,r,0;而不与下面的等价:char c=s,t,o,r;前者的长度为6,后者的长度为5。,需要说明的是:字符数组并不要求它的最后一个字符为0,甚至可以不包含0.像以下这样写完全是合法的.char c5=C,h,i,n,a;是否需要加上0,完全根据需要决定。系统对字符串常量自动加上一个0,因此,为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的
25、处理,在字符数组也常常人为加上一个0,如:char c6=C,h,i,n,a,0;,例7-12 字符数组初始化#includevoid main()char a7=a,p,p,l,e;char b7=“apple”;char c7;static char x7;int i;for(i=0;i=6;i+)printf(“%6d%6d%6d%6dn”,ai,bi,ci,xi);,由此可知:数组初始化后,剩余元素均为0数组未初始化,则static 数组元素的值为0,否则元素值是随机的,例7-12 用一个字符串给字符数组赋初值,然后打印出各元素的ASCII码#includevoid main()cha
26、r str=“This is a string!”;int i=0;while(stri!=0)printf(“%c=%dn”,stri,stri);+i;printf(“%c=%dn”,stri,stri);,注意:用字符串给字符数组赋初值,系统自动加上空字符0 空格字符,ASII码320空字符,ASII码0两者皆无法打印出来,7.3.1 字符数组的引用与输入输出对于字符数组,在程序中既可以逐个引用字符串中的单个字符(数组元素)也可以一次引用整个字符串(数组)1.逐个字符数组元素输入输出:用%c格式符描述 例:scanf(“%c”,main()char c10I,a,m,a,b,o,y in
27、t i;for(i=0;i 10;i+)printf(“%c”,ci);printf(“n”);,注意:1.输出字符不包括结束符0;2.用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是字符元素名。比如不能写成:printf(“%s”,c0);正确写法为:printf(“%s”,c);3.如果数组长度大于字符串实际长度,也只输出到遇0 结束。4.如果一个字符数组中含一个以上的0,则遇到第一个0 输出就结束。,2将整个字符串一次输入或输出(%s格式符),输出字符串例如:char c=China;printf(%s,c);输出结果为:China,C是数组首地址,输出时遇
28、0 为止,再例如:char c=pascal0basic;printf(%s,c);输出结果为:pascal,printf(%s,c0);,输入字符串例如:char c10;scanf(%s,c);输入:beijing,三个字符串用空格隔开,分别赋给str1、str2、str3三个数组。,再例如:char str110,str210,str310;scanf(%s%s%s,str1,str2,str3);输入:pascal basic c,注意:(1)为数组赋值时,如:char c10;c=“beijing”;因为数组名c是数组首地址,是常量!char c10;c=beijing;(2)sca
29、nf函数中的输入项如果是字符数组名,不要再加地址符 输出结果为首地址值。,(3)对某数组c char c14;scanf(“%s”,c);如果输入以下13个字符 Howareyour?实际上并不是把这13个字符加上结束符“0”放到数组c中,而只将空格前的字符“How”送到c中,由于把“How”作为一个字符串处理,因此在其后加上结束符“0”,其在内存中状态为:,7.3.6 字符串处理函数,在C的函数库中提供了一些用来处理字符串的函数,使用方便。几乎所有版本的C都提供这些函数。下面是几种常用的函数。1.puts(字符数组/字符串)作用:将一个字符串(以0结束的字符序列)输出到终端,输完自动换行。p
30、uts函数用的不多。puts函数输出字符串中可以包含转义字符.即puts(str);与 printf(“%sn”,str);等价或 puts(“OK”);与printf(“%sn”,“OK”);或 printf(“OK!”)等价,#include#include,2.gets(字符数组),作用:从终端输入一个字符串(以回车结束)到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数:gets(str)从键盘输入:Computer将输入的字符串”Computer”送给字符数组str(请注意送给数组的共有9个字符,而不是8个字符),函数值为字符数组str的起始地址。注意:用
31、puts和gets函数只能输入或输出一个字符串,,例:#include#includevoid main()char s100;printf(“请输入一个字符串:n”);gets(s);printf(“输入的字符串是:n”);puts(s),请输入一个字符串:this is a apple.输入的字符串是:this is a apple.,puts(gets(s);,7.3.1 字符数组的引用与输入输出对于字符数组,在程序中既可以逐个引用字符串中的单个字符(数组元素)也可以一次引用整个字符串(数组)1.逐个字符数组元素输入输出:用%c格式符描述 例:scanf(“%c”,复习,2将整个字符串一
32、次输入或输出(%s格式符),输出字符串例如:char c=China;printf(%s,c);输出结果为:China,C是数组首地址,printf(%s,c0);,输入字符串例如:char c8;scanf(%s,c);输入:beijing China 注意:输入时遇到空格或回车认为字 符串结束。,复习,1字符串输出函数puts(),调用格式:puts(str)功能:输出一个字符串,输出后自动换行。说明:str可以是字符数组名或字符串常量。,7.3.4 字符串处理函数,2字符串输入函数gets(),调用格式:gets(str)功能:从终端读入一个字符串存入str数组中,并且得到一个函数值,该
33、函数值是str数组的首地址。说明:str是数组名。注意:读入数据时遇到回车认为字符串结束char c;gets(c)输入:hello cc,复习,请选出以下程序的输出结果()。#includemain()char s110,s210,s310,s410;scanf(“%s%s”,s1,s2);gets(s3);gets(s4);puts(s1);puts(s2);puts(s3);puts(s4);输入数据如下:(此处代表回车符)aaaa bbbbcccc ddddA)aaaaB)aaaaC)aaaaD)aaaa bbbb bbbb bbbb bbbb cccc cccc cccc dddd
34、dddd cccc dddd dddd eeee,复习,3.strcat(字符数组1,字符数组2)作用是:连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值字符数组1的地址。例如:char str130=“Peoples Repubnic of”;char str2=“China”;printf(%s,strcat(str1,str2);输出:Peoples Republic of China 连接前后的状况见下图所示。,说明:(1)字符数组1必须足够大,以便容纳连接后的新字符串。(2)连接前两个字符串的后面都有一个0,连接时将字符串1后面
35、的0取消,只在新串最后保留一个0。,例::#include#includevoid main()char str140,str210,str310;gets(str1);gets(str2);gets(str3);strcat(str1,str2);strcat(str1,str3);puts(str1);,思考:以下程序是正确的吗?char c;c=A+B;那么,下面的程序呢?char c10;c=“A”+“B”;,注意:1.数组必须足够大 2.gets函数遇回车符结束输入,this is astringok endthis is astringok end,4.strcpy(字符数组1,字
36、符串2)作用:将字符串2复制到字符数组1中去,例如:char str110,str2=“China”);strcpy(strl,str2);执行后,str1的状态如图所示。说明:(1)字符数组1必须定义得足够大长度不应小于字符串2的长度;(2)“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如:strcpy(str1,“China”);(3)复制时连同字符串后面的0一起复制到字符数组1中。(4)不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。下面都是不合法的:str=“China”;str表示一个地址 str1=str2;而只能
37、用strcpy函数处理。用赋值语句只能将一个字符赋给一个字符型变量或字符 数组元素。,str0=C;str1=h;strcpy(str,“China”);,strcpy(strl,str2);,例::#include#includevoid main()char s140,s240;printf(“请输入一个字符串s1:”);scanf(“%s”,s1);/*gets(s);*/strcpy(s2,s1);printf(“复制的s2字符串内容:”);printf(“%sn”,s2);,请输入一个字符串s1:this is a string复制的s2字符串内容:this/*this is a s
38、tring*,5.strcmp(字符串1,字符串2)作用:比较字符串1和字符串2。例如:strcmp(str1,str2);strcmp(”China”,”Korea”);strcmp(str1,“Beijing”);字符串比较规则:对两个字符串自左至右逐个字符相比。按ASCII码值大小比较,直到出现不同的字符或遇到“0“为止。如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。例如:“A”字符串2,函数值为一正整数。(3)如果字符串1字符串2,函数值为一负整数。,注意:对两个字符串比较,不能用以下形式 if(str1=str2)printf(“yes”);而
39、只能用 if(strcmp(str1,str2)=0)printf(“yes”);6.strlen(字符数组)作用:测试字符串长度的函数函数的值为字符串中的实际长度,不包括0在内。如:char str10=“china”;printf(“%d”,strlen(str);输出结果不是10也不是6,而是5。也可以直接测字符串的长度,如 strlen(“china”);7.strlwr(字符串)作用是将字符串中的大写字母换成小写字母。8.strupr(字符串)作用是将字符串中的小写字母换成大写字母。,例:#include#includevoid main()char s140,s240;int i;
40、pringtf(“输入字符串s1:”);gets(s1);pringtf(“输入字符串s2:”);gets(s2);i=strcm(s1,s2);if(i=0)pringtf(“输入两个字符串相等。”)else if(i0)printf(“输入的字符串s1大于s2.“)else printf(“输入的字符串s1小于s2.“),输入字符串s1:abcDefg输入字符串s2:abcd,输入的字符串s1小于s2.,#include#includevoid main()char s40;int i;pringtf(“enter a string!n”);gets(s);i=strlen(s);prin
41、tf(“string length=%dn:”,i);for(;i=0;i-)putchar(si);puts(“”);,强调:库函数并非C语言本身的组成部分,而是人们为使用方便而编写、提供大家使用的公共函数时系统捉供的函数 数量和函数名、函数功能都不尽相同,使用时要小心,心要时查一下库函数手册。当然,有一些基本的函数。(包括函数名和函数功能)不同的系统所提供的是相同的,这就为程序的通用性提供了基础。,7.3.7字符数组应用举例,例7.8输入一行符,统计其中有多少个单词,单词之间用空格分隔开设:字符串用str100存放,单词计数器为num算法(1)输入一个字符串(2)找第一个非空字符(3)计数
42、(4)跳过本单词,即寻找空格 或0(5)未结束则跳(2)(6)打印单词个数,#include#includevoid main()int i=0,num=0;char str100,c;gets(str);do while(c=stri)=)i+;if(c!=0)num+;while(c=stri)!=,7.3.7字符数组应用举例,例7.8输入一行符,统计其中有多少个单词,单词之间用空格分隔开解题的思路:单词间的数目可以由空格出现的次数决定(连续的空格做为出现一次空格;开头的空格不统计在内)如果测出某一个字符为非空格,而它的前面的字符是空格,则表示“新的单词开始”,此时使num(单词数)累加1
43、如果当前字符为非空格而其前面的字符也是非空格,则意味着仍然是原来那个单词的继续,num不应再累加1前面一个字符是否空格可以从一个标志变量word的值看出,若word0,则表示前一个字符是空格;如果word=1,则意味前一个字符为非空格。,程序中变量 i 作为循环变量,num用来统计单词个数,word作为单词的标志,算法见下图:,#include main()char string100;int i,num=0,word=0;char c;gets(string);for(i=0;(c=stringi)!=0;i+)if(c=)word=0;else if(word=0)word=1;num+;
44、printf(“There are%d words in the line.n”,num);,例7.9 有3个字符串,要求找出其中最大者。今设一个二维的字符数组str,大小为3X20,即有3行20列,每一行呵以容纳20个.可以把str0,str1,str2看作3个一维字符数组,可以把它们如同一维数组那样进行处理,可以用gets函数分别读入。经过二次比较,可以得到最大者,把它放入一维数组string中。main()char string20;char str320;int i;for(i=0;i 0)strcpy(string,str0);else strcpy(string,str1);if(
45、strcmp(str2,string)0)strcpy(string,str2);printf(“n the largest string is:n%sn”,string);,例:编程序实现strcat的功能算法:1)输入str1和str22)找到str1的结束标志03)将str2的字符逐个放入str1当前位置开始的地方,#include#includevoid main()char str180,str280;int i=0,j=0;printf(“输入两个字符串s1:”);gets(str1);gets(str2);while(str1i!=0)i+;while(str1i+=str2j+!=0)printf(“%sn”,str1);,例7-22选修某课程的学生共10人,按成绩高低输出学生名单(用比较法排序)这是一个排序问题,排序依据为成绩排序时学生姓名也要同时调整次序学生姓名可使用二维数组存储,5 21 8,#include#includevoid main()int i,j;char name1010,stmp10;float score10,tmp;for(i=0;i10;i+)scanf(“%s%f”,namei,