C语言学习(十一)数组运算以及二维数组

本文深入探讨了数组和二维数组的使用方法,包括数组的初始化、大小获取、赋值、遍历,以及如何利用数组存储和查找素数。同时,详细讲解了二维数组的初始化、遍历,并通过实例演示了其在tic-tac-toe游戏中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

运行结果:
①输入:
在这里插入图片描述
结果为:
在这里插入图片描述
②输入:

在这里插入图片描述
结果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值