《CC++程序设计》课件-第1章 C语言基础_第1页
《CC++程序设计》课件-第1章 C语言基础_第2页
《CC++程序设计》课件-第1章 C语言基础_第3页
《CC++程序设计》课件-第1章 C语言基础_第4页
《CC++程序设计》课件-第1章 C语言基础_第5页
已阅读5页,还剩179页未读 继续免费阅读

下载本文档

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

文档简介

C/C++程序设计

(第三版)内容提要用于学习C/C++语言程序设计技术的教科书共6章:C语言基础,分支和循环,构造类型,函数,指针,类和对象用附录形式给出的ASCII码表、常用库函数表、VisualC++6.0/2010上机操作方法、部分习题参考答案。以基本语法规则为线索,通过100多个例题,近500道习题,向读者传授程序设计技术可作为普通高校计算机科学与技术专业程序设计语言课程教材,也可作为广大电脑爱好者学习程序设计方法的参考书第1章C语言基础

主要内容1.1一般概念1.2基本语法成分1.3数据的输入和输出1.4编译预处理

1.1一般概念1.1.1程序设计语言的发展和分类

1.机器语言——二进制代码

计算机的硬件只“认识”0/1

是唯一能被机器直接执行的语言2.汇编语言(AssembleLanguage)3.高级语言

FORTRAN(FORmulaTRANslator)

PASCAL、ALGOL、C

4.面向对象的程序设计语言

Simula67、ADA、Simulatalk、JAVA

C++C语言的产生和发展过程

1967年,MartinRichards:BCPL语言

其后,KenThompson:B语言

1972年,DennisRitchie:C语言1978年,《TheCProgrammingLanguage》

1983年,ANSIC

1980年代初,C++

比较有影响的版本Microsoft公司

:MSC

Borland:TC(集成开发环境)

Borland:BC(集成开发环境)

Microsoft:VC(集成开发环境)

C语言特点丰富的数据类型多种多样的运算符和表达式自增自减运算、位运算、指针运算、取地址运算融会高级语言和低级语言的优点(中级语言)语法格式灵活编译预处理没有复数类型,纯数值计算能力差

C语言特点(续)独特风格超短而精巧的源程序灵活多变的for语句、break语句和continue语句“变化多端的”指针操作超高的编译效率

1.1.2

程序的基本结构1.程序的物理结构程序块与程序块之间的排列方式:层次式结构(嵌套式结构)模块式结构

1.1.2

程序的基本结构1.程序的物理结构1.1.2

程序的基本结构2.程序的逻辑结构同一程序块内语句的执行次序块与块的执行次序

1.1.2

程序的基本结构2.程序的逻辑结构顺序分支循环子调用程序顺序结构和分支结构

语句1

语句2

语句3

(a)

顺序结构

条件

语句2

语句1

条件

语句

条件

语句n

语句1

语句2

……

(b)

二分支结构之一

(c)

二分支结构之二

(d)

多分支结构

循环结构和子程序结构

(a)

当型循环结构

条件

循环体

子程序

1

条件

循环体

(b)

直到循环结构

(c)

子程序结构

子程序

2

3.C语言源程序的一般结构

一个主函数(main)加若干个子函数的积木结构函数之间可夹杂说明性语句

定义,声明,预编译命令

全局变量定义或说明;

sub1([形式参数表])[形式参数说明;]{

局部变量定义;语句序列;

}…………subn([形式参数表])[形式参数说明;]{

局部变量定义;语句序列;

}main(){

局部变量定义;语句序列;

}C程序的一般结构sub1()sub2()subn()main()………………一个函数的结构函数类型函数名(形参表){

局部量定义;语句1;语句2;

……;语句m;}注释方式:行注释和段注释行注释以//开头到行末为止段注释从/*起到*/止,中间是注释内容段注释则可以跨行,也可以夹在程序语句中间段注释中还可以包含行注释ANSIC没有行注释有无注释对程序执行结果没有影响只给人看,机器不看1.1.3算法的描述和实现1、程序和算法的关系Wirth公式“算法+数据结构=程序”算法就是对计算步骤的描述,而程序则是实现计算步骤的(计算机可以执行的)指令序列,显然,程序中必含有算法。因此,有时候将算法称为程序,或将程序称为算法。算法描述形式:

自然语言描述、画流程图

开始、终止框处理框决策框

输入/输出流向连接点例1-1输入一批正整数,统计奇偶数各有多少个算法设计思想考虑:1)如何判定一个整数x是奇数还是偶数2)如何统计并记录奇数个数和偶数个数3)如何控制循环读数和输入结束除2判余法

计数器odd和even累加法

输入数值为0时,结束

例1-1输入一批正整数,统计奇偶数各有多少个算法的自然语言描述第1步,将计数器odd和even清0,即odd=0,even=0第2步,输入第一个数x第3步,如果新输入的x为0,则转第5步;否则执行第3-1步和第3-2步第3-1步,如果x是偶数,则计数器even加1

如果x是奇数,则计数器odd加1

