网络营销
当前位置: 主页 > 资讯 > 网络营销
拓玛科技:C语言--数组(拓玛信息)
发布日期:2023-10-28 阅读次数:

数组:

一维数组

1.一维数组的创建

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

数组的元素类型 数组名 常量表达式(指定数组的大小)

type_t arr_name [const_n]


数组创建的实例:

#include<stdio.h>

int main()

{

    char arr1[10];

    int arr2[10];

    return 0;

}

1.

2.

3.

4.

5.

6.

7.

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


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;

}

1.

2.

3.

4.

5.

6.

7.

8.

计算:

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.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

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;

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

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;

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

或者写为·


#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;

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

若改为整数,则使用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;

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

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;

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

<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;

}

1.

2.

3.

4.

5.

6.

7.

8.

2.二维数组的初始化

#include<stdio.h>

int main()

{

int arr[3][4] = { 1,2,3,4 };

int arr[3][5] = { {1,2},{3,4} };

return 0;

}

1.

2.

3.

4.

5.

6.

7.

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;

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

<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;

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

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;

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

31.

32.

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


数组名是什么?

数组名是首元素地址

#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.

2.

3.

4.

5.

6.

7.

8.

9.

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


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);

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

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;

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

36.

37.

38.

39.

40.

41.

42.

43.

44.

45.

46.

47.

48.

49.

50.

51.

52.

53.

54.

55.

56.

57.

58.

59.

60.

61.

62.

63.

64.

65.

66.

67.

68.

69.

70.

71.

72.

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';

 }

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

36.

37.

38.

39.

40.

41.

42.

43.

44.

45.

46.

47.

48.

49.

50.

51.

52.

53.

54.

55.

56.

57.

58.

59.

60.

61.

62.

63.

64.

65.

66.

67.

68.

69.

70.

71.

72.

73.

74.

75.

76.

77.

78.

79.

80.

81.

82.

83.

84.

85.

86.

87.

88.

89.

90.

91.

92.

93.

94.

95.

96.

97.

98.

99.

100.

101.

102.

103.

104.

105.

106.

107.

108.

109.

110.

111.

112.

113.

114.

115.

116.

117.

118.

119.

120.

121.

122.

123.

124.

125.

126.

127.

128.

129.

130.

运行结果:



-----------------------------------

©著作权归作者所有:来自51CTO博客作者sunny_Sulis的原创作品,请联系作者获取转载授权,否则将追究法律责任

C语言--数组

https://blog.51cto.com/u_16324772/8062155