C语言程序设计
2021-12-17 16:23:31 1 举报
AI智能生成
C语言程序设计总结
作者其他创作
大纲/内容
分支结构程序设计
关系运算符,逻辑运算符,条件运算符
关系运算符和关系表达式
关系运算符
关系运算符用于判断两个操作数的大小关系
注意:
(1)关系运算符都是双目运算符,其结合方向是左结合
(2)关系运算符的优先级低于算术运算符,但是高于赋值运算符
(3)关系运算符中,>,<,>=,<=的优先级相同,==,!=的优先级相同,前者的优先级高于后者,即“>=”的优先级高于“==”
(1)关系运算符都是双目运算符,其结合方向是左结合
(2)关系运算符的优先级低于算术运算符,但是高于赋值运算符
(3)关系运算符中,>,<,>=,<=的优先级相同,==,!=的优先级相同,前者的优先级高于后者,即“>=”的优先级高于“==”
关系表达式
一般形式 表达式1 关系运算符 表达式2
功能:比较两个表达式的大小,返回一个逻辑值
注意:
(1)注意区分运算符“=”和“==”。“=”是赋值运算符,“==”是关系运算符
(2)对实数进行相等判断可能得不到正确的结果,例如“1.0/3*3.0==1.0”的结果为0
(3)关系表达式中可以出现赋值运算符,如“a>(b=0)”,但是不能写成“a>b=0”的形式。因为关系运算符的优先级高于赋值运算符,表达式“a>b=0”相当于“(a>b)=0”,赋值运算符左边不是变量,会出现编译错误
关系表达式主要用于分支结构中的条件判断。关系表达式的结果是一个逻辑值“真”或“假”,由于C语言中没有逻辑类型的数据,因此用“1”表示“真”,“0”表示“假”
(1)注意区分运算符“=”和“==”。“=”是赋值运算符,“==”是关系运算符
(2)对实数进行相等判断可能得不到正确的结果,例如“1.0/3*3.0==1.0”的结果为0
(3)关系表达式中可以出现赋值运算符,如“a>(b=0)”,但是不能写成“a>b=0”的形式。因为关系运算符的优先级高于赋值运算符,表达式“a>b=0”相当于“(a>b)=0”,赋值运算符左边不是变量,会出现编译错误
关系表达式主要用于分支结构中的条件判断。关系表达式的结果是一个逻辑值“真”或“假”,由于C语言中没有逻辑类型的数据,因此用“1”表示“真”,“0”表示“假”
逻辑运算符和逻辑表达式
逻辑运算符
注意:与运算符&&和或运算符||都是双目运算符,非运算符!为单目运算符
逻辑表达式
一般形式:表达式1 逻辑运算符 表达式2或逻辑运算符 表达式1
逻辑表达式的说明:
(1)参与逻辑运算的数据可以是1和0,也可以是非零值和0,还可以是如何类型的数据,但最终都是以非0和0来判断他们是“真”或“假”
(2)在逻辑表达式中也可以使用赋值运算符,如“a&&(b=0)”,但是不能写成“a&&b=0”的形式。因为逻辑运算符的优先级高于赋值运算符,表达式“a&&b=0”相当于“(a&&b)=0”,赋值运算符左边不是变量,会出现编译错误
(3)C语言规定,只对决定整个表达式值所需的最少数目的子表达式进行运算。即在由若干个子表达式组成的逻辑表达式中,从左向右计算,当计算出一个子表达式的值就确定了整个逻辑表达式的值,此后就不再计算右边剩下的子表达式的值,这种情况称为“短路”
①对于逻辑与(&&)运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达式将不再计算;只有当“&&”左边的表达式值为真时才计算右边表达式的值
②对于逻辑或(||)运算,若“||”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“||”右边的表达式将不再计算;只有当“||”左边的表达式值为假时才计算右边表达式的值
(1)参与逻辑运算的数据可以是1和0,也可以是非零值和0,还可以是如何类型的数据,但最终都是以非0和0来判断他们是“真”或“假”
(2)在逻辑表达式中也可以使用赋值运算符,如“a&&(b=0)”,但是不能写成“a&&b=0”的形式。因为逻辑运算符的优先级高于赋值运算符,表达式“a&&b=0”相当于“(a&&b)=0”,赋值运算符左边不是变量,会出现编译错误
(3)C语言规定,只对决定整个表达式值所需的最少数目的子表达式进行运算。即在由若干个子表达式组成的逻辑表达式中,从左向右计算,当计算出一个子表达式的值就确定了整个逻辑表达式的值,此后就不再计算右边剩下的子表达式的值,这种情况称为“短路”
①对于逻辑与(&&)运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达式将不再计算;只有当“&&”左边的表达式值为真时才计算右边表达式的值
②对于逻辑或(||)运算,若“||”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“||”右边的表达式将不再计算;只有当“||”左边的表达式值为假时才计算右边表达式的值
逻辑表达式举例:
① ch是英文字母。逻辑表达式为(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')
② a,b不同时为0。逻辑表达式!(a==0&&b==0)或a!=0||b!=0或a||b
③ ch是空格或回车。逻辑表达式为(ch==' '||(ch=='\n')
④year是闰年,即year能被4整除但不能被100整除,或year能被400整除。逻辑表达式为(year%4==0&&year%100!=0)||(year%400==0)
① ch是英文字母。逻辑表达式为(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')
② a,b不同时为0。逻辑表达式!(a==0&&b==0)或a!=0||b!=0或a||b
③ ch是空格或回车。逻辑表达式为(ch==' '||(ch=='\n')
④year是闰年,即year能被4整除但不能被100整除,或year能被400整除。逻辑表达式为(year%4==0&&year%100!=0)||(year%400==0)
条件运算符和条件表达式
条件运算符
条件运算符由“?”和“:”两个符号组成,用于条件求值,它是一个三目运算符,需要三个操作数。条件运算符的优先级低于逻辑运算符,高于赋值运算符,它是右结合的
条件表达式
一般式为:表达式1?表达式2:表达式3
关于条件表达式的说明:
(1)条件表达式中表达式1的类型可以与表达式2和表达式3不同,表达式2和表达式3的类型也可以不同,此时系统会自动进行转换,结果为表达式2和表达式3中级别类型较高的,并将其作为条件表达式的类型。例如条件表达式“'a'?1:2.0”的结果为double型的1.0
(2)条件表达式中表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式,如“a>b?b=3:(c=4)”,但不能写成“a>b?b=3:c=4”的形式。这是由于在表达式“a>b?b=3:c=4”中,条件运算符的优先级高于赋值运算符,上述表达式相当于“(a>b?b=3:c)=4”,因赋值运算符左边不是变量,所以会出现编译错误
(3)条件表达式允许嵌套,例如“a>3?b:c>2?1:0”,根据条件表达式的结合性,它相当于“a>3?b:(c>2?1:0)”
(1)条件表达式中表达式1的类型可以与表达式2和表达式3不同,表达式2和表达式3的类型也可以不同,此时系统会自动进行转换,结果为表达式2和表达式3中级别类型较高的,并将其作为条件表达式的类型。例如条件表达式“'a'?1:2.0”的结果为double型的1.0
(2)条件表达式中表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式,如“a>b?b=3:(c=4)”,但不能写成“a>b?b=3:c=4”的形式。这是由于在表达式“a>b?b=3:c=4”中,条件运算符的优先级高于赋值运算符,上述表达式相当于“(a>b?b=3:c)=4”,因赋值运算符左边不是变量,所以会出现编译错误
(3)条件表达式允许嵌套,例如“a>3?b:c>2?1:0”,根据条件表达式的结合性,它相当于“a>3?b:(c>2?1:0)”
使用if-else实现分支结构
if-else语句
双分支if语句
一般形式:if(表达式)
语句1;
else
语句2;
语句1;
else
语句2;
if(a>0)
y=a; 等价于 y=(a>0)?a:(-a);
else
y=-a;
y=a; 等价于 y=(a>0)?a:(-a);
else
y=-a;
单分支if语句
一般形式:if(表达式)
语句;
语句;
if语句的嵌套
基本形式:
if(表达式)
语句1;
else
语句2;
if(表达式)
语句1;
else
语句2;
多分支if语句
一般形式:
if(表达式 1)
语句 1;
else if(表达式 2)
语句 2;
…
else if(表达式 n-1)
语句 n-1;
else
语句 n;
if(表达式 1)
语句 1;
else if(表达式 2)
语句 2;
…
else if(表达式 n-1)
语句 n-1;
else
语句 n;
使用switch语句实现分支结构
switch(表达式)
{
case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
......
case 常量表达式n: 语句n;break;
default:语句n+1;break;
}
{
case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
......
case 常量表达式n: 语句n;break;
default:语句n+1;break;
}
关于switch说明:
(1)switch后的表达式可以是任何表达式,其值只能为整型,字符型,枚举型之一。
(2) 每个case后面的常量表达式的值互不相同,否则就会出现互相矛盾的现象。
(3)每个case和default的出现次序不影响执行结果。
(4)可以让多个case共用一组执行语句。
(5)switch语句允许嵌套使用
(1)switch后的表达式可以是任何表达式,其值只能为整型,字符型,枚举型之一。
(2) 每个case后面的常量表达式的值互不相同,否则就会出现互相矛盾的现象。
(3)每个case和default的出现次序不影响执行结果。
(4)可以让多个case共用一组执行语句。
(5)switch语句允许嵌套使用
循环结构程序设计
使用for语句实现循环结构
for语句的基本语法
or语句的一般形式:
for(表达式1;表达式2;表达式3)
循环体语句;
for(表达式1;表达式2;表达式3)
循环体语句;
for语句的执行过程如下:
(1)首先计算表达式1
(2)判断表达式2,若其值为真(非0),则执行循环体语句,然后执行第(3)步;若值为假(0),结束循环,转到第(5)步执行
(3)计算表达式3
(4)返回第(2)步继续执行
(5)循环结束,继续执行for语句的下一条语句
注意,表达式1只是在进入循环之前计算一次。表达式2,循环体语句和表达式3将重复执行。
(1)首先计算表达式1
(2)判断表达式2,若其值为真(非0),则执行循环体语句,然后执行第(3)步;若值为假(0),结束循环,转到第(5)步执行
(3)计算表达式3
(4)返回第(2)步继续执行
(5)循环结束,继续执行for语句的下一条语句
注意,表达式1只是在进入循环之前计算一次。表达式2,循环体语句和表达式3将重复执行。
可以应用于计数型的循环
格式: 循环体语句;
for语句的一般形式中省略表达式1
格式: for(;表达式2;表达式3)
for语句的一般形式中省略表达式2
格式: for(表达式1;表达式3)
循环体语句;
循环体语句;
for语句的一般形式中省略表达式3
格式: for(表达式1;表达式2;)
循环体语句;
循环体语句;
for语句的一般形式中表达式1和表达式3也可以是逗号表达式
for语句的一般形式中表达式2的值只要非0,就执行循环体
for语句的一般形式中循环体语句可以省略
使用while语句实现循环结构
while语句的基本语法
while语句一般形式:
while(表达式)
循环体;
while(表达式)
循环体;
第一步:计算表达式的值,若表达式的值为“真”,则执行第二步;若表达式的值为“假”,则转到第四步
第二步:执行循环体语句
第三步:返回第一步
第四步:结束循环,执行while语句的下一条语句
注意:while语句的特点是先判断循环条件,后执行循环体
第二步:执行循环体语句
第三步:返回第一步
第四步:结束循环,执行while语句的下一条语句
注意:while语句的特点是先判断循环条件,后执行循环体
使用do-while语句实现循环结构
do-while语句的基本语法
一般形式:do
循环体;
while(表达式);
循环体;
while(表达式);
第一步:执行循环体语句
第二步:计算表达式的值,若表达式的值为“真”(非0),返回第一步;若表达式的值为“假”(0),则执行第三步
第三步:结束循环,执行do-while语句的下一条语句
注意,do-while语句的特点是先执行循环体,后判断循环条件。因此,do-while循环至少要执行一次循环体
第二步:计算表达式的值,若表达式的值为“真”(非0),返回第一步;若表达式的值为“假”(0),则执行第三步
第三步:结束循环,执行do-while语句的下一条语句
注意,do-while语句的特点是先执行循环体,后判断循环条件。因此,do-while循环至少要执行一次循环体
改变循环结构的跳转语句
break语句
一般形式: break;
当break语句用在循环语句中时,可使程序终止循环而转去执行循环语句的后继语句。通常break语句总是与if语句一起配合使用,即满足条件时便跳出循环
continue语句
一般形式 continue;
continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环。continue语句只能用在循环语句中,常与if语句一起使用
goto语句
goto语句的一般形式:
goto 语句标号;
goto 语句标号;
说明:语句标号是一个有效的标识符,使用时在语句标号的后面跟一个“:”出现在函数中某语句的前面。出现执行到goto语句时,会控制跳转到该语句标号处,达到控制循环的目的
循环嵌套
使用循环嵌套时,注意以下几点:
(1)外循环执行一次,内循环要执行一轮。即外循环执行一次,内循环一直要执行到条件不满足时为一轮;再执行外循环一次,内循环又一直执行到条件不满足时为第二轮;如此重复执行,直到外循环不满足时,整个循环嵌套结束
(2)循环嵌套格式中的内外循环体不允许出现交叉,即外循环要完全包含内循环
(3)循环嵌套时,内循环体中使用break和continue语句时,只影响包含它们的内循环,与外循环无关
(1)外循环执行一次,内循环要执行一轮。即外循环执行一次,内循环一直要执行到条件不满足时为一轮;再执行外循环一次,内循环又一直执行到条件不满足时为第二轮;如此重复执行,直到外循环不满足时,整个循环嵌套结束
(2)循环嵌套格式中的内外循环体不允许出现交叉,即外循环要完全包含内循环
(3)循环嵌套时,内循环体中使用break和continue语句时,只影响包含它们的内循环,与外循环无关
典型算法举例
递推法
迭代法
穷举法
程序设计与C语言
程序与程序设计语言
程序设计语言的发展
机器语言
特点:可以被计算机直接执行,且运行效率是最高的
缺点:难学、难写、难记、难修改
汇编语言
特点:容易被人读懂,程序修改与维护也很改变,运行效率仅次于机器语言
缺点:十分依赖机器硬件,可移植性不好。
高级语言
特点:易学、易用、易维护,人们可以更有效、更方便地用它来编制各种用途的计算机程序。
非结构化语言
程序员往往只追求程序的执行效率,而不顾及程序的结构,使程序变的难以阅读和维护
FORTRAN、ALGOL、和BASIC都属于非结构化语言
结构化语言
程序中的流程不允许随意跳转,采用结构化的语言所编制的程序结构清晰,易于阅读和维护
QBASIC、Pascal和 C 都属于结构化的语言
面向对象的语言
容易,耗时更少,效率更高
C++、C#、Visual Basic和JAVA 等语言均是支持面向对象程序设计方法的语言
抽象:抽象就是指忽略一些我们目标所需之外的东西
封装:是对象和类概念的主要特性
继承:在c++里一个类可以通过另一个类派生而来,新类被称作派生类,原来的类被称作基类,派生类继承了基类的成员方法和变量,并且可以在类里增加自己的特性函数变量实现特定功能
多态:多态是指允许不同类对象对同一消息做出反应,同一消息
程序设计语言功能
数据表达
以表达实际问题中存在的复杂的数据结构
流程控制
程序设计语言除了具备良好的数据表达能力之外,还必须提供对不同类型的数据进行处理的手段
顺序控制结构:一条语句执行完后,按自然顺序执行下一条语句
分支控制结构:又称选择结构。计算机在执行程序时,常常需要根据不同的条件选择执行不同的语句
共同特点:①只有单一的入口和单一的出口;
②结构中的每个部分都有被执行的可能;
③结构内不应出现永不终止的死循环
②结构中的每个部分都有被执行的可能;
③结构内不应出现永不终止的死循环
循环控制结构:计算机需要重复执行相同的语句
程序的算法表示
什么是算法
软件的主体是程序,程序的核心是算法
算法的特征
确定性。算法的每条指令必须有明确的含义,不能有二义性。队友相同的输入必须得出相同的执行结果
有穷性。一个算法应包含有限个操作步骤。在执行若干个操作步骤之后,算法将结束,而且每一步都在合理的时间内完成
可行性。算法中指定的操作都可以通过已经实现的基本运算执行有限次后实现
有零个或多个输入。算法是用来处理数据对象的,在大多数情况下,这些数据对象需要通过输入来得到
有一个或多个输出。算法的目的是为了求“解”,“解”只有通过输出才能得到
算法的描述
文字描述算法
流程图描述算法
子主题
伪代码表示算法
程序设计语言表示算法
C语言程序设计的特点
C语言的发展历史
C语言的特点
优点:
①C语言语句简洁紧凑,使用方便灵活
②运算符丰富,表达能力强
③C语言程序可移植性好
④生成的目标代码质量高,运行效率高
⑤语言处理能力强
⑥C语言是一种结构化语言
①C语言语句简洁紧凑,使用方便灵活
②运算符丰富,表达能力强
③C语言程序可移植性好
④生成的目标代码质量高,运行效率高
⑤语言处理能力强
⑥C语言是一种结构化语言
缺点:C语言对语法检查不严格,许多时候需要程序员自己保证程序的正确,而这对初学者是很难做到的
C语言的约定
标识符:
①C语言的标识符由字母、数字和下划线组成,其中第一个字符必须是字母或下划线。
例如,_00、print、FOR均是合法的标识符,而&a、-123、a b均是不合法的标识符。
②在C语言中,标识符中英文字母的大小写是有区别的。
例如,name与Name是不同的标识符。
③标识符的命名最好做到“见名知义”,增加程序的可读性。
例如,用sno表示学号,sname表示姓名
标识符的有效长度为1~255个字符
①C语言的标识符由字母、数字和下划线组成,其中第一个字符必须是字母或下划线。
例如,_00、print、FOR均是合法的标识符,而&a、-123、a b均是不合法的标识符。
②在C语言中,标识符中英文字母的大小写是有区别的。
例如,name与Name是不同的标识符。
③标识符的命名最好做到“见名知义”,增加程序的可读性。
例如,用sno表示学号,sname表示姓名
标识符的有效长度为1~255个字符
关键字:
关键字(又称保留字)是 C语言规定的,赋予特定含叉和有专门用途的标识符
关键字(又称保留字)是 C语言规定的,赋予特定含叉和有专门用途的标识符
子主题
用户自定义标识符:
程序中定义的变量名、数据类型名、函数名和符号常量名
程序中定义的变量名、数据类型名、函数名和符号常量名
预定义标识符头文件和库函数中定义的一些标识符(例如scanf、printf等)
分隔符:
逗号:分隔变量名 空格:分隔各单词
逗号:分隔变量名 空格:分隔各单词
常量:常量是有数据类型的
变量:变量定义的一般形式是:1类型名 变量名
运算符:
算术运算符:+(加)、-(减)、(乘)、/(除)、%(求余);
关系运算符:>(大于)、>=(大于等于)、==(等于)、<(小于)、<=(小于等于)等等。参与运算时只要求有一个数据对象的称为单目运算符,有两个数据对象的称为双目运算符,有三个数据对象的称为三目运算符
算术运算符:+(加)、-(减)、(乘)、/(除)、%(求余);
关系运算符:>(大于)、>=(大于等于)、==(等于)、<(小于)、<=(小于等于)等等。参与运算时只要求有一个数据对象的称为单目运算符,有两个数据对象的称为双目运算符,有三个数据对象的称为三目运算符
表达式:
运算符有优先级
运算符有优先级
语句:
在C语言中,语句是程序最基本的执行单位,以分号结尾
在C语言中,语句是程序最基本的执行单位,以分号结尾
函数定义与调用:
函数十完成特定功能的小模块,是C语言中唯一的种子程序
函数十完成特定功能的小模块,是C语言中唯一的种子程序
输入与输出:
C语言没有提供用于数据输入及输出的语句,所有的输入与输出都是通过系统提供的有关函数(如scanf()和printf()函数)来实现的
C语言没有提供用于数据输入及输出的语句,所有的输入与输出都是通过系统提供的有关函数(如scanf()和printf()函数)来实现的
C程序的编辑,编译,链接和运行
程序设计的任务
分析问题
设计算法
程序设计
运行并调试程序
分析程序运行结果
编写程序文档
运行C程序的步骤与方法
编辑:将编写的C语言代码以文件的形式存储在计算机中,其拓展名为 .c
编译:通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成二进制目标程序文件,其拓展名为 .obj
编译过程中的错误多为词法和语法错误,如果原文件存在这些错误,则编译系统会给出错误提示信息,应根据错误提示信息查找错误并改正源程序,再次重新编译,直到没有错误
链接:将目标程序与系统提供的库函数或是其他目标程序进行链接,得到最终的二进制可执行文件,其拓展名为 .exe
运行:双击 .exe 可执行文件运行后结果会显示在屏幕上
可执行文件运行后要验证程序的运行结果,如果发现运行结果与设计目的不相符(通常称为逻辑错误),说明程序在设计思路或算法上出现了问题,需要重新检查源程序找出问题并且修改,然后重新编译、链接、运行,直到得到正确结果
数据类型,运算符和表达式
C语言的数据类型
基本类型
整型
字符型
实型(浮点型)
构造类型
数组类型
结构体类型
共用体类型
枚举类型
指针类型
空类型
C语言的常量
直接常量
整型常量
整型常量即整数,包括正整数、负整数和零
注意:
(1)在一个整型常量后面加一个字母 u或U,认为是 unsigned int 型,如 246U。
(2)在一个整型常量后面加一个字母 1或 L,认为是 long int 型,如 12L
(1)在一个整型常量后面加一个字母 u或U,认为是 unsigned int 型,如 246U。
(2)在一个整型常量后面加一个字母 1或 L,认为是 long int 型,如 12L
实型常量
实型常量即实数,又称为浮点数
注意:
(1)以小数形式表示实数时,必须有小数点,并且小数点的前,后至少一边要有数字。
(2)以指数形式表示实数时,字母E(或e)的前后必须有数字,并且指数部分只能是整数。如12.-E3,1.5E,E6都是不正确的实数
(1)以小数形式表示实数时,必须有小数点,并且小数点的前,后至少一边要有数字。
(2)以指数形式表示实数时,字母E(或e)的前后必须有数字,并且指数部分只能是整数。如12.-E3,1.5E,E6都是不正确的实数
字符型常量
字符常量指单个字符,用一对单引号及其括号所括起的字符来表示
特点:(1)字符常量只能用单引号括起来,不能用双引号或其他括号。
(2)字符常量只能是单个字符, 不能是字符串。
(3)字符可以是ASCLL字符集中的任意字符。按ASCII码的大小,不同的字符之间存在着次序,以字符的ASCII码值按升序连续排列。
(4) 对于控制符(如回车、换行等)与不可见字符,在C语言中通过转义字符来表示
(2)字符常量只能是单个字符, 不能是字符串。
(3)字符可以是ASCLL字符集中的任意字符。按ASCII码的大小,不同的字符之间存在着次序,以字符的ASCII码值按升序连续排列。
(4) 对于控制符(如回车、换行等)与不可见字符,在C语言中通过转义字符来表示
字符串常量
字符串常量是由一对双引号””括起来的零个或多个字符序列
字符串中可以使用空格字符、转义字符和其他字符,也可以使用汉字等文字符号
字符串中还可以使用空字符
字符串中可以使用空格字符、转义字符和其他字符,也可以使用汉字等文字符号
字符串中还可以使用空字符
注意:(1)系统自动在每个字符串的尾部加上’\0’作为字符串的结束标志
(2)n个字符组成的字符串,在内存中要占用n+1个字节空间
(3)可以使用sizeof运算符来计算字符串占用的内存空间大小
(4)字符串的长度等于该字符串中所包含的有效字符的个数
(5)在字符串中如遇到’\0’则认为该字符串结束
(6)如果字符串中有转义字符,则一个转义字符作为一个字符
(7)可以使用strlen()函数计算字符串的长度
(8)字符常量和字符串常量在内存中的存储情况是不同的
(9)如’6’在内存中占1个字节,存储的是其ASCII码
(10)“6”在内存中占2个字节,一个字节存储’6’,一个字节存储’\0’
(2)n个字符组成的字符串,在内存中要占用n+1个字节空间
(3)可以使用sizeof运算符来计算字符串占用的内存空间大小
(4)字符串的长度等于该字符串中所包含的有效字符的个数
(5)在字符串中如遇到’\0’则认为该字符串结束
(6)如果字符串中有转义字符,则一个转义字符作为一个字符
(7)可以使用strlen()函数计算字符串的长度
(8)字符常量和字符串常量在内存中的存储情况是不同的
(9)如’6’在内存中占1个字节,存储的是其ASCII码
(10)“6”在内存中占2个字节,一个字节存储’6’,一个字节存储’\0’
符号常量
一个#define命令只能定义一个符号常量,若要定义多个符号常量,需使用多个#define命令
格式:#define 标识符 常量值
符号常量的使用,可以为编写程序提供很多好处:
(1)增加程序的可读性:通过标识符就知道该常量的意思,即见名知义
(2)提高程序的可维护性:通过符号常量使得修改常量很方便,只需在常量的定义处修改即可
(3)简化程序代码:通过符号常量可以简化复杂表达式的重复输入
(4)方便数组的定义:可以将整型符号常量作为数组的长度
(1)增加程序的可读性:通过标识符就知道该常量的意思,即见名知义
(2)提高程序的可维护性:通过符号常量使得修改常量很方便,只需在常量的定义处修改即可
(3)简化程序代码:通过符号常量可以简化复杂表达式的重复输入
(4)方便数组的定义:可以将整型符号常量作为数组的长度
C语言的变量
变量的定义与使用
变量的定义
定义格式:类型说明符 变量名表
(1)类型说明符必须是C语言中的有效数据类型,如int,float,double,char等 ,用于指定变量的类型,该类型决定了编译时分配给变量的内存单元的多少
(2)变量名表可以由一个或多个变量名组成,各变量名之间用“,”分隔。变量名必须是合法的C语言标识符,变量名一般使用小写字母
(3)变量的定义必须放在变量使用之前,一般在函数体开头部分进行定义
(2)变量名表可以由一个或多个变量名组成,各变量名之间用“,”分隔。变量名必须是合法的C语言标识符,变量名一般使用小写字母
(3)变量的定义必须放在变量使用之前,一般在函数体开头部分进行定义
变量的初始化
C语言允许在定义变量的同时对变量赋值,这个过程称为变量的初始化
对变量初始化时需注意:
(1)对一个变量赋值之后,该值被储存在分配给变量的内存空间中
(2)不允许对多个未定义的同类型变量连续初始化,如:“int x=y=3;”是不合法的,应写成“int x=3 y=3;”
(3)初始化时,一般使“=”右边表达式的数据类型和“=”左边的变量的类型一致,如果不一致,系统会进行自动赋值转换
(4)没有进行初始化的变量,其值是由定义时所使用的储存类型决定的。全局变量和static型变量的值是0或'\0',其它储存类型的局部变量的值是未知的
(1)对一个变量赋值之后,该值被储存在分配给变量的内存空间中
(2)不允许对多个未定义的同类型变量连续初始化,如:“int x=y=3;”是不合法的,应写成“int x=3 y=3;”
(3)初始化时,一般使“=”右边表达式的数据类型和“=”左边的变量的类型一致,如果不一致,系统会进行自动赋值转换
(4)没有进行初始化的变量,其值是由定义时所使用的储存类型决定的。全局变量和static型变量的值是0或'\0',其它储存类型的局部变量的值是未知的
变量的使用
使用变量时,应先赋值,后使用
整型变量
说明:
(1)各种无符号整数所占的字节数与相应的有符号整数相同。但由于省去了符号位,故不能表示负数
(2)有符号整数以二进制补码形式储存。最左边第一位表示符号,该位为0,表示正数,该位为1,表示负数
(3)无符号整数以二进制原码形式储存
(1)各种无符号整数所占的字节数与相应的有符号整数相同。但由于省去了符号位,故不能表示负数
(2)有符号整数以二进制补码形式储存。最左边第一位表示符号,该位为0,表示正数,该位为1,表示负数
(3)无符号整数以二进制原码形式储存
实型变量
单精度型数据能保留7位有效数字,双精度型数据能保留16位有效数字
VisualC++2010规定双精度小数后最多保留6位,其余部分四舍五入
VisualC++2010规定双精度小数后最多保留6位,其余部分四舍五入
字符型变量
字符型变量的值是字符常量,即用单引号引用起来的单个字符,字符型变量的类型说明符是char
运算符和表达式
赋值运算符和赋值表达式
简单赋值运算符
最简单的赋值运算符就是“=”,它的作用是将一个数值赋给一个变量。如r=2的作用是执行一次赋值操作(或称赋值运算)。把常量2赋给变量r。也可以将一个表达式的赋给一个变量
正确表示:int a=3 b=3 c=3 错误表示: int a=b=c=3
复合赋值运算符
在简单赋值运算符前面加上算术运算符就构成符合赋值运算符
赋值表达式
一般形式:变量=表达式
赋值表达式的执行过程:
(1)计算赋值运算符右侧表达式的值。
(2)将所计算出的值赋给赋值运算符左侧的变量
(1)计算赋值运算符右侧表达式的值。
(2)将所计算出的值赋给赋值运算符左侧的变量
区分赋值表达式和赋值语句的方法:
赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号,在一个表达式中可以包含一个或多个赋值表达式,但绝对不能包含赋值语句
赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号,在一个表达式中可以包含一个或多个赋值表达式,但绝对不能包含赋值语句
注意:
(1)如果“=”左右两边类型不同,系统会按照赋值类型转换的原则将右边的类型转换成左边的类型
(2)赋值表达式的右边也可以是一个复制表达式,如“a=b=c=6”。由于赋值运算符具有右结合性
(1)如果“=”左右两边类型不同,系统会按照赋值类型转换的原则将右边的类型转换成左边的类型
(2)赋值表达式的右边也可以是一个复制表达式,如“a=b=c=6”。由于赋值运算符具有右结合性
算术运算符和算术表达式
基本的算术运算符
双目运算符
(1)+加法运算符,为双目运算符,其功能是进行求和运算,如 3+4 的值为7
(2)一作为单目运算符使用时,是取负运算,如一3;作为双目运算符使用时,是进行求差运算,如 3—4 的值为-1
(3)*乘法运算符,为双目运算符,功能是进行求乘积运算,如 3*4 的值为 12
(4)/除法运算符,为双目运算符,功能是进行求商运算,如 a/b。在计算 a/b 时,如果 a 和 b 都是整型,则其商也为整型,小数部分被舍去,如 3/4 的结果为0.4/3 的结果为 1。如果 a和 b 中有一个是实型,则 a和 b 都转换为 double类型,然后相除,结果为 double 类型,如 3.0/2 的结果为 1.5
(5)%求余运算符,为双目运算符,功能是进行求余数的运算,如 a%b,其结果为 a 除以b后的余数
(2)一作为单目运算符使用时,是取负运算,如一3;作为双目运算符使用时,是进行求差运算,如 3—4 的值为-1
(3)*乘法运算符,为双目运算符,功能是进行求乘积运算,如 3*4 的值为 12
(4)/除法运算符,为双目运算符,功能是进行求商运算,如 a/b。在计算 a/b 时,如果 a 和 b 都是整型,则其商也为整型,小数部分被舍去,如 3/4 的结果为0.4/3 的结果为 1。如果 a和 b 中有一个是实型,则 a和 b 都转换为 double类型,然后相除,结果为 double 类型,如 3.0/2 的结果为 1.5
(5)%求余运算符,为双目运算符,功能是进行求余数的运算,如 a%b,其结果为 a 除以b后的余数
求余运算的结果是两个整型数据相除的余数。求余运算只能用于整型数据的运算
算数运算符两边的数据类型应相同,若不同时,编译系统会先转换为同一数据类型,然后再进行运算
算数运算符两边的数据类型应相同,若不同时,编译系统会先转换为同一数据类型,然后再进行运算
自增,自减运算符
单目运算符
(1)- 负号:负数
(2)++ 自增运算符:使变量的值自加1
(3)-- 自减运算符:使变量的值自减1
(1)- 负号:负数
(2)++ 自增运算符:使变量的值自加1
(3)-- 自减运算符:使变量的值自减1
有两种使用形式:
(1)++i(--i):用于变量前面,它是 “先计算,后使用”
(2)i++(i--):用于变量后面,它是 “先使用,后计算”
(1)++i(--i):用于变量前面,它是 “先计算,后使用”
(2)i++(i--):用于变量后面,它是 “先使用,后计算”
算术运算符的优先级和结合性
(1)结合性:单目运算符是右结合的,双目算术运算符是左结合
(2)优先级:“++,--,-”>“*,/,%”>“+,-”,即单目运算符的优先级高于双目运算符,双目算术运算符中*,/,%的优先级高于+,-
(2)优先级:“++,--,-”>“*,/,%”>“+,-”,即单目运算符的优先级高于双目运算符,双目算术运算符中*,/,%的优先级高于+,-
注意:在优先级相同的情况下,按规定的“结合性”进行处理
算术表达式
(1)算术表达式是由算术运算符,运算对象和括号连接起来的式子,运算对象可以是常量,变量和函数
(2)通常数学表达式均可写成C语言的算术表达式,但也有些数学表达式无法直接用C语言的算术表达式写出,此时需要调用C语言中的数学函数来实现
(3)表达式计算以后会得到一个确定的值和类型,其类型由所使用的具体运算符和运算对象决定
(2)通常数学表达式均可写成C语言的算术表达式,但也有些数学表达式无法直接用C语言的算术表达式写出,此时需要调用C语言中的数学函数来实现
(3)表达式计算以后会得到一个确定的值和类型,其类型由所使用的具体运算符和运算对象决定
注意:
(1)表达式中的乘号不能省略,且表达式中的所有字符均应写在同一行上
(2)在表达式中还可以使用多层圆括号(不能使用中括号和花括号),但是要注意括号的配对
(3)在数学中,5*6/4的运算结果与6/4*5的结果相同,都是7.5,但是C语言中表达式5*6/4的结果却与6/4*5的结果不一样
(1)表达式中的乘号不能省略,且表达式中的所有字符均应写在同一行上
(2)在表达式中还可以使用多层圆括号(不能使用中括号和花括号),但是要注意括号的配对
(3)在数学中,5*6/4的运算结果与6/4*5的结果相同,都是7.5,但是C语言中表达式5*6/4的结果却与6/4*5的结果不一样
逗号运算符和逗号表达式
一般形式:表达式1,表达式2,...,表达式n
(1)逗号表达式的执行顺序是:从左到右依次计算每个表达式的值,并把最后一个表达式的值作为整个逗号表达式的值
(2)逗号运算符是双目运算符,其优先级最低,是左结合的
(3)并非所有出现逗号的地方都为逗号表达式,如在变量说明语句中,以及函数参数表中逗号只是用作各变量之间的分隔符
(2)逗号运算符是双目运算符,其优先级最低,是左结合的
(3)并非所有出现逗号的地方都为逗号表达式,如在变量说明语句中,以及函数参数表中逗号只是用作各变量之间的分隔符
求字节数运算符
一般格式:
(1)sizeof(表达式)或sizeof 表达式
(2)sizeof(数据类型名)
(1)sizeof(表达式)或sizeof 表达式
(2)sizeof(数据类型名)
数据类型转换
自动类型转换
不同类型的数据在一起运算时,编译系统会自动进行类型转换。进行自动转换的规则是:把占用内存空间少的(低级)类型向占用空间多的(高级)类型转换,以保证运算的精度
(1)图中的纵向箭头表示必定的转换
(2)图中的横向箭头表示当经过纵向的转换后,进行运算的数据类型仍然不同时进行的转换方式
(2)图中的横向箭头表示当经过纵向的转换后,进行运算的数据类型仍然不同时进行的转换方式
强制类型转换
一般形式:(类型说明符)(表达式)
功能:把表达式的运算结果强制转换成类型说明符指定的类型
进行强制类型转换时需注意:
(1)需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行类型转换
(2)强制类型转换是一种不安全的转换.如果是从高级类型转换成低级类型,则会损失数据的精度
(3)强制类型转换并不改变表达式中变量的类型和值
(1)需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行类型转换
(2)强制类型转换是一种不安全的转换.如果是从高级类型转换成低级类型,则会损失数据的精度
(3)强制类型转换并不改变表达式中变量的类型和值
顺序结构程序设计
C语言的语句
说明语句
说明语句用于定义程序所使用的变量与类型
表达式语句
表达式语句由表达式加上分号“;”组成
一般形式: 表达式;
一般形式: 表达式;
c=a+b 是一个赋值表达式
c=a+b ; 是一个表达式语句
c=a+b ; 是一个表达式语句
分支语句
分支语句实现分支控制过程,根据条件成立与否执行不同的语句。
有两种分支结构,即双分支if-else语句与多分支的switch语句
有两种分支结构,即双分支if-else语句与多分支的switch语句
循环语句
C语言中实现循环控制的语句有3种,即for语句,while语句和do-while语句
转向语句
转向语句有break语句,goto语句,continue语句,return语句
复合语句
用一对大括号{}将若干语句顺序组合在一起所形成的语句称为复合语句。C语言中,除复合语句外的其他所有语句都以分号结束
空语句
空语句只由一个分号构成
函数定义与调用
函数是完成特定功能的小模块,是C语言中唯一的一种子程序,常常在一个C程序中包含若干个函数,复杂的任务通过调用这些函数来完成
输入和输出
C语言没有提供用于数据输入及输出的语句,所有的输入与输出都是通过系统提供的有关函数(如scanf()和printf()函数)来实现的
数据的输入和输出
输出函数(printf())和输入函数(scanf_s())
printf()函数
printf(“格式控制字符串”,输出项表列)
格式控制是使用""括起来的一个字符串,成为 "转换控制字符串",简称 格式字符串。它包括
(1)格式控制说明:%和格式字符组成, 如%d
(2)普通字符:即是原样输出的字符
(1)格式控制说明:%和格式字符组成, 如%d
(2)普通字符:即是原样输出的字符
使用printf()函数进行数据输出时需注意:
(1)格式字符与输出项的类型要一一对应,不同类型的数据所使用的格式字符不同
(2)一般情况下,格式字符与输出项的个数不同。如果格式字符的个数多于输出项的个数,则多余的格式将输出不确定的值;如果格式字符的个数少于输出项的个数,则多余的输出项将不能输出
(3)printf()函数中可以没有输出项,此时printf()函数只用来输出一个字符串;也可以有多个输出项,多个输出项之间使用逗号进行分隔。若输出项是表达式时,printf()函数将按从右到左的顺序计算出其值后输出
(4)若要在printf()函数中输出字符“%”,则应在格式控制字符串中使用连续两个“%”
(1)格式字符与输出项的类型要一一对应,不同类型的数据所使用的格式字符不同
(2)一般情况下,格式字符与输出项的个数不同。如果格式字符的个数多于输出项的个数,则多余的格式将输出不确定的值;如果格式字符的个数少于输出项的个数,则多余的输出项将不能输出
(3)printf()函数中可以没有输出项,此时printf()函数只用来输出一个字符串;也可以有多个输出项,多个输出项之间使用逗号进行分隔。若输出项是表达式时,printf()函数将按从右到左的顺序计算出其值后输出
(4)若要在printf()函数中输出字符“%”,则应在格式控制字符串中使用连续两个“%”
scanf()函数
scanf("格式控制字符串",输入项表列)
(1)格式控制说明:按指定的格式输入数据,其格式为以%开头的控制格式字符,不同类型的数据采用不同的格式控制字符
int——%d , float——%f , double——%lf
(2)普通字符:在输入数据时,需要原样输入的字符
int——%d , float——%f , double——%lf
(2)普通字符:在输入数据时,需要原样输入的字符
使用scanf()函数进行数据输入时需注意:
(1)格式字符与输入项的类型,个数要一一对应;输入项必须是地址,不能是变量名
(2)格式字符可以指定输入数据所占的列数,系统会截取相应列数的数据
(3)在输入数据时遇到以下情况则认为数据输入结束:空格,Tab键,回车键,非法输入,指定宽度。用户也可以自己指定其他字符作为输入间隔
(1)格式字符与输入项的类型,个数要一一对应;输入项必须是地址,不能是变量名
(2)格式字符可以指定输入数据所占的列数,系统会截取相应列数的数据
(3)在输入数据时遇到以下情况则认为数据输入结束:空格,Tab键,回车键,非法输入,指定宽度。用户也可以自己指定其他字符作为输入间隔
整型数据的输入和输出
printf(),scanf()函数中的格式字符(整型数据)
printf()函数中的格式修饰符
scanf()函数中的格式修饰符
实型数据的输入和输出
格式字符(实型数据)
说明:
(1)在格式字符串的“%”和格式字符之间也可以有一些修饰符,与表3.2,3.3相同。printf()函数中的修饰符“#”对于f,e,g格式字符当结果有小数时才给出小数点
(2)在输入实型数据时,还可以指定输出的精度,即在格式字符串的“%”和格式字符之间加入“m.n”,其中m指明输出的总位数,n指明小数点后的位数,若实际输出位数大于n,则超过的部分四舍五入;若实际输出位数小于n则不足的部分后补0
(3)使用scanf()函数输入实型数据时不能指明精度,即使用“%.nf”的格式是错误的
(1)在格式字符串的“%”和格式字符之间也可以有一些修饰符,与表3.2,3.3相同。printf()函数中的修饰符“#”对于f,e,g格式字符当结果有小数时才给出小数点
(2)在输入实型数据时,还可以指定输出的精度,即在格式字符串的“%”和格式字符之间加入“m.n”,其中m指明输出的总位数,n指明小数点后的位数,若实际输出位数大于n,则超过的部分四舍五入;若实际输出位数小于n则不足的部分后补0
(3)使用scanf()函数输入实型数据时不能指明精度,即使用“%.nf”的格式是错误的
字符型数据的输入和输出
使用scanf()函数和printf()函数对字符数据进行输入输出
使用scanf()函数和printf()函数对字符数据进行输入输出时,其相应的格式控制字符为“c”,如“printf("%c%c\n",a,b)”,也可以在“%”和“c”之间加修饰符
使用getchar()函数和putchar()函数对字符型数据进行输入输出
getchar()函数
一般调用格式为: putchar(输出参数)
putchar()函数
一般调用格式为:putchar(输出参数)
数学库函数
常用的数学库函数有:
(1)指数函数exp(x):计算e^x。如 exp(2.3)的值为 9.974182
(2)绝对值函数 fabs(x):计算|x|。如 fabs(-2.8)的值为 2.8
(3)以e为底的对数函数 log(x):计算 Inx。如 log(123.45)的值为4.815836
(4)幂函数 pow(x,y):计算 x^y。如 pow(1.3,2)的值为1.69
(5)平方根函数 sqrt(x):计算√x。如sqrt(4.0)的值为2.0
(1)指数函数exp(x):计算e^x。如 exp(2.3)的值为 9.974182
(2)绝对值函数 fabs(x):计算|x|。如 fabs(-2.8)的值为 2.8
(3)以e为底的对数函数 log(x):计算 Inx。如 log(123.45)的值为4.815836
(4)幂函数 pow(x,y):计算 x^y。如 pow(1.3,2)的值为1.69
(5)平方根函数 sqrt(x):计算√x。如sqrt(4.0)的值为2.0
用户在程序中调用数学库函数时,一定要在程序的开头使用#include<math.h>
0 条评论
下一页