0
点赞
收藏
分享

微信扫一扫

学习随记_2

·数组


-一组相同类型元素的集合

-数组的创建

-数组的初始化

    不完全初始化,剩下的元素默认初始化为0


·一维数组

·        strlen                 和             sizeof

\0之前的字符个数

·数组中元素的访问

-[ ]下标引用操作符

-通过下标访问数组中的元素

·一维数组在内存中的存储

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


·二维数组

-创建

-初始化

  arr[行][列]

  行可以省略,列不能省略

-使用

-访问

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

-二维数组的加深理解

     数个一维数组的组合


·数组作为函数参数

·数组名

-数组名通常是首元素地址


两个例外:

1.sizeof(数组名),计算整个数组的大小,/kb

  1. &数组名,取出的是整个数组的地址

·两个整型的相加算法一般易造成溢出问题


·常用简单排序

·选择排序

//选择排序
#include<stdio.h>

void swap(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}

int main(void)
{
int arr[] = { 4,2,7,4,3,9,5,2,8,9 };
int i = 0;
int j = 0;
int m = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for ( i = 0; i < sz; i++)
{
int min = i;
for (j = i+1; j < sz;j++) //检索未排序的元素
{
if (arr[j] < arr[min]) //找到目前的最小值
{
min = j; //标记最小值
}
}
swap(&arr[min], &arr[i]); //进行交换
}
for ( m = 0; m < sz; m++)
{
printf("%d ", arr[m]);
}
return 0;
}

·冒泡排序

//冒泡排序
#include<stdio.h>

void bubble_sort(int arr[], int sz)
{
int i,j,tmp = 0;
for ( i = 0; i < sz-1; i++)// i的引入:不断舍去末端已定的数
{
for ( j = 0; j < sz-1-i; j++)
{
if (arr[j]>arr[j+1]) //进行判断和交换
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}

int main(void)
{
int arr[] = { 4,2,7,4,3,9,5,2,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int n = 0;
bubble_sort(arr,sz);
for ( n = 0; n < sz; n++)
{
printf("%d ", arr[n]);
}
return 0;
}

·插入排序


· ^按位异或操作符

相同为0,相异为1

-a^a=0

-a^0=a

-异或满足交换律

·按位异或操作符的应用

学习随记_2_排序

-用异或找出不同的某个数

//给定一个非空整形数组,除一个元素出现一次外,其他元素均出现两次,找出这个只出现一次的数
#include<stdio.h>
int main(void)
{
int arr[] = { 1,2,3,4,5,1,2,3,7,4,5 };
int i = 0;
int ret = 0;
int sz = sizeof(arr) / sizeof(arr[0]);// a^0=a
for ( i = 0; i < sz; i++) // a^a=a
{ //异或运算满足交换律
ret = ret ^ arr[i];
}
printf("目标数字:%d\n", ret);
return 0;// 利用按位异或运算
}

-不引入第三个参数,交换两个整型的值

//不引入第三个变量,交换两个整数的值
#include<stdio.h>
int main(void)
{
int a = 3;// 011
int b = 5;// 101
printf("a=%d b=%d\n", a, b);
a = a ^ b;//按位异或运算
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d\n", a, b);
return 0;//不会溢出,执行效率较低,可读性低
}

·c语言实现三子棋

//test.c
#define _CRT_SECURE_NO_WARNINGS 1


#include"game.h"

void menu()
{
printf("***--------------------***\n");
printf("***---1.play 0.exit---***\n");
printf("***--------------------***\n");
}

void game()
{
int ret = 0;
char board[ROW][COL] = { 0 }; //创建数组存放棋子信息
InitBoard(board, ROW, COL); //初始化棋盘
DisplayBoard(board, ROW, COL); //打印棋盘
//下棋
while (1)
{
PlayerMove(board, ROW, COL);//玩家移动
system("cls");
DisplayBoard(board, ROW, COL);//打印棋盘
ret=IsWin(board,ROW,COL);//判断输赢
// ret='*'玩家赢
//ret='#'电脑赢
//ret='Q'平局
//ret='C'游戏继续
if (ret != 'C')
{
break;
}
ComptuerMove(board, ROW, COL);//电脑移动
system("cls");
DisplayBoard(board, ROW, COL);//打印棋盘
ret=IsWin(board,ROW,COL);//判断输赢
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("恭喜你取得胜利!\n");
Sleep(2000);
system("cls");
}
else if (ret == '#')
{
printf("很遗憾,你失败了\n");
Sleep(2000);
system("cls");
}
else
{
printf("双方平局\n");
}
}

main(void)
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (input);
return 0;
}

//game.h

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>

#define ROW 3
#define COL 3

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

//game.c
#define _CRT_SECURE_NO_WARNINGS 1

#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");
printf("请下棋>:\n");
printf("输入要下棋子位置的坐标(x,y)>:");
while (1)
{
scanf("%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 ComptuerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下>:\n");
Sleep(1700);
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % row;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}

int IsFull(char board[ROW][COL],int row,int col)
{
int i, 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][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < col; i++)//竖三列相等
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0]!=' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}//对角线相等
if (IsFull(board,ROW,COL) == 1)//判断是否平局
{
return 'Q';
}
return 'C';
}