第3-2步,输入下一个数x第4步,返回第3步(循环处理)第5步,输出统计结果,结束x%2等于0?还是1?例1-1输入一批正整数,统计奇偶数各有多少个算法的流程图

算法的实现程序#include<iostream.h>//文件包含命令voidmain()//主函数头部{intx,even,odd;//定义变量

odd=even=0;//将odd和even清0cout<<"请输入一批整数,最后输入一个0表示输入结束!"<<endl;cin>>x;//输入第一个数

while(x!=0)//当输入的x不是0时,进入循环体

{if(x%2==0)even=even+1;//x是偶数时,even加1elseodd=odd+1;//x是奇数时,odd加1cout<<"再输入一个整数";//提示信息

cin>>x;//输入下一个数

}cout<<“你共输入了”<<even+odd<<“个数,其中,"<<odd<<"个奇数,"<<even<<"个偶数。"<<endl; }//程序结束例T1-1将正整数n分解成质因子连乘形式

算法设计思想例如:16=2*2*2*217=1718=2*3*3用不超过n的每个质数x试除n

例T1-1将正整数n分解成质因子连乘形式

算法的自然语言描述第1步,x=2第2步,如果x大于n,则算法结束,否则继续下一步第3步,如果n除以x所得余数等于0,则执行第4步否则执行第5步第4步,输出质因子x,并用n除以x所得的商取代原来的n,转第2步第5步,使x取下一个更大一点的质数,转第2步while(x<=n){循环处理第3、4步}if(n%x==0)执行第4步;else执行第5步;

{cout<<x;n=n/x;}

x=x+1;算法的实现程序#include<iostream.h>voidmain(){intx,n;cout<<"请输入正整数n的值n=";cin>>n;cout<<n<<'=';x=2;//取第一测试质因子

while(x<=n){if(n%x==0)//x是n的质因子

{cout<<x;n=n/x;if(n>1)cout<<'*';}//输出x并用n/x代替nelsex=x+1;//x不是n的质因子

}cout<<endl;//最后输出一个换行符}例T1-2判断正整数n是不是Armstrong数

Armstrong数的定义:一个m位正整数n的各位数字的m次方之和等于n,则称n是一个Armstrong数例如:三位数中的Armstrong数153=13+53+33四位数中的Armstrong数1634=14+64+34+44五位数中的Armstrong数92727=95+25+75+25+75例T1-2判断正整数n是不是Armstrong数

算法设计思想考虑:1)找出n的各位数字,并确定n的位数m2)计算n的各位数字的m次方值3)将m个数字的m次方值相加

拆数法

数字k连乘m次

累加法

例T1-2判断正整数n是不是Armstrong数

流程图例T1-2判断正整数n是不是Armstrong数

函数功能划分主函数main:负责输入输出数据,调用子函数

split和sum子函数split:负责拆数,将n拆成一位位的数字,放在数组d中,同时记住n的位数m子函数expnm:计算一位数字k的m次方值子函数sum:计算多个m次方值的累加和例T1-2判断正整数n是不是Armstrong数

函数调用关系例T1-2判断正整数n是不是Armstrong数

拆数算法的流程图

例T1-2判断正整数n是不是Armstrong数

算法的实现程序#include<iostream.h>//函数split拆出n的各位数字依次放在数组d中//返回n的位数mintsplit(longn,intd[]){intm=0;while(n!=0){d[m]=n%10;m=m+1;n=n/10;}returnm;}例T1-2判断正整数n是不是Armstrong数

算法的实现程序//计算p=km的函数expnmlongexpnm(intk,intm){longp=1;inti;for(i=1;i<=m;i++)p=p*k;returnp;}例T1-2判断正整数n是不是Armstrong数

算法的实现程序//求各位数字的m次方之和的函数sumlongsum(intm,intd[]){longs=0;inti;for(i=0;i<m;i++)s=s+expnm(d[i],m);returns;}例T1-2判断正整数n是不是Armstrong数

算法的实现程序//主函数voidmain(){longn;//定义变量n(长整数型)

intm,d[10];//数组d用于保存n的各位数字

cout<<“请输入正整数n”; //显示提示信息

cin>>n;m=split(n,d);if(n==sum(m,d))cout<<n<<"是Armstrong数"<<endl;elsecout<<n<<"不是Armstrong数"<<endl;}1.1.4

程序设计风格1)语句行首对齐方式同级左对齐、子句向右移一行只写一句

2)适当加注释3)合理使用标识符

4)自顶向下:逐级分解,逐步求精自底向上:逐级编程实现

1.1.4

程序设计风格5)少用或不用goto语句

6)事先考虑周全,少打“补丁”

7)注意用户界面良好

8)程序要有容错性

第1章C语言基础(续)

主要内容1.1一般概念1.2基本语法成分1.3数据的输入和输出1.4编译预处理

1.2C语言和基本语法成分1.2.1字和词1.四类字符1)英文字母(大小写各26个含义不同)、数字0~9、下画线用于拼写保留字、标识符和常数值

2)五种括号:{}[]()'"

{}:语句括号和成员括号,用于复合语句、分程序,结构、联合、枚举和类的成员序列,数组元素初值序列

[]:方括号,用于定义数组长度、数组元素下标

():圆括号,用在表达式中改变运算次序、函数参数表':单引号(左右相同),用于表示字符常量"

:双引号(左右相同),用于表示字符串常量3)专用符号(19个):运算符、分隔符

+-*/%=<>!?:.,&^~|;#空白符:空格符、水平制表符Tab、换行符'\n'空字符:'\0'字符串结束符4)空白符和空字符

可以作为字符常量或出现在字符串中或注释中

其他字符均不具有语法含义

2.保留字保留字(keyword)具有特定语法含义的词(也称关键字)例:for——用于定义循环语句

int——用来说明整型变量注意,保留字用小写,不大写1)用于对变量的类型和属性说明的保留字基本类型名:charintfloatdoublevoid类型修饰符:longshortsignedunsigned构造类型符:enumstructunion属性说明符:staticautoexternregisterconstvolatile类型定义符:typedef

2.保留字2)用于描述语句的保留字分支和转移语句:ifelseswitchcasedefaultgoto循环语句:forwhiledobreakcontinue返回语句:return2.保留字3)用于计算指定对象所占存储单元数

(字节数)运算符sizeof扩充保留字,如C++中的

nwe,delete等2.保留字注意:1)保留字都用小写字母书写,不能用大写字母表示2)保留字有特定的语法含义,不能用于其他场合2.保留字3.标识符标识符(identifier)——常量、变量、函数、文件和类型等名字(用户字)标识符的组成:单个字母字母或下划线开头的字母、数字、下划线序列注意,不能与保留字相重,字母大小写不同标识符示例:合法的:NanJingprocedureaYes_Not_procRoot非法的:for$strW.doca&b2ps_23可读性要好,取名时能够做到“见名知意”

用sum表示求和,average表示平均值

MAX表示最大值建议不用(单个)Z、O、小写L作变量名易于2、0和1混淆带“#”的标识符——预编译命令#include(文件包含),#define(宏定义)1.2.2数据类型

1.常量和变量1)常量(constant)在程序运行期间,其值不能改变的量直接常量的类型由书写形式确定如,123,-456整数型常量

2.19,15E03实数型常量

'a','A'字符型常量符号常量(symbolicconstant)用宏定义常量,一般格式:

#define常量名具体数值例:#defineN256//定义N=256#defineEPS1E-6//定义EPS=10-6用const定义

constintN=256;constfloatEPS=1E-6;

两种定义方式的语法含义不同常量名最好用大写字母,变量名最好用小写字母2)变量(variable)运行期间,通过输入或赋值改变其值的量变量的三要素——名、类型和存储单元最简单的类型——整型(int)、字符型(char)、实型(float或double)变量必须“先定义后使用,先定值再用其值”定义——指定名字和类型(分配存储单元)使用——对其赋值,用其值未定义而使用,会出现编译错误“undefinedsymbol”未定值而用其值(其值不确定),会出现意想不到的计算结果

变量定义定义格式:类型名变量名序列;例:

intj,k,a; //定义三个int型变量

floatr;//定义float型变量按名存取存——赋值(输入)取——参与运算(表达式)变量类型的作用分配的字节数(长度)不同可参与运算的种类不同各bit的含义不同(编码不同)变量的初始化(定义时定初值)例如

inta=0,b,c=15;charch1='a',ch2;变量定义2.数据类型的分类用于整型、实型、字符型改变存储方式和取值范围

类型附加修饰符signed 带符号修饰符unsigned 无符号修饰符long 长型修饰符short 短型修饰符例如:longint、unsignedchar

长度运算符sizeof的用法一般格式:

sizeof(类型名)或sizeof(表达式)或sizeof表达式//注意优先级例如:

sizeof(123)等于4,

sizeof(char)等于1测试类型长度3.整型普通整型int长整型long短整型short无符号整型unsigned整型常量的书写形式:十进制:非0开头可带正负号的数字串

100-180八进制:以0开头

0123(等于十进制的83)即182+281+380=83

-011(等于十进制的-9)注意,八进制数中的每个数字位必须是0~7十六进制:以0x(或0X)开头每个数字位可以是0~9、a~f(大小写均可)

0x123等于十进制的291

-0X12等于十进制的-183.整型整数后面带字母L(不分大小写),表示长整型(十进制、八进制、十六进制均可)例如,1234567890L单精度(类型名float)双精度(类型名double)变量定义示例floatx,y;doubled,c;

