【学习课件】第3章简单的C程序设计_第1页
【学习课件】第3章简单的C程序设计_第2页
【学习课件】第3章简单的C程序设计_第3页
【学习课件】第3章简单的C程序设计_第4页
【学习课件】第3章简单的C程序设计_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、最简单的C程序设计顺序程序设计第3章3.5 字符数据的输入与输出3.6 简单的格式输入与输出3.7 复杂的输入输出格式控制3.8 顺序结构程序设计举例本章小结3.1 程序的三种基本结构 3.2 C语句概述3.3 赋值表达式和赋值语句3.4 数据输入输出的概念及在C语言中的实现精选课件传统流程图教学进程AB3.1程序的三种基本结构指令 一个程序包含一系列的指令,每个指令使计算机完成一种操作。而程序中的指令不是任意书写的。1966年,Bohra和Jacopini提出了3种基本结构。 顺序结构各操作是按先后顺序执行的。是最简单的一种基本结构。其中A和B两个框是顺序执行的。即在完成A框所指定的操作后,

2、必然接着执行B框所指定的操作。精选课件传统流程图教学进程3.1程序的三种基本结构 选择结构又称分支结构。根据是否满足给定条件而从两组操作中选择执行一种操作。虚线框内是一个选择结构。PAB成立不成立无论P条件是否成立,只能执行A操作或B操作中的一个;无论执行完哪一个分支后,就结束了。两个操作可以有一个是空操作,即不执行任何操作,形如下图:PA成立不成立PB成立不成立入口出口精选课件传统流程图教学进程3.1程序的三种基本结构 循环结构又称重复结构,即在一定条件下,反复执行某一部分的操作。有两种类型:执行过程: 当给定条件P成立时,执行S操作,然后再判断P条件是否成立,如果仍成立,再执行S操作,然后

3、再判断,如此反复,直到某一次P条件不成立为止,此时不再执行S,结束循环。特点: 先判断,后执行,S有可能一次也不执行。PSFT当型循环入口出口精选课件传统流程图教学进程3.1程序的三种基本结构 循环结构执行过程: 执行S操作,然后判断条件P是否成立,如果成立,再执行S操作,然后再判断,.,如此反复,直到某一次P条件不成立不再执行S,结束循环。特点: 先执行,后判断,S最少要执行一次。SPFT直到型循环入口出口精选课件传统流程图教学进程传统流程图有以下几个主要缺点: 传统流程图本质上不是逐步求精的好工具,它会使程序员 过早地考虑程序的控制流程,而不去考虑程序的全局结构。 传统流程图不易表示层次结

4、构。 传统流程图不易表示数据结构和模块调用关系等重要信息。 传统流程图中用箭头代表控制流,因此,程序员不受任何 约束,可以完全不顾结构程序设计的思想,随意进行转移 控制。精选课件C语句概述3.2 C程序是以语句为基本单位的。教学进程 C语言的语句用来向计算机发出操作指令。 一个语句经编译后产生若干条机器指令。 一个函数的执行部分是由若干条语句组成的。 C语句都是用来完成一定的操作任务的。C程序结构C程序函数首部函数体数据声明执行语句源程序文件1源程序文件2.源程序文件n预处理命令数据声明函数1函数2精选课件C语句概述3.2教学进程C语句的分类 控制语句 用于完成一定的控制功能 if ( ) e

5、lse for ( ) while ( ) do while ( ) continue break switch ( ) return goto 标号 说明:“( ) ”中是一个判断条件, “”表示内嵌的语句。精选课件C语句概述3.2教学进程C语句的分类 函数调用语句 由一个函数调用加一个分号构成,例如: printf(“This is a C statement.”); 表达式语句 由一个表达式加一个分号构成,最典型的是赋值语句,例如: a=3 是一个表达式 a=3 ; 是一个表达式语句精选课件C语句概述3.2教学进程C语句的分类 复合语句 用“”括起来的若干个语句,例如: z=x+y; t

6、=z/100; printf(“%f”,t); 空语句 只有一个分号,什么都不做,例如: ;C语言允许一行写几个语句,也允许一个语句拆开写在几行上。一般形式为 : 说明部分;语句部分;精选课件C语句概述3.2教学进程C语句的分类 复合语句 用“”括起来的若干个语句,例如: z=x+y; t=z/100; printf(“%f”,t); 空语句 只有一个分号,什么都不做,例如: ;C语言允许一行写几个语句,也允许一个语句拆开写在几行上。一般形式为 : 说明部分;语句部分;精选课件赋值表达式和赋值语句3.3教学进程3.3.1 赋值表达式1. 赋值运算符 赋值运算符为 “=”。2. 赋值表达式 赋值