·c语言实现扫雷

学习随记_2_排序_02

//test.c
#define _CRT_SECURE_NO_WARNINGS 1

//扫雷复习

#include"game.h"

void menu()
{
printf("***---------------------***\n");
printf("***----1.play 0.exit----***\n");
printf("***---------------------***\n");
}

void game()
{
//定义棋盘
char mine[ROWS][COLS] = { 0 };//存放雷的信息
char show[ROWS][COLS] = { 0 };//存放扫雷信息
InitBoard(mine, ROWS, COLS, '0');//初始化棋盘
InitBoard(show,ROWS, COLS, '*');
DisplayBoard(show, ROW, COL);//打印棋盘
SetMine(mine,ROW,COL);//布雷
//DisplayBoard(mine, ROW, COL);//测试棋盘
FindMine(mine,show,ROW,COL);//扫雷
}

int main(void)
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新输入\n");
break;
}
} while (input);
return 0;
}

//game.h
#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>

#define ROWS 11
#define COLS 11
#define ROW ROWS-2
#define COL COLS-2
#define EASY_COUNT 10

void InitBoard(char board[ROWS][COLS], int row, int col, 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);
void ExcludeMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
int get_mine_count(char mine[ROWS][COLS],char show[ROWS][COLS], int x,int y);

//game.c
#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
int i, 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, 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 x, y = 0;
int count = EASY_COUNT;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}

int get_mine_count(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
return mine[x - 1][y - 1] +
mine[x - 1][y] +
mine[x - 1][y + 1] +
mine[x][y - 1] +
mine[x][y + 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] - 8 * '0';
}

void ExcludeMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
int ret = get_mine_count(mine, show, x, y);
if (ret != 0)
{
show[x][y] = ret + '0';
}
else
{
show[x][y] = ' ';
if (show[x-1][y]=='*')
{
ExcludeMine(mine, show,x-1,y);
}
if (show[x - 1][y-1] == '*')
{
ExcludeMine(mine, show, x - 1, y-1);
}
if (show[x - 1][y+1] == '*')
{
ExcludeMine(mine, show, x - 1, y+1);
}
if (show[x][y-1] == '*')
{
ExcludeMine(mine, show, x, y-1);
}
if (show[x][y+1] == '*')
{
ExcludeMine(mine, show, x, y+1);
}
if (show[x+1][y] == '*')
{
ExcludeMine(mine, show, x + 1, y);
}
if (show[x + 1][y-1] == '*')
{
ExcludeMine(mine, show, x + 1, y-1);
}
if (show[x + 1][y+1] == '*')
{
ExcludeMine(mine, show, x + 1, y+1);
}
}
}

int CheckShow(char show[ROWS][COLS], int row, int col)//判断输赢
{
int i, j = 0;
int win = 0;
for ( i = 1; i <=row; i++)
{
for ( j = 1; j <= col; j++)
{
if (show[i][j]== '*');
{
win++;
}
}
}
return win;
}

void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
int x, y = 0;
int win = 0;
while (1)//
{
printf("请输入要扫雷的位置的坐标(x/y) >:");
scanf("%d%d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)//判断输入是否合法
{
//合法
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了!\n");//是雷
DisplayBoard(mine, ROW, COL);
Sleep(3000);
system("cls");
break;
}
else//不是雷
{
ExcludeMine(mine, show, x, y);//判断和提示
system("cls");
DisplayBoard(show, ROW, COL);
win = CheckShow(show, row, col);
if (win==EASY_COUNT)
{
break;
}
}
}
else
{
//不合法
printf("输入非法,请重新输入\n");
}
if (win==EASY_COUNT)
{
printf("恭喜你,扫雷成功!\n");
}
}
}

举报

相关推荐

0 条评论