第4章数组和字符串

上传人:夏** 文档编号:571506729 上传时间:2024-08-11 格式:PPT 页数:93 大小:1.70MB
返回 下载 相关 举报
第4章数组和字符串_第1页
第1页 / 共93页
第4章数组和字符串_第2页
第2页 / 共93页
第4章数组和字符串_第3页
第3页 / 共93页
第4章数组和字符串_第4页
第4页 / 共93页
第4章数组和字符串_第5页
第5页 / 共93页
点击查看更多>>
资源描述

《第4章数组和字符串》由会员分享,可在线阅读,更多相关《第4章数组和字符串(93页珍藏版)》请在金锄头文库上搜索。

1、第4章数组和字符串1第4章数组和字符串n n4.1数组的概念数组的概念n n4.2一维数组一维数组n n4.3二维数组二维数组n n4.4字符串与字符函数字符串与字符函数24.1数组的概念n n问题的提出:问题的提出:n第第一一个个问问题题:输输入入100个个学学生生的的“C程程序序设设计计”课课程程的的成成绩绩,将将这这100个个分分数数从从小小到到大大输出。输出。n第第二二个个问问题题:输输入入100个个学学生生的的“C程程序序设设计计”课课程程的的期期中中和和期期末末成成绩绩,算算出出总总评评成成绩绩,总总评评成成绩绩为为“30%期期中中成成绩绩+70%期期末末成绩成绩”,计算总评成绩的

2、分数段情况。,计算总评成绩的分数段情况。31.数组的定义n n按序排列的同类数据元素的集合就称为按序排列的同类数据元素的集合就称为数组数组。n n从从概概念念上上来来说说,数数组组是是一一组组变变量量,这这组组变变量量应应该该满满足下列条件:足下列条件:n具有有相同的名字n具有相同的数据类型n在存储器中连续存放。n n按数组元素类型的不同,数组又可分为按数组元素类型的不同,数组又可分为n数值型数组n字符型数组n指针型数组n结构体型数组42.数组的数据类型n n数组的数据类型可以是各种基本数据类型数组的数据类型可以是各种基本数据类型n如int、float、double、char、long等。n

3、n还可以是:还可以是:n指针型n结构体型n共用体型n枚举型(以上类型后续章节介绍)n n同一数组中的所有元素必须是相同类型的。同一数组中的所有元素必须是相同类型的。 53.数组的维数数组的维数n n一维数组一维数组n元素有一个下标,如a1n n二维数组二维数组n元素有两个下标,如a11n n三维数组三维数组n三个下标,如a111n nC C语语言言的的数数组组可可以以是是多多维维的的,但但一一般般常常用用的的是是一一维维数数组和二维数组。组和二维数组。64.2一维数组n n4.2.1一维数组的定义一维数组的定义n n4.2.2一维数组的初始化一维数组的初始化n n4.2.3一维数组的引用一维数

4、组的引用74.2.1一维数组的定义n n一维数组定义的语法格式如下:一维数组定义的语法格式如下:类型说明符类型说明符数组名数组名数组长度数组长度;n n其中:其中:(1 1)“ “类类型型说说明明符符” ”可可以以是是任任何何一一种种基基本本数数据据类类型型或或构构造数据类型。例如:造数据类型。例如:intintdata5;/*data5;/*整型数组整型数组datadata,有,有5 5个元素。个元素。* */ /charstring20;/*charstring20;/*字符型数组字符型数组stringstring,有,有2020个元素个元素*/ /(2 2)“ “数组名数组名” ”命名规

5、则和变量命名规则相同。命名规则和变量命名规则相同。(3)数组名后的“数组长度”表示数组中数据元素的个数,数组长度只能是一个整型常量。8(4)一个数组定义语句中可以只定义一个数组,也可以定义多个数组,还可以同时定义数组和变量。例如:floatb10,c20,f;定义了:单精度浮点型数组b,有10个元素;单精度浮点型数组c,有20个元素;浮点型变量f。9程序段一:程序段一:程序段一:程序段一:#defineSize5#defineSize5main()main()intintaSize,bSize+10;/*aSize,bSize+10;/*正确正确正确正确*/ / 程序段二:程序段二:程序段二:

6、程序段二:main()main()intintn=5;n=5;intint datandatan;/*;/*错误错误错误错误*/ / 例如:10一组一组red整数整数1116位数组数组redred有有1313个元素,下标为个元素,下标为0 01212注意:没有注意:没有red13。定义整型数组定义整型数组red124.2.2一维数组的初始化n n初始化初始化是指在数组定义时给数组元素赋予初值。是指在数组定义时给数组元素赋予初值。n n格式:格式:类型说明符类型说明符数组名数组名常量表达式常量表达式=数据值数据值1,数据值数据值2,数据值,数据值n;n n注意:注意:注意:注意:n数数组组初初始

7、始化化是是在在编编译译阶阶段段进进行行的的,由由可可执执行行语语句句完完成成的,因此不能将初始化的的,因此不能将初始化的“=”与赋值号混淆。与赋值号混淆。n n规定:规定:n可以只给部分元素赋初值。没有赋初值的元素:对于数值型数组,自动赋初值为0;对字符型数组,自动赋初值为空字符。例如:13intred13=1,2,3,4;n则red4red12的初值都为0。n n只能给元素逐个赋值,不能给数组整体赋值。只能给元素逐个赋值,不能给数组整体赋值。n例如:给数组red中的13个元素全部赋值“2”只能用以下形式来表示:intred13=2,2,2,2,2,2,2,2,2,2,2,2,2;n而不能为了

8、方便写成如下的形式:intred13=2;n n初始化数组时,允许省略数组的长度初始化数组时,允许省略数组的长度。n例如:intred13=1,2,3,4,5,6,7,8,9,10,11,12,13;可写为:intred=1,2,3,4,5,6,7,8,9,10,11,12,13;144.2.3一维数组的引用n n格式:格式:数组名数组名下标表达式下标表达式n n其中:其中:n数组下标可以是整型变量或整型表达式,n任何一个数组元素的引用都可以看成是一个变量的使用。n下标从0开始,不能大于数组长度-1n n例如:例如:data4data4、datai+jdatai+j 、dataidatai+都

