C语言经典例题-4

1.五子棋

test.c - 测试游戏的逻辑

game.c - 与游戏相关函数实现

game.h - 与游戏相关函数的声明,符号声明,头文件的包含。

//test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu()  //打印菜单函数
{printf("********************************\n");printf("*********   1.play    **********\n");printf("*********   0.exit    **********\n");printf("********************************\n");
}void game()
{char board[ROW][COL];char ret = 0;srand((unsigned int)time(NULL));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') //如果是* # Q ,那么游戏就结束了。{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");}}int main()
{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#define ROW 3
#define COL 3#include <stdio.h>
#include <stdlib.h>  //使用rand时需要调用
#include <time.h>     //使用time时需要调用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);  //判断胜负函数的声明//  *  -   玩家获胜
//  #  -   电脑获胜
//  Q  -   平局
//  C  -   继续
//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;int j = 0;for (i = 0;i < row;i++){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("请选择你要走的坐标:");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 ComputerMove(char board[ROW][COL], int row, int col)  //电脑下棋函数的定义
{printf("电脑走:\n");while (1){int x = rand() % row;int 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 x = 0;int y = 0;//三行for (x = 0;x < row;x++){if (board[x][0] == board[x][1] && board[x][1] == board[x][2] && board[x][1] != ' '){return board[x][1];}}//三列for (y = 0;y < col;y++){if (board[0][y] == board[1][y] && board[1][y] == board[2][y] && board[1][y] != ' '){return board[1][y];}}//右->左对角线if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//左->右对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}//判断棋盘是否满了//如果满了返回1,没满则返回0int ret = IsFull(board, ROW, COL);if (ret == 1){return 'Q';}else{return 'C';}
}
2.扫雷游戏
  • test.c — 与游戏相关的逻辑测试

  • game.c — 与游戏相关的函数实现

  • game.h — 与游戏相关的函数的声明

//test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu()
{printf("******************************\n");printf("**********1.play**************\n");printf("**********0.exit**************\n");printf("******************************\n");
}void game()
{char mine[ROWS][COLS] = { 0 };  //存放部署好的雷的信息char show[ROWS][COLS] = { 0 };  //存放排查出的雷的信息InitBoard(mine, ROWS, COLS, '0');  //雷盘初始化DisplayBoard(mine, ROW, COL);      //打印雷盘InitBoard(show, ROWS, COLS, '*');DisplayBoard(show, ROW, COL);Set_Mine(mine, ROW, COL);          //部署雷DisplayBoard(mine, ROW, COL);Find_Mine(mine, show, ROW, COL);   //排查雷
}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu(); //游戏菜单printf("请选择:");scanf("%d", &input);switch (input){case 1:game(); //扫雷游戏break;case 0:printf("退出游戏\n");break;default:printf("输入错误,重新输入!\n");}} while (input);
}
//game.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void InitBoard(char board[ROW][COL], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0;i < rows;i++){for (j = 0;j < cols;j++){board[i][j] = set;}}
}void DisplayBoard(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("------ 扫雷游戏 -------\n");for (x = 0;x <= row;x++){printf("%d ", x);}printf("\n");for (x = 1;x <= row;x++){printf("%d ", x);for (y = 1;y <= col;y++){printf("%c ",board[x][y]);}printf("\n");}printf("------ 扫雷游戏 -------\n");
}
static int get_mine_count(char mine[ROW][COL], int x, int y)
{return mine[x-1][y] +mine[x-1][y-1] +mine[x][y-1] +mine[x+1][y-1] +mine[x+1][y] +mine[x+1][y+1] +mine[x][y+1] +mine[x-1][y-1] - 8 * '0';
}void Set_Mine(char mine[ROWS][COLS], int row, int col)
{int count = 10;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}void Find_Mine(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col - Count){printf("请输入选择的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)  //判断坐标的合理性{if (mine[x][y] == '1'){printf("失败");break;}else{int count = get_mine_count(mine, x, y);  //不是雷的前提下,计算x,y坐标中周围有多少个雷show[x][y] = count + '0';DisplayBoard(show, ROW, COL);            //打印排查出的信息win++;}}else{printf("错误,重新输入\n");}}if (win = row * col - Count){printf("恭喜获胜\n");}
} 
//game.h
#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#define Count 10//初始化函数声明
void InitBoard(char board[ROW][COL], int rows, int cols, char set);//打印函数声明
void DisplayBoard(char board[ROW][COL], int row, int col);//部署函数声明
void Set_Mine(char mine[ROWS][COLS], int row, int col);//排查函数声明
void Find_Mine(char mine[ROW][COL], char show[ROW][COL], int row, int col);
3.杨辉三角

在屏幕上打印杨辉三角。

1

1 1

1 2 1

1 3 3 1

#include <stdio.h>int main()
{int arr[10][10] = { 0 };int i = 0;int j = 0;for (i = 0; i < 10; i++){for (j = 0; j <= i; j++){if (j == 0){arr[i][j] = 1;}if (i == j){arr[i][j] = 1;}if (i >= 2 && j >= 1){arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];}}}for (i = 0; i < 10; i++){for (j = 0; j <= i; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
4.通讯录
  • test.c — 与通讯录相关的逻辑测试

  • game.c — 与通讯录相关的函数实现

  • game.h — 与通讯录相关的函数的声明

test.c:

#define _CRT_SECURE_NO_WARNINGS 1//通讯录
//1.能存放1000个人的信息
//每个人信息:姓名+年龄+性别+电话+地址
//2.增加人的信息
//3.删除指定的人的信息
//4.修改指定的人的信息
//5.查找指定的人的信息
//6.排序通讯录的信息#include "Contact.h"enum Option
{EXIT,ADD,DEL,MODIFY,SEARCH,SORT,PRINT
};void menu()
{printf("********************************************************\n");printf("********** 1.add        2.del   ****************\n");printf("********** 3.modify        4.search****************\n");printf("********** 5.sort        6.print ****************\n");printf("********** 0.exit               *************\n");printf("********************************************************\n");
}int main()
{int input = 0;Contact con;Init_Contact(&con);do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case ADD:Add_Contact(&con);break;case DEL:Del_Contact(&con);break;case MODIFY:Modify_Contact(&con);break;case SEARCH:Search_Contact(&con);break;case SORT:break;case PRINT:Print_Contact(&con);break;case EXIT:return;break;default:printf("选择错误,请重新选择:>");break;}} while (input);}

Contact.c:

#include "Contact.h"static int Find_ByName(Contact* c,char name[])
{int i = 0;for (i = 0; i < c->sz; i++){if (strcmp(c->data[i].name ,name) == 0){return i;}}return -1;
}void Init_Contact(Contact* c)
{c->sz = 0;memset(c->data, 0, sizeof(c->data));
}void Add_Contact(Contact* c)
{if (c->sz == 1000){printf("通讯录已满,无法增加\n");return;}printf("请输入名字:>");scanf("%s",c->data[c->sz].name );printf("请输如年龄:>");scanf("%d", &(c->data[c->sz].age));printf("请输入性别:>");scanf("%s", c->data[c->sz].sex);printf("请输入电话:>");scanf("%s", c->data[c->sz].tele);printf("请输入地址:>");scanf("%s", c->data[c->sz].addr);c->sz++;printf("增加成功\n");
}void Print_Contact(const Contact* c)
{int i = 0;printf("%-10s\t%-5s\t%-8s\t%-15s\t%-20s\n", "姓名","年龄","性别","电话","地址");for (i = 0; i < c->sz; i++){printf("%-10s\t%-5d\t%-8s\t%-15s\t%-20s\n", c->data[i].name,c->data[i].age, c->data[i].sex, c->data[i].tele, c->data[i].addr);}
}void Del_Contact(Contact* c)
{char name[MAX_NAME] = { 0 };if (c->sz == 0){printf("通讯录为空,无法删除\n");}printf("请输入你要删除的信息:>");scanf("%s", name);int pos = Find_ByName(c, name);if (pos == -1){printf("你要删除的信息不存在\n");}for (int i = 0; i < c->sz - 1; i++){c->data[i] = c->data[i + 1];}c->sz--;printf("删除成功\n");
}void Modify_Contact(Contact* c)
{char name[MAX_NAME] = { 0 };printf("请输入你要修改的信息:>");scanf("%s", name);int pos = Find_ByName(c, name);if (pos == -1){printf("你要修改的信息不存在\n");}else{printf("请输入名字:>");scanf("%s", c->data[pos].name);printf("请输如年龄:>");scanf("%d", &(c->data[pos].age));printf("请输入性别:>");scanf("%s", c->data[pos].sex);printf("请输入电话:>");scanf("%s", c->data[pos].tele);printf("请输入地址:>");scanf("%s", c->data[pos].addr);printf("修改成功\n");}}void Search_Contact(Contact* c)
{char name[MAX_NAME] = { 0 };printf("请输入你要查找的信息:>");scanf("%s", name);int pos = Find_ByName(c, name);if (pos == -1){printf("你要查找的信息不存在\n");}else{printf("%-10s\t%-5s\t%-8s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%-10s\t%-5d\t%-8s\t%-15s\t%-20s\n",c->data[pos].name,c->data[pos].age,c->data[pos].sex,c->data[pos].tele,c->data[pos].addr);}
}

Contact.h:

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#define MAX_NAME 20
#define MAX_SEX 8
#define MAX_TELE 15
#define MAX_ADDR 30
#define MAX 1000typedef struct PeoInfo
{char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_ADDR];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];int sz;
}Contact;void Init_Contact(Contact* c);
void Add_Contact(Contact* c);
void Print_Contact(const Contact* c);
void Del_Contact(Contact* c);
void Modify_Contact(Contact* c);
void Search_Contact(Contact* c);

