多项式加法c语言编程_零基础学习编程路线(个人向)

前言

对于编程,每个人有每个人不同的想法,有的人把它当作乐趣,有的人把它当作吃饭的工具,但无论你为了什么点进这里,都请不要想太多听我慢慢讲我认为的编程学习的路线。由于本人才疏学浅,而且情况因人而异,所以这之中必然会有一些比较主观的看法、错误的言论,各位不用当真,当作玩笑看看就罢了~

概述

本文的主体思路是从C语言入门开始学起,再补充少许数电内容,学懂之后转向单片机(硬件及汇编),然后逐渐趋向操作系统(Linux入门),再到Python应用的路线。这之中缺失了很多必要的环节,所以想按照本文学习最终入行需要三思而后行,最后我会大概描述一些缺失的内容及个人建议。

再次声明,本文不适用于所有人,其中不乏疏漏,仅供参考,一切后果与本人无关。

1.C语言入门

首先学C语言,这里说的C语言很简单,就是本科生课本级别的难度,所以推荐学习清华版之类的C语言课本,大概了解下,知道什么是int,char,数组...以及if、for、while这些就够了,后面所谓的指针、结构体、数据结构、算法...统统不用管,好的,恭喜你,你现在会写hello world了,而且可以做一些简单的运算和动作了,就比如一个在控制台显示的可以交互的界面;

31fd72907f82b6b3d336382d0c458319.gif
图片来自网络,侵权删除
附图博客地址 https:// blog.csdn.net/lw1357225 9173/article/details/85021444

2.数字电路

接下来,你需要补充一下知识,从硬件开始,数电和模电一大堆知识,但你只用知道1.电路是什么,电路为什么需要闭环,这些是物理常识级的东西,如果不知道的话,看下这个

[第二弹]电池能量和电力-20171222_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
0b8485671e958f6eec6dce4bbcbdeddd.png

和这个

[第三弹]电路_基础的电压和电流定律-20171224_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
783ee51330f76a98dba1bf2e9cbcaf67.png

现在你知道了电路的一些基本情况,接下来就要了解一下和单片机或者说所有计算机系统密切相关的一些东西:二极管和三极管;二极管是最基础的东西,这里我找了一些视频来说明:

二极管工作原理中文字幕版_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
a8706dc8711614354ce0a3567a29516e.png

也可以看一下妈咪叔的(主要看一下PN节相关的):

什么是半导体?N型P型有啥区别?太阳能电池原理(上)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com

好了,二极管,通过PN节单向导通,搞定,接下来是三极管:

晶体管的工作原理_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
70de5abe9fe09885d12d0e38522edb73.png

OK,三级管,能放大,能当作开关,然后利用二极管和三极管的特性,我们终于能回到正题了。那么,我们先来看这个几个东西:

逻辑门电路:与、或、非,这个大家应该有一定认识吧,这里找到一个很浅显易懂的说明,包括怎么用二极管和三极管来实现这些逻辑门

https://blog.csdn.net/Owen_Suen/article/details/97685704​blog.csdn.net

