1、单击此处编辑母版标题样式,单击此处编辑母版副标题样式,本幻灯片资料仅供参考,不能作为科学依据,如有不当之处,请参考专业资料。,4.1 C语句概述,4.2 程序三种基本结构,4.3 赋值语句,4.4 数据输入输出概念及在语言中实现,4.5 字符数据输入输出,4.6 格式输入与输出,4.7 次序结构程序设计举例,习题,第4章 最简单c程序设计次序程序设计,第1页,在上一章介绍了程序中用到一些基本要素(常量、变量、运算符、表示式等),它们是组成程序基本成份。在第1章中已经介绍了几个简单c程序。本章将介绍为编写简单程序所必需一些内容。,第2页,4.1 C语句概述,和其它高级语言一样,c语言语句用来向计
2、算机系统发出操作指令。一个语句经编译后产生若干条机器指令。一个实际程序应该包含若干语句。应该指出,c语句都是用来完成一定操作任务。申明部分内容不应称为语句。如:int a;不是一个c语句,它不产生机器操作,而只是对变量定义。从第1章已知,一个函数包含申明部分和执行部分,执行部分即由语句组成。c程序结构能够用图4.1表示。即一个c程序能够由若干个源程序文件(分别进行编译文件模块)组成,一个源文件能够由若干个函数和预处理命令以及全局变量申明部分组成(关于“全局变量”见第7章,“预编译命令”见第8章),一个函数由数据定义部分和执行语句组成。,第3页,图4.1,第4页,在第2章中已经说明,程序应该包含
3、数据描述(由申明部分来实现)和数据操作(由语句来实现)。数据描述主要定义数据结构(用数据类型表示)和数据初值。数据操作任务是对已提供数据进行加工。,C语句能够分为以下5类:,(1)控制语句,完成一定控制功效。c只有9种控制语句,它们是:,if()else(条件语句),for()(循环语句),hile()(循环语句),dohile()(循环语句),continue (结束此次循环语句),第5页,break (中止执行switch或循环语句),sitch (多分支选择语句),goto (转向语句),return (从函数返回语句),上面9种语句中括号()表示其中是一个条件,表示内嵌语句。比如:“i
4、f()else”详细语句能够写成:,if(xy)z=x;else z=y;,(2)函数调用语句。由一次函数调用加一个分号组成一个语句,比如:printf(this is a c stateent);,第6页,(3)表示式语句。由一个表示式组成一个语句,最经典是,由赋值表示式组成一个赋值语句。,a=3,是一个赋值表示式,而,a=3;,是一个赋值语句。能够看到一个表示式最终加一个分号就成了一个语句。一个语句必须在最终出现分号,分号是语句中不可缺乏一部分(而不像pascal语言那样,分号只是语句间分隔符号)。比如:,i=i+1(是表示式,不是语句),i=i+1;(是语句),第7页,任何表示式都能够加
5、上分号而成为语句,比如i+;是一语句,作用是使i值加1。又如x+y;也是一个语句,作用是完成x+y操作,它是正当,不过并不把x+y和赋给另一变量,所以它并无实际意义。,表示式能组成语句是c语言一个主要特色。其实“函数调用语句”也是属于表示式语句,因为函数调用(如sin(x)也属于表示式一个。只是为了便于了解和使用,我们把“函数调用语句”和“表示式语句”分开来说明。因为c程序中大多数语句是表示式语句(包含函数调用语句),所以有些人把c语言称作“表示式语言”。,第8页,(4)空语句。下面是一个空语句:,;,即只有一个分号语句,它什么也不做。有时用来做被转向点,或循环语句中循环体(循环体是空语句,表
6、示循环体什么也不做)。,(5)能够用 把一些语句括起来成为复合语句,又称分程序。以下面是一个复合语句。,z=x+y;,t=z/100;,printf(%f,t);,第9页,注意:复合语句中最终一个语句中最终分号不能忽略不写(这是和pascal不一样)。,C语言允许一行写几个语句,也允许一个语句拆开写在几行上,书写格式无固定要求(fortran、cobol有严格要求)。,4.2 程序三种基本结构,为了提升程序设计质量和效率,现在普遍采取结构化程序设计方法。结构化程序由若干个基本结构组成。每一个基本结构能够包含 一个或若干个语句。有三种基本结构:,(1)次序结构,见图4.2。先执行a操作,再执行b
7、操作,二者是次序执行关系。图中(b)是ns结构化流程图(下同)。,第10页,图4.2,图4.3,第11页,(2)选择结构,见图4.3。p代表一个条件,当p条件成立(或称为“真”)时执行a,不然执行b。注意,只能执行a或b之一。两条路径汇合在一起然后出口。,(3)循环结构,有两种循环结构:,当型循环结构,见图4.4。当p条件成立(“真”)时,重复执行a操作。直到p为“假”时才停顿循环。,直到型循环结构,见图4.5。先执行a操作,再判断p是否为“假”,若p为“假”,再执行a,如此重复,直到p为“真”为止。,第12页,图4.4,图4.5,第13页,由选择结构能够派生出另一个基本结构:多分支选择结构,
8、见图4.6。,依据k值(k1,k2,kn)不一样而决定执行a1,a2,an之一。,已经证实,由以上基本结构组成程序能处理任何复杂问题。上面图4.2图4.7中方框中a,b,a1,an等能够是一个简单语句,也能够又是一个基本结构。比如,图4.7是一个次序结构,它由两个操作次序组成。虚线框内是一个当型循环结构,能够用“b”表示,所以图4.7就能够了解为图4.2(a)所表示次序结构。,第14页,图4.6,图,4.7,第15页,关于三种基本结构特征以及结构化程序设计方法,读者可能已在学习其它高级语言程序设计时学习过,在此不再重复。只是应该强调说明,在今后程序设计中应该采取结构化程序设计方法。在本章中,我
9、们将介绍几个最基本语句,以及用它们组成次序结构程序。在第4、第5章介绍选择结构和循环结构程序设计。,第16页,4.3 赋值语句,前已介绍,赋值语句是由赋值表示式加上一个分号组成。因为赋值语句应用十分普遍,所以专门再讨论一下。,C语言赋值语句含有其它高级语言赋值语句一切特点和功效。但也应该注意到它们不一样:,(1)C语言中赋值号“=”是一个运算符,在其它大多数语言中赋值号不是运算符。,(2)关于赋值表示式与赋值语句概念,其它多数高级语言没有“赋值表示式”一概念。作为赋值表示式能够包含在其它表示式之中,比如:,if(a=b)0)t=a;,第17页,按语法要求if后面()内是一个条件,比如能够是:“
10、if(x0)”。现在在x位置上换上一个赋值表示式“a=b”,其作用是:先进行赋值运算(将b值赋给a),然后判断a是否大于0,如大于0,执行t=a。在if语句中“a=b”不是赋值语句而是赋值表示式,这么写是正当。假如写成if(a=b;)0)t=a;就错了。在if条件中不能包含赋值语句。由此能够看到,c把赋值语句和赋值表示式区分开来,增加了表示式种类,使表示式应用几乎“无孔不入”,能实现其它语言中难以实现功效.,第18页,4.4 数据输入输出概念及在C语言中实现,(1)所谓输入输出是以计算机主机为主体而言。从计算机向外部输出设备(如显示器、打印机、磁盘等)输出数据称为“输出”,从外部向输入设备(如
11、键盘、磁盘、光盘、扫描仪等)输入数据称为“输入”。,(2)C语言本身不提供输入输出语句,输入和输出操作是由函数来实现。在c标准函数库中提供了一些输入输出函数,比如,printf函数和scanf函数。读者在使用它们时,千万不要误认为它们是C语言提供“输入输出语句”。printf和scanf不是C语言关键字,而只是函数名字。实际上完全能够不用printf和scanf这两个名字,而另外编两个,第19页,输入输出函数,用其它函数名。C提供函数以库形式存放在系统中,它们不是c语言文本中组成部分。,在第1章中曾介绍,不把输入输出作为C语言提供语句目标是使C语言编译系统简单,因为将语句翻译成二进制指令是在编
12、译阶段完成,没有输入输出语句就能够防止在编译阶段处理与硬件相关问题,能够使编译系统简化,而且通用性强,可移植性好,对各种型号计算机都适用,便于在各种计算机上实现。各种版本C语言函数库是各计算机厂商(或软件开发企业)针对某一类型计算机情况编写,而且已编译成目标文件(.obj文件)。它们在连接阶段与由源程序经编译而得到目标文件相连接,生成一个可执行目标程序。假如在源程序中有,printf函,第20页,数,在编译时并不把它翻译成目标指令,而是在执行阶段中调用已被连接函数库中printf函数。因为c编译系统与c函数库是分别进行设计,所以不一样计算机系统所提供函数数量、名字和功效是不完全相同。不过,有些
13、通用函数(如printf和scanf等),各种计算机系统都提供,成为各种计算机系统标准函数。c语言函数库中有一批“标准输入输出函数”,它是以标准输入输出设备(普通为终端设备)为输入输出对象。其中有:putchar(输出字符),getchar(输入字符),printf(格式输出),scanf(格式输入),puts(输出字符串),gets(输入字符串)。在本章中介绍前面4个最基本输入输出函数。,第21页,(3)在使用c语言库函数时,要用预编译命令“include”将相关“头文件”包含到用户源文件中。在头文件中包含了与用到函数相关信息。比如使用标准输入输出库函数时,要用到“stdio.h”文件。文件
14、后缀“h”是head缩写,#include命令都是放在程序开头,所以这类文件被称为“头文件”。在调用标准输入输出库函数时,文件开头应有以下预编译命令:,#include,或,#include studio.h,studioh是standard input&output缩写,它包含了与标准i/o库相关变量定义和宏定义(相关预编译,第22页,命令见第7章)。考虑到printf和scanf函数使用频繁,系统允许在使用这两个函数时可不加#include命令。,4.5 字符数据输入输出,我们先介绍c标准i/o函数库中最简单、也是最轻易了解字符输入输出函数putchar()和getchar(),再介绍格式
15、输入输出函数printf()和scanf()函数。,4.5.1 putchar函数(字符输出函数),putchar函数作用是向终端输出一个字符:比如putchar(c);它输出字符变量c值。c能够是字符型变量或整型变量。,例4.1输出单个字符。,第23页,#include,main(),char a,b,c;,a=b;b=o;c=y;,putchar(a);putchar(b);putchar(c);,运行结果:,boy,也能够输出控制字符,如putchar(n)输出一个换行符,使输出当前位置移到下一行开头。假如将例4.1程序最终一行改为,第24页,putchar(a);putchar(n);
16、putchar(b);putchar(n);putchar(c);putchar(n);,则输出结果为:,b,o,y,也能够输出其它转义字符,如:,putchar(101)(输出字符a),putchar()(输出单引号字符),putchar(015)(输出回车,不换行,使输出当前位置移到本行开头),第25页,4.5.2 getchar函数(字符输入函数),此函数作用是从终端(或系统隐含指定输入设备)输入一个字符。getchar函数没有参数,其普通形式为getchar(),函数值就是从输入设备得到字符。比如:,例4.2输入单个字符,#include,main(),charc;,c=getchar
17、();,putchar(c);,第26页,在运行时,假如从键盘输入字符a并按回车键,就会在屏幕上看到输出字符a。a(输入a后,按“回车”键,字符才送到内存),a (输出变量c值a),请注意,getchar()只能接收一个字符。getchar函数得到字符能够赋给一个字符变量或整型变量,也能够不赋给任何变量,作为表示式一部分。比如,例4.2第4、5行能够用下面一行代替:,putchar(getchar();,因为getchar()值为a,所以putchar函数输出a。也能够用printf函数输出:,printf(”%c,getchar();请不要忘记,假如在一个函数中(今为main函数)要调用ge
18、tchar函数,应该在该函数前面(或本文件开头)加上“包含命令”,#include,第27页,4.6.1 printf函数(格式输出函数),在前面各章节中已用到printf函数,它作用是向终端(或系统隐含指定输出设备)输出若干个任意类型数据(putchar只能输出字符,而且只能是一个字符,而printf能够输出多个数据,且为任意类型)。,1.printf函数普通格式为printf(格式控制,输出表列),如:printf(%d,%cn,i,c),括弧内包含两部分:,4.6,格式输入与输出,第28页,(1)“格式控制”是用双引号括起来字符串,也称“转换控制字符串”,它包含两种信息:,格式说明,由“
19、%”和格式字符组成,如%d,%f等。它作用是将输出数据转换为指定格式输出。格式说明总是由“%”字符开始。,普通字符,即需要原样输出字符。比如上面printf函数中双引号内逗号、空格和换行符。,(2)“输出表列”是需要输出一些数据,能够是表示式。,2.格式字符,对不一样类型数据用不一样格式字符。惯用有以下几个格式字符:,第29页,(1)d格式符。用来输出十进制整数。有以下几个使用方法:,%d,按整型数据实际长度输出。,%md,m为指定输出字段宽度。假如数据位数小于m,则左端补以空格,若大于,则按实际位数输出。如,printf(%4d,%4d,a,b);,若a=123,b=12345,则输出结果为
20、,123,12345,%ld,输出长整型数据。如,longa=135790;,printf(%ld,a);,第30页,假如用%d输出,就会发生错误,因为整型数据范围为-3276832767。对long型数据应该用%ld格式输出。对长整型数据也能够指定字段宽度,如将上面printf函数中“%ld”改为“%8ld”,则输出为:,135790,8列,一个int型数据能够用%d或%ld格式输出。,(2)o格式符,以八进制数形式输出整数。因为是将内存单元中各位值(0或1)按八进制形式输出,所以输出数值不带符号,即将符号位也一起作为八进制数一部分输出。比如:,int a=-1;,printf(%d,%o,
21、a,a);,-1在内存单元中存放形式(以补码形式存放)以下:,第31页,1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1,输出为,-1,177777,不会输出带负号八进制整数。对长整数(long型)能够用“%lo”格式输出。一样能够指定字段宽度,如printf(“%8o”,a)输出为177777。,(3)x格式符,以十六进制数形式输出整数。一样不会出现负十六进制数。比如:,int a=-1;,printf(%x,%o,%d,a,a,a);,第32页,输出结果为,ffff,177777,-1,一样能够用“%lx”输出长整型数,也能够指定输出字段宽度,如“%12x”。,(4)u格式符
22、,用来输出unsigned型数据,即无符号数,以十进制形式输出。,一个有符号整数(int型)也能够用%u格式输出;反之,一个unsigned型数据也能够用%d格式输出。按相互赋值规则处理(见第2章2.9节)。unsigned型数据也可用%o或%x格式输出。,例4.3无符号数据输出。,第33页,main(),unsigned int a=65535;,int b=-2;,printf(a=%d,%o,%x,%un,a,a,a,a);,printf(b=%d,%o,%x,%un,b,b,b,b);,运行结果为:,a=-1,177777,ffff,65535,b=-2,177776,fffe,655
23、34,请读者自己分析。,第34页,(5)c格式符,用来输出一个字符。如:,charc=a;,printf(%c,c);,输出字符a,请注意:“%c”中c是格式符,逗号右边c是变量名,不要搞混。,一个整数,只要它值在0255范围内,也能够用字符形式输出,在输出前,系统会将该整数作为ascii码转换成对应字符;反之,一个字符数据也能够用整数形式输出。例4.4字符数据输出。,main(),char c=a;,int i=97;,第35页,printf(%c,%dn,c,c);,printf(%c,%dn,i,i);,运行结果为:,a,97,a,97,也能够指定输出字数宽度,假如有,printf(%3
24、c,c),则输出:“a”,即c变量输出占3列,前2列补空格。,(6)s格式符,用来输出一个字符串。有几个使用方法:,第36页,%s,比如:printf(%s,china),输出“china”字符串(不包含双引号)。,%ms,输出字符串占列,如字符串本身长度大于m,则突破限制,将字符串全部输出。若串长小于m,则左补空格。,%-ms,假如串长小于,则在列范围内,字符串向左靠,右补空格。,%mns,输出占列,但只取字符串中左端n个字符。这n个字符输出在列右侧,左补空格。,%-mns,其中、n含义同上,n个字符输出在列范围左侧,右补空格。假如n,则自动取n值,即确保n个字符正常输出。,第37页,例4.
25、5字符串输出。,main(),printf(%3s,%7.2s,%.4s,%-5.3sn,china,china,china,china),输出以下:,china,ch,chin,chi,其中第3个输出项,格式说明为“%.4s”,即只指定了n,没指定,自动使=n=4,故占4列。,第38页,(7)f格式符,用来输出实数(包含单、双精度),以小数形式输出。有以下几个使用方法:,%f,不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。应该注意,并非全部数字都是有效数字。单精度实数有效位数普通为7位。,例4.6输出实数时有效位数。,main(),float x,y;,x=1111
26、11111;y=222222222;,printf(%f,x+y);,第39页,运行结果为,333333328125,显然,只有前7位数字是有效数字。千万不要认为凡是打印出来数字都是准确。,双精度数也可用%f格式输出,它有效位数普通为16位,给出小数6位。,例4.7输出双精度数时有效位数。,main(),double x,y;,x=1111111111111.111111111;,y=2222222222222.222222222;,printf(%f,x+y);,第40页,输出结果为,3333333333333.333010,能够看到最终3位小数(超出16位)是无意义。,%nf指定输出数据共
27、占列,其中有n位小数。假如数值长度小于,则左端补空格。,%-nf与%nf基本相同,只是使输出数值向左端靠,右端补空格。,例4.8输出实数时指定小数位数。,main(),float f=123.456;,第41页,printf(%f%10f%10.2f%.2f%-10.2fn,f,f,f,f,f);,输出结果以下:,123.456001 123.456001 123.46 123.46 123.46,f值应为123.456,但输出为123.455994,这是因为实数在内存中存放误差引发。,(8)e格式符,以指数形式输出实数。可用以下形式:,%e不指定输出数据所占宽度和数字部分小数位数,有c编译系
28、统自动指定给出6位小数,指数部分占5位(如e+002),其中“e”占1位,指数符号,第42页,占1位,指数占3位。数值按规范化指数形式输出(即小数点前必须有而且只有1位非零数字)。比如,printf(%e,123456);,输出:1234560e+002。,6列 5列,输出实数共占13列宽度。(注:不一样系统要求略有不一样),%m.ne和%-m.ne。、n和“-”字符含义与前相同。此处n指拟输出数据小数部分(又称尾数)小数位数。若f=123456,则:,printf(%e%10e%10.2e%.2e%-10.2e,f,f,f,f,f);,第43页,输出以下:,1.234560e+002 1.2
29、34560e+002 1.23e+002 1.23e+002 1.23e+002,13列 13列 10列 9列 10列,第2个输出项按%10e输出,即只指定了=10,未指定n,凡未指定n,自动使n=6,整个数据长13列,超出给定10列,乃突破10列限制,按实际长度输出。第3个数据共占10列,小数部分占2列。第4个数据按“%2e”格式输出,只指定n=2,未指定,自动使等于数据应占长度,今为9列。第5个数据应占10列,数值只有9列,因为是“%-102e”,数值向左靠,右补一个空格。(注:有c系统输出格式与此略有不一样),第44页,(9)g格式符,用来输出实数,它依据数值大小,自动选f格式或e格式(
30、选择输出时占宽度较小一个),且不输出无意义零。比如,若f=123468,则printf(“%f%e%g”,f,f,f);,输出以下:,123.468000 1.234680e+002 123.468,10列 13列 10列,用%f格式输出占10列,用%e格式输出占13列,用%g格式时,自动从上面两种格式中选择短者(今以%f格式为短),故占10列,且按%f格式用小数形式输出,最终3个小数位“0”为无意义0,不输出,所以输出123.468,然后右补3个空格。%g格式用得较少。,第45页,在使用printf函数时,还有几点要说明:,(1)除了x,e,g外,其它格式字符必须用小写字母,如%d不能写成%
31、d。,(2)能够在printf函数中“格式控制”字符串内包含第2章2.5节2.5.1段中“转义字符”,如“n”、“t”、“b”、“r”、“f”、“377”等。,(3)上面介绍d、o、x、u、c、s、f、e、g等字符,如用在“%”后面就作为格式符号。一个格式说明以“%”开头,以上述9个格式字符之一为结束,中间能够插入附加格式字符(也称修饰符)。比如:,第46页,第一个格式说明为“%c”而不包含其后f,第二个格式说明为“%f”,不包含其后s,第三个格式说明为%s。其它字符为原样输出普通字符。,(4)假如想输出字符“%”,则应该在“格式控制”字符串中用连续两个%表示,如:,第47页,printf(%
32、f%,10/3);,输出:0333333%,4.6.2 scanf函数(格式输入函数),在第1章中已初步接触到了scanf函数,在本节中再作详细介绍。,1.普通形式,scanf(格式控制,地址表列),“格式控制”含义同printf函数;“地址表列”是由若干个地址组成表列,能够是变量地址,或字符串首地址。,第48页,例4.9用scanf函数输入数据。,ain(),int a,b,c;,scanf(“%d%d%d”,&a,&b,&c);,printf(%d,%d,%dn,a,b,c);,图4.8,第49页,运行时按以下方式输入a、b、c值:,3 4 5(输入a、b、c值),3,4,5 (输出a、b
33、、c值),&a、&b、&c中“&”是“地址运算符”,&a指a在内存中地址。上面scanf函数作用是:按照a、b、c在内存地址将a、b、c值存进去。见图4.8。变量a、b、c地址是在 编译连接阶段分配。,“%d%d%d”表示按十进制整数形式输入数据。输入数据时,在两个数据之间以一个或多个空格间隔,也能够用回车键、跳格键tab。下面输入均为正当:,第50页,3 4 5,3,4 5,3(按tab键)4,5,用“%d%d%d”格式输入数据时,不能用逗号作两个数据间分隔符,以下面输入不正当:,3,4,5,第51页,2.格式说明,和printf函数中格式说明相同,以%开始,以一个格式字符结束,中间能够插入
34、附加字符。,说明:,(1)对unsigned型变量所需数据,能够用%u,%d或%o,%x格式输入。,(2)能够指定输入数据所占列数,系统自动按它截取所需数据。如,scanf(%3d%3d,&a,&b);,输入:123456,系统自动将123赋给a,456赋给b。此方法也可用于字符型:scanf(%3c,&ch);,第52页,假如从键盘连续输入3个字符abc,因为ch只能容纳一个字符,系统就把第一个字符a赋给ch。,(3)假如在%后有一个“*”附加说明符,表示跳过它指定列数。比如,scanf(%2d%*3d%2d,&a,&b);假如输入以下信息:,12 345 67,将12赋给a,%*3d表示读
35、入3位整数但不赋给任何变量。然后再读入2位整数67赋给b。,也就是说第2个数据“345”被跳过。在利用现成一批数据时,有时不需要其中一些数据,可用此法“跳过”它们。,第53页,(4)输入数据时不能要求精度,比如,,scanf(%72f,&a);,是不正当,不能企图用这么scanf函数并输入以下数据而使a值为1234567。1234567,3.使用scanf函数时应注意问题,(1)scanf函数中“格式控制”后面应该是变量地址,而不应是变量名。比如,,假如a、b为整型变量,则,scanf(%d,%d,a,b);,是不正确,应将“a,b”改为“&a,&b”。这是c语言与其它高级语言不一样之处。许多
36、初学者常在此,第54页,犯错。,(2)假如在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同字符。比如,scanf(%d,%d,&a,&b);,输入时应用以下形式:,3,4,注意3后面是逗号,它与scanf函数中“格式控制”中逗号对应。假如输入时不用逗号而用空格或其它字符是不正确:,3 4(不对),3:4 (不对),第55页,假如是,scanf(%d%d,&a,&b);,输入时两个数据间应空2个或更多空格字符。如:,10 34或10 34,假如是,scanf(%d%d%d,&h,&,&s);输入应该用以下形式:,122336,假如是,scanf(a=%d,b
37、=%d,c=%d,&a,&b,&c);,第56页,输入应为以下形式:,a=12,b=24,c=36,这种形式为了使用户输入数据时添加必要信息以帮助了解,不易发生输入数据错误。,(3)在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入:,scanf(%c%c%c,&c1,&c2,&c3);,如输入a b c,字符a送给c1,字符 送给c2,字符b送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符间隔,所以 作为下一个字符送给c2。,第57页,(4)在输入数据时,遇以下情况时该数据认为结束。,遇空格,或按“回车”或“跳格”(tab)键。,按指定宽度结束,如“%3d
38、”,只取3列。,遇非法输入。,如scanf(%d%c%f,&a,&b,&c);,若输入,1234,a,123,0.26,a b c,第58页,第一个数据对应%d格式在输入1234之后遇字母a,所以认为数值1234后已没有数字了,第一个数据到此结束,把1234送给变量a。字符a送给变量b,因为%c只要求输入一个字符,所以输入字符a之后不需要加空格,后面数值应送给变量c。假如因为疏忽把原来应为1230.26错打成123o.26,因为123后面出现字母o,就认为该数值数据到此结束,将123送给c。,C语言格式输入输出要求比较繁琐,用得不对就得不到预期结果,而输入输出又是最基本操作,几乎每一个程序都包
39、含输入输出,不少编程人员因为掌握不好这方面知识而浪费了大量调试程序时间。所以我们做了比较仔细介绍,方便,第59页,在编程时有所遵照。不过,在学习本书时无须花许多精力去死抠每一个细节,重点掌握最惯用一些规则即可。,其它部分可在需要时随时查阅。这部分内容提议自学和上机,教师无须在课堂上一一细讲。应该经过编写和调试程序来逐步深入而自然地掌握输入输出应用。,第60页,4.7 次序结构程序设计举例,下面介绍几个次序程序设计例子。,例4.10输入三角形三边长,求三角形面积。,为简单起见,设输入三边长a、b、c能组成三角形。从数学知识已知求三角形面积公式为,其中s=(a+b+c)/2,据此编写程序以下:,i
40、nclude,ain(),第61页,float a,b,c,s,area;,scanf(%f,%f,%f,&a,&b,&c);,s=10/2(a+b+c);,area=srt(s(s-a)(s-b)(s-c);,printf(a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2fn,a,b,c,s);,printf(area=%72fn,area);,程序中第7行中sqrt()是求平方根函数。因为要调用数学函数库中函数,必须在程,序开头加一条#include命令,把头文件“math.h”,第62页,包含到程序中来。请注意,以后凡在程序中要用到数学函数库中函数,都应该“包含”math.h
41、头文件。,运行情况以下:,3,4,6,a=3.00,b=4.00,c=6.00,s=6.50,area=533,例4.11从键盘输入一个大写字母,要求改用小写字母输出。前面已介绍过大小写字母间转换方法,依据此思绪编出下面程序。,#include,main(),第63页,char cl,c2;,cl=getchar();,printf(%c,%dn,cl,cl);,c2=cl+32;,printf(%c,%dn,c2,c2);,运行情况以下:,a,a,65,a,97,第64页,用getchar函数得到从键盘上输入大写字母a,赋给字符变量c1。将c1分别用字符形式(a)和整数形式(65)输出。再经
42、过运算得到小写字母a,赋给字符变量c2,将c2分别用字符形式(a)和整数形式(97)输出。,例4.12求ax2+bx+c=0方程根。a,b,c由键盘输入,设b2-4ac0。,众所周知,一元二次方程式根为,能够将上面分式分为两项:,第65页,据此编写程序以下:,include,ain();,float a,b,c,disc,x1,x2,p,;,scanf(a=%f,b=%f,c=%f,&a,&b,&c);,第66页,disc=b*b-4*a*c;,p=-b/(2*a);,=srt(disc)/(2*a);,x1=p+;x2=p-;,printf(nnx1=%5.2fnx2=%5.2fn,x1,x
43、2);,运行情况以下:,a=1,b=3,c=2,x1=-100,x2=-200,注意程序中用了预处理命令include。,第67页,4.8习题,4.1 C语言中语句有哪几类?C语句与其它语言中语句有哪些异同?,4.2 怎样区分表示式和表示式语句?C语言为何要设表示式语句?什么时候用表示式,什么时候用表示式语句?,4.3,C语言为何要把输入输出功效作为函数,而不作为语言基本部分?,第68页,4.4 若a=3,b=4,c=5,x=12,y=24,z=-36,u=51274,n=128765,c1=a,c2=b。想得到以下输出格式和结果,请写出程序(包含定义变量类型和设计输出)。,要求输出结果以下:
44、,a=3 b=4 c=5,x=1.00,y=2.400000,z=-3.600000,x+y=3.60 y+z=-1.20 z+x=-2.40,u=51274 n=128765,c1=a or 97(ascii),c2=b or 98(ascii),第69页,4.5 请写出下面程序输出结果:,main(),int a=5,b=7;,float x=678564,y=-789124;,char c=a;,long n=1234567;,unsigned u=65535;,printf(%d%dn,a,b);,printf(%3d%3dn,a,b);,printf(%f,%fn,x,y);,pri
45、ntf(%-10f,%-10fn,x,y);,第70页,printf(%8.2f,%8.2f,%.4f,%.4f,%3f,%3fn,x,y,x,y,x,y);,printf(%e,%102en,x,y);,printf(%c,%d,%o,%xn,c,c,c,c);,printf(%ld,%lo,%xn,n,n,n);,printf(%u,%o,%x,%dn,u,u,u,u);,printf(%s,%5.3sn,coMputer,coMputer);,第71页,4.6 用下面scanf函数输入数据,使a=10,b=20,c1=a,c2=a,x=1.5,y=-3.75,z=67.8,请问在键盘上怎样输入数据?,scanf(%5d%5d%c%c%f%f%*f,%f,3.7设圆半径r=15,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。,4.7 输入一个华氏温度,要求输出摄氏温度。公式为 c=5/9(f-32),输出要有文字说明,取2位小数。,第72页,