C语言数组的应用

操作方法

  • 01

    C语言数组的应用 C语言一维数组的定义和引用 (一) 维数组的界说和引证 在程序设计中,为了处置便利,把具有一样类型的若干变量按有序的办法组织起来。这些按序摆放的同类数据元素的调集称为数组。在C言语中,数组归于布局数据类型。一个数组能够分化为多个数组元素,这些数组元素能够是根本数据类型或是布局类型。因而按数组元素的类型不一样,数组又可分为数值数组、字符数组、指针数组、布局数组等各种种类。本章介绍数值数组和字符数组,其他的在今后各章接连介绍。 7.1一维数组的界说和引证 7.1.1一维数组的界说办法 在C言语中运用数组有必要先进行界说。一维数组的界说办法为:类型阐明符数组名[常量表达式]; 其间:类型阐明符是任一种根本数据类型或布局数据类型。数组名是用户界说的数组标识符。方括号中的常量表达式表明数据元素的个数,也称为数组的长度。 例如: int a[10];阐明整型数组a,有10个元素。 float b[10],c[20];阐明实型数组b,有10个元素,实型数组c,有20个元素。 char ch[20];阐明字符数组ch,有20个元素。 关于数组类型阐明应注意以下几点: 数组的类型实践上是指数组元素的取值类型。关于同一个数组,其一切元素的数据类型都是一样的。 数组名的书写规则应契合标识符的书写规则。 数组名不能与其它变量名一样。 例如: main() { int a; float a[10]; …… } 是过错的。 方括号中常量表达式表明数组元素的个数,如a[5]表明数组a有5个元素。可是其下标从0开端核算。因而5个元素别离为a[0],a[1],a[2],a[3],a[4]。 不能在方括号顶用变量来表明元素的个数,可是能够是符号常数或常量表达式。 例如: #define FD 5 main() { int a[3+2],b[7+FD]; …… } 是合法的。可是下述阐明办法是过错的。 main() { int n=5; int a[n]; …… } 答应在同一个类型阐明中,阐明多个数组和多个变量。 例如: int a,b,c,d,k1[10],k2[20]; 7.1.2一维数组元素的引证 数组元素是组成数组的根本单元。数组元素也是一种变量,其标识办法为数组名后跟一个下标。下标表明晰元素在数组中的次序号。数组元素的一般办法为:数组名[下标] 其间下标只能为整型常量或整型表达式。如为小数时,C编译将主动取整。例如: a[5] a[i+j] a[i++] 都是合法的数组元素。 数组元素一般也称为下标变量。有必要先界说数组,才干运用下标变量。在C言语中只能逐一地运用下标变量,而不能一次引证整个数组。例如,输出有10个元素的数组有必要运用循环句子逐一输出各下标变量: for(i=0; i<10; i++) printf("%d",a[i]); 而不能用一个句子输出整个数组。 下面的写法是过错的: printf("%d",a); 【例7.1】 main() { int i,a[10]; for(i=0;i<=9;i++) a[i]=i; for(i=9;i>=0;i--) printf("%d ",a[i]); } 【例7.2】 main() { int i,a[10]; for(i=0;i<10;) a[i++]=i; for(i=9;i>=0;i--) printf("%d",a[i]); } 【例7.3】 main() { int i,a[10]; for(i=0;i<10;) a[i++]=2*i+1; for(i=0;i<=9;i++) printf("%d ",a[i]); printf("\n%d %d\n",a[5.2],a[5.8]); } 本例顶用一个循环句子给a数组各元素送入奇数值,然后用第二个循环句子输出各个奇数。在榜首个for句子中,表达式3省掉了。在下标变量中运用了表达式i++,用以修正循环变量。当然第二个for句子也能够这样作,C言语答运用表达式表明下标。程序中最终一个printf句子输出了两次a[5]的值,能够看出当下标不为整数时将主动取整。 7.1.3一维数组的初始化 给数组赋值的办法除了用赋值句子对数组元素逐一赋值外,还可选用初始化赋值和动态赋值的办法。 数组初始化赋值是指在数组界说时给数组元素赋予初值。数组初始化是在编译期间进行的。这样将削减运转时刻,进步功率。初始化赋值的一般办法为:类型阐明符数组名[常量表达式]={值,值……值}; 其间在{ }中的各数据值即为各元素的初值,各值之间用逗号距离。 例如: int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于 a[0]=0;a[1]=1...a[9]=9; C言语对数组的初始化赋值还有以下几点规则: 能够只给有些元素赋初值。 当{ }中值的个数少于元素个数时,只给前面有些元素赋值。例如: int a[10]={0,1,2,3,4}; 表明只给a[0]~a[4]5个元素赋值,然后5个元素主动赋0值。 只能给元素逐一赋值,不能给数组全体赋值。 例如给十个元素悉数赋1值,只能写为: int a[10]={1,1,1,1,1,1,1,1,1,1}; 而不能写为: int a[10]=1; 如给悉数元素赋值,则在数组阐明中,能够不给出数组元素的个数。 例如: int a[5]={1,2,3,4,5}; 可写为: int a[]={1,2,3,4,5}; 7.1.4一维数组程序举例 能够在程序履行过程中,对数组作动态赋值。这时可用循环句子合作scanf函数逐一对数组元素赋值。 【例7.4】 main() { int i,max,a[10]; printf("input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); max=a[0]; for(i=1;i<10;i++) if(a[i]>max) max=a[i]; printf("maxmum=%d\n",max); } 本例程序中榜首个for句子逐一输入10个数到数组a中。然后把a[0]送入max中。在第二个for句子中,从a[1]到a[9]逐一与max中的内容对比,若比max的值大,则把该下标变量送入max中,因而max总是在已对比过的下标变量中为最大者。对比完毕,输出max的值。 【例7.5】 main() { int i,j,p,q,s,a[10]; printf("\n input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++){ p=i;q=a[i]; for(j=i+1;j<10;j++) if(qif(i!=p) {s=a[i]; a[i]=a[p]; a[p]=s; } printf("%d",a[i]); } } 本例程序顶用了两个并排的for循环句子,在第二个for句子中又嵌套了一个循环句子。榜首个for句子用于输入10个元素的初值。第二个for句子用于排序。本程序的排序选用逐一对比的办法进行。在i次循环时,把榜首个元素的下标i赋于p,而把该下标变量值a[i]赋于q。然后进入小循环,从a[i+1]起到最终一个元素止逐一与a[i]作对比,有比a[i]大者则将其下标送p,元素值送q。一次循环完毕后,p即为最大元素的下标,q则为该元素值。若此刻i≠p,阐明p,q值均已不是进入小循环之前所赋之值,则交流a[i]和a[p]之值。此刻a[i]为已排序完毕的元素。输出该值之后转入下一次循环。对i+1今后各个元素排序。 (二) 二维数组的界说和引证 前面介绍的数组只要一个下标,称为一维数组,其数组元素也称为单下标变量。在实践问题中有很多量是二维的或多维的,因而C言语答应布局多维数组。多维数组元素有多个下标,以标识它在数组中的方位,所以也称为多下标变量。本末节只介绍二维数组,多维数组可由二维数组类比而得到。 二维数组界说的一般办法是:类型阐明符数组名[常量表达式1][常量表达式2] 其间常量表达式1表明榜首维下标的长度,常量表达式2表明第二维下标的长度。例如: int a[3][4]; 阐明晰一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即: a[0][0],a[0][1],a[0][2],a[0][3] a[1][0],a[1][1],a[1][2],a[1][3] a[2][0],a[2][1],a[2][2],a[2][3] 二维数组在概念上是二维的,便是说其下标在两个方向上改变,下标变量在数组中的方位也处于一个平面之中,而不是象一维数组仅仅一个向量。可是,实践的硬件存储器却是接连编址的,也即是说存储器单元是按一维线性摆放的。如安在一维存储器中寄存二维数组,可有两种办法:一种是按行摆放,即放完一行之后依次放入第二行。另一种是按列摆放,即放完一列之后再依次放入第二列。 在C言语中,二维数组是按行摆放的。即,先寄存a[0]行,再寄存a[1]行,最终寄存a[2]行。每行中有四个元素也是依次寄存。因为数组a阐明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节)。 7.1.2二维数组元素的引证 二维数组的元素也称为双下标变量,其表明的办法为: 数组名[下标][下标] 其间下标应为整型常量或整型表达式。例如: a[3][4] 表明a数组三行四列的元素。 下标变量和数组阐明在办法中有些类似,但这两者具有彻底不一样的意义。数组阐明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的方位标识。前者只能是常量,后者能够是常量,变量或表达式。 【例7.6】一个学习小组有5自己,每自己有三门课的考试成果。求全组分科的均匀成果和各科总均匀成果。 张王李赵周 Math 80 61 59 85 76 C 75 65 63 87 77 Foxpro 92 71 70 90 85 可设一个二维数组a[5][3]寄存五自己三门课的成果。再设一个一维数组v[3]寄存所求得各分科均匀成果,设变量average为全组各科总均匀成果。编程如下: main() { int i,j,s=0,average,v[3],a[5][3]; printf("input score\n"); for(i=0;i<3;i++) { for(j=0;j<5;j++) { scanf("%d",&a[j][i]); s=s+a[j][i];} v[i]=s/5; s=0; } average =(v[0]+v[1]+v[2])/3; printf("math:%d\nc languag:%d\ndbase:%d\n",v[0],v[1],v[2]); printf("total:%d\n", average ); } 程序中首要用了一个两层循环。在内循环中依次读入某一门课程的各个学生的成果,并把这些成果累加起来,退出内循环后再把该累加成果除以5送入v[i]之中,这即是该门课程的均匀成果。外循环共循环三次,别离求出三门课各自的均匀成果并寄存在v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总均匀成果。最终按题意输出各个成果。 7.1.3二维数组的初始化 二维数组初始化也是在类型阐明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行接连赋值。例如对数组a[5][3]: 按行分段赋值可写为: int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} }; 按行接连赋值可写为: int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85}; 这两种赋初值的成果是彻底一样的。 【例7.7】 main() { int i,j,s=0, average,v[3]; int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}}; for(i=0;i<3;i++) { for(j=0;j<5;j++) s=s+a[j][i]; v[i]=s/5; s=0; } average=(v[0]+v[1]+v[2])/3; printf("math:%d\nc languag:%d\ndFoxpro:%d\n",v[0],v[1],v[2]); printf("total:%d\n", average); } 关于二维数组初始化赋值还有以下阐明: 能够只对有些元素赋初值,未赋初值的元素主动取0值。 例如: int a[3][3]={{1},{2},{3}}; 是对每一行的榜首列元素赋值,未赋值的元素取0值。赋值后各元素的值为: 1 0 0 2 0 0 3 0 0 int a [3][3]={{0,1},{0,0,2},{3}}; 赋值后的元素值为: 0 1 0 0 0 2 3 0 0 如对悉数元素赋初值,则榜首维的长度能够不给出。 例如: int a[3][3]={1,2,3,4,5,6,7,8,9}; 能够写为: int a[][3]={1,2,3,4,5,6,7,8,9}; 数组是一种布局类型的数据。二维数组能够看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,条件是各元素类型有必要一样。依据这样的剖析,一个二维数组也能够分化为多个一维数组。C言语答应这种分化。 如二维数组a[3][4],可分化为三个一维数组,其数组名别离为: a[0] a[1] a[2] 对这三个一维数组不需另作阐明即可运用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。有必要着重的是,a[0],a[1],a[2]不能当作下标变量运用,它们是数组名,不是一个单纯的下标变量。 (三) 字符数组的运用 用来寄存字符量的数组称为字符数组。 7.1.1字符数组的界说 办法与前面介绍的数值数组一样。例如: char c[10]; 因为字符型和整型通用,也能够界说为int c[10]但这时每个数组元素占2个字节的内存单元。 字符数组也能够是二维或多维数组。例如: char c[5][10]; 即为二维字符数组。 7.1.2字符数组的初始化 字符数组也答应在界说时作初始化赋值。 例如: char c[10]={‘c’, ‘’, ‘p’, ‘r’, ‘o’, ‘g’, ‘r’, ‘a’,’m’}; 赋值后各元素的值为:数组C c[0]的值为‘c’ c[1]的值为‘’ c[2]的值为‘p’ c[3]的值为‘r’ c[4]的值为‘0’ c[5]的值为‘g’ c[6]的值为‘r’ c[7]的值为‘a’ c[8]的值为‘m’ 其间c[9]未赋值,由的值为‘p’体系主动赋予0值。当对全体元素赋初值时也能够省去长度阐明。例如: char c[]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`}; 这时C数组的长度主动定为9。 7.1.3字符数组的引证 【例7.8】 main() { int i,j; char a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}}; for(i=0;i<=1;i++) { for(j=0;j<=4;j++) printf("%c",a[i][j]); printf("\n"); } } 本例的二维字符数组因为在初始化时悉数元素都赋以初值,因而一维下标的长度能够不加以阐明。 7.1.4字符串和字符串完毕象征 在C言语中没有专门的字符串变量,一般用一个字符数组来寄存一个字符串。前面介绍字符串常量时,已阐明字符串总是以'\0'作为串的完毕符。因而当把一个字符串存入一个数组时,也把完毕符'\0'存入数组,并以此作为该字符串是不是完毕的象征。有了'\0'象征后,就不用再用字符数组的长度来判别字符串的长度了。 C言语答运用字符串的办法对数组作初始化赋值。例如: char c[]={'c', ' ','p','r','o','g','r','a','m'}; 可写为: char c[]={"C program"}; 或去掉{}写为: char c[]="C program"; 用字符串办法赋值比用字符逐一赋值要多占一个字节,用于寄存字符串完毕象征'\0'。上面的数组c在内存中的实践寄存状况为: Cp r o g r a m \0 ‘\0'是由C编译体系主动加上的。因为选用了‘\0'象征,所以在用字符串赋初值时一般无须指定数组的长度,而由体系自行处置。 7.1.5字符数组的输入输出 在选用字符串办法后,字符数组的输入输出将变得简略便利。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不用运用循环句子逐一地输入输出每个字符。 【例7.9】 main() { char c[]="BASIC\ndBASE"; printf("%s\n",c); } 注意在本例的printf函数中,运用的格局字符串为“%s”,表明输出的是一个字符串。而在输出表列中给出数组名则可。不能写为:printf("%s",c[]); 【例7.10】 main() { char st[15]; printf("input string:\n"); scanf("%s",st); printf("%s\n",st); } 本例中因为界说数组长度为15,因而输入的字符串长度有必要小于15,以留出一个字节用于寄存字符串完毕象征`\0`。大概阐明的是,对一个字符数组,若是不作初始化赋值,则有必要阐明数组长度。还大概特别注意的是,当用scanf函数输入字符串时,字符串中不能富含空格,不然将以空格作为串的完毕符。 例如当输入的字符串中富含空格时,运转状况为: input string: this is a book 输出为: this 从输出成果能够看出空格今后的字符都未能输出。为了防止这种状况,可多设几个字符数组分段寄存含空格的串。程序可改写如下: 【例7.11】 main() { char st1[6],st2[6],st3[6],st4[6]; printf("input string:\n"); scanf("%s%s%s%s",st1,st2,st3,st4); printf("%s %s %s %s\n",st1,st2,st3,st4); } 本程序别离设了四个数组,输入的一行字符的空格分段别离装入四个数组。然后别离输出这四个数组中的字符串。在前面介绍过,scanf的各输入项有必要以地址办法呈现,如&a,&b等。但在前例中却是以数组名办法呈现的,这是为何呢? 这是因为在C言语中规则,数组名就代表了该数组的首地址。整个数组是以首地址最初的一块接连的内存单元。如有字符数组char c[10],在内存可表明如图。 C[0] C[1] C[2] C[3] C[4] C[5] C[6] C[7] C[8] C[9] 设数组c的首地址为2000,也即是说c[0]单元地址为2000。则数组名c就代表这个首地址。因而在c前面不能再加地址运算符&。如写作scanf("%s",&c);则是过错的。在履行函数printf("%s",c)时,按数组名c找到首地址,然后逐一输出数组中各个字符直到遇到字符串停止象征'\0'停止。 7.1.6字符串处置函数 C言语供给了丰厚的字符串处置函数,大致可分为字符串的输入、输出、兼并、修正、对比、变换、仿制、查找几类。运用这些函数可大大减轻编程的担负。用于输入输出的字符串函数,在运用前应包括头文件"stdio.h",运用其它字符串函数则应包括头文件"string.h"。 下面介绍几个最常用的字符串函数。 字符串输出函数puts 格局:puts (字符数组名) 功用:把字符数组中的字符串输出到显现器。即在屏幕上显现该字符串。 【例7.12】 #include"stdio.h" main() { char c[]="BASIC\ndBASE"; puts(c); } 从程序中能够看出puts函数中能够运用转义字符,因而输出成果变成两行。puts函数彻底能够由printf函数替代。当需要按必定格局输出时,一般运用printf函数。 字符串输入函数gets 格局:gets(字符数组名) 功用:从规范输入设备键盘上输入一个字符串。 本函数得到一个函数值,即为该字符数组的首地址。 【例7.13】 #include"stdio.h" main() { char st[15]; printf("input string:\n"); gets(st); puts(st); } 能够看出当输入的字符串中富含空格时,输出仍为悉数字符串。阐明gets函数并不以空格作为字符串输入完毕的象征,而只以回车作为输入完毕。这是与scanf函数不一样的。 字符串衔接函数strcat 格局:strcat (字符数组名1,字符数组名2) 功用:把字符数组2中的字符串衔接到字符数组1中字符串的后边,并删去字符串1后的串象征“\0”。本函数回来值是字符数组1的首地址。 【例7.14】 #include"string.h" main() { static char st1[30]="My name is "; int st2[10]; printf("input your name:\n"); gets(st2); strcat(st1,st2); puts(st1); } 本程序把初始化赋值的字符数组与动态赋值的字符串衔接起来。要注意的是,字符数组1应界说满足的长度,不然不能悉数装入被衔接的字符串。 字符串复制函数strcpy 格局:strcpy (字符数组名1,字符数组名2) 功用:把字符数组2中的字符串复制到字符数组1中。串完毕象征“\0”也一起复制。字符数名2,也能够是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。 【例7.15】 #include"string.h" main() { char st1[15],st2[]="C Language"; strcpy(st1,st2); puts(st1);printf("\n"); } 本函数需求字符数组1应有满足的长度,不然不能悉数装入所复制的字符串。 字符串对比函数strcmp 格局:strcmp(字符数组名1,字符数组名2) 功用:依照ASCII码次序对比两个数组中的字符串,并由函数回来值回来对比成果。 字符串1=字符串2,回来值=0; 字符串2〉字符串2,回来值〉0; 字符串1〈字符串2,回来值〈0。 本函数也可用于对比两个字符串常量,或对比数组和字符串常量。 【例7.16】 #include"string.h" main() { int k; static char st1[15],st2[]="C Language"; printf("input a string:\n"); gets(st1); k=strcmp(st1,st2); if(k==0) printf("st1=st2\n"); if(k>0) printf("st1>st2\n"); if(k<0) printf("st1 } 本程序中把输入的字符串和数组st2中的串对比,对比成果回来到k中,依据k值再输出成果提示串。当输入为dbase时,由ASCII码可知“dBASE”大于“C Language”故k〉0,输出成果“st1>st2”。 测字符串长度函数strlen 格局:strlen(字符数组名) 功用:测字符串的实践长度(不含字符串完毕象征‘\0’)并作为函数回来值。 【例7.17】 #include"string.h" main() { int k; static char st[]="C language"; k=strlen(st); printf("The lenth of the string is %d\n",k); (四) 数组程序举例 把一个整数按巨细次序刺进已排好序的数组中。 为了把一个数按巨细刺进已排好序的数组中,应首要断定排序是从大到小仍是从小到大进行的。设排序是从大到小进序的,则可把欲刺进的数与数组中各数逐一对比,当找到榜首个比刺进数小的元素i时,该元素之前即为刺进方位。然后从数组最终一个元素开端到该元素停止,逐一后移一个单元。最终把刺进数赋予元素i即可。若是被刺进数比一切的元素值都小则刺进最终方位。 main() { int i,j,p,q,s,n,a[11]={127,3,6,28,54,68,87,105,162,18}; for(i=0;i<10;i++) { p=i;q=a[i]; for(j=i+1;j<10;j++) if(qif(p!=i) { s=a[i]; a[i]=a[p]; a[p]=s; } printf("%d ",a[i]); } printf("\ninput number:\n"); scanf("%d",&n); for(i=0;i<10;i++) if(n>a[i]) {for(s=9;s>=i;s--) a[s+1]=a[s]; break;} a[i]=n; for(i=0;i<=10;i++) printf("%d ",a[i]); printf("\n"); } 本程序首要对数组a中的10个数从大到小排序并输出排序成果。然后输入要刺进的整数n。再用一个for句子把n和数组元素逐一对比,若是发现有n>a[i]时,则由一个内循环把i以下各元素值依次后移一个单元。后移应从后向前进行(从a[9]开端到a[i]停止)。后移完毕跳出外循环。刺进点为i,把n赋予a[i]即可。如一切的元素均大于被刺进数,则并未进行过后移作业。此刻i=10,成果是把n赋于a[10]。最终一个循环输出刺进数后的数组各元素值。 程序运转时,输入数47。从成果中能够看出47已刺进到54和28之间。 【例7.19】在二维数组a中选出各行最大的元素组成一个一维数组b。 a=( 316 8765 432 11 108 10 25 1237) b=(87 108 37) 本题的编程思路是,在数组A的每一行中寻觅最大的元素,找到之后把该值赋予数组B相应的元素即可。程序如下: main() { int a[][4]={3,16,87,65,4,32,11,108,10,25,12,27}; int b[3],i,j,l; for(i=0;i<=2;i++) { l=a[i][0]; for(j=1;j<=3;j++) if(a[i][j]>l) l=a[i][j]; b[i]=l;} printf("\narray a:\n"); for(i=0;i<=2;i++) { for(j=0;j<=3;j++) printf("%5d",a[i][j]); printf("\n");} printf("\narray b:\n"); for(i=0;i<=2;i++) printf("%5d",b[i]); printf("\n"); } 程序中榜首个for句子中又嵌套了一个for句子组成了两层循环。外循环操控逐行处置,并把每行的第0列元素赋予l。进入内循环后,把l与后边各列元素对比,并把比l大者赋予l。内循环完毕时l即为该行最大的元素,然后把l值赋予b[i]。等外循环悉数完结时,数组b中已装入了a各行中的最大值。后边的两个for句子别离输出数组a和数组b。 【例7.20】输入五个国家的称号按字母次序摆放输出。 本题编程思路如下:五个国家名应由一个二维字符数组来处置。但是C言语规则能够把一个二维数组当成多个一维数组处置。因而本题又能够按五个一维数组处置,而每一个一维数组即是一个国家名字符串。用字符串对比函数对比各一维数组的巨细,并排序,输出成果即可。编程如下: main() { char st[20],cs[5][20]; int i,j,p; printf("input country's name:\n"); for(i=0;i<5;i++) gets(cs[i]); printf("\n"); for(i=0;i<5;i++) { p=i;strcpy(st,cs[i]); for(j=i+1;j<5;j++) if(strcmp(cs[j],st)<0) {p=j;strcpy(st,cs[j]);} if(p!=i) { strcpy(st,cs[i]); strcpy(cs[i],cs[p]); strcpy(cs[p],st); } puts(cs[i]);}printf("\n"); } 本程序的榜首个for句子中,用gets函数输入五个国家名字符串。上面说过C言语答应把一个二维数组按多个一维数组处置,本程序阐明cs[5][20]为二维字符数组,可分为五个一维数组cs[0],cs[1],cs[2],cs[3],cs[4]。因而在gets函数中运用cs[i]是合法的。在第二个for句子中又嵌套了一个for句子组成两层循环。这个两层循环完结按字母次序排序的作业。在外层循环中把字符数组cs[i]中的国名字符串复制到数组st中,并把下标i赋予P。进入内层循环后,把st与cs[i]今后的各字符串作对比,若有比st小者则把该字符串复制到st中,并把其下标赋予p。内循环完结后如p不等于i阐明有比cs[i]更小的字符串呈现,因而交流cs[i]和st的内容。至此已断定了数组cs的第i号元素的排序值。然后输出该字符串。在外循环悉数完结之后即完结悉数排序和输出。 (五) 数组运用小结 数组是程序设计中最常用的数据布局。 1、数组可分为数值数组(整数组,实数组),字符数组以及后边即将介绍的指针数组,布局数组等。 2、数组能够是一维的,二维的或多维的。 3、数组类型阐明由类型阐明符、数组名、数组长度(数组元素个数)三有些组成。数组元素又称为下标变量。数组的类型是指下标变量取值的类型。 4、对数组的赋值能够用数组初始化赋值,输入函数动态赋值和赋值句子赋值三种办法完成。对数值数组不能用赋值句子全体赋值、输入或输出,而有必要用循环句子逐一对数组元素进行操作。

