null
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
提要内容提要算法的描述方法
基本控制结构
基本控制语句
常用算法,如累加、累乘、统计、递推、迭代、穷举等
程序的基本版式
结构化程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的基本思想算法的概念 算法的概念 数据结构+算法=程序
算法:为解决一个具体问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
而采取的确定的有限的操作步骤,这里仅指计算机能执行的算法
算法特性:
有穷性
确定性
有效性
没有输入或有多个输入
有一个或多个输出 算法的分类 算法的分类 数值运算算法:
解决的是求数值解的问题,例如用辗转相除法求两个数的最大公约数等
非数值运算算法:
主要用于解决需要用分析推理、逻辑推理才能解决的问题,例如人工智能中的许多问题,查找、分类等问题算法的表示方法算法的表示方法自然语言表示
传统的流程图表示
N-S结构化流程图表示
伪代码表示C程序结构C程序结构构成程序的三种基本结构构成程序的三种基本结构顺序结构
选择结构
循环结构
已经证明,任何程序均可只用这三种结构综合描述
只用这三种结构编制的程序,叫结构化程序
程序必须符合结构化规则结构化程序设计的核心思想 结构化程序设计的核心思想 采用顺序、选择和循环三种基本结构作为程序设计的基本单元
只有一个入口;
只有一个出口;
无死语句,即不存在永远都执行不到的语句;
无死循环,即不存在永远都执行不完的循环。
采用“自顶向下、逐步求精”和模块化的方法进行结构化程序设计 顺序结构BA
NS图传统流程图顺序结构BA
分支结构(选择结构)BN如果 成绩<60 那么
通知
关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知
补考
否则
告知你考试成绩AY条 件P分支结构(选择结构)循环结构条 件PA当型循环直到型循环真假假条 件PA假真循环结构循环结构当型循环循环结构循环结构直到型循环循环结构复合语句复合语句{}括住的若干条语句构成一个复合语句
语句块内可以定义变量
变量仅在定义它的复合语句内有效
变量必须在复合语句的开头定义
复合语句可以用在任何可以使用语句的地方if-elseif-else选择结构的一种最常用形式
if (表达式) 语句1; else 语句2; 语句3
表达式值非0时,执行语句1,然后语句3; 表达式值为0时,执行语句2,然后语句3
else部分可以没有。
if (表达式) 语句1; 语句3
当表达式值为0时,直接执行语句3
if-else嵌套使用时,注意else和谁配对的问题else-ifelse-ifif的一种扩展形式
if (表达式) 语句1; else if (表达式) 语句2; else if (表达式) 语句3; ………… else 语句4; 语句5;
else部分可以没有现场编程完成例现场编程完成例体型判断。按“体指数”对肥胖程度进行划分:
体指数t = 体重w / (身高h)2
(w 单位为公斤,h单位为米)
当t < 18时,为低体重;
当t介于18和25之间时,为正常体重;
当t介于25和27之间时,为超重体重;
当t >= 27时,为肥胖。
编程从键盘输入你的身高h和体重w,根据给定公式计算体指数t,然后判断你的体重属于何种类型。
用3种方法编程:
算法1:用不带else子句的if语句编程
算法2:用在if子句中嵌入if 语句的形式编程
算法3:用在else子句中嵌入if 语句的形式编程 switchswitch多路选择
switch (表达式)
{ case 常数1: 语句序列1; case 常数2: 语句序列2; ………… default: 语句序列3; }
default可以没有,但最好不省略
不要忘记break现场编程完成计算器程序……现场编程完成计算器程序……编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:
操作数1 运算符op 操作数2
然后,计算表达式的值,指定的运算符为加(+)、减(-)、乘(*)、除(/) 循环——while,for循环——while,forwhile (表达式) {
语句;
}
for (表达式1; 表达式2; 表达式3) {
语句;
}null 清华附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。
A说:不是我。
B说:是C。
C说:是D。
D说:他胡说。
已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。【任务 4.1】 “谁做的好事”null利用关系表达式将四个人所说的话表示成null这四种状态可简化写成 显然第一种状态是假定A是做好事者,第二种状态是假定B是做好事者,…。所谓枚举是按照四种假定逐一地去测试四个人的话有几句是真话,如果不满足三句为真,就否定掉这一假定,换下一个状态再试。
具体做法如下:null(1)假定让 thisman = ‘A’ 代入四句话中四个关系表达式的值的和为1,显然不是‘A’做的好事null(2)假定让 thisman = ‘B’ 代入四句话中四个关系表达式的值的和为2,显然不是‘B’做的好事null(3)假定让 thisman = ‘C’ 代入四句话中四个关系表达式的值的和为3,就是‘C’做的好事null 综上所述一个人一个人去试,就是枚举。
从编写程序看,实现枚举最好用
循环结构
nullfor (k=1; k<=4; k=k+1)
// 计数型循环,循环的控制变量为k
{ // 循环体开始
thisman = 64+k; // 产生被试者,依次为’A’,’B’,’C’,’D’
// 赋值给thisman
sum = ( thisman!=’A’ ) // 测试’A’的话是否为真
+( thisman==’C’ ) // 测试’B’的话是否为真
+( thisman==’D’ ) // 测试’C’的话是否为真
+( thisman !=‘D’ ) ; // 测试’D’的话是否为真
…
} // 循环体结束
nullfor ( k=1; k<=4; k=k+1 )
{
thisman = 64+k;
sum = ( thisman!= ’A’ )
+( thisman==’C’ )
+( thisman==’D’ )
+( thisman !=‘D’ ) ;
…
}
nullfor ( k = 1; k <= 4 ; k = k+1 )
{
if (((k!=1)+(k==3)+(k==4)+(k!=4))==3)
printf("做好事者为 %c", char(64+k)) ;
}
A说 B说 C说 D说 null某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:
A、B 至少有一人作案;
A、E、F 三人中至少有两人参与作案;
A、D 不可能是同案犯;
B、C 或同时作案,或与本案无关;
C、D 中有且仅有一人作案;
如果 D 没有参与作案,则 E 也不可能参与作案。
试编一程序,将作案人找出来。任务 2null 1,A和B至少有一人作案 cc1=A || B
2,A和D不可能是同案犯 cc2=!(A && D)
3,A,E,F中至少有两人涉嫌作案
cc3=(A && E )|| (A && F )|| (E && F )
4,B和C或同时作案或都与本案无关 cc4=(B && C)||(!B && !C)
5,C,D中有且仅有一人作案; cc5=(C && !D)||(D && !C)
6,如果D没有参与作案,则E也不可能参与作案; cc6=D || (!E)
null为了讲多重循环先做些铺垫
编一个程序输出
000000
000001
000010
. . . . . .
111111
从高位到低位,分别用ABCDEF来表示nullnull 写一个从000000到111111的程序
for( A=0;A<=1;A=A+1)
for( B=0;B<=1;B=B+1)
for( C=0;C<=1;C=C+1)
for( D=0;D<=1;D=D+1)
for( E=0;E<=1;E=E+1)
for( F=0;F<=1;F=F+1)
{ cout<
RAND_MAX在stdlib.h中定义,不大于双字节整数的最大值32767
产生[0,RAND_MAX] 之间的随机数
magic = rand();
产生[0,b-1] 之间的随机数
magic = rand()%b;
产生[a,a+b-1] 之间的随机数
magic = rand()%b + a;
现场编程完成例4.6,发现问题猜数游戏用到的库函数猜数游戏用到的库函数随机函数srand
为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的 “随机化”
通过键入随机数种子,产生[1,100]之间的随机数
scanf("%u", &seed);
srand(seed);
magic = rand() % 100 + 1; 猜数游戏用到的库函数猜数游戏用到的库函数随机函数srand
为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的 “随机化”
使用计算机读取其时钟值并把该值自动设置为随机数种子,产生[1,100]之间的随机数
函数time()返回以秒计算的当前时间值,该值被转换为无符号整数并用作随机数发生器的种子
#include
srand(time(NULL));
magic = rand() % 100 + 1; 死循环死循环永远不会退出的循环为死循环
for (;;)
{}
while (1)
{}
do
{
}while (1)
一般情况下,要极力避免死循环
绝大多数程序不需要死循环。如果出现,往往都是bug
时间过长的循环会造成“假死”效果,也要考虑解决现场编程完成例4.11 现场编程完成例4.11 国王的许诺。相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。
位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第一个格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上的64个格子,我就感恩不尽了。
舍罕王让人扛来一袋麦子,他要兑现他的许诺。
国王能兑现他的许诺吗?试编程计算舍罕王共要多少麦子赏赐他的宰相,这些麦子合多少立方米?
(已知1立方米麦子约1.42e8粒)
总粒数为:sum=1+2+22+23+…+263 方法1方法1#define CONST 1.42e8
#include
#include
main()
{
int n;
double term, sum = 0; /*累加求和变量赋初值*/
for (n=1; n<=64; n++)
{
term = pow(2, n-1); /*根据累加项的规律计算累加项 */
sum = sum + term; /*作累加运算*/
}
printf("sum = %e\n", sum); /*打印总麦粒数*/
printf("volum = %e\n", sum/CONST);/*打印折合的总麦粒体积数*/
} 方法2方法2#define CONST 1.42e8 /*定义符号常量CONST值为1.42e8 */
#include
main()
{
int n;
double term = 1, sum = 1; /*累乘求积、累加求和变量赋初值*/
for (n=2; n<=64; n++)
{
term = term * 2; /*根据后项总是前项的2倍计算累加项*/
sum = sum + term; /*作累加运算*/
}
printf("sum = %e\n", sum); /*打印总麦粒数*/
printf("volum = %e\n", sum/CONST); /*打印折合的总麦粒体积数*/
} 使用嵌套的循环体时,应注意以下问题 使用嵌套的循环体时,应注意以下问题 在嵌套的各层循环体中,使用复合语句(即用一对大花括号将循环体语句括起来)保证逻辑上的正确性
内层和外层循环控制变量不应同名,以免造成混乱
嵌套的循环最好采用右缩进格式书写,以保证层次的清晰性
循环嵌套不能交叉,即在一个循环体内必须完整的包含着另一个循环 合法的嵌套循环合法的嵌套循环现场编程完成例4.14 现场编程完成例4.14 编程输出如下形式的乘法九九表 null#include
main()
{
int m, n;
for (m=1; m<10; m++)
printf("%4d", m); /*打印表头*/
printf("\n");
for (m=1; m<10; m++)
printf(" -");
printf("\n");
for (m=1; m<10; m++)
{
for (n=1; n<10; n++)
{
printf("%4d", m*n);
}
printf("\n");
}
}现场编程完成例4.15现场编程完成例4.15将上例输出格式改成如下的下三角格式打印 null#include
main()
{
int m, n;
for (m=1; m<10; m++)
printf("%4d", m); /*打印表头*/
printf("\n");
for (m=1; m<10; m++)
printf(" -");
printf("\n");
for (m=1; m<10; m++)
{
for (n=1; n<=m; n++)
{
printf("%4d", m*n);
}
printf("\n");
}
}现场编程完成例4.16现场编程完成例4.16马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?
解方程组
穷举法方法1:采用三重循环穷举x,y,z的全部可能的组合 方法1:采用三重循环穷举x,y,z的全部可能的组合 #include
main()
{
int x,y,z;
printf("Man \t Women \t Childern\n");
for (x=0; x<=30; x++)
for (y=0; y<=30; y++)
for (z=0; z<=30; z++)
if (x+y+z==30 && 3*x+2*y+z==50)
printf("%3d \t %5d \t %8d\n",x,y,z);
} 方法2:改进算法 方法2:改进算法 #include
main()
{
int x,y,z;
printf("Man \t Women \t Childern\n");
for (x=0; x<=16; x++)
for (y=0; y<=25; y++)
{
z = 30 – x - y;
if (3 * x + 2 * y + z == 50)
printf("%3d \t %5d \t %8d\n",x,y,z);
}
} 流程的转移控制 流程的转移控制 break语句
continue语句
goto语句
return语句
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
库函数exit() break和continuebreak和continue对for、while、do-while循环进行内部手术
break,退出循环
continue,中断此次循环体的执行,开始下一次
break和continue少用为妙break和continuebreak和continuegoto与标号(label)goto与标号(label)标号举例
error:
goto举例
goto error;
一般形式
goto 语句标号;
……
语句标号:……
或
语句标号:……
……
goto 语句标号;exit()函数exit()函数exit(0)
作用是终止整个程序的执行,强制返回操作系统
调用该函数需要嵌入头文件输入一个整数,判断它是否是素数 输入一个整数,判断它是否是素数 方法1方法1#include
main()
{
int m, i, k;
printf("Please enter a number:");
scanf("%d", &m);
k = sqrt(m);
for (i=2; i<=k; i++)
{
if (m%i == 0)
{
printf("No!\n");
goto end;
}
}
printf("Yes!\n");
end:
printf("Program is over!\n");
}Please enter a number:
6
Program is over!No!方法1方法1#include
main()
{
int m, i, k;
printf("Please enter a number:");
scanf("%d", &m);
k = sqrt(m);
for (i=2; i<=k; i++)
{
if (m%i == 0)
{
printf("No!\n");
goto end;
}
}
printf("Yes!\n");
end:
printf("Program is over!\n");
}Please enter a number:
5
Program is over!Yes!方法2方法2#include
main()
{
int m, i, k;
printf("Please enter a number:");
scanf("%d", &m);
k = sqrt(m);
for (i=2; i<=k; i++)
{
if (m % i == 0)
break;
}
if (i > k)
printf("Yes!\n");
else
printf("No!\n");
printf("Program is over!\n");
}Please enter a number:
6
Program is over!No!方法3方法3#include
main()
{
int m, i, k, flag = 1; /*标志变量flag初值置为1*/
printf("Please enter a number:");
scanf("%d",&m);
k = sqrt(m);
for (i=2; i<=k && flag; i++)
{
if (m % i == 0)
flag = 0;
}
if (flag)
printf("Yes!\n");
else
printf("No!\n");
printf("Program is over!\n");
}这个程序是做什么的?这个程序是做什么的?#include
main()
{
int m, i, k, flag = 1; /*标志变量flag初值置为1*/
printf("Please enter a number:");
scanf("%d",&m);
k = sqrt(m);
for (i=2; i<=m-1; i++)
{
if (m % i == 0)
flag = 0;
printf("%d\n", i);
}
if (flag)
printf("No divisor!It is a prime number.\n");
printf("Program is over!\n");
}Dijkstra和 gotoDijkstra和 gotoE. W. Dijkstra,生于1930年,卒于2002年8月6日
软件体系结构,结构化程序设计,……
Dijkstra和 gotoDijkstra和 gotoDijkstra早在1968年就指出:
“Goto considered harmful” ,
“I became convinced that the go to statement should be abolished from all "higher level" programming languages.”
“The go to statement … is too much an invitation to make a mess of one's program. ”糟糕的goto糟糕的gotoSTART_LOOP:
if (fStatusOk) {
if (fDataAvaiable) {
i = 10;
goto MID_LOOP;
} else {
goto END_LOOP;
}
} else {
for (i = 0; i < 100; i++) {
MID_LOOP:
// lots of code here
… …
}
goto START_LOOP;
}
END_LOOP:糟糕的goto糟糕的gotoSTART_LOOP:
if (fStatusOk) {
if (fDataAvaiable) {
i = 10;
goto MID_LOOP;
} else {
goto END_LOOP;
}
} else {
for (i = 0; i < 100; i++) {
MID_LOOP:
// lots of code here
… …
}
goto START_LOOP;
}
END_LOOP:Dijkstra和 gotoDijkstra和 goto现代观点认为:
混乱根源不在goto,而在标号
任何程序都可以不用goto就实现其功能
但在某些情况下,使用goto可以让程序更清晰使用goto的原则使用goto的原则使用之后,程序仍然是单入口,单出口
不要使用一个以上的标号
不要用goto往回跳,要向下跳
不要让goto制造出永远不会被执行的代码Dijkstra说过的话Dijkstra说过的话编程的艺术就是处理复杂性的艺术
优秀的程序员很清楚自己的能力是有限的,所以他对待编程任务的态度是完全谦卑的,特别是,他们会象逃避瘟疫那样逃避 “聪明的技巧”。——1972年图灵奖演讲
简单是可靠的先决条件
我们所使用的工具深刻地影响我们的思考习惯,从而也影响了我们的思考能力这一章我们学习了这一章我们学习了算法的描述方法
流程图
与基本控制结构相应的结构化的控制语句
if-else
switch
for
while
do-while
break
continue
常用算法,如累加、累乘、统计、递推、迭代、穷举等这一章我们学习了这一章我们学习了常用算法
求阶乘:
数据类型的定义, long或double
求累加和: long
统计:
统计正数、平均分以上、n个成绩中100~90、89~80、79~70、69~60、<60的人数;输入字符串中字母d的个数
设置一个计数变量k:初始化为1,每遇到一次将其加1:k++;这一章我们学习了这一章我们学习了累加和
存放累加和的变量:
初始化为0或第一项,再循环加每一项;
循环控制:
前n项之和—已知循环次数,可设置一个循环变量如i来控制;
加到某一项或累加和满足一定条件。例:
1+2+...+n 与 1+3+5+7+.…和 2+4+6+8+.…及12+32+52+72+....
输入n或累加和大于2000的最小的n这一章我们学习了这一章我们学习了累加的项较复杂时,得专门求,例:
前后项之间无关
1m+3m +5m +7m +.…
π/4=1-1/3+1/5-1/7+...直到最后一项的绝对值小于10-6为止
前后项之间有关
1!+2!+...+n!
x0+x1 +x2+x3+.…
1+1+2+3+5+8+13+21+...
2/1+3/2+5/3+8/5+13/8+21/13+...
a+aa+aaa+aaaa+aaaaa+....a是一个数字,例a=2,2+22+222+2222+....