函数
函数
函数是构成C程序的基本单元
命名的代码块、可复用的模块(功能单元)
降低代码重复、程序的结构简洁、清晰
一个函数的大小,不超过屏
函数结构
- 函数名
- 参数列表,参数类型及名称,0~n
- 函数体
- 返回值类型:由return的值来决定,若无 return 则写 void 关键字
‘’’c
void avg(int a, int b)
{
//函数体
return 1;//‘1’字符char
}
函数定义与调用
‘’’c
// 声明,不包含函数体,可以省略参数名
int menu();
int add(int a,int b);
int add(int, int)
// 定义
int menu()
{
}
函数声明与定义
递归
函数调用自身
循环可以实现,优先使用循环:部分问题只能递归
确定‘收敛条件’
EG1:计算阶乘
n! = 123*4..*n
n! = n * (n-1)!
EG2:计算斐波那契数列
1,1,2,3,5,8,13,21,34,55,89
‘’’c
int fib(int n)
{
//收敛条件:前两个元素都是1
if (n<3)
return 1;
//从第三个元素开始
else{
return fib1(n-1) + fib1(n-2);
}
//if,不写if会无限展开无法返回
return fib(n-1) + fib(n-2);
}
作业
1.计算斐波那契数列,分别用递归和循环来实现
2.计算两个数的最大公约数,int gcd(int,int)分别用递归和循环实现
3.打印1000以内所有的质数,is_prime(int)定义一个函数是否是质数
扩展:定义函数开根号
版本控制与协同开发
版本控制与协同开发
版本控制
软件配置管理 SCM
软件
- CVS 第一代 软件配置管理工具 集中式
- SVN 第二代 sub version 集中式,更好的子版本管理
- Git 第三代 分布式,本地与远程,可以离线操作
Git 核心操作
- git init 初始化仓库
- git clone 克隆(本地、远程)仓库
- git add 把新内容加入到缓冲区
- git commit 把缓冲区的内容提交到本地仓库
- git push 把本地仓库的内容发送到远程仓库
- git pull 从远程仓库同步最新内容
- git checkout 检出 可以回溯到过去某个存档节点
- git checkout master 回到最新的位置
- git status 查看状态
- git branch 创建分支
- git merge 合并分支
- git tag 标签 直接输入会在当前状态打标签 +标签+id 给之前的节点打标签
- git log 查看日志
c/用户/.gitconfig里面可以修改git的email和用户名
#创建标签0.1
git tag 0.1 xxxxID
git tag 0.2 xxxxID
git tag 0.3 xxxxID
git tag 20241215 xxxxID
# 给当前节点打标签
git tag 1.0
# 检出到特定节点(版本)
git checkout 0.1
# 分支
#查看分支
git branch
# 创建分支
git branch b1
# 进入分支
git checkout b1
# 合并分支
git memrge b1
‘’’shell
# 添加改变
git add a.c
# 提交到本体仓库
git commit -m "描述信息"
# 查看状态
git status
# 查看日志
git log
协同开发
1.fork
https://gitee.com/MeshddY/abc
2.克隆到你本地
3.修改,提交到你的远程
4.发送一个PULL Request
5.对方若接收(合并)
二维数组
二维数组
由一维数组构成的数组
‘’’c
int n[3]; // 4byte * 3
int m[3][4]; // 4byte * 12
int m[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};//3组每组4元素
// m[0][0] = 1
// m[2][3] = 12
int m[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
杨辉三角/帕斯卡三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
(a + b)^1 1,1
(a + b)^2 a^2 + 2ab + b^2 1,2,1
(a + b)^3 a^3 + 3a^2b + 3ab^2 + b^3 1,3,3,1
(a + b)^4
(a + b)^9
跳水比赛的积分统计
1.裁判员人数 5名或7名,0~10分,可以打0.5
2.去掉最高分和最低分,获得总和,总和 * 难度系数
3.录入多名运动员的成绩
double[12][5]
1 2 3 4 5 h l s
1 9 7 8.5 6 8 9 6 7.5
2 9 7 8.5 6 8 9 6 7.5
3 9 7 8.5 6 8 9 6 7.5
4 9 7 8.5 6 8 9 6 7.5
功能
0.显示菜单:录入、显示、退出
1.录入成绩(打分),给第?位运动员录入成绩,5个值,计算得到最低分,最高分
2.显示成绩,显示所有运动员的成绩(放一个计数器),不要求做排序
3.退出程序
数组与循环
数组与循环
数组
一个变量存储相同类型的多个值(元素),多个值有序依次存储,可以通过索引(下标)随机访问,下标序号从0开始。
‘’’c
int i;
// 类型 标识符(变量名),空间由类型决定
int a [4];
// 声明,空间 4byte * 5
int n = 9;
int a[n]; //a的容量为9
n = 12; //前面声明之后a的容量不变,数组大小固定,后期可以通过动态内存管理实现动态数组
double f[3] = {2.3,3.3,1.9}; //声明与初始化一体
循环
- ‘for’ 循环次数确定
- ‘while’ 循环次数不确定,由条件决定,先判断再执行
- ‘do~while’ 与 while 类似,先执行再判断;至少执行一次循环体
‘’’c
while (a != 0 || a < 12)
{
//循环体
}
do
{
}while();
嵌套循环
输入 n,打印 n 行 列构成的
‘’’c
// 1 循环变量初始化,一般执行1次
// 2 循环条件,1nn
// 3 步长,0
// 4 循环体,0~n
//执行顺序 1,2,4,3, 2,4,3, 2(当不成立的时候),5
for (第一部分;第二部分;第三部分)
{
//第四部分
}
// 5
break
在某个区间跳出循环
结束当前代码块(循环)
break bad(绝命毒师)
continue
跳过当前代码,结束循环体的一次执行,进入下一次
作业
1.打印空心正方形
2.打印三角形
3.打印菱形
位运算
位运算
数值转换为二进制格式’逐位’进行的运算
- ‘&’ 与 ((n&8)==8) !(n&8)
- ‘|’ 或
- ‘^’ 异或
- ‘~’ 取反
- ‘<<’ 左移
- ‘>>’ 右移
- ‘’
- ‘’
- ‘’
& 与
1234
4 * 10^0
3 * 10^1
2 * 10^2
1 * 10^3
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
101000
000001
000001 =0,1
掩码操作
前三位为网络地址,第四位为主机地址
192.168.1.101 255.255.255.0
192.168.1.102 255.255.255.0
192.168.1.103 255.255.255.0
xxxx xxxx
0000 0000
---------
0000 0000
|或
叠加
1 0001 响铃
2 0010 震动
4 0100 LED
8 1000 其他
0011
判断某种状态是否启用
(v & 2) == 2
0011
0010
----
0010
^异或(相同为0,不同为1)
1010 a 0110
1100 b 1100
0110 a^b 1010
1100
1100
0000 相同的值异或得 0
~ 取反
- 正数 按位取反加一
// 0000 0011 3
//~a
// 1111 1100 符号位1,负数,读:按位取反并加一
// 1000 0100 -4 - 负数 变符号位减一
左移、右移
// 0000 1001
// 0001 0010 左移 *2
// 1000 0100 右移 /2取整
循环
运算与流程控制2
运算与流程控制 2
运算
- 赋值
- 算术
- 关系(比较):结果是真(非0)、假(0),stdbool.h(导入这个库才有定义)
- ‘==’
- ‘!=’
- ‘>’
- ‘>=’
- ‘<’
- ‘<=’
- 逻辑
- ‘&&’并且
- ‘||’或者
- ‘!’非
- 位
- 三元
流程控制
流程
- 顺序结构:语句从上往下依次运行
- 分支结构:条件语句,部分执行、部分跳过
- 循环结构:重复多次执行
分支结构
- ‘if’:关系表达式、逻辑运算
- ‘if else’ 两路
- ‘if - else if - else if - else’ 多路分支 ‘*基本万能’
- ‘switch case’ 多路,适用于部分场景
- ‘’
‘’’c
// 1 条件语句
int n = 1 ;//注意=是赋值==才是相等
if(n != 0) printf(“”);
// 关系运算时,常量写在 == 的左侧 if (7 = n)如果不是==会直接报错避免难找
if(n == 1)
{//括住的才会执行条件如果不加括号只会执行第一行printf1
printf("1");//c中没有严格的缩进要求
printf("2");//python中必须严格缩进
}
if(n != 0) printf("");
作业
1.上课的示例:
1)三个数求最大、最小、中间
2)闰年判断
2.个人所得税
1)不考虑五险一金
2)考虑减去五险一金
循环结构
运算与流程控制1
运算与流程控制1
运算
-
- 赋值运算:可以是字面量,算术表达式或者函数
- 算术运算:+,-,*,%(模运算,取余数)
- 关系运算(比较)
- 逻辑运算
- 位运算
- 三元运算
表达式:语句的一部分
语句:分号
代码块:{} 括住的多条语句
c
// 空间大小分配,标识符a
int a;
//赋值,从右往左
a=42; //42赋值给a 字面量
//a+1 算术表达式
a=a+1; //a+1的值赋值给a
//函数调用
a= rand();
a = 3;
3 = a;//错误的×
int x, y, z;
x=y=z=9;
分解整数的各个位
- 当字符串去处理 string.h
- 除法或取余数
‘’‘c
int n=789;
//获得最低位
int x = n % 10; //模运算 取余数 余数是9
// 抹去个位
n = n / 10; // 78
## 作业
1.输入一个四位数,输出各个位数的乘积与各个位数的累加和
纸上作业
2.CPU访问各种存储器的速度。
3.十进制整数、小数 转二进制
0.725
0.1
c语言的类型与计算
类型与计算
计算机体系结构(冯诺依曼体系结构)
-输入单元
-输出单元
CPU读取速率:
缓存 > 内存 > 硬盘 > 网络
ns 几十ns 固态μs 机械ms ms到s
任务:以上几种存储器的 IO 的数量级
常量&变量(字段)
存储输入的数据或运算的中间值及结果,需要声明划分存储空间
内存空间有编号,但是不易于使用,所以给内存区域一个标识符(变量名、常量的名字)
标识符(变量或常量的名字)的命名规则
字母、数字、下划线 _;不能有其他符号
不能数字开头,不能包含空格及下划线之外的其他符号
不能使用关键字和保留字
ls
hello
_hello
_163
first_name
first name 不合规
65n 不合规
first-name 不合规shell
free 内存的统计信息 32位系统有效寻址能力为4个G
Range 内存的编号范围
-h 可读的
内存的范围
lsmem 内存地址
类型
- 基本类型(原子)
- 复合类型(数组、结构体、联合、枚举、类)
整型,不含小数点、区分正负、还可以’无符号’
类型的大小与平台(编译器实现)有关(一个字节8位)
- ‘short’ 2 2^16 -65536/2 ~ 0 ~ 65536/2 -1
- ‘int’ 4(32/64位中占4个字节,别的操作系统可能不同)
- ‘long’ 8
- ‘long long’ 8
无符号(unsigned)的整型只能存0~正数 系统编程对空间进行编号(计数)
- ‘unsigned short’ 2 0~65535(端口数65536、android应用的函数数量一般不超过65535/65536超过计数范围会导致丢失)
- ‘unsigned int’ 4(32/64位中占4字节,别的操作系统可能不同)
- ‘unsigned long’ 8
- ‘unsigned long long’ 8
浮点,有小数位
- ‘float’ 4
- ‘double’ 8
字符
-‘char’ 1
语言
- 静态类型:C/C++,Java: 编译时检查使得这些语言比较安全,空间分配比较明确,编译型语言,一般都比较快比较稳定,什么都可以存【快】
- 动态类型:Python,JS(Javascript) “解释执行”,语言灵活、高效,空间开销大,【慢】
C/C++目前遇到的威胁早期是GO,最近是Rust(火狐浏览器)还需要时间,RUST学习成本比较高
作业
1.纸上写各个类型及其大小(字节)
2.复习八进制、十六进制、二进制
(99)转10,8,16,2进制
小数转二进制:0.1
初始c语言
C 语言
历史版本
- C 1972 基于 B 重写 UNIX
- K&R C 经典 《C 语言程序设计》 hello world
- C89/90 1989 标准化
- C99 1999
- C11/C1X 2011
- C17/C18 2017
- C2X C2X
编译器:把源代码转化为目标平台的机器指令
- GCC GNU 自由软件基金会
- MSVC 微软
- clang 苹果 x code
- …
学习路线
- 数据类型与运算
- 流程控制
- 数组
- 指针
- 结构体
- 函数
- 模块编程
- 标准库 API 应用程序编程接口
- 系统编程:文件、网络、进程、并发编程…
UNIX
- IBM AIX
- HP UX
- Sun/Oracle Solaris
- Mac OS/iOS
- BSD
Linux 集群 - 成本低, 运维技术要求高
C 开发流程
- 预处理
- 汇编
cc -s - 编译
cc -c - 链接
cc -o
C Compiler
cc = gcc
直接编译, 没有参数生成 a.out 可执行文件(a 汇编输出的意思)
cc a.c
详细步骤
0. 编辑器中编写源文件 a.c
- cc -S a.c 汇编:生成汇编文件 a.s
- cc -c a.s 编译:成文目标文件 a.o
- cc -o a a.o 连接:成为执行文件 a, windows平台 a.exe
- ./a 运行程序
file a.s 查看文件类型
数据类型
作业(写纸上)
- C 语言的编译流程
- 写代码, 打印 hello world
参考书籍
- C Primer Plus
- C语言程序设计 现代方法
- C程序设计语言典藏版套装