首页 > 其他分享 >C语言--数组

C语言--数组

时间:2023-10-27 19:32:00浏览次数:35  
标签:arr -- C语言 char int board 数组 printf

数组:

一维数组

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

标签:arr,--,C语言,char,int,board,数组,printf
From: https://blog.51cto.com/u_16324772/8062155

相关文章

  • ArmSoM---SPI开发指南
    1.简介RK3588从入门到精通本⽂主要介绍在Rockchip平台配置spi接口并且使用的方法开发板:ArmSoM-W3Kernel:5.10.160OS:Debian112.SPI接口概述SPI(SerialPeripheralInterface),即串行外围设备接口,是一种同步的,全双工的,多设备的,多主机的通信协议,用于连接外围设备,如ADC、DAC、数......
  • 无涯教程-Clojure - drop函数
    根据需要删除的元素数从序列中删除元素。drop-语法以下是语法。(dropnumseq1)参数   - "seq1"是元素的顺序列表。"num"是需要删除的元素数。返回值 - 返回元素序列,并将必需的元素从序列中删除。drop-示例(nsclojure.examples.example(:gen-clas......
  • 相机标定问题
    参考链接:http://www.360doc.com/content/18/0310/07/6322459_735819151.shtmlhttps://blog.51cto.com/luohenyueji/5950066相机标定是一个很基本的数学问题,我一般这样估算一个无畸变相机内参:1.fx=fy,fx等于图像的长宽之和的一半。如果有差距,会视情况调整,但是仍然保证fx=fy。2.c......
  • 如何使用nodejs对接【企查查开放平台API服务】
    下面分享一下如何对接企查查API接口相关内容。API服务对接流程:1、登录|注册:先打开企查查开放平台网站(https://openapi.qcc.com),菜单栏中右上角【登录|注册】;2.打开API服务列表通过顶部导航菜单【API】,可以查看所有服务列表,里面包含了很多API接口,此处不具体介绍,有兴趣的可以自己......
  • 让物体动起来,Unity的几种移动方式
    一、前言在大部分的Unity游戏开发中,移动是极其重要的一部分,移动的手感决定着游戏的成败,一个优秀的移动手感无疑可以给游戏带来非常舒服的体验。而Unity中有多种移动方法,使用Transform,使用刚体Rigidbody,使用CharacterController,使用NavMesh导航系统等等等等。当然,对于新手来说,最常......
  • linux系统 基本权限ACL读书笔记
    当你作为一个Linux初学者探索文件权限和ACL(AccessControlLists)时,了解getfacl和setfacl命令将帮助你更好地管理文件和目录的权限。以下是一些关于这两个命令的读书笔记:getfacl命令getfacl命令用于获取文件或目录的ACL信息。ACL允许你在标准UNIX权限之外更精细地控制访问。以下......
  • aardio调用java语言
    一、引入java默认只要在aardio中调用importjava;就会自动搜索系统可用的JRE,如果没有找到JRE,会自动导入java.jre.v8扩展库,并自动安装OpenJDKJREv8 。注:如果系统已经安装了java6,就会用系统自带的java6,而不会自动安装OpenJDKJREv8。项目经验:项目开发过程中就遇......
  • C++常量
    C++常量一、整数常量整数常量可以是十进制,八进制或十六进制的常量。前缀指定基数:0x或0X表示十六进制,0表示八进制,不带前缀则表示十进制。整数常量也可以带一个后缀,后缀是U和L的组合,U表示无符号整数(unsigned),L表示长整数(long),后缀可以是大写,也可以是小写,U和L的顺序任意。85......
  • JavaSeript在发送AJAX请家时,URL的域名地址是使用绝对地址还是相对地呲?
    在发送AJAX请求时,URL的域名地址可以使用绝对地址或相对地址。绝对地址包含完整的协议、域名和路径,例如:http://example.com/api/data。这种方式适用于需要请求不同域名下的数据的情况。使用绝对地址时,可以确保请求准确地发送到指定的服务器。相对地址只包含相对于当......
  • day 3 链表 203.移除链表元素、707.设计链表、206.反转链表
    203.移除链表元素题目链接:203.移除链表元素视频教程文字教程虚拟头节点虚拟头节点的目的:消除头节点的特殊性痛点:删除头节点和删除其他节点的操作是不一样的,导致写代码时需要分两种情况考虑因为其他链表都是通过前一个节点删除的而头节点没有前一个节点,只需将头节点向......