590 likes | 717 Views
C ++ 程序设计基础. 概述 程序编写的基本观点 C ++词法元素. 2.1 c ++源程序构成 举例说明 c ++程序构成: example 1 : # include <iostream.h> main() {cout<< “ this is a c++ program.<br> ” ; } (1) 说明运行结果为: This is a program. (2) 解释程序结构。. Example2: # include <iostream.h> Main() { int a,b,sum; a=222;b=333;
E N D
概述 • 程序编写的基本观点 • C++词法元素
2.1 c++源程序构成 • 举例说明c++程序构成: • example 1:#include <iostream.h> • main() • {cout<< “this is a c++ program.\n”; • } • (1)说明运行结果为:This is a program. • (2)解释程序结构。
Example2: # include <iostream.h> Main() { int a,b,sum; a=222;b=333; sum=a+b; cout<<”sum is ”<<sum<<”\n”; }
(1)解释运行结果。 (2)解释每一句含义 (3)说明数据定义与pascal的区别.说明预定义输出流cout,cin等。 特点: (1)main 主函数 (2)一对{} (3)加预处理(预定义输出)或打开库头 (4)增加函数等
example 3: # include <iostream.h> #define PI 3.14 float sphere ( int rad) (球) main() { float volume; int radius; cin>>radius; volume=sphere(radius) cout<<”volume=”<<volume<<”\n”; }
函数名 形参类型 函数类型 ……float sphere ( int rad)形参//(radius) { float result; result=rad*rad*rad; result=4*PI*result; result=result/3; return result; }
2.2 C++词法元素 • 2.2.1 标识符 • (1)标识符与pascal基本相同,以字母、下划线开头,不能以数字开头等。由字母、数字、美元符$或下划线组成。如:sum、PI 、_Num等,但0|num,5-6 错。 • (2)用户一般不定义下划线开头,系统一般为下划线开头,以免冲突。 • (3)c++中标识符长度无限制。如1024个,但这样无法记忆等,一般不过32个。
(1)子目大小有区别,这与pascal不同。 (2)定义应见名知义,如 sum、day、name、score等 (3)关键字不能用,见P11表 如:asm、case、class等 2.2.2 注释 (1) * */ 注释段 (2) // 单行注释
2.2.3其它符号 1.空白符: 作为标识符的分隔符。 2.续行符: 反斜杠 例 “Borland\“ international“=Borland international“ 3.分隔符: [ ] ( ) { } , ; : … * = # ( 1) [ ] 说明数组 ( 2)( ) 构成表达式 函数调用 ( 3) { } 复合语句 ( 4), 分隔函数参数表中的各元素 ( 5); 语句结束符 ( 6): 指明标号符
(1)(7)省略号 主要用定义可变参数的函数 … 例: void func(int n,char,ch…) (8) * 定义指向某各类型指针 (9)= 用来分割变量声明和初始化表,也可作赋值运算符。 m+x=5; 初始化 x=6; 赋值 (10) # 一条预处理指令
基本类型 (简单类型) 数值类型 字符类型 枚举类型 数组 C++ 数据类型 构造类型(组合类型) 结构体(struct) 共同体(union) 文件类型 指针类型 空类型(void)
整型(short)2字节 整型(int) 4字节 整形 长整型 (long)8字节 数值类型 单精度(float)4 双精度(double)8 实形 长双精度(long double)12
2.4.1 基本数据类型 整数为定实数 (1) 说明 л=3.141592×10˚=0.3141592×10 9 float 1 浮点数表示法 2.4.2 字符数据的表示形式 说明 字符在c语言中以ASCAII码存放,c语言可以将字符作整数处理(可以通用)(256) example 4: # include <iostream.h> main() { char ch; int n1; ch=’a’; n1=97; cout <<int(ch)<<char(n1)”\n”; 输出 97a }
存放形式 a=97 (内存中存放) 0x 61=97 0 1 1 0 0 0 0 0 example 5: #include<iostream.h> main() { char ch; int I; char=’A’; ch=ch+32; I=ch; Cout<<i<<”=”<<char(i)<<”\n”; 结果: 97=a Cout<<ch<<”is”<<int(ch); a=97 }
2.4.3 数据的存储 (1) char 1 字节 -128~127 unsigned char 1字节 0~255 (2) short int 2 字节 –32768~32767 unsigned int 1字节 0~65535 (3) int 4 字节 –2147483648~2147483647 longint 0~4294967295 (4) long 4 字节 –2147483648~2147483647 longint 0~4294967295 (5) float 4字节 正负(3.4e-38~3.4e+38) 精度 6 位 (6) double 8字节 正负(1.7e-308~1.7e+308)精度 16 位 (7) long double 10 正负(3.4e-4932~1.1e+4932)精度 20
2.4.4带符号的数据类型和无符号的数据类型 负数补码的计算=(最大数-│原数│)的值取反 正数的补码是本身 介绍 sizeof(类型标识符) 测定某一种类型数据结构所占存储空间的长度。 Example 7.#include <iostream.h> Main( ) {cout<<”char”<<sizeof(char)<<”bytes”<<\n”;} 结果 char 1bytes
2.5 常量与变量 符号常量 用符号代表一个常量 如 #define PI 3.141592 直接变量 8.7.30.’A’是实型,整型 字符等 2.5.1常量 符号常量 用符号代表一个常量 如 #define PI 3.141592 2.5.2 常量的表示 1.整型常量 十进制 6735 ,八进制 o30 (以o开头)=24,十六进制 oxFFFF 65535
2.实型常量(浮点常量) 小数形式 0.1895 ;2.3556 实型常量 指数形式6.02e+32 说明 C++中把所有浮点常量都定义为double型。如果加f定义为flouble 3.字符常量 :如’a’,’b’,等 4.转义字符: C++规定 (1)用反斜杠开头后面跟一个字母代表一个控制字符; (2)用\\ 代表”\”,用’\’代表单引号
(1)用\ 后跟1到3个八进制数字表示ASCII码为该八进制的字码 用\x后跟1到2个十六进制数字代表ASCII为该十六进制数的字符 \a ox07 响铃声 Bel \b ox08 退格 BS \f ox0C 走纸换行 FF \n ox0A 换行 cf \r ox0D 会车 CR \t ox09 横向跳格 \v ox0B v 可以纵向跳格 \\ ox5c 反斜杠 \ \’ ox27 反单引号 ‘ \” ox22 双引号 “ \? Ox35 问号 ? \ddd ddd 表示1 到3 个八进制数字 \xhhh oxhhh hhh 表示1到3 个十六进制数字
5.字符串常数 说明 在c++中把同一对双引号括起来的0到多个字符序列叫字符常数 例如 :”Hello”,”How are you”. 1.说明:双引号本身不十字符,若要输入双引号 用下面的方法: cout <<”\” I want to go to school \””; 结果 “I want to …” 2.在内存中字符串的存储是以ASCII码的0结束的,即 ‘\0’ example “hello”
H E L L O \0 X Y 2.5.3 变量及其赋值 说明 数据连同其存取空间被抽象为变量。每个变量对应一个名字,叫变量名 (1)变量空间连续存储 (2)把从运算器向变量所代表的存储单元传送数据的操作称为赋值 example a=10;a=a+1; (3)=”是赋值符,不是等号,等号是== (4)a=a+b a+b 称赋值表达式 b=a=3+5 结果 a=8,b=8
2.5.4 变量的定义和初始化 (1) 说明 变量必经过定义再用,即先开辟存储空间 例如 int i1,i2; float x,y等 (1)说明 c++ 允许再程序的任何地方定义变量,这于pascal不同 (2)说明变量定义时可以初始化 (3)const 常量 可以用const float pi=3.14159声明常量,类似于define 2.6 运算符和表达式 运算符:用简单的符号表示对数据的加工,即运算 操作数:北运算的对象,即数据 例如 x=3+(a=5)*6
c++中的运算符可以分为以下14类 (1)算术运算符 +-×÷% 等 (2)关系运算符 >,<,>=,<=,!= 等 (3)逻辑运算符 !,&&,||,如 a&&b !a (4)位运算符 << ,>>, (5)赋值运算符 = (6)条件运算符 ? (7)逗号运算符 , (8)指针运算符 *,& 求类型 (9) 长度运算符 sizeof ( (10)强制类型转换运算符 类型如int(),float() 成员运算符
(1)下标运算符 [ ] (2)关系,含运算量的个数,运算量的 类型,如%要求为整形 (3)其他运算符,如函数调用运算符等 学习时注意以下问题 1.运算符的功能 ,如 加,取余等 2.运算符的关系,含运算量的个数,运算 量的类型,如%要求为整形 例如 int x,z float y z=y%x; 正确吗? 或 y=z %x 正确 3.运算的优先级 4.结合方向 例如 x=3*5/6等 例如 int a=3;b=2; 则 c=b*=a+2 c=(?) 10 相当于 c=b=b*(a+2)
6. C++可以重载运算符 即 根据需要重载定义某个标准运算符的操作。2.7 算术运算符与算术表达式 说明,算术运算符分为二元(双目)运算符和一元(单目)运算符双目 +,-,*,/ 等 单目 ++,--,+*等2.7.1 二元算术运算符+,-,*,/,略 %要求参加运算的数均为整数*./.% 用在+。-后,省略式当赋值号两边的“变量“是同一变量时,可省略如下
a+=b; 相当于 a=a+b. += 自反加赋值 a-=b;相当于 a=a-b; -=自反减赋值 a*=b;相当于 a=a*b *=自反乘赋值 a/=b ;相当于 a=a/b /=自反除赋值 a%=b 相但于 a=a%b %=自反模赋值 2.7.2 一元运算符 (1)自加自减运算符 i+=1.即 i=i+1时,称为计数器。C++定义了++,--,称为自加自减运算符 ++i,再使用i之前先使i的值加1, i++在使用i之后使i的值减1
Example # include <iostream.h> Main() {int i=5,y,z; Y=i++; Z=i Cout<<”y=”<<y<<”z=”<<”\n”; };运算结果 y=5,z=6;注意 int i=5,y; y=(i++)+(i++) 结果y=10但 y=(i++)+(++i) 结果 y=12;对于自减运算符其意义同++运算
讨论 i=5 cout <<――i;与cout<<i-- ;结果比较 (1)说明++,— —,只能作用于变量,不能用于常量或表达式 example:const i=10;则++i或――i 错误也不能 (x+y)++或(x-y)——等 (2)结合方向是自右至左,与运算运算符不同。 例:-i++ 意为-(i++)不能(-i)++ (-i)不能执行++ x=a+++b 易理解为x=a+(++b) 正确是:x=(a++)+b c++尽量自左至右的尽量多的将罗干戈字符组成一个运算符,处理方法加括号 实际后++比前++优先级高
关于++ 或――运算符进一步说明 1. example1 设 main() {int i=5,x; 则 x=(i++)+(i++)+(i++); cout<<x} 运行结果:x为 15 不是18 此时的计算过程师先调用临时变量 t=5+5+5计算结果。 1.example2 main() {int i=5 x=(i++)+(i++)+(++i) coutx} 运行结果为24 而不是21
分析原因:计算机执行过程是++i 先赋值且优先级高于i++(后++)计算机对前++或后++均有一个顺时变量,如:t1=i; 2=i ; t3=i 其中所有上例中x=(i++)+(i++)+(++i)先执行(++i)结果为6 其后的i++,i++中的i 均为6 。因为都是一个变量i 因此其值是相同的,所以结果为18对x=(++i)+(++i)+(++i)先执行(++i)… 结果为8 所以x=24, 因为i=8,所以t1=i=8,t2=i=8;t3=i8例 3。Main(){ int i=5edit->text=i++ +i++ + ++i;}则在edit 中显示的是18
1.正负号运算符-a 相当于a=0-a; -a*b 相当于(0-a)*b正负号运算符的结合方向为自右至左。优先级高于* /.2.7.3使用算术表达式有关问题的说明一.运算符的副作用 c=b*=a+2 或x=i++ +j 之类解决方法加括号及分步b*=a+2,c=b, x=(i++)+j.二.算术运算符的优先顺序与括号的使用顺序为1。单运算符-,++,――,2。* / % 3。+,-加括号可改变执行过程。Example: a=b=1+2 与 a=(b=1)+2 cout <<a<<b<<”\n”
a=3,b=3 a=3 b=1 一.算术运算函数。 算术库函数可以算数表达式中 应用 sinx+cosb 等。 2. 8 系运算与逻辑运算 说明:关系运算符即比较运算符,比较结果是否 复合条件,复合为真否则为假c++提供六种关系运算符: > < >= <= = = != 说明: > >= < <= 其优先级相同,前四种高于后两种关系运算符优先级低于算术运算符。
Example: c>a+b c>(a+b) c>b!=c (c>b)!=c a= = b<c a= =(b<c) 实际判断 a=1 或 0 a=b>c a=(b>c)3.关系表达式: 用关系运算符将两个表达式连接起来的式子。 下面是合法的关系表达式 a+b>b+c ,(a=3)>(b=5) ,’a’<’b’ example int x=2,y=3,z cout<<z=(x= =y) <<”\n”; 结果0
使用关系运算符 注意问题 (1)数学中x∈[a,b],表示为a≤x≤b。c++中不能为a<=x<=b 只能表示为a<=x && x<=b (2)一般不取两浮点数相等(存储误差) ex: 1.02/2.0*3.0=1.0 c++中不成立 float x,y , y=1.0 ,x=1.0 (x=x-y)==0 (错) 只能用(x-y)<0.000001 (3) 字符数据的比较按他们的ASCII码进行 ex: ‘a’<0 h或’a’>0 (4)c++允许5>2>3>6>8 表达式ex: y=5>2>6>8 (5>2 真得结果1;1>6 得0 ;0>8 得0;y=0) 这时从左到右求解。
(5)关系表达式可视为整形值0,1 用来运算 ex: int I=1;j=7;a; a=I+(j%4!=0); 结果a=2 此方法不要多用,较费解 2.8.2.逻辑运算符与逻辑表达式 逻辑表达式:用逻辑运算符将关系表达式或逻辑量连接起来得式子 运算符:1.&& (pascal and) 2.|| (or) 3. ! (not) ex: a&&b 当a>0 ,b>0 则结果为真 说明若a,b为整型数(字符可作为整形处理) ex: a=3;b=4; if(a&&b) cout<<”t”<”\n”;
说明 1.) && || 结合方向自左向右,优先级低于关系运算符 !结合方向自右向左 2.)执行过程 1.a&&b &&c 当a(非0) 到b(非0)到c 当a 假不作后面的运算; 2.a||b||c 当a(0) 到b(0)到c 当a 真后面不做
2.8.3 条件运算符和条件表达式 格式 表达式1?表达式2:表达式3 (当1式为真,则结果为2,否则为3) ex max=(a>b)?a:b; (说明:执行顺序为:先求表达式1,再判断;优先级高于赋值,结合方向为自右向 左) ex: a>b ? a : c> d ? c : d ; 相当于 a>b ? a : (c> d ? c : d); (说明3,表达式1,2,3的类型可以不一样。
2.9.逗号运算符和逗号表达式 逗号运算符(,)又叫顺序运算符,它用来把两个或多个表达式合并成一个表达式。这表达式叫做逗号表第三十或顺序表达式 格式 表达式1,表达式2 1)其求解过程为:先求解表达式1,再求表达式2,并把表达式2的值作为整个逗号表达式的值。Ex a=4;a=8+4,a*3; 求a=8+4;再求a=a*3 结果为a=12;表达式的值为36;
2)一个逗号表达式可以与另一个表达式组成一个新的逗号表达式(a=3*5,a*4),a+5;说明逗号运算符的优先级最低1.x=(a+3,6*3) result : x=18; 2).x=a=3,6*a result x=3 整个表达式的值为18 。注意:有时逗号不作为运算符,如函数f(a,b)。
2.10转换 说明 c pascal 不同于basic 必须定义类型不同类型转换三种基本方式: 1.同类型不同长度的数据间转换。 2.定点方式于浮点方式之间转换。 3.整型数中有符号数于无符号数之间转换。 C++中自动进行转换(称隐式)。有的需强迫转换,称强制类型转换或显式一 2.10.1隐式类型转换 赋值方式 隐式 算术方式
一.算术转换: 又称运算符转换,当不同类型的数据在一个表达式中进行混合运算时,出现算术转换。 通常在+,-,*,/,%等运算中,目的式使运算量类型相同。 规则如下: 1.表达式中,长度短的类型向长度长的类型转换。即: (1)只要排列的运算量中有一个double或float型,其他运算量也转换为double或float,结果为double. (2)否则将long 转换成long (3)否则int(char)char(int)
example: int a=100, b=300,float c=100; c+a+b c程序将把a,b 转换成float 1.当一个运算符两端运算量类型不一致时,按照“相告看齐”的原则对较低的类型进行提升。高 Double float Long Unsigned 低 Int char, short example char ch; int I, result; float f; double d;
Result=ch/i+ f*d-(f+i) int double double double int double double double double
(二)赋值转换 规则: 1。在复制符号右边运算量,不管是什么类型,都要转换为其左边的变量的类型 即向左看齐。 2.有不安运算量的类型“较高”则进行截断或舍入处理,以使它与赋值运算符左边变量的类型一致,这就是说不知转换总是以赋值左边的变量为准。 例:float a; int b 则 b=a=100/3.0 a=33.333333 b=33
讨论: int a=33, b=2; floatx; x=a/b或x=33/2; cout<<x 结果x为多少? 答案x 为16(不为16。5)原因有一暂时量若为33/2.0 则16.5 2.10.2强制类型转换 显式转换又叫强制类型转换。 格式:1(类型标志符)表达式。 2(类型标志符)(表达式)
Example: (int)3.5 (char)(53-3.14159*x)或char(53-3.14159*x) k=(int)((int)x +(float)i+j) 或:k=int(int(x)+float(i)+j) float(x=99)或float(x=99) c++系统提供的数学函数中,多数函数的参数要求为double type,调用式可显示转换 ex:double cos((double)I) 注意:(int)3.6+7.2与(int)(3.6+7.2)不同
说明: 对一个变量进行显式类型转换后,得到一个新的类型的数据但原来变量的类型不变。 Example:floatx=3.3;inti, I=(int)x result I=3. but x is int. 关于于不同类型的补充。 (1)短类型长类型(数据精度不会变)符号位扩展 (2)将signed。整形数提升为较长的signed,在增加的长度中各个位的转台于原来较短的数据中的符号相同称符号扩展。 请同学思考为什么(原因是数据存储采用补码方式)
请同学思考为什么(原因是数据存储采用补码方式)例 char a=-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1(符号位) 1 1 1 1 1 1 1 255=-1 short int b: b= -1 FFFF 65535 =-1