2020/3/41上一节我们学到了二维数组的定义、初始化和引用基本的矩阵运算选择法排序首先从0到n-1个元素中选出关键字最小的记录交换到第0个位置上。然后再从第1到n个元素中选出次小的记录交换到第1个位置上,依次类推。[35281]第1趟1[5283]第2趟12[583]第3趟123[85]第4趟1235[8]选择法排序(程序段)for(i=0;in-1;i++){min=i;for(j=i+1;jn;j++)//min是a[i~n-1]中最小值下标if(a[j]a[min])min=j;//a[min]-a[i]temp=a[min];a[min]=a[i];a[i]=temp;}Entern:5Enter5integers:35281Aftersorted:123582020/3/44第六章利用数组处理批量数据2020/3/456.1怎样定义和引用一维数组6.2怎样定义和引用二维数组6.3字符数组内容Contents2020/3/466.3字符数组6.3.1怎样定义字符数组6.3.2字符数组的初始化6.3.3怎样引用字符数组中的元素6.3.4字符串和字符串结束标志6.3.5字符数组的输入输出6.3.6善于使用字符串处理函数6.3.7字符数组应用举例2020/3/47charc[10];c[0]='I';c[1]='';c[2]='a';c[3]='m';c[4]='';c[5]='h';c[6]='a';c[7]='p';c[8]='p';c[9]='y';6.3.1怎样定义字符数组Iamhappyc[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]6.3.2字符数组的初始化charc[10]={'I','','a','m','','h','a','p','p','y'};如初值个数小于数组长度,剩余元素自动设为空字符,即'\0'charc[10]={'c','','p','r','o','g','r','a','m'};2020/3/48Iamhappyc[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]cprogram\0c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]6.3.2字符数组的初始化chardiamond[5][5]={{'','','*'},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}};2020/3/496.3.3怎样引用字符数组中的元素例6.6输出一个已知的字符串。解题思路:定义一个字符数组,并用初始化列表对其赋以初值用循环逐个输出此字符数组中的字符2020/3/4102020/3/411#includestdio.hintmain(void){charc[15]={'I','','a','m','','a','','s','t','u','d','e','n','t','.'};inti;for(i=0;i15;i++)printf(%c,c[i]);printf(\n);return0;}6.3.3怎样引用字符数组中的元素6.3.3怎样引用字符数组中的元素例6.7输出一个菱形图。解题思路:定义一个字符型的二维数组,用初始化列表进行初始化用嵌套的for循环输出字符数组中的所有元素。2020/3/4122020/3/413#includestdio.hintmain(void){chardiamond[][5]={{'','','*'},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}};inti,j;for(i=0;i5;i++){for(j=0;j5;j++)putchar(diamond[i][j]);printf(\n);}return0;}6.3.4字符串和字符串结束标志在C语言中,将字符串作为特殊的字符数组来处理以空字符'\0'结尾的字符数组‘\0’代表ASCII码为0的字符,称为“空操作符”,仅是一个结束标志2020/3/414字符串常量(stringliteral)用一对双引号括起来的字符序列,隐含结束符'\0'Happy6个字符'H''a''p''p''y''\0'2020/3/415有效字符字符串结束符字符串的长度:有效字符的个数,不包括'\0'字符串的表示C语言中,一个字符串可以声明为一个字符数组;或一个字符指针。本章我们先来学习“字符数组表示字符串”。charc[10];Q:如果这个字符数组用来表示字符串,则最多能存放多少个字符的字符串?9个,因为还要留一个位置给’\0’2020/3/4166.3.4字符数组的初始化charc[10]={China};可写成charc[10]=China;从c[5]开始,元素值均为'\0'printf(%s,c);2020/3/417China\0\0\0\0\0数组长度可省略charc[]={Iamhappy};可写成charc[]=Iamhappy;相当于charc[11]={Iamhappy};2020/3/4186.3.5字符数组的输入chars[10];scanf(%s,s);China↙数组名country前没有&输入遇到空白字符(空格、tab、回车)结束输入:howareyou系统自动在China后面加一个'\0'输入的字符串应短于已定义的字符数组的长度若等于或大于,会引起不确定的行为2020/3/4196.3.5字符数组的输出charc[10]={China};printf(%s,c);如果一个字符数组中包含多个'\0',则遇第一个'\0'时输出就结束输出的字符中不包括结束符'\0'2020/3/4206.3.6善于使用字符串处理函数在C函数库中提供了一些用来专门处理字符串的函数,#includestring.h1.puts2.gets3.strcat4.strcpy和strncpy5.strcmp6.strlen7.strlwr8.strupr2020/3/421puts(字符数组名)作用是将一个字符串输出到终端,遇到’\0’时输出结束charstr[20]=China;puts(str);输出China2020/3/4221.puts函数----输出字符串#includestdio.hintmain(){charc[10];scanf(%s,c);printf(%s,c);printf(\n);return0;}2020/3/423若输入:howareyou则输出?2.gets函数----输入字符串gets(字符数组名)作用是输入一个字符串到字符数组,直到遇到一个换行符'\n'。并自动在所有字符后添加一个空字符'\0'charstr[20];gets(str);howareyou↙2020/3/424/*name1.c--readsaname*/#includestdio.h#defineMAX81intmain(void){charname[MAX];/*allotspace*/printf(Hi,what'syourname?\n);gets(name);/*placestringintonamearray*/printf(Nicename,%s.\n,name);return0;}2020/3/4253.strcat函数----字符串连接strcat(字符数组1,字符数组2)作用是把字符串2接到字符串1的后面,结果放在字符数组1中例charstr1[30]=“hello;charstr2[]=“world;printf(%s,strcat(str1,str2));输出:helloworld2020/3/426str1要足够大4.strcpy和strncpy函数-字符串复制strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组(或字符指针)1中charstr1[10],str2[]=China;strcpy(str1,str2);//strcpy(str1,“China”);也可2020/3/427China\0\0\0\0\0str1str1要足够大4.strcpy和strncpy函数-字符串复制charstr1[10],str2[]=China;str1=China;错误str1=str2;错误2020/3/4284.strncpy函数-字符串复制将字符串2中前n个字符替代字符数组1的前n个字符strncpy(str1,str2,2);作用是将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符复制的字符个数n不应多于str1中原有的字符2020/3/4295.strcmp函数----字符串比较strcmp(字符串1,字符串2)比较规则将两个字符串自左至右逐个字符相比,直到出现不同的字符或遇到'\0'为止如全部字符相同,认为两个字符串相等若出现不相同的字符,则以第一对不相同的字符的字典序比较结果为准strcmp(str1,str2);strcmp(China,Korea);strcmp(str1,Beijing);2020/3/4305.strcmp函数----字符串比较比较的结果由函数值带回如果字符串1=字符串2,则函数值为0如果字符串1字符串2,则函数值为一个正整数如果字符串1字符串2,则函数值为一个负整数2020/3/4315.strcmp函数----字符串比较ABaAcomputercomparethesethat1A$20CHINACANADADOGcatTsinghuaTSINGHUA2020/3/4325.strcmp函数----字符串比较if(str1str2)printf(yes);错误if(strcmp(str1,str2)0)printf(yes);正确2020/3/4336.strlen函数----测字符串长度strlen(字符数组)函数的返回值为字符串中的实际长度,不包括’\0’charstr[10]=China;printf(%d,strlen(str));输出结果是5也可以直接测试字符串常量的长度strlen(China);2020/3/4347.strlwr函数----转换为小写strlwr(字符串)作用是将字符串中大写字母换成小写字母2020/3/4358.strupr函数----转换为大写strupr(字符串)作用是将字符串中小写字母换成大写字母2020/3/4366.3.7字符数组应用举例例6.8输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。例6.9有3个字符串,要求找出其中最大者。2020/3/437例6.8输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。解题思路:问题的关键是怎样确定出现一个新单词了“判断是否出现新单词,可以由是否有空格出现来决定(连续的若干个空格作为出现一次空格;一行开头的空格不统计在内)如果测出某一个字符为非空格,而它前面的字符是空格,则表示新的单词开始了,此时使num累加12020/3/438分析出所有四种情况当前字符上一字符spacenum空格空格0不变空格非空格0不变非空格空格1num++非空格非空格1不变2020/3/439Q:word和num的初值?Q:如何判断当前字符是否空格?string[i]==''Q:如何判断上一字符是否非空格?space==1#includestdio.hintmain(void){charstring[81];inti;intnum=0;//单词个数intspace=1;//当前字符是否空格。0表示不是空格,1表示是空格。gets(string);for(i=0;string[i]!='\0';+