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; }
二维数组应用
-
处理表格数据
姓名 语文 数学 英语 总分 黄花 59 98 85 242 刘华 78 67 55 200 陈启 89 90 45 224 各科总分 226 255 185 - 计算以上表格行和
- 计算以上表格列和
- 数据同步排序
#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; } - 简单推箱子
本文来自博客园,作者:{oy},转载请注明原文链接:https://www.cnblogs.com/Oysen/p/17005614.html

浙公网安备 33010602011771号