栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言学习4 ——(数组)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言学习4 ——(数组)

C语言学习--数组

1.一维数组的创建和初始化

(1)数组的创建:数组是一组相同类型元素的集合。数组的创建方式 :(2)数组的初始化:数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值 (初始化)。 2. 一维数组的使用3. 一维数组在内存中的存储4.二维数组的创建和初始化

(1)二维数组的创建(2)二维数组的初始化 5.二维数组的使用6.二维数组在内存中的存储7.数组作为函数参数8.数组的应用实例1 :三子棋9.数组的应用实例2 :扫雷游戏10、备注:

1.一维数组的创建和初始化 (1)数组的创建:数组是一组相同类型元素的集合。数组的创建方式 :
	type_ t    arr_ name    [const. _n] ;
	//type_t 是指数组的元素类型
	//const_.n是一个常量表达式,用来指定数组的大小

 注:数组创建,[ ]中要给一个常量才可以,不能使用变量。

(2)数组的初始化:数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值 (初始化)。
	#include 
	
	int  main()
	{
	//    int arr[10] ={1,2,3};//不完全初始化,剩下的元素默认初始化为0
	//    char arr2[5] = {'a',98};
	//    char arr3[5] = "ab";
	    char arr4[] = "abcdef";
	    printf("%dn",sizeof(arr4));
	    printf("%dn",strlen(arr4));
		return 0;
	}

答案是7、6

 1. strlen 和sizeof没有什么关联
 2. strlen是乘字符串长度的一只能针对字符串求长度-库函数-使用得引头文件
 3. sizeof 计算变量、数组、类型的大小-单位是字节-操作符

	#include 
	
	int  main()
	{
	    char arr1[] = "abc";
	    char arr2[] = {'a','b','c'};
	    printf("%dn",sizeof(arr1));
	    printf("%dn",sizeof(arr2));
	    printf("%dn",strlen(arr1));
	    printf("%dn",strlen(arr2));
		return 0;
	}

答案是4、3、3、随机值

