第三章 最简单的C程序设计——顺序程序设计
一、数据的表现形式及其运算
1、常量和变量
在计算机高级语言中,数据有两种表现形式:常量和变量。
1.1、常量
在程序运行过程中,其值不能被改变的量称为常量。如:5,6,32,0.111。
数值常量就是数学中的常数。
常量分类:
(1)整型常量。如:1000,1234561,0,347等。
(2)实型常量。有两种形式:
十进制小数形式:有数字和小数点组成。如:123.456,0.345,-56.8等。
指数形式:如12.34e3(代表12.34x10^3),-346.87e-25(代表-346.87ex10^25),用e或E代表以10为底的指数。e或E前必须有数字,且e之后必须为整数。
(3)字符常量。有两种形式:
普通字符:用单撇号括起来的一个字符。如:‘a’,'b','3','?','#'。
注意:单撇号只是界限符,字符常量只能是一个字符,不包括单撇号。‘a’和‘A’是不同的字符常量。
字符常量存在计算机储存单元中,并不是存储字符(如:a,z,#等)本身,而是以其代码(ASCII代码)存储的,
如字符‘a’的ASCII化代码是97,因此,在存储单元中存储的是97(以二进制形式存放)。
转义字符:以字符 \ 开头的字符序列。
‘\n’代表一个“换行符”,‘\t’代表将输出的位置跳到下一个tab位置(制表位置),一个tab位置为8列,这是一种无法显示的“控制字符”。
转义字符 | 字符值 | 输出结果 |
\' | 一个单撇号(‘’) | 具有此八进制码的字符 |
\" | 一个双撇号(”) | 输出此字符 |
\? | 一个反问号(?) | 输出此字符 |
\\ | 一个反斜线 | 输出此字符 |
\a | 警告(alert) | 产生声音或视觉信号 |
\b | 退格(backspace) | 将当前位置后退一个字符 |
\f | 换页(form feed) | 将当前位置移到下一页的开头 |
\n | 换行 | 将当前位置移到下一行开头 |
\r | 回车(carriage return) | 将当前位置移到本行开头 |
\t | 水平制表符 | 将当前位置移到下一个tab位置 |
\v | 垂直制表符 | 当当前位置移到下一个垂直制表对齐点 |
\o、\oo、\ooo 其中o代表一个八进制数字 |
与该八进制对应的ASCII字符 | 与该八进制码对应的字符 |
\xh[h···] 其中h代表一个十六进制数字 |
与该十六进制对应的ASCII字符 | 与该十六进制码对应的字符 |
表中列出的字符称为“转义字符”,将“\”后面的字符转换成另外的意义,如“\n”中“n”不是字母而是“换行符”。
'\101'代表八进制数101的ASCII字符,即‘A’(相当于十进制数65);
‘\012’代表八进制数12(即十进制数的10)对应“换行”符;
‘\x41’代表十六进制数41的ASCII字符,即‘A’(41相当于十进制数65);
‘\033’或'\x1B'代表ASCII代码为27的字符,即ESC控制符;
'\0'或'\000'代表ASCII码为0的控制字符,即“空操作”字符,它常在字符串中。
注解:C语言没有指定使用哪种字符集,由编译系统自行决定;
C语言规定:基本字符集中的每个字符,必须用一个字节表示;空字符也占一个字节,它的所有二进制位都是0。
(4)字符串常量。如“boy”,“123”
用双撇号把若干个字符括起来,字符串常量是双撇号中的全部字符(不包括双撇号),单撇号只能包含一个字符,
双撇号可以包含一个字符串。
说明 :从字面形式上即可辨别的常量称为“字面常量”或“直接常量”,即没有名字的不变量
(5)符号常量。用 #define 指令,指定用一种符号名称代表符号常量。
如:#define PI 3.1416 (行末尾没有分号),在对程序进行编译前,预处理器先对PI进行处理,把所有PI全部置换为3.1416。
优点:含义清楚、能做到“一改全改”。
注意:区分符号常量和变量。符号常量不占内存,只是一个临时符号,在预编译后这个符号就不存在了,故不能对符号常量赋以新值。
符号常量一般用大写。
1.2、变量
变量代表一个有名字的具有特定属性的一个存储单元,用来存放数据即存放变量的值。变量需先定义后使用。
如:a=3,a是变量名,3是变量值即存放在变量a的内存单元中的数据,变量名是以一个名字代表的一个存储地址。
在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。
从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。
一般在函数开头声明部分定义变量,函数外定义变量(即外部变量,全局变量)。
变量取值: 通过变量名——>内存地址——>读入数据
1.3、常变量
如:const int a=3;表示a被定义为一个整型变量,指定其值为3,而且在变量存在期间其值不能改变。
常变量与常量的异同:常变量有变量的基本属性,有类型,占存储单元,只是不允许改变其值。
常变量是有名字的不变量而常量是没有名字的不变量。
常变量与符号常量有什么不同?
# define PI 3.1415926 //定义符号常量
const float pi=3.1415926 //定义常变量
两者都代表3.1415926,在程序中都能使用。但二者性质不同:定义符号常量用 #define 指令,预编译指令,用符号常量代表一个字符串,
在预编译时进行字符替换,预编译后符号常量就不存在了(全置换成3.1415926),对符号常量的名字是不分配存储单元的。而常变量占用存储单元,有变量值,只是该值不改变。
有了常变量可以不使用符号常量。
1.4、标识符
在计算机高级语言中,用来对变量,符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。
简单的说标识符就是对象的名字。
C语言规定标识符只能由字母、数字、下划线三种字符组成,且第一个字符必须为字母或下划线。
2、数据类型
类型:对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。
其中基本类型和枚举类型变量的值都是数值,统称为算术类型。
算数类型和指针类型统称为纯量类型,其变量的值都是用数字表示。
枚举类型是程序中用户定义的整数类型。
数组类型和结构体类型统称为组合类型。共用体类型不属于组合类型,因同一时间内只有一个成员具有值。
函数类型用来定义函数,描述一个函数的接口,包括函数的返回值的数据类型和参数的类型。
不同类型的数据在内存中占用不同存储单元长度;存储不同类型数据方法不同。
3、整型数据
3.1、整型数据的分类
(1)基本整型(int)
分配字节:编译系统分配给int型数据2个字节或4个字节,具体由编译系统决定。
在Turbo C中分配2个字节(十六个二进位),VC 中分配4个字节(三十二个二进位)。
存储方式:用整数的补码形式存放,即二进制形式存放。如正数5的二进制形式是101,分配两个字节,
在存储单元中数据形式:00000000 00000101。
如果是负数则应先求出负数的补码,求负数的补码方法:先将此数的绝对值写成二进制形式,然后对其后面所有各
二进位按位取反再加一。
在存放正数的存储单元中,最左面一位是用来表示符号的,0表示正数,1表示负数。
(2)短整型(short int)
分配字节:在VC中编译系统分配给int数据4个字节,短整型2个字节。
存储方式:与int型相同。
(3)长整型(long int)
分配字节:分配4个字节。
存储方式:与int型相同。
补充:sizeof(short)是测量类型或变量长度的运算符。
3.2、整型变量的符号属性
变量值在存储单元中都是以补码形式存储的,存储单元中的第一个二进位制代表符号。
类型 | 字节数 | 取值范围 |
int(基本整型) | 2 | -32768~32767,即-2^15~(2^15-1) |
4 | -2147483648~ 2147483647,即-2^31~(2^31-1) | |
unsigned int(无符号基本类型) | 2 | 0~65535,即0~(2^16-1) |
4 | 0~4294967295,即0~(2^32-1) | |
short(短整型) | 2 | -32768~32767,即-2^15~(2^15-1) |
unsigned short(无符号短整型) | 2 | 0~65535,即0~(2^16-1) |
long(长整型) | 4 | -2147483648~ 2147483647,即-2^31~(2^31-1) |
unsigned long(无符号长整型) | 4 | 0~4294967295,即0~(2^32-1) |
long long(双长型) | 8 |
-9223372036854775808~ -9223372036854775807 即-2^63~(2^63-1) |
unsigned long long(无符号双长整型) | 8 | 0~18446744073709551615,即0~(2^64-1) |
为了充分利用变量的值得范围,可以将变量第一位“无符号”类型。可以在类型符号前面加上修饰符unsigned,表示指定该变量是“无符号整数”类型,
加上修饰符signed则是有符号类型。例如:[signed] int ; unsigned int ;[signed] short [int] ; unsigned short [int] ;
如果没有指定符号类型,默认是“有符号类型(signed)”。
有符号类型数据存储单元中最高位代表符号(0为正,1为负)。如果指定unsigned(为无符号)型,存储单元中全部二进位都用作存放数值本身,而没有符号。
无符号类型变量只能存放不带符号的整数,如123,456等,而不能存放负数。
说明: 只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加。
对无符号整型数据用“%u”格式输出。%u表示用无符号十进制数的格式输出。
4、字符型数据
由于字符是按其代码(整数)形式存储的,因此C99把字符型数据作为整数类型的一种。
4.1、字符与字符代码
字符与字符代码并不是任意写一个字符,程序都能识别的。只有使用系统的字符集中的字符如ASCII字符集,才能被识别。
ASCII字符集基本包括了127个字符。其中包括:
·字母:大写英文字母A~Z(十进制数65~90),小写英文字母a~z(97~122)
·数字:0~9
·专门符号:29个,!“ # ’ & ()* + , - . : ;< = > ? [ \ ] ^ _ ` { | } ~
`空格符:空格、水平制表符(tab)、垂直制表符、换行、换页(form feed)
·不能显示的字符:空(null)字符(以‘\0’不表示)、警告(以‘\a’表示)、退格(以'\b'表示)、回车(以'\r'表示)等
这些字符的ASCII值全部用一个字节(8位)表示,只用到七个二进制位,第一位为0。
注意:字符‘1’和整数1是不同的概念,字符‘1’只是代表一个形状为'1'的符号,需要时原样输出,在内存中以ASCII码形式存储,占一个字节,
而整数1是以整数形式存储方式(二进制补码方式)存储的,占2个字节或4个字节。整数运算1+1等于整数2,而字符'1'+'1'不等于整数2或字符‘2’。
4.2、字符变量
字符变量是用类型符char定义字符变量。
char c=‘?’;
定义c为字符型变量并使初值为字符‘?’。其ASCII值是63,系统把整数63赋给变量c。c是字符变量,实质上是一个字节的整型变量,由于它常用来存放字符。
所以称为字符变量
输出形式:可以选择十进制整数形式或字符形式输出。“%d”输出十进制数,“%c”格输出字符。
字符类型也可以用signed和unsigned修饰。如果将一个负整数赋给有符号字符型变量是合法的,但它不代表一个字符,而作为一个字节整型变量存储负整数。
5、浮点型数据
浮点型数据是用来表示具有小数点的实数的。实数是以指数形式存放在存储单元中。由于小数点位置可以浮动,所以实数的指数形式称为浮点数。
规范化指数形式:把小数部分中小数点前的数字为0、小数点后第一位数字不为零的表示形式。
(1)float型(单精度浮点型)
分配字节:4个字节
存储方式:数值以规范化的二进制指数形式存放在存储单元中。
在存储时,系统将实型数据分成小数部分和指数部分两个部分,分别存放。用二进制数来表示小数部分以及用2的幂次表示指数部分。
小数部分占的位(bit)数越多,数的有效数字越多,精度也就越高。指数部分占的位数越多,则能表示的数值范围越大。
(2)double型(双精度浮点型)
分配字节:8个字节
存储方式:与float相同
在C语言中进行浮点数的算术运算时,将float型数据都自动转换为double型,然后进行运算。
(3)long double型(长双精度)
分配字节:Turbo C分配16个字节。而VC分配8个字节
存储方式:与float相同
类型 | 字节数 | 有效数字 | 数值范围(绝对值) |
float | 4 | 6 | 0以及1.2x10^-38~3.4x10^38 |
double | 8 | 15 | 0以及2.3x10^-308~1.7x10^308 |
long double | 8 | 15 | 0以及2.3x10^-308~1.7x10^308 |
16 | 19 | 0以及3.4x10^-4932~1.1x10^4932 |
6、怎样确定常量的类型
从常量的的表示形式即可判定其类型。对于字符常量只要看到单撇号括起来的单个字符或转义字符就是字符常量。对于数值常量按一下规律:
(1)整型常量
不带小数点的数值是整型常量。在Turkbo C中系统为整型数据分配2个字节,范围是-32768~32767,如23456,系统把它作为int型处理,用两个字节存放。
如果超过此范围,系统会把它作为长整型(long int)处理,分配4个字节。
在VC中凡是在-2147483648~2147483647之间的不带小数点的数都作为int型,分配4个字节,在此范围外的整数,而又在long long 型数的范围内的整数,
作为long long型处理。
在一个整数的末尾加大写字母L或小写字母l,表示它是长整型(long int),分配4个字节。
(2)浮点型常量
凡是以小数形式或指数形式出现的实数,是浮点型常量。在内存中以指数形式存储。
如:10是整型常量,10.0是浮点型常量,在C编译系统中都按双精度处理,分配8个字节。
在常量的末尾加专用字符,强制指定常量的类型。如在3.14159后面加字母F或f,就表示float型常量,分配4个字节。如果在实型常量后面加大写或小写的L,
指定类型为long double类型。
7、运算符和表达式
(1)基本的算术运算符
运算符 | 含义 | 举例 | 结果 |
+ | 正号运算符(单目运算符) | +a | a 的值 |
- | 负号运算符(单目运算符) | -a | a的算术负值 |
* | 乘法运算符 | a*b | a和b的乘积 |
/ | 除法运算符 | a/b | a除以b的商 |
% | 求余运算符 | a%b | a除以b的余数 |
+ | 加法运算符 | a+b | a和b的和 |
- | 减法运算符 | a-b | a和b的差 |
两个实数相除的结果是双精度实数,两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分。在VC中采取“向零取整”的方法。
%运算符要求参加运算的对象(即操作数)为整数,结果也是整数。
除%以外的运算符的操作数都可以是任何算术类型。
(2)自增自减运算符
作用:使变量的值加上或减1.
++i , --i (在使用之前使i的值加(减)1)
i++ , i-- (在使用之后使i的值加(减)1)
++i 和 i++ 的作用相当于 i=i+1 ,不同之处是:++i 是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1。
如:i=3 ;
j=++i ;(i的值先变成4,再赋给j,j的值为4)
j=i++ ; (先将i的值3赋给j,j的值为3,然后i变为4)
注意:自增运算符(++)和自减运算符(--)只能用于变量,而不能用于常量或表达式。
自增(减)运算符常用于循环语句中,使循环变量自动加1;也用于指针变量,使指针指向下一个地址。
(3)算术表达式和运算符的优先级与结合性
C算术表达式:用运算符和括号将运算对象(也成操作数)连接起来的,符合C语法规则的式子。
运算对象包括常量,变量,函数。如:a*b/c+1.5+'a'-'A'
如果运算对象两侧的运算符的优先级别相同,则按规定的“结合方向”处理。“自左至右”的结合方向称为“左结合性”,反之称为“右结合性”。
条件预算符是C语言中唯一的三目运算符(即 ?:)。
表5 运算符合结合性
同一级运算符,相关问题解决
(4)不同类型数据间的混合运算
整型,实型,字符型数据间都可以进行混合运算。
规则如下:
·+、-、*、/运算的两个数中有一个数为float或double,结果是double,因系统将所有float型数据都先转换为double型,然后进行运算。
·如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行运算,结果是double型。
·字符char型数据与整型数据与实型数据进行运算,则将字符的ASCII值转换为double型数据,然后进行运算。
以上都是系统自动完成,我们只需要知道原理即可。
(5)强制类型转换运算符
利用强制类型转换运算符将一个表达式换成所需类型。
如:(double)a (将a转成double类型)
(int)(x+y) (将x+y的转换成int型)
(float)(5%3) (将5%3的转换成float型)
一般形式为(类型名)(表达式)
说明:在强制类型转换时,得到一个所需类型的中间数据,而原来的变量的类型未发生变化。
如:a=(int)x
如果以定义x为float型变量,a为整型变量,进行强制类型运算(int)x后得到一个int类型的临时值,它的值等于x的整数部分赋给a,x的值和类型都未变化,仍为float型。
临时值在赋值后就不存在了。
两种类型转换:第一种是运算时,系统自动进行的类型转换。
第二种是强制类型转换。
二、C语句
1、C语句的作用和分类
一个函数包含声明部分和执行部分,执行部分是由语句组成的。
语句的作用:向计算机系统发出操作指令,要求执行相应的操作。
一个C语句经过编译后产生若干条机器指令。
声明部分不是语句,它不产生机器指令,只是对有关数据的声明。
一个C程序可以由若干个源程序文件(编译时以文件模块为单位)组成;
一个源程序文件可以由若干个函数和预处理指令以及全局变量声明部分组成;
一个函数由数据声明部分和执行语句组成。
(1)控制语句
控制语句用于完成一定的控制功能。
九种控制语句如下:
if()···else··· (条件语句)
for()··· (循环语句)
while()··· (循环语句)
do···while() (循环语句)
continue (结束本次循环语句)
break (中止执行switch或循环语句)
switch (多分支选择语句)
return (从函数返回语句)
goto (转向语句,在结构化程序中基本不用goto语句)
“()”表示括号中是一个“判别条件”,“···”表示内嵌的语句。
(2)函数调用语句
函数调用语句由一个函数调用加一个分号构成。如:printf(“Hello World!”);是一个函数调用,加一个分号称为一个语句。
(3)表达式语句
表达式语句由一个表达式加一个分号构成。
最经典的是由赋值表达式构成一个赋值语句,如:a=3 是一个赋值表达式,而a=3 ;是一个赋值语句。
一个表达式的最后加一个分号就成了一个语句。任何表达式都可以加上分号而成为语句,如:i++;是一个语句。x+y;是一个语句是合法的,但是没有实际意义。
(4)空语句
;
此语句只有一个分号,它什么也不做。
作为流程的转向点(流程从程序其他地方转到此语句处)
作为循环语句中的循环体(循环体是空语句),表示循环体什么也不做。
(5)复合语句
用{ }把一些语句和声明括起来成为复合语句(又称语句块)。
如:{
float pi=3.14159 ,r=2.5,area; //定义变量
area=pi*r*r;
printf(“area=%f”,area);
}
其中声明部分可以放在复合语句的任何位置,但习惯上把它放在语句块开头位置。
2、最基本的语句——赋值语句
在C程序中,最常用的语句是:赋值语句和输入输出语句。其中最基本的是赋值语句。
(1)赋值运算符
赋值符号=就是赋值运算符。
作用:将一个数据赋给一个变量。如a=3的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。
也可以将一个表达式的值赋给一个变量。
(2)复合的赋值运算符
在赋值符=之前加上其他运算符,可以构成复合运算符。
在“=”前加一个“+”,运算符就成了复合运算符“+=”。
如:a+=3 等价于 a=a+3 (先使a加3,再赋给a)
x*=y+8 等价于x=x*(y+8)
x%=3 等价于 x=x%3
凡是二元(二目)运算符,都可以与赋值符一起组合成复和运算符。如:+=、-=、*=、/=、%=。
(3)赋值表达式
赋值语句是在赋值表达式的末尾加一个分号构成的。
赋值表达式:由赋值运算符将一个变量和一个表达式连接起来的式子。
一般形式为:变量 赋值运算符 表达式 如:a=3*5,变量a和表达式的值都是15
作用:将一个表达式的值赋给一个变量,赋值表达式具有计算和赋值的双重功能。
出现在赋值运算符左侧的是“左值”,出现在赋值运算符右侧的是“右值”,其中左值的值是可以改变的,左值也可以作为右值,如:b=a;(b是左值)c=b;(b也是右值)。
变量可以作为左值,算术表达式a+b和常量都不能作为左值(常量不能被赋值)。
赋值表达式中的表达式,又可以是一个赋值表达式。
如:a=(b=5)括号内b=5是一个赋值表达式值为5。
执行a=(b=5)就是执行b=5和a=b两个赋值表达式,a的值也为5,整个赋值表达式也为5。因“自右而左”的结合顺序,因此(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,c等于6)
a=(b=10)/(c=2)(表达式值为5,a等于5,b等于10,c等于2)
分析a=(b=3*4)赋值表达式:
将3*4的值先赋给变量b,然后把变量b的值赋给变量a,最后a和b的值都等于12。
错误的赋值表达式例子:(a=b)=3*4和a=(a=b)=3*4(a是左值,(a=b)不是左值)
赋值表达式也可以包含复合的赋值运算符。例如:
a+=a-=a*a
是一个赋值表达式。如a的初始值为12,先进行“a-=a*a”的运算,它相当于a=a-a*a,a的值为12-144=-132,
再进行“a+=-132”的运算,相当于a=a+(-132),a的值为-132-132=-264。
赋值表达式可以以表达式的形式出现在其他语句中。如:printf(“%d”,a=b);完成了赋值和输出的双重功能。
(4)赋值过程中的类型转换
赋值运算符两侧的类型一致,则直接进行赋值,如:i=234; //设已定义i为整型变量,此时直接将整数234存入变量i的存储单元中。
如果赋值运算符两侧的类型不一致,但都是算术类型时,类型转换由系统自动进行的,转换的规则是:
(1)将浮点型数据(包括单、双精度)赋给整型变量时,先对浮点数取整,即舍弃 小数部分然后赋给整型变量。如:i为整型变量,i=3.67的结果是使i的值为3。
(2)将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中,以二进制指数形式存在存储单元中。
(3)将一个double型数据赋给float变量时,先将双精度数转换为单精度,即只取6~7位有效数字,存储到float变量的4个字节中。
将一个float型数据赋给double变量时,数值不变,在内存中以8个字节存储,有效数字扩展到15位。
(4)字符型数据赋给整型变量时,将字符的ASCII值赋给整型变量。如:i=‘A’。
(5)将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量(如:把4个字节的int型数据赋给占2个字节的short变量或占一个字节的char变量)时,
只将其低字节原封不动地送到被赋值的变量(即发生“截断”)
(5)赋值表达式和赋值语句
C语言的赋值语句属于表达式语句,由一个赋值表达式加一个分号组成。
赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号。
在一个表达式中可以包含一个或多个赋值表达式,但不能包含赋值语句。
(6)变量赋初值
可以用赋值语句对变量赋值,也可以在定义变量时对变量赋以初值。也可以使被定义的变量的一部分赋初值。
一般变量初始化不是在编译阶段完成的(只有在静态存储变量和外部变量的初始化是在编译阶段完成的),而是在程序运行时执行本函数时赋予初值的,相当于一个赋值语句。
三、数据的输入输出
输入输出是 程序中最基本的操作之一
1.有关数据输入输出的概念
(1)输入输出是以计算机为主体而言的
(2)C语言本身不提供输入输出语句
输入和输出操作是由C标准函数库中的函数来实现的。
如:printf函数、scanf函数,它们不是C语言提供的“输入输出语句”,printf和scanf不是C语言的关键字,只是库函数的名字。
C语言函数库“标准输入输出函数”:putchar(输出字符)、getchar(输入字符)、printf(格式输出)、scanf(格式输入)、puts(输出字符串)、gets(输入字符串)。
(3)在使用系统库函数时,要在程序文件的开头用预处理指令#include把有头文件放在本程序中。
#include指令都放在程序文件的开头,因此这类文件称为头文件。“stdio.h”头文件包含了与标准I/O库有关的变量定义和宏定义以及对函数的声明。
在调用标准输入输出库函数时,文件开头应该有以下预处理指令:
#include<stdio.h>和#include "stdio.h"
以上两种#include指令形式的区别是:用尖括号形式时,编译系统从存放C编译系统的子目录中去找所要包含的文件,这称为标准方式。
如果用撇号形式,在编译时,编译系统现在用户的当前目录(一般是用户存放源程序文件的子目录)中寻找要包含的文件,若找不到,再按标准方式查找。
也可以在双撇号中写出文件路径。
2.用printf函数输出数据
在C程序中用来实现输入输出主要是printf函数和scanf函数。这两个函数是格式输入输出函数。用这两个函数必须指定输入输出数据的格式,即根据数据的不同类型指定不同的格式。
(1)printf函数的一般格式
printf函数一般格式为:printf(格式控制,输出表列) 如:printf("%d,%c\n",i,c)
括号内包括两部分:
“格式控制”是用双撇号括起来的一个字符串,称“转换控制字符串”,简称“格式字符串”。它包括两个信息:1、格式声明:由“%”和格式字符组成,作用:将输出的数据转换
为指定的格式然后输出。由“%”字符开始的。2、普通字符:即需要在输出时原样输出的字符。如逗号、空格、换行符,也可以包括其他字符。
“输出表列”是程序需要输出的一些数据,可以是常量、变量或表达式。
由于printf是函数,因此“格式控制字符串”和“输出表列”实际上都是函数的参数。
一般形式:printf(参数1,参数2,参数3,···,参数n)
参数1是格式控制字符串,参数2~参数n是需要输出的数据。
(2)格式字符
d格式符。用来输出一个有符号的十进制整数。
在输出时,按十进制整型数据的实际长度输出,正数的符号不输出。
可以在格式声明中指定输出数据的域宽(所占的列数),如用“%5d”,指定输出数据占5列,输出的数据显示在此5列区域的右侧。
若输出long(长整型)数据,在格式符d前加字母l(代表long)。即“%ld”。若输出long long(双长整型)数据,在格式d前加两个字符ll(代表long long),即“%lld”。
c格式符 。用来输出一个字符。也可以指定域宽。
一个整数,如果在0~127范围中,也可以用“%c”使之按字符形式输出,在输出前,系统会将该整数作为ASII码转换成相应的字符。
如果整数比较大,则把它的最后一个字节信息以字符形式输出。
s格式符。用来输出一个字符串。
f格式符。用来输出实数(包括单、双精度、长双精度),以小数形式输出。有以下几种用法:
基本型:用%f。
不指定输出数据的长度,有系统根据数据的实际情况决定数据所占的列数。系统处理的方法一般是:实数中的整数部分全部输出,小数部分输出6位。
指定数据宽度和小数位数,用%m.nf。
输出的数据向左对齐,用%-m.nf。
在m.n前面加一个负号,其作用与%m.nf形式作用基本相同,但当数据长度不超过m时,数据向左靠右端补空格。
e格式符。用格式声明%c指定以指数形式输出实数。如果不指定输出数据所占的宽度和数字部分的小数位数,许多C编译系统会自动给出数字部分
的小数位数为6位,指数部分占5列(如e+003,其中“e”占1列,指数符号占1列,指数占3列)。
数值按标准化指数形式输出(即小数点前必须有而且只有1位非零数字)。
格式符e也可以写成大写E形式,此时输出的数据中的指数用大写字母E表示。
i格式符。作用与d格式符相同,按十进制整型数据的实际长度输出。很少用%i。
o格式符。以八进制整数形式输出。将内存单元中的各位的值(0或1)按八进制形式输出,输出数值不带符号,即将符号为也一起作为八进制数的一部分输出。
按%o输出时,按内存单元中实际的二进制数按3位一组构成八进制数形式。
x格式符。以十六进制数形式输出整数。同样可以用“%lx”输出长整型数,也可以指定输出字段的宽度,如“%12x”。
u格式符。用来输出无符号(unsigned)型数据,以十进制整数形式输出。
g格式符。用来输出浮点数,系统自动选f格式或e格式输出,选择其中长度较短的格式,不输出无意义的0。
因此格式声明可以表示为:
% 附加字符 格式字符
以上加在格式字符前面的字符(如l,m,n,-等)就是“附加字符”,又称为“修饰符”,起到补充声明的作用。
说明:
1、除了X,E,G外,其他格式字符必须用小写字母。
2、字母d,o,x,u,c,s,f,e,g,X,E,和G等,如用在“格式声明”中就作为格式字符。一个格式声明以“%”开头,以上述12个格式字符之一为结束,
中间可以插入附加格式字符(也称修饰符)。
3、如果想输出字符“%”,应该在“格式控制字符串”中连续用两个“%”表示。
3、用scanf函数输入数据
(1)scanf函数的一般形式
scanf(格式控制,地址表列)
“格式控制”的含义同printf函数。“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。
(2)scanf函数中的格式声明
与printf函数中的格式声明相似,以%开始,以一个格式字符结束,中间可以插入附加的字符。
(3)使用scanf函数时应注意的问题
(1)scanf函数中的“格式控制”后面应当是变量地址,而不是变量名。
(2)如果在“格式控制字符串”中除了格式声明外还有其他字符,则在输入数据时在对应的位置上应输入与这些字符相同的字符。
(3)在用“%c”格式声明输入字符时,空格字符和“转义字符”中的字符都作为有效字符输入。
(4)在输入数值数据时,如输入空格、回车、Tab键或遇非法字符(不属于数值的字符),认为该数据结束。
第三章 最简单的C程序设计——顺序程序设计的更多相关文章
- 第3章 简单的C程序设计——顺序程序设计
3.1 顺序程序设计举例 例:有人用温度计测量出用华氏法表示的温度(如64F),今要求把它转换为一摄氏法表示的温度(如17.8C) 解题思路:问题的关键在于找到两者的转换公式.根据物理学知识,公式为c ...
- 第三章 一个简单的机器学习例子让你了解DeepLab的语言风格
MINST是由Yann LeCun等人建立并维护的手写数字识别数据库.该数据库总共包含60000个训练样本和10000个测试样本.其中每个样本的大小是一张28*28的手写数字图片.数字包括从0~9总共 ...
- 《CoffeeScript应用开发》学习:第三章-构建简单的应用程序
字符串插值 CoffeeScript提供了一种更好的构建字符串的解决方案.在双引号字符串(单引号无效)中使用#{}包含一个动态的值. str = 'Hello, CoffeeScript.' cons ...
- 第三章 C#程序结构(3.1 顺序与选择结构)
[案例]输入某一学生的成绩,输出其对应的档次.具体规定:90分以上为优秀,80分以上至89分为良好,70分至79分为一般,60分至69分为合格,59以下为不及格.如果输入的分数小于0或大于100,则输 ...
- 《JAVASCRIPT高级程序设计》第三章
<JAVASCRIPT高级程序设计>第三章主要讲述了这门语言的基础概念,内容多而浅,通过思维导图可以帮助我们很好的理清脉络. js函数使用function关键字来声明,以下是一个简单的例子 ...
- 《Java程序设计》第三章-基础语法
20145221<Java程序设计>第三章-基础语法 总结 教材学习内容总结 类型.变量与运算符 类型 Java可区分为基本类型(Primitive Type)和类类型(Class Typ ...
- 【blockly教程】第三章Blockly顺序程序设计
3.1 什么是Blockly语言 2012年6月,Google发布了完全可视化的编程语言Google Blockly,整个界面清晰明了, 你可以如同在玩拼图一样用一块块图形对象构建出应用程序.每个图 ...
- 《JavaScript高级程序设计》笔记——第一章到第三章
2019年,新年伊始,我打算好好重读一下<JavaScript高级程序设计>这本前端必备经典书.每天半小时. 以下内容摘自<JavaScript高级程序设计> 2019-2-1 ...
- Java程序设计(2021春)——第三章类的重用笔记与思考
Java程序设计(2021春)--第三章类的重用笔记与思考 本章概览: 3.1 类的继承(概念与语法) 3.2 Object类(在Java继承最顶层的类) 3.3 终结类和终结方法(只能拿来用,不可以 ...
随机推荐
- koa2获取用户ip
调用下面方法即可获取 // koa2 中 req 为 ctx.req const getUserIp = (req) => { return req.headers['x-forwarded-f ...
- C#设计模式之代理模式(三)
15.4 远程代理 远程代理(Remote Proxy)是一种常用的代理模式,它使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求. ...
- vue+node+mongodb实现的功能
用vue+node +mongodb实现前后台交互的页面代码,已经上传到github上, 地址是: https://github.com/GainLoss/vue-node-mongodb https ...
- Flutter仿照airbnb创建app
github地址:https://github.com/GainLoss/flutter-app 一.基础 flutter是谷歌公司开发的开源免费的UI框架,用dart语言实现的,可以实现跨平台,一套 ...
- HTTPS科普(转)
为什么需要https HTTP是明文传输的,也就意味着,介于发送端.接收端中间的任意节点都可以知道你们传输的内容是什么.这些节点可能是路由器.代理等. 举个最常见的例子,用户登陆.用户输入账号,密码, ...
- C语言 字符串的声明与使用
// 字符串的定义和初始化 void test() { // "mj" char s[] = {'m', 'j', '\0'}; // 字符串"mj" ] = ...
- 管道(Pipelines)模型
Pipeline模型最早被使用在Unix操作系统中.据称,假设说Unix是计算机文明中最伟大的发明,那么,Unix下的Pipe管道就是尾随Unix所带来的还有一个伟大的发明[1].我觉得管道的出现,所 ...
- xHTML与HTML的写法有什么不同?
全部标签都必须小写 在XHTML中,全部的标签都必须小写.不能大写和小写穿插当中.也不能全部都是大写. 事比例如以下. 错误:<Head></Head><Body> ...
- 【转】eclipse 错误信息 "File Search" has encounter a problem 解决
在eclipse中使用搜索功能,发生错误: "File Search" has encounter a problem 仔细看了一下自动跳出的错误日志(Error Log),发现: ...
- 机器学习基础(HGL的机器学习笔记1)
统计学习:统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科,统计学习也成为统计机器人学习[1]. 统计学习分类:有监督学习与无监督学习[2]. 统计学习三要素:模型 ...