1、第三章顺序结构程序设计l3.1程序设计概述l3.2C语言语句l3.3格式化输出函数printf()l3.4格式化输入函数scanf()l3.5单个字符的输入/输出函数本讲重点与难点l重点算法的概念、流程图的画法程序的3种基本结构数据的输入输出l难点流程图数据的输入输出语句的运用3.1程序设计概述l3.1.1算法的概念l简单地说,程序的功能就是进行数据加工。程序通常包括两方面的内容:对数据的描述和对加工的描述。对数据的描述称为“数据结构”,对加工的描述称为“算法”。广义地说,为解决某一个问题而采取的方法和步骤,就称为“算法”。在计算机科学中,算法是指描述用计算机解决给定问题的过程。例如,计算1+
2、2+3+1000的算法可表示为l步骤1:0=s;l步骤2:1=I;l步骤3:s+i=s;l步骤4:i+1=I;l步骤5:如果i1000,转到步骤3,否则结束。l在上面的算法中,符号s、i表示变量,符号“=”表示给变量赋值。步骤1和步骤2表示给变量s和i赋初始值为0和1;步骤3将变量i的当前值累加到变量s中;步骤4使变量i在原值的基础上增加1;步骤5判断i的值如果小于等于1000,重复做步骤3和步骤4,构成一个循环,而当i的值不小于等于1000时,循环结束,这时,变量s的值就是要求的计算结果。l3.1.2算法的特征l通常,一个算法必须具备以下五个基本特征:l(1)有穷性。一个算法必须在它所涉及的
3、每一种情形下,都能在执行有限次的操作之后结束。l(2)确定性。算法的每一步,其顺序和内容都必须严格定义,而不能有任何的歧义。l(3)有零个或多个输入。输入是算法实施前需要从外界取得的信息,有些算法需要有多个输入,而有些算法不需要输入,即零个输入。l(4)有一个或多个输出。输出就是算法实施后得到的结果,显然,没有输出的算法是没有意义的。l(5)可行性。算法的每一步都必须是可行的,也就是说,是能够由计算机执行的。l3.1.3算法的描述l1用自然语言描述l自然语言就是人们日常使用的语言,第3.1.1节中的算法就是用自然语言表示的。用自然语言表示算法,通俗易懂。但是,自然语言表示的含义往往不太严格,要
4、根据上下文才能判断它的正确含义。另外,用自然语言描述分支和循环不很方便。因此,除对简单的问题使用以外,一般不用自然语言描述算法。l2用流程图描述l传统的流程图(P19)由图3-1所示的几种基本元素组成。l用流程图描述算法,形象直观,简单方便。例如,例3.1.1节的算法用流程图可表示为如图3-2所示。图3-1 流程图基本元素图3-2 计算1+2+3+1000的算法流程图l3用N-S流程图描述算法l传统的流程图用流程线和流程元素表示各个处理的执行顺序,但对流程线的使用没有严格的规定,因此,使用者可以不受限制地使流程转来转去,这样的流程图使人难以理解算法的逻辑。为了解决这个问题,规定了算法的三种基本
5、结构:顺序结构、分支结构和循环结构(P23)。用这些基本结构按一定的规律组成一个算法,这样的算法称为结构化算法。按照结构化算法编写的程序称为结构化程序。为了设计结构化算法,1973年,美国学者I.Nassi和B.Shneiderman提出一种新的流程图,称为N-S流程图(P26)。N-S流程图的基本符号如图3-3所示。l例3.1节的算法用N-S流程图描述为如图3-4所示。图3-3 N-S流程图基本符号图3-4 计算1+2+3+1000算法的N-S图l3.1.4结构化程序设计方法l结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。结构化程序设计的基本思路是,把一个复杂问题的解决过
6、程分阶段进行,每一个阶段处理的问题都控制在人们容易理解和处理的范围内。具体一点来说,就是在分析问题时采用“自顶向下,逐步细化”的方法;设计解决方案时采用“模块化设计”方法;编写程序时采用“结构化编码”方法。l“自顶向下,逐步细化”是对问题的解决过程逐步具体化的一种思想方法。例如,要在一组数中找出其中的最大数,首先,可以把问题的解决过程描述为l(1)输入一组数。l(2)找出其中的最大数。l(3)输出最大数。l以上三条中,第(1)、(3)两步比较简单,对第(2)步可以进一步细化:l(1)任取一数,假设它就是最大数。l(2)将该数与其余各数逐一比较。l(3)若发现有任何数大于假设的最大数,则取而代之
7、。l再对以上过程进一步具体化,得到如下算法:l(1)输入一组数。l(2)找出其中的最大数。l令max第一个数。l将第二个数到最后一个数依次取出。l比较x与max的大小,如果xmax,则令maxx。l(3)输出max。l“模块化设计”就是将比较复杂的任务,分解成若干个子任务,每个子任务又分解成若干个小子任务,每个小子任务只完成一项简单的功能。在程序设计时,用一个个小模块来实现这些功能,每个小模块对应一个相对独立的子程序。对程序设计人员来说,编写程序也就变得不再困难。同时,同一软件也可以由一组人员同时编写,分别进行调试。这就大大提高了程序开发的效益。l“结构化编码”指的是使用支持结构化方法的高级语
8、言编写程序。C语言就是一种支持结构化程序设计的高级语言,它直接提供了三种基本结构的语句;提供了定义“函数”的功能,函数相当于独立的子程序。另外,还提供了丰富的数据类型。这些都为结构化设计提供了有力的工具。程序的三种基本结构(1)顺序结构。(2)选择结构。根据条件的不同执行不同的分支语句。(3)循环结构。当型循环结构,先判断条件是否成立。直到型循环结构,先执行循环体,再判断条件是否成立。顺序结构程序设计的概念l顺序结构是一种线性结构,其特点是:在该结构中,各操作块(简称块,它所对应的计算机语言表述形式是程序段)按照各自出现的先后顺序,依次逐块执行。l在本讲中,介绍几种最基本的输入输出语句,介绍几
9、个使用基本语句构成的顺序结构的程序。3.2C语言语句lC语言程序是由函数构成的,而函数又是由函数说明和函数体两部分组成,其中,函数体是函数的核心。与其他高级语言一样,C语言也是利用函数体中的可执行语句,向计算机系统发出操作命令。l按照语句功能或构成的不同,可将C语言语句分为如下五类。l1控制语句l控制语句完成一定的控制功能。C语言只有9条控制语句,又可细分为三种:l(1)选择结构控制语句:lif()else,switch()l(2)循环结构控制语句:ldowhile(),for(),while(),break,continuel(3)其他控制语句:lgoto,returnl2函数调用语句l函数
10、调用语句由一次函数调用加一个分号(语句结束标志)构成。例如:lprintf(ThisisaCProgram.);l3表达式语句l表达式语句由表达式后加一个分号构成。l表达式能构成语句是C语言的一大特色。最典型的表达式语句是在赋值表达式后加一个分号构成的赋值语 句。例 如,“num=5”是 一 个 赋 值 表 达 式,而“num=5;”却是一个赋值语句。l4空语句l空语句仅由一个分号构成。显然,空语句什么操作也不执行。l5复合语句l复合语句由大括号括起来的一组(也可以是一条)语句构成。例如:lmain()lllinta=1,b;lb=a*a-1;复合语句lprintf(%d,b);l/*注意:右
11、括号后不需要分号*/lll说明:l(1)在语法上,复合语句和简单语句相同,即简单语句可以出现的地方,都可以使用复合语句。l(2)复合语句可以嵌套,即复合语句中也可包含一个或多个复合语句。3.3格式化输出函数printf()l程序运行中,有时候需要从外部设备(例如键盘)上得到一些原始数据,程序计算结束后,通常要把计算结果发送到外部设备(例如显示器)上,以便人们对结果进行分析。我们把程序从外部设备上获得数据的操作称为“输入”,而把程序发送数据到外部设备的操作称为“输出”。l不像其他的高级语言,C语言没有专门的输入/输出语句,输入/输出的操作是通过调用C语言的库函数来实现的。printf()函数是最
12、常用的输出函数,它的作用是向计算机系统默认的输出设备(一般指显示器)输出一个或多个任意指定类型的数据。ll3.3.1printf()函数的一般格式l调用printf()函数的一般格式为lprintf(格式字符串,输出项表);l例如:lprintf(radius=%fnlength=%7.2f,area=%7.2fn,r,l,a);l格式字符串也称格式控制字符串或格式转换字符串,其中可以包含下列三种字符:l(1)格式指示符:例如“%f”、“%7.2f”等,这些字符用来控制数据的输出格式。l(2)转义字符:这些字符通常用来控制光标的位置。l(3)普通字符:除格式指示符和转义字符之外的其他字符,这些
13、字符输出时原样输出,例如上面例子中的“radius=”等。l输出项表由若干个输出项构成,输出项之间用逗号来分隔,每个输出项既可以是常量、变量,也可以是表达式。有时候,调用printf()函数时,也可以没有输出项。在这种情况下,一般用来输出一些提示信息,例如:lprintf(Hello,world!n);l3.3.2格式指示符l格式指示符的一般形式为l%修饰符格式字符l1格式字符lprintf函数中常用的格式字符如表3-1所示。表3-1 常用的格式字符 格式字符说 明举 例输出结果d带符号十进制整数格式printf(%d,10);10printf(%d,A);65u无符号十进制整数格式print
14、f(%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.
15、2345);1.2345printf(%g,0.000001);1e-06printf(%G,0.000001);1E-06%输出%printf(%);%s输出字符串printf(%s,abcde);abcdel3宽度修饰和精度修饰l可以在%号和格式字符之间加入形如“m.n”(m、n均为整数)的修饰。其中,m为宽度修饰,n为精度修饰。宽度修饰用来指定数据的输出宽度。精度修饰对不同的格式字符,作用不同:对于格式字符f,用来指定输出小数位的位数;对于格式字符e,用来指定输出有效数字的位数;对于格式字符d,用来指定必须输出的数字的个数。相关的例子如表3-2所示。l2长度修饰符l长度修饰符“l”加在%
16、号和格式字符之间。输出长整型数据的时候,一定要加长度修饰符,否则,得不到正确的显示结果。例如:llongx=7654321;lprintf(x=%ldn,x);l输出结果为:x=7654321。表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+00l4左对齐修饰
17、l在指定了宽度修饰时,如果指定宽度小于数据需要的实际宽度,则数据左边补空格,补够指定的宽度,这种对齐方式称为“右对齐”。当然,也可以在数据的右边补空格来补够指定的宽度,这种对齐方式称为“左对齐”。指定左对齐的时候,使用左对齐修饰符“-”,例如语句:lprintf(%-7.2fn,1.23456);l输出结果为l1.23(右边补三个空格)l3.3.3使用说明l(1)printf()函数可以输出常量、变量和表达式的值。但格式控制字符串中的格式指示符必须按从左到右的顺序,与输出项表中的每个数据一一对应,否则出错。l(2)格式字符x、e、g可以用小写字母,也可以用大写字母。使用大写字母时,输出数据中包
18、含的字母也大写。除了x、e、g格式字符外,其他格式字符必须用小写字母,例如,“%f”不能写成“%F”。l(3)格式字符紧跟在%后面就作为格式字符,否 则 将 作 为 普 通 字 符 使 用(原 样 输 出),例 如,“printf(c=%c,f=%fn,c,f);”中的第一个c和f都是普通字符。3.4格式化输入函数scanf()lscanf()函数的功能是从计算机默认的输入设备(一般指键盘)向计算机主机输入数据。l3.4.1scanf()函数的一般格式l调用scanf()函数的一般格式为lscanf(格式字符串,输入项地址表);l例如:lscanf(%d%f,&i,&f);l(1)格式字符串:
19、格式字符串可以包含三种类型的字符:格式指示符、空白字符(空格、跳格键、回车键)和非空白字符(又称普通字符)。格式指示符用来指定数据的输入格式;空白字符作为相邻两个输入数据的缺省分隔符;非空白字符在输入有效数据时,必须原样一起输入。l(2)输入项地址表:由若干个输入项地址组成,相邻两个输入项地址之间用逗号分开。输入项地址表中的地址,可以是变量的地址,也可以是字符数组名或指针变量(后续内容介绍)。变量地址的表示方法为“&变量名”,其中,“&”是地址运算符。l3.4.2格式指示符l格式指示符的一般形式为l%【修饰符】格式字符lscanf函数中使用的格式字符如表3-4所示。表3-4 常用格式字符 格式
20、字符说 明d输入十进制整数o输入八进制整数x输入十六进制整数u输入无符号十进制整数c输入一个字符f 和e输入小数形式或指数形式的实型数据s输入字符串l1宽度修饰l宽度修饰用来指定输入数据所占列数,例如:lscanf(%3c%3c,&ch1,&ch2);l假设输入“abcdefg”,则系统将读取的“abc”中的“a”赋给变量ch1;将读取的“def”中的“d”赋给变量ch2。l2抑制修饰符l抑制修饰符“*”表示对应的数据读入后,不赋给相应的变量,该变量由下一个格式指示符输入。例如:lscanf(%2d%*2d%3d,&num1,&num2);l假设输入“123456789”,则系统将读取“12”
21、并赋值给num1;读取“34”,但舍弃掉(“*”的作用);读取“567”并赋值给num2。l3长度修饰符l在输入长整型数据和双精度实型数据时,必须使用长度修饰符“l”,否则,不能得到正确的输入值。例如:llongx;doubley;lscanf(%ld%lf,&x,&y);l3.4.3使用说明l调用scanf()函数输入数据时,要注意以下几点:l(1)如果相邻两个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的两个输入数据之间至少用一个空格分开,或者用Tab键分开,或者输入一个数据后,按回车,然后再输入下一个数据。例如:lscanf(%d%d,&num1,&num2);l假设给nu
22、m1输入10,给num2输入20,则正确的输入操作为l1020l或者:l10l20l(2)格式字符串中出现的普通字符(包括转义字符形式的字符),务必原样输入。例如:lscanf(num1=%d,num2=%d,&num1,&num2);l假设给num1输入10,给num2输入20,正确的输入操作为lnum1=10,num2=20l另外,scanf()函数中,对于格式字符串内的转义字符(如:n),系统并不把它当转义字符来解释,从而产生一个控制操作,而是将其视为普通字符,所以也要原样输入。例如:lscanf(num1=%d,num2=%dn,&num1,&num2);l假设给num1输入10,给n
23、um2输入20,正确的输入操作为lnum1=10,num2=20nl为改善人机交互性,同时简化输入操作,在设计输入操作时,一般先用printf()函数输出一个提示信息,再用scanf()函数进行数据输入。例如:lprintf(num1=);scanf(%d,&num1);lprintf(num2=);scanf(%d,&num2);l(3)输入数据时,遇到以下情况时系统认为该数据输入结束。l遇到空格,或者回车键,或者Tab键。l遇到输入域宽度结束。例如%3d,只取三列。l遇到非法输入。例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符09、小数点和正负号构成)。l(4)使用格式
24、说明符%c输入单个字符时,空格和回车等均作为有效字符被输入。例如:lscanf(%c%c%c,&ch1,&ch2,&ch3);lprintf(ch1=%c,ch2=%c,ch3=%cn,ch1,ch2,ch3);l假设输入:AB,则系统将字母“A”赋值给ch1,空格赋值给ch2,“B”赋值给ch3。3.5单个字符的输入/输出函数l除了使用printf()函数和scanf()函数可以输出/输入字符数据外,C语言还提供了putchar()和getchar()函数,专门用来输出/输入单个字符。l每调用putchar()函数一次,就向显示器输出一个字符,它的调用形式如下:lputchar(ch);l其
25、中,ch是字符变量或是字符常量,例如:lputchar(Y);l将在显示器上输出字符Y。l每调用getchar()函数一次,就从键盘接收一个字符,它的调用形式如下:lch=getchar();lgetchar()函数是一个无参函数,但调用getchar()函数时,后面的括号不能省略。getchar()函数从键盘接收一个字符作为它的返回值。l在输入时,空格、回车等都将作为字符读入,而且,只有在用户输入回车键时,读入才开始执行。l【例3.1】以下程序先从键盘接收一个字符,然后显示在显示器上。l/*程序功能:单个字符的输入与输出*/l#includestdio.hlmain()llcharch;lc
26、h=getchar();lputchar(ch);lputchar(n);ll程序的运行情况:lAlAl需要注意的是,程序中如果调用了putchar()函数或getchar()函 数,则 在 程 序 的 开 头 必 须 加 上“#includestdio.h”或“#include”,否则,程序编译时会报错。注意:注意:1、C语言允许一行写几个语句,也允许一个语句拆开写在几行上。2、C语言对空格不敏感。例:n=10;n=10;3、C语言规范要求,不要将多个语句写在同一行。If(xy)z=y;printf(“xy”);elsez=x;printf(“yx”);例:顺序结构程序设计举例顺序结构程序设
27、计举例例:输入三角形的三边长,求三角形面积。已知求三角形面积的公式为:其中s=(a+b+c)/2#include#includevoidmain()floata,b,c,s,area;scanf(%f,%f,%f,&a,&b,&c);s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c);printf(a=%f,b=%f,c=%f,s=%fn,a,b,c,s);printf(area=%7.2fn,area);sqrt()是求平方根的函数。例:从键盘输入一个大写字母,要求改用小写字母输出。#includevoidmain()charcl,c2;cl=getchar();printf(%c,%dn,cl,cl);c2=cl+32;/*c2=c1+a-A;*/printf(%c,%dn,c2,c2);本章小结l了解、掌握以下知识点如何运用流程图来描述算法C语言的程序结构C语言的输入和输出语句的使用
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922