7、表达式为 标识符=表达式功能是:首先计算赋值运算符右边表达式的值,然后将计算结果赋给赋值运算符左边的标识符。说 明:赋值运算符左侧的标识符称为左值,可以是变量,不能是表达式、常量;右侧的表达式称为右值。左值可以作为右值,反之则不一定行。 赋值表达式可以出现在另一个表达式中参与运算。精选课件赋值表达式和赋值语句3.3教学进程3.3.1 赋值表达式 . a=3 把常量3赋给变量a为值。 . 假设x与y都是已定义的整型变量,则表达式 x=y=4+5 等价与 x=(y=4+5) 执行过程是:首先计算赋值表达式(y=4+5)的值,即计算4+5的值为9,并将计算结果赋给变量y,而赋值表达式(y=4+5)的

8、值也为9; 然后再将赋值表达式(y=4+5)的值(即9)赋给变量x。因此,通过这个赋值表达式将4+5的计算结果同时赋给了变量x与y。例如赋值表达式出现在另一个表达式中。精选课件赋值表达式和赋值语句3.3教学进程3.3.1 赋值表达式 . b=a; /* b是左值,得到a的值*/ c=b; /* b是右值,将其值赋给c*/. a=(b=5) 等价于 a=b=5,因为赋值运算符按照“自右至左”的顺序结合. a=b=c=5 赋值表达式的值为5,a、b、c的值都为5 a=5+(c=6) 赋值表达式的值为11,a的值为11、c的值为6 a=(b=4)+(c=6) 表达式的值为10,a是10、 b是4 、

9、c是6 a=(b=10)/(c=2) 表达式的值为5,a是5、 b是10 、c是2例如精选课件赋值表达式和赋值语句3.3教学进程3.3.1 赋值表达式 . (a=3*5)=4*3 先算括号a得到15,再算4*3 , a又得到12,因此整个表达式的值是12 若写成 a=3*5=4*3则出错,因为3*5不能作为左值例如计算a-=a*a a=a-a*a,得到a=12-12*12=-132计算a+=a a=a+(-132),得到a=-132+(-132)=-264(7). 赋值表达式可以出现在其它语句中,如: printf(“%d”,a=b); 注:在一个语句中完成了赋值和输出两个操作。. 计算 a+

10、=a-=a*a的值,设a的初值为12。精选课件a+=3等价于a=a+3a-=ba=a-bx*=y+8x= x*( y+8)x/=yx=x/yx%=3-yx=x%(3-y)教学进程3.3.1 赋值表达式3. 复合的赋值运算符 在赋值运算符“=”前加上其它二目运算符构成,如:“+= ”。4.复合的赋值表达式 复合的赋值表达式为 变量名 复合的赋值运算符 表达式C语言中的复合赋值运算符: +=、-=、*=、/=、%=凡是需要两个运算对象的运算符可简化程序,提高编译效率。精选课件计算a-=a*a a=a-a*a,得到a=12-12*12=-132计算a+=a a=a+(-132),得到a=-132+(

11、-132)=-264(8). 计算 a+=a-=a*a的值,设a的初值为12。精选课件赋值运算教学进程 1)在C语言中,“=”为赋值运算符,而不是等号。 2)赋值运算符=左边必须是变量,不能是表达式。 3)赋值运算符=两端的类型不一致时,系统将自动进行类型转换。说明精选课件3.3.2 赋值过程中的类型转换教学进程 实型数据赋给整型变量 舍去小数,将整数部分赋给整型变量 若赋值运算符两侧的类型一致,就直接进行赋值,如: int i; i=6; 若赋值运算符两侧的类型不一致,就要由系统自动进行类型转换。转换规则是: 整型数赋给实型变量 数值不变,但以浮点数形式存储到变量中 双精度数赋给单精度变量

12、截取7位有效数字,但应注意数值会溢出 单精度数赋给双精度变量 数值不变,有效位数扩展到16位 占字节多的整数赋给整型/字符型变量,只将低字节赋给变量c=2890000000100100001c33=00100001精选课件3.3.2 赋值过程中的类型转换教学进程 实型数据赋给整型变量 舍去小数,将整数部分赋给整型变量 若赋值运算符两侧的类型一致,就直接进行赋值,如: int i; i=6; 若赋值运算符两侧的类型不一致,就要由系统自动进行类型转换。转换规则是: 整型数赋给实型变量 数值不变,但以浮点数形式存储到变量中 双精度数赋给单精度变量 截取7位有效数字,但应注意数值会溢出 单精度数赋给双

