150 likes | 295 Views
C 基础——理解算法. 算法举例 C 程序示例 结构化算法 趣味算法. 理解算法. 算法就是按部就班地解决某个问题的方法。 离散化、序列化、规范化、程序化. 烹饪鲤鱼算法 (Adlai Stevenson). 1、取一条1 - 2磅重的 鲤鱼,并把它放在清水里游上24小时。 2、将鱼刮鳞去骨切成片。 3、给鱼涂上黄油,并撒上盐和胡椒。 4、把鱼片放在烤炉里用温火烘烤20分钟。 5、取出即可享用。 目标:烹饪鲤鱼 实现: 算法 细化:各具体操作. 算法举例1:求两数之和. 1、有两个数 a 和 b ,a 等于2, b 等于3。
E N D
C基础——理解算法 算法举例 C程序示例 结构化算法 趣味算法
理解算法 • 算法就是按部就班地解决某个问题的方法。 • 离散化、序列化、规范化、程序化
烹饪鲤鱼算法(Adlai Stevenson) • 1、取一条1 - 2磅重的鲤鱼,并把它放在清水里游上24小时。 • 2、将鱼刮鳞去骨切成片。 • 3、给鱼涂上黄油,并撒上盐和胡椒。 • 4、把鱼片放在烤炉里用温火烘烤20分钟。 • 5、取出即可享用。 • 目标:烹饪鲤鱼 • 实现:算法 细化:各具体操作
算法举例1:求两数之和 • 1、有两个数a和b,a等于2,b等于3。 • 2、准备一个数sum,sum取值为a加上b • 3、将sum的值显示在屏幕上 • 1、有三个整数 a,b,sum • 2、置 a = 2 • 3、置 b = 3 • 4、置 sum = a + b • 5、输出 sum
C程序实现 /*例(ex1.c): 求两数之和*/ main( ) { int a,b,sum; /*变量说明*/ a = 2; /*赋值*/ b = 3; sum = a + b; /*求和计算*/ printf( “%d\n”, sum ); /*调用输出函数*/ }
0+1=1 1+2=3 3+3=6 6+4=10 10+5=15 … 0+1=1 1+1=2 1+2=3 2+1=3 3+3=6 3+1=4 6+4=10 4+1=5 10+5=15 5+1=6 … 算法举例2:计算1+2+3+4+5 • 初始时:i=1,sum=0 • sum+i=>sum • i+1=>i • 结束时:i>5
1、置sum=0 ,i=1 2、当i小于等于5时重复下 (1) 置 sum 为 sum+i (2) 置 i 的值为 i+1 3、输出y的值 4、程序结束 理解变量的作用 理解“置”与等式区别 试手工运行程序 算法与C程序 main() { int i,sum; sum = 0; i = 1; while (i<=5) { sum = sum + i; i = i + 1; } printf(“%d\n”,sum); }
CPU的运行 CPU 内存(RAM) 指令流 与 数据 软件、程序 ALU 运算器 指令系统 寄存器组 Registers 输入/出 I/O 基本指令: 算术、逻辑、比较、跳转、硬件I/O、系统 硬 件 平 台
机器语言与汇编语言(求和100) • 146B:0100 B80000 MOV AX,0000 sum=0 • 146B:0103 A30220 MOV [2002],AX (地址2002) • 146B:0106 B80100 MOV AX,0001 i=1 • 146B:0109 A30020 MOV [2000],AX (地址2000) • 146B:010C A10020 MOV AX,[2000] sum+=i • 146B:010F 01060220 ADD [2002],AX • 146B:0113 B80100 MOV AX,0001 i=i+1 • 146B:0116 01060020 ADD [2000],AX • 146B:011A A10020 MOV AX,[2000] i<=100? • 146B:011D 3D6400 CMP AX,0064 • 146B:0120 76EA JBE 010C Yes:循环 • 146B:0122 B402 MOV AH,02 No:输出 • 146B:0124 B230 MOV DL,30 (输出‘0’) • 146B:0126 CD21 INT 21 • 146B:0128 CD20 INT 20 程序结束
趣味算法举例 • 求一分数的千位小数 • 1/7 = 0.14285714285714……(共1000位) • 求e,的千位小数 • e = 2.71828182845904523536…... • = 3.14159265358979323846…... • 扑克牌算24点 • 安全过河求解 • . . . . . .
千位小数求解 • 计算过程 • 10 7=1,余3 • 30 7=4,余2 • 20 7=2,余6 • 60 7=8,余4 • 重复主体 • x y=m,余n • n*10为新的x
置x = 10,y = 7 输出“1/7=0.” 以下重复1000次 x y求商m,余n 输出m 置x为10*n 程序结束 main() { int x, y, i, m, n; x = 10; y = 7; printf( “1/7=0.” ); for (i=0;i<1000;i++) { /*重复1000次*/ m = x / y; /*求商*/ n = x % y; /*求余数*/ printf( “%d”, m ); x = 10 * n; } } 千位小数算法
千位小数算法——数组法 • 准备数列A1,A2,…,A1000 • 用于记录第1,2,…,1000位小数,… • 置x = 10,y = 7 • 以下重复1000次(i=1到1000) • x y求商m,余n • 置Ai = m • 置x为10*n • 输出“1/7=0.”,输出A1,A2,…,A1000
问题描述算法程序调试 离散化、序列化、规范化、程序化 算法 + 数据结构 = 程序 结构化分析、设计 软件工程法 面向对象法 快速原型法 程序说明 /* 程序注释 */ 正规文档 系统分析说明书 系统设计说明书 测试说明书 用户说明书 软件方法 本课程要求
关于的公式及结果 • 马青公式 • 斯图模公式 = 3.14159,26535,89793,23846,26433,83279, 50288,41971,69399,37510,58209,74944, 59230,78164,06286,20899,86280,34825, 34211,70679,……