9、是合法的引用方式。都是合法的引用方式。 15【例例4.14.1】数组数组m8m8存储其下标值,反向输出存储其下标值,反向输出mm的值。的值。#includemain()inti,m8;for(i=0;i=0;i-)printf(%d,mi);程序的运行结果如下:程序的运行结果如下:7 6 5 4 3 2 1 016允许用表达式表示下标。【例4.2】在数组m8中存储偶数并输出。#include#include main()main() intinti,m8;i,m8; for(ifor(i=0;i8;)=0;i8;)mimi+=2*i+2+=2*i+2; ; for(ifor(i=0;i=7;i

10、+)=0;i=7;i+)printf(%dprintf(%d,mimi);); 程序的最后运行结果如下:程序的最后运行结果如下:2 4 6 8 10 12 14 1617一维数组应用举例一维数组应用举例18例1:用数组方式读入5个整数,并求和。/*/* sumsumofof55intergerinterger */*/#include#includestdio.hstdio.h voidmain()voidmain()intinti,data5,sum=0;i,data5,sum=0;printf(nPleaseprintf(nPleaseenter5integer:);enter5integ

11、er:);for(i=0;i5;i+)for(i=0;i5;i+)scanf(%dscanf(%d,&dataidatai ););for(i=0;i5;i+)for(i=0;i5;i+)sum=sum=sum+dataisum+datai;printf(Sumprintf(Sumis%is%dn,sumdn,sum);); 19例2:用数组方式解决Fibonacci数列问题,求出Fibonacci数列的前20项存储在数组中,并将数组内容输出。前一章的程序:用迭代思想前一章的程序:用迭代思想#include stdio.hvoid main() int a,b,j,f; a=1;b=1; pr

12、intf(%10d%10d,a,b); for( j=3;j=20; j+) f=a+b; a=b; b=f; printf(%10d,f); if (j%5=0) printf(n); 20#include#includestdio.hstdio.h voidmain()voidmain() intint i,i, fib20=1,1fib20=1,1 ; ; /*/*初初初初始始始始化化化化 * */ /printf(nprintf(n););for(i=2;i20;i+)for(i=2;i20;i+)fibi=fibi-1+fibi-2fibi=fibi-1+fibi-2; ;for(i

13、=1;i=20;i+)for(i=1;i=20;i+)printf(%10d,fibi-1);printf(%10d,fibi-1); ifif(i%5=0)(i%5=0)printf(“nprintf(“n”)”); /*/*每每每每行行行行输输输输出出出出5 5个个个个* */ / 21例3:输入100个整数,求出最小的数以及第一个最小的数在数组中的下标。分析:分析:n n用一个变量用一个变量min_allo记住最小元素的下标记住最小元素的下标n n开始时,假设第开始时,假设第0的元素最小,的元素最小,min_allo=0n n循环从第一个元素开始,到第循环从第一个元素开始,到第99个元素

14、结束个元素结束n n判判断断该该元元素素是是否否比比下下标标为为min_allo的的元元素素还还要要小小,如如果果是是,就就让让min_allo记记住住这这个个新新的的最最小小元素的位置。元素的位置。22#include#includestdio.hstdio.h #defineSIZE100#defineSIZE100voidmain()voidmain() intint i,dataSIZEi,dataSIZE; ;intint min_allomin_allo;/*/*记录最小元素的下标记录最小元素的下标*/ /printf(nPleaseprintf(nPleaseinput%dinp

15、ut%dint:,SIZEint:,SIZE); );for(i=0;ifor(i=0;iSIZE;iSIZE;i+)+)scanf(%d,&dataiscanf(%d,&datai););min_allomin_allo=0;=0;/*/*假设第假设第0 0个元素最小个元素最小*/ /for(i=1;ifor(i=1;iSIZE;iSIZE;i+)+)if(if(dataidataidatamin_allodatamin_allo ) )/*/*若第若第i i个元素小于当前最小个元素小于当前最小元素,记录新的最小元素的位置元素,记录新的最小元素的位置*/ /min_allomin_allo=

16、i;=i;printf(Minprintf(Minis%5d,Alloctionis%5d,datamin_allo,min_allo);is%5d,Alloctionis%5d,datamin_allo,min_allo); 23例4:输入10个整数,从小到大排列并输出。n n何为冒泡排序法n算法算法:(:(从小到大从小到大) )将两个相邻的数比较将两个相邻的数比较, ,将小的调换将小的调换到前头到前头 . .每一趟把最大的数放到正确的位置。每一趟把最大的数放到正确的位置。n n何为选择排序法n算算法法:每每次次找找到到最最小小的的数数,再再和和相相应应位位置置的的数数调调换换位置。位置。2

17、49854201 1 1 1、用、用、用、用冒泡法冒泡法冒泡法冒泡法对对对对10101010个数进行升序排序个数进行升序排序个数进行升序排序个数进行升序排序算法算法算法算法:(:(:(:(从小到大从小到大从小到大从小到大) ) ) )将两个相邻的数比较将两个相邻的数比较将两个相邻的数比较将两个相邻的数比较, , , ,将小的调换将小的调换将小的调换将小的调换到前头到前头到前头到前头 . . . .每一趟把最大的数放到正确的位置。每一趟把最大的数放到正确的位置。每一趟把最大的数放到正确的位置。每一趟把最大的数放到正确的位置。895420859420854920854290854209第一趟结结果

18、果第第5次次第第4次次第第3次次第第2次次第第1次次第二趟85420第第1次次58420第第2次次54820第第3次次54280第第4次次54208结结果果254520425042055420第第3次次第第2次次第第1次次结结果果第三趟240204420第第2次次第第1次次结结果果第四趟0220结结果果第第1次次第五趟024589结果结果26冒泡法程序冒泡法程序main()main() intint a11, i,j,t; a11, i,j,t; printf(“inputprintf(“input 10 number:n”); 10 number:n”); for(i=1;i11;i+) f

19、or(i=1;i11;i+) scanf(“%d”,&aiscanf(“%d”,&ai);); printf(“nprintf(“n”);”); for(j=1;j=9;j+) for(j=1;j=9;j+) for(ifor(i=1;i=10-j;i+)=1;iai+1)ai+1) t=ai;ai=ai+1;t=ai;ai=ai+1; ai+1=t; ai+1=t; printf(“theprintf(“the sorted sorted numbers:n”);numbers:n”); for(i=1;i11;i+) for(i=1;iai+1FTaiai+1输出a1an279854200

20、85429025489024589交换过程结结果果第第5步步第第4步步第第3步步第第2步步第第1步步0245890245892 2 2 2、用选择法对、用选择法对、用选择法对、用选择法对10101010个数进行升序排序。个数进行升序排序。个数进行升序排序。个数进行升序排序。算法算法算法算法:每次将最小的数放到正确的位置。每次将最小的数放到正确的位置。每次将最小的数放到正确的位置。每次将最小的数放到正确的位置。思路:思路: 设有设有mm个数,排序过程分为个数,排序过程分为m-1m-1个步骤:个步骤: 第第1 1步、在步、在mm个数中找出最小数,个数中找出最小数,然后和第一个数交换,前然后和第一个

21、数交换,前1 1个数已个数已经排好序。经排好序。 第第2 2步、在步、在m-1m-1个数中找出最小数,个数中找出最小数,然后和第然后和第2 2个数交换,前个数交换,前2 2个数已个数已经排好序。经排好序。 第第k k步、在步、在m-k+1m-k+1个数中找出最小个数中找出最小数,然后和第数,然后和第k k个数交换,前个数交换,前k k个数个数已经排好序。已经排好序。 这样一直到第这样一直到第m-1m-1步结束。步结束。28main()main()main()main() intintintint a10, i,j,t,k; a10, i,j,t,k; a10, i,j,t,k; a10, i,

22、j,t,k; for(i=0;i10;i+) for(i=0;i10;i+) for(i=0;i10;i+) for(i=0;i10;i+) scanf(“%d”,&aiscanf(“%d”,&aiscanf(“%d”,&aiscanf(“%d”,&ai);););); printf(“nprintf(“nprintf(“nprintf(“n”);”);”);”); for(i=0;i9;i+) for(i=0;i9;i+) for(i=0;i9;i+) for(i=0;i9;i+) k=i; k=i; k=i; k=i; for(j=i+1;j10;j+) for(j=i+1;j10;j+)

23、 for(j=i+1;j10;j+) for(j=i+1;j10;j+) if(ajak) k=j; if(ajak) k=j; if(ajak) k=j; if(ajak) k=j; t=ak;ak=ai;ai=t; t=ak;ak=ai;ai=t; t=ak;ak=ai;ai=t; t=ak;ak=ai;ai=t; printf(“theprintf(“theprintf(“theprintf(“the sorted numbers:n”); sorted numbers:n”); sorted numbers:n”); sorted numbers:n”); for(i=0;i10;i+

24、) printf(“%4d”,ai); for(i=0;i10;i+) printf(“%4d”,ai); for(i=0;i10;i+) printf(“%4d”,ai); for(i=0;i10;i+) printf(“%4d”,ai); printf(“nprintf(“nprintf(“nprintf(“n”);”);”);”);选择法程序选择法程序选择法程序选择法程序: : : :作作作作业业业业:请请请请画画画画出出出出选选选选择择择择排排排排序序序序法法法法的的的的流流流流程程程程图图图图。并并并并分分分分析析析析两两两两种种种种排序法的区别。排序法的区别。排序法的区别。排序法的

25、区别。29n n思考思考n用冒泡法和选择法如何解决第一个问题:输用冒泡法和选择法如何解决第一个问题:输入入100个学生的个学生的“C程序设计程序设计”课程的成绩,课程的成绩,将这将这100个分数从小到大输出?个分数从小到大输出?30n用一维数组解决第二个问题:输入用一维数组解决第二个问题:输入100个学生的个学生的“C程序设计程序设计”课程的期课程的期中和期末成绩,算出总评成绩,总评成中和期末成绩,算出总评成绩,总评成绩为绩为“30%期中成绩期中成绩+70%期末成期末成绩绩”,计算总评成绩的分数段情况。,计算总评成绩的分数段情况。n分析:分析:n n本题要使用三个平行的一维数组。本题要使用三个

26、平行的一维数组。本题要使用三个平行的一维数组。本题要使用三个平行的一维数组。n n两个数组的第两个数组的第两个数组的第两个数组的第i i i i个元素分别记录了一个学生的期中成绩个元素分别记录了一个学生的期中成绩个元素分别记录了一个学生的期中成绩个元素分别记录了一个学生的期中成绩和期末成绩。和期末成绩。和期末成绩。和期末成绩。 n n第三个数组的第第三个数组的第第三个数组的第第三个数组的第i i i i个元素由另两个数组的第个元素由另两个数组的第个元素由另两个数组的第个元素由另两个数组的第i i i i个元素计算个元素计算个元素计算个元素计算得到。得到。得到。得到。31808070708080

27、score1期中成绩期中成绩909080806060score2期末成绩期末成绩878777776666finalScore总评总评期中成绩期中成绩30期末成绩期末成绩70剪不断,理还乱!有没有更好的方法?请看二维数组!剪不断,理还乱!有没有更好的方法?请看二维数组!剪不断,理还乱!有没有更好的方法?请看二维数组!剪不断,理还乱!有没有更好的方法?请看二维数组!324.3二维数组n n4.3.14.3.1二维数组的定义二维数组的定义二维数组的定义二维数组的定义n n4.3.24.3.2二维数组的初始化二维数组的初始化二维数组的初始化二维数组的初始化n n4.3.34.3.3二维数组的引用二维数

28、组的引用二维数组的引用二维数组的引用334.3.1二维数组的定义n n语法:语法:n类型说明符数组名行数列数n n其中n“行数”表示第一维下标的长度n“列数”表示第二维下标的长度。34如果一维数组是一排平房,那么二维数组就是一栋楼房35n n例如:例如:intm45; /*/*定定义义了了一一个个数数组组名名为为mm的的二二维维数数组组,其其中中行行数数为为4 4、列列数数为为5*/5*/n n该数组的数组元素共有该数组的数组元素共有45=2045=20个,分别为:个,分别为:m00,m01,m02,m03,m04m10,m11,m12,m13,m13m20,m21,m22,m23,m23m3

29、0,m31,m32,m33,m3436题外话.多维数组的扩展n n多维数组可以由二维数组扩展而得到,例如:intm234;n定义了一个数组名为m的三维数组,按顺序进行展开后的各个元素值分别如下:m000,m001,m002,m003m010,m011,m012,m013m020,m021,m022,m023m100,m101,m102,m103m110,m111,m112,m113m120,m121,m122,m12337关于二维数组的说明:(1 1)二二维维数数组组在在概概念念上上是是二二维维的的,也也就就是是说说其其下下标标在在两个方向上变化。两个方向上变化。(2 2)在语言中,二维数组是

30、按行排列的。)在语言中,二维数组是按行排列的。 (3 3)数组元素所占的存储空间大小跟其类型有关系。)数组元素所占的存储空间大小跟其类型有关系。 (4 4)一个二维数组可以看成为若干个一维数组。)一个二维数组可以看成为若干个一维数组。如如m45m45中中包包括括了了四四个个一一维维数数组组:m0m0,m1m1,m2m2,m3m3n注注意意:m0、m1、m2和和m3不不能能当当作作数数组组元元素素使使用用,因为它们是一维数组名,不是一个单纯的数组元素。因为它们是一维数组名,不是一个单纯的数组元素。38 stu_score是一个是一个53的二维的二维数组。数组。 表示共有表示共有5个学生(个学生(

31、5行),行),每行第一列是期中成绩,第二列每行第一列是期中成绩,第二列是期末成绩,是期末成绩, 第三列期中第三列期中30%期末期末70存储方式39n n计算机的内存是连续编址的,计算机的内存是连续编址的,n nC语言的编译系统采用按行排列。语言的编译系统采用按行排列。a0-a00,a 01, a 02, a 03a1-a 10, a 11, a 12, a 13a2-a 20, a 21, a 22, a 23a34404.3.2二维数组的初始化n n语法:语法:数据类型说明符数组名行数列数=数据值,数据值,数据值,数据值,数据值,数据值;或者数据类型说明符数组名行数列数=数据值,数据值,数据

