给学C语言的同学的一点建议
发表于:2022-11-12 | 分类: C语言佛系教程

给初学C语言的同学的一些Tips

我在学习编程的时候,我的老师曾跟我说的一些建议,现在我把它们分享给你们。其中有我自己对编程的理解。

切忌死记硬背

1.不要去死记硬背代码。很多同学会陷入背诵代码的误区,尝试去背诵一些代码,而我很不赞成这种做法。正确的做法是多练习,做好电子笔记!切记,一定要电子笔记,方便搜索,快速找到知识点。当你平时在使用C语言的时候如果忘记了某些东西你就去翻看笔记,然后回忆起相关的知识点。

秀出自己的个性

2.形成自己的代码风格。C语言是很灵活的,光是main函数就有很多种写法,因此各位同学们一定要找到适合自己的代码风格,比如我习惯于这么写:

for(int i=0;i<=20;i++){
    printf("I love C!");
}

我总是把花括号的左半边写在前一行。并且我不喜欢省略它。

多多演练

3.多使用调试工具。调试(Debugger)是一种很好的发现错误的方法。一般来说,编译失败的时候,编译器只会检查你的语法错误(syntax Error),因此这就是为什么你的代码明明编译成功却无法输出,那是因为你的程序有运行时错误(Runtime Error)。一般这种错误特别隐晦,你很难发现。比如这个例子:

#include<stdio.h>
int main()
{
	int  a, b, c, d, e,n;
	scanf_s("%d", &n);
	while (scanf_s("%d%d", &a, &b) != EOF)
	{
		if (a > b)
		{
			e = a * b;                    //利用a和b的最大公约数乘以最小公倍数等于a*b,先利用辗转相除法计算a,b的最大公约数,由此间接求出a,b的最小公倍数
			do
			{
				c = a % b;
				a = b;
				b = c;
			} while (c != 0);
			d = e / b;
			printf("%d\n", d);
		}
		else
		{
			e = a * b;
			do
			{
				c = b % a;
				b = a;
				a = c;
			} while (c != 0);
			d = e / a;
			printf("%d\n", d);
		}
	}
	return 0;
}

上文中这是求最小公倍数的代码,乍一看没啥问题,编译也没有任何问题,但是运行却出错误了,原因是这一句:

d = e / a;

当输入2 4的时候,a刚好取到0,而0是不能作除数的。因此会出现错误。

而如果你会debugger,你可以在main函数中打一个断点(STOP),然后单步执行(step in),这时候想Visual Studio 2022这些集成开发环境(IDE),就能很友善地提醒你:“嘿伙计,这里错了哈!”。比如下图:

把代码拆成零件

4.尽量让自己代码模块化。模块化能让自己的代码变得更加有逻辑,如果出错排查也会更加容易。C语言的模块化是用函数来实现的。还是拿上面的代码进行举例。

#include<stdio.h>
int main()
{
	int  a, b, c, d, e,n;
	scanf_s("%d", &n);
	while (scanf_s("%d%d", &a, &b) != EOF)
	{
		if (a > b)
		{
			e = a * b;                    //利用a和b的最大公约数乘以最小公倍数等于a*b,先利用辗转相除法计算a,b的最大公约数,由此间接求出a,b的最小公倍数
			do
			{
				c = a % b;
				a = b;
				b = c;
			} while (c != 0);
			d = e / b;
			printf("%d\n", d);
		}
		else
		{
			e = a * b;
			do
			{
				c = b % a;
				b = a;
				a = c;
			} while (c != 0);
			d = e / a;
			printf("%d\n", d);
		}
	}
	return 0;
}

上面的代码是用来求最小公倍数的,使用的方法是辗转相除法,显然代码有些小问题。

1.代码虽然对a b的大小进行分类,但是都写在main函数中,显得代码非常冗长,可读性差,不美观。

2.两种情况下,对变量进行处理的时候,如果出错,那么需要同时修改个地方,易造成Bug。

3.定义了很多变量,而且没有给变量进行标记和恰当的命名,容易导致混乱。

那么这种情况就需要用”模块化”的思想来实现。

这边建议的做法是使用函数(Change)来判断大小并且叫交换变量的值。随后交给函数(Calc)进行求最小公倍数。这时候在main函数中只需要调用这两个函数就行了。修改后的代码如下:

#include<stdio.h>
void Change(int* x, int* y) {//用指针,确保能完全交换
	int tmp;		//tmp用于暂存x变量的值
	if (*x < *y) {//如果x比y大,那么就进行交换
		tmp = *x;
		*x = *y;
		*y = tmp;
	}
}

int Calc(int a,int b) {
	int res;
	int tmp;
	int x = a; int y = b;
	 do //余数不为0,继续相除,直到余数为0
	{ tmp = a % b; 
	 a = b;  
	 b = tmp;
	 } while (tmp != 0);
	res = x * y / a;
	return res;//返回计算结果
}

void main() {//main函数也可用void来定义哦!
	int n;//用来存要输入的组数
	int a, b;//用来存要求的变量
	int result;//用来存结果
	printf("请你输入要输入的组数:\n");
	scanf("%d", &n);
	while (scanf("%d%d", &a, &b) != EOF) {
		Change(&a, &b);
		result = Calc(a, b);
		printf("结果是: %d\n", result);
	}
}

我们发现更改后的代码会精简不少,使用的变量名字也进行了命名。并且使用模块化函数对其进行处理,让其更加易读。如果某个模块出现了错误,我们只需要更改这个模块就行了。

代码的运行结果如下:

OK,那么这就是本次博客的全部内容咯!如果喜欢记得给我留言点赞哦!

上一篇:
自己编译安装openwrt系统
下一篇:
ctf题目讲解--001