MeshddY

爱看戏的戏中人的博客

作业

  1. 定义一个函数,传入年、月、日,返回该日期是这一年的第多少天
    int days(int y, int m, int d)

  2. 由 1~9 构成三个三位数(数字不重复),寻找满足以下条件的数有几组?

    a,b,c
    b = 2 * a
    c = 3 * a

    123, 246, 369

  3. 写纸上交:循环与递归
    1)gcd
    2)fib
    3)is_prime

函数

函数是构成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 循环条件,1n
// 3 步长,0
n
// 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

运算

  • 赋值
  • 算术
  • 关系(比较):结果是真(非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

运算

-

  • 赋值运算:可以是字面量,算术表达式或者函数
  • 算术运算:+,-,*,%(模运算,取余数)
  • 关系运算(比较)
  • 逻辑运算
  • 位运算
  • 三元运算

表达式:语句的一部分
语句:分号
代码块:{} 括住的多条语句

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

类型与计算

计算机体系结构(冯诺依曼体系结构)

-输入单元
-输出单元

  • 运算器(单元)
    • CPU
    • GPU
  • 存储器
    -缓存 cache
    -’主存‘(’内存‘)CPU从哪读数据 直接与CPU连接的 16G
    -外部、辅助(硬盘、CD) 1.5T

    -控制器

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 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

  1. cc -S a.c 汇编:生成汇编文件 a.s
  2. cc -c a.s 编译:成文目标文件 a.o
  3. cc -o a a.o 连接:成为执行文件 a, windows平台 a.exe
  4. ./a 运行程序

file a.s 查看文件类型

数据类型

作业(写纸上)

  1. C 语言的编译流程
  2. 写代码, 打印 hello world

参考书籍

  • C Primer Plus
  • C语言程序设计 现代方法
  • C程序设计语言典藏版套装
0%