数组:
一维数组
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';
}
运行结果:
标签:arr,--,C语言,char,int,board,数组,printf From: https://blog.51cto.com/u_16324772/8062155