伊吖学C笔记(2、文件、启动、数学基础)
C语言编程基础(文件、启动、数学基础)
一、文件是电脑软件管理的基本单元
1.定义。
文件是存储在计算机存储设备(如硬盘、U盘、SSD等)中的数据集合。
2.本质。
电脑(计算机)只认识二进制,所呈现的花花世界(文字、图片、声音、动画、程序、游戏等)均以二进制存储与处理。为便于操作和管理,对于特定功能的二进制块(或一段数据),我们把它打成一个包,并且取个名字,这个名字就是文件名。这个文件名所包含的内容就是一段二进制数据,这段二进制数据可能表示的是一篇文稿,一张图片,一节视频,一个可运行的程序(有序的指令集合),一个复杂一点的数据包(库),等等。
举个例子,在桌面上点击鼠标右键,新建一个文本文件,取名为1.txt,双击打开输入a,然后关闭保存,如下:
单击文件》右键》属性:
可以看到,我们建立了一个大小为1字节(Byte)的文件。因为在ASCII 标准下,小写字母 a 的二进制为 01100001(十进制 97,十六进制 0x61),文件内容为8个二进制“01100001”。为了加深理解,换行增加字符b:
结果文件长度变成了4字节。不应该是2字节吗?算上换行符不应该3字节吗?
在 txt 文件中,Windows 系统使用 \r\n(回车+换行),占 2 字节(Linux/macOS占1字节),虽然在文中看不出来,但实际是存在的。在ASCII码表中,\r回车排在13号,二进制为00001101,\n换行排在10号,二进制为00001010,b的二进制为01100010。整个文件的内容实为“a\r\nb”,二进制为“01100001000011010000101001100010”,即文件实质储存的为上面32个二进制,4字节。C语言源程序代码文件.c与.txt类同。
文件的内容实为二进制数据集合。
文件名本质上是二进制数据集合的标识符。硬盘对文件名的管理类似书的目录,比如NTFS(New Technology File System),首先将硬盘均匀分成若干个小块(扇区512字节),再将8个小块定义为一个存储单元(簇4K字节),紧接着从0开始分别为:①引导扇区(VBR,位于卷的第一个扇区512字节),包含启动代码和卷的基本信息(如簇大小、MFT位置等),相当于书的前言;②主文件表(MFT)区域(紧接引导扇区之后,记录了所有文件和目录的元数据,相当于书的目录;③用户数据区域:存储普通文件和目录的实际数据,相当于书的正文。
可以看出,哪怕只有4字节的文件,也占4K空间。
3.类型。
为了更直观的区分文件属于哪个类型,我们给文件名后面加个扩展名,中间用半角“.”连起来,这样就形成了“文件名.扩展名”完整形式。常见的扩展名有:
.txt:纯文本文件。
.doc/.docx:Microsoft Word文档。
.xls/.xlsx:表格文件
.jpg/.png:图片文件
.mp3:音频文件。
.mp4/.mpg:视频文件
.exe:可执行程序文件
.zip/.rar:压缩文件
.c : C语言源程序文件
.py :Python语言源程序文件
.......
不同类型的文件都有属于自己独特的存储数据的格式。
比如:JPEG文件由多个标记段(Marker Segments)和压缩数据组成,简单理解为:
FFD8+多个标记+数据+FFD9,文件头FFD8尾FFD9固定。
我们用C-Free打开一个文件111.jpg,可以看到:
PNG文件由文件头签名和一系列数据块(Chunks)组成,遵循严格顺序: [文件头签名] → [关键数据块] → [辅助数据块] → [结束块]
文件头签名:固定8字节,标识PNG文件(0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A)
MP4文件采用盒子(Box)嵌套结构,每个盒子(又称原子,Atom)由头部和数据组成。
XLSX文件本质是一个ZIP压缩包,内部包含XML文件与目录。
4.目录。
当文件数量太多的时候,我们采取“目录”和“文件”结合的形式进行分类管理。目录下面可以放文件,也可以放子目录。目录让文件管理层次分明,整洁明了。
目录可以按类型分,相同类型放一块:
也可按功能分,完成某一功能的所有文件放一块:
windows为操作系统目录,文件数量达10万之众。
文件管理的“树状”结构:
我们学C编程,花费很多脑细胞完成的一个程序(比如:hello.c),也只不过是在文件海洋里多了一个“微不足道”的文件而已。在我们前面,有无数个软件工程师编写了无数个“微不足道”。
二、启动
我们按下电脑的电源开关,桌面出现后,双击C-Free图标,开始学习C语言编程,并且运行第一个程序,犹如梦幻,我们到底经历了什么,电脑又做了些什么。
1.硬件的启动。
Deepseek回答如下:
电脑是个严谨的人,通电后,先把各个部件自检一遍,看有没有败类?如果有,有时会蜂鸣,大多数情况无声无息没反映,比如内存条没插好。
自检的指令和程序固化在主板上的一块叫ROM的芯片中。当我们按下电源开关或reset复位按钮,硬件执行第一条指令的地址是0xFFFF0(1MB物理地址空间0xFFFFF的顶端),长度16字节,实质是一个跳转指令(JMP 0xF000:E05B)。这是硬件与软件的第一次打交道。这条指令将下一步的动作指向ROM芯片(范围0xF0000–0xFFFFF,64KB)中BIOS入口。BIOS接下来逐步初始化内存控制器、检测硬件。
为什么CPU可以直接访问ROM?
主板设计时,ROM芯片的物理引脚已连接到地址总线的特定范围(如 0xF0000–0xFFFFF)。电源启动后,硬件逻辑(如北桥芯片组)直接建立ROM到CPU地址空间的映射,此时CPU可直接访问ROM中的代码。此时主内存(RAM)尚未初始化,实际访问的是主板上的ROM芯片,而非RAM。
BIOS("Basic Input Output System")的作用:检测硬件设置参数(比如:设置硬盘模式(AHCI/RAID)、CPU频率、电源管理等),设置引导顺序:按预设顺序(如USB→硬盘→网络)寻找可启动设备。在开机时通常按Del或F2等可进入设置界面。其设置的参数,在主板上有一块专用的钮扣电池给它供电,防止断电后丢失。如果每次开机都进入BIOS,那可能是电池没电了。
2.操作系统的启动。
上面硬件的自检和配置都OK了,接下来就是操作系统的启动。操作系统(Operating System,缩写:OS)是一整套程序包,安装好后用来协作计算机的各种硬件,管理软件,与用户进行交互。其功能包括处理器管理、存储器管理、设备管理、文件管理、作业管理等。常见有微软Windows,苹果macOS 和开源的 Linux、华为鸿蒙系统等。硬盘加载操作系统顺序如下:
一块物理硬盘可以分多个区(比如C、D、E盘),不同的区可以安装不同的操作系统,从哪启动,要看MBR(Master Boot Record),即看哪个是激活分区。
Windows系统启动的第一个文件:
实操:win+R打开命令窗口,输入CMD回车,在出现的命令提示光标处输入cd\,再次输入dir/a,可以看到一个文件bootmgr(Windows Boot Manager)。它是Windows系统的引导管理器,负责从活动分区的根目录加载引导配置数据(BCD),并启动操作系统,直到桌面出现。也是从这个文件开始,硬件与软件打交道从固化代码形式转为文件形式。windows的第一个文件bootmgr。如果开机提示“BOOTMGR is missing”或“Press Ctrl+Alt+Del to restart”时,可能原因:①引导文件损坏或丢失:BOOTMGR文件被误删、病毒破坏或配置错误;②引导扇区故障:硬盘主引导记录(MBR)或分区引导扇区损坏;③启动顺序错误:BIOS中未将系统硬盘设为第一启动设备;④硬盘物理问题:硬盘连接线松动、存在坏道或完全损坏。
windows启动主要完成下列动作:
加载驱动以控制CPU、内存、存储等核心硬件;
初始化进程调度器(smss.exe);
文件系统挂载:识别并挂载根文件系统(C:\);
解析启动参数(kernel选项);
启动服务控制管理器(SCM),加载winlogon.exe、网络服务等;
即插即用管理器(如Windows的PnP)检测并配置新硬件,加载额外驱动程序;
显示锁屏界面,加载explorer.exe(桌面外壳)和用户配置文件。等等,可通过任务管理器查看部分进程:
3.IDE的启动。
IDE(Integrated Development Environment,集成开发环境)是一种用于提供程序开发环境的应用程序,通常包括代码编辑器、编译器、调试器和图形用户界面等工具,集成了代码编写、分析、编译和调试等功能。常见的有:Visual Studio、Eclipse、IntelliJ IDEA、PyCharm等。编写C语言程序常用C-Free和Ms Visual C++等。这些工具从网上下载后,首先还是要在操作系统里安装。安装时一般会在C盘Program Files (x86)目录下生成一个新的目录,安装完成后生成一个可执行文件(.exe),双击这个可执行文件或图标,就可以启动IDE。拿C-Free为例:
启动IDE后,可以通过进程查看:
可以看到操作系统给C-Free分配了40M的内存,这是物理内存(电脑实际内存8G),多少不是固定的,动态调节。
4.第一个C语言程序。
进入C-Free操作窗口,新建一个文件,在代码窗口输入第一个C语言程序代码(全为半角,注意与中文全角字符的区别):
#include <stdio.h>
main(){
printf("Hello world !");
}
输入完成后键盘按F5或鼠标点击三角形的播放键运行,结果为:
恭喜!抄写C语言的第一个程序顺利完成。是不是很简单?
这是不是C语言最简单的程序呢?其实不是,下面才是:
只需要一行main(){}即可运行,程序没有任务输出,但还是顺序运行了。可以看出,这是C语言的最简骨架,不能再少了,真的不能再少了。C语言程序都是一个个函数,函数之间可以相互调用,这个main()就是主函数,是程序的入口,梦开始的地方。小括号“()”是函数的标志,main()是函数头;大括号“{}”是函数体,象身体,合起来构成生命,孕育万象。(此时没有语句的程序更象个小蝌蚪)
main中文意思:总管道,主线路,主要的。我记住你了。
当加入printf("Hello world !");时不能通过,还要加上#include <stdio.h>这句。因为printf()函数,print打印输出format格式,即格式化输入函数,必须要到文件stdio.h中找,std代表 Standard(标准),io代表 Input and Output(输入输出),.h表示 Header File(头文件),这个文件在哪儿呢?
用C-Free直接打开,可以搜索到printf():
include包含包括,#include 就是预处理指令,用于在编译前将指定头文件的内容插入到当前文件中,本质上是一种代码替换机制。看样子,英文好,编程更轻松。
我们编写的代码文件.c,从点击开始到窗口出现:
经过了什么?
编译、链接、运行。编译是将代码文件.c翻译成二进制文件,叫目标文件.o或.obj;链接就是把目标程序涉及的模块打包成可执行程序.exe;运行就是执行生成的.exe。
找到文件.c的目录,可以查看:
三、C语言数学基础
计算机未出现之前,由于数学涉及的计算量太大,人类开始探索能不能发明一种机器,来减轻人工计算量?于是乎有了计算机,一路走来,到了现在的AI...
(一)C语言对数学有较为严格的定义和语法
C语言对"数字"是严格区别整数和小数,书面语言:整型和实型(浮点型,可以含小数的数)
1.整数的定义和输出:
“%d”表示输出一个十进制整数,用的最多。而“%o、%x”分别表示八进制、十六进制输出,用的较少。【二进制的定义有些版本里取消了。】
2.printf函数的几种输出格式如下:
定义什么类型的变量,输出时要指明想要的输出类型,“讲匹配”。否则会出现不是想要的结果,尬了。
3.实数的定义和输出:
“%f”表示输出一个十进制实数。%与f之间可加入控制符,比如:%-5.2f,-表示左对齐;5表示占位不少于5;“.2”表示四舍五入到两位小数。整数除整数,结果只取整数部分,要想拿到有小数点的结果,需要用(float)或(double)放在前面强制转换。
可以看出,float定义的数精度小些,第6位数以后出现误差;而double定义的数,第15位才出现误差。举个例:
可以看出只有前面的数是正确的,超过一定长度会出现错误,就好象在excel表格输入18位身份证号码,不能保存为数字,要转成字符。
弄清楚了有效位数,再来看看取值范围:
float定义的数字,只认小数点前38位后38位,而double可以达到小数点前308位后308位,双精度。也就是说数可以很大也可以很小,但有效位数相比小的多。
4.习惯养成。
通常在声明变量时,可以:
int i,j,k;//用于循环计数
int a,b,c;//一般整数变量名用abc,英文缩写也可
float x,y,z;//小数用xyz
double x,y,z;或dx,dy,dz;或xx,yy,zz
当然用英语单词代替单个字母,更易阅读。
(二)C语言中的数学运算
1.基础运算。
加、减、乘、除,分别用半角字符“+、-、*、/”来表示。比如:1+2、5-2、3*6、8/2等,也可是变量:5+a、b*c、a*a、b/5等。
除了四则运算,C多了个“求模”运算,也就是求余数,用“%”来表示。比如:7%3=1,5%3=2,8%4=0。求余可帮助解决很多实际问题,一个整数a的个位数可用a%10表示。
2.复合运算。
C除了上述5种(加、减、乘、除、余),增加了叠加式运算符。比如:i++、i--、++i、--i,什么意思?++表示它前后的变量自动增加整数1;--相反,自减1。
除了++、--,还有+=、-=、*=、/=、%=,即基本运算符和等号放一起。比如:
a+=5等价a=a+5;
a%=b等价a=a%b;
a/=b+3等价a=a/(b+3);
多个等号连等,从右往前处理:
a+=a*(a=5)等价a=a+a*(a=5)等价a=5+5*5等价a=30;
m+=m*=3+(m=2)等价m+=m*=5(此时m=2)等价m+=(m=m*5)等价m+=m=10(此时m=10)等价m=m+m等价m=10+10=20;
多个等号有逗号,依次处理逗号,最后一个为输出:
a+=(b=1,a=2,d=3)等价a+=3等价a=a+3=2+3=5。
另外,三个运算符在一起呢?先取两个。
比如a+++b,实际上等价(a++)+b。
3.数学函数。
如果要进行更复杂的数学运算呢?平方可以a*a,三次方a*a*a,那开平方,求正弦值...等怎么实现呢?
C经过专业人士的不断开发,形成了一些固有的函数以实现其功能,通过#include<math.h>预处理,常用的有:
sqrt(x);//求实数x的平方根(x为double类型)
abs(a);//求整数a的绝对值
fabs(x);//求实数x的绝对值
sin(x);//求x的正弦值(#define pi 3.14文头定义)
cos(x);//余弦值
tan(x);//正切值
log(x);//以e为底的对数值,相当lnx
log10(x);//以10为底的对数值
exp(x);//求e的x次方
pow(x,y);//求x的y次方
......操作一下:
记住名字,拿来用即可。