2. 一维数组的使用
	#include 
	#include 
	int  main()
	{
	    char arr[] = "abcdef";
	//    printf("%cn",arr[3]);
	    int i = 0;
	    for(i=0;i 
	#include 
	#include 
	int  main()
	{
	    int  arr[] = {1,2,3,4,5,6,7,8,9,10};
	    int  sz=sizeof(arr)/sizeof(arr[0]);
	    int i = 0;
	    for(i=0;i 

 1.数组是使用下标来访问的,下标是从0开始。
 2.数组的大小可以通过计算得到。

int arr[ 10 ] ;
int sz=sizeof(arr)/sizeof(arr[0]);

3. 一维数组在内存中的存储
	#include 
	#include 
	int  main()
	{
	    int arr[]={1,2,3,4,5,6,7,8,9,10};
	    int sz = sizeof(arr)/sizeof(arr[0]);
	    int i = 0;
	    for(i=0;i 

  数组在内存中是连续存放的

4.二维数组的创建和初始化 (1)二维数组的创建
	int arr[3][4];//三行四列
    char arr[3][5];
    double arr[2][4];
(2)二维数组的初始化
    int arr[3][4] = {1,2,3,4};
    char arr[3][5] = {{1,2},{4,5};
    double arr[][4]= {{2,3},{4,5};
5.二维数组的使用
	#include 
	
	int  main()
	{
	    int arr[3][4] = {{1,2,3},{4,5}};
	    int i = 0;
	    for(i=0;i<3;i++)
	    {
	        int j = 0;
	        for(j=0;j<4;j++)
	        {
	            printf("%d ",arr[i][j]);
	        }
	        printf("n");
	    }
		return 0;
	}
6.二维数组在内存中的存储
#include 

int  main()
{
    int arr[3][4] = {{1,2,3},{4,5}};
    int i = 0;
    for(i=0;i<3;i++)
    {
        int j = 0;
        for(j=0;j<4;j++)
        {
            printf("&arr[%d][%d]= %pn",i,j,&arr[i][j]);
        }
        printf("n");
    }
	return 0;
}

  二维数组在内存中是连续存放的

7.数组作为函数参数

 往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。那我们将会这样使用该函数:

	#include 
	
	void bubble_sort(int arr[],int sz)
	{
	    //确定冒泡排序的趟数 n个元素需要n-1趟
	    int i = 0;
	    for( i = 0;i < sz-1;i++)
	    {
	        int flag = 1;//假设这一趟要排序的数据已经有序
	        //每一趟冒泡排序
	        int j =0;
	        for(j =0;j  arr [j+1])
	           {
	               int tmp =arr[j];
	               arr [j] = arr[j+1];
	               arr[j+1] = tmp;
	               flag = 0;//本趟排序的数据不完全有序
	           }
	        }
	        if(flag == 1)
	        {
	            break;
	        }
	    }
	}
	int  main()
	{
	    int arr[ ] = {9,8,7,6,5,4,3,2,1,0};
	    int i = 0;
	    int sz = sizeof(arr) / sizeof(arr[0]);
	    //对arr进行排序,排成升序
	    //arr是数组,我们对数组arr进行传参,实际传递过去的是数组arr首元素的地址&arr
	    bubble_sort(arr,sz);//冒泡排序函数
	    for(i = 0;i 
#include 
int  main()
{
    int arr[] = {1,2,3,4,5,6,7};
    printf("%pn",arr);
    printf("%pn",&arr[0]);
    printf("%dn",*arr);
	return 0;
}

  数组名是数组首元素的地址

#include 
	int  main()
	{
	    int arr[] = {1,2,3,4,5,6,7};
	    //int sz = sizeof(arr)/sizeof(arr[10]);
	
	    printf("%pn",arr);
	    printf("%pn",arr+1);
	
	    printf("%pn",&arr[0]);
	    printf("%pn",&arr[0]+1);
	
	    printf("%pn",&arr);//整个数组的地址
	    printf("%pn",&arr+1);
		return 0;
	}

1. sizeof (数组名) -数组名表示整个数组,sizeof (数组名)计算的是整个数组的大小,单位是字节
2.&数组名,数组名代表整个数组,&数组名,取出的是整个数组的地址

8.数组的应用实例1 :三子棋

主函数main.c

	//测试三子棋游戏
	#include "game.h"
	
	void menu()
	{
		printf("***************************n");
		printf("** 1. 玩游戏  0. 退出游戏****n");
		printf("***************************n");
	}
	//   |   |
	//---|---|---
	//   |   |
	//---|---|---
	//   |   |
	
	//游戏的整个算法实现
	void game()
	{
		char ret = 0;
		//数组-存放走出的棋盘信息
		char board[ROW][COL] = {0};//全部空格
		//初始化棋盘
		InitBoard(board, ROW, COL);
		//打印棋盘
		DisplayBoard(board, ROW, COL);
		//下棋
		while (1)
		{
			//玩家下棋
			PlayerMove(board, ROW, COL);
			DisplayBoard(board, ROW, COL);
			//判断玩家是否赢
			ret = IsWin(board, ROW, COL);
			if (ret != 'C')
			{
				break;
			}
			//电脑下棋
			ComputerMove(board, ROW, COL);
			DisplayBoard(board, ROW, COL);
			//判断电脑是否赢
			ret = IsWin(board, ROW, COL);
			if (ret != 'C')
			{
				break;
			}
		}
		if (ret == '*')
		{
			printf("玩家赢n");
		}
		else if (ret == '#')
		{
			printf("电脑赢n");
		}
		else
		{
			printf("平局n");
		}
	}
	
	void test()
	{
		int input = 0;
		srand((unsigned int)time(NULL));
		do
		{
			menu();
			printf("请选择:>");
			scanf("%d", &input);
			switch (input)
			{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏n");
				break;
			default:
				printf("选择错误,请重新选择!n");
				break;
			}
		} while (input);
	}
	
	int main()
	{
		test();
		return 0;
	}

函数game.c

#include "game.h"

void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//void DisplayBoard(char board[ROW][COL], int row, int col)
//{
//	int i = 0;
//	for (i = 0; i < row; i++)
//	{
//		//1. 打印一行的数据
//		printf(" %c | %c | %c n", board[i][0], board[i][1], board[i][2]);
//		//2. 打印分割行
//		if (i < row - 1)
//			printf("---|---|---n");
//	}
//}

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			//1. 打印一行的数据
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("n");
		//2. 打印分割行
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (jn");
	while (1)
	{
		printf("请输入要下的坐标:>");
		scanf("%d%d", &x, &y);
		//判断x,y坐标的合法性
		if (x >= 1 && x <= row  && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标被占用n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入!n");
		}
	}
}

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走:>n");
	while (1)
	{

		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}

}
//返回1表示棋盘满了
//返回0,表示棋盘没满

int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//没满
			}
		}
	}
	return 1;//满了
}

char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//横三行
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}
	//竖三列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}
	}
	//两个对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		return board[1][1];
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
		return board[1][1];
	//判断是否平局
	if (1 == IsFull(board, ROW, COL))
	{
		return 'Q';
	}
	//继续
	return 'C';
}

函数game.h

	#define ROW 3
	#define COL 3
	#include 
	#include 
	#include 
	
	//声明
	void InitBoard(char board[ROW][COL], int row, int col);
	void DisplayBoard(char board[ROW][COL], int row, int col);
	void PlayerMove(char board[ROW][COL], int row, int col);
	void ComputerMove(char board[ROW][COL], int row, int col);
	
	//告诉我们四种游戏的状态
	//玩家赢 - '*'
	//电脑赢 - '#'
	//平局   - 'Q'
	//继续   - 'C'
	
	char IsWin(char board[ROW][COL], int row, int col);
9.数组的应用实例2 :扫雷游戏

主函数main.c

	#include "game.h"
	
	void menu()
	{
		printf("*****************************n");
		printf("*******    1. 玩游戏    ******n");
		printf("*******    0. 退出      ******n");
		printf("*****************************n");
	}
	
	void game()
	{
		//雷的信息存储
		//1. 布置好的雷的信息
		char mine[ROWS][COLS] = { 0 };// 11 * 11
		//2. 排查出的雷的信息
		char show[ROWS][COLS] = { 0 };
		//初始化
		InitBoard(mine, ROWS, COLS, '0');
		InitBoard(show, ROWS, COLS, '*');
		//打印棋盘
		//DisplayBoard(mine, ROW, COL);
		DisplayBoard(show, ROW, COL);
		//布置雷
		SetMine(mine, ROW, COL);
		//DisplayBoard(mine, ROW, COL);
		//扫雷
		FindMine(mine, show, ROW, COL);
	}
	
	void test()
	{
		int input = 0;
		srand((unsigned int)time(NULL));
	
		do
		{
			menu();
			printf("请选择:>");
			scanf("%d", &input);
			switch (input)
			{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏n");
				break;
			default:
				printf("选择错误,重新选择!n");
				break;
			}
		} while (input);
	}
	
	int main()
	{
		test();
		return 0;
	}

函数game.c

	#include "game.h"
	
	void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
	{
		int i = 0;
		int j = 0;
		for (i = 0; i < rows; i++)
		{
			for (j = 0; j < cols; j++)
			{
				board[i][j] = set;
			}
		}
	}
	
	void DisplayBoard(char board[ROWS][COLS], int row, int col)
	{
		int i = 0;
		int j = 0;
		//打印列号
		for (i = 0; i <= col; i++)
		{
			printf("%d ", i);
		}
		printf("n");
		for (i = 1; i <= row; i++)
		{
			printf("%d ", i);
			for (j = 1; j <= col; j++)
			{
				printf("%c ", board[i][j]);
			}
			printf("n");
		}
	}
	
	void SetMine(char board[ROWS][COLS], int row, int col)
	{
		int count = EASY_COUNT;
		while (count)
		{
			int x = rand() % row + 1;//1-9
			int y = rand() % col + 1;//
			if (board[x][y] == '0')
			{
				board[x][y] = '1';
				count--;
			}
		}
	}
	//'0' - '0'=0
	//'1'-'0' = 1
	//'3'-'0' = 3
	
	int get_mine_count(char mine[ROWS][COLS], int x, int y)
	{
			return mine[x - 1][y] +
			mine[x - 1][y - 1] +
			mine[x][y - 1] +
			mine[x + 1][y - 1] +
			mine[x + 1][y] +
			mine[x + 1][y + 1] +
			mine[x][y + 1] +
			mine[x - 1][y + 1] - 8*'0';
	}
	
	void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
	{
		int x = 0;
		int y = 0;
		int win = 0;
		//9*9-10 = 71
		while (win");
			scanf("%d%d", &x, &y);
			if (x >= 1 && x <= row && y >= 1 && y <= col)
			{
				//坐标合法
				//1. 踩雷
				if (mine[x][y] == '1')
				{
					printf("很遗憾,你被炸死了n");
					DisplayBoard(mine, row, col);
					break;
				}
				else //不是雷
				{
					//计算x,y坐标周围有几个雷
					int count = get_mine_count(mine, x, y);
					show[x][y] = count + '0';
					DisplayBoard(show, row, col);
					win++;
				}
			}
			else
			{
				printf("输入坐标非法,请重新输入!n");
			}
		}
		if (win == row*col - EASY_COUNT)
		{
			printf("恭喜你,排雷成功n");
			DisplayBoard(mine, row, col);
		}
	}
	
	//展开功能的时候-递归

函数game.h

	#define ROW 9
	#define COL 9
	
	#define ROWS ROW+2
	#define COLS COL+2
	
	#define EASY_COUNT 10
	
	#include 
	#include 
	#include 
	
	void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
	void DisplayBoard(char board[ROWS][COLS], int row, int col);
	void SetMine(char board[ROWS][COLS], int row, int col);
	void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
10、备注:
    本文章是个人总结,如有错误请指正;部分资料来源于网络和开发手册,如有侵权请联系我删除;如需上方资料,请与我联系。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767919.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号