32、值;41说明:(1 1)二维数组初始化和一维数组初始化的方法基本相同。)二维数组初始化和一维数组初始化的方法基本相同。 区区别别:二二维维数数组组可可按按行行分分段段初初始始化化,也也可可以以按按行行连连续续初始化初始化。 n n例如对数组例如对数组m43m43:按行分段初始化可写为:按行分段初始化可写为:intm43=78,65,80,67,89,65,53,68,98,57,88,67;n n其中,其中,n78,65,80是赋给第一行3个数组元素的,这里可以看成是赋给一维数组m0的;n67,89,65是赋给第二行3个数组元素的,这里可以看成是赋给一维数组m1的;n依次类推。42 按行连续初

33、始化按行连续初始化可写为:可写为:intm43=78,65,80,67,89,65,53,68,98,57,88,67;n n各各元元素素获获得得的的初初值值和和第第种种方方式式的的结结果果完完全全相相同同。C C语语言言规规定定,用用这这种种方方式式给给二二维维数数组组赋赋初初值值时时,是是先先按按行、后按列的顺序进行的。行、后按列的顺序进行的。(2 2)可可以以只只对对部部分分元元素素赋赋初初值值,未未赋赋初初值值的的元元素素自自动动取取0 0值。例如:值。例如:intm34=1,2,3;n n是是对对每每一一行行的的第第一一列列元元素素赋赋值值,未未赋赋值值的的元元素素取取0 0值值。赋

34、值后各元素的值依次为:赋值后各元素的值依次为:10002000300043例如:对数组例如:对数组a32:inta32=5,6,7,8,9,10;/*按行分段初始化按行分段初始化*/inta32=5,6,7,8,9,10;/*按行连续初始化按行连续初始化*/上面两种初始化的结果是完全相同的。上面两种初始化的结果是完全相同的。5 56 67 78 89 9101044下面两种初始化下面两种初始化inta32=5,7,9;/*按行分段初始化按行分段初始化*/inta32=5,7,9;/*按行连续初始化按行连续初始化*/则结果却完全不一样。则结果却完全不一样。5 50 07 70 09 90 05

35、57 79 90 00 00 045(3)如果对全部元素赋初值,则第一维的长度可以省略,编译系统会自动计算出来。例如:intm33=1,2,3,4,5,6,7,8,9;可以写为:intm3=1,2,3,4,5,6,7,8,9;n n注意:n使用这种方法赋初值,必须给出所有数组元素的初值,否则系统将作出错处理。n列数绝对不能省略,即不能写成:intm3=1,2,3,4,5,6,7,8,9;46【例例4.44.4】从从键键盘盘上上输输入入一一个个3434的的矩矩阵阵,将将其其转转换换后后形成形成4343矩阵输出。矩阵输出。n n分分析析:矩矩阵阵的的转转置置是是将将矩矩阵阵的的行行和和列列进进行行

36、互互换换,使使其行成为列,列成为行其行成为列,列成为行n n例如:例如:1 12 23 34 45 56 67 78 89 91010111112121 15 59 92 26 610103 37 711114 48 81212即: mjinij m34n4347#include#include main()main()intintm34,n43,i,j;m34,n43,i,j;printf(Pleaseprintf(Pleaseenterthenumberofm34:n);enterthenumberofm34:n); for(ifor(i=0;i3;i+)=0;i3;i+) /*/*输输入