5.杨氏矩阵

题目内容:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

要求:时间复杂度小于o(N);

#include <stdio.h>int find_num(int arr[][3], int row, int col, int key)
{int i = 0;int j = col-1;while (i<row && j>=0){if (arr[i][j] > key){j--;}else if (arr[i][j] < key){i++;}else{return 1;}}return 0;
}int main()
{int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int k = 12;int ret = find_num(arr,3,3,k);if (ret == 1){printf("找到了\n");}else{printf("没找到\n");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 异常处理 try

异常 我们常见的代码错误后 会出现此类异常 SyntaxError&#xff1a;语法错误 AttributeError&#xff1a;属性错误 IndexError&#xff1a;索引错误 TypeError&#xff1a;类型错误 NameError&#xff1a;变量名不存在错误 KeyError&#xff1a;映射中不存在的关键字&#xf…

eletron入门教程 -- 快速写一个electron demo程序

1、前言 由于工作需要&#xff0c;前段时间基于electron框架开发了一个桌面应用程序。由于我之前主要是做c后端开发&#xff0c;所以没有任何electron基础&#xff0c;也没有任何前端开发基础&#xff0c;但是没有办法&#xff0c;老板需要&#xff0c;那就得会&#xff0c;不会…

【java】常见面试题目

文章目录 一、JAVA基础篇二、多线程篇三、SQL篇四、No-SQL篇五、MQ篇六、框架篇七、JVM篇八、常见算法题 一、JAVA基础篇 1、ConcurrentHashMap是如何保证线程安全的&#xff0c;HashMap为什么是线程不安全的? HashTable为什么是线程安全的&#xff0c;HashSet为什么是线程不…

前端开发工程师——数据可视化

canvas canvas绘制线段 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthd…

如何使用KNN

导入文件和库 加载数据集、拆分数据集 训练模型 预测 打印结果

自从有了可观测性,传统运维如何进行提升?

在 201x 年&#xff0c;随着容器技术的出现&#xff0c;容器的部署方式逐渐被各大互联网公司采用&#xff0c;相比物理机/虚拟机&#xff0c;容器的好处是环境隔离、轻量、快速。 但是管理容器是一件复杂的事情&#xff0c;后来出现了 Kubernetes&#xff0c;成为了事实上的容…

加拿大门户媒体《金融邮报》《埃德蒙顿日报》新闻媒体投放

介绍 加拿大媒体广告投放是企业宣传推广的重要手段之一。在加拿大&#xff0c;主流媒体包括《金融邮报》和《埃德蒙顿日报》。《金融邮报》是加拿大唯一的全国性英文金融日报&#xff0c;总部位于多伦多&#xff0c;具有丰富的金融消息资源&#xff0c;可反映加拿大商界各方面…

Oracle实践|内置函数之日期与时间函数

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

五分钟”手撕“异常

目录 一、什么是异常 二、异常的体系和分类 三、异常的处理 1.抛出异常 2.异常的捕获 异常声明throws&#xff1a; try-catch处理 四、finally finally一定会被执行吗&#xff1f; 五、throw和throws区别 六、异常处理的流程 七、自定义异常 一、什么是异常 顾名…

大模型额外篇章二:基于chalm3或Llama2-7b训练酒店助手模型

文章目录 一、代码部分讲解二、实际部署步骤(CHALM3训练步骤)1)注册AutoDL官网实名认证2)花费额度挑选GPU3)准备实验环境4)开始执行脚本5)从浏览器访问6)可以开始提问7)开始微调模型8)测试训练后的模型三、基于Llama2-7b的训练四、额外补充1)修改参数后2)如果需要访问…

