寒假回归篇——C语言学习感悟2022.1.16

前言

Everybody!欢迎来到一飞的博客!没错,历经将近三个礼拜的间隔,我又回来啦!前端时间由于在学校里学习和生活上的各种事情,停更了不短的时间,现在,我回来啦!

不在的时间里,我也关注着我的CSDN,没想到反倒是不更的这段时间,关注数涨了一倍!令我意外!

废话不多说,依然是像往常一样!用最朴实的语言为大家分享我在编程路上学习的一点一滴和心得感受!

年前的学习安排

转眼已经腊月中旬啦!我为自己安排了大概一个多礼拜的学习时间,这段时间里我会开始集中地较为深入地学习C语言的每一个知识点,并加以大量的练习题!俗话说,光说不练假把式。练习题必不可少!

当然,像以前一样,为了让我写的东西更加接地气,我尽量不会放出大段大段知识点的代码段,这些东西不是我在博客里想表达的,我仍会加入自己的思考过程,向大家展示出我学习中最真实的一面

另外,由于在学习C语言的同时我还要提前预习高数和计算机等课程,所以这段时间里博客更新地肯定不会很频繁了,我估计大概2~3天会出一篇!当然,量不是最重要的!最重要的是坚守我写博客的初心,也就是用心记录我的成长

旧知识的回顾

之前学习C语言的两个星期里,对一些细节的感受和印象颇深,再次敲起代码,仍会对这些感到亲切。

一串快遗忘的代码

我记得我之前在博客里写过不少次关于VS里scanf的使用,就是说由于VS对C语言一些语法的支持性问题,若想要正常使用它,需要在源文件开头加上以下代码

#define _CRT_SECURE_NO_WARNINGS 1

仅仅两个多礼拜不上手,我就没办法敲全这串代码了。毕竟初学,虽然印象深,但是没有记死,我还记得我为了练熟练度,没有按网上教程设置初始源文件格式。也许哪一天我真的烦了,会去做这件事吧哈哈哈。

过了一次的老知识

虽说我之前浏览过一次C语言的大概内容,但是由于太浅,很多已经遗忘了,不过好在大部分最基础的我都记住了,这基本上就够了吧。

现在再让我说说看过什么,我只能更加浅薄模糊地谈一谈,脑子里飘过的关键词甚至也不太多了。例如静态变量、局部变量、全局变量、指针、整型、浮点数、函数、宏定义、for循环、while循环、数组......总之,记得的东西不能说很多了。不过保留的习惯还是蛮多,例如main函数的使用习惯,return 0 的输入等等。

循环的学习

准确来说分支和循环语句,但主要是循环。其实昨天就开始学了,但是昨天做完题玩了一晚上,没精力写了......

这个循环,我真的是一言难尽。没学的时候,我觉得这个东西神秘莫测,难的不行;学完知识点,我觉得循环好简单哇!然而,一做题我人快傻了,找了些循环的题,结果这才意识到这是多么恐怖的东西。

循环学习的难度不在于循环本身,而是如何将它运用到你实际的操作中。也就是说,没有哪道题是很简简单单让你仅仅用for重复打印个东西!而是你需要看出问题背后的算法,这其中需要用到的循环的框架。而且,对于我这个初学者来说,框架里的算法和我没见过的新东西才是对于挑战最大的地方!接下来分享一下我做的一些题吧。有的还行,有的简直丧心病狂。

1.给输入的三个数排列大小

这个问题其实我以前在学python的时候就已经见识过了。当时老师给我们留上机作业,在十个问题里挑出2三个做,这个大小排列当时以为很简单,就试了试,结果想不出什么好的算法,只会用枚举......

当然,这个问题我当时没有深入研究,所以昨天我做的时候,依然是没有什么头绪,自己琢磨了半个多小时!依然是想不出什么好的算法!我最后“认输”看了答案,答案的解法我确实根本想不到,它的思路是利用两两比较和交换赋值,将a、b、c依次从大到小赋值,也就是说最后处理完的a、b、c就是从大到小排列,只需按顺序打印输出即可。稍微贴一下:

#include <stdio.h>
int main()
{
    int a = 2;
    int b = 3;
    int c = 1;
    scanf("%d%d%d",&a, &b,&c);
    if(a<b)
    {
        int tmp = a;
        a = b;
        b = tmp;
    }
    if(a<c)
    {
        int tmp = a;
        a = c;
        c = tmp;
    }
    if(b<c)
    {
        int tmp = b;
        b = c;
        c = tmp;
    }
    printf("a=%d b=%d c=%d\n", a, b, c);
    return 0;
}

这与我的思路差远了!我也进一步从这里明白了机器算法和人脑算法的区别之大!我的第一想法是先利用我以前写过的求最大值的题目里的算法,求出三个值里的最大值,然后再求剩余两个值里的较大值,最后这三个数的大小关系就明了了!然后当我开始写我就傻了:求出最大值之后,我怎么样才能之后剩下的是哪两个数呢?我思考了良久,最后肯定,我没办法啊啊啊啊~~~我中间还尝试过用if进行分类,不过实在是太麻烦了,甚至要分出三大类六小类!不大的问题,用这么多代码显然是冗余用费事!                        

