c语言 --- 二维数组

认识二维数组

  • 如何创建二维数组

//NO.1 如何创建二维数组,固定语法: 类型 数组名[数组长度1][数组长度2];
int array[2][2]; 

数组长度1:2 → 行
数组长度2:2 → 列
总元素个数:数组长度1 × 数组长度2==行 × 列
最大下标是:数组名[ 数组长度1 - 1 ][ 数组长度2 - 1 ]   最大下标是array[1][1] 不可能是array[2][2]

  • 在内存上的长相:在内存中是一段连续的内存,可以人为地让它有行有列

常规操作

  • 数组的初始化

  • 数组的遍历 → for循环遍历

//No.1 完整初始化->有几个元素赋几个值
int array1[2][2]={1,2,3,4};
//No.2 默认初始化->缺省初始化 不做初始化其他元素默认为0
int array2[2][2]={1,2};
//No.3 带{}默认初始化 ,一个{}代表一行
int array3[3][4]={{1},{2},{3}};     //第一行第一个元素:1[其他值默认为0],第二个第一个元素:2,第三行第一个元素:3
//No.4 数据完整初始化,数组长度1可以不写
int array[][3]={1,2,3,4,5,6,7,8,9}; //自动推导数组长度1是:3
#include <stdio.h>
int main() 
{
	int array[3][4] = 
	{ 
		1,2,3,4,
		5,6,7,8,
		9,10,11,12
	};
    //先遍历行再遍历列
	for (int i = 0; i < 3; i++) 
	{
		for (int j = 0; j < 4; j++) 
		{
			printf("array[%d][%d]=%d\t", i, j, array[i][j]);
		}
		printf("\n");		//形成行列关键点->二维数组没有行和列之说 列完成的时候换一下行 形成行和列
	}
	printf("请输入二维数组中的值:\n");
    //用for循环嵌套来做输入
	for (int i = 0; i < 3; i++) 
	{
		for (int j = 0; j < 4; j++) 
		{
			scanf_s("%d", &array[i][j]);
		}
	}
	printf("你输入的数组是:\n");
	for (int i = 0; i < 3; i++) 
	{
		for (int j = 0; j < 4; j++) 
		{
			printf("array[%d][%d]=%d\t", i, j, array[i][j]);
		}
		printf("\n");		//形成行列关键点
	}
	//scanf 不能接受空格的字符串输入
	//gets  接受字符的空格输入
	return 0;
}

/*输出*/

array[0][0]=1   array[0][1]=2   array[0][2]=3   array[0][3]=4
array[1][0]=5   array[1][1]=6   array[1][2]=7   array[1][3]=8
array[2][0]=9   array[2][1]=10  array[2][2]=11  array[2][3]=12
请输入二维数组中的值:
1 2 4 5
43 3 21 1
43 3 23 42
你输入的数组是:
array[0][0]=1   array[0][1]=2   array[0][2]=4   array[0][3]=5
array[1][0]=43  array[1][1]=3   array[1][2]=21  array[1][3]=1
array[2][0]=43  array[2][1]=3   array[2][2]=23  array[2][3]=42
  • 二维数组的基本操作

    • 行列数据的操作(excel表数据操作)

      • 行求和

      • 列求和

    • 二维数组充当地图

    • 矩阵变化

#include <stdio.h>
int main()
{
	int array[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int rowSum[3] = { 0 };        //有3行的结果
	int colSum[4] = { 0 };        //有4列的结果
	//求一行的和
	for (int i = 0; i < 3; i++)   //所有的i相同就是一行
	{
		for (int j = 0; j < 4; j++)
		{
			rowSum[i] += array[i][j];
		}
	}
	//求一列的和
	for (int j = 0; j < 4; j++)   //j相同 先遍历列就可以求一列的和
	{
		for (int i = 0; i < 3; i++)
		{
			colSum[j] += array[i][j];
		}
	}
	//特定数字表示特定含义
	int map[8][8] =
	{
		1,1,1,1,1,1,1,1,
		1,0,1,1,1,0,1,1,
		1,0,1,1,1,0,1,1,
		1,0,1,1,1,0,1,1,
		1,0,0,0,0,0,1,1,
		1,1,1,0,1,1,1,1,
		1,1,1,0,1,1,1,1,
		1,1,1,1,1,1,1,1
	};
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++) 
		{
			switch (map[i][j]) 
			{
			case 0:               //if(map[i][j]==0)
				printf("★");     //一个汉字字符占用两个位置
				break;
			case 1:  //if(map[i][j]==1)
				printf("  ");    //要打印两个空格才能对齐
				break;
			}
		}
		printf("\n");
	}
	return 0;
}

/*输出*/

  ★      ★
  ★      ★
  ★      ★
  ★★★★★
      ★
      ★

/*
    1   2   3   4    
    12  13  14    5
    11    16    15  6
    10  9   8   7

    //魔方矩阵
    4 9 2
    3 5 7
    8 1 6
    //线性代数
    //矩阵的乘法. . .
    //矩阵的加法. . .
*/

  • 二维数组操作字符串→ 二维数组可以形成行、列特性,一维数组可以存一个字符串,二维数组可以存多个字符串→ 一行存一个字符串

    • 初始化→ 一个{ }就是一行,没有数据的列默认为 ' \0 '

    • 遍历

    • 多个字符串排序

#include <stdio.h>
#include <string.h>
int main()
{
	//No.1 二维字符数组一般是用来存储多个字符串->4行20列 一行存一个字符串
	char str[4][20] = { {"1.ILoveyou"},{"2.IMissyou"},{"2.我想吃饭"}, {"4.我想睡觉"} };    //注意列不要超过了
	//可以用两个下标的方式访问 和数字类的二维数组一样的使用方式  很少这样去用
	//No.3 字符串排序->冒泡排序->从小到大排序
	char temp[20] = { "" };                  //一行存一个字符串|做交换要准备一行出来
	for (int i = 0; i < 4; i++) 
	{
		for (int j = 0; j < 4 - 1 - i; j++) 
		{
			if (strcmp(str[j],str[j+1])>0)   //字符串比较也不能直接比较必须要用strcmp
			{
				//注意点:字符串不能用赋值的方式使用,拷贝操作必须用strcpy
				strcpy_s(temp, 20, str[j]);
				strcpy_s(str[j], 20, str[j + 1]);
				strcpy_s(str[j + 1], 20, temp);
			}
		}
	}
	printf("%c\n", str[0][0]);               //打印其中的某一个字符
    printf("%c\n", str[0][1]);
	printf("%c\n", str[0][2]);
	printf("%c\n", str[0][3]);
	//No.2 数组名[下标]:表示每一行的首地址
	for (int i = 0; i < 4; i++) 
	{
		puts(str[i]);                       //操作字符串用一个下标即可,操作数字类的必须是两个下标
	}
	printf("请输入四个字符串:");            //让用户输入字符串
	for (int i = 0; i < 4; i++) 
	{
		scanf_s("%s", str[i], 20);          //str[i]代表的就是每一行的首地址->已经是地址了,所以不需要取地址
	}
	for (int i = 0; i < 4; i++) 
	{
		printf("%s\n", str[i]);
	}
	return 0;
}

/*输出*/

1
.
I
L
1.ILoveyou
2.IMiss
2.我想吃饭
4.我想睡觉
请输入四个字符串:hhaha
enter
tab
ctrl
hhaha
enter
tab
ctrl
  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值