1、中国铁道出版社China Railway Publishing House 解决一个实际问题而采取的方法和步骤,称之为“算法”。对于同一个问题,可能有不同的方法和步骤,即有不同的算法。求1+2+3+4+100=?步骤步骤1:1+2=3步骤步骤2:3+3=6步骤步骤3:6+4=10步骤步骤99:4950+100=5 050步骤步骤1:0+100=100步骤步骤2:1+99=100步骤步骤3:2+98=100步骤步骤50:49+51=100步骤步骤51:100*50=5 000步骤步骤52:5 000+50=5 050算法3步骤1:k=1,s=0步骤2:如果k100,则算法结束,s即为所求的和,输
2、出s;否则转向步骤3步骤3:s=s+k,k=k+1步骤4:转向步骤2当然,算法也有优劣之分,有的算法较简练,而有的算法较烦琐。上面三个算法中,算法2比算法1步骤少,算法3比算法2步骤少,算法3的质量最优。一般地说,希望采用方法简单、运算步骤少的方法。顺序结构的程序是按语句的书写顺序执行的,用图3-2表示 选择结构或称分支结构、条件结构,用图3-3表示 循环结构又称重复结构,有两种方式:一种是先判断条件,若条件成立再进入循环体,可用图3-4表示;另一种是先进入循环体执行,再判断条件是否成立。可用图3-5表示。1973年美国的计算机科学家INassi和BShneiderman提出了一种新的流程图形
3、式。在这种流程图中把流程线完全去掉了,全部算法写在一个矩形框内,在框内还可以包含其他框,即由一些基本的框组成一个较大的框。这种流程图称为N-S结构流程图(以两人名字的头一个字母组成)。伪代码(pseudo code)是用介于自然语言和计算机语言之间的文字和符号来表示算法,即计算机程序设计语言中具有的语句关键字用英文表示,其他的可用汉字,也可用英文,只要便于书写和阅读就可。用计算机语言描述算法必须严格遵循所用语言的语法规则#includevoid main()int sign,i,n;float sum;printf(n Please input an integer to n:);scanf(
4、%d,&n);sign=1;sum=1;i=1;while(ia+b 若a=3,b=4,c=9 则结果为1 a=bc 若b=4,c=9 则a的值为0 两个数值进行比较,是比较其数值的大小,两个字符进行比较,是比较其ASCII码值的大小。用逻辑运算符将关系表达式或逻辑表达式连接起来的式子称逻辑表达式。例如,若a=4,b=2,x=6,y=7,则:ab&xy 表达式的结果为0a=b|x=y 表达式的结果为0!a|ab 表达式的结果为1(1)在C语言中规定:非零为“真”,“真”用1表示;零为“假”,“假”用0表示。例如:a&b 其结果为1 !5.34 其结果为0(2)对逻辑表达式的求解,并不是所有的逻
5、辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。运行下面的程序四次,若分别输入0 0 0,1 0 1,1 2 3,1 0 0,分别写出其对应的输出结果。在Visual C+6.0环境下运行,若输入0 0 0 其输出为:e=0,a=1,b=-1,c=0a=2,b=-2,c=1,e=1,a=2,b=-2,c=1e=1,a=2,b=-3,c=0a=2,b=-3,c=-1,e=1在Turbo C2.0环境下运行,若输入0 0 0 其输出为:e=0,a=0,b=0,c=0a=2,b=-2,c=1,e=1,a=2,b=-2,c=1e=1,a=2,b=-2,c=1a=2
6、,b=-3,c=-1,e=1C语言提供了两种格式:该语句的功能是:首先计算表达式的值,然后判断表达式的值是否为非零(真),若为非零(真),则执行语句。其执行过程见图3-22所示【例3.7】输入一个字符c,若c是字母,则输出“Yes!”。#include void main()char c;c=getchar();if(c=a&c=A&c=Z)printf(Yes!);运行情况如下:xYes!该语句的功能是:首先计算表达式的值,然后判断表达式的值是否为非零(真),若非零(真),则执行语句1,否则执行语句2。其执行过程下图【例3.9】输入两个数并判断两数是否相等。1.if后面的表达式可以为任何类型
7、的表达式,只要表达式的结果为非零,则表示条件成立,否则表示条件不成立。2if语句中的语句1,语句2可以是一条语句,也可以是由构成的一个复合语句,如果在该语句处需要写多条语句才能完成所必要的功能时,就使用复合语句的形式。3在格式2中的else前面的语句必须要有一个分号,整个语句结束处有一个分号。如例3.9中的if语句。【例3.11】编写程序,求下列分段函数的值。:C语言规定:else总是与它上面最近的且又没有配对的if语句进行配对。#include stdio.h#include void main()void main()int int score;score;char grade;char
8、grade;printf(please printf(please input a score input a score:n);n);scanf(%d,&score scanf(%d,&score););grade=score=90?A:(score grade=score=90?A:(score=60?B:C);=60?B:C);printf(%d belongs to%c,score,grade printf(%d belongs to%c,score,grade););运行结果如下:运行结果如下:please input a score please input a score:595
9、9 59 belongs to C59 belongs to C switch语句属于多分支结构语句,通常用于描述有多种情况语句属于多分支结构语句,通常用于描述有多种情况的选择,其格式如下:的选择,其格式如下:switch(表达式表达式)case 常量表达式常量表达式1:语句语句1;case 常量表达式常量表达式2:语句语句2;case 常量表达式常量表达式n:语句语句n;default:语句语句(n+1);图3-29 用嵌套的if语句求一元二次方程的解 (1)goto语句以及用goto语句构成的循环(2)用while 语句(3)用do-while 语句(4)用for 语句goto语句为无条件
10、转向语句,其格式为 通常在两种情况下使用goto语句:(1)与if语句一起构成循环结构;(2)从循环体中跳转到循环体外,但在C语言中可以用break语句和continue语句跳出本层循环和结束本次循环。while 语句又称当循环语句,其一般的形式如下:;while 语句的执行过程:第1步:计算表达式的值,若表达式的值为真(非0),则执行第二步,若表达式的值为假(值为0),则转到第四步执行。第2步:执行循环体语句,循环体语句可以是简单的一条语句,也可以是由多条语句构成的复合语句。第3步:转到第一步执行。第4步:结束循环,执行while语句后的第一条语句。do-while循环语句又称直到型循环语句
11、,但是与Pascal语言中的repeat-until语句又有所不同。C语言中do-while语句的格式:i=1 sum=0 sum+=i i=i+2 当 i=100 输出 sum 求解表达式1 当表达式2 为真 执行循环体语句 求解表达式3 执行for 语句的下一条语句 图3-35 for语句的执行图解 break语句格式:break;break语句的作用是从最内层的switch、for、while或dowhile语句中跳出,终止这些语句的执行,把控制流程转移到被中断的循环语句(或者switch语句)后去执行。通过使用break语句,可以不必等到循环或switch语句执行结束,而是根据情况,提
12、前结束这些语句的执行。continue语句的形式:continue;continue;其作用是提前结束本次循环,即跳过循环体中那些尚未执行的语句,紧接着进行下一次是否执行循环的判断。表达式 1 语句 1 continue 表达式 2 语句 2 while 循环的下一语句 假 真 真 假 从键盘输入整数,显示出其中的正整数,若输入的是0,则退出。#include void main()int x;do scanf(%d,&x);if(x0)continue;printf(%dn,x);while(x!=0);下面程序的作用是求连续的奇数和,当奇数和刚好超过1000时停止计算,并按运行结果输出。程
13、序中有两空,请补充完整,使之能实现上述功能。#include void main()int i,sum=0;for(i=1;i+)if(i%2=0)continue ;sum+=i;if(sum1000)break ;printf(1+3+5+%d=%dn,i,sum);【例【例3.36】利用格里高利公式求】利用格里高利公式求。计算计算的公式为:的公式为:直到最后一项的值小于直到最后一项的值小于10-6为止。为止。【例【例3.36】的程序清单】的程序清单 【例【例3.37】的程序清单】的程序清单 【例【例3.37】程序】程序【例【例3.38】编程打印楼梯,同时在楼梯上方打印两个笑脸。用音符代表
14、台阶,如图3-42所示。笑脸和音符可用字符来表示,通过查询ASCII码表得知,笑脸的ASCII值是1,音符的ASCII值是14。【例【例3.38】【例【例3.39】输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。分析:对于输入的单个字符,要学会判断是英文字母(AZ或者az),是阿拉伯数字字符(09)还是其它字符的技巧。#include void main()char c;int letters=0,space=0,digit=0,others=0;printf(please input some characters:n);while(c=getchar()!=n)if(c=
15、a&c=A&c=0&c=9)digit+;else others+;printf(all in all:char=%d space=%d,digit=%d,others=%dn,letters,space,digit,others);【例【例3.39】的程序清单】的程序清单【例【例3.40】输入整数xt=x*(x-1)+1for(i=1;i=x-1;i+)printf(%d+,t)t=t+2printf(%d=%d,t,x*x*x)【例【例3.40】程序清单如下:#include void main()int i,x,t;scanf(%d,&x);printf(n);t=x*(x-1)+1;for(i=1;i=x-1;i+)printf(%d+,t);t=t+2;printf(%d=%dn,t,x*x*x);第3章内容结束