37、入一一个个3434的的矩矩阵阵存存放放在在数数组组mm中中 * */ /for(jfor(j=0;j4;j+)=0;j4;j+)scanf(%d,&mijscanf(%d,&mij););for(ifor(i=0;i4;i+)=0;i4;i+)/*/*将数组将数组mm中矩阵转置后存放数组中矩阵转置后存放数组n n中中*/ / for(jfor(j=0;j3;j+)=0;j3;j+)nijnij=mjimji; ;printf(Theprintf(Thenumberofn43is:n);numberofn43is:n);for(ifor(i=0;i4;i+)=0;i4;i+)/*/*输出输出n

38、n数组中的数组中的4343矩阵矩阵*/ /for(jfor(j=0;j3;j+)=0;j3;j+)printf(%dprintf(%d,nijnij););printf(nprintf(n);); 48n n程序的运行情况为:程序的运行情况为:Pleaseenterthenumberofm34:111122223333Thenumberofn43is:123123123123494.3.3二维数组的引用n n二维数组元素的引用形式为:数组名下标表达式1下标表达式2n其中,行下标不能大于行数-1,列下标不能大于列数-1。n例如:定义了intstu_score53;n则以下都是正确的引用:nstu

39、_score00nstu_score12nstu_score31n而stu_score33是不正确的引用。50【例例4.54.5】 求求矩矩阵阵m34m34各各个个元元素素中中的的最最小小值值,并并输输出出最最小小值值元元素素所所在在的的行行和列。和列。#include#include main()main()intint i,ji,j; ;intint x,yx,y; ;intintm34=12,1,2,4,2,3,4,5,5,6,7,8;m34=12,1,2,4,2,3,4,5,5,6,7,8;intintmin=m00;min=m00;for(ifor(i=0;i3;i+)=0;i3;i

40、+)for(jfor(j=0;j4;j+)=0;j mijmij)min=min=mijmij;x=i;y=j;x=i;y=j;printf(Theprintf(Theminofm34is%minofm34is%d.n,mind.n,min); );printf(Theprintf(Therowofminis%dandtherowofminis%dandthecolumcolumofminis%ofminis%d.,x,yd.,x,y););The min of m34 is 1.The row of min is 0 and the colum of min is 1.51练一练:判断下面程

41、序的运行结果:练一练:判断下面程序的运行结果:#include#includestdio.hstdio.h voidmain()voidmain()intinti,j,a32;i,j,a32;for(i=0;i3;i+)for(i=0;i3;i+)for(j=0;j2;j+)for(j=0;j2;j+)aijaij=i+ji+j; ;for(i=0;i3;i+)for(i=0;i3;i+)for(j=0;j2;j+)for(j=0;j2;j+)printfprintf(%10d,aij);(%10d,aij);printf(nprintf(n);); 52n n输入输入100个学生的个学生的“

42、C程序设计程序设计”课程的期中和课程的期中和期末成绩,算出总评成绩,总评成绩为期末成绩,算出总评成绩,总评成绩为“30%期中成绩期中成绩+70%期末成绩期末成绩”,计算总评成绩,计算总评成绩的分数段情况。的分数段情况。 分析:本题将定义一个二维数组分析:本题将定义一个二维数组 intint score1003;使用数组使用数组score的每一行记录一个学生的期中成绩、的每一行记录一个学生的期中成绩、期末成绩和总评成绩。期末成绩和总评成绩。用二维数组解决第二个问题:53程序如下:程序如下:n n#include#includestdio.hstdio.h n n#defineSIZE100#de

43、fineSIZE100n nvoidmain()voidmain()n nintint i,j,flag,si,j,flag,s; ;n nintintgrade6=0;grade6=0;n nintintscoreSIZE3;scoreSIZE3;n nfloattemp;floattemp;n ni=0;i=0;n nwhile(iSIZE)while(iSIZE)n nn nprintf(nPleaseprintf(nPleaseinputtwoscoresofastudent:);inputtwoscoresofastudent:);n nflag=1;flag=1;n n while

44、while(flag)(flag) /*/*重重复复读读入入两两个个成成绩绩,读读到到正正确确的的为为止止 * */ /n nscanf(%d%d,&scorei0,&scorei1);scanf(%d%d,&scorei0,&scorei1);n n ifif (scorei0=100&(scorei0=0&scorei0=0& scorei1=100&scorei1=0)scorei1=0)n nflag=0;flag=0;n nelseelsen n54n nprintf(n007Errordata!Pleaseinputtwoscoresastudentagain:);printf(n

45、007Errordata!Pleaseinputtwoscoresastudentagain:);n nn ntemp=.3*scorei0+.7*scorei1;temp=.3*scorei0+.7*scorei1;/*/*计算总评成绩计算总评成绩*/ /n nscorei2=(scorei2=(int)tempint)temp; ;n ni+;i+;n nn nfor(i=0;ifor(i=0;iSIZE;iSIZE;i+)+)/*/*将总评成绩分段(按照将总评成绩分段(按照5 5分制分制*/ /n nn ns=scorei2/10;s=scorei2/10;n nswitch(s)swi

46、tch(s)n nn ncase0:case1:case2:case3:case0:case1:case2:case3:n ncase4:case5:grade2=grade2+1;break;case4:case5:grade2=grade2+1;break;n ncase6:case7:grade3=grade3+1;break;case6:case7:grade3=grade3+1;break;n ncase8:grade4=grade4+1;break;case8:grade4=grade4+1;break;n ncase9:case10:grade5=grade5+1;break;c

47、ase9:case10:grade5=grade5+1;break;55n nn nn nfor(i=0;ifor(i=0;iSIZE;iSIZE;i+)+)/*/*输出期中、期末和总评成绩输出期中、期末和总评成绩*/ /n nn nfor(j=0;j3;j+)for(j=0;j3;j+)n nprintf(%4d,scoreij);printf(%4d,scoreij);n nprintf(nprintf(n););n nn nfor(i=2;i6;i+)for(i=2;i6;i+)n n printf(nThereprintf(nThere areare%d%dstudentsstuden

48、tsiningradegrade%d.,gradei,id.,gradei,i); );n n 564.4字符串与字符函数n n4.4.1字符数组字符数组n n4.4.2字符串与字符数组字符串与字符数组n n4.4.3字符串处理函数字符串处理函数n n4.4.4字符串函数应用举例字符串函数应用举例574.4.1字符数组n n1.字符数组的定义字符数组的定义n n2.字符数组的初始化字符数组的初始化n n3.字符数组举例字符数组举例581.字符数组的定义n n格式:格式:类型名数组名数组元素个数;n其中的“类型名”必须是char。n n例如:例如: charc10;n定义了一个名为c的字符数组,

