基本输入、输出和顺序程序设计.ppt

上传人:小飞机 文档编号:5952356 上传时间:2023-09-08 格式:PPT 页数:45 大小:969KB
返回 下载 相关 举报
基本输入、输出和顺序程序设计.ppt_第1页
第1页 / 共45页
基本输入、输出和顺序程序设计.ppt_第2页
第2页 / 共45页
基本输入、输出和顺序程序设计.ppt_第3页
第3页 / 共45页
基本输入、输出和顺序程序设计.ppt_第4页
第4页 / 共45页
基本输入、输出和顺序程序设计.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《基本输入、输出和顺序程序设计.ppt》由会员分享,可在线阅读,更多相关《基本输入、输出和顺序程序设计.ppt(45页珍藏版)》请在三一办公上搜索。

1、第4章:基本输入输出和顺序程序设计,学习的意义,程序对数据的处理流程:程序的主要功能就是对数据的处理,其整个流程主要包括数据的输入、数据的处理、数据的输出。,数据处理,数据输入,数据输出,C程序中如何实现数据输入?,C程序中如何实现数据输出?,程序的结构:写文章有文章的结构 建房子有房子的结构 制造机械产品由机械产品的结构 那么编写程序是否有程序的结构呢?,学习的意义,YES!,本章讨论,第5章讨论,第6章讨论,格式化输出printf 格式化输入scanf 字符数据的非格式化输入、输出 程序的控制结构 顺序程序设计举例 本章小结,学习目标,掌握各种类型数据的格式化输入输出方法;掌握字符数据的非

2、格式化输入输出方法;理解三种程序控制结构的流程图;学会简单顺序程序的设计;养成良好的程序设计习惯;,学习内容,4.1 格式化输出printf,一般格式,printf(格式控制字符串,表达式1,表达式2,表达式n);,功能,按照“格式控制字符串”的要求,将表达式1,表达式2,表达式n的值显示在计算机屏幕上。,说明,格式控制字符串用于指定输出格式。它包含两类字符:常规字符:包括可显示字符和用转义字符表示的字符。格式控制符:以%开头的一个或多个字符,以说明输出数据的类型、形式、长度、小数位数等。其格式为:,%修饰符格式转换字符,例:long int x=0 x8AB6;printf(“The Val

3、ue of x is%ldn”,x);,常规字符,常规字符(转义符),格式控制符(修饰符),格式控制符(格式转换符),printf使用时的注意事项,(1)格式控制字符串可以不包含任何格式控制符。(2)当格式控制字符串中既含有常规字符,又包含有格式控制符时,则表达式的个数应与格式控制符的个数一致。此时,常规字符原样输出,而格式控制符的位置上输出对应的表达式的值,其对应的顺序是:从左到右的格式控制符对应从左到右的表达式。(3)如果格式控制字符串中格式控制符的个数多于表达式的个数,则余下的格式控制符的值将是不确定的。(4)不同类型的表达式要使用不同的格式转换符,同一表达式如果按照不同的格式转换符来输

4、出,其结果可能是不一样的。,printf(“how are you?n”);/只有一个字符串参数,输出为:how are you?printf(“how old are you?n”,20);/带有两个参数,20没有意义,输出为:how old are you?,char ch=A;printf(ch=%c,ch);/输出结果:ch=A(以字符形式输出)printf(ch=%d,ch);/输出结果:ch=65(以A字符的ASCII码形式输出),printf函数中的格式转换字符及其含义,printf函数中的格式转换字符及其含义,1.整数的输出,有符号整数的输出,一般形式:,:表示可选项,可缺省。

5、:表示输出的数据左对齐,缺省时是右对齐。:输出正数时,在数的前面加上号。数字0:右对齐时,如果实际宽度小于width,则在左边的空位补0。width:无符号整数,表示输出整数的最小域宽(即占屏幕的多少格)。若实际宽度超过了width,则按照实际宽度输出。.precision:无符号整数,表示至少要输出precision位。若整数的位数大于precision,则按照实际位数输出,否则在左边的空位上补0。字母l:如果在d的前面有字母l(long),表示要输出长整型数据。字母h:如果在d的前面有字母h(short),表示要输出短整型数据。,说明:,【例】有符号整数的格式化输出,#include vo