13、精度变量 数值不变,有效位数扩展到16位 占字节多的整数赋给整型/字符型变量,只将低字节赋给变量 有符号整数赋给长度相同的无符号整型变量,按字节原样赋给变量 无符号整数赋给长度相同的有符号整型变量,应注意不要超出范围unsigned a;int b=-1; a=b;b1111111111111111a1111111111111111精选课件3.3.2 赋值过程中的类型转换教学进程 实型数据赋给整型变量 舍去小数,将整数部分赋给整型变量 若赋值运算符两侧的类型一致,就直接进行赋值,如: int i; i=6; 若赋值运算符两侧的类型不一致,就要由系统自动进行类型转换。转换规则是: 整型数赋给实型

14、变量 数值不变,但以浮点数形式存储到变量中 双精度数赋给单精度变量 截取7位有效数字,但应注意数值会溢出 单精度数赋给双精度变量 数值不变,有效位数扩展到16位 占字节多的整数赋给整型/字符型变量,只将低字节赋给变量 有符号整数赋给长度相同的无符号整型变量,按字节原样赋给变量 无符号整数赋给长度相同的有符号整型变量,应注意不要超出范围精选课件3.3.3 赋值语句教学进程Cs=2*3.14159*r; 赋值表达式的最后加一个“;”,就是赋值语句, 赋值语句的形式为: 变量名=表达式;x*=y+8; 复合语句 简单语句 赋值号“=”是一个运算符; 区别赋值表达式和赋值语句的不同,如: if (a=

15、b)0)t=a; if(a=b;)0)t=a;精选课件3.3.4 变量赋初值int a=3;float f=3.56;char c=a; 程序中常需要对一些变量预先设定一个值初值。int a,b,c;a=b=c=3; 也可以用赋值语句实现 可以在定义变量的同时使变量初始化int a,b,c=5;int a=3,b=3,c=3;例如int a;float f;char c;a=3; c=a;f=3.56; int a,b,c; c=5;精选课件数据的输入与输出是相对于计算机而言的。其中: 从计算机向外部设备输送数据称为输出。通常输出设备包括:显示器、打印机等; 从外部设备向计算机输送数据称为输入

16、。通常输入设备包括:键盘、鼠标、扫描仪等。 在C语言中,输入与输出是用标准库函数中的输入、输出函数实现的,这样就避免了在编译阶段将输入输出语句翻译成二进制代码及处理与硬件有关的问题,可是编译系统简化,通用性增强,可移植性好。3.4教学进程 数据输入输出的概念及在C语言中的实现 库函数已编译成目标文件,在连接时与编译源程序得到的目标文件(.obj)相连接,生成可执行程序(.exe)。注意:在使用系统库函数时,要用预编译命令#include将有关的头文件包含到用户源文件中(即在程序的开头) 。头文件中包含了调用函数时所需的有关信息。精选课件数据的输入与输出应包括以下几项: 用于输入或输出的设备。

17、输入或输出数据的格式。 输入或输出的具体内容。 在C语言提供的用于输入与输出的函数中,键盘是标准输入设备,显示器是标准输出设备。输出设备输入设备教学进程 另外,如果在程序中要使用C语言所提供的输入函数或输出函数,要用到“stdio.h”文件中的信息。则在使用前(即在程序的开头处)应该使用包含命令#include “stdio.h”将C语言中输入与输出的库函数包含进来。#include stdio.h3.4 数据输入输出的概念及在C语言中的实现精选课件 字符数据的输入输出3.53.5.1 用putchar函数输出一个字符 格式 putchar (c) 作用 输出变量c的值。 说明 c可以是字符型

18、或整型变量。 c可以是转义字符,如: putchar(101); 作用:输出字符A putchar(); 输出字符单引号 putchar(015); 输出回车 putchar (n); 输出换行教学进程精选课件#include void main ( ) char a,b,c; a=B;b=O;c=Y; putchar(a);putchar(b);putchar(c); putchar (n); 【例3.3】 输出单个字符。运行结果:BOY 教学进程精选课件 字符数据的输入输出3.53.5.2 用getchar函数输入一个字符 格式 getchar ( ) 作用 从计算机终端(键盘)输入一个字