49、包含10个元素。n n和和数数值值数数组组一一样样,字字符符数数组组也也可可以以是是二二维维或或多多维维数数组。例如:组。例如:charc89;592.字符数组的初始化n n在定义字符数组时,可以直接对字符数组进行初始化。n如:如:charstr6=H,e,l,l,o;n n给字符数组赋初值时,如果花括号中字符的个数大于字符数组定义的数据元素的个数,则编译系统会报告出错。n n如果花括号中数据元素的个数小于字符数组定义的数据元素的个数,初始化中未给出数据元素值的对应元素被自动赋值为空字符0。n如:上面定义的str赋值后各元素的值如下所示:c0=Hc1=ec2=lc3=lc4=oc5=060【例

50、例4.84.8】输出一个钻石图形。输出一个钻石图形。#include#include main()main() staticstaticcharchardiamonddiamond5=5=,*,*,*,*,*,*,*,*,*,*,*,*;,*,*,*,*;/*/*第二维大小不能省略第二维大小不能省略* */ / intint i,ji,j; ;for(i=0;i5;i+)for(i=0;i5;i+)/*/*逐行逐行逐行逐行*/ / for(j=0;j5;j+)for(j=0;j=0;i-)n/*从最后一个字符开始逆向输出从最后一个字符开始逆向输出*/nputchar(ci);n624.4.2字

51、符串与字符数组n n1.字符串初始化赋值字符串初始化赋值n n2.用二维数组存放多个字符串用二维数组存放多个字符串n n3.字符数组的输入字符数组的输入/输出输出n n4.字符串大小的比较字符串大小的比较631.字符串初始化赋值n n语语言言允允许许用用字字符符串串的的方方式式对对数数组组作作初初始始化化赋赋值值。具具体体有两种方式:有两种方式:(1 1)按按单单个个字字符符的的方方式式赋赋初初值值,其其中中必必须须有有一一个个字字符符是是字符串的结束标记。例如:字符串的结束标记。例如: chars=1,2,3,0;(2 2)直接在初值表中)直接在初值表中用双引号用双引号写一个字符串常量。例如

52、:写一个字符串常量。例如:chars=“123”;/*相当于相当于chars4=“123”;*/其中的“”可以省略,如:chars=123;s0的值为1,s1的值为2,s2的值为3,s3的值为0。字符数组s中存放的是一个字符串。642.用二维数组存放多个字符串n n当当需需要要处处理理多多个个字字符符串串时时,可可以以采采用用二二维维数数组组,此此时二维数组的列值取最大字符串的长度。时二维数组的列值取最大字符串的长度。 n n例例如如:存存放放三三个个字字符符串串” ”123”123”、” ”abab” ”、” ”A”A”可可采用如下的形式:采用如下的形式:chars34=123,ab,A;n

53、 n表示:表示:1 12 23 300a ab b00A A00653.字符数组的输入/输出n n关于字符数组的输入关于字符数组的输入/ /输出,有如下规定:输出,有如下规定:(1 1)逐逐个个字字符符输输入入/ /输输出出。用用格格式式符符%c%c 输输入入/ /输输出出一个字符。一个字符。(2 2)将将整整个个字字符符串串一一次次性性输输入入/ /输输出出。用用格格式式符符%s%s 对整个字符串进行一次性输入对整个字符串进行一次性输入/ /输出。输出。n n注注注注意意意意:使使使使用用用用 %s%s%s%s 格格格格式式式式从从从从键键键键盘盘盘盘上上上上向向向向字字字字符符符符数数数数

54、组组组组中中中中输输输输入入入入字字字字符符符符串串串串时时时时,回回回回车车车车换换换换行行行行符符符符或或或或空空空空格格格格符符符符号号号号均均均均作作作作为为为为字字字字符符符符串串串串的结束标记。的结束标记。的结束标记。的结束标记。66#include#include main()main() charc5=charc5=H,e,l,l,oH,e,l,l,o;intinti;i;for(ifor(i=0;i7;i+)=0;i7;i+)printf(%c,ciprintf(%c,ci););printf(nprintf(n);); 程序的运行结果都是:程序的运行结果都是:Hello【例

55、例4.9,4.10】对字符数组中的元素进对字符数组中的元素进行逐个输出和字符串方式输出的比较。行逐个输出和字符串方式输出的比较。#include#include main()main() charc=“Hello;charc=“Hello; printf(%sn,cprintf(%sn,c); );67【例例4.114.11】请请输输入入一一个个长长度度小小于于2020的的字字符符串串,并并将该字符串输出。将该字符串输出。#includemain() charm20; printf(inputstring:n); scanf(%s,m); printf(%sn,m);程序运行情况为:程序运行情

56、况为:inputstring:hellohumanhello空空格格以以后后的的字字符符都都未未能能输输出出(字字字字符符符符串串串串以以以以空空空空格格格格或或或或回回回回车车车车作作作作为为为为串的结束符串的结束符串的结束符串的结束符)。)。为为了了避避免免这这种种情情况况,可可多多设设几几个个字字符符数数组组分分段段存存放放含含空空格格的串。的串。68n n程序可改写成如下形式:程序可改写成如下形式:#icludemain() charm16,m26; printf(inputstring:n); scanf(%s%s,m1,m2); printf(%s%sn,m1,m2);修改后的程序

57、运行情况为:修改后的程序运行情况为:input string:abcd efghi abcd efghi694.字符串大小的比较n n字字符符串串可可以以进进行行大大小小比比较较,比比较较时时按按照照从从前前向向后后的的顺序逐个字符比大小。顺序逐个字符比大小。 字符大的对应字符串就大。字符大的对应字符串就大。例如:abcd小于bcde。如果全部字符均相同,则字符串相等。如果全部字符均相同,则字符串相等。例如:abcd等于abcd。如如果果字字符符串串长长度度不不等等,而而前前面面字字符符均均相相同同,则则长长度度大的字符串为大。大的字符串为大。例如:abcd大于abc。704.4.3字符串处理