(转载自CSDN博客https://blog.csdn.net/Owen_Suen/article/details/97685704)

有了与或非我们就能进行下一个项目——锁存器:

https://www.bilibili.com/video/av48858585​www.bilibili.com
adcfd898204794acf5c44c44974767ba.png

锁存器就可以将我们想要的某个值以二进制(0/1)的方式存储在电路中,当然记录一个东西1个0/1可以不太够,我们可以用多个,比如8个0/1组合起来,这样就能储存一个字节(1B=8位)信息啦,但如何处理这些信息呢,加减乘除怎么做到的?不要急,先了解另外一个项目——移位器(视频5:00左右开始):

如何控制一个大LED矩阵以及移位寄存器如何工作!|| EB#39_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
eb5e2f3b1cf57462b239c8c480aa43c9.png

然后我们再看一下如果做加法呢:

4位加法器的原理及制作(中英字幕)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
44cdbb8b916643ec138f900336091d4e.png

有了寄存器,移位器,加法器,我们就能做出一个简单的计算电路

C15、ALU设计【自制8位计算机】_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
e1833de27a86fec2f6e1ffde20068e8a.png

能做与或非等逻辑计算,能做简单加减运算(可以理解乘法是一种加法的叠加,或者可以去看乘法器原理https://blog.csdn.net/weixin_41130842/article/details/89760884),能存储结果或者将结果从电路里输出出来,那可以说抛开其他的东西我们已经有了一块计算机,但是这还没有结束。

3.单片机原理

接下来需要了解一个简单的计算机(也就是单片机Single-Chip Microcomputer)或者说微控制器(MCU)——89C51.这也是大多数单片机原理课本的基础,如果想要深入了解,可以随便找一本本科级教科书即可。

d3f25691e51adfd6d721aa2173bec9f7.png
图片来自网络,侵权删除

4e93125f2a8fd780733dd423e47b4982.png
图片来自网络,侵权删除

(以上图片来自AT89C51单片机的基本结构和工作原理 - 百度文库)

大致可以理解为CPU上电之后,自主从程序存储器的目标位置取出第一条指令(二进制),并根据指令中的类型对操作数进行操作。以第2节最终的ALU为例,他可以进行2个8位二进制数的加运算或减运算,这里我们令加为00,减为01,操作数1为A寄存器内容,操作数2为B寄存器内容,A寄存器代号00,B寄存器代号01,假设我们想要这个ALU执行A+B,那么我们应该,写00 00 01,放在程序存储器内,CPU执行时,先读到了00,则会去取00(也就是A寄存器),再去取01(B寄存器),然后进行加法运算,最终结果按照越定存在某一位置(假设存回A寄存器),现在明白了吗,我们在CPU上执行的是一串010101...,CPU也只懂010101...。

然而,即使是简单如C51的微控制器都不止能做加减乘除这些运算,所以需要一个助记符比如把加法指令叫做ADD,减法指令叫做SUB,然后再把一直要用到的这几个寄存器分别叫做ACC(或者A)、B寄存器,那么上述指令就会变成ADD A,B;这个被称为汇编指令。

接下来需要进行一定的跨越,在跨越之前,你需要知道单片机到底能干多少事情:

bbbeb888c851a819824808343074f1dc.png
图片来自网络,侵权删除

(上图来源单片机89C51指令表_word文档在线阅读与下载_免费文档)

好啦,有了C51之后,我们可以循环,可以判断、可以输入输出,可以定时,那我们要做的第一件事情是什么呢?

手工制作8阶LED跑马灯~_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com

当然是跑!马!灯!啊!!

4.程序运行原理

那么我们编写的C语言究竟是如何运行的呢?要知道虽然C51可以通过编写汇编语言翻译成机器语言的形式执行相应的动作,但是也可以执行C语言的,那么又已知单片机只能读懂0101...那C语言是怎么执行的呢?

答案很简单,翻译呗...

C语言的每一个语法,条件、循环、子程序都可以用相应的汇编语言来实现,比如条件语句可以使用JZ(判断是否为0则跳转)、循环可以符合使用DEC(减一)和JZ、子程序可以ACALL(子程序跳转)。那么C程序就可以被翻译成一大块汇编程序,汇编程序再翻译成二进制指令,再将这些指令丢进程序存储器里即可被单片机识别运行。

那么问题又出现了,我们日常所用的电脑不也是一个计算机吗?那我平常操作他的时候也没有要手撸代码才能用呀,这个时候操作系统就出现啦(还带着他的GUI出现啦)

(严格来说操作系统不完全是为了解决交互问题而产生的,主要是为了解决系统资源管理问题,大概可以理解为因为一个几GHz的芯片被人拿来做跑马灯也是全速运行,被用来运行Windows系统也是全速运行,为了不浪费资源,所以需要操作系统来协调,而且不止协调任务,还有外设等)

(我能用几句话讲清那才就叫见鬼了,重申一遍,这里只是一个个人向的对编程学习的认识,如有疏漏,自行评论区补充,一切仅供参考)

5.操作系统原理

好了,操作系统出现了,关于操作系统,这是一个中间点,做嵌入式的、做开发的到这里基本就不往上做了,做算法的、做应用的,到这一层才刚刚开始。这里就需要看你对编程的需求了,如果你玩腻了裸机(可以理解是没有操作系统的单片机,比如上面那个↑),跑马灯玩腻了,自建GUI累死了,多任务做不出来了,那可以学一学简单的RTOS,操作系统会代替你管理代码的切换,为你提供GUI的接口,可靠性和稳定性终于得以保证,后面还感兴趣的话就继续向Linux发展;但如果你开始并不是玩底层的,你只是工作的平台是Linux之类的平台,而且可能需要榨干机器的性能,那你就要从系统内核开始了。

操作系统可以讲的东西很多,内核,驱动,线程,进程,多任务,这些都是基于你前序的学习以及后续的工作的这里我只能就我个人的看法对上述的两种人群进行一个大致的介绍:

  • 做底层开发的

系统如何分时复用,如何能够让一台机器“同一时间“内完成多个任务?中断?是的,就是中断,让系统做做A任务隔一段时间再跳到B任务,或者某种条件下让C任务开始运行,这些用中断怎么实现呢?当然,你可以写一个针对某特定情况的方案,但不能通适化使用。而RTOS就提供了这样一个环境,他提供了信号、时钟节拍、任务,你只要”注册“你的任务进去,安排好各个任务之间的触发等待同步关系即可,而且提供GUI接口,写好LCD驱动,设置好基本参数,就可以使用便利的图像界面组件,这里推荐两本书——《嵌入式实时操作系统μC/OS-II(第2版)》以及《ARM Cortex-M3权威指南》,一个介绍了基础的RTOS一个介绍了目前最常见的硬件平台STM32的芯片架构,便于理解。

  • 做上层应用的

恭喜你,你成功的看了一堆入门级而且和你的工作还不怎么相关的知识,你所需要知道的就是,你用的Linux或者Windows亦或Android和iOS就是在刚才所述的这一大堆知识的基础上运行的,如果你想要做的更好,了解一下下面的也无可厚非,但主要你需要了解的是你所使用的操作系统为你提供了哪些接口,比如Linux就需要了解他的内核,也就是为你提供这一切便利功能的基础,推荐看《linux内核设计与实现》,别觉得无聊,所有东西都是很无聊的,如果你觉得你就是用一个别人现成的库,或者已经开发好的软件的话。

结语

操作系统这一块我讲得很潦草,但是这里推荐一位B站的UP主,之前自己学习时从他那里获得了很多知识,包括Linux的基本操作,线程与进程,算法,Python知识,真的很全面,感兴趣的可以去他的个人空间看一下:

哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili​space.bilibili.com

这里最后还是大概说一下操作系统都干了什么事情吧:

首先,所有的程序并不是一开始就被导入到CPU里去执行的,而是被存储在某个确切的地方;

其次,开机的时候会有一个额外的芯片组帮助系统启动,他们会把操作系统需要的环境全部设置好,并且可以暂时性代替操作系统进行一些设置或者操作(比如BIOS),完成之后他们会让CPU从操作系统(可以看做一个程序)的起始位置开始取指令动作;

并且,操作系统是一直都在运行的,这个在运行的部分就称为操作系统的内核(个人理解),他包含了很多东西,比如文件系统(好奇你的U盘格式化的时候为啥让你选exFAT或者FAT32吗?)、内存管理系统(为什么内存占用率搞的时候会卡?)等等;

最后,操作系统不止你看到的图形界面,他包含了很多你看不到的东西,一个好的操作系统会提供非常好的管理能力,也能够提供高效的接口供你调用使用,使用这些接口比如多线程、文件系统可以大幅度提高你的工作效率。


本文所述所有内容均为本人个人观点,内容含有主观性,且有很多错误之处,如有问题请在评论区指正,仅供参考,后果自负

除此之外你需要知道的事情

上述的所有内容只是一个本人对编程学习的一些看法,而且比较简略,目的是让一个零基础的人尽快了解一些基础的知识,没有办法让人入行,真正想要入行,需要大量的时间和精力的投资,如果你看到了这里,那谢谢你对我的支持,下面是一些我个人认为上述内容中缺失的环节,以及一些学习资料推荐:

  1. C语言部分,这里缺少了对数据结构、算法的描述,C语言并不是简单的printf,为什么要include,为什么要从main开始,为什么需要链表、树这些数据结构。这些如果你在这个行业继续发展就必须知道,关于数据结构和一些C的基础知识可以看这本书《21天学通C语言》,这里介绍的已经很全面了。至于算法,想要玩的好,必须把指针这个神奇的东西学会,这里推荐《C和指针》,买一本绝对不亏,工作后也经常翻一番,动手可以刷LeetCode - The World's Leading Online Programming Learning Platfor,没事干刷刷题,大家都是从菜鸡开始的,开始不会写可以先看看别人的写法,写完就有自己的认识了。
  2. 电路部分,很显然,数电只是沧海一粟,模电R、L、C都够挂掉多少本科生了,而且这里只讲了逻辑门电路、寄存器、移位器、加法器,还有触发器、乘法器一大堆没讲,用一块芯片或者一个IC,第一件事情看懂他的电路图,这需要数电模电知识,这些可以在网上找一下慕课学习一下;
  3. 单片机部分,书本是没有办法让你学到所有东西的,最好是买一块开发板,上面集成了所有例程需要的,数码管、LCD、按键、红外线...,起步就买一个C51的不贵,刷刷例程,自己改编下,为后面自己做项目打下基础;
  4. 程序运行原理及操作系统部分,这部分需要Linux开发板或者树莓派亦或STM32开发板之类的硬件,配合教程,了解编译原理,如果你是在linux环境下开发,程序究竟是如何运行的、系统是怎样启动的,一些将一幕了然。

如果你只是想玩玩的话,看一遍前面5点就够了,如果想真正做好的话,这篇文章也绝对不够,你需要大量的基础知识积累、海量的操作经验学习以及真正的工程项目才能最终成功。本人学疏才浅,没有办法给出很合理的培养路线,只是写了这段“心得”仅供参考,祝君未来一帆风顺~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值