19、符。 说明 函数的值就是从输入设备得到的字符。 getchar( )函数只能接收一个字符。 该函数可给字符型或整型变量提供一个字符。 该函数可作为表达式的一部分。教学进程putchar(getchar();printf(%c,getchar();精选课件#include void main ( ) char c; c=getchar( ); putchar(c); putchar (n); 【例3.4】 输入单个字符。运行结果:a /*输入一个字符*/a /*输出该字符*/从键盘输入一个字符给字符变量c教学进程精选课件 字符数据的输入输出3.53.5.2 用getchar函数输入一个字符 该函

20、数可作为表达式的一部分。教学进程 putchar(getchar(); printf(%c,getchar();#include void main ( ) char c; putchar( getchar( ) ); putchar (n); 精选课件3.6.1 用简单的printf函数输出数据 P52 printf (格式控制,输出表列) ;教学进程printf(%d,%cn,i,c); 格式控制 ,用一对双引号括起来,包括两种信息: 格式说明 由“%”和特定字符组成,如:%d、%c、%f等,是格式说明符,用于说明输出项目所采用的格式; 普通字符 作为说明性的文字、符号等,照原样显示出来。

21、 输出表列 中的各项目指出了所要输出的内容,可是常量、变量或表达式。 简单的格式输入与输出3.6 例如: printf(a=%d b=%fn,a,b) ;1. printf函数的一般格式精选课件 d教学进程按十进制整型数据的实际长度输出。 %i %c2. 基本的格式字符与%d格式相同,较少用。仅输出一个字符。 %s输出一个字符串。printf(%sn, CHINA);输出的结果是字符串 CHINA %f以小数形式输出一个实数(含单双精度数)。整数部分全部输出,并输出6位小数。 %e 或%E以指数形式输出一个实数(含单双精度数)。小数点前仅1位非0数字,并输出6位小数。精选课件教学进程 scan

22、f(“格式控制”,地址表列); 作用 将从键盘输入的a、b、c的值存入它们在内存中所占的存储单元里。存储单元由地址标识,是在编译连接阶段分配的。 说明 “格式控制”的含义同printf函数,说明输入的数据应使用的格式。 “地址表列”是由若干个地址组成的,可以是变量的地址或字符串的首地址。&是取地址运算符,用于取出变量的地址。 与格式输出一样,在格式控制中,用于说明输入数据格式的格式说明符总是以开头,后面紧跟的是具体的格式。scanf(%d,&a);3.6.2 用简单的scanf函数输入数据 P551. scanf函数的一般格式精选课件【例3.8】 用scanf函数输入数据。运行结果:3 4 5

23、 a=3,b=4,c=5 从键盘输入整型数给变量a、b、c/*输入的数据可用空格、Tab键、回车键之任一种分开*/#include void main ( ) int a,b,c; scanf(%d%d%d,&a,&b,&c); printf(a=%d,b=%d,c=%dn,a,b,c);bca453数据在内存中的存放教学进程精选课件 d按十进制整数的形式输入数据。 %i %c2. 格式说明与%d格式相同,较少用。仅能输入一个字符。 %s能输入一个字符串。 %f从键盘输入一个实数(含单双精度数),也可以指数形式输入一个实数。 %e 或%E教学进程scanf函数与printf函数中的格式说明相似

24、。精选课件 scanf函数中的“格式控制”后面应当是变量的地址,由取地址运算符和变量名共同组成,不能仅是变量名: scanf(%f%e%g, a, b, c); 如果“格式控制”中除了格式说明以外还有其它字符,则在输入数据时必须在对应位置输入与之相同的字符: scanf(%d,%d, &a,&b); 从键盘输入时必须输逗号: 3,4 说明教学进程 scanf函数中的“格式控制”后面应当是变量的地址,由取地址运算符和变量名共同组成,不能仅是变量名: scanf(%f%e%g, &a,&b,&c); 用%c格式输入字符时,空格和转义字符都作为有效字符输入,应注意: scanf(%c%c%c, &a

25、,&b,&c); 若输入:x y z 则a得到x,b得到空格,c得到y 用%c格式输入字符时,空格和转义字符都作为有效字符输入,应注意: scanf(%c%c%c, &a,&b,&c); 只有输入:xyz 才能使a得到x,b得到y,c得到z精选课件说明 对于unsigned型变量所需的数据,可以用%u或%d格式输入。教学进程 在输入数值型数据时,遇到空格、回车、Tab键或遇非法输入,则认为该数据结束: scanf(%d%c%f, &a,&b,&c); 若输入:1234a123o.26 a b c非法字符精选课件教学进程 按指定格式输出数据的宽度、小数位数、上下行数据按小数点对齐、用八进制、十六

26、进制输出等。 较复杂的输入输出格式控制 P583.7 3.7.1 输出数据格式控制 P62表3-1表3-2十进制形式 d 或 md 用于基本整型ld 或 mld 用于长整型u 或 mu 用于无符号基本整型lu 或 mlu 用于无符号长整型1 整型格式说明符intlongunsignedunsigned long八进制形式十六进制形式精选课件教学进程八进制形式o 或 mo 用于基本整型lo 或 mlo 用于长整型十六进制形式x 或 mx 用于基本整型lx 或 mlx 用于长整型m表示输出的整型数据所占总宽度(即列数),其中: 当实际数据的位数不到m位时,数据前面将用空格补满; 若实际数据位数大于

27、m,则以数据的实际位数为准进行输出。对于o或x 格式,输出的数据不带符号,符号位也作为数据的一部分输出了,所以不会有负数输出。一个int型整数也可以%u格式输出,反之一个unsigned型整数也可以%d、%o、%x格式输出。按相互赋值的规则处理。intlongintlong精选课件【例3.9】 无符号数据的输出。# include void main() unsigned 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=65535,177777,ffff,65535

28、 b=-2,3777777776,fffffffe,4294967294 教学进程1111111111111111前两字节16个00111111111111111前两字节16个1精选课件2 字符型格式说明符教学进程 一个整数,只要其值在0255范围内,也可义用“%c”格式使其按字符形式输出。 在输出前,系统会自动将该整数作为ASCII码转换成相应的字符;反之,一个字符也可以输出成一个整数。 字符char型 mc 输出的字符占m列,如:printf(“%3c”,a);实际输出为:a字符串ms 输出的字符串占m列。若串长m,全部输出;若串长m,左面补空格。-ms 输出的字符串长m,右面补空格-m.

29、ns 只取字符串前n个字符。若nn,m自动取n值。精选课件【例3.10】 字符串的输出。# include void main ( ) printf(%3s,%7.2s ,%-5.3s,%.4sn,CHINA,CHINA, CHINA, CHINA);运行结果: CHINA, CH, CHI, CHIN教学进程精选课件3 实型格式说明符十进制数形式教学进程指数形式m.ne 或 -m.nem.nf 或 -m.nf 在输出实型数据时,格式说明符中的m表示整个数据所占的宽度,n表示小数点后面所占的位数。 如果在小数点后取n位后,所规定的数据宽度m不够输出数据前面的整数部分(包括小数点),则按实际的位

30、数进行输出。 需要指出的是,在C语言中,用于输出单精度实型数据与双精度实型数据格式说明符是一样的。 %g或%G形式根据数值的大小,自动选f 或 e中宽度较短的一种格式,不输出无意义的0。精选课件【例3.11】 输出实数时,指定小数位数。# include void main ( ) float f=123.456; printf(%f%10f%10.2f%.2f%-10.2fn,f,f,f,f,f);运行结果: 123.456001123.456001123.46123.46123.46 教学进程精选课件【例3.12】 求3个圆的周长,输出结果时上下按小数点对齐,取两位小数。# include

31、 #define PI 3.1415926void main ( )double r1=1.53,r2=21.83,r3=123.71,s1,s2,s3; s1=2.0*PI*r1; s2=2.0*PI*r2; s3=2.0*PI*r3; printf(r1=%10.2fnr2=%10.2fnr3=%10.2fn,r1,r2,r3);运行结果:r1=1.53 r2=21.83 r3=123.71 教学进程精选课件【例3.12】 求3个圆的周长,输出结果时上下按小数点对齐,取两位小数。# include #define PI 3.1415926void main ( )double r1=1.5

32、3,r2=21.83,r3=123.71,s1,s2,s3; s1=2.0*PI*r1; printf(r1=%10.2fts1=%10.2fn,r1,s1); s2=2.0*PI*r2; printf(r2=%10.2fts2=%10.2fn,r2,s2); s3=2.0*PI*r3; printf(r3=%10.2fts3=%10.2fn,r3,s3);运行结果:r1=1.53,s1=9.61r2=21.83, s2=137.16r3=123.71, s3=777.29教学进程精选课件 格式输出函数的执行过程如下:教学进程 首先,在计算机内存中开辟一个输出缓冲区,用于存放输出项目表中各项目

33、数据。 然后,依次计算项目表中各项目(常量或变量或表达式)的值,并按各项目数据类型应占的字节数依次将它们存入输出缓冲区中。 最后,根据“格式控制”字符串中的各格式说明符依次从输出缓冲区中取出若干字节的数据(如果是非格式说明符,则将按原字符输出),转换成对应的十进制数据进行输出。其中从输出缓冲区中取多少个字节的数据是按照对应格式说明符说明的数据类型。 在“格式控制”的格式说明符中,如果带有宽度说明,则在左边没 有数字的位置上用空格填满(即输出的数字是右对齐)。但如果在宽度 说明前加一 个负号(-),则输出为左对齐,即在右边补空格。精选课件【例】 设有如下C程序:#include stdio.hm

34、ain() double x=34.567; printf(x=fn,x); printf(x=dn,x); printf(x=dn,(int)x);这个程序的实际运行结果为x=34.567000 x=27263x=34 显然,这个程序中的第二个格式输出语句输出的结果是错误的,这是因为在第二个格式输出语句中,格式说明符d是基本整型格式说明符,而输出项目是双精度型的数据,它们是不匹配的。教学进程精选课件教学进程十进制形式 d 或 md 用于一般整型ld 或 mld 用于长整型u 或 mu 用于无符号基本整型lu 或 mlu 用于无符号长整型八进制形式o 或 mo 用于一般整型lo 或 mlo 用

35、于长整型十六进制形式x 或 mx 用于一般整型lx 或 mlx 用于长整型可见:用于输入与输出整型数据的格式说明符是完全一样的。 m表示输入数据时的宽度(即列数)。 与输出情形一样,对于八进制形式与十六进制形式的输入格式,主要用于输入无符号整型的数据。 3.7.2 输入数据格式控制 P63表3-3表3-4整型格式说明符精选课件实型格式说明符教学进程单精度实型双精度实型lff 或 e与输出不同,输入时无论是单精度还是双精度实型,都不能用m.n来指定输出的宽度和小数点后的位数;可以指定输入数据所占的列数,系统自动按它截取所需数据,如:scanf(“%3d%3d”,&a,&b); 当输入123456

36、7时,a得到123,b得到456,多余的7无用;若在%号后有一个“*”和一个数字,表示跳过它指定的列数,如:scanf(“%2d%*3d%3d”,&a,&b);当输入12345678时,a得到12, %*3d表示读入345这3个数但不赋给变量, b得到678。精选课件 mc 对取得的m个字符仅第一个赋给变量字符型格式说明符教学进程下面是用到格式输入的一个程序:#include stdio.hmain() int a; float b; char c; scanf(dfc,&a,&b,&c); 下面对格式输入作几点说明: 在格式输入中,内存地址表中的各项目必须是变量地址,而不能是变量名,且彼此间

37、用“,”分隔。为此,C语言专门提供了一个取地址运算符&。例如,&a表示变量a在内存中的首地址。精选课件教学进程 当用于输入整型数据的格式说明符中没有宽度说明时,则在具体输入 数据时分为以下两种情况: 如果各格式说明符之间没有其它字符,则在输入数据时,两个数据 之间用空格、或Tab、或回车来分隔。 如果各格式说明符之间包含其它字符,则在输入数据时,应输入与 这些字符相同的字符作为间隔。 例如,设有如下说明 int a, b ; float c, d ; 现要利用格式输入函数输入a=12,b=78,c=12.5,d=7.6。 采用不同的格式说明,其输入数据的形式也是不同的。分别说明如下:精选课件教

38、学进程 若输入语句为 scanf(ddff,&a,&b,&c,&d); (即格式说明符中没有宽度说明,各格式说明符之间也没有其他字符。) 则输入数据的形式应为 12 78 12.5 7.6 (两个数据之间用空格来分隔,当然也可用“Tab”或“回车”来分隔。) 若输入语句为 scanf(d,d,f,f,&a,&b,&c,&d);(格式说明符中没有宽度说明,但各格式说明符之间有其它字符,即逗号) 则输入数据的形式应为 12,78,12.5,7.6 (即在输入的两个数据之间同时要输入逗号。) 若输入语句 scanf(“a=d,b=d,c=f,d=f”,&a,&b,&c,&d); (即格式说明符中没有

39、宽度说明,但各格式说明符之间有其它字符。) 输入数据的形式应为 a=12,b=78,c=12.5,d=7.6 (即在输入的两个数据之间同时要输入这些非格式说明符的字符。)精选课件教学进程 当整型或字符型格式说明符中有宽度说明时,按宽度说明截取数据。一个字符型变量只能存放一个字符【例】 设有以下程序:#include stdio.hmain() int a,d; char b,c; printf(input a,b,c,d:); scanf(3d3c2c2d,&a,&b,&c,&d); printf(a=d,b=c,c=c,d=dn,a,b,c,d); 若从键盘输入如下(其中“input a,b

40、,c,d :”为输出的字符串): input a,b,c,d: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 3d 3c 2c 2d 则它们与各格式说明符之间的对应关系如上,最后赋给各变量的值为 a=123,b=4,c=7,d=90精选课件教学进程 在用于输入的实型格式说明符中不能用m.n来指定输入的宽度和小数 点后的位数(这是与输出的不同之处)。 例如: scanf(“7.2f”,&a); 此用法是错误的 为了便于程序执行过程中从键盘输入数据,在一个C程序开始执行时, 系统就在计算机内存中开辟了一个输入缓冲区,用于暂存从键盘输入 的数据。开始时该输入缓冲区是空的。当执行到一

41、个输入函数时,就 检查输入缓冲区中是否有数据: 如果输入缓冲区中已经有数据(上一个输入函数剩下的),则依次按照“格式控制”中的格式说明符从输入缓冲区中取出数据转换成计算机中的表示形式(二进制),最后存放到内存地址表中指出的对应地址中。精选课件 如果输入缓冲区中没有数据(即输入缓冲区位空),则等待用 户从键盘输入数据并依次存放到输入缓冲区中。当输入一个或符后,将依次按照“格式控制”中还未用过的格式说明符从输入缓冲区中取出数据转换成计算机中的表示形式(二进制),最后存放到内存地址表中指出的对应地址中。教学进程 在上述两种任一种情况下,从输入缓冲区中取数据,如果遇到或字符,则将输入缓冲区清空。此时如

42、果“格式控制”中的格式说明符还未用完,则继续等待用户从键盘输入数据并依次存放到输入缓冲区中,直到输入一个或符后,再依次按照“格式控制“中还未用过的格式说明符从输入缓冲区中取出数据转换成计算机中的表示形式(二进制),最后存放到内存地址表中指出的对应地址中。这个过程直到“格式控制”中的格式说明符用完为止。此时如果输入缓冲区中的数据还未取完,则将留给下一个输入函数使用。精选课件教学进程 与格式输出一样,格式输入的格式控制中的各格式说明符与内存地 址表中的变量地址在个数、次序、类型方面必须一一对应。 从以上输入函数的执行过程可以看出,从键盘输入数据是以或作为结束的。当输入的数据一行不够时,可以在下一行

43、继续输入;当一行上的数据用不完时,可以留给下一个输入函数使用。 需要注意的是,由于或是作为键盘输入数据的结束符,因此,在输入函数的格式控制中,最后不能加换行符n。精选课件【例3-5】 设有C程序如下:#include stdio.hmain() double x; printf(input x:); scanf(f,&x); printf(x=fn,x);这个程序的运行结果为(其中有下划线的部分为键盘输入)input x:123.456x=0.000000 显然,输出语句输出的x值是错误的。这是因为,x定义为双精度型的实型变量(占8B),但它使用的是单精度实型的输入格式说明符。当输入一个实型数

44、123.456后,将按照单精度输入格式说明符将它转换成计算机中的表示形式(只占4B),最后存放到为双精度实型变量x所分配的存储空间的低4B中,而为双精度实型变量x所分配的存储空间的高4B中的各位均是0,这就造成双精度实型变量x的(阶码N-2)的11位偏移码均位0,这是C语言中无法表示的一个绝对值很小的数(称为下溢),默认为实型数0.0。教学进程精选课件教学进程 顺序结构程序设计举例 P643.8 程序中所有语句都是按自上而下的顺序执行的,不发生跳转。【例3.13】 输入三角形的三边长,求三角形的面积。分析: 设输入的三边能构成三角形; 求三角形面积的公式为 据此编写程序如下:精选课件教学进程

45、顺序结构程序设计举例 P643.8#include #include void main() float a,b,c,s,area; scanf(%f,%f,%f,&a,&b,&c); s=(a+b+c)/2.0; area=sqrt(s*(s-a)*(s-b)*(s-c); printf(a=%fnb=%fnc=%fnarea=%fn,a,b,c,area); 当输入:3.4,4.5,5.6运行结果为:a=3.400000b=4.500000c=5.600000area=7.649173printf(a=%7.2fnb=%7.2fnc=%7.2fnarea=%7.2fn,a,b,c,area

46、);若将输出语句改为:运行结果为:a=3.40b=4.50c=5.60area=7.65精选课件教学进程 顺序结构程序设计举例 P643.8【例3.14】 从键盘输入一个大写字母,要求用小写输出。分析: 大写字母与小写字母的ASCII码值相差32。 对从键盘输入的大写字母加32即变为相应的小写字母。据此编写程序如下:#include void main() char c1,c2; c1=getchar(); printf(%c,%dn,c1,c1); c2=c1+32; printf(%c,%dn,c2,c2);当输入:A运行结果为:A,65a,97精选课件教学进程 顺序结构程序设计举例 P6

47、43.8【例3.15】 求一元二次方程 的根。 要求:系数a、b、c从键盘输入; 假设:分析: 已知一元二次方程的根为: 则: 可将上式分解为两项:据此编写程序如下:精选课件教学进程 顺序结构程序设计举例 P643.8#include #include void main ( ) float a,b,c,disc,x1,x2,p,q; scanf(a=%f,b=%f,c=%f,&a,&b,&c); disc=b*b-4*a*c; p=-b/(2*a); q=sqrt(disc)/(2*a); x1=p+q;x2=p-q; printf(x1=%5.2fnx2=%5.2fn,x1,x2);当输入

48、:a=1,b=3,c=2运行结果为:x1=-1.00 x2=-2.00精选课件【例3.1】 有符号整数赋给无符号整型变量,数据会变化,按字节原样赋值,即符号位也作为数值一起传送。#include void main ( ) unsigned a; /*定义a为无符号整型变量*/ int b; /*定义b为有符号整型变量*/ b=-1; a=b; printf(%un,a);运行结果:4294967295 (vc中,232-1) |-1|0000000000000001取反1111111111111110加11111111111111111教学进程精选课件#include void main (

49、 ) unsigned a; /*定义a为无符号整型变量*/ int b; /*定义b为有符号整型变量*/ b=-1; a=b; printf(a=%un,a); printf(b=%dn,b);运行结果:a=4294967295 (vc中,232-1)b=-1教学进程精选课件【例3.2】 无符号整数赋给有符号整型变量,注意数值范围。#include void main ( ) unsigned a; /*定义a为无符号整型变量*/ int b; /*定义b为有符号整型变量*/ a=4294967295; b=a; printf(%dn,b);运行结果:-1 (vc中,232-1)减11111

50、111111111111取反1111111111111110 -10000000000000001教学进程精选课件教学进程字符型格式说明符【例3.5】 字符数据的输出。#include void main()char c=a; int i=97; printf(%c,%dn,c,c); printf(%c,%dn,i,i);运行输出的结果为a,97 a,97精选课件教学进程实型格式说明符【例3.6】 输出单精度实数时的有效位数。#include void main() float x,y; x=111111.111;y=222222.222; printf(%fn, x+y);运行结果为333

51、333.328125整数部分全部输出,并输出6位小数。有效位数一般为7位。精选课件教学进程实型格式说明符【例3.7-1】 输出双精度数时的有效位数。#include void main()double x,y; x=11111111.11111111;y=22222222.22222222; printf(%fn, x+y);运行结果为33333333.333333整数部分全部输出,有效位数可为16位,因用f格式仅输出6位小数。精选课件教学进程实型格式说明符【例3.7-2】 以指数形式输出双精度数时的有效位数。#include void main()double x,y; x=11111111

52、.11111111;y=22222222.22222222; printf(%en, x+y);运行结果为3.333333e+007以指数形式输出实数,小数为6位。数值部分按规范化指数形式输出。精选课件教学进程 顺序结构程序设计举例 P643.8 程序中所有语句都是按自上而下的顺序执行的,不发生跳转。【例3.13】 输入三角形的三边长,求三角形的面积。分析: 假设输入的三边能构成三角形; 求三角形面积的公式为 半边长计算公式为据此编写程序如下:精选课件教学进程#include #include void main() float a,b,c,s,area; scanf(%f,%f,%f,&a,&b,&c); s=(a+b+c)/2.0; area=sqrt(s*(s-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论