第3讲第3章顺序结构程序设计3.1程序设计概述3.2C语言语句3.3格式化输出函数printf()3.4格式化输入函数scanf()3.5单个字符的输入/输出函数3.6顺序程序设计举例3.1程序设计概述3.1.1算法的概念简单地说,程序的功能就是进行数据加工。程序通常包括两方面的内容:对数据的描述和对加工的描述对数据的描述称为“数据结构”,对加工的描述称为“算法”广义地说,为解决某一个问题而采取的方法和步骤,就称为“算法”。在计算机科学中,算法是指描述用计算机解决给定问题的过程。例如,计算1+2+3+…+1000的算法可表示为例如,计算1+2+3+…+1000的算法可表示为步骤1:0s;步骤2:1i;步骤3:s+is;步骤4:i+1i;步骤5:如果i≤1000,转到步骤3,否则结束。在上面的算法中,符号s、i表示变量,符号“”表示给变量赋值。步骤1和步骤2表示给变量s和i赋初始值为0和1;步骤3将变量i的当前值累加到变量s中;步骤4使变量i在原值的基础上增加1;步骤5判断i的值如果小于等于1000,重复做步骤3和步骤4,构成一个循环,而当i的值不小于等于1000时,循环结束,这时,变量s的值就是要求的计算结果。3.1.2算法的特征通常,一个算法必须具备以下五个基本特征:(1)有穷性。一个算法必须在它所涉及的每一种情形下,都能在执行有限次的操作之后结束。(2)确定性。算法的每一步,其顺序和内容都必须严格定义,而不能有任何的歧义。(3)有零个或多个输入。输入是算法实施前需要从外界取得的信息,有些算法需要有多个输入,而有些算法不需要输入,即零个输入。(4)有一个或多个输出。输出就是算法实施后得到的结果,显然,没有输出的算法是没有意义的。(5)可行性。算法的每一步都必须是可行的,也就是说,是能够由计算机执行的。3.1.3算法的描述1.用自然语言描述自然语言就是人们日常使用的语言,前面的算法就是用自然语言表示的。用自然语言表示算法,通俗易懂。但是,自然语言表示的含义往往不太严格,要根据上下文才能判断它的正确含义。另外,用自然语言描述分支和循环不很方便。因此,除对简单的问题使用以外,一般不用自然语言描述算法。计算机该用何种形式来描述问题更为简洁、明了?2.用流程图描述传统的流程图由图3-1所示的几种基本元素组成。用流程图描述算法,形象直观,简单方便。例如,前面的算法用流程图可表示为如图3-2所示。图3-1流程图基本元素起止框输入/输出框处理框判断框流程线图3-2计算1+2+3+…+1000的算法流程图开始0=>s1=>is+i=>si+1=>ii<=1000输出s结束成立不成立3.用N-S流程图描述算法传统的流程图用流程线和流程元素表示各个处理的执行顺序,但对流程线的使用没有严格的规定,因此,使用者可以不受限制地使流程转来转去,这样的流程图使人难以理解算法的逻辑。为了解决这个问题,规定了算法的三种基本结构:顺序结构分支结构循环结构用这些基本结构按一定的规律组成一个算法,这样的算法称为结构化算法。按照结构化算法编写的程序称为结构化程序。为了设计结构化算法,1973年,美国学者I.Nassi和B.Shneiderman提出一种新的流程图,称为N-S流程图。N-S流程图的基本符号如图3-3所示。图3-3N-S流程图基本符号操作A操作B顺序结构操作A操作B成立不成立条件p分支结构操作A当条件p成立操作A直到条件p成立当型循环直到型循环循环结构图3-4计算1+2+3+…+1000算法的N-S图0=>s1=>is+i=>si+1=>i直到i>1000输出s3.1.4结构化程序设计方法结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。结构化程序设计的基本思路是:把一个复杂问题的解决过程分阶段进行每一个阶段处理的问题都控制在人们容易理解和处理的范围内是在分析问题时采用“自顶向下,逐步细化”的方法“自顶向下,逐步细化”是对问题的解决过程逐步具体化的一种思想方法。例如,要在一组数中找出其中的最大数,首先,可以把问题的解决过程描述为(1)输入一组数。(2)找出其中的最大数。(3)输出最大数。以上三条中,第(1)、(3)两步比较简单,对第(2)步可以进一步细化:(1)任取一数,假设它就是最大数。(2)将该数与其余各数逐一比较。(3)若发现有任何数大于假设的最大数,则取而代之。再对以上过程进一步具体化,得到如下算法:(1)输入一组数。(2)找出其中的最大数。①令max=第一个数。②将第二个数到最后一个数依次取出。③比较x与max的大小,如果xmax,则令max=x。(3)输出max。“模块化设计”就是将比较复杂的任务,分解成若干个子任务每个子任务又分解成若干个小子任务每个小子任务只完成一项简单的功能在程序设计时,用一个个小模块来实现这些功能,每个小模块对应一个相对独立的子程序。对程序设计人员来说,编写程序也就变得不再困难。“结构化编码”指的是使用支持结构化方法的高级语言编写程序。C语言就是一种支持结构化程序设计的高级语言,它直接提供了三种基本结构的语句;提供了定义“函数”的功能,函数相当于独立的子程序。另外,还提供了丰富的数据类型。这些都为结构化设计提供了有力的工具。3.2C语言语句C语言程序是由函数构成的,而函数又是由函数说明和函数体两部分组成,其中,函数体是函数的核心。与其他高级语言一样,C语言也是利用函数体中的可执行语句,向计算机系统发出操作命令。按照语句功能或构成的不同,可将C语言语句分为如下五类:控制语句\函数调用语句\表达式语句\空语句\复合语句1.控制语句控制语句完成一定的控制功能。C语言只有9条控制语句,又可细分为三种:(1)选择结构控制语句:if()…else…,switch()…(2)循环结构控制语句:do…while(),for()…,while()…,break,continue(3)其他控制语句:goto,return2.函数调用语句函数调用语句由一次函数调用加一个分号(语句结束标志)构成。例如:printf(ThisisaCProgram.);3.表达式语句表达式语句由表达式后加一个分号构成。表达式能构成语句是C语言的一大特色。最典型的表达式语句是在赋值表达式后加一个分号构成的赋值语句。例如,“num=5”是一个赋值表达式,而“num=5;”却是一个赋值语句。4.空语句空语句仅由一个分号构成。显然,空语句什么操作也不执行。5.复合语句复合语句由大括号括起来的一组(也可以是一条)语句构成。例如:说明:(1)在语法上,复合语句和简单语句相同,即简单语句可以出现的地方,都可以使用复合语句。(2)复合语句可以嵌套,即复合语句中也可包含一个或多个复合语句。main(){{inta=1,b;b=a*a-1;复合语句printf(%d,b);}/*注意:右括号后不需要分号*/}3.3格式化输出函数printf()程序运行中,有时候需要从外部设备(例如键盘)上得到一些原始数据,程序计算结束后,通常要把计算结果发送到外部设备(例如显示器)上,以便人们对结果进行分析。我们把程序从外部设备上获得数据的操作称为“输入”,而把程序发送数据到外部设备的操作称为“输出”。不像其他的高级语言,C语言没有专门的输入/输出语句,输入/输出的操作是通过调用C语言的库函数来实现的。printf()函数就是最常用的输出函数,它的作用是向计算机系统默认的输出设备(一般指显示器)输出一个或多个任意指定类型的数据。3.3.1printf()函数的一般格式调用printf()函数的一般格式为printf(格式字符串,输出表项);例如:printf(radius=%f\nlength=%7.2f,area=%7.2f\n,r,l,a);格式字符串也称格式控制字符串或格式转换字符串,其中可以包含下列三种字符:(1)格式指示符:这些字符用来控制数据的输出格式例如“%f”、“%7.2f”等(2)转义字符:这些字符通常用来控制光标的位置。(3)普通字符:除格式指示符和转义字符之外的其他字符,这些字符输出时原样输出例如上面例子中的“radius=”等printf(radius=%f\nlength=%7.2f,area=%7.2f\n,r,l,a);输出表项由若干个输出项构成,输出项之间用逗号来分隔,每个输出项既可以是常量、变量,也可以是表达式。有时候,调用printf()函数时,也可以没有输出项。在这种情况下,一般用来输出一些提示信息,例如:printf(Hello,world!\n);3.3.2格式指示符格式指示符的一般形式为%[修饰符]格式字符1.格式字符printf函数中常用的格式字符如表3-1所示。表3-1常用的格式字符格式字符说明举例输出结果d带符号十进制整数格式printf(%d,10);10printf(%d,'A');65u无符号十进制整数格式printf(%u,10);10printf(%u,'A');65x或X无符号十六进制整数格式printf(%x,10);aprintf(%x,'A');41printf(%X,10);Ao无符号八进制整数格式printf(%o,10);12printf(%o,'A');101c字符格式printf(%c,10);换行printf(%c,'A');Af小数格式printf(%f,1.2345);1.234500e或E指数格式printf(%e,1.2345);1.23450e+00printf(%E,1.2345);1.23450E+00g或G小数形式或指数形式,使输出宽度最小,不输出无意义的0printf(%g,1.2345);1.2345printf(%g,0.000001);1e-06printf(%G,0.000001);1E-06%输出%printf(%%);%s输出字符串printf(%s,abcde);abcde2.长度修饰符长度修饰符“l”加在%号和格式字符之间。输出长整型数据的时候,一定要加长度修饰符,否则,得不到正确的显示结果。例如:longx=7654321;printf(x=%ld\n,x);输出结果为:x=7654321。3.宽度修饰和精度修饰可以在%号和格式字符之间加入形如“m.n”(m、n均为整数)的修饰。其中,m为宽度修饰,n为精度修饰。宽度修饰用来指定数据的输出宽度精度修饰对不同的格式字符,n作用不同:对于格式字符f,用来指定输出小数位的位数;对于格式字符e,用来指定输出有效数字的位数;对于格式字符d,用来指定必须输出的数字的个数。相关的例子如表3-2所示。表3-2宽度修饰和精度修饰示例输出语句输出结果(□表示空格)printf(%5d,42);□□□42printf(%5.3d,42);□□042printf(%.3d,42);042printf(%7.2f,1.23456);□□□1.23printf(%.2f,1.23456);1.23printf(%10.2e,1.23456);□□□1.2e+00printf(%.2e,1.23456);1.2e+004.左对齐修饰在指定了宽度修饰时,如果指定宽度小于数据需要的实际宽度,则数据左边补空格,补够指定的宽度,这种对齐方式称为“右对齐”。当然,也可以在数据的右边补空格来补够指定的宽度,这种对齐方式称为“左对齐”。指定左对齐的时候,使用左对齐修饰符“-”,例如语句:printf(%-7.2f\n,1.23456);输出结果为1.23□□□(右边补三个空格)3.3.3使用说明(1)printf()函数可以输出常量、变量和表达式的值。但格式控制字符串中的格式指示符必须按从左到右的顺序,与输出项表中的每