1.数组运算
①数组集成初始化
int a[]={2,3,3,4,4,5,5,6,6,7,13,23};
直接用大括号给出数组所有元素的初始值,不需要给出数组的大小,编译器替你数数。
int a[]={0};
用这种方式可以将数组中全部元素初始化为0。
②数组的大小
sizeof(a)/sizeof(a[0]);
sizeof给出整个数组占据的内存大小,单位是字节。该语句可以判断出数组元素个数,不需要通过数组遍历。其中sizeof(a)是数组占据内存大小,sizeof(a[0])是单个元素占据内存大小,相除就得到了数组元素个数。
③数组赋值
不能直接拿一个数组赋值给另一个数组,要进行数组之间的赋值必须通过遍历,对每个元素进行赋值。
④数组遍历
通常写for循环,让循环变量从0到< 数组长度,这样循环体内最大的i正好是数组最大的有效下标。
常见错误是:
循环条件是<= 数组长度;
离开循环后,依然使用“i”作为数组元素下标。
例1:判断素数
之前的素数判断是判断从2到x – 1测试是否可以整除,n很大的时候需要循环x-1次。
我们继续分析,如果是偶数就不是素数,如果不是偶数,从3到x – 1,每次加2既可,此时需要循环n/2 次。又有人说不需要循环到x - 1只要循环到 sqrt(x) 既可。根据上面的几种方法结合,会简化很多。注意使用sqrt函数需要头文件math.h。
int isPrime(int x)
{
int ret =1;
int i;
if(x==1||(x%2==0&&x!=2))
ret=0;
for(i=3;i<sqrt(x);i+=2)
{
if(x%i==0)
{
ret=0;
break;
}
}
return ret;
}
在学习数组之后,我们还有更加简便的方法:我们只需要用比x小的素数来判断素数(由于比x小的素数会比小于sqrt(x)的数更少)。这就需要有一个比x小的素数的表,再用这些数来判断素数,为了存储这些比x小的素数,就需要用到数组。
数组存储位置设置:
Prime[count++]=I;
这里我们写一个前100个素数显示的程序:
#include<stdio.h>
int isPrime(int x,int knownPrimes[],int numberOfknownPrimes);
int main()
{
const int number=100;
int prime[100]={2}; //数组定义
int count = 1;
int i = 3;
while(count<number)//
{
if(isPrime(i,prime,count))//如果是素数,存入数组中
{
prime[count++]=i;
}
i++;
}
for(i=0;i<number;i++) //输出数组
{
printf("%d",prime[i]);
//规定输出样式,每输出5个数之后换行
if((i+1)%5)
printf("\t");
else
printf("\n");
}
return 0;
}
int isPrime(int x,int knownPrimes[],int numberOfknownPrimes)//素数判断
{
int ret=1;
int i;
for(i=0;i<numberOfknownPrimes;i++)
{
if(x%knownPrimes[i]==0)
{
ret =0;
break;
}
}
return ret;
}
运行结果:
2. 二维数组
①int a[3][5];
通常理解为一个3行5列的矩阵。
②二维数组的遍历:
与一维的不同在于,一维数组只需要一个循环,而二维数组则需要两重循环。
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
a[i][j]=i*j;
}
}
a[i][j]表示的是一个int类型的数,是i行j列这一单元。
③二维数组初始化
int a[][5]={{1,2,3,4,5},{1,1,2,2,3},};
列数必须给出,行数可以由编译器自己数;
每行一个{},用逗号分开;
最后一个逗号可以存在;
如果省略,表示补零;
例2:tic-tac-toe游戏
规则:用X与O进行3*3棋盘进行游戏,如果有一方有三个棋在一条横线、竖线或斜线上连成一线则获胜。
分析:
读入一个3*3的矩阵,矩阵中的数字为1表示一个×,为0表示O;
程序判断这个矩阵中是否有获胜方,输出表示获胜方的字符,或者输出无人获胜。
用result表示结果:-1为“无人获胜”;0为“O的一方获胜”;1为“X的一方获胜”,用numofX与numofO来对O与X计数,分别判断行、列、正负对角线是否有3个X或3个O,对result进行对于赋值。
代码如下:
#include<stdio.h>
int main()
{
const int size=3;
int board[3][3]; //数组定义
int i,j;
int numofX;
int numofO;
int result =-1;
//二维数组遍历,输入数值
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
scanf("%d",&board[i][j]);
}
}
//检查行,对行元素计数判断
for(i=0;i<size&&result==-1;i++)
{
numofO=numofX=0;
for(j=0;j<size;j++)
{
if(board[i][j]==1)
numofX++;
else
numofO++;
}
if(numofO==size)
result =0;
else if(numofX==size)
result=1;
}
//检查列
if(result==-1)//如果行没判断出胜负
{
for(j=0;j<size&&result==-1;j++)
{
numofO=numofX=0;
for(i=0;i<size;i++)
{
if(board[i][j]==1)
numofX++;
else
numofO++;
}
if(numofO==size)
result =0;
else if(numofX==size)
result=1;
}
}
//检查正对角线
if(result==-1)
{
numofO=numofX=0;
for(i=0;i<size;i++)
{
if(board[i][i]==1)
numofX++;
else
numofO++;
}
if(numofO==size)
result =0;
else if(numofX==size)
result=1;
}
//检查副对角线
if(result==-1)
{
numofO=numofX=0;
for(i=0;i<size;i++)
{
if(board[i][size-i-1]==1)
numofX++;
else
numofO++;
}
if(numofO==size)
result =0;
else if(numofX==size)
result=1;
}
//输出结果
if(result==0)
printf("O胜\n");
else if(result==1)
printf("X胜\n");
else
printf("无人获胜\n");
return 0;
}
运行结果:
①输入:
结果为:
②输入:
结果为: