C语言基础知识之二维数组

二维数组

认识二维数组

数值型二维数组

  • 注意点

    • 长度必须是常量
    • 最大数组下标: 长度-1
  • 创建语法

  • 类型名 数组名[长度1][长度2];
    int  array[2][2];
    float farray[2][3];
    char cArray[3][3];
    //长度1:列数
    //长度2:行数
    
  • 二维数组的创建与初始化

    //创建的时候的初始化
    //全部初始化
    int array[2][2]={1,2,3,4};
    int array[2][2]={{1,2},{3,4}};
    int array[2][2]={{1,2},
                     {3,4}};
    int array[][2]={1,2,3,4};   //默认推断出长度为2
    //缺省的初始化
    int array[2][2]={1,2};	
    int array[2][2]={{1},{3}};  //数据中{}里面有{},里面的大括号代表的行
    
  • 二维数组的输入

    for(int i=0;i<row;i++)
    {
        for(int j=0;j<cols;j++)
        {
    		scanf("%d",array[i][j]);        
        }
    }
    
  • 二维数组的输出

    for (int i = 0; i < 2; i++)
    	{
    		for (int j = 0; j < 3; j++)
    		{
    			printf("%d\t", array[i][j]);
    		}
    		printf("\n");
    	}
    

字符类型二维数组

  • 字符类型的二维数组创建方式和数字类一样,存放字符,和数字类的一样

  • 通常情况我们用二维数组存储多个字符串

  • 多个字符串初始化字符的维数组的时候,字符串的长度不能超过列数

  • 用getchar输入就要对应用putchar输出,不然会出现打印乱码现象

    //对于二维数组每一行的首地址表示方式: str[i];
    char array[2][10];
    char str[3][10] = { {"XDSDRFEf"},{"o你好"},"afafd" };
    
  • 应用代码

    #include <stdio.h>
    int main()
    {
    	char str[3][10] = { {""},{""},"" };
    
    	printf("请输入三个字符串:");
    	for (int i = 0; i < 3; i++)
    	{
    		//gets_s(str[i], 10);
    		scanf_s("%s", str[i], 10);
    	}
    	printf("你输入的三个字符串是:\n");
    	for (int i = 0; i < 3; i++)
    	{
    		puts(str[i]);
    	}
    	char str3[2][2] = { "" };
    	while (getchar() != '\n');
    	for (int i = 0; i < 2; i++)
    	{
    		for (int j = 0; j < 2; j++)
    		{
    			str3[i][j] = getchar();
    		}
    	}
    	for (int i = 0; i < 2; i++)
    	{
    		for (int j = 0; j < 2; j++)
    		{
    			putchar(str3[i][j]);
    		}
    	}
    	return 0;
    }
    

二维数组应用

  • 处理表格数据

    姓名语文数学英语总分
    黄花599885242
    刘华786755200
    陈启899045224
    各科总分226255185
    • 计算以上表格行和
    • 计算以上表格列和
    • 数据同步排序
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	//			描述所有数据
    	double score[100][3] = { 0 };
    	char name[100][20] = { "" };
    	double rowSum[100] = { 0 };
    	double colsSum[3] = { 0 };
    	int curSize = 0;				//当前系统中的学生数
    	//  通过两个数组的下标实现数据的对应的
    	//	score[0] 第0个学生的成绩
    	//  name[0]  第0个学生的姓名
    	// rowSum[0] 第0个学生的总分
    	while (1)
    	{
    		printf("----------------------\n");
    		printf("\t0.退出系统\n");
    		printf("\t1.录入信息\n");
    		printf("\t2.浏览信息\n");
    		printf("\t3.求行和\n");
    		printf("\t4.求列和\n");
    		printf("----------------------\n");
    		int userKey = 0;
    		scanf_s("%d", &userKey);
    		switch (userKey)
    		{
    		case 0:
    			printf("正常退出!\n");
    			system("pause");
    			exit(0);
    			break;
    		case 1:
    			while (1)
    			{
    				printf("input student info(name,math,english,chinese):");
    				//scanf_s("%s%lf%lf%lf", name[curSize], 20,
    				//	&score[curSize][0], &score[curSize][1], &score[curSize][2]);
    				//和下面的写法是等效
    				scanf_s("%s", name[curSize], 20);
    				for (int i = 0; i < 3; i++)
    				{
    					scanf_s("%lf", &score[curSize][i]);
    				}
    				curSize++;
    				printf("是否继续(Y/N)? :");
    				while (getchar() != '\n');
    				userKey = getchar();
    				if (userKey == 'N' || userKey == 'n')
    				{
    					break;
    				}
    			}
    			break;
    		case 2:
    			printf("姓名\t数学\t英语\t语文\n");
    			for (int i = 0; i < curSize; i++)
    			{
    				/*			printf("%s\t%.1lf\t%.1lf\t%.1lf\n", name[i],
    								score[i][0], score[i][1], score[i][2]);*/
    				printf("%s\t", name[i]);
    				for (int j = 0; j < 3; j++)
    				{
    					printf("%.lf\t", score[i][j]);
    				}
    				printf("\n");
    			}
    			break;
    		case 3:
    			//求每一行的和
    			for (int i = 0; i < curSize; i++)
    			{
    				for (int j = 0; j < 3; j++)
    				{
    					rowSum[i] += score[i][j];
    				}
    			}
    			//打印
    			printf("姓名\t数学\t英语\t语文\t总分\n");
    			for (int i = 0; i < curSize; i++)
    			{
    				printf("%s\t", name[i]);
    				for (int j = 0; j < 3; j++)
    				{
    					printf("%.lf\t", score[i][j]);
    				}
    				printf("%.1f", rowSum[i]);
    				printf("\n");
    			}
    			break;
    		case 4:
    			//求列的和
    			for (int j = 0; j < 3; j++)
    			{
    				for (int i = 0; i < curSize; i++)
    				{
    					colsSum[j] += score[i][j];
    				}
    			}
    			printf("姓名\t数学\t英语\t语文\n");
    			for (int i = 0; i < curSize; i++)
    			{
    				printf("%s\t", name[i]);
    				for (int j = 0; j < 3; j++)
    				{
    					printf("%.lf\t", score[i][j]);
    				}
    				printf("\n");
    			}
    			//最后一行添加一行数据
    			printf("总分\t");
    			for (int i = 0; i < 3; i++)
    			{
    				printf("%.1lf\t", colsSum[i]);
    			}
    			printf("\n");
    			break;
    		}
    		system("pause");
    		system("cls");
    	}
    	return 0;
    }
    
  • 充当游戏地图

    • 简单推箱子
      • 0表示路,1表示墙,3表示目的地
      • 4表示箱子,7表示箱子到达指定地点
      • 5表示人,8表示人在目的地,显示人
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    int main()
    {
    	int map[8][8] =
    	{
    		1,1,1,1,1,1,1,1,
    		1,3,4,0,0,4,3,1,
    		1,0,1,0,1,0,0,1,
    		1,0,0,5,0,0,1,1,
    		1,0,1,0,1,0,0,1,
    		1,0,1,0,0,4,3,1,
    		1,3,4,0,0,0,1,1,
    		1,1,1,1,1,1,1,1
    	};
    	while (1)
    	{
    		//画地图
    		for (int i = 0; i < 8; i++)
    		{
    			for (int j = 0; j < 8; j++)
    			{
    				//■ ☆ □ ♀ ★
    				switch (map[i][j])
    				{
    				case 0:
    					printf("  ");	//两个空格
    					break;
    				case 1:
    					printf("■");
    					break;
    				case 3:
    					printf("☆");
    					break;
    				case 4:
    					printf("★");
    					break;
    				case 5:
    				case 8:
    					printf("♀");
    					break;
    				case 7:
    					printf("□");
    					break;
    
    				}
    			}
    			printf("\n");
    		}
    		//判断胜负,地图上没有箱子的时候就可以结束游戏
    		int flag = 0;
    		for (int i = 0; i < 8; i++)
    		{
    			for (int j = 0; j < 8; j++)
    			{
    				if (map[i][j] == 4)
    				{
    					flag = 1;
    				}
    			}
    		}
    		if (flag == 0)
    		{
    			break;
    		}
    		//人物的定位: 二维数组的查找:找人所在行列
    		int i = 0;
    		int j = 0;
    		for (i = 0; i < 8; i++)
    		{
    			for (j = 0; j < 8; j++)
    			{
    				if (map[i][j] == 5 || map[i][j] == 8)
    				{
    					goto NEXT;
    				}
    			}
    		}
    	NEXT:;
    		//按键移动
    		int userKey = _getch();
    		switch (userKey)
    		{
    		case 'w':
    		case 'W':
    		case 72:
    			if (map[i - 1][j] == 0 || map[i - 1][j] == 3)
    			{
    				map[i][j] -= 5;
    				map[i - 1][j] += 5;
    			}
    			if (map[i - 1][j] == 4 || map[i - 1][j] == 7)
    			{
    				if (map[i - 2][j] == 0 || map[i - 2][j] == 3)
    				{
    					map[i][j] -= 5;
    					map[i - 1][j] += 1;
    					map[i - 2][j] += 4;
    				}
    			}
    			break;
    		case 's':
    		case 'S':
    		case 80:
    			if (map[i + 1][j] == 0 || map[i + 1][j] == 3)
    			{
    				map[i][j] -= 5;
    				map[i + 1][j] += 5;
    			}
    			if (map[i + 1][j] == 4 || map[i + 1][j] == 7)
    			{
    				if (map[i + 2][j] == 0 || map[i + 2][j] == 3)
    				{
    					map[i][j] -= 5;
    					map[i + 1][j] += 1;
    					map[i + 2][j] += 4;
    				}
    			}
    			break;
    		case 'A':
    		case 'a':
    		case 75:
    			if (map[i][j - 1] == 0 || map[i][j - 1] == 3)
    			{
    				map[i][j] -= 5;
    				map[i][j - 1] += 5;
    			}
    			if (map[i][j - 1] == 4 || map[i][j - 1] == 7)
    			{
    				if (map[i][j - 2] == 0 || map[i][j - 2] == 3)
    				{
    					map[i][j] -= 5;
    					map[i][j - 1] += 1;
    					map[i][j - 2] += 4;
    				}
    			}
    			break;
    		case 'd':
    		case 'D':
    		case 77:
    			if (map[i][j + 1] == 0 || map[i][j + 1] == 3)
    			{
    				map[i][j] -= 5;
    				map[i][j + 1] += 5;
    			}
    
    			if (map[i][j + 1] == 4 || map[i][j + 1] == 7)
    			{
    				if (map[i][j + 2] == 0 || map[i][j + 2] == 3)
    				{
    					map[i][j] -= 5;
    					map[i][j + 1] += 1;
    					map[i][j + 2] += 4;
    				}
    			}
    			break;
    		}
    		system("cls");
    	}
    	printf("GameOver\n");
    	return 0;
    }
    
posted @ 2022-09-29 00:48  理想还很年轻  阅读(165)  评论(0)    收藏  举报