【C语言】童年经典游戏-三字棋
@toc 问题引入 - 什么是三子棋? 想必大家儿时都玩过:#字棋 如图,即一个3x3的格子,玩家需要在横、竖、斜三条线上布下自己的棋子 先连成一条线上3个棋子的玩家获胜 如果格子填满后还未有胜者,即为平局 今天就让我们用c语言代码来完成一个基础的三子棋小游戏 涉及知识点: 二维数组、循环语句、自定义函数、自定义头文件 关联博客:扫雷游戏 自定义头文件 本次三子棋代码实现中,我们需要使用到自定义头文件 使用自定义函数前,需要先对函数进行声明 头文件就是一堆声明的集合 问:为什么不把函数声明直接main函数前面? 答:因为这样更方便团队进行同一个项目的分工制作 如何创建自定义头文件? 在vs编译器的“解决资源管理器”里,我们能看到头文件的文件夹 右键它,新建项 选择头文件进行新建,后缀是.h 创建完后,我们可以在另外一个源文件中引用头文件 1#include...
【C语言】用递归和非递归,求第n个斐波那契数
[toc] 问题引入 - 什么是斐波那契数列? 斐波那契数列中,第n项为n-1和n-2项之和 1,1,2,3,5,8,13,21,34,55…… 这个数列非常经典,经常用于编程语言初学者的练习 接下来让我们用非递归和递归两种方式来实现这个数列 并了解两种方法的优缺点! 1.非递归方法(迭代) 什么是迭代? 迭代其实和循环的意义差不多(个人理解) 我们计算斐波那契数列的时候,需要从第一项和第二项1、1开始计算 没后一项数字都是前两项数字之和 这样我们就可以利用循环,从第一项开始不断相加,再使其中一个加数等于得到的和 以此迭代,就能得到我们需要的第n个数字 代码实现 12345678910111213141516171819202122232425262728293031#include<stdio.h>//非递归int fo1(int a){ int tmp = 0; int num1 = 1; int num2 =1; if (a < 3) //前两项都为1 { return 1; ...
【leetcode】001.两数之和(C语言,超详细)
这是初学C时候写的题解,可能有思维漏洞,后面重新刷题的时候会更改! PS:已重新更正并添加了C++的哈希解法 [toc] 1 题目来源 两数之和 leetcode-001 如下图所示 右侧给出了题目的基本模板 1234567/** * Note: The returned array must be malloced, assume caller calls free(). */int* twoSum(int* nums, int numsSize, int target, int* returnSize){} 2...
【C语言】如何判断素数
如何判断素数 题目要求:输出100-200的素数 首先我们要知道什么是素数(质数),以防有人忘记(比如刚学开始学c的我就忘记了) 素数(质数)只能被1和它自己整除 7只能被1和7整除,是素数 9能被3整除,不是素数 方法1—试除法 12345678910111213141516171819202122232425#include<stdio.h>int main(){ int i=0; int count=0; for(i=100;i<=200;i++) { int j=0; for(j=2;j<i;j++) { if(i%j==0)//i可以整除j,i不是素数 { break; } } if(j==i)//i只能整除它自己,是素数 { ...
【C语言】验证哥德巴赫猜想
问题来源 这是学校的一个作业,原题如下 题目先给出了哥德巴赫猜想的背景知识(我还真不知道) 2000以内的正偶数都能分解成两个质数(素数)之和 题目要求 下面来梳理一下题目的要求: 输出样式为a=b+c,使用%4d=%4d+%4d输出 每行输出4个,每行最后一个输出无空格 每个偶数只需要一个结果即可(后续较大的偶数有很多种解) 弄懂了题目要求,下面就来一步一步写代码 如何判断素数? 在上篇博客里面提到了如何判断素数==>【链接】,这里不再赘述 我们需要搞定的是判断是那两个素数b、c相加等于我们需要的那个数a 因为需要多次判断,这里我们使用自定义函数 12345678910111213141516int SuShu(int a){ if (a == 2) { return 1; } int j = 0; for(j = 2; j <=sqrt(a); j++) { if (a % j == 0) { return...
【C语言】printf函数的执行顺序,涉及函数传参
问题产生 偶然在c语言学习交流群看到了这么一串让人费解的代码 1234567891011#include <stdio.h>int main(){ int i = 0; int j = 0; scanf("%d", &i); j = -i++; printf("%d %d %d", i, j, i++); return 0;} 这里让我疑惑的是,为什么打印的第一个i是6而不是5? printf语句的执行顺序 这里要涉及到一个之前我并不清楚的知识点 123scanf("%d", &i);j = -i++;printf("%d %d %d", i, j, i++); 按照以往我的理解,代码的运行顺序是这样的 1.用scanf将数字赋值给i 2.将-i赋值给j,然后i++...
【C语言】简单的printf递归
简单的Print递归 说句题外话,很多时候单词我是认识的,但是如果它全大写了,我总要反应老一会才能想出来它的意思 有和我一样的人吗? 今天的c语言课讲到了一道非常经典的递归题目 代码如下: 12345678910111213141516#include <stdio.h>void Print(int n){ if (n > 9) Print(n / 10); printf("%d ", n % 10);}int main(){ int num = 0; scanf("%d", &num); Print(num); return 0;} 结果如下 运行顺序 谈到递归的时候,最重要的就是要弄明白它究竟是怎么运行的 老师上课讲的方法非常直观的表示了它的运算顺序 这里我用粘贴代码块的方式来展示 刚开始执行的是scanf输入,这里不再赘述 123456void Print(int n){ if (n >...
【VS】如何解决VS编译器scanf报错问题
问题来源 当我们使用vs编译器编译c语言代码,并需要用到一些非常常用的库函数的时候(如scanf) vs编译器通常会报出如下错误 有的时候即便报错了,程序也可以正常运行。但有的时候就会同图中一样,程序无法运行!这时候就头大了。 出现这个错误的原因是vs编译器认为这些库函数是“不安全的”(我可真谢谢你,担duo心guan那xian么shi多,微软) 解决方法 解决这个报错问题的方法有两种 1.使用_s函数 步骤 如图所示,我们可以在库函数后面加一个_s,这时候vs就会把它认为是“安全的函数”,程序就可以正常运行了。 12double m;scanf_s("%lf",&m); 如下图所示,代码编译运行成功。 这个方法本质上是调用了win下vs重写过后的scanf_s,因为是vs重写过后的,所以自然是安全的函数。 方法一的致命缺点 但是这么做有一个非常大的弊端:该代码只能在vs编译器里运行。 如图,如果我们将这一串带_s的代码复制到 dev-c++...
【C语言】二级指针
二级指针 什么是二级指针? 我们通常使用的int*p就是一个一级指针,而二级指针存放的变量就是一个一级指针 代码示例如下: 123456789int main(){ int a =10; int*pa= &a; //有两个*号 的原因 int ** ppa= &pa;//int*是代表变量pa的类型,*ppa表明这是一个指针变量 return 0;} 这里面pa是指针变量,一级指针 ppa是二级指针变量,&pa取出pa在内存中的起始地址 如图所示 小结 简单的说,指针变量也是变量,变量就有属于它的地址,而二级指针就是用来存放指针变量的地址的 希望这对你有帮助!