(0)

相关推荐

  • C语言数组作为函数参数

    数组可以作为函数的参数使用,进行数据传送.数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用:另一种是把数组名作为函数的形参和实参使用. 数组元素作函数实参 数组元素就是下标变量,它 ...

  • Vector用法介绍2

    这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读 ...

  • php语言中数组怎么进行去重处理

    我们在编写代码的过程中可能会使用到PHP语言.接下来小编就教大家怎样给PHP语言的数组去重. 具体如下:1. 首先我们将需要去重的数组打印出来,然后我们可以看到数组有一部分相同的值. 2. 接下来我们 ...

  • C语言如何定义一个数组

    现在我们来看看,C语言如何定义一个数组. 操作方法 01 首先,我们编写头文件以及main函数主框架. 02 然后我们编写如图语句,int可更改为任意其他类型. 03 接下来我们可以for语句给他赋值 ...

  • C语言如何把字符串转为字符数组

    C语言如何把字符串转为字符数组?很多人不知道如何解决,下面我们来看看吧. 操作方法 01 一般来说,函数返回的类型不能是一个地址,所以说,如果你返回一个地址,编译器会给你警告,但是仍然会正确执行. 0 ...

  • 易语言程序数组成员引用下标超出定义范围错误

    操作方法 01 数组成员引用下标超出定义范围错误截图: 02 为什么会出现这种错误? 因为你取出的数组成员不存在,假设你要取的数组只有2个成员,你取了第3个成员,那样肯定会提示这种错误的,例如下图的易 ...

  • C语言如何求解数组长度

    C语言的基础之一 操作方法 01 假设有一个数组 int arrayDemo[]={1,2,3,4,7,8,11}; 02 数组单个值的所占内存空间 int singleSize=sizeof(arr ...

  • c语言函数中如何给一个字符串数组赋值

    C语言大多数人都会,然而会的人并不一定所有函数都记得住,下面将给大家介绍数组赋值函数的使用方法 操作方法 01 打开Visual C++ 6.0,新建一个C++ source file源文件 02 输 ...

  • C语言二维数组的定义和引用

    一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量.在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组.多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量. ...