第一章:计算机程序设计与算法实现
计算思维能力培养
C语言:是面向过程的
C++:面向对象,也可以实现面向过程
JAVA:跨平台分布式语言
VB:交互逻辑思维
Python:主要是面向对象进行问题求解的编程语言;其语法简洁清晰,类库丰富强大,更是能轻松结合其他语言:尤其是:C语言,C++语言;
程序设计过程
计算机解决问题的过程就是将其转化为计算机思维化的过程;
程序设计算法结构与组成
计算机程序组织结构:
程序 = 数据结构+程序算法
- 数据结构:是对程序操作对象的数据类型及数据组织形式的描述与定义;
在程序中:是对内存变量及存储数据计算范围的定义和约定;
- 程序算法:
是对程序操作过程,即操作步骤的算法描述的指令集合;
在程序中,是对操作对象和程序流程的逻辑控制,是实际问题求解的实现过程;
但是,对当下来说:
程序=数据结构+数据结构+设计方法+编程语言+编程工具
对于常量:用全部大写表示----提高代码可读性;
例1实现计算圆柱体计算体积
代码实现:
Visual C++ 集成工具
文件管理和文件名命名规则
创建text 然后保存成 .c文件;
运行,调试工具:从快捷键按钮出发;
输出中的数值型数据 占位符,在后面有的是加 &,有的不加 &;
计算机程序算法表示
加法法则
- 事件互不相容时的加法法则
定理1 设事件A与B互不相容
则:P(A+B)=P(A)+P(B)
- 一般情况下的加法公式
P(A+B)=P(A)+P(B)-P(AB)
程序流程图的描述
程序起止/结束框:椭圆
条件判断框:菱形
输入/输出框:圆形
注释框:
程序流程线:箭头–数据流
程序流程图:表示三种基本控制结构;
程序流程图局限性:
N-S图
N-S图描述方式:
都是三种基本控制结构相互嵌套实现;
程序设计语言描述
- 机器语言
就是真实机器读取的语言:例如已知某计算机系统的取数操作码 1000,除法操作码为1010,减法操作码:1001;传送操作码:0100;另外也知道变量m,n,z中的三个数分别存放在11110110,10101101,01010110;
计算表达式 m/n-z的值
则编程如下:
1000 11110110 #取出放在该号内存单元的值
1010 10101101 将上条指令取出值除以放在该号内存的值
1001 01010110 将除法结果值减去放在01010110内存单元的值
0100 10010000 将上条指令操作最后结果值存到10010000内存单元
由此来看:用这样来写的化,的确是反人类的操作;
- 汇编语言
同样计算上述表达式的值
程序写成:
LDA m
DIV n
SUB z
mov Y
这样从逻辑操作和理解上就接近自然语言了,但是计算机系统CPU不能够直接识别出来。必须事先存放在存储器中的“”翻译程序“”即编译过程;翻译成机器语言,计算机系统能够识别和执行;
编译:即一般被称为汇编程序,可将程序的符号源代码翻译成机器语言描述的目标程序,生成目标程序,计算机才能运行,输出结果。
但这仍然也是反人类的,可能单片机会用得上一点,但是郭天祥大牛早已说过:就是用C语言就油完美又好,根本不用去理那个狗屎汇编程序指令代码集;
只有底层设计,底层架构才会设计这些东西,但同时也是最无聊最绕人的;
高级语言(这才是实打实的)
例子:实现分段函数
注意缩进,注意对应;
高级语言的编译过程:
图片
作业1:
使用流程图和N-S图描述自然语言描述的程序算法:从键盘输入数值数据,若是正数则累加求和,若是负数则重新输入,若输入空格则结束程序执行;
代码实现:
// 从键盘输入数值数据,若是正数则累加求和,
// 若是负数则重新输入,若输入0则结束程序执行;
#include "stdio.h" //库函数 说明 输入输出函数
int getnum(); //分解任务1,获得正数函数
void main(){
int i =0;
int sum = 0;
int a = 0;
int flag =1;
// 循环控制
while(flag){
a = getnum();
if (a ==0){
flag = 0;
}
sum = sum +a;
}
printf("sum is %d \n",sum);
}
// 获得正数
int getnum(){
int n;
while(1){
printf("请输入一个正数:");
scanf("%d",&n);
if(n < 0){
printf("输入错误,请重新输入: \n");
continue;
}
else
return n;
}
}
程序算法案列实现
程序设计实现的首先关键是:通过算法分析和设计(搜索大脑或者网络看看有没有相关代码实现,在上面进行修改),然后选择自己编程语言对应的语法来实现。
例子:求1+2+3+…+100
写程序流程图或者N-S图;
千万千万绝对绝对要记住:程序算法实现:是绝绝绝对对对不是唯一的,而是N种;
作业:
1+1/2+1/3+…+1/n = (n=100)
1-1/2+1/3-1/4+…1/n = (n=100 )
代码实现:
#include "stdio.h"
#include<math.h> // 包含数学函数
void main(){
int i;
double a = 0.0;
double sum=0.0;
for(i=1;i<101;i++){
a = 1.0/i * pow(-1,i+1); //这里必须是 1.0,要不然会有数据丢失
sum =sum + a;
}
printf("the sum is %f \n",sum);
}