




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计基础——C语言程序设计
2023翻转课堂实用教程第7章
数组一维数组7.1二维数组7.2
字符数组7.37.4数组的越界C语言解决问题的本质定义变量处理变量基本数据类型整形int字符型char实数单精度实数float双精度实数double用于定义单个变量在实际生活中,存不存在对多个变量的集合进行处理的情况呢?数组7.1一维数组1234导入数组导入案例数组的定义引用初始化存储方式知识点数组的使用案例案例分析练习数组的使用练习题导入案例(1)案例7.1.1:输入5个整数,分别表示5名应届毕业生的月薪,计算并输出这5名应届毕业生的平均月薪(小数点后保留2位小数)。解决步骤:(1)采用循环求和方式计算出总和,(2)然后除以个数就可以得到平均值。注意:在计算平均数时建议用实数类型保存和,这样在用和除以个数时得到的均值也是实数。导入案例(1)#include<stdio.h>intmain(){ inti,salary; doubleaverage,sum=0; for(i=0;i<5;i++){ scanf("%d",&salary); sum=sum+salary; } average=sum/5; printf("%.2f",average); return0;}输入数据:70008100750069007300输出数据:7360.00运行结果案例7.1.1程序代码导入案例(2)案例7.1.2:输入5个整数,分别表示5名应届毕业生的月薪,计算并输出这5名应届毕业生的平均月薪(小数点后保留两位小数),以及高于平均月薪的工资数。本例题要求输出所有大于平均月薪的工资数,此时就需要保存输入的所有月薪,等平均值月薪计算出来后,再将高于平均月薪的工资数输出。导入案例(2)intmain(){inti,salary1,salary2,salary3,salary4,salary5;doubleaverage,sum=0;scanf("%d",&salary1);scanf("%d",&salary2);scanf("%d",&salary3);scanf("%d",&salary4);scanf("%d",&salary5);sum=sum+salary1+salary2+salary3+salary4+salary5;average=sum/5;printf("平均月薪为:%.2f\n",average);printf("高于平均月薪的工资数为:");if(salary1>average)printf("%d\n",salary1);if(salary2>average)printf("%d\n",salary2);if(salary3>average)printf("%d\n",salary3);if(salary4>average)printf("%d\n",salary4);if(salary5>average)printf("%d\n",salary5);return0;}输入:70006500710068007000输出:平均月薪为:6880.00高于平均月薪的工资数为:700071007000运行结果案例7.1.2程序代码如果此时应届毕业生人数由5名变为10名、100名,如何解决?7.1.1一维数组知识点数组:若干相同类型的数据的集合数组中每一个数据叫做数组元素。元素均具有相同的数据类型,具有统一的变量名即数组名,并用不同编号来区分每个元素。数组的概念可以等同于班级中的小组,假如小组1有10名学生,为这10名学生依次编号为0、1、2...9,用小组1的0号学生、小组1的1号学生…小组1的9号学生就可以找到这10名学生。1、一维数组的定义一维数组的定义方式为:
数据类型名数组名[数组长度];举例://定义一个含有10个整型数据的数组arrayintarray[10];//定义一个含有20个双精度浮点型数据的数组numdoublenum[20];//定义一个含有30个字符型数据的数组strcharstr[30];7.1.1一维数组知识点每个元素的类型整型常量,指出元素个数,称为数组长度合法标识符在定义数组时,[]方括号中的数值是数组中元素的个数2、一维数组的引用一维数组中各个元素的引用方式:
数组名[元素的下标];7.1.1一维数组知识点(1) 先定义,再引用。(2) 数组中按照元素的顺序,从0开始为每个元素进行编号,这个编号称为下标,合理的下标取值依次为:0、1...(数组长度-1),分别对应着数组中第一个元素、第二个元素...最后一个元素。(3) 下标也可以为整型表达式,其取值范围为[0,数组长度-1],不在这个范围内的下标值为越界,越界会导致溢出。上溢或者下溢会导致程序出现不可预料的错误。(4) 只能逐个引用数组元素,不能一次性引用整个数组。对数组元素的引用是自由的,通过数组名和元素下标即可唯一确定一个数组元素。在引用时,[]方括号中数值给出了将要引用的元素的下标值。7.1.1一维数组知识点以下关于数组的说法,不正确的选项为:引用数组元素时,数组下标可以是整形常量或者整形表达式2、一维数组的引用一维数组中各个元素的引用方式:
数组名[元素的下标];7.1.1一维数组知识点举例: intarray[10];array[0]、array[1]、array[2]、array[3]、array[4]、array[5]、array[6]、array[7]、array[8]、array[9]
0
1
2
3
4
5
6
7
8
97.1.1一维数组知识点现定义了一维数组inta[4];关于数组元素的引用,正确的选项为:3、一维数组的初始化(1)在定义数组时初始化
数据类型名数组名[数组长度]={元素初值表};7.1.1一维数组知识点在定义数组时,根据元素初值表中给出的元素的个数,分三种情况为数组进行初始化:①元素初值表给出所有元素值②元素初值表只给出部分元素值③没有元素初值表3、一维数组的初始化(1)在定义数组时初始化
数据类型名数组名[数组长度]={元素初值表};7.1.1一维数组知识点①元素初值表给出所有元素值赋值的原则为:将初始表中给出的初值依次赋值给全部数组元素。举例:intarray[10]={1,2,3,4,5,6,7,8,9,10};等价于a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5,a[5]=6,a[6]=7,a[7]=8,a[8]=9,a[9]=10。若对所有元素赋值,可以省略数组长度,但不建议省略元素初值表中的初值个数不能超过数组长度。3、一维数组的初始化(1)在定义数组时初始化
数据类型名数组名[数组长度]={元素初值表};7.1.1一维数组知识点②元素初值表只给出部分元素值赋值的原则为:将初始表中给出的初值依次赋值给数组元素,其余元素自动赋值为0。举例:intnum[10]={1,2,3};等价于num[0]=1,num[1]=2,num[2]=3,num[3]~num[9]均为0。如何给全部元素赋初值为0intnum[10]={0};3、一维数组的初始化(1)在定义数组时初始化
数据类型名数组名[数组长度]={元素初值表};7.1.1一维数组知识点③没有元素初值表分两种情况:普通数组intgrade[10];//动态数组,所有元素的值是一个随机值。定义时加上static关键字的静态数组staticintgrade[10];//若没有对静态数组元素赋初值,所有元素自动被赋初值0。3、一维数组的初始化(2)在定义数组后,单独对数组元素赋值7.1.1一维数组知识点赋值的原则为:此时需要挨个为数组元素赋值。举例:①
intgrade[10];
grade[0]=80,grade[1]=90,grade[2]=85,grade[3]=75;
其他没有赋值的元素,其值为随机值。②for(i=0;i<10;i++) scanf("%d",&grade[i]);//是否正确?intscore[20];score[20]={80,90};4、一维数组的存储方式系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。7.1.1一维数组知识点举例
inta[10]={1,2,3,4,5,6,7,8,9,10};4、一维数组的存储方式系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。7.1.1一维数组知识点内存单元下标0123456789举例
inta[10]={1,2,3,4,5,6,7,8,9,10};4、一维数组的存储方式系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。7.1.1一维数组知识点举例
inta[10]={1,2,3,4,5,6,7,8,9,10};数组元素引用a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]内存单元下标01234567894、一维数组的存储方式系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。7.1.1一维数组知识点举例
inta[10]={1,2,3,4,5,6,7,8,9,10};数组元素引用a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]内存单元12345678910下标01234567894、一维数组的存储方式系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。7.1.1一维数组知识点举例
inta[10]={1,2,3,4,5,6,7,8,9,10};数组元素引用a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]内存单元12345678910下标0123456789地址信息8080808480888092809681008104810881128116整形数据在内存中占4个字节,若首地址为8080案例分析一维数组的编程方法7.1.4分析一维世界中新冠病毒感染情况7.1.5在一系列数据中删除第k个数据演示数组中每个元素的赋值和输出方法演示查找某个数据,并删除数组中元素的方法。下标作为循环变量,采用循环结构对数组进行操作巧用数组下标,简化问题解决。演示下标的其他用处,如坐标点。7.1.2一维数组案例分析7.1.3放射加密方法对一系列数据进行加密案例7.1.3:用放射加密方法对一系列数据进行加密,并输出加密后的数据。要求:输入10个数据,保存到数组中,并采用放射加密法对每个数据进行加密,最后输出加密后的10个数据。加密的公式:加密后数据=(7*数据+21)%26。问题分析:定义整型数组num保存这10个数据,数组长度定为10,定义i作为数组的下标,并将数组的下标i作为循环变量,通过循环变量i从0变到n-1,来逐个访问数组中的a[0]到a[n-1],并对其进行相应的操作。7.1.2一维数组案例分析#include<stdio.h>#defineN10/*定义符号常量N为10,后续代码N的地方*/intmain(void){inti;/*i既作为数组下标,又作为循环变量*/intnum[N]={50,34,40,68,60,45,39,47,51,30};for(i=0;i<N;i++){num[i]=(7*num[i]+21)%26;
}
printf("放射加密后的数据为:\n");for(i=0;i<N;i++){printf("%d",num[i]);}return0;}放射加密后的数据为:72515325248121423运行结果案例7.1.3程序代码7.1.2一维数组案例分析案例7.1.4:分析一维世界中新冠病毒感染情况要求:从2019年12月开始,新冠病毒在全球传播开来,该病毒传染性极强,只要某人与携带了该病毒的感染者在活动范围内有交集,则有被感染的可能。为了简化运算,假设人生活在一维世界中,Ta到过的地方为一个区间[begin,end],其中0≤begin≤end≤200。假设有二个人,A、B,其中A为新冠病毒感染者,B为健康者,依次给出4个整数beginAendAbeginBendB,分别为这A、B二人的活动区间,请分析B是否有被感染的可能。7.1.2一维数组案例分析案例7.1.4:分析一维世界中新冠病毒感染情况问题分析:在一维世界中,人的活动范围为[0,200],共201个点,定义intmark[201]={0}来记录这201点是否为感染者的活动点。假设0≤i≤200,若mark[i]=0,表示i这个点不是感染者的活动点,若mark[i]=1,表示i这个点是感染者的活动点。7.1.2一维数组案例分析O感染者A的活动范围beginAendAmark[beginA]~mark[endA]赋值为1beginBendBB循环判断mark[beginB]~mark[endB]中的值是否有1的情况#include<stdio.h>intmain(){intn,m,i,j,flag=0;//flag为0表示未被感染intbeginA,endA,beginB,endB;intmark[201]={0};//用于在0到200这些坐标点标记scanf("%d%d%d%d",&beginA,&endA,&beginB,&endB);//标记A活动过的坐标点for(i=beginA;i<=endA;i++){mark[i]=1;
//表示i这个坐标点为A感染者的活动点。}for(j=beginB;j<=endB;j++){/*若j这个坐标点已经被标记为1,说明B的活动点j是A感染者活动的点*/if(mark[j]==1){flag=1;//可能被感染时flag置为1break;}}if(flag==1)//通过flag的值来判断B是否可能被感染printf("B有可能被感染!");elseprintf("B暂无可能被感染!");return0;}运行结果1:5068345B暂无可能被感染!运行结果2:23453490B有可能被感染!运行结果案例7.1.4程序代码数组的下标还可以有其他的含义,比如坐标点。解决某些实际问题时,好好利用下标,会简化问题的求解。7.1.2一维数组案例分析案例7.1.5:在一系列数据中删除第k个数据要求:输入10个整数,将其保存到数组中。再输入一个要删除数据的下标index(从0开始),若该index值合法(0~9),则将该位置的数据从数组中删除,不合法则不执行任何操作。问题分析:定义长度为10的arr数组来保存10个数据,i作为数组的下标,index来保存要删除数据的下标值,删除了该下标处的数据后,该位置后面的数据要往前移动。7.1.2一维数组案例分析#include<stdio.h>intmain(){intarr[10]={0};intindex,i;for(i=0;i<=9;i++)scanf("%d",&arr[i]);scanf("%d",&index);if(index>=0&&index<=9){//先输出最开始的数组printf("原始数组为:\n");for(i=0;i<=9;i++)printf("%d",arr[i]);printf("\n");
for(i=index;i<9;i++)
//从index开始,i位置数据等于i+1,实现数据前移arr[i]=arr[i+1];printf("删除一个数据,新的数组为:\n");for(i=0;i<=8;i++)printf("%d",arr[i]);}else{printf("theindexiswrong!");}return0;}运行结果1:0123456789↙0↙原始数组为:0123456789删除下标0的元素,新的数组为:123456789运行结果2:0123456789↙9↙原始数组为:0123456789删除下标9的元素,新的数组为:012345678运行结果案例7.1.5程序代码7.1.2一维数组案例分析课堂练习题7.1.3:一维数组的循环左移先输入一个整数n和m,n表示元素的个数,m表示左移的位置,随后输入n个整数。请依次输出左移m位后的数组中所有的元素。举例: 输入: 82 12345678 输出: 345678127.1.3一维数组练习题课堂练习题7.1.1:两个一维数组相加先输入一个整数n,随后输入两行数据,每行n个整数,试计算这两行数据对应位置的和,并输出所有的和。举例:输入:51234567890输出7911135
课堂练习题7.1.2:输出某个大学生程序设计大赛中,最高的得分和最低的得分先输入一个整数n表示参加程序设计大赛的选手人数,随后给出n个整数表示每位参赛者的得分,用空格隔开。请输出这n位参赛者中最高的得分和最低的得分。7.2二维数组1234导入二维数组导入案例二维数组的定义引用初始化存储方式知识点二维数组的使用案例案例分析练习二维数组的使用练习题导入案例案例7.2.1:将C字母保存到矩阵中,并将该矩阵输出到屏幕上。现有一个C字母的黑白像素图片,下图,在该图片中,C字母的像素点使用黑色表示,其他地方用白色显示。试用矩阵的形式将该图片输出出来。导入案例案例7.2.1:将C字母保存到矩阵中,并将该矩阵输出到屏幕上。为了方便输出,黑色的像素点的矩阵值用1来表示,白色像素点的矩阵值用0来表示。C字母对应的矩阵如何保存矩阵中各个元素的值?9行8列二维数组导入案例#include<stdio.h>#defineM9//宏定义,M表示行数,9行#defineN8//N为列数,8列intmain(){/*9行8列的矩阵,需要9行8列的二维数组来存放,初值为0*/intpic[M][N]={0};inti,j;//1行3、4、5、6列为C字母的一部分,值为1for(i=3;i<=6;i++)pic[1][i]=1;
/*同样,2行2列、3行1列、4行1列、5行1列、6行2列为C字母一部分,值为1*/pic[2][2]=1,pic[3][1]=1,pic[4][1]=1,pic[5][1]=1;pic[6][2]=1;for(i=3;i<=6;i++) pic[7][i]=1;/*以上代码将C字母的矩阵保存到了二维数组中,下面将该二维数组输出即可。*/for(i=0;i<M;i++){for(j=0;j<N;j++)printf("%2d",pic[i][j]); printf("\n");}return0;}运行结果案例7.2.1程序代码对矩阵的操作可以用对二维数组的操作来实现。1、二维数组的定义二维数组的定义方式为:
数据类型名数组名[行长度][列长度];举例:
//定义一个10行10列的二维整型数组rect,共10*10=100个元素。intrect[10][10];//定义一个10行20列的二维字符数组names,共有10*20=200个字符元素。charnames[10][20];7.2.1二维数组知识点二维数组可被看作一个矩阵,有行也有列。定义时,第一个[]内指出的是二维数组的总行数,第二个[]内指出的是该二维数组的总列数,均为整型常量。每个元素的类型合法标识符2、二维数组的引用二维数组中各个元素的引用方式:
数组名[元素的行下标][元素的列下标];7.2.1二维数组知识点(1) 先定义,再引用。(2) 二维数组中的元素,需要通过其所在的行和列来唯一确定。(3) 行、列下标均为整型表达式,行下标取值范围:0~行长度-1;列下标取值范围:0~列长度-1,不在这个范围内的下标值为越界,越界会导致溢出。上溢或者下溢会导致程序出现不可预料的错误。(4) 只能逐个引用数组元素,不能一次性引用整个数组。对数组元素的引用是自由的,通过数组名和元素的行下标、列下标可唯一确定一个数组元素。在引用,需要给定该元素的行下标和列下标。第一个[]中的数值为元素的行下标。第二个[]中数值为元素的列下标。2、二维数组的引用二维数组中各个元素的引用方式:
数组名[元素的行下标][元素的列下标];7.2.1二维数组知识点举例:intrect[4][3];//定义了一个4行3列的二维数组rect,共4*3=12个元素。一维数组rect[0]一维数组rect[1]一维数组rect[2]一维数组rect[3]二维数组逻辑存储方式0行1232、二维数组的引用二维数组中各个元素的引用方式:
数组名[元素的行下标][元素的列下标];7.2.1二维数组知识点举例:intrect[4][3];//定义了一个4行3列的二维数组rect,共4*3=12个元素。二维数组按行存储示意图rect[0][0]rect[0][1]rect[0][2]rect[1][0]rect[1][1]rect[1][2]rect[2][0]rect[2][1]rect[2][2]rect[3][0]rect[3][1]rect[3][2]rect[0]
rect[1]
rect[2]
rect[3]在实际内存中的存放方式是按行存储3、二维数组的初始化(1)在定义数组时初始化
数据类型名数组名[行长度][列长度]={元素初值表};7.2.1二维数组知识点根据元素初值表中给出的元素的个数,分三种情况为数组进行初始化:①元素初值表给所有元素赋值②元素初值表给部分元素赋值③没有元素初值表3、二维数组的初始化(1)在定义数组时初始化
数据类型名数组名[行长度][列长度]={元素初值表};7.2.1二维数组知识点①元素初值表给所有元素赋值举例1:
intrect[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};该行代码采用按行分段赋值的方法对rect数组进行初始化。12345678910111201230123、二维数组的初始化(1)在定义数组时初始化
数据类型名数组名[行长度][列长度]={元素初值表};7.2.1二维数组知识点①元素初值表给所有元素赋值举例2:
intrect[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
第0行所有元素
第1行所有元素
第2行所有元素该行代码采用先按行再按列连续赋值的方法对rect数组进行初始化。123456789101112
0123
012在定义数组时如果对所有元素赋值,可以省略行长度。3、二维数组的初始化(1)在定义数组时初始化
数据类型名数组名[行长度][列长度]={元素初值表};7.2.1二维数组知识点②元素初值表给部分元素赋值若按行连续赋值,则将初始表中给出的初值先按行再按列依次赋值给数组元素,其余元素自动赋值为0。举例:intrect[3][4]={1,2,3,4,5,6};12345600000001230123、二维数组的初始化(1)在定义数组时初始化
数据类型名数组名[行长度][列长度]={元素初值表};7.2.1二维数组知识点②元素初值表给部分元素赋值按行分段赋值,举例:
intrect[3][4]={{1,2,3,4},{5,6}};
第0行元素
第1行的元素
intrect[10][10]={8};
intrect[3][4]={0};//所有元素赋值为0123456000000
0123
0123、二维数组的初始化(1)在定义数组时初始化
数据类型名数组名[行长度][列长度]={元素初值表};7.2.1二维数组知识点③没有元素初值表分两种情况:普通数组intarr[2][3];
//动态数组,所有元素的值是一个随机值。定义时加上static关键字的静态数组staticintarr[2][3];//若没有对静态数组元素赋初值,所有元素自动被赋初值0。3、二维数组的初始化(2)在定义数组后,单独对数组元素赋值7.2.1二维数组知识点此时需要挨个为数组元素赋值,可以一个一个元素赋值,也可以用双重循环赋值。举例:intarr[2][3];arr[0][0]=80,arr[0][1]=90,arr[0][2]=85,arr[1][0]=78,arr[1][1]=94,arr[1][2]=75;4、多维数组7.2.1二维数组知识点在前面讲解二维数组的引用时,我们讲到二维数组可以理解为多个一维数组,C语言允许这样解释。同样的,多维数组可以由二维数组类推而得到,此书不再讲解多维数组的问题。一维数组rect[0]一维数组rect[1]一维数组rect[2]一维数组rect[3]二维数组逻辑存储方式0行123案例分析二维数组的编程方法7.2.3判断下三角矩阵7.2.4求矩阵每行的最大值,以及每列的最小值演示遍历二维数组中每个元素的方法分别用行下标、列下标作为外层循环对矩阵的不同访问。行列下表作为循环变量,双层循环,遍历数组演示矩阵的下三角位置行列下标的关系。7.2.2二维数组案例分析7.2.2数据a与矩阵相乘二维数组的编程:二维数组涉及到两个下标,将数组行下标和列下标分别作为循环变量,双重循环,遍历数组。行下标作为外循环变量、列下标作为内循环变量,就会按照行来遍历数组;相反的,就会按照列来遍历数组。C语言中二维数组是按行存储的,按行遍历数组,程序执行效率最高。7.2.2二维数组案例分析案例7.2.2:将一个数a与矩阵相乘,并将结果保存到二维数组中,然后输出。要求:输入第一行为三个整数a、m和n,中间用空格隔开,m和n分别为矩阵的行和列(1≤m,n≤10)。随后的m行,每行输入n个整数,每个整数间用空格隔开。输出a与该矩阵相乘后的矩阵,并保存到二维数组中,然后输出。问题分析:在输入时,矩阵中的元素值是按行给出的,所以在读取矩阵中的元素值,也是要按行存放在二维数组中,按行存放时,行下标作为外循环变量,列下标作为内循环变量。7.2.2二维数组案例分析#include<stdio.h>intmain(){ intrect[10][10]={0}; inta,m,n,i,j,value; scanf("%d",&a); scanf("%d%d",&m,&n); for(i=0;i<m;i++){
for(j=0;j<n;j++){//按行来读取矩阵中的数据
scanf("%d",&value);/*将矩阵中的所有元素*a后存在相应位置的二维数组中*/ rect[i][j]=a*value;
} } for(i=0;i<m;i++){
for(j=0;j<n;j++)//将第i行所有元素输出,中间用空格隔开 printf("%d",rect[i][j]);
//当第i行的所有元素输出后,需要换行,准备下一次循环输出第i+1行的元素
printf("\n"); } return0;}运行结果:输入:232↙12↙34↙5
6↙输出:24681012运行结果案例7.2.2程序代码7.2.2二维数组案例分析案例7.2.3:判断下三角矩阵要求:输入第一行为一个整数m(1≤m≤10),表示方阵的行数和列数。随后m行数据,每一行都有m个整数,用空格隔开,试判断该方阵是否为下三角矩阵:如果一个方阵的主对角线上方的元素全部为0,这个矩阵就成为下三角矩阵。7.2.2二维数组案例分析用二维数组a表示m*m方阵时,行下标i、列下标j对应关系:a[0][0]a[0][1]a[0][2]
a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]主对角线:i==j副对角线:i+j==m-1上三角:i<=j下三角:i>=j#include<stdio.h>#defineMAX10intmain(){ intrect[MAX][MAX]={0}; intm,i,j; intflag=1;
//flag为1:为下三角矩阵,flag为0:不为下三角矩阵。 scanf("%d",&m); for(i=0;i<m;i++){ for(j=0;j<m;j++)
//按行来读取矩阵中元素,并存在数组中 scanf("%d",&rect[i][j]); } for(i=0;i<m;i++){ for(j=i+1;j<m;j++){ if(rect[i][j]!=0){ flag=0; break; } } } if(flag==1) printf("lowertriangularmatrix!"); else printf("notlowertriangularmatrix!"); return0;}运行结果1:5↙10000↙10000↙12000↙12300↙12340↙lowertriangularmatrix!运行结果2:5↙10010↙10010↙12000↙12300↙12340↙notlowertriangularmatrix!运行结果案例7.2.3程序代码7.2.2二维数组案例分析若删除break,结果如何?案例7.2.4:求矩阵每行的最大值,以及每列的最小值要求:输入第一行为两个整数m和n(1≤m,n≤10),表示矩阵的行数和列数。随后m行数据,每一行都有n个整数,用空格隔开,试输出该矩阵每行的最大值,以及每列的最小值。
问题分析:用二维数组来保存此矩阵,该矩阵有m行n列,那么共有m个最大值,n个最小值,所以可以定义两个数组max和min来保存所有的最大值和最小值。其中求每行最大值时,需要先按行遍历二维数组,求每列最小值时,需要按列遍历二维数组。7.2.2二维数组案例分析#include<stdio.h>#defineMAX10intmain(){
intrect[MAX][MAX];
//max保存每行最大值,min保存每列最小值inti,j,m,n,max[MAX]={0},min[MAX]={0};scanf("%d%d",&m,&n);for(i=0;i<m;i++){//读取矩阵,保存到二维数组中for(j=0;j<n;j++)scanf("%d",&rect[i][j]);}
/*求每一行的最大值存到max数组中,共m行,所以max数组中有m个值*/for(i=0;i<m;i++){//先假设第i行的第0列元素最大,再和后面列的数据进行比较max[i]=rect[i][0];for(j=1;j<n;j++){if(max[i]<rect[i][j])max[i]=rect[i][j];}}
案例7.2.4程序代码7.2.2二维数组案例分析
/*求每一列的最小值存到min数组中,共n列,mim数组中有n个值*/for(j=0;j<n;j++){min[j]=rect[0][j];for(i=1;i<m;i++)if(min[j]>rect[i][j])min[j]=rect[i][j];}printf("每行最大值如下:");for(i=0;i<m;i++) printf("%d",max[i]);printf("\n每列最小值如下:");for(i=0;i<n;i++) printf("%d",min[i]);return0;}运行结果1:45↙34539↙1020487↙2454913↙634547↙每行最大值如下:9202434每列最小值如下:34437运行结果//有错误的源程序#include<stdio.h>intmain(){ intarray[10][10]={0}; intflag;//标记是否存在k intm,n,k,i,j; scanf("%d%d%d",&m,&n,&k); for(i=0;i<m;i++){ for(j=0;j<n;j++){ scanf("%d",&array[i][j]); if(array[i][j]==k){ flag=1; printf("%d%d\n",i,j); } } } if(flag==0) printf("不存在%d这个数",k); return0;}7.2.3二维数组练习题课堂练习题7.2.1:程序调试题,请查找下面程序中的逻辑错误。输入三个整数m,n,k,其中m表示二维数组的行数,n表示二维数组的列数,k表示要查找的数据;随后输入m行n列数据,请输出m行n列的数据中是否存在k这个数据,如果存在输出第一次出现k时的行列号(从0开始计数)。输入:2510345107891031输出:03课堂练习题7.2.3:矩阵循环左移输入两个正整数n和m,其中n表示方阵的行列数,m表示矩阵中每个元素左移的位数,随后输入n行n列的数据。请输出左移m位后的方阵。举例: 输入: 42 1234 5678 8372 5127 输出: 3412 7856 7283 27517.2.3二维数组练习题课堂练习题7.2.2:找矩阵中的是否存在某个元素,该元素是所在行最大值、所在列最大值。输入两个正整数,m和n分别表示矩阵的行数和列数,随后输入m行n列的数据,请找出该矩阵中是否存某个元素:既是其所在行的最大值,又是其所在列的最大值),如果有鞍点,则输出其所在的行列号。(本练习题基于案例7.2.3来解决)7.3字符数组123一维字符数组字符串和字符数组的关系字符串结束符字符数组的输入和输出方式字符串处理函数二维字符数组知识点案例7.3.1案例7.3.2案例7.3.3案例分析练习字符数组的使用练习题1、一维字符数组存放了字符的数组就是字符数组。只有一个下标的就是一维字符数组。定义、初始化、引用都与其他类型的一维数组是一样的。举例:
chart[8]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’};等价于:t[0]=‘H’,t[1]=‘e’,t[2]=‘l’,t[3]=‘l’,t[4]=‘o’,t[5]=‘’,t[6]=‘C’,t[7]=‘!’。charstr[9]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’,’\0’};等价于:str[0]=‘H’,str[1]=‘e’,str[2]=‘l’,str[3]=‘l’,str[4]=‘o’,str[5]=‘’,str[6]=‘C’,str[7]=‘!’,str[8]=‘\0’较t数组,多了一个‘\0’字符,该字符的ASCII值为0在C语言的字符串处理中,‘\0’字符作为字符串的结束。7.3.1字符数组知识点字符数组名还是字符数组的地址,即首字符的地址。2、字符串与字符数组的关系字符串就是一组连续的字符的集合,它有一个结束标志‘\0’。使用一维字符数组来存储字符串。一维字符数组并不一定是字符串,主要在于一维字符数组中是否在所有字符后保存一个结束符‘\0’。举例:
若要保存”HelloC!”这个字符串常量,除了HelloC!这8个字符外,还有一个结束符‘\0’charstr[9]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’,’\0’};7.3.1字符数组知识点2、字符串与字符数组的关系举例:
chart[8]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’};charstr[9]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’,’\0’};字符数组str的有效长度:8
7.3.1字符数组知识点str和t数组的区别是什么?t数组没有保存‘\0’,它仅是一个字符数组.str不仅是一个字符数组,它还可以作为一个字符串。str的实际大小:93、字符串结束符访问内存中的一个字符串,需要知道
。'\0'意味着字符串的结束。charstr[9]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’,’\0’};C语言在处理字符串时,会从前往后逐个扫描字符,直到遇到第一个'\0'就认为到达了字符串的末尾,结束处理。7.3.1字符数组知识点字符串的地址+字符串的结束符#include<stdio.h>intmain(){inti;chars[17]="HelloCprogram!";//先给所有元素赋初值 printf("%s\n",s);s[0]='H';s[1]='a';s[2]='p';s[3]='p';s[4]='y';
s[5]='\0';
for(i=0;i<16;i++){//输出s字符数组中所有元素putchar(s[i]);;}
printf("\n");printf("%s\n",s);//将s作为一个字符串来处理return0;}运行结果举例,理解结束符7.3.1字符数组知识点HelloCprogram!HappyCprogram!Happy'\0'在输出时不显示内容。4、字符数组的输入和输出分为两种:7.3.1字符数组知识点①逐个元素的处理②整个数组一次性处理4、字符数组的输入和输出7.3.1字符数组知识点①逐个元素的处理涉及到的函数为:scanf()、printf()、getchar()、putchar(),使用这四个函数时需要添加stdio.h。在scanf()和printf()中使用格式控制说明符%c来进行单个字符的输入和输出。getchar()读取单个字符,并且只能读取单个字符。putchar()输出单个字符,并且只能输出单个字符。举例:charch;scanf("%c",&ch);//从键盘中读取一个字符,并存到变量ch中printf("%c",'A');//输出一个字符'A',也可输出一个字符变量ch=getchar();//从键盘中读取一个字符,并存到变量ch中putchar(ch);//输出一个字符变量,也可以输出字符常量4、字符数组的输入和输出7.3.1字符数组知识点②整个数组一次性处理涉及到的函数为:scanf()、printf()、gets()、puts()。在scanf()和printf()中使用格式控制说明符%s来进行字符串的输入和输出。scanf遇到空格、tab键或者回车便停止读取字符。gets()读取一行字符串。gets()在读取时,只要不遇到换行符就会一直读取,即使遇到多个空格,也不会停止读取。puts()输出字符串并换行。举例:charstr[10]={'\0'};scanf("%s",str);gets(str);puts(str);4、字符数组的输入和输出7.3.1字符数组知识点②整个数组一次性处理scanf()遇到空格、制表符tab或者换行符停止读取;gets()只会在遇到换行符’\n’停止读取。区别#include<stdio.h>intmain(){inti;chars[40];
scanf("%s",s); printf("%s\n",s);return0;}运行结果:WeareClanguagelearners.↙We使用scanf()读取字符串#include<stdio.h>intmain(){inti;chars[40];
gets(s); printf("%s\n",s);return0;}
运行结果:WeareClanguagelearners.↙WeareClanguagelearners.gets()读取字符串5、字符数组串处理函数7.3.1字符数组知识点常见的处理函数,包含在string.h头文件中。strlen()计算字符串有效长度strcmp()字符串比较strcat()字符串拼接函数strcpy()字符串拷贝函数strstr()字串查找函数需要#include<string.h>5、字符数组串处理函数7.3.1字符数组知识点(1)strlen计算字符串有效长度字符串包含两个部分:一组连续的字符序列和结束符’\0’,strlen()返回的是连续字符的个数。#include<stdio.h>intmain(){ charstr1[30]={"HelloClanguage!"}; charstr2[30]={"language"}; charstr3[10]="C++"; printf("%d\n",strlen(str1)); printf("%d\n",strlen(str2)); printf("%d\n",strlen(str3)); return0;}运行结果:17835、字符数组串处理函数7.3.1字符数组知识点(2)strcmp字符串比较函数strcmp(str1,str2)用于比较两个字符串大小,自左往右逐个字符的ASCII码值进行比较,直到出现不同的字符或者遇到‘\0’,其中str1和str2为字符串。0(当str1和str2中的字符完全一样时,str1等于str2)strcmp(str1,str2)
返回
正数
(当str1>str2)
负数
(当str1<str2)5、字符数组串处理函数7.3.1字符数组知识点(2)strcmp字符串比较函数举例:#include<stdio.h>intmain(){ charstr1[]="Abc";//如果对全部元素赋值,数组长度可以省略 charstr2[]="Abc"; charstr3[]="Acd"; charstr4[]="Bbca"; charstr5[]="Bbc"; printf("str1VSstr2is%d\n",strcmp(str1,str2)); printf("str1VSstr3is%d\n",strcmp(str1,str3)); printf("str3VSstr4is%d\n",strcmp(str3,str4)); printf("str4VSstr5is%d",strcmp(str4,str5)); return0;}运行结果:str1VSstr2is0str1VSstr3is-1str3VSstr4is-1str4VSstr5is15、字符数组串处理函数7.3.1字符数组知识点(3)strcat字符串拼接函数strcat(str1,str2)用于将str2拼接到str1后面,并返回str1,其中str1和str2为字符串。注意:该函数要求str1的字符数组长度要够长,能够放下str1的有效字符+str2的有效字符+一个结束符。5、字符数组串处理函数7.3.1字符数组知识点(3)strcat字符串拼接函数举例:#include<stdio.h>intmain(){ charstr1[30]={"Hello"}; charstr2[5]={"C"}; charstr3[10]={"language!"};
strcat(str1,str2); printf("str1:%s\n",str1);//str1中拼接了str2的内容 printf("str2:%s\n",str2);//str2字符串内容不变 strcat(str1,str3); printf("str1:%s",str1); return0;}运行结果:str1:HelloCstr2:Cstr1:HelloClanguage!5、字符数组串处理函数7.3.1字符数组知识点(4)strcpy字符串拷贝函数strcpy(str1,str2)用于将str2中的内容拷贝到str1中,会清除str1中原有的字符。注意:str1字符数组的大小要足够大能容纳str2数组中的字符,否则出现越界的现象。5、字符数组串处理函数7.3.1字符数组知识点(4)strcpy字符串拷贝函数举例:#include<stdio.h>intmain(){ charstr1[30]={"Hello"}; charstr2[30]={"Language"}; printf("before:str1:%s\n",str1); strcpy(str1,str2); printf("after:str1:%s\n",str1); return0;}运行结果:before:str1:Helloafter:str1:Language5、字符数组串处理函数7.3.1字符数组知识点(5)strstr字串查找函数strstr(str1,str2)用于判断str1是否含有str2这个字符串。如果有,str2则被称为str1的子串。该函数返回指向str1中str2第一个出现的位置的指针;如果str2不是sr1的子串,则返回NULL。5、字符数组串处理函数7.3.1字符数组知识点(5)strstr字串查找函数举例:#include<stdio.h>intmain(){ charstr1[30]={"HelloClanguage!"}; charstr2[30]={"language"}; charstr3[10]="C++"; char*p=strstr(str1,str2); printf("%s\n",p);//p指向str1中从'l'开始的"language"子串 printf("%d",strstr(str1,str3)==NULL);//str3不是str1的子串,所以strstr返回NULL return0;}运行结果:language!16、二维字符数组7.3.1字符数组知识点二维字符数组,可以理解为多个一维字符数组,如果一维字符数组中存放的是学生姓名,那二维数组就可以存放多个学生的姓名,其初始化、引用都和二维数组一样。举例:charname[3][20]={{“Peter”},{“Tom”},{“Emily”}};3行20列,表示3个一维字符数组(每个数组最多20个字符),可以保存3个字符串。name[0]name[1]name[2]案例7.3.1:查找特定的字符要求:本例包含两行输入,输入第一行是一串以回车符结束的字符串str(不超过50个字符),第二行是要查找的字符ch。如果在给定的字符串str中找到了字符ch,则输出在str中最先出现ch的下标(从0开始计数);若未找到,则输出“NotFound!”7.3.2字符数组案例分析str数组的长度应该定义为多少?#include<stdio.h>intmain(){inti,flag=0;//flag为0表示没有找到charstr[51]={'\0'},ch;gets(str);ch=getchar();for(i=0;str[i]!='\0';i++){if(ch==str[i]){flag=1;printf("Thefirstindexof%cis%d",ch,i);break;}}if(flag==0){printf("NotFound!");}}运行结果:Lifeislikeaboxofchocolates↙l↙Thefirstindexoflis8运行结果案例7.3.1程序代码7.3.2字符数组案例分析案例7.3.2:删除重复数字字符要求:输入是一串以回车符结束的字符串str(不超过80个字符),编写程序将str字符串重复的数字字符删除,其他字符原样输出。问题分析:(1)定义长度为10的number数组来保存某个数字是否出现过。比如,若6出现过,则number[6]为1,若6没有出现,则number[6]为0;所以number[0]、number[1]、number[2]…number[9]依次表示数字0、1、2…9是否出现过,元素值为1表示出现过,元素值为0表示没出现过。(2)在后续输出str时,对于其中的数字字符,先转化为相应的数字,再判断number[该数字]的值是否为0,为0表示没出现过,便可以直接输出。7.3.2字符数组案例分析#include<stdio.h>intmain(){inti,number[10]={0};//标记某个数字是否出现过charstr[81]={'\0'};gets(str);for(i=0;str[i]!='\0';i++){if(str[i]>='0'&&str[i]<='9'){intindex=str[i]-'0';//数字字符转对应数字if(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑工程钢筋施工合同
- 房地产居间中介服务合同
- 车绿本抵押贷款合同
- 《公平是社会稳定的天平》我们崇尚公平课件-4
- 除尘布袋供货合同范本
- 沼气服务合同范本
- 2025教师资格考试高中地理标准预测试卷答案及解析6-10
- 口腔合作合同范本
- 解除卖买合同范本
- 铁路管理红线培训课件
- 简约喜庆元宵节介绍模板 教学课件
- 西藏林芝嘉园小区项目可研(可研发)
- 丧假证明模板
- summary-writing-概要写作-优质课件
- 按期取得毕业证和学位证承诺书
- T∕CIC 049-2021 水泥窑用固体替代燃料
- 部编版高中语文必修下册第八单元《单元导读》教学设计
- 第五章 学校教育的主要活动形式:课堂教学
- 大会—冠脉微循环障碍
- 《办公自动化》教学教案
- 动物检疫学讲义课件
评论
0/150
提交评论