C语言--数组
  wb4D1Cbamuiw 2023年11月02日 89 0

数组:

一维数组

1.一维数组的创建
数组是一组相同类型的元素的集合。数组的创建:

数组的元素类型 数组名 常量表达式(指定数组的大小) type_t arr_name [const_n]

数组创建的实例:
#include<stdio.h>
int main()
{
    char arr1[10];
    int arr2[10];
    return 0;
}

==注意:使用数组时,中括号中要使用一个常量,不能使用变量,否则不能正常创建==

2.数组的初始化:
指创建数组时同时给数组内容一些合理的初始值
#include<stdio.h>
int main()
{
    char arr1[10] = { 'a','b','c' };//不完全初始化,剩下元素默认为是0
    int arr2[10] = { 1,2,3,4,5, };
    char arr3[] = "abcd";
    return 0;
}
计算:

==sizeof:计算arr所占空间的大小==

==strlen:求字符串的长度 ‘\0’之前的字符个数==

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[10] = { 'a','b','c' };
    int arr2[10] = { 1,2,3,4,5, };
    char arr3[] = "abcd";
    printf("%d\n", sizeof(arr3));//打印结果:5
    printf("%d", strlen(arr3));//打印结果:4
    return 0;
}

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

例题:
#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[] = { 'a','b','c' };
    char arr2[] = "abc";
    printf("%d\n", sizeof(arr1));//3
    printf("%d\n", sizeof(arr2));//4
    printf("%d\n", strlen(arr1));//随机值
    printf("%d\n", strlen(arr2));//3
    return 0;
}
3.一维数组的使用

下标引用操作符其实就是数组访问操作符[]

#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	int i = 0;
	for (i = 0; i < 6; i++)
	{
		printf("%c\n", arr[i]);
	}
	return 0;
}

或者写为·

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abcdef";
	int i = 0;
	for (i = 0; i < strlen(arr); i++)
	{
		printf("%c\n", arr[i]);
	}
	return 0;
}

若改为整数,则使用sz,例如:

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i <sz; i++)
	{
		printf("%d\n", arr[i]);
	}
	return 0;
}
4.一维数组在内存中存储
#include<stdio.h>
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 < sz; i++)
    {
        printf("&arr[%d]=%p\n", i,&arr[i]);
    }
    return 0;
}

<img src="C:/Users/20399/Desktop/QQ截图20231016200113.png" style="zoom:50%;" />

地址之间相差4说明数组在内存中是连续存放的

二维数组

1.二位数组的创建
#include<stdio.h>
int main()
{
	int arr[3][4];
	char arr[3][5];
	double arr[2][4];
	return 0;
}
2.二维数组的初始化
#include<stdio.h>
int main()
{
	int arr[3][4] = { 1,2,3,4 };
	int arr[3][5] = { {1,2},{3,4} };
	return 0;
}
3.二维数组的使用

==行列不能同时省略== ==行能省略,但列一定不能省略==

4.二维数组在内存中存储
#include<stdio.h>
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]=%p\n", i,j,&arr[i][j]);
		}
	}
	return 0;
}

<img src="C:/Users/20399/Desktop/QQ截图20231016195937.png" style="zoom:50%;" />

==二维数组的在内存中的储存也是有序的==

数组作为函数参数

冒泡函数的排序

对数组进行排序,排成升序

#include<stdio.h>
void bubble_sort(int arr[],int sz)
{    //确定冒泡排序的趟数
	for (int i = 0; i < sz - 1; i++)
	{  //每一趟冒泡排序
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int i = 0;
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int	sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

arr是数组,我们对arr数组进行传参,实际上传递过去的是数组arr首元素的地址。

上述代码在程序设计上太麻烦,对实现一些有序的数组排列时进行了一些不必要的过程。改正为:
#include<stdio.h>
void bubble_sort(int arr[],int sz)
{    //确定冒泡排序的趟数
	int flag = 1;
	for (int i = 0; i < sz - 1; i++)
	{  //每一趟冒泡排序
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (arr[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 i = 0;
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int	sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

==传参传过去应该是指针 但数组的本质就是指针==

数组名是什么?

数组名是首元素地址
#include<stdio.h>
int main()
{
    int arr[]={1,2,3,4};
    printf("%p\n",arr);
    printf("%p\n",&arr[0]);
    printf("%p\n",*arr);
    return 0;
}

==注意:有两个例外(取到的不是首元素)

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

三子棋

game.h头文件
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

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);
char Iswin(char board[ROW][COL], int row, int col);
test.c文件

#include<stdio.h>
#include"game.h"
void menu()
{
	printf("**************************\n");
	printf("*****1. play    0.exit****\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_s("%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++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}
 void PlayerMove(char board[ROW][COL], int row, int col)
 {
	 int x = 0;
	 int y = 0;
	 printf("玩家走:>\n");
	 while (1)
	 {
		 printf("请输入要下的坐标:>\n");
		 scanf_s("%d %d", &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;
		 }
	 }
 }
 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;
	 int j = 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 (j = 0; j < col; j++)
	 {
		 if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		 {
			 return board[0][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';
 }
运行结果:

QQ截图20231019173431.png QQ截图20231019173528.pngQQ截图20231019173548.png

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  TKwJ4YzyA8uz   2024年05月17日   48   0   0 C语言
  6Df3JnWQUC5m   2024年04月24日   59   0   0 C语言
  fHBiUfJyY67V   2024年04月26日   43   0   0 C语言
  V88gxnVgnp1F   2024年05月08日   92   0   0 C语言
  6Df3JnWQUC5m   2024年05月08日   86   0   0 C语言
  o1ZcTI9mJsxK   2024年05月08日   121   0   0 C语言
  H5oyQecqjP4R   2024年04月26日   41   0   0 C语言
  6Df3JnWQUC5m   2024年04月25日   52   0   0 C语言
  nmX9dIiR6BtA   2024年04月28日   49   0   0 C语言
  6Df3JnWQUC5m   2024年05月17日   59   0   0 C语言
  6Df3JnWQUC5m   2024年04月25日   52   0   0 C语言
wb4D1Cbamuiw
作者其他文章 更多