一.概念C提供的数据类型有:标准型和构造型。在遇到的大量编程问题中仅用标准型是解决不了的。如:排序,查询,统计,线性方程组求解,矩阵运算等需要用构造类型,数组是其中之一。数组---具有相同类型数据的集合。数组中每一个数据称为元素,每一个元素均用统一的数组名和相应的下标确定。数组定义格式:一维类型说明符数组名[常量]二维类型说明符数组名[常量][常量]例:intnum[10];floatscore[3][4];在程序中定义了一维数组和二维数组;编译时在内存开辟连续一批单元,存放数组各元素的值。2bytesnum[0]num[1]num[2]num[9]….4bytes...score[0][0]score[0][1]score[0][2]score[2][3]功能:定义数组名,类型和大小。num整型10个元素score实型12个元素数组元素赋初值指在定义的同时可给数组各元素或部分元素赋初值,即初始化。在编译时除分配一定的单元,同时将初值赋给相应单元(元素),否则是随机值。如果给全部元素赋值,则在数组定义时,可以不给出数组长度,系统将根据初值的个数自动确定数组的长度。num[0]num[1]…...019static---表示静态存储;若定义成:staticintnum[10];所有元素均赋0;部分元素赋初值:staticintnum[10]={0,1,2,3,4};其它元素均赋0;num[9]一维数组:staticintnum[10]={0,1,2,3,4,5,6,7,8,9};也可staticfloatscore[3][4]={1,1,1,1,2,2,2,2,3,3,3,3};也可staticfloatscore[][4]={1,1,1,1,2,2,2,2,3,3,3,3};而staticfloatscore[3][4];则所有元素均赋0;部分元素赋初值:staticfloatscore[3][4]={{1},{2},{3}};表示score[0][0];score[1][0];score[2][0]分别赋1,2,3,其它元素均为0。staticfloatscore[3][4]={{1},{7,8}};表示score[0][0]=1;score[1][0]=7,score[1][1]=8,其它元素均为0;二维数组staticfloatscore[3][4]={{1,1,1,1},{2,2,2,2,},{3,3,3,3,}};对数组元素的操作在C中,只能对已定义的数组元素逐个的操作(赋值、输出等),不可对整个数组一次进行赋值,输出等。凡是变量可出现的地方,数组元素也可出现。数组元素引用格式:一维数组名[表达式]二维数组名[表达式1][表达式2]一维数组各元素:赋值,输出main(){intnum[10],i;for(i=0;i10;i++)num[i]=i+1;for(i=0;i10;i++)num[i]*=10;for(i=0;i10;i++)printf(num[%d]=%d\n,i,num[i]);}main(){intnum[10],i;for(i=0;i10;i++)scanf(%d,&num[i]);for(i=0;i10;i++)printf(num[%d]=%d\n,i,num[i]);}二维数组各元素:赋值,输出main(){intscore[3][4];inti,j;for(i=0;i3;i++)for(j=0;j4;j++)scanf(%d,&score[i][j]);for(i=0;i3;i++){for(j=0;j4;j++)printf(score[%d][%d]=%d,i,j,score[i][j]);printf(\n);}}数组在编程中应用例:某班3人,2门课,试编程:1.键盘输入每个人学号和2门课成绩;2.求出每人平均分和每门课的平均分。变量设置:num[3]存放每个人的学号score[3][2]存放30人,每人9门课成绩aver[3]存放每人平均成绩aver1[2]存放每门课平均成绩main(){inti,j;intscore[3][2],num[3],sum;floataver[3],aver1[2];for(i=0;i3;i++){scanf(%d,&num[i]);for(j=0;j2;j++)scanf(%d,&score[i][j]);}/*输入每人学号和2门课成绩*/for(i=0;i3;i++){sum=0;for(j=0;j2;j++)sum+=score[i][j];aver[i]=sum/2;}/*求出每人平均分*/for(i=0;i3;i++)printf(Student.%d\t%f\n,i+1,aver[i]);/*输出每门课平均分*/for(i=0;i2;i++){sum=0;for(j=0;j3;j++)sum+=score[j][i];aver1[i]=sum/3;}/*求每门课平均分*/for(i=0;i2;i++)printf(Course.%d\t%f\n,i+1,aver1[i]);/*输出每门课平均分*/}例:已知三行三列数组各元素值,试分别求各行元素,各列元素和每个元素之和。main(){inti,j;staticinta[4][4]={{3,5,6,0},{2,1,4,0},{3,5,4,0},{0,0,0,0}};for(i=0;i3;i++)for(j=0;j3;j++){a[i][3]+=a[i][j];a[3][j]+=a[i][j];a[3][3]+=a[i][j];}for(i=0;i4;i++){for(j=0;j4;j++)printf(%5d,a[i][j]);printf(\n);}}第0列各元素之和所有元素之和第0行各元素之和356xx214xx354xxxxxxxxxx例:矩阵相乘:C=A*B条件:A阵的列数=B阵的行数乘积矩阵的行数为A阵行,列为B阵列main(){staticinta[3][3]={{1,2,3},{4,5,6},{7,8,9}};staticintb[3][2]={{1,2},{3,4},{5,6}};staticintc[3][2];inti,j,k;for(i=0;i3;i++)for(j=0;j2;j++)for(k=0;k3;k++)c[i][j]+=a[i][k]*b[k][j];for(i=0;i3;i++){for(j=0;j2;j++)printf(%5d,c[i][j]);printf(\n);}}main(){intnum[10],i,j,k,tem;for(i=0;i10;i++)scanf(%d,&num[i]);for(i=0;i9;i++){for(j=i+1;j10;j++)if(num[i]num[j]){tem=num[i];num[i]=num[j];num[j]=tem;}}for(k=0;k10;k++)printf(%d,num[k]);}1357924680035792468101579346820127954683012397568401234976850123459786012345698701234567980123456789main(){intnum[10],i,j,k,tem;for(i=0;i10;i++)scanf(%d,&num[i]);for(i=0;i9;i++)for(j=0;j9-i;j++)if(num[j]num[j+1]){tem=num[j];num[j]=num[j+1];num[j+1]=tem;}for(k=0;k10;k++)printf(%d,num[k]);}1357924680135724680913524670891324560789123450678912340567891230456789120345678910234567890123456789字符数组C中无字符串变量,字符串是用字符数组处理.定义:一维charcn[5](常用来处理一个字符串)二维charname[30][8](常用来处理多个字符串)赋初值:staticcharcn[5]={‘C’,’h’,’i’,’n’,’a’};staticcharcn[6]={‘C’,’h’,’i’,’n’,’a’,’\0’};staticcharcn[6]={“China”};staticcharcn[6]=“China”;staticcharcn[]=“China”;系统定义,自动在串尾加‘\0。若提供的初值小于数组长度,则只将这些字符赋给数组中前面的元素,其余元素自动空字符’\0’若对全体元素赋初值,可省长度说明均等价cn[0]cn[1]cn[2]cn[3]cn[4]cn[5]China\0字符串结束标志输出时:printf(“%s\n”,cn);cn是字符数组名,当遇到‘\0’输出结束.printf(“%c\n”,cn[0]);cn[0]是字符数组元素。在内存存放:可以用scanf对一个字符数组赋值,即输入一个字符串。但字符串中不能有空格,否则将以空格作为串结束符。Charst[20];scanf(“%s”,st);注意,st是数组名而非变量名,故不可用&st数组名代表了数组的首地址,整个数组存放在以首地址开始的一块连续内存单元中字符串处理函数:头文件是string.hputs(str或字串)在屏幕上显示一个字符串(以‘\0’结束);将结束标记转为‘\n’;可含转义字符.staticcharstr[]=“BBI”;puts(str);staticcharstr[]=“\nbbi”puts(str);gets(str)从键盘输入一个串给字符数组,返回是该数组在内存的首地址;字符串里可含空格gets(str);键入:bbistrcat(str1,str2)将串2接在串1后,其结果放在字符数组中staticcharc2[]=“aboy”staticcharc1[]=“Iam”;printf(“%s”,strcat(c1,c2));strcpy(str1,字串)将字符串拷贝到字符数组里strcpy(str1,”BBI”);staticcharstr2[]=“bbi”;strcpy(str2,str1)strcmp(str1,str2)两串相同,返回值是0;串1串2,返回值是正整数;串1串2,返回值是负整数strcmp(“CCTV”,”BTV”);strlen(str)返回不包括‘\0’字符串的长度printf(“%d\n”,strlen(“bbi”));注:str,str1,str2是字符数组名或字符型指针变量名例:实现串拷贝main(){staticchars2[]=China;chars1[20];inti;for(i=0;s2[i]!='\0';i++)s1[i]=s2[i];s1[i]='\0';printf(%s\n,s1);}例:实现串连接#includestring.hmain(){chars1[30],s2[20];inti,j;gets(s1);gets(s2);i=0;while(s1[i])i++;for(j=0;s2[j];j++,i++)s1[i]=s2[j];s1[i]='\0';printf(%s\n,s1);}例:字符串比较#includestring.hmain(){chars1[20],s2[20];inti;gets(s1);gets(s2);for(i=0;s1[i]==s2[i];i++)if(s1[i]=='\0')break;printf(%d\n,s1[i]-s2[i]);}例:输入一串字符,统计该串里单词的个数(单词间用空格分开),串结束用回车.Num:统计串的个数,Word:当遇到一个或多个空格,word=0;当遇到第一个非空格,若原word是0,表