58、函数n n1.字符串输出函数字符串输出函数putsn n2.字符串输入函数字符串输入函数getsn n3.测试字符串长度函数测试字符串长度函数strlenn n4.字符串连接函数字符串连接函数strcatn n5.字符串比较函数字符串比较函数strcmpn n6.字符串拷贝函数字符串拷贝函数strcpyn n7.小写变大写函数小写变大写函数struprn n8.大写变小写函数大写变小写函数strlwr711.字符串输出函数putsn n调用形式:调用形式:puts(字符数组字符数组);n n功功能能:把把字字符符数数组组中中的的字字符符串串输输出出到到显显示示器器,即即在在屏屏幕幕上上显显示示

59、该该字字符符串串的的内内容容。其其中中,字字符符串串的的结结束束标标记记将转换成回车换行符将转换成回车换行符。72【例例4.124.12】putsputs函数的应用举例。函数的应用举例。# #includestdio.hincludestdio.h main()main() charc=Hellocharc=HellonHumannHuman; ;puts(cputs(c); ); 程序运行后,将在显示器上输出程序运行后,将在显示器上输出:Hellohuman73#includestdio.hvoidmain()charstr=Hello;printf(%s,str);printf(%s,st

60、r);运行结果运行结果?#includestdio.hvoidmain()charstr=Hello;puts(str);puts(str);运行结果:运行结果:?读程序:742.字符串输入函数getsn n调用形式:调用形式:gets(字符数组);n n功能:从键盘上输入一个字符串,并存入到指定的字符数组中。功能:从键盘上输入一个字符串,并存入到指定的字符数组中。【例例4.134.13】getsgets函数的应用举例。函数的应用举例。# #includestdio.hincludestdio.h main()main() charm20;charm20;printf(inputprintf(

61、inputstring:n);string:n);gets(mgets(m); );puts(mputs(m); ); 程序的运行情况为:程序的运行情况为:Input string:hello human hello human75n n可可以以看看出出当当输输入入的的字字符符串串中中含含有有空空格格时时,输输出出仍仍为为全全部部字字符符串串。这这说说明明getsgets函函数数并并不不以以空空格格作作为为字字符符串串输输入结束的标志,而只以回车作为输入结束的标志。入结束的标志,而只以回车作为输入结束的标志。注注注注意意意意:getsgetsgetsgets函函函函数数数数和和和和使使使使用用

62、用用 %s%s%s%s 格格格格式式式式的的的的scanfscanfscanfscanf函函函函数数数数都都都都可可可可以以以以从键盘接受字符串,但在输入时有所区别:从键盘接受字符串,但在输入时有所区别:从键盘接受字符串,但在输入时有所区别:从键盘接受字符串,但在输入时有所区别:(1 1 1 1)对对对对于于于于scanfscanfscanfscanf函函函函数数数数, 回回回回车车车车 或或或或 空空空空格格格格 都都都都看看看看成成成成字字字字符符符符串串串串结结结结束标记;束标记;束标记;束标记;(2 2 2 2)对对对对于于于于getsgetsgetsgets函函函函数数数数,只只只只

63、有有有有“回回回回车车车车”才才才才作作作作为为为为字字字字符符符符串串串串结结结结束束束束标记,标记,标记,标记,“空格空格空格空格”看成字符串的一部分。看成字符串的一部分。看成字符串的一部分。看成字符串的一部分。uu说说说说明明明明:putsputs函函函函数数数数和和和和getsgets函函函函数数数数只只只只能能能能输输输输入入入入/ /输输输输出出出出一一一一个个个个字字字字符符符符串。例如:串。例如:串。例如:串。例如:puts(str1,str2); 和和gets(str1,str2,str3);都都是是错错误的。误的。763.测试字符串长度函数strlenn n功功能能:测测试

64、试指指定定字字符符串串的的实实际际长长度度(不不含含字字符符串串结结束标志束标志00 ),并返回字符串的长度。),并返回字符串的长度。n n调用形式:调用形式:调用形式:调用形式:strlen(字符数组字符数组);n其中n函数的参数可以是字符型数组名或字符串常数n函数的返回值是字符串长度。77【例例4.144.14】strlenstrlen函数的应用举例。函数的应用举例。#include#include #include#include main()main() intintn;n;staticcharm=HelloHuman;staticcharm=HelloHuman;n=n=strlen

65、(mstrlen(m); );printf(Theprintf(The lenthlenthofthestringis%ofthestringis%dn,ndn,n); ); 程序的运行结果如下:程序的运行结果如下:The lenth of the string is 11784.字符串连接函数strcatn n调用格式:调用格式:调用格式:调用格式:strcat(字符数组字符数组1,字符数组字符数组2);n n功能:功能:n把字符数组2中的字符串连接到字符数组1中字符串的后面,同时删去字符串1中的串标志0,组成新的字符串。n该函数返回值是字符数组1的首地址。79【例例4.154.15】str

66、catstrcat函数的应用举例。函数的应用举例。#include#include #include#include main()main()staticcharm130=Mynameis;staticcharm130=Mynameis;charm210;charm210;printf(inputprintf(inputyourname:n);yourname:n);gets(m2);gets(m2);strcat(m1,m2);strcat(m1,m2);puts(m1);puts(m1); 程序的运行情况如下:程序的运行情况如下:input your name:human My name

67、is human805.字符串比较函数strcmpn nstrcmpstrcmp函数用来对两个字符串进行比较,其调用格式为函数用来对两个字符串进行比较,其调用格式为strcmp(字符串字符串1,字符串字符串2);n n其中,字符串其中,字符串1 1和字符串和字符串2 2可以是字符型数组名或字符串常数。可以是字符型数组名或字符串常数。n n功能:功能:n按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回如下所示的比较结果:字符串1等于字符串2时,返回值为:0。字符串1大于字符串2时,返回值为:字符串1-字符串2的值,大于0。字符串1小于字符串2时,返回值为:字符串1-字符串2的值,小

68、于0。81【例例4.164.16】strcmpstrcmp函数的应用举例。函数的应用举例。#include#include #include#include main()main()intintn;n;staticcharm115,m2=hellohuman;staticcharm115,m2=hellohuman;printf(inputprintf(inputastring:n);astring:n);gets(m1);gets(m1);n=strcmp(m1,m2);n=strcmp(m1,m2);if(nif(n=0)printf(“m1=0)printf(“m1equaleequal

