C语言入门电子书免费领,小学生也能看懂
嘿各位我乃是良许是一位在那嵌入式这个范畴里头深深钻研了足足 12 年之久的资深工程师还是先前于世界 500 强企业任职过的高级工程师。我耗用了3个月时长撰写出一部C语言电子书运用极为通俗的言语给众人阐释C语言将繁杂的技术讲解得就连小学生都能够听得明白绝非是AI生成的那般晦涩难懂的电子废物。点击此处免费领取 C 语言电子书C 语言电子书目录如下1.2.1 编程语言是什么语言的本质沟通的桥梁于我们平常的生活里头语言身为人们相互沟通的工具。中文、英文、法文等自然语言使得我们得以表达思维、传递讯息、交流情感。同样的编程语言是人与计算机之间沟通的工具。恰似我们用中文告知朋友“帮我买一杯咖啡”那般我们用编程语言跟计算机讲“帮我计算1加1等于多 少”。与之不同的是计算机和人存在差异。人类的大脑具备极高的智能哪怕我们在言语方面不够精准或者表达存在歧义朋友依旧能够领会我们的意图。举例来说当你说出“买个东西”时朋友会依据上下文以及你的表情推测出你想要购买的物品。然而计算机却是个“死脑筋”它仅仅能够依照极为精确、清晰明确的指令展开工作。你必须向它详尽告知每一个步骤具体该如何操作绝不能有任何模棱两可之处。编程语言的发展层次如果我们把编程语言按照抽象程度来分类可以分为三个层次按照执行方式分类编译型语言与解释型语言将编程语言按照执行方式划分居然有两大类这跟看书存在两种方式的情况是一样的是这样的事情啦是这样的状况哟对于编译型语言而言其所说的好处在于运行速度是很快的这是源于计 算机能够直接去执行机器语言并不具有中间存在的翻译过程。然而呢它存在的缺点是每当把程序修改之后 都必需得重新进行编译并且编译完成后的程序仅仅能够在特定的操作系统上去运行要是移植到别的系统 那就又需要重新地编译了。编写方便调试便利是啥好处且修改过后能马上运行还能在任何装有解释器的系统之上运行这是解释型语言的优势。但缺点是运行速度相对迟缓为啥呢因为需要一边作翻译另一侧同时去执行并且运行之际得安装对应的解释器。按照编程方式分类面向过程与面向对象编程语言还可以按照编程思想分为不同类型朝着过程方向的思维模式相对较为直观适宜用于处理流程较为明晰的问题像计算器程序这样输入数据接着开展运算随后输出结果这是一种清晰的流程。对于我们开展嵌入式开发的学习而言面向过程的思维方式更贴近硬件的工作模式且也更易于理解程序的执行进程。构建复杂的大型软件系统面向对象的思维方式更适合因它能将代码更好地去组织和管理使得程序更易于维护以及扩展。1.2.2 什么是程序程序的本质指令的序列程序简而言之乃是一系列指令所构成的有序集合其作用是告知计算机具体要做何事以及如何去做此等事项。这恰似一本菜谱它会详尽地向厨师讲述每一个流程步骤先是将菜清洗干净接着把菜切割成合适形状然后使锅具烧热随后往锅中倒入食用油最终进行烹饪炒菜操作。程序如同这般它伴随着一个个步骤向计算机传达指令首先读取相关数据随后开展基于这等数据的算数运算接着对运算得出的结果予以评判断定最终将经过判别后的答案予以输出展示。我们借助一个生活当中的实例去领会程序假定身为你要教导从来没有任何做饭经验的女朋友烹制蛋炒饭你得给出极为详尽的步骤将冰箱门敞开选取2个鸡蛋拿出寻觅一个碗把鸡蛋磕开让蛋液散开把锅烧热往里面倾倒下适量的油接着飞快将蛋液倒入锅中迅速搅拌待鸡蛋呈现半熟状态之时将米饭倒入锅中进行翻炒持续翻炒3分钟再加入适量的盐以及酱油不停地继续翻炒1分钟后将火关闭把翻炒好的食物盛到盘子里。进行烹饪美食的这个过程它其实就是一种被称作“程序”的存在之中的每一个步骤都宛如一条“指令”。这个所谓的程序必需得达到足够详尽且精准无误的程度绝对不能够出现有任何遗漏或者模糊不清的状况不然的话那执行者不管是女朋友还是计算机就会陷入不知道该怎么去做的困境。从程序到进程程序的运行状态众多同学极易将“程序”以及“进程”这两个概念混淆我要用一个简洁的比喻来进行解释。与之相同的情况是当我们双次点击一个程序图标之时操作系统便会构建出一个进程用以运行这个程序。进程涵盖了程序的代码进程包含了程序运行所需要的内存空间进程涉及了CPU的执行状态等内容。任务与多任务于现代计算机里头我们时常听闻“任务”此词汇存在于这里头的任务Task实际上乃是进程又一种表述方式尤其是在嵌入式系统情形下我们更倾向拿“任务”这个词来使用。事实上计算机的CPU于任意一个时刻仅仅能够执行一条指令不过它执行的速度极为迅速能够在不同的任务之间进行快速的切换比如说它有可能花费0.01秒去处理音乐播放器接着花费0.01秒去处理浏览器随后再花费0.01秒去处理文字处理软件由于切换的速度非常快所以用户感觉仿佛是多个程序在同一时间运行。程序的不同类型根据功能和用途的不同程序可以分为很多类型1.2.3 程序与算法的关系经典公式程序 数据结构 算法在计算机科学这个领域当中呢存在着这样一个极其出名的公式程序等于数据结构加上算法这个公式是由瑞士的计算机科学家尼古拉斯·沃思也就是 Niklaus Wirth 所提出的它精准地归纳了程序的本质所在。用一个生活当中的例子来对这个公式加以理解想象一下你需要去组织一场同学聚会。不知道要联系谁因为没有通讯录数据结构不知道怎么办聚会由于没有组织方法算法成功组织一次聚会完成程序的功能仅当把两者结合起来才行。什么是数据结构数据结构所涉及的定义为数据结构乃是针对数据元素相互之间的关系而言并且还涵盖对这些数据予以操作的方式简而言之其核心要点在于聚焦数据究竟是以何种形式进行存放以及是以怎样的样式加以组织的相关问题。让我们用几个生活中的例子来理解不同的数据结构比如说要是你打算存储一个班级里全部学生的成绩那可以采用数组来进行存储像成绩等于85 成绩等于92 成绩等于78等等。数组所具备的特点是查找处于某个位置的数据速度较快这就如同能够直接依据编号找到柜子一样然而要是想要在数据中间进行插入或者删除相应数据的操作那就相对来讲比较麻烦了这是因为需要移动后面面所有的数据。链表具备这样的特性插入数据是很便利的删除数据同样是很便利的其便利之处在于只需要对指针的指向做出改变然而查找某一个特定的数据之时却需要从起始点开始逐个地进行查找这情形就如同想要吃到糖葫芦中间的某一颗糖那就必须从第一颗糖开始计数一样。栈于程序里具备诸多用途像是用以保存函数调用的相关信息。程序调用某个函数的时候将当前所处状态“压入”至栈中函数执行完毕之际再由栈里“弹出”先前的状态。常常被用于处理那些需要排队等候的任务的队列其中包括像打印机的打印任务还有操作系统的任务调度等等。能表示有层次关系数据的是非常适合的树结构诸如文件系统文件夹包容着要装入子文件夹当中的文件还有组织架构图这般的情况。什么是算法算法有着这样的定义算法是用于解决特定问题体现出的一系列明显、有限的步骤它所回答的是“怎么做”这样的问题。我们所讲的算法更侧重于“逻辑算法”而非“数学型算法”像PID 算法、滤波算法数学型算法一般而言对于算法工程师来说通常是需要硕士、博士以上学历的。让我们通过几个具体的例子来理解算法搜索算法 - 于电话簿里寻人假定你需在一本依照姓名排序好了的电话簿当中找到名为“张三”的电话号码你或许会采用以下几种办法按顺序查找起始于第一页逐页不停翻直至得以寻获张三为止。此方式较为简易不过有可能会相当之慢。运用二分查找鉴于电话簿乃是依字母顺序予以排列的故而能够翻至中间的那一页查看究竟是在“张”之前还是之后接着持续于相应的那一半范围内展开查找。如此一来每次都能够将一半的页面排除掉查找的速度会快颇多地。数据结构与算法如何结合成程序我们在对于数据结构以及算法的概念有了理解以后接着来瞧一瞧它们究竟是怎样结合从而形成一个完整的程序的。以学生成绩管理系统为例第一步要确定数据结构首先呢我们得去决定怎样存储学生的信息每个学生可是有着姓名、学号以及各科成绩等信息的而我们能够去设计出这样的数据结构struct Student { char name[50]; // 姓名 int id; // 学号 float scores[5]; // 五科成绩 float average; // 平均分 };然后我们需要存储所有学生的信息可以用数组struct Student students[100]; // 最多100个学生 int student_count 0; // 当前学生数量第二步设计算法 接下来我们需要设计各种操作的算法添加学生算法查找学生算法计算平均分算法第三个步骤将其组合成为程序最终我们把数据结构以及算法组合到一块从而形成完整的程序。#include // 数据结构定义 struct Student { char name[50]; int id; float scores[5]; float average; }; struct Student students[100]; int student_count 0; // 算法实现 float calculate_average(float scores[]) { float sum 0; for(int i 0; i 5; i) { sum scores[i]; } return sum / 5; } void add_student() { if(student_count 100) { printf(学生数量已满\n); return; } // 输入学生信息 printf(请输入学生姓名); scanf(%s, students[student_count].name); printf(请输入学号); scanf(%d, students[student_count].id); printf(请输入5科成绩); for(int i 0; i 5; i) { scanf(%f, students[student_count].scores[i]); } // 计算平均分 students[student_count].average calculate_average(students[student_count].scores); student_count; printf(学生信息添加成功\n); } // 主程序 int main() { int choice; while(1) { printf(1. 添加学生\n2. 查找学生\n3. 退出\n); printf(请选择); scanf(%d, choice); switch(choice) { case 1: add_student(); break; case 2: // 查找学生的代码... break; case 3: return 0; } } }通过这个例子我们可以清楚地看到1.2.4 如何从零生产一个程序程序诞生的完整过程众多刚开始接触的人觉得编程乃是坐在计算机前击打代码然而事实上从全然没有基础去打造一个程序仿若建造一幢房屋那般要历经设计施工装修验收等好些阶段。编程仅仅是其中的一个步骤让我们来详尽知晓程序形成的整个历程。1. 第一阶段是编程也就是Programming要去用代码把解决方案描述出来。所谓编程究竟是什么编程其实就是运用计算机能够理解的那种语言去描绘求解问题的办法。这情形就如同借助中文去撰写作文那般打个比方你内心存有想法然而却得依靠文字将想法表述出来。编程亦是如此这般你晓得该如何解决问题可是却得借助编程语言把解决问题的办法“撰述”出来。编程的具体过程咱们借助着一个简易的事例去实现对编程过程上的理解假定我们打算去编写出一个程序这个程序是用来计算圆的面积的。步骤1分析问题步骤2设计解决方案步骤3编写代码#include int main() { float radius, area; const float PI 3.14159; // 提示用户输入 printf(请输入圆的半径); // 读取用户输入 scanf(%f, radius); // 计算面积 area PI * radius * radius; // 输出结果 printf(圆的面积是%.2f\n, area); return 0; }2. 第二阶段是编译也就是Compilation要把其翻译成计算机语言。怎么样的缘由致使需要进行编译呢。我们所撰写的C语言代码好似是以中文去撰写构成的说明书然而计算机仅仅能够理解机器语言也就是由0和1所组成的代码。编译实际上就是将用中文撰写的说明书转变成为计算机能够理解的那种类似“外星语”的代码的过程。编译的详细过程这编译的过程实际上是涵盖了好几个的步骤呢犹如同翻译那一本书的时候是得历经初稿要经过校对还需进行润色等好些个环节的呀这是编译的第一步预处理器会处理所有以#开头的指令。比如就像写作文前先准备好所有需要的资料和素材。将经过预处理的C语言代码由编译器翻译成汇编语言汇编语言相较于机器语言理解起来要容易些许然而哪怕如此其依旧与硬件极为接近这恰似现把中文先行翻译成英文用以给进一步的翻译工作做好准备。汇编器将汇编语言予以翻译使之切换成机器语言。由此生成目标文件也就是.obj或.o文件。这恰似把英文转变成计算机能够领会的“外星语”没错。具有组合功能的链接器会将多个目标文件以及系统库文件组合成为一个完整的、可用于执行的文件。这种行为很类似先把各个已经翻译好的章节进行装订操作最终形成一本完整的书籍。编译工具的使用在实际进行开发期间我们一般会运用集成开发环境也就是IDE以此使得编译过程得以简化。当你运用GCC编译器时编译进程也许会呈现如此这般的状况这便是命令行编译。gcc -o circle_area circle_area.c这条命令告知GCC编译器要将circle_area.c编译使其成为名为circle_area的可执行文件。要是你运用像Dev-C、Code::Blocks这类开发环境在IDE编译时一般来讲只需按下F9键或者去点击那“编译并运行”按钮接下来IDE就会自行完成全部的编译过程。编译过程中可能遇到的问题这样的情况如同在撰写作文期间出现的错别字或者语法方面的错误举例来说像是遗漏了分号又或者括号出现不匹配等状况编译器能够告知你错误所处的位置你得进行修改之后再度编译。这一般是源于没能寻得特定函数的定义或者欠缺必备的库文件恰似著书之际引用了某份资料然而于参考文献里寻觅不到该资料。提醒你代码中可能是存在问题的警告不会阻止编译就如同老师批改作文时候呢那建议虽不属错误但最好去改正。3. 第三阶段执行Execution- 程序开始工作可执行文件在编译完成后就静静地放在硬盘上那什么是程序执行呢程序执行就是要让这个处于“沉睡”状态的程序“苏醒”然后开始进行工作。执行过程的详细步骤当做可执行文件被你双击之际操作系统会将程序自硬盘加载至内存里这恰似把一本书从书架之上取下来而后打开以作准备阅读。操作系统会为程序分配内存空间包括代码段它是用来存储程序的指令数据的数据段其作用是存储全局变量以及静态变量堆呢在程序里用于动态分配内存栈则是专门用于存储局部变量以及函数调用信息的有关于这些的代码段。系统会为程序造一个进程给它一个进程IDPID并于进程表中记相关信息。这跟给每个正做菜的厨师分一个工作台及工具没啥两样。CPU开始执行程序的指令。对于我们的圆面积计算程序起初进行printf(请输入圆的半径);的操作于屏幕之上呈现提示信息接着开展scanf(%f, radius);的动作等候用户予以输入在用户输入数据之后开展area PI * radius * radius;的运算最终实施printf(圆的面积是%.2f\n, area);来展示结果。4. 调试Debugging- 发现和修复错误很少有程序能够在首次运行时做到毫无瑕疵地正常执一般而言都得历经调试这个环节借此去探查并修正其中存在的差错
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2514997.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!