PHP:open_basedir restriction in effect.

当我们下载了组件&#xff0c;引入的时候出现 open_basedir restriction in effect&#xff0c;那这个时候我们该怎么弄呢&#xff1f; 首先我们进入宝塔管理页面&#xff1a;【软件商店】-【运行环境】-【安装PHP】-【设置】 其中后面的路径是用 : 来分隔表示多少个&#xff…

指纹识别系统架构

目录 1. 系统架构 1.1 指纹采集模块 1.2 指纹处理模块 1.3 指纹登记模块 1.4 指纹识别模块 1.5 指纹识别决策模块 1.6 管理模块 1.6.1 存储管理 1.6.2 传输管理 1.6.3 安全管理 1.7 应用开放功能 1.7.1 指纹登记功能 1.7.2 指纹验证功能 1.7.3 指纹辨识功能 2. …

OnlyOffice 7.4 版本打开文件时提示:文档安全令牌未正确形成。

OnlyOffice 7.4 版本打开文件时提示&#xff1a;文档安全令牌未正确形成。 笔记&#xff0c;springboot项目融合Onlyoffice时&#xff0c;出现的问题&#xff0c;解决后记录一下 笔记&#xff0c;springboot项目融合Onlyoffice时&#xff0c;出现的问题&#xff0c;解决后记录一…

