二维数组
一.二维数组初始化【此处介绍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 0
6 5 0 0
0 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);
}
五.数组作为函数的参数应用举例
计算矩阵的乘法:A
n*k
*B
k*m
=C
n*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;
}