69、em2n);m2n);if(nif(n0)printf(m1m2n);0)printf(m1m2n);if(nif(n0)printf(m1m2n);0)printf(m1m2n); 程序运行情况如下:程序运行情况如下:input a string:abcd m1m2826.字符串拷贝函数strcpyn n调用格式:调用格式:strcpy(字符数组1,字符数组2);n n功能:功能:n把字符数组2中的字符串拷贝到字符数组1中。串结束标志0也一同拷贝。n n说说明明:字字符符数数组组2 2也也可可以以是是一一个个字字符符串串常常量量。这这时时相相当于把一个字符串赋予一个字符数组。当于把一个字符串

70、赋予一个字符数组。83 【例例4.174.17】strcpystrcpy函数的应用举例。函数的应用举例。# #includestring.hincludestring.h main()main() charm115,m2=hellohuman;charm115,m2=hellohuman;strcpy(m1,m2);strcpy(m1,m2);puts(m1);puts(m1);printf(nprintf(n);); 程序的运行结果如下:程序的运行结果如下:hello human847.小写变大写函数struprn n调用格式:调用格式:strupr(字符串字符串);n n功功能能:stru

71、prstrupr函函数数用用来来将将字字符符串串中中的的小小写写字字母母转转换换成成大大写写字字母母,其其他他字字符符(包包括括大大写写字字母母和和非非字字母母)不不转转换。换。n n其其中中,函函数数的的参参数数可可以以是是字字符符型型数数组组名名或或字字符符串串常常数数,函数的返回值是转换后的字符串。函数的返回值是转换后的字符串。uprupr表示表示uppercaseuppercase。85【例例4.184.18】将将输输入入的的字字符符串串中中的的所所有有小小写写字字母母转转换换成成大写字母,并输出。大写字母,并输出。#include#include #include#include m

72、ain()main()charstr80;charstr80;puts(pleaseputs(pleaseinputastring:);inputastring:);gets(strgets(str); );strupr(strstrupr(str); );puts(strputs(str); ); 程序的运行情况为:程序的运行情况为:please input a string:welcome WELCOME868.大写变小写函数strlwrn n调用格式为调用格式为strlwr(字符串字符串);n n功功能能:strlwrstrlwr函函数数用用来来将将字字符符串串中中的的大大写写字字母母转

73、转换换成成小小写写字字母母,其其他他字字符符(包包括括小小写写字字母母和和非非字字母母)不不转转换。换。n n其其中中,函函数数的的参参数数可可以以是是字字符符型型数数组组名名或或字字符符串串常常数数,函数的返回值是转换后的字符串。函数的返回值是转换后的字符串。lwrlwr表示表示lowercaselowercase。87【例例4.194.19】将将输输入入的的大大写写字字母母字字符符串串转转换换成成小小写写字字母母字符串,并输出。字符串,并输出。#include#include #include#include main()main()charst80;charst80;puts(pleas

74、eputs(pleaseinputastring:);inputastring:);gets(stgets(st); );strlwr(ststrlwr(st); );puts(stputs(st); ); 程序运行情况为:程序运行情况为:please input a string:WELCOME welcome884.4.4字符串函数应用举例【例例4.214.21】统计输入的文字有多少个单词。统计输入的文字有多少个单词。#include#includestdio.hstdio.h main()main()charst80;charst80;intint i,numi,num=0,word=0

75、;=0,word=0;charc;charc;puts(Pleaseputs(Pleaseinputastring:n);inputastring:n);gets(stgets(st););/*/*输入一段文字到一维数组输入一段文字到一维数组stst*/*/for(ifor(i=0;(c=0;(c=stisti)!=0;i+)!=0;i+)if(c=)word=0;if(c=)word=0;/*c/*c为空格,没出现单词为空格,没出现单词* */ /89elseif(word=0)elseif(word=0)word=1;word=1;num+;num+;/*/*单词数累加单词数累加* */

76、/ printf(Thereprintf(Thereare%dwordsinthelinen,num);are%dwordsinthelinen,num); 程序的运行情况如下:程序的运行情况如下:Please input a string: hello human ni hao There are 4 words in the line90【例例4.224.22】利利用用二二维维数数组组,找找出出三三个个字字符符串串中中的的最最大大者者(ASCIIASCII值)。值)。#include#include main()main() charst20;charst20;charstr320;cha

77、rstr320;/*/*每行一个字符串每行一个字符串* */ /intinti;i;puts(Pleaseputs(Pleaseenterthreestring:);enterthreestring:);for(ifor(i=0;i3;i+)=0;i0)if(strcmp(str0,str1)0)strcpy(st,str0);strcpy(st,str0);/*/*字符串字符串str0str0复制到复制到stst*/*/ elseelsestrcpy(st,str1);strcpy(st,str1);if(strcmp(str2,st)0)if(strcmp(str2,st)0)strcpy

78、(st,str2);strcpy(st,str2);printf(ntheprintf(nthelargeststringis:%largeststringis:%s.n,sts.n,st); ); 91n n该程序的运行情况如下:该程序的运行情况如下:Pleaseenterthreestring:hello hi hurry thelargeststringis:hurry.92作业作业n nP121(上机)n4(1)(2)(4);n n书面作业:n1.请请画画出出选选择择排排序序法法的的流流程程图图。并并分分析析选选择择法法与与冒冒泡泡法法的的区别。区别。n2. 编编写写程程序序输输入入两两个个字字符符串串,将将在在第第一一个个字字符符串串中中出出现现的的但但在在第第二二个个字字符符串串未未出出现现的的字字符符存存放放在在第第三三个个字字符符串串变变量量中中并并输输出出。注注意意,允允许许第第三三个个字字符符串串有有重重复复的的字字符符,例例如如,第第一一个个字字符符串串是是“ABACDEFGH”ABACDEFGH”,第第二个字符串是二个字符串是“BCD”BCD”,则第三个字符串是,则第三个字符串是“AAEFGH”AAEFGH”。 93

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号