《C语言程序设计案例教程第2章 数据的输入与输出.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计案例教程第2章 数据的输入与输出.ppt(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计案例教程第2章 数据的输入与输出第2章程序结构和算法及数据的输出与输入第1章介绍了C语言程序中用到的一些基本元素,例如常量、变量、表达式等。本章将介绍程序的基本结构、算法、算法的控制结构、语句和输出与输入函数。同时,通过讲解一些简单的顺序结构程序,来巩固与提高前面学过的内容。数据的输入/输出是程序的基本功能,是程序运行中与用户进行交互的基础。在程序需要有输入数据时,应当提示用户进行数据的输入,程序运行结束也应当有合适的输出方式来告诉用户程序运行的结果。C语言没有提供输出和输入语句,输出和输入操作需要调用文件“stdio.h”中的标准输出和输入函数来完成。因此在调用前应使用“#in
2、cludestdio.h”命令。标准输出和输入函数是以标准的输入输出/设备(通常为终端设备,例如显示和键盘)为输入输出对象的函数。其中包括:格式输入函数(scanf)和输出函数(printf),字符输入函数(getchar)和字符输出函数(putchar)字符串输入函数(gets)和字符串输出函数(puts),。2.1程序的基本结构和算法2.1.1C程序的基本结构和语句1C程序的基本结构一个C语言程序由一个或多个C源程序文件组成,个源程序文件又由一个或多个函数一组成。函数是组成程序的基本单位。一个函数又由若干数据描述语句和数据运算语句构成函数体。数据描述语句用于设计程序中的数据结构,包括定义变
3、量和数组等的数据属性,以及函数说明等。C语言的数据运算语句规定了相应的一种操作。C语言源程序的完整结构如下。#includestdio.hvoidmain()数据描述语句(定义变量类型等)数据运算语句(进行表达式运算等)(1)#include”的作用是将该程序中所要用到的函数包含在该程序内,直“接使用C语言中现成的函数可以减小编写C程序的难度,提高编写C程序的效率。在C语言程序中,因为通常都要使用数据输入和数据输出操作,因此都要用到“stdio.h”头文件。由于“#include”是命令而不是语句,所以其后边不可以添加“”,否则会出现语法错误。使用时有以下两种形式,以“stdio.h”头文件为
4、例,介绍如下。【形式1】#include【形式2】#includestdio.h(2)“voidmain”是主函数的标志,每一个C程序都是从主函数开始执行。如果不要“void”则可能会显示警告信息,因此最好均加“void”,。(3)函数主体:它由C语言的数据描述语句(定义变量等)和C语言的数据运算语句(进行表达式运算等)组成。一个函数可以没有语句,但是大括号必须有。每条语句后边必30须有分号“”大括号后边没有分号“”,。2语句C语言程序中的函数是由语句构成的,语句是根据程序设计的需要由C语言的基本元素组成的代码行,用来湘计算机系统发出相应的操作命令,完成一定的操作任务。根据语句的功能不同可将语
5、句分为四类:表达式语句、空语句、复合语句和流程控制语句。(1)表达式语句:在一个表达式的右边加入分号“”,即可构成表达式语句。赋值语句和函数调用语句是表达式语句中使用频率最多的一种。下边的语句均是表达式语句。x=y*2z*3n+n=x=z?100,200a+b,c+d函数调用语句是一个调用函数加一个分号。例如:printf(a=%d,b=%dn,a,b)(2)空语句:只有一个分号的语句叫空语句。该语句什么也不做。有时用来作为延时作用的循环体或转向点。(3)复合语句:用大括号“”括起来的若干语句叫复合语句。复合语句在语法上相当于一条语句。当单条语句位置上的功能需要多条语句才能完成时,可以使用复合
6、语句。例如:一个能完成变量a和变量b内数据互换功能的复合语句。m=aa=bb=m(4)流程控制语句:用来完成一定的程序执行流程的控制,有以下九种。其中,小括号内是一个条件表达式。条件语句:if()else多分支选择语句:switch转向语句:goto循环语句1:for()循环语句2:while()循环语句3:dowhile()结束本次循环语句:continue中止执行switch或循环语句:break从函数返回语句:return例如:如果变量a的值大于变量b的值,则将变量a和变量b的数值互换。if(ab)m=aa=bb=m312.1.2算法1什么是算法一般来说,所谓算法是指解决一个特定问题采用
7、的特定的、有限的方法和步骤。对于计算机编程语言来说,用于求解某个特定问题的一些指令的集合就是算法。具体地说,用计算机所能实现的操作或指令,来描述问题的求解过程,就得到了这一特定问题的计算机算法。利用计算机来解决问题需要编写程序,在编写程序前要对问题进行充分的分析,设计解题的步骤与方法,也就是设计算法。算法的好坏,决定了程序的优劣,因此,算法的设计是程序设计的核心任务之一。一个算法具有下列5个重要特性。只有具有这5种特性才能够被称为算法。(1)确定性:算法中每一步操作都必须有准确的含义,不允许有二义性。正确的算法要求,对于相同的输入,只有唯一的一条执行路径,输入只能得出相同的输出。(2)可行性:
8、算法中描述的所有操作,都可以通过执行有限次的基本运算来实现。(3)输入性:一个算法有零或多个输入,如没有输入,则算法内应确定其值。(4)输出性:一个算法有一或多个输出,没有输出的算法毫无意义。(5)有穷性:对任何合法的输入数值来说,一个算法必须是执行有限的操作步骤,且每一个操作步骤都可在有穷(即有限)时间内完成。这是最重要的特性。2算法的控制结构一个算法的功能不仅与选用的操作有关,而且与这些操作之间的执行顺序有关。算法的控制结构给出了算法的执行框架,它决定了算法中各种操作的执行次序。算法的控制结构有顺序结构、选择结构和循环结构三种基本的形式。任何复杂的算法都可以用顺序、选择和循环这三种控制结构
9、的组合来描述。(1)顺序结构:是指通过安排语句的排列顺序来决定程序流程的程序结构。在这种结构中,各个操作是依次执行的。一个算法总有一个入口,经过有限次的顺序操作后,由一个出口结束算法的操作。这种结构有单入单出的性质。一个程序通常可分为3个部分(输入、处理和输出)。由于顺序结构是按语句在程序中出现的次序,一条一条地执行的,无分支、无循环,所以不会出现死语句和死循环。因此,顺序结构是最简单的结构化程序。(2)选择结构:在许多数情况下,算法不会按部就班地从第一条操作依次执行到最后一条操作,往往需要根据某个条件来决定执行哪条语句,这种结构就是选择结构。选择结构有单选结构、双选结构和多选结构三种类型,也
10、具有单入单出的性质,但它是开放型的,即一旦进入选择结构,执行了与判定条件相对应的一组操作后,就立即退出选择结构。(3)循环结构:算法中的循环结构是指需要反复地执行某组操作的结构。循环控制就是指由特定的条件决定某些语句重复执行次数的控制方式。它也具有单入单出的性质,是封闭型的,一旦进入循环结构,只要循环条件未达到结束状态,就始终执行循环体内的操作。循环结构又分为当型循环结构与直到型循环结构,前者是先进行条件判断,再执行程序段语句;后者是执行一次要重复执行的程序段语句,再进行条件判断。3算法的描述方法算法有许多描述方法,例如,使用日常语言描述解决问题的步骤与方法的自然语言法。这种描述方法通俗易懂,
11、但比较繁琐,且对条件转向等的描述欠直观。针对自然语言法描述32的缺点,又产生了流程图法、NS图法和PAD图等方法。下面介绍这三种在计算机算法中常用的描述方法。(1)流程图:它也称为框图,它是用各种几何图形、流程线及文字说明来描述计算过程的框图。用流程图表示算法的优点是:用图形来表示流程,直观形象,各种操作一目了然,不会产生“歧义性”,流程清晰。它的缺点是:流程图所占面积大,而且由于允许使用流程线,使流程任意转移,容易使人弄不清流程的思路。表211所示为用传统流程图描述算法时常用的符号。表211流程图符号名称含流程图常用符号义起始框数据输入输出框处理框用于表示程序的起始和终止用于表示数据的输入和
12、输出描述基本的操作功能,例如,赋值、数学运算等根据框中给定的条件是否满足,选择执行两条路径中的某一条路径表示流程的路径和方向表示两段流程图流程的连接点判断框流程线连接点用流程图描述程序的三种基本结构如图211所示。其中循环结构有两种形式:当型循环和直到型循环。当型循环是先进行判断,再执行循环体内的操作。直到型循环是先执行循环体内的操作,再进行判断。如果采用直到型循环结构,则不论条件是否成立,循环体内的操作都会被至少执行一次。图211流程图描述程序的3种基本结构下面举例说明如何使用流程图描述判断某整数是否为3的倍数。该算法的流程图如图212所示。(2)NS结构化流程图的主要特点是取消了流程线,即
13、不允许流程任意转移,而只能从33上到下顺序进行,从而使程序结构化。它规定了3种基本结构作为构造算法的基本单元,如图213所示。图中的A和B分别代表某些操作,例如,数据赋值、数据的输入或输出等,也可以是3种基本控制结构中的某一种。顺序结构是最简单的一种结构,先执行A然后再执行B。选择结构则根据条件是否满足决定执行A或B。循环结构中的“直到型循环”,是先执行一次A,然后检查条件是否满足,如不满足则再执行一次A,直到某一次在执行完A后条件满足为止。循环结构中的“当型循环”,是先检查给定的循环条件是否满足,若满足则执行A,然后再检查一次条件满足否,直到某一次条件不满足为止。图212判断某是否为3的倍数
14、的算法流程图图213NS图描述程序的3种基本结构NS图的不足之处是,当算法存在着较多层嵌套的选择结构时,图中的每个选择结构框会越分越窄,可能难以写下所需要的操作内容。(3)PAD图是英文ProblemAnalysisDiagram的缩写,其原意是问题分析图。它是近年来在软件开发中被推广使用的一种描述算法的图形方法。它是一种二维图形,从上到下各框功能顺序执行,从左到右表示层次关系。这种描述算法的方法,层次清楚,逻辑关系明了,在有多次嵌套时,不易出错。用PAD图描述程序的三种基本结构如图214所示。A条件A当型条件当型循环AB直到型条件AB直到型循环图214用PAD图描述程序的3种基本结构在为具体
15、问题设计算法时,选用何种算法描述工具并不重要,重要的是一定要把算法描述得简洁、正确,不会产生理解上的“歧义性”。342.2.1格式化输出函数1格式化输出函数的格式与功能信息的输出是以printf()函数来完成的,printf()函数用于向标准输出设备(屏幕)输出数据,printf()函数的调用格式如下。【格式】printf(,)【功能】用来向标准输出设备输出具有一定格式的多项数据。简介如下。(1)格式控制”“:它是用双引号括起来的字符串,也称为“转换控制字符串”,包括“提示信息字符”“格式转换字符”和“转义字符”三部分内容,如图221所示。提示信息字、“符”和“格式转换字符”可以有多项。图22
16、1“格式控制”的三部分提示性息字符:它是正常字符,这些字符按原样输出,通常用来显示提示信息。格式转换字符:它以%开始,其后边跟着一个或几个格式说明字符,它用来占位,并将在该位置用格式字符规定的格式输出后面的输出项列表中对应的输出项参数。转义字符:用来输出转义字符所代表的控制代码或特殊字符。(2)输出项列表”“:它是需要输出的一系列数据(也叫参数)各项参数可以是变量、,常量、表达式和带返回值的函数等,其参数的个数应该与以“%”开始的“格式转换字符”中的项目个数相同,各参数之间用逗号“,”分开,并且顺序应与“格式转换字符”中的各参数项一一对应,如图222所示。图222“输出项列表”与“格式转换字符
17、”中的各参数项一一对应C语言中提供的printf()函数格式说明字符如表221所示。表221格式说明字符dufs含义printf()函数格式说明字符及其含义格式说明字符含义指数形式的浮点数,即实数十六进制表示的无符号整数十进制有符号整数e十进制无符号整数x浮点数(小数)字符串o文小写字母)八进制表示的无符号整数(英g35与f和e类似,小数点后无尾数c2修饰符单个字符p指针的值在printf()函数中可以在“格式控制”项内的“%”和“格式说明字符”之间插入“修饰符”,如下面所示,用来控制输出的格式,例如输出数据的宽度等。%printf()函数的修饰符如表222所示。表222修饰符m或mprint
18、f()函数的修饰符含义m为指定的输出数据宽度,对于正整数,如果实际数据下于m,数时,表示数据右边补空格。无m时,按数据实际长度输出。m.n或m.n(n是正整数)字母h字母lm为指定的输出数据的全部宽度,包括整数、小数点和小数。n表示小数位的宽度,注意,在输出小数时,小数点也要占一位的宽度。用于按照短整型格式(hd、h0、hx、hu)输出数据用于按照长整型格式(ld、l0、lx、lu)输出数据或按照双精度型格式(hf、hg、he)输出数据,l是小写英文字母*nn是正整数)用来说明可以跳过n个字符宽度(例如,“%5d”表示输出一个5位宽度的整型数,不够5位数据左边补空格。如果大于5位则按实际位数输
19、出;“%5d”表示输出一个5位宽度的整型数,不够5位数据右边补空格。“%7d”表示输出宽度为7,数据左边补空格;“%7d”表示输出宽度为7,数据右边补空格;“%10s”表示输出宽度为10,数据右边补空格。“%8.2f”表示输出宽度为8的浮点数,其中小数位为2位,整数位为5位,小数点占一位,不够8位数据左边补空格。“%f”表示整数部分全部输出,小数部分取6位,没指定宽度。“%8s”表示输出8个字符宽的字符串,不够8个字符时左边补空格,多于8个字符时按实际宽度输出。“%8.5s”表示输出8个字符宽的字符串,输出的字符个数为5个,右边补空格。相关说明如下。(1)在输出字符串或整型数时,如果字符串的长
20、度或整型数的位数超过说明的宽度,则按照其实际长度输出。如果浮点数的整数部分位数超过了说明的整数位宽度,则按照实际整数位输出;若小数部分位数超过了说明的小数位宽度,则按说明的宽度以四舍五入输出。如果用浮点数表示字符或整型数据的输出格式,并且小数点左边的数值小于小数点右边的数据时,小数点后的数字代表最大宽度,小数点前的数字代表最小宽度。例如,“%6.9s”表示显示一个长度不小于6个字符且不大于9个字符的字符串。若大于9,则第9个字符以后的内容将被删除;若小于6个字符则添加空格以补齐。(2)设置前导0:如果想在输出值前加一些0作为输出数据的前导项,就应在宽度项前加个0。例如,%05d表示在输出一个小
21、于5位的整数时,将在前面补0使其总宽度为5位。36(m是正整数)据左边补空格;如果大于m,则按照实际位数输出。当取符号“”%09f表示在输出一个小于9位的浮点数时,将在前面补0使其总宽度为9位。2.3格式化输入函数2.3.1格式化输入函数1格式化输入函数的格式与功能信息的输入是以scanf()函数来完成的,scanf()函数用来接受键盘输入的不同类型的数据,scanf()函数的调用格式如下。【格式】scanf(,)【功能】scanf()函数用于从标准输入设备(键盘)写出数据,该函数在文件stdio.h中定义,因此在调用前也需要使用“#includestdio.h”语句进行包含。“格式控制”是用
22、双引号括起来的字符串,也称为“转换控制字符串”主要有“格式,转换字符”和“转义字符”两部分内容,不包括“提示信息字符”。其中,转换控制字符串包括一个或多个以“%”开始的格式字符,在“%”后跟一个或几个规定的格式转换字符,与printf()函数中一样,它在格式字符串中用来占位,并将在该位置用格式字符确定输入数据时,按输入顺序,将输入的数据存储到与后面的输入项项地址列表中对应的变量存储空间中。“输入项地址列表”中是一个或多个以“&”开始的变量名称,多个输入项之间用逗号分开。这里的“&”是C语言中的取地址符号,它用于获取后面所跟随的变量的内存地址,以便于将输入的数据存储到指定的地址中。例如,“&a”
23、的意思就是获取变量a的地址。“scanf(%f,&a)”语句的含义是:将键盘输入的数据以float数据格式(%f)存储到变量a所在的存储空间中,此后在调用变量a进行计算时,实质是调用存储在该内存空间的数据来进行计算。在用scanf()函数进行数据输入时,格式字符的类型与后面对应的输入项的数据类型必须一致,如果类型不一致,则会出现数据的错误输入,对于此类错误,系统不一定会给出错误信息,因此在设计程序时应特别注意。C语言中用于scanf()函数的格式转换字符如表231所示。表231格式说明字符dufs含义scanf()函数的格式说明字符及其含义格式说明字符含义指数形式的浮点数,即实数十六进制表示的
24、无符号整数十进制有符号整数e十进制无符号整数x浮点数(实数)字符串o文小写字母)八进制表示的无符号整数(英c单个字符与printf()函数类似,scanf()函数在输入字符串时可以在%和格式字符s之间插进数字设置输入字符的宽度(即输入字符的个数)的修饰符等。scanf()函数的修饰符如表232所示。表232修饰符m(正整数)scanf()函数的修饰符含义用来指定输入数据所占宽度(列数)37h(小写英文字母)l(小写英文字母)用于输入短整型数据(hd、h0、hx、hu)用于输入长整型数据(ld、l0、lx、lu)及双精度型数据(hf、hg、he)表示对应输入项在读入后不赋给相应的变量*2scan
25、f()函数使用说明(1)输入数据:输入的数据之间可以用空格、Enter回车、TAB分隔,当“格式转换字符”内没有逗号“,”时,则输入也不允许用逗号“,”分割数据。当scanf()函数要求输入多项数据时,以一次性依次输入完毕后按Enter键,可以每次输入一部分数据,Enter可也按键后再接着输入数据,输入完后按Enter键。例如执行“scanf(%d%d,&a,&b)”语句后,可以输入2、空格、3,再按Enter键,也可以输入2后按Enter键,再输入3后按Enter键。(2)选择性输入:在输入时可以使用方括号“”指定输入字符的范围,scanf()函数将依次读入符合条件的字符,直到遇上一个不符合
26、条件的字符时为止。表233给出几种选择性输入的实例。表233修饰符%abcd%abcd表示只可以输入字符a、b、c、d表示只可以输入除a、b、c、d以外的所有字符表示只可以输入09的数字,可以用“”号表示范围,注意“”左边的字符必须小于其右边的字符%AZAFNS%+*/表示只可以输入所有大写字母表示只可以输入AF和NS的所有字母表示只可以输入运算符+、*、/选择性输入实例含义%0123456789表示只可以输入09的数字%09(3)字符串输入:字符串的输入与其它数据输入有所不同,因为字符串变量的名称就代表了字符串的地址,因此字符串的输入不用在变量名前加“&“符号。例如:charstr18/*定
27、义字符串数组字符串所需要的存储空间*/scanf(“%s”,str1)/*输入字符串到s所指存储空间*/在上面定义的字符串数组str1中最多可以输入8个字符。(4)非格式字符的处理:与printf()函数不同,在scanf()函数的“格式转换字符”中间,如果还有除格式字符以外的其他字符,则这些字符不会显示到屏幕上,需要对它们进行特殊处理。通常不提倡在“格式转换字符”中间加入其它字符。首先,来看看下面的语句:inta,bscanf(“a=%db=%d”,&a,&b)printf(“%d+%d=%dn”,a,b,a+b)上面的scan()语句本意是希望能在屏幕上显示“a=b=”提示用户输入数据,但
28、在程序运行时,却不能得到希望的效果,屏幕上没有“a=”和“b=”等任何提示内容。如果想要正确输入数据,需要用户输入“a=5b=10”,这样,在按Enter键后,数据5被输入到变量a的存储空间,数据10被输入到变量b的存储空间,否则程序将会出错。这里输入的字“a=”和“b=”用于与scanf()语句中的内容相对应注意空格也需要输入)(,如图23238所示。从上面分析可以得到以下结论:scanf()格式化字符串中的非格式字符不能够显示到屏幕上,但在输入时却要求输入这些字符,且要求一一对应。利用非格式字符需要一一对应输入的特点,可以对一次性输入多个数据进行方便的控制。图232输入时的对应关系2.4字
29、符输入/输出函数字符输入/输出函数是用来输入单个字符和向终端输出单个字符的标准函数。它们是“stdio.h”库函数头文件内的函数,使用时需在程序前面加预编译命令“#includestdio.h”。2.4.1字符输入/输出函数格式与功能1字符输入函数格式与功能getchar()函数是字符输入函数,它的格式及其功能如下。【格式】getchar()【功能】从终端或从输入设备输入1个字符。它没有任何参数。【说明】getchar()函数只能接受一个字符,可以赋给一个字符变量或整型变量,也可以作为表达式的一部分不赋给任何变量。例如,运行下面的程序后,输入“A”再按Enter键,则会显示:A65。.#inc
30、ludestdio.hvoidmain()charch1ch1=getchar()printf(%c%d,ch1,ch1)2字符输出函数格式与功能putchar()是字符输出函数,它的作用是向终端输出1个字符。它的格式及其功能如下。【格式】putchar(c)【功能】putchar()函数输出单字符变量c的值,参数c通常为单字符型变量或整型变量。也可以是一个字符的常量或整型常量。【说明】当变量c是一个整型变量时,输出以该整型变量的值为ASCII码值的相应的字母。例如,在“putchar(ch1)”语句中,如果变量ch1是单字符变量,其值为“A”,则该语句输出“A”;如果变量ch1是整型变量,其值为65,则该语句也输出“A”因为字母“A”的,ASCII码的值为65。3940