我反复剖析答案,终于体会到了它的精妙之处,它与我的思考是一致的,但是实施办法是反的:既然我求最大值完了不好确定是哪个变量,那么干脆变量不动,直接通过两两比较交换的办法把最大值给a,次大值给b,最小值给c!然后顺次打印即可!这思路确实很妙,还用到了中间变量,非常值得我思考!

2.求两个数的最大公约数

这题算法很有意思。昨天我看到题的时候,想了几分钟,没有很明确的思路,但是不一会儿后,我脑子里突然蹦出来一个想法,就是盯住了“最大”两个字,既然是最大的公约数,那我可以尝试着用较大的去模较小的数,直到结果为零时,说明我找到了最大公约数!想到这,我欣喜若狂,赶紧动手去操办!结果如下:

#include <stdio.h>

int main()
{
	int a, b, x, i;
	scanf("%d %d", &a, &b);
	if (a <= b)
	{
		x = b;
		b = a;
		a = x;
	}
	for (i = b; i > 0; i--)
	{
		if (a % i == 0 && b % i == 0)
		{
			printf("%d", i);
			break;
		}
	}
	return 0;
}

没错,就是这串代码,我运行了一次,毫无问题,高兴极了!但是我又看了看答案,甚是懵逼

#include <stdio.h>
int main()
{
	int a = 18;
	int b = 24;
	int c = 0;
 
	while(c=a%b)
	{
		a = b;
		b = c;
	}
 
	printf("%d\n", b);
	return 0;
}

一上眼我根本看不懂啊?!但是我又静下来分析:先不管abc的值,先看while括号里的条件:注意,c后面不是双等号,也就是说这不是一个判断,而是赋值!也就是说,当c等于a%b等于0时,才会跳出循环,并且输出b。第一次循环过后,我发现a和b交换了值!也是就是说a%b变成了大模小!这和我算法里第一步用if语句里的中间变量调大小位置是一致的!只是他这个我怎么也是想不到的......后面我不想分析了,原理我暂时搞不清,等我搞清再来弄它!

3.猜随机数游戏

最后来个大的。实际上这和上面那两道题都不是同一个级别的,这个涉及到整个程序的设计,而上面是仅算法。我在这里不谈具体的算法问题,只说一下我在学着写这个程序时所遇到的一些印象深刻的问题。

首先是生成随机数。这是这个游戏最为核心的东西,要不怎么叫猜随机数呢?我之前在python里做过类似的程序,很简单,直接调用一个函数即可;但是C语言里用随机数的复杂程度要远远大于python;不但要好几个函数套着用,而且规则还很多,引入一堆概念,对于我这个新生很不友好。但是我还是硬着头皮看了两遍,终于完全看懂了每一个函数的用法。

我想,总得有一个接受的过程吧?并不是说随着我编程时间的变长,我会的就会越来越多,而是我学的越来越多,我会的才会越来越多!

别的东西的话,就是一个界面设计和游戏循环机制了,不是特别复杂,中间还涉及到了switch的使用,我就不展开讲了。东西太多,放段代码,有兴趣的看一下吧。我还弄了个英文版哈哈哈~

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
void menu()
{
	printf("*******************\n");
	printf("*******1.Play******\n");
	printf("*******0.Exit******\n");
	printf("*******************\n");
}
void game()
{
	int ret = rand();
	printf("Welcome to guessing game!Enter your answer!\n");
	int ans;
	while (1)
	{
		scanf("%d", &ans);
		if (ans > ret)
		{
			printf("More smaller!\n");
		}
		else if (ans < ret)
		{
			printf("More bigger!\n");
		}
		else
		{
			printf("Congratulations!");
			break;
		}
	}
	
}
int main()
{
	int choice;
	srand((unsigned int)time(NULL));

	do
	{
		menu();
		printf("Please choose your decision:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			game();
			break;
		case 0:
			printf("Exit!");
			break;
		default:
			printf("Please choose again!\n");
			break;
		}
	} while (choice);
	return 0;
}

写在最后

今天就写到这里吧。总的来说,回归学习以后,由于放假的缘故嘛,所以我投入的格外多,两天以内就迅速恢复到了以前的状态,甚至还超越了之前,这是我没有预料到的,我以为我得调整几天,实际上并没有哈哈哈~

随着学习的深入展开,我做的题目也比之前深不少了,我知道,难度肯定有,毕竟我还是要进步的嘛,一点点来,我相信我一定能成为一名大佬的!

就这样吧,感谢您能看到这里!欢迎继续见证我的C语言学习之路!欢迎回顾之前的内容!

在学习中思考——C语言学习总结小记2021.12.19

C语言学习心得感悟2021.12.14

周末C语言基础学习小结

第一篇博客——梦开始的地方

おすすめ

転載: blog.csdn.net/m0_62943985/article/details/122526792