4.实型(也称浮点型

指数部分

尾数部分

数符

阶符

实数的存储形式实型常量的书写格式十进制数形式由数字和小数点组成(注意必须有一个小数点)例:3.14,0.123(或.123)

123.0(或123.),0.0

-3.14,-0.123指数形式(科学表示法)用于表示绝对值特别大、特别小的数书写格式:尾数e(或E)指数(整数)例:180000000.0表示成1.8e08(1.8×108)

1.8是尾数,e08是指数0.000000123表示成1.23E-7(1.23×10-7)实型常量的书写格式字符变量定义方式:

charc1,c2;

只能存放一个字符字符常量的书写形式:普通字符一对单引号起来的一个字符

'A','=','b','+','d'5.字符类型转义字符用单引号括起来的以反斜杠\开头,后面跟一个小写字母1~3个八进制数字小写字母x后跟1至2个十六进制数字5.字符类型转义字符示例'\n'换行符(不是字母n本身)'\101'ASCII码等于八进制的101

(十进制的65)的字符(字母A)'\x62'ASCII码等于十六进制62

(十进制的98)的字符(字母b)‘\0’空字符(字符串结束符)

5.字符类型注:'0'与'\0'不同字符数据和整型数据可以通用(输入输出、相加等)5.字符类型常用的转义字符及含义

用一对双引号括起来的字符序列串中的字符个数称为串长度如:"China_Nanjing"、"Thisisastring""a"""空串(长度为0)6.字符串常量字符和字符串存储方式(串尾要加结束符)字符'a'

字符串"a"

字符串"Nanjing"1.2.3运算符和表达式

1.运算符的优先级和结合性表达式是由运算对象(常量和变量)和运算符组成的计算式

简单表达式:单个常量、变量、函数式例如:a,123,sin(x)'x'

一般表达式:多个运算对象和多个运算符组成例如:(a[i]+sin(x))/c>=d*e&&(i<n-1||p->data!=0)运算符的优先级和结合性

按照优先级和结合性确定运算次序:

一个表达式中出现多个运算符时首先按优先级的高低确定运算次序同级运算符相继执行时,则按结合性确定运算次序

同级运算符相继执行时:左结合:从左向右依次计算(传统概念)右结合:从右向左依次计算(C语言特有的)右结合运算符只有三类:条件运算符、单目运算符、赋值运算符运算符的优先级和结合性

优先级从高到低(大体)初等运算符()[]->.单目运算符!++--

-~*&sizeof算术运算、移位运算符+-*/%<<>>关系运算符==!=<<=>>=逻辑运算符&∧|&&||条件运算符?:赋值运算符=及复合赋值号逗号运算符,

运算符的优先级和结合性

共细分为15级因为圆括号的优先级最高加括号可以改变计算次序

下面的表中:1.级数小表示优先级高2.优先级栏中带“☆”者表示“右结合”,其余为“左结合”

例如:

a-b+c

等价于(a-b)+c

不等价于a-(b+c)b的左右两边运算符+和-同级(先向左结合,再向右结合)关于结合性a=b=c;相当于:

b=c;//将c的值赋给ba=b//a和b都赋得c的值而不是

a=b;//将b的值赋给ab=c;//再将c的值赋给b

(先向右结合,再向左结合)关于结合性

-j++相当于

-(j++)

(先向右结合,再向左结合)关于结合性

算术表达式

C语言表达式算术式与C语言表达式对照示例

2ab(1+x)/a/b2*a*bsqrt(x*y)五种表达式算术表达式赋值表达式逗号表达式关系表达式逻辑表达式数十种运算符(大体分类)算术运算符关系运算符逻辑运算符位运算符

赋值运算符条件运算符逗号运算符指针运算符取地址运算符分量运算符*下标运算符*圆括号运算符*

函数调用运算符长度运算符类型转换运算符标*者为初等运算符2.算术运算(1)基本算术运算

+(加)-(减)*(乘)/(除)

%(取余数)例:5+2 结果为75.0+2结果为7.05/2结果为25%2结果为15.0/2.0结果为2.5注意:1)“-”同时作为“负值运算符”如:-3,-b2)整数/整数结果值只取整数商(整数)通过类型转换可得完整结果例如,15/float(4)3)取余数运算(%),即模(mod)运算要求,整数%整数,结果值取余数(整数)例如:

18%4结果值为2(t+3)%7例:今天是星期三,t天之后是星期几?若星期日——0、 星期一——1、

……

星期六——6(t+2)%7+1例:今天是星期三,t天之后是星期几?

若星期一——1、

……

星期六——6

星期日——7(t+a-1)%7+1(2)自增自减运算

++

:使变量的值增1

--

:使变量的值减1两种用法后缀运算:i++和i--

先使用i的值,再将i的值加1或减1前缀运算:++i和--i

先将i的值加1或减1,再使用i的值例如,赋值语句

j=i++;相当于

j=i;i=i+1;而赋值语句

j=++i;相当于

i=i+1;j=i;

几点说明:

1)自增、自减运算符只能用于变量,不能用于常量或表达式

++(x+y)、5++等是错误的2)++和--的结合方向是自右至左3)在表达式中使用自增、自减运算符时要慎重不要对同一个变量多次进行自增自减

例如:j=++i+k+i++让人费解

(3)类型转换

自动类型转换(隐式转换)强制类型转换(显式转换)1)自动类型转换在计算表达式值时,按某种固定规律,将某一类型的数据自动转换成另一类型的数据,然后再进行计算

总是将“低级类型”转换成“高级类型”(3)类型转换

1)自动类型转换有条件自动转换:不同类型的数据混和运算时所进行的自动转换无条件自动转换:为了保证数值计算的精度和准确性所进行的自动转换

自动类型转换有条件转换(横向)先将低类型数据自动转换成高类型,再运算

无条件转换(纵向)注意:转换不影响原数据本身类型转换规则:无条件转换将float转换成double型(保证精度)将char或short转换成int型(不至于超界)实数运算若一个运算对象是double型,另一个被转换成double(结果是double型)转换规则(续):整数运算若一个是longint型,另一个被转换成longint型(结果longint型)若一个是unsigned类型,另一个被转换成unsigned(结果unsigned型)并非先将int转换成unsigned,再转换成long,最后转换成double类型(3)类型转换

2)强制类型转换一般格式:(类型名)(表达式)例如:(int)(a)或(int)a//将a的值转换成int类型注意,(float)(i/j)与(float)i/j的含义不同

转换只产生中间类型数值,不影响原来数据的类型和值

六种关系运算(比较运算)

<<=>>===(等于)!=(不等于)关系运算的优先级低于算术运算符,高于赋值运算符(<、<=、>、>=)高于(==、!=)3.关系运算例:a>bx!=0

比较关系成立时,结果值为1

不成立时,结果值为0

(1表示“真”,0表示“假”)例:x=b>c//相当于x=(b>c)x=b==c//相当于x=(b==c)结果x的值为1,或为0注意,“==”是比较相等否(无赋值功能)“=”赋值运算(并非比较)3.关系运算4.逻辑运算三个逻辑运算符!非(相当于数学上的~或NOT)&&与(相当于数学上的∧或AND)||或(相当于数学上的∨或OR)运算规则(见真值表)逻辑运算的真值表

注意:C语言中,判断“真假”时,以非0为“真”,0为“假”但逻辑表达式的值为1或0注意,逻辑运算符的优先次序!→算术运算符→关系运算符→&&→||例:

x>0&&x<10

//判断x的值是不是在0~9之间等价于:

(x>0)&&(x<10)

//加括号后更易读

4.逻辑运算多数版本都采用“短路”规则:

a&&b//其中,a和b是任一式子

a||b//其中,a和b是任一式子对于“a&&b”,若算出a为假,则不再求b的值对于“a||b”,若算出a为真,则不再求b的值注意,是否短路,可能会产生不同结果(比如,b中含有赋值或函数调用操作)4.逻辑运算条件表达式的一般格式:

E1?E2:E3其中,?:条件运算符E1是判别表达式E2和E3是一般的任意表达式5.条件运算判别表达式:除结构类型和联合类型以外的任意表达式(最用关系表达式、逻辑表达式)判别表达式还出现在if语句、switch语句和循环语句中

E1?E2:E3的执行步骤:1)计算E1的值2)若E1的值不为0(真),则计算E2的值,E2的值作为整个表达式的值3)若E1的值为0(假),计算E3的值,E3的值作为整个表达式的值5.条件运算

E1

E2

E3非0(真)为0(假)条件表达式的流程图5.条件运算示例:max=a>b?a:b;//使max等于a和b二者中较大的值整个是赋值语句,将条件表达式a>b?a:b的值赋给max5.条件运算请注意,条件运算符的优先级和结合性5.条件运算优先级很低,仅高于赋值运算符和逗号运算符(低于其他运算符)例如:

max=a>b?a:b+1;

//相当于max=(a>b?a:b+1);a>b?a:b+1//相当于(a>b)?a:(b+1)

//不相当于a>(b?a:b+1)

//也不相当于(a>b?a:b)+15.条件运算结合性是“右”结合示例:a>b?a:c>d?c:d

相当于a>b?a:(c>d?c:d)

而不是(a>b?a:c)>d?c:d(1)简单赋值运算赋值表达式的一般格式

V=EV:变量,E:表达式

含义:计算表达式E的值,将计算结果值赋给变量V

并以E的值作为整个赋值表达式的值6.赋值运算例:x=a+10

x=x+1//使x的值增加1

6.赋值运算表达式的尾部加一个分号“;”

表达式语句赋值表达式尾部加“;”

赋值语句所有的语句都以分号结束!(复合语句除外)几点说明:1)赋值运算符“=”左侧必须是变量名2)如果“=”两侧的类型不一致,但都是数值型或字符型时,赋值时系统自动将表达式类型转换成赋值号左侧变量的类型,然后再赋值。 例:intx=3.54;//x的值为3(结果为整型,取整数部分)6.赋值运算几点说明:3)赋值运算符“=”、比较运算符“==”,以及数学上等于号“=”三者含义:数学上,“x=1”表示一种事实(x的值就是1),绝不会出现“x=x+1”的式子程序中,“x=1”表示使x的值为1(不考虑x的原来值);式子“x=x+1”也是合理的程序中,“x==1”代表一种判断,x的值可能等于1,也可能不等于1;一般也不会出现形如“x==x+1”的式子(因为这是永远不能成立的关系表达式,即其值恒假)容易将“x==1”错写成“x=1”,造成十分隐蔽的逻辑错误(难以查出)6.赋值运算(2)连续赋值运算形如:V1=V2=V3=…=E例:

x=y=t*t//变量x和y的值都赋成t2a=b=c=1.6;//连续赋值语句等价于

a=(b=(c=1.6));

若b是整型,而a和c是实型结果:c等于1.6,b等于1,而a等于1.06.赋值运算(3)复合赋值运算

算术运算符和位运算符后面加赋值运算符

算术运算与赋值运算的复合

+=-=*=/=%=位运算与赋值运算的复合

&=^=|=<<=>>=复合赋值表达式的一般格式:

V+=E

功能相当于V=V+(E)例如:

a+=b 等价于a=a+ba-=b+c 等价于a=a-(b+c)a%=b+c 等价于a=a%(b+c)①

j++;②j+=1;③j=j+1;功能相同,但①的效率高于②②的效率高于③多个表达式用逗号隔开,一般格式:

E1,E2,…,En逗号:逗号运算符含义:依次计算各分表达式E1,E2,…,En的值并将En的值就是整个表达式的值7.逗号运算各分表达式

例:若当前b=2,c=6,那么

a=b+1,c+2//结果a=3,整个表达式的值为87.逗号运算逗号运算符的优先级最低

a=b+1,c+2//不能理解成a=(b+1,c+2)x=a=b+1,c+2//结果x=a=3,(c+2)的值没使用

x=(a=b+1,c+2)//结果x=8,a=3两种位运算:逻辑位运算、移位运算运算对象:整型、字符型(多用于无符号型)结果类型:整型、字符型

8.位运算(1)逻辑位运算~按位反一目,每一位分别取反&按位与二目,对应位相与|按位或二目,对应位相或^按位异或二目,对应位相异或1)~运算~a的含义:将a的各位求反(每一位的0变1,1变0)得到一个整数值(a的值不变)

(1)逻辑位运算例如:unsignedcharc,a=0xDB;执行赋值语句:c=~a;变量c的值等于?写成二进制形式:a=11011011c=001001002)&运算a&b的含义:将a和b的对应位相与得到一个整数a和b的对应位均为1结果值的该位为1,否则为0(1)逻辑位运算例如:unsignedchara=0x7B,b=0x93,c;

执行赋值语句:c=a&b;变量c的值等于?写成二进制形式:a=01111011b=10010011

c=00010011

3)|运算a|b的含义:将a和b的对应位相或得到一个整数a和b的对应位均为0结果值的该位为0,否则为1(1)逻辑位运算例如:unsignedchara=0x7B,b=0x93,c;

执行赋值语句:c=a|b;变量c的值等于?写成二进制形式:a=01111011b=10010011

c=11111011

4)^运算A^b的含义:将a和b的对应位相异或得到一个整数a和b的对应位不同结果值的该位为1,否则为0(1)逻辑位运算例如:unsignedchara=0x7B,b=0x93,c;

执行赋值语句:c=a^b;变量c的值等于?写成二进制形式:a=01111011b=10010011

c=11101000

&常用来将一个变量的某些指定位设置为0

(其余各位不变)例如:

c&=(0xFF-5);//将c右起第一、三位设置为0

(1)逻辑位运算(用法示例)|常用来将一个变量的某些指定位设置为1

(其余各位不变)例如:

c|=3;//将c右起第一、二位设置为1^运算可用来将某变量值清0(将所有数位都置为0)例如:c=c^c;(1)逻辑位运算(用法示例)8.位运算(2)移位运算左移(<<)和右移(>>)一般格式:a<<b //将表达式a的值左移b个二进制位a>>b //将表达式a的值右移b个二进制位这里b只能是正整数(通常是1、2、3等常数)

在不考虑数值越界的前提下,对小正整数

左移(<<)一位相当于乘以2右移(>>)一位相当于除以28.位运算(2)移位运算对正数和负数的移位规则不同对负数的移位规则,不同的系统可能不同下面以VC的移位规则为例

1)左移运算(<<)左侧移出去的数位被舍弃,右侧移“空”了的数位补0例:unsignedchara=2,c;c=a<<4; //相当于c=16*a(c=32)

(2)移位运算1)左移运算(<<)例:unsignedchara=2,c;c=a<<4; //相当于c=16*a(c=32)

(2)移位运算1)左移运算(<<)又例:unsignedchara=-4,c;c=a<<1; //结果c=-8(2)移位运算2)右移运算(>>)对正数:右侧移出去的数位被舍弃,左侧移“空”了的数位补0对负数:右侧移出去的数位被舍弃,左侧移“空”了的数位补1例:unsignedchara=8,c;c=a>>2; //相当于c=a/4(c=2)

(2)移位运算2)右移运算(>>)例:unsignedchara=8,c;c=a>>2; //相当于c=a/4(c=2)

(2)移位运算2)右移运算(>>)又例:unsignedchara=-8,c;c=a>>1; //结果c=-4(3)位运算的复合赋值运算

共五种:

&= |= ^= <<= >>=例如:x&=0xF5 相当于 x=x&0xF5x^=x 相当于 x=x^x【例1-2】移位运算的示意程序

//C++程序#include<iostream.h>voidmain(){shortintx,n;while(1){cout<<"请输入x和n的值,当n小于或等于0时,程序结束。"<<endl;cin>>x>>n;if(n<=0)break;cout<<"将"<<x<<"左移"<<n<<"位结果为:"<<(x<<n)<<endl;cout<<"将"<<x<<"右移"<<n<<"位结果为:"<<(x>>n)<<endl;}cout<<"程序结束!"<<endl;}【例1-2】移位运算的示意程序

//对应的C程序#include<stdio.h>voidmain(){shortintx,n;while(1){printf("请输入x和n的值,当n小于或等于0时,程序结束。\n");scanf("%d%d",&x,&n);if(n<=0)break;printf("左移:%d<<%d=%d\n",x,n,x<<n);printf("右移:%d>>%d=%d\n",x,n,x>>n);}printf("程序结束!\n");}第1章C语言基础(续)

主要内容1.1一般概念1.2基本语法成分1.3数据的输入和输出1.4编译预处理

1.3

数据的输入和输出

1.3.1cin和cout

使用预编译命令:#include<iostream.h>//输入输出流库1.cout的简单用法一般格式:cout<<表达式1<<表达式2<<…<<表达式n;<<:输出运算符(插入符)

1.3

数据的输入和输出

1.3.1cin和cout

1.cout的简单用法一般格式:cout<<表达式1<<表达式2<<…<<表达式n;输出换行符:cout<<'\n';//或cout<<endl;

2.setw的简单用法setw是头文件iomanip中的函数,其功能是为cout输出的数据项指定域宽,一般格式为cout<<setw(n)<<

表达式其中,“n”是int类型,用于指定输出“表达式”所占域宽。若表达式实际长度小于n,则由填充字符补足;若表达式实际长度大于n,则突破域宽,按实际长度输出。例如:cout<<'A'<<setw(5)<<'B'<<setw(3)<<1234567<<endl;输出结果为:A□□□□B1234567//这里,□表示空格1.3

数据的输入和输出

1.3.1cin和cout

3.cin的简单用法一般格式:cin>>变量1>>变量2>>…>>变量n;

>>:输入运算符(提取符)

一般格式:

printf(格式控制串,输出项序列);输出项序列——列出本句要输出的数据项(表达式)格式控制串——指出各输出项所要求的格式1.3.2printf格式段一般形式:

%附加格式说明格式控制字符打头可无结尾示例(A整型,B实型,C字符型)printf("%d%f%c\n"A,B,C);

1.3.2printfA的输出格式B的输出格式C的输出格式输出换行符全套格式段:%+-0域宽补充格式格式字符1.3.2printf+:要求输出数值的正负号(缺省:不输出正号)

-

:要求左对齐(缺省:右对齐)0

:左对齐情况下,左侧空位用0填充(缺省:填空格)域宽

:指定输出项所占宽度(缺省:按标准域宽)单域宽:m(具体数值),总共占m位双域宽:m.n(仅对实数),总共占m位,其中小数占n位补充格式l:输出长整型h:输出短整型若a=123(整型),b=-234.321(实型)printf("a=%d,b=%7.2f\n",a,b+1);输出结果:

a=123,b=

-233.32格式控制串分5段:“a=”、“%d”(a的格式)“,b=”、“%7.2f”(b+1的格式)“\n”(原样输出的换行符,引起换行)常用(输出)格式字符%d十进制带符号的整数(正数不输出符号)%o八进制无符号的整数(不输出前导符0)%x(X)十六进制无符号整数(不输出前导符0x)%u 十进制无符号的整数%c 输出一个字符%s 输出一个字符串%f 小数形式输出单、双精度实数%e(E)指数形式输出单、双精度实数%g 小数或指数(取短的)输出单、双精度实数注意事项1)不同类型用不同的格式字符2)若指定的域宽过小,或没指定域宽则按实长输出3)域宽大,“右对齐,左补空”;带附加格式“-”时,“左对齐,右补空”4)“%m.nf”只用于输出实数共占m列,小数占n列5)带附加格式控制“+”时,则输出正/负号;否则,正数和0不输出正负号6)“%m.ns”输出字符串时,占m列,只输出串左起n个字符“左对齐右补空”若m<n,则在保证n的前提下,按实长输出7)用o、x、u格式输出整数时,表示不带符号位(符号位看作数值的一部分)若输出负的整数值时,输出结果不代表该数的真实值注意事项8)连续两个%,表示要输出一个“%”9)格式应当与输出项相等。若不等(不报错),但可能产生意想不到的结果10)如果前面一个格式说明出现错误,也会出现意想不到的结果注意事项示例1:

#include<stdio.h>voidmain(){intx=10;floaty=123.14;charch;printf("inputch=");ch=getchar(); printf("x=%d,y=%f,ch=%c",x,y,ch);}输出结果:(VC环境下)

inputch=a(运行时输入字母a)

x=10,y=123.139999,ch=a示例2整数的输出

#include<stdio.h>voidmain(){inta=123,b=2197,c=-321;longk=123456789;printf("%d%+6d%8d\n",a,b,c);printf("%12ld\n",k);}输出结果:

123+2197-321123456789长整型要用ld格式不能用d格式(会出错)示例3字符和字符串的输出#include<stdio.h>voidmain(){charc='a',j=97;printf("%c%4d\n",c,j);printf("%4d%c\n",c,j);printf("%s\n","CWW");printf("%10.6s","CHINAJIANGSU");printf("%-6.5s\n","NANJING");}输出结果:

a9797aCWWCHINANANJI示例4实数的输出

#include<stdio.h>voidmain(){floatx=-1234.5678;doubley=987654321.123456789;printf("x=%f,y=%f\n",x,y);printf("x=%14f,y=%18f\n",x,y);printf("x=%12.3f,y=%15.4f\n",x,y);printf("x=%e,y=%e\n",x,y);printf("x=%12.5e,y=%13.6e\n",x,y);printf("x=%g,y=%g\n",x,y);printf("x=%12.5g,y=%13.6g\n\n\n",x,y);}x=-1234.567749,y=987654321.123457

x=-1234.567749,y=987654321.123457x=-1234.568,y=987654321.1235x=-1.23457e+03,y=9.87654e+08x=-1.2346e+03,y=9.87654e+08x=-1234.57,y=9.87654e+08x=-1234.6,y=9.87654e+08实数的三种输出格式:f、e、gf格式:1)若不指定域宽或只指定单域宽,整数部分按实际长度输出,输出小数点后,再输出6位小数(但最后几位数字可能不准确)2)若双域宽(即m.n形式),共占m列,输出n位小数实数的e格式输出1)若不指定域宽,则按标准形式输出尾数部分形如:Y.XXXXX

//Y代表非0数字,取5位小数(在VC中,取6位小数)指数部分形如:e±XX

//±表示正/负号,指数占2位共占11位(对于正数),或12位(对于负数)2)若指定域宽m.n时,同样按标准形式输出,只是尾数部分取n位,总域宽占m列(或按实长输出)实数的g格式输出系统自动地按数值大小,或采用f格式输出,或采用e格式输出(取短格式)输出实数时,不同的系统,小数位数和指数位数可能不同主要应掌握d,c,s,f

输出格式的基本用法一般格式:

scanf(格式控制串,地址序列);格式控制串与printf类似地址序列——列出需要读取数据的变量地址(&变量名)1.3.3scanf格式段一般形式:

%附加格式说明格式控制字符打头通常不用结尾scanf(“%d%d”,&a,&b);//读入两个整数,分别赋给a和b

全套格式段:%*域宽m补充格式格式字符*:抑制符

(跳过指定的列数

域宽

m:读入m列补充格式l:输入长整型h:输入短整型1.3.3scanf示例

#include<stdio.h>voidmain(){inta,b;scanf("%d%d",&a,&b);printf("%d,%d\n",a,b);}

或输入:

123

456

输入:

123456

至少要有一个空格(或Tab)

常用(输入)格式字符%d输入十进制整数%o输入八进制整数%x输入十六进制整数%c 输入字符%s 输入字符串%f 输入实数(整数、小数、指数形式)%e同%f使用方法和注意事项

1)格式项必须与地址表中的项个数相同,否则将出错2)输入数值型数据(整数或实数)不指定数据所占列数,数据之间要用空格(或[Tab])分开,也可以每行敲一个数据指定所占列数,系统自动按指定宽度读取数据,数据之间可不加分隔符3)若含有“原样输入”字符,输入数据时必须在相应的位置上输入这些字符,否则会读入错误的数据例:scanf("%d,%d",&a,&b);输入时,两数中间必须带逗号,比如输入成:123,-45

而scanf("a=%d,b=%d",&a,&b);输入时,两数之前必须带“a=”和“,b=”比如输入成:

a=123,b=-45

只起“事后提示”作用

例:scanf("%d%d",&a,&b);

应输入34

(空格分隔数据)

若输入3,4(错)例:scanf("a=%d,b=%d",&a,&b);

应输入:a=3,b=4

若输入:34 (错)3,4 (错) a=3b=4 (错)4)f格式只能用于输入float类型(且不能使用“双域宽”),double类型用%lf,或%le输入5)地址序列中变量名前必须加地址运算符&6)特别注意“%c”的用法(所敲的任何内容都算作有效字符)7)控制符“*”用于抑制输入,表示读数据时要跳过相应的列数1.4

编译预处理编译时,预先对源程序进行处理,再编译预编译命令三种预编译命令:宏定义文件包含条件编译(不讲)以#开头,后面跟命令名和命令内容

1.

文件包含命令

功能:指示编译器,将一个文件内容,插在另一个源程序文件的内容中,合在一起编译

两种格式:#include"文件名"#include<文件名>要包含的函数库文件或C源程序文件搜索路径不同例

#include"myfile1.c"

用双引号括

温馨提示

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

最新文档

评论

0/150

提交评论