有许多学科,明明是理科,但需要记忆的内容却不少。这样的学科往往令人头疼。
而C语言这类的编程语言正是这样。不过相较于物理学习的物理学史,编程语言的需要记忆的内容多为基础知识。也就是说,这些需要记忆的东西正是为后面的深入学习做准备。因此C语言中的基础知识是非常有必要记忆和理解的。
编程/计算机通识
一般通识就是考教材上的内容
算法的概念
计算机科学家 Wirth
提出著名公式“数据结构+算法=程序”
是提前设计好的通过有限步得出结果的一种解决问题的方式(算法是解题方法的精确描述)
## 算法的特点 (1)有穷性:步骤应有限,否则不会输出结果
(2)确定性:算法的每一个步骤应是确定的
(3)有多个或零个输入(重要)
(4)有一个或多个输出(重要)
(5)有效性:每个步骤都能被有效执行 ## 算法的描述
一、自然语言
通俗易懂,适合求解简单的问题
1 | 题目:设有两个整数 A 和 B,要求将它们互换 |
二、流程图
直观、易懂
### 三、计算机语言
机器语言
汇编语言
高级语言(C语言属于这个,其他两类语言做了解即可)
进制转换
日常生活使用 十进制(d/D), 计算机内部使用 二进制(b/B), 人类管理计算机内部的二进制时使用 十六进制(h/H) 。因此这三种进制是所有进制里最重要的,相互转化是一定要掌握的。
注:C语言只有八、十、十六进制,没有二进制,但是所有进制都要转换为二进制处理。
### 十进制转二进制(转 k 进制)
考试的重难点,属于没学过就非常花时间的那种题。(小学现在都开始学二进制的四则运算了,作为大学牲还不会十转二,这合理吗)
#### 基本方法:倒取余数法(短除法)
这幅图非常直观,效率也非常高,求解过程中没有思维上的障碍,只要想通为什么能够用这样的方法来计算二进制,就不会忘记这种方法了。转
k 进制只需将除数‘2’换成‘k’就可以了。这同时也是编程中常用的方法。
#### 进阶方法:背表(非正式名称)
例如:将十进制 29 转化而二进制
1.
十进制29介于16与32之间,而我们知道16的二进制是10000,32的二进制是100000,所以结果有五位,第一位是
2.
29减去16后,继续求剩下的四位。13介于8和16之间,所以介于1000和10000之间,推断出第二位是1
3. 剩下的5其实是常用的,可以直接看成101了
4. 得出结果 29d = 11101b
这种方法熟练后比倒取余数法快,本质上是一种迭代或递归的处理思想,将大问题转化为小问题。
有些场景下会计算的很快,例如 127d = 1111111b 这是因为 128d =
10000000b,所以给128的二进制数减去1就能快速得到127的二进制数。
同理其实29也可以快速计算:29 = 31 - 2; 29d = 11111b - 10b =
11101b;
合理的综合使用方法能够显著地提升计算的速度。
### 二进制(k 进制)转十进制 相比之下,二进制转十进制就容易很多。
十进制数 123 本质上也和其他进制一样 1×10^2 + 2×10^1 + 3×10^0 =
123d
在进制中 像例子中的1 2 3称为基数, 10^2 10^1 10^0
称为位权
同理,二进制转十进制的计算方法是一样的
例如 11101b = 1×2^4 + 1×2^3 + 1×2^2 + 0×2^1 + 1×2^0 = 29d
k进制同理,不举例。
二进制 与 十六进制相互转化
这是一种特殊的进制转换,因为 16 是 2
的四次方,所以一位十六进制数可以用四位二进制数来完全表示。
#### 二转十六 例如 1110101b
1.补齐位数:将二进制数补成 4 的倍数位 01110101b
2.转化:0111 是 十六进制里的 7, 0101 是十六进制里的 5;
3.拼接:1110101b = 75h
再来一个例子 101110b
1.补齐位数:00101110b
2.转化:0010b = 2h , 1110b = Eh; ( E 是十六进制中的 14 )
3.拼接:101110b = 2Eh
#### 十六转二 例如 46 1. 转化(不足四位补齐):4h = 0100b; 6h =
0110b;
2. 拼接(开头的 0 去掉):46h = 1000110b
附上二进制对应十六进制表(不要求背)
C语言基础
基础认识
程序结构有三种
顺序结构:从上往下执行,以分号为间隔,一句一句执行。
选择结构(分支结构):主要是以 if { } else {
}语句实现,特殊情况可以使用Switch语句来简化代码。
循环结构:以 for 循环和 while 循环来实现。
理论上,学会这三种程序结构,就可以设计一切的程序了。复杂的功能都是由这三种结构设计出来的,程序设计课程也是为了能熟练运用这三种结构来设计算法解决问题。
程序基本结构
下面是最基础的一段代码:
1
2
3
4
5
6#include <stdio.h>
int main() {
printf("Hello, world! \n");
return 0;
}
#### 一·编译过程 先介绍一下代码所在的文件名,不妨叫做 demo.c 好了,其中
.c 是文件的后缀名,表示是 C 语言的源文件,若要运行 C
语言的程序,需要经过两个步骤:1.编译( .c --> .obj )
2.链接( .obj --> .exe
)这两步都成功后,程序才能正常运行。
同时,也只有 demo.exe 文件才可以运行,demo.c 和 demo.obj
都无法运行。
#### 二·代码解释 #include <stdio.h>
第一行是编译预处理,名词看不懂没关系,可以理解成在编译这一过程中,将
stdio.h 这个文件里面的内容放在了这一行里面。
stdio: standard input output 标准输入输出
.h: header file 头文件的后缀名
在第四行使用的 printf 函数包含在头文件 stdio.h 中,因此要将这个头文件
include 进来。
include 这一行不用加分号!!!
int main() {...}
第三行开始的代码为需要执行的代码,也是运行时开始执行的代码(没错,是从第三行开始运行的,第一行是编译的过程中需要读取的内容)
C 语言的程序是从以函数 main() 为入口,主函数中的 return
0 为出口的(如果有return的话)。
printf("Hello, world! \n");
这一行是 printf 的语法,在此不做解释。
return 0;
这一行可以看成是语法要求的,用于结束主函数的运行,并且返回给编译器一个整数
0 。
标识符
标识符的命名规则
- 必须由字母、数字、下划线组成,不能有其他的符号。
- 并且第一个必须为字母或下划线,不能以数字开头。
- 且不能使用关键字进行命名。
区分大小写,sum 和 Sum 是两个毫不相关的标识符。
### 标识符的分类 关键字:不可以作为用户标识符。例如 int
double auto if while 等等,但是 While
可以作为用户标识符,因为大小写区分。
预定义标识符:C语言中系统预先定义的标识符,比如 printf
define include 等等,这些都可以作为用户标识符。
用户标识符:用户根据需要自己定义的标识符称为用户标识符。无论如何自定义标识符,都必须符合标识符的三条命名规则。
基本数据类型
整型
这一块将按照数据类型的长度(即所占内存大小)来介绍整型数据类型
char (unsigned char): 字符常量(无符号char),8位,1字节
short (unsigned short): 短整型,16位,2字节
int (unsigned int): 整型,一般32位,4字节
long (unsigned long): 长整型,32位,4字节
(没错,int和long的存储空间是一样的)
long long (unsigned long long): 长长整型,64位,8字节
表示范围:-2^(位-1) ~ 2^(位-1)-1 (无符号 0 ~ 2^位-1)
浮点型
只有两个数据类型
float: 单精度浮点型,32位,4字节 double: 双精度浮点数,64位,8字节
字符类型
char: 在整型出现过,char储存方式为整型,但是一般字符用char来表示,后期的字符串也是用char来作为基本元素
常量
const: 在定义变量时, 如果决定不改变其值, 可在数据类型前加上const以达到目的。
如: const int x = 4;
这样就保证了 x 的值为 4
且不再改变。
指针类型
以后会涉及,位数与电脑位数相同,用 long long 存储,一般以十六进制表示。
空类型
void: 通常用于函数地返回值类型,写 void 的话就可以不用 return 语句
(2023.11.21 完)