1第3章基本结构程序设计主要内容:c语言的基本语句、程序的基本结构。c语句按照一定的顺序排列就可以构成解决某个问题的程序。3.1基本程序结构和结构化程序设计程序=数据结构+算法数据结构:指对数据(操作对象)的描述。算法:指对操作步骤的描述。编写程序就是作菜:菜谱=原料+做法编写程序的本质:对哪些数据进行什么样的一系列加工就可以达到目标。做菜的本质:对哪些菜进行什么样的一些列加工就可以吃了。23.1.1算法算法:是解决问题的一系列操作步骤的集合。程序员必须告诉计算机先做什么,再做什么……例3.1求解一元二次方程ax2+bx+c=0(a≠0)的两个根。步骤:s1:输入数据a,b,cs2:求根x1,x2s3:输出结果可以将求解算法(s2)进行细化:s2_1:求判别式d的值,d=b*b-4*a*cs2_2:判断:如果d=0,则按实根求法计算:x1=(-b+sqrt(d))/(2*a)x2=(-b-sqrt(d))/(2*a)否则,按复根求法计算:实部r=-b/(2*a)虚部p=±sqrt(-d)/(2*a)3例3.2依次读入30个学生成绩,输出平均成绩及最高成绩。具体算法描述:s1:0=is2:0=sum,0=maxs3:读入一个学生成绩存入scores4:i+1=is5:sum+score=sums6:如果score大于max,则score=maxs7:如果i小于30,转移至s3s8:sum/30=averages9:打印average,maxs3,s4,s5,s6,s7这些步骤会被重复执行30次,变量i用于统计已处理的学生人数。当i值小于30时,流程转至s3读下一个学生成绩;当i值等于30时,所有学生成绩处理完毕,到s8,s9输出结果。4算法的特性:算法是解决问题逻辑思路的表述。同一个问题有不同的解题方法和步骤,设计出不同的算法。正确的算法应该具备的特性:1)有穷性:包含有限的操作步骤,不能无限制地执行下去;2)确定性:算法中所描述的每个步骤都应该是明确的;3)有若干个输入数据(0---n)输入是指在算法执行过程中需要用户输入的信息;4)有若干个输出数据(1---n)一般地,算法都有一个或多个输出数据,因为设计算法的目的就是进行数值运算或进行某种数据处理,给用户输出处理结果是必然的要求。5)有效性在一个算法中,要求每个步骤都能被有效地执行。53.1.2算法的表示用自然语言表述容易产生“二义性”。常用表示方法:流程图、结构图、伪代码、PAD图。流程图:用图形符号配合文字说明表示各种操作,形象直观,容易理解。起止框处理框判断框输入输出框流程线连接点例3.2的流程图P32图3.263.1.3程序的三种基本结构过多的无规律转移会导致可读性和可维护性下降,对软件的质量有巨大影响。为了提高算法质量,必须限制流程的随意转向,但在算法中难免要包含必要的分支和循环。1966年,Bohm和Jacopini证明,只用三种基本结构就可以编写所有程序。顺序:程序按照书写顺序执行选择(分支):根据条件选择一路分支执行循环:重复执行一组操作7AB流程图顺序结构:8选择结构:PAB真假二分支选择结构多分支选择结构kA1A2AiAnk=k2k=k1k=knk=ki......9循环结构:当型循环结构PA假真直到型循环结构AP真假两者的区别:直到型循环的循环体至少会被执行一次,而当型循环的循环体有可能不被执行。10关于三种基本结构的说明:(1)三种结构的共同特点:只有一个入口和一个出口;(2)三种结构中的A,B操作是广义的,可以是一个操作,也可以是另一个基本结构或几种基本结构的组合;113.1.4结构化程序设计方法如何设计正确的算法,写出结构清晰的程序?基本思想:把一个复杂问题的求解过程分步进行,后一步在前一步的基础上细化,这样每步所考虑的子问题都相对易于理解和处理。概括为:自顶向下,逐步求精。P40图3.7注意:素数的判定算法存在两个出口。123.2顺序结构程序设计3.2.1顺序执行语句概述C程序是由语句组成,每个语句以分号结束。顺序结构的程序会按照语句书写的顺序执行。语句分类:⃟控制语句:控制程序执行流程,不属于顺序结构语句⃟表达式语句:如a=b+c+d;任何表达式末加分号就是表达式语句⃟函数调用语句:调用函数⃟空语句:执行空操作(只有一个分号)⃟复合语句:执行一组语句,用{}把一些语句括起来,相当于一个语句133.2.2数据的输入输出输入:将数据送入计算机输出:将计算机处理的结果数据送出保存或显示出来。C语言中,数据输入/输出是由库函数完成。使用库函数时,用预编译命令将有关“头文件”包括到源文件中。◆标准输入输出库函数:“stdio.h”文件◆源文件开头应有以下预编译命令:#includestdio.h或#includestdio.h(p325)141.putchar函数(字符输出函数)格式:putchar(c)参数:c为字符常量、变量或表达式功能:把单个字符c输出到显示器上#includestdio.hmain(){intc;chara;c=65;a='B';putchar(c);putchar('\n');putchar(a);}结果:AB例putchar(‘B’);putchar(x);putchar(‘\102’);putchar(‘\n’);//’\ddd’(八进制表示的字符常量)15输出结果:34a=3,b=4例inta=3,b=4;printf(“%d%d\n”,a,b);printf(“a=%d,b=%d\n”,a,b);例chara=‘3’,b=‘4’;printf(“%c%c\n”,a,b);printf(“%d%d\n”,a,b);printf(“a=%c,b=%c\n”,a,b);输出结果:345152a=3,b=4输出表列:要输出的数据(可以没有,多个时以“,”分隔)格式控制串:包含两种信息◆格式说明:%[修饰符]格式字符,用于指定输出格式◆普通字符或转义序列:原样输出格式字符★d格式符:按十进制格式输出★f格式符:按实数格式输出★c格式符:以字符形式输出一个字符例floata=3.14,b=2.1828;printf(“%f%f\n”,a,b);printf(“a=%f\nb=%f”,a,b);输出结果:3.1400002.182800a=3.140000b=2.182800格式:printf(“格式控制字符串”,输出表列)功能:按指定格式向显示器输出数据返值:正常,返回输出字节数;出错,返回EOF(-1)说明:标准库函数,函数原型在头文件“stdio.h”中2.printf函数(格式输出函数)16printf中的格式字符:d,o,x(X),u,f,e(E),g(G),c,s在%和格式字符之间可以使用附加字符:1)字符l,用于长整型数据的输出,可以用在d,o,x,u之前2)整数m,指定数据最小的输出宽度,若实际位数大,则按实际位数输出,若实际位数小,则在输出的左侧加空格3).n(n为十进制整数),用于限制e和f格式字符,指定输出的小数位数;也可用于字符串,表示截取的字符个数4)负号-,指定输出的数字或字符串在指定宽度内左对齐例:printf(“%d”,90);printf(“%6d”,90);输出结果:9090例:x=234.5622;printf(“%.2f”,x);输出结果:234.56例:printf(“%d”,90);printf(“%-6d,”,90);输出结果:9090,17printf函数使用说明:1)根据要输出数据的类型决定使用的格式字符串,且格式控制字符串中格式字符串和各输出项的数量要一致,类型要一一对应。2)同一个数据用不同的格式输出将得到不同的显示结果。3)在0~128范围内,%d输出的是整数值,%c输出的是该整数值对应的ASCII码字符。4)输出列表的求值顺序,TC和VC都是从右到左。例:i=5;printf(“%d%d\n”,i++,i);printf(“%d”,i);输出结果:55618格式:getchar()功能:从键盘读一字符返值:正常,返回读取的代码值;出错,返回EOF(-1)3.getchar函数(字符输入函数)例#includestdio.hvoidmain(){intc;printf(Enteracharacter:);c=getchar();printf(%c,c);}运行结果:Enteracharacter:ABCA注意:getchar函数只能输入一个字符,当输入多个字符时,只取第一个。19格式:scanf(“格式控制串”,地址表)功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束返值:正常,返回输入数据个数说明:标准库函数,函数原型在头文件“stdio.h”中地址表:变量的地址,用取地址运算符&格式字符:d,o,x,u,f,e,c,s4.scanf函数(格式输入函数)例inta;scanf(“%d”,&a);输入:10则a==1010&a20附加字符:1)符号*,表示该输入项读入后不赋予相应的变量,即跳过该输入值。2)宽度,用十进制整数指定输入的宽度(即字符数)。3)长度,l表示输入长整型数据(%ld,%lo,%lx)和双精度浮点数(%lf,%le),h表示输入短整型数据。例:scanf(“%d%*d%d”,&a,&b);printf(“a=%db=%d”,a,b);运行结果:123a=1b=3例:scanf(“%5d”,&a);printf(“a=%d”,a);运行结果:12345678a=1234521scanf函数使用说明:1)没有精度控制,scanf(“%5.2f”,&a)是错误的。2)要求给出变量地址,不能是变量名。即scanf(“%d”,&a),不能是scanf(“%d”,a)。3)输入多个数据时,若格式控制串中没有非格式字符作为间隔,可用空格、TAB或回车键作间隔。C语言中当输入过程碰到非法数据时也认为该数据结束。4)输入字符数据时,若格式控制字符串中没有非格式字符,则认为所有输入的字符均为有效字符。5)如果格式控制串中有非格式字符,则输入时必须在相应位置输入该非格式字符。例:scanf(“%d”,&a);printf(“%d”,a);运行结果:12a12例:scanf(“%c%c”,&a,&b);printf(“%c%c,”,a,b);运行结果:121,例:scanf(“%c:%c”,&a,&b);printf(“%c%c”,a,b);运行结果:1:21222#includestdio.h#includemath.hmain(){floata,b,c,s,area;printf(inputa,b,c:);scanf(%f,%f,%f,&a,&b,&c);s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));printf(area=%7.2f\n,area);}例3.9输入三角形边长,求面积inputa,b,c:3,4,6area=5.33说明:1)先考虑定义哪些变量。2)输入提示信息,提高交互性。3)math.h头文件4)没有考虑数据有效性,即三角形两边之和大于第三边。23例3.10从键盘上输入一个字符,求出它的前导与后继字符,然后按由小到大的顺序输出这些字符及ASCII编码。注意:①字符的输入/输出函数,应包含头文件stdio.h②C语言中字符型和整型数据可以互通#includestdio.hmain(){charc;intc1,c2;c=getchar();运行结果:c1=c-1;c2=c+1;Pprintf(%c,%c,%c\n,c1,c,c2);O,P,Qprintf(%d,%d,%d\n,c1,c,c2);79,80,81}243.3选择结构选择结构:根据条件决定执行两组或多组操作中的一组。二路分支if…else…语句多路分支switch语句3.3.1关系运算和逻辑运算条件:是一个关系表达式或者逻辑表达式其结果是逻辑值:真或假用整数