6、id main()int a=123;long L=65537;printf printf(a=%d-(a=%d)n,a);printf(a=%6d-(a=%6d)n,a);printf(a=%+6d-(a=%+6d)n,a);printf(a=%-6d-(a=%-6d)n,a);printf(a=%-06d-(a=%-06d)n,a);printf(a=%+06d-(a=%+06d)n,a);printf(a=%+6.6d-(a=%+6.6d)n,a);printf(a=%6.6d-(a=%6.6d)n,a);printf(a=%-6.5d-(a=%-6.5d)n,a);printf(a=%

7、6.4d-(a=%6.4d)n,a);printf(L=%ld-(L=%ld)n,L);printf(L=%hd-(L=%hd)n,L);,a=123-(a=%d)a=123-(a=%6d)a=+123-(a=%+6d)a=123-(a=%-6d)a=123-(a=%-06d)a=+00123-(a=%+06d)a=+000123-(a=%+6.6d)a=000123-(a=%6.6d)a=00123-(a=%-6.5d)a=0123-(a=%6.4d)L=65537-(L=%ld)L=1-(L=%hd),运行结果:,L是一长整型数65537,其值为十六进制0X00010001,所以要将其转换

8、成短整型,即取低16位0 x0001,将其输出,故输出为1。,Why?,1.整数的输出,无符号整数的输出,一般形式:,:表示可选项,可缺省。|:表示互斥关系。#:表示当以八进制形式输出数据(%o)时,在数字前输出0;当以十六进制形式输出数据(%x或%X)时,在数字前输出0 x或0X。.precision的含义与前面介绍的相同,但要注意,在TC和BC下,precision所指定的位数也包含了0 x或0X所占的位数,可在VC下,则不包含0 x或0X所占的位数。其它字段的含义与前面介绍的相同。,说明:,【例】无符号整数的格式化输出,#include void main()int a=-1;unsig

