二维数组
一.二维数组初始化【此处介绍4种方法】
1.分行给二维数组赋初值,如int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
2.可以将所有数据写在一个花括号内 如int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
3.对部分元素赋初值int a[3][4]={{1},{5},{9}};
对各行中的某一元素赋初值int a[3][4]={{1},{0,5},{0,0,9}};
只对某几行元素赋初值
int a[3][4]={{1},{6,5}};for(int i=0;i<3;i++)for(int j=0;j<4;j++)j==3?printf("%d\n",a[i][j]):printf("%d ",a[i][j]);/*输出 1 0 0 06 5 0 00 0 0 0*/
4.如果对全部元素赋初值,则定义数组时,第一维的长度可以不指定,但第二维的长度不能省略
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
这两种写法等价
二.二维数组程序举例
1.二维数组行列互换
#include <stdio.h>#include <stdlib.h>void main(){int a[2][3]= {{1,2,3} ,{4,5,6}};int b[3][2],i,j;printf("array a:\n");for(i=0; i<2; i++){for(j=0; j<3; j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];//先为数组b赋值}printf("\n");}printf("array b:\n");for(i=0;i<3;i++){for(j=0;j<2;j++)printf("%5d",b[i][j]);printf("\n");//再在此处输出数组b}}
2.查找矩阵中最大元素及其位置
#include <stdio.h>#include <stdlib.h>void main(){int i,j,row=0,colum=0,max;int a[3][4]= {1,2,3,4,9,8,7,6,-10,10,-5,2};max=a[0][0];for(i=0; i<3; i++)for(j=0; j<4; j++)if(a[i][j]>max){max=a[i][j];row=i+1;colum=j+1;}printf("%d %d %d\n",max,row,colum);}
字符数组
一.字符数组初始化
1.逐个字符赋给数组中的各元素如char c[10]={'I','a','m','h','a','p','p','y'};
2.如果在定义字符数组时不进行初始化,则数组中的各元素的值是不可预测的。
3.如果花括号中提供的初值个数大于数组长度,则按照语法错误处理
4.如果初值个数小于数组长度,则只将这些字符赋给数组中前面的那些元素,其余元素自动定义为空字符’\0’
char c[10]={"China"};内部存放为 C h i n a \0 \0 \0 \0 \0
5.如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,如char c[]={'I','a','m','h','a','p','p','y'};
数组长度自动为8
6.可以使用字符串常量来使字符数组初始化,如
【三种写法等价】
char c[]={"I am happy"};char c[]="I am happy";char c[]={'I',' ','a','m',' ','h','a','p','p','y','\0'};
二.字符串和字符串的结束标志
1.为了测定字符串的实际长度,C规定以’\0’作为字符串的结束标志
如果有一个字符串,前面9个字符都非空,而第10个字符是’\0’,则此字符串的有效字符为9个。
2.系统对字符串常量也自动加一个’\0’作为结束符
3.说明char c[5]={'C','h','i','n','a'};
完全合法,
但我们通常char c[6]={'C','h','i','n','a','\0'};
多开一个字符为了存放末尾的空字符
三.字符与字符串的输出
1.用“%s”格式符输出字符串时,printf中出现的是***字符数组名***
2.如果数组长度大于实际长度,一直输出到’\0’结束,输出的字符不包括’\0’
3.scanf输入一个字符串scanf("%s",c);
,从键盘输入China ,系统自动在其后加上一个’\0’结束符
4.如果利用scanf 函数输入多个字符串,则在输入时以空格分隔
char c1[5],c2[5],c3[5];scanf("%s %s %s",c1,c2,c3);//因为是字符数组名,所以不需要加&printf("%s %s %s",c1,c2,c3);
5.puts函数在遇到空字符时,换行输出(将’\0’转换为’\n’输出)
6.与scanf 的"%s"输入不同,gets输入的字符串只以回车结束,而空格是有效字符
7.strcpy函数注意事项
8.拓展两个不知道的函数
(1)strlwr函数:一般形式:strlwr(字符串)
作用:将字符串中大写字母换成小写字母
(2)strupr函数:一般形式:strupr(字符串)
作用:将字符串中小写字母换成大写字母
四.字符数组应用举例
(1)统计单词个数
#include <stdio.h>#include <stdlib.h>void main(){char str[82];int i,num=0,flag=0;gets(str);for(i=0;str[i]!='\0';i++){if(str[i]==' ') flag=0;else if (flag==0){flag=1;num++;}}printf("%d\n",num);}
(2)找到3个字符串中最大的一个
#include <stdio.h>#include <stdlib.h>#include <string.h>void main(){char string[20];char str[3][20];int i;for(i=0;i<3;i++)gets(str[i]);if(strcmp(str[0],str[1])>0)//找到0,1大的那个strcpy(string,str[0]);else strcpy(string,str[1]);if(strcmp(str[2],string)>0)//2与最大的比较strcpy(string,str[2]);printf("%s\n",string);}
五.数组作为函数的参数应用举例
计算矩阵的乘法:An*k*Bk*m=Cn*m
#include <stdio.h>#include <stdlib.h>#include <string.h>void inputA(int n,int k,int a[][k]){int i,j;for(int i=0;i<n;i++)for(j=0;j<k;j++)scanf("%d",&a[i][j]);}void inputB(int k,int m,int a[][m]){int i,j;for(int i=0;i<k;i++)for(j=0;j<m;j++)scanf("%d",&a[i][j]);}void outputC(int n,int m,int a[][m]){int i,j;for(i=0;i<n;i++){for(j=0;j<m;j++)printf("%d ",a[i][j]);printf("\n");}}void calculateC(int n,int m,int k,int a[][k],int b[][m],int c[][m]){int i,j,l;for(i=0;i<n;i++)for(j=0;j<m;j++){c[i][j]=0;for(l=0;l<k;l++)c[i][j]+=a[i][l]*b[l][j];}}int main(){int n,k,m,i,j,l;scanf("%d%d%d",&n,&m,&k);int a[n][k],b[k][m],c[n][m];inputA(n,k,a);inputB(k,m,b);calculateC(n,m,k,a,b,c);outputC(n,m,c);return 0;}