Android Studio制作简单登录界面

Android Studio制作简单登录界面 实现目标 应用线性布局设计登录界面&#xff0c;要求点击输入学号时弹出数字键盘界面&#xff0c;点击输入密码时弹出字母键盘&#xff0c;出现的文字、数字、尺寸等全部在values文件夹下相应.xml文件中设置好&#xff0c;使用时直接引用。当…

如何使用perf 统计cpu和内存?

文章目录 0. 概要1. 使用perf统计CPU和内存的结果示例1.1 **统计CPU时钟周期&#xff1a;**1.2 **统计指令数量&#xff1a;**1.3 **统计缓存命中率&#xff1a;**1.4 **统计内存带宽的示例输出** 2 **注意&#xff1a;** 0. 概要 PMU&#xff08;Performance Monitoring Unit…

蓝桥杯物联网竞赛_STM32L071KBU6_关于size of函数产生的BUG

首先现象是我在用LORA发送信息的时候&#xff0c;左边显示长度是8而右边接收到的数据长度却是4 我以为是OLED显示屏坏了&#xff0c;又或者是我想搞创新用了const char* 类型强制转换数据的原因&#xff0c;结果发现都不是 void Function_SendMsg( unsigned char* data){unsi…

学习笔记——交通安全分析02

目录 前言 当天学习笔记整理 绪论 结束语 前言 #随着上一轮SPSS学习完成之后&#xff0c;本人又开始了新教材《交通安全分析》的学习 #整理过程不易&#xff0c;喜欢UP就点个免费的关注趴 当天学习笔记整理 绪论 美国在道路设施安全改善过程中&#xff0c;形成了数据基…

并查集的实现(C++)

之前我已经写过一期的并查集的内容&#xff0c;这里主要是实现并查集的整体结构&#xff1a; #pragma once //并查集&#xff1a;class UnionFindSet//父母表示法; { public://构造函数&#xff1a;UnionFindSet(size_t size0):_ufs(size,-1){}//合并元素;bool Union(int x, i…

【云原生】Kubernetes基础命令合集

目录 引言 一、命令概述 &#xff08;一&#xff09;命令分类 &#xff08;二&#xff09;基本语法 二、查看基本信息 &#xff08;一&#xff09;环境指令 1.查看版本信息 2.查看资源对象简写 3.添加补全信息 4.查看日志 5.查看集群信息 &#xff08;二&#xff0…

数据结构(三)

数据结构&#xff08;三&#xff09; 图状关系顺序存储链式存储十字链表法多重链表法 图的遍历佛洛依德算法迪杰斯特拉算法洪水算法 图状关系 按有无方向分&#xff1a;有向图、无向图 按是否有权值&#xff1a;带权图、不带权图 顺序存储 链式存储 十字链表法 多重链表法 图…