9、ned u=32767;unsigned long L=-32768;printf(a=%d,a=%u-(a=%d,a=%u)n,a,a);printf(a=%hx,a=%X-(a=%hx,a=%X)n,a,a);printf(u=%o,u=%X-(u=%o,u=%X)n,u,u);printf(u=%#010X-(u=%#010X)n,u);printf(u=%#10.10X-(u=%#10.10X)n,u);printf(L=%lX-(L=%lX)n,L);printf(L=%-#14.10X-(L=%-#14.10X)n,L);,a=-1,a=65535-(a=%d,a=%u)a=fff

10、f,a=FFFF-(a=%hx,a=%X)u=77777,u=7FFF-(u=%o,u=%X)u=0X00007FFF-(u=%#010X)u=0X00007FFF-(u=%#10.10X)L=FFFF8000-(L=%lX)L=0X00008000-(L=%-#14.10X),运行结果(在BC3.1下):,a=-1,a=4294967295-(a=%d,a=%u)a=ffff,a=FFFFFFFF-(a=%hx,a=%X)u=77777,u=7FFF-(u=%o,u=%X)u=0X00007FFF-(u=%#010X)u=0X0000007FFF-(u=%#10.10X)L=FFFF8000

11、-(L=%lX)L=0X00FFFF8000-(L=%-#14.10X),运行结果(在VC6.0下):,2.实数的输出,一般形式:,:表示可选项,可缺省。|:表示互斥关系。#:必须输出小数点。.precision:规定输出实数时,小数部分的位数。l:输出double型数据(缺省时也是输出double型数据)。L:输出long double型数据。其它字段的含义与前面介绍的相同。,说明:,【例】实数的格式化输出,#include void main()double f=2.5e5;printf printf(f=%15f-(f=%15f)n,f);printf(f=%015f-(f=%015f)

12、n,f);printf(f=%-15.0f-(f=%-15.0f)n,f);printf(f=%#15.0f-(f=%#15.0f)n,f);printf(f=%+15.4f-(f=%+15.4f)n,f);printf(f=%15.4E-(f=%15.4E)n,f);,f=250000.000000-(f=%15f)f=00250000.000000-(f=%015f)f=250000-(f=%-15.0f)f=250000.-(f=%#15.0f)f=+250000.0000-(f=%+15.4f)f=2.5000E+005-(f=%#15.4E),运行结果:,3.字符和字符串的输出,一般

13、形式:,:表示可选项,可缺省。.precision:表示只输出字符串的前precision个字符。其它字段的含义与前面介绍的相同。,说明:,【例】字符及字符串的格式化输出,#include void main()char ch=A;printf printf(ch=%c-(ch=%c)n,ch);printf(ch=%4c-(ch=%4c)n,ch);printf(ch=%-4c-(ch=%-4c)n,ch);printf(ch=%04c-(ch=%04c)n,ch);printf(st=%s-(st=%s)n,CCNU);printf(st=%6s-(st=%6s)n,CCNU);print

14、f(st=%06.3s-(st=%06.3s)n,CCNU);,ch=A-(ch=%c)ch=A-(ch=%4c)ch=A-(ch=%-4c)ch=000A-(ch=%04c)st=CCNU-(st=%s)st=CCNU-(st=%6s)st=000CCN-(st=%06.3s),运行结果:,4.辅助格式控制符(修饰符)小结,4.辅助格式控制符(修饰符)小结,此外,在使用printf函数时还要注意以下几点:格式控制字符串后面表达式的个数一般要与格式控制字符串中的格式控制符的个数相等。格式转换符中,除了X、E、G以外,其它均为小写。表达式的实际数据类型要与格式转换符所表示的类型相符,printf

15、函数不会进行不同数据类型之间的自动转换。象整型数据不可能自动转换成浮点型数据,浮点型数据也不可能自动转换成型数数据,【例】错误的格式化输出,#include void main()int a=10,b=100;float f=2;printf(a=%d,b=%dn,f,b);printf(a=%f,b=%dn,a,b);printf(a=%ld,b=%dn,120,b);,Why?,如何修改?,printf(a=%f,b=%dn,f,b);printf(a=%f,b=%dn,(float)a,b);printf(a=%ld,b=%dn,120L,b);或printf(a=%d,b=%dn,12

16、0,b);,4.2 格式化输入scanf,一般格式,scanf(“格式控制字符串”,变量1的地址,变量2的地址,变量n的地址);,功能,第一个参数格式控制字符串的控制下,接受用户的键盘输入,并将输入的数据依此存放在变量1、变量2、变量n中。,格式控制符与后续参数中的变量地址的对应关系,scanf函数的格式控制符,%*width l|h Type,一般形式:,说明:,:表示可选项,可缺省。|表示互斥关系。width:指定输入数据的域宽,遇空格或不可转换字符则结束。Type:各种格式转换符(参照printf)。*:抑制符,输入的数据不会赋值给相应的变量。l:用于d、u、o、x|X前,指定输入为lo

17、ng型整数;用于e|E、f前,指定输入为double型实数。h:用于d、u、o、x|X前,指定输入为short型整数。,使用scanf函数注意事项,(1)如果相邻两个格式控制符之间,不指定数据分隔符(如逗号、冒号等),则相应的两个输入数据之间,至少用一个空格分隔,或者用Tab键分隔,或者输入一个数据后,按回车,然后再输入下一个数据。(2)格式控制字符串中出现的常规字符(包括转义字符),务必原样输入。(3)为改善人机交互性,同时简化输入操作,在设计输入操作时,一般先用printf()函数输出一个提示信息,再用scanf()函数进行数据输入。(4)当格式控制字符串中指定了输入数据的域宽width时

18、,将读取输入数据中相应的width位,但按需要的位数赋给相应的变量,多余部分被舍弃。,例如:scanf(%d%d,假设给num1输入12,给num2输入36,则正确的输入操作为:1236 或者 12 36 使用“”符号表示按回车键操作,在输入数据操作中的作用是,通知系统输入操作结束。,例如:scanf(%d:%d:%d,假设给h输入12,给m输入30,给s输入10,正确的输入操作为:12:30:10,例如:scanf(num1=%d,num2=%dn,假设给num1输入12,给num2输入36,正确的输入操作为:num1=12,num2=36n,例如:将scanf(num1=%d,num2=%

19、dn,例如:scanf(%3c%3c,假设输入abcdefg,则系统将读取的“abc”中的a赋给变量ch1;将读取的def中的d赋给变量ch2。,使用scanf函数注意事项,(5)当格式控制字符串中含有抑制符*时,表示本输入项对应的数据读入后,不赋给相应的变量(该变量由下一个格式指示符输入)。(6)使用格式控制符%c输入单个字符时,空格和转义字符均作为有效字符被输入。(7)输入数据时,遇到以下情况,系统认为该数据结束:遇到空格,或者回车键,或者Tab键。遇到输入域宽度结束。例如“%3d”,只取3列。遇到非法输入。比方说,在输入数值数据时,遇到字母等非数值符号。(8)当一次scanf调用需要输入

20、多个数据项时,如果前面数据的输入遇到非法字符,并且输入的非法字符不是格式控制字符串中的常规字符,那么,这种非法输入将影响后面数据的输入,导致数据输入失败。,例如:scanf(%2d%*2d%3d,假设输入123456789 输出结果为:num1=12,num2=567。,例如:scanf(%c%c%c,假设输入:ABC,则系统将字母A赋值给ch1,空格赋值给ch2,字母B赋值给ch3。,例如:scanf(%d,a);如果输入为:12a3,a的值将是12。,例如:scanf(%d,%d,如果输入为:12a34,那么a的值将是12,b的值将无法预测。正确的输入是:12,34,【例】数据的格式化输入

21、 输入一学生的学号(8位数字)、生日(年-月-日)、性别(M:男,F:女)及三门功课(语文、数学、英语)的成绩,现要求计算该学生的总分和平均分,并将该学生的全部信息输出(包括总分、平均分)。,#include void main()unsigned long no;/学号 unsigned int year,month,day;/生日(年、月、日)unsigned char sex;/性别 float chinese,math,english;/语文、数学、英语成绩 float total,average;/总分、平均分 printf(input the students NO:);scanf

22、(%8ld,printf(input the students Scores(chinese,math,english):);scanf(%f,%f,%f,假设输入:input the students NO:20040101input the students Birthday(yyyy-mm-dd):1987-9-8input the students Sex(M/F):Minput the students Scores(chinese,math,english):90,80,90,输出结果:=NO=birthday=sex=chinese=math=english=total=aver

23、age20040101 1987-09-08 M 90.0 80.0 90.0 260.0 86.7,4.3 字符数据的非格式化输入、输出,1.字符数据的非格式化输入,int getchar(void);/应包含的.h文件为stdio.h,与输入字符数据有关的常用库函数主要有:getchar、getc、getche、getch等。,getchar,功能:从键盘读一字符 返值:正常,返回读取字符的ASCII码值;出错,返回EOF(-1)。说明:以回车符为输入结束条件;输入多个字符时,返回第一个字符的值;输入字符回显。,【例】利用getchar输入字符,#include#include void

24、main()char ch1,ch2;int a;ch1=getchar();ch2=getchar();scanf(%d,int getc(FILE*stream);/应包含的.h文件为stdio.h,getc,功能:从流文件stream中读取一个字符信息,它的返回值是所读取字符的ASCII码。返值:正常,返回读取字符的ASCII码值;出错,返回EOF(-1)。说明:该函数带有一个参数stream,它是一文件指针(第12章介绍),表示流文件,当流文件是stdin时,getc函数的功能与getchar函数的功能完全相同。也就是说,gtec(stdin)与getchar()是等价的。,int g

25、etche(void);/应包含的.h文件为conio.h,getche,功能:与getchar的功能基本相同。返值:正常,返回读取字符的ASCII码值;出错,返回EOF(-1)。说明:直接从键盘获取键值,不等待用户按回车键;输入字符回显。,getch,int getch(void);/应包含的.h文件为conio.h,功能:与getche的功能基本相同。返值:正常,返回读取字符的ASCII码值;出错,返回EOF(-1)。说明:直接从键盘获取键值,不等待用户按回车键;输入字符不回显。,【例】getch与getche的差异,#include#include void main()char ch1

26、,ch2;printf(please press two keyn);ch1=getche();/回显 ch2=getch();/不回显 printf(nyouve pressed%c and%cn,ch1,ch2);,与输入字符数据有关的库函数功能比较:,2.字符数据的非格式化输出,int putchar(int c);/应包含的.h文件为stdio.h,与输出字符数据有关的常用库函数主要有:putchar、putc、puts等。,putchar,功能:在显示器上输出字符c。返值:正常,返回字符的代码值;出错,返回EOF(-1)。说明:该函数带有一个参数c,它为要显示字符的ASCII码值,有

27、一个int型返回值。,putc,int putc(int c,FILE*stream);/应包含的.h文件为stdio.h,功能:将字符c输出到流文件stream。如果流文件为stdout,则功能与putchar完全相同,所以putc(c,stdout)等价于putchar(c)返值:正常,返回字符的代码值;出错,返回EOF(-1)。,puts,int puts(char*string);/应包含的.h文件为stdio.h,功能:将字符串string的所有字符输出到屏幕上,输出时将自动回车换行。,【例】利用字符输出函数输出字符,#include void main()int a=65;char

28、 b=B;putchar(a);/不自动回车 putchar(n);puts(“is as good as”);/自动回车 putc(b,stdout);,4.4 程序的控制结构,1.算法的基本概念,程序=数据结构+算法。算法:简而言之,就是解决问题的方法与步骤。程序设计语言:是程序开发工具,即是将算法转化为程序的开发工具。程序:算法的具体实现。,学习C语言,不仅要熟练掌握其语言本身的特点、语法规则等意外,更重要的就是掌握分析问题、解决问题的方法,就是锻炼分析、分解,最终归纳整理出算法的能力。,2.设计算法举例,【例1】输入三个数,然后输出其中最大的数。总体思路:首先,得先有个地方装这三个数,

29、我们定义三个变量A、B、C,将三个数依次输入到、B、C中,另外,再准备一个MAX装最大数。由于计算机一次只能比较两个数,我们首先把A与B比,大的数放入MAX中,再把MAX与C比,又把大的数放入MAX中。最后,把MAX输出,此时MAX中装的就是、C三数中最大的一个数。具体步骤:(1)输入A、B、C。(2)A与B中大的一个放入MAX中。(3)把C与MAX中大的一个放入MAX中。(4)输出MAX,MAX即为最大数。其中的(2)、(3)两步仍不明确,无法直接转化为程序语句,可以继续细化:(2)把A与B中大的一个放入MAX中,若A B,则MAX A;否则MAX B。(3)把C与MAX中大的一个放入MAX

30、中,若C MAX,则MAX C。,算法最后可以写成:(1)输入A,B,C。(2)若A B,则MAX A;否则MAXB。(3)若C MAX,则MAX C。(4)输出MAX,MAX即为最大数,2.设计算法举例,【例2】猴子吃桃问题:有一堆桃子不知数目,猴子第一天吃掉一半,觉得不过瘾,又多吃了一只,第二天照此办理,吃掉剩下桃子的一半另加一个,天天如此,到第十天早上,猴子发现只剩一只桃子了,问这堆桃子原来有多少个?总体思路:假设第一天开始时有a1只桃子,第二天有a2只,第9天有a9只,第10天是a10只,在a1,a2,,a10中,只有a10=1是知道的,现要求a1,而我们可以看出,a1,a2,,a10

31、之间存在一个简单的关系:a9=2*(a10+1)a8=2*(a9+1)a1=2*(a2+1)也就是:ai=2*(ai+1+1)i=9,8,7,6,1 这就是此题的数学模型。再考察上面从a9,a8直至a1的计算过程,这其实是一个递推过程,这种递推的方法在计算机解题中经常用到。另一方面,这九步运算从形式上完全一样,不同的只是ai的下标而已。由此,我们引入循环的处理方法,并统一用a0表示前一天的桃子数,a1表示后一天的桃子数。,算法最后可以写成:(1)a1=1 第10天的桃子数,a1的初值 i=9 计数器初值为9(2)a0=2*(a1+1)计算当天的桃子数(3)a1=a0 将当天的桃子数作为下一次计

32、算的初值(4)i=i-1(5)若i=1,转(2)(6)输出a0的值 其中(2)(5)步为循环,3.流程图与算法的结构化描述,流程图,_常见流程图符号,3.流程图与算法的结构化描述,算法的结构化描述,4.5 顺序程序设计举例,【例1】任意从键盘输入一个三位整数,要求正确地分离出它的个位、十位和百位数,并分别在屏幕上输出。程序设计的分析:本例要求设计一个从三位整数中分离出它的个位、十位和百位数的算法。例如,输入的是456,则输出的分别是4、5、6,最低位数字可用对10求余的方法得到,如456%10=6,最高位的百位数字可用对100整除的方法得到,如456/10=4,中间位的数字既可通过将其变换为最

33、高位后再整除的方法得到,如(456-4*100)/10=5,也可通过将其变换为最低位再求余的方法得到,如(456/10)%10=5。根据以上的分析,这个程序应这样设计:(1)定义一个整型变量x,用于存放用户输入的一个三位整数;再定义三个整型变量b0、b1、b2,用于存放计算后个位、十位和百位数。(2)调用scanf函数输入该三位整数。(3)利用上述计算方法计算该数的个位、十位和百位数。(4)输出计算后的结果。,#include void main()int x,b0,b1,b2;/变量定义 printf(please input an integer x:);/提示用户输入一个整数 scanf

34、(%d,/输出结果,具体程序如下:,4.5 顺序程序设计举例,程序设计的分析:求一个字母的前驱字母并不是简单地减1就可以了,比如,a的前驱是z就不能通过减1来实现。在没有学会条件控制之前,我们可以利用取余操作的特性,即任何一个整数除以26(26个字母)的余数只能在025之间。我们可以以z为参考点,首先求出输入的字符ch(假设是w)与z之间的字符偏移数n=z-ch=z-w=3,而(n+1)%26=4则是ch(字母w)的前驱字母相对于z的偏移数,z-(n+1)%26=122-4=118(即字母v)就是ch(字母w)的前驱字母。如下图所示,求一个字母的后继也不是简单地加1就行,比如,z的后继是a就不

35、能通过加1来实现。此时,可以a为参考点,首先求出输入的字符ch(假设是w)与a之间的字符偏移数n=ch-a=w-a=22,而(n+1)%26=23则是ch(字母w)的后继字母相对于a的偏移数,a+(n+1)%26=97+23=120(即字母x)就是ch(字母w)的后继字母。根据以上分析,这个程序应这样设计:(1)定义三个字符型变量,分别用于接受用户输入的字符及用于存放其前驱和后继字符。(2)调用getche函数获取用户输入的字母,回显。(3)求得该字母的前驱字母和后继字母,并输出其结果。,#include#include void main()char ch,ch1,ch2;/变量定义 ch=

36、getche();/读取一字符 putchar(n);/换行 ch1=z-(z-ch+1)%26;/求前驱字符 ch2=a+(ch-a+1)%26;/求后继字符 printf(ch1=%c,ch2=%cn,ch1,ch2);/显示结果,具体程序如下:,本章小结,本章的主要内容包含如下几个方面:(1)格式化输入、输出库函数的使用。重点介绍了格式化输入函数printf和格式化输出函数scanf的功能及使用方法,其中格式控制字符串是我们要重点关注的地方,格式化输入和输出可以按照某种输入输出格式来进行。(2)字符的非格式化输入、输出库函数的使用。(3)算法的基本概念。简单地说,算法是求解某个问题的方法,程序是算法通过编程语言书写出来的表现形式。算法是程序的灵魂,语言只是算法的实现工具。所以我们学习C语言不仅要学会C语言的语法特点,各种函数的使用方法等,更重要的是掌握分析问题、解决问题的方法,就是锻炼分析、分解,最终归纳整理出算法的能力。(4)程序的控制结构。任何复杂的算法都可以由顺序结构、选择(分支)结构和循环结构这三种基本结构组成。由此构成了程序的三种控制结构,这三种控制结构在程序中相互嵌套,从而构造出各种各样的程序。,本章小结,习题:P104P107 1、2、3(1)、3(4)、3(6),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号