c++程序设计要点复习.docx
《c++程序设计要点复习.docx》由会员分享,可在线阅读,更多相关《c++程序设计要点复习.docx(19页珍藏版)》请在冰点文库上搜索。
c++程序设计要点复习
第一章程序设计概述
●面向对象程序设计的本质是把数据和数据处理的过程当成一个整体--对象。
●由符号“/*”和“*/”括起来的多行注释语句(不能嵌套使用);
●main()函数是必须的入口函数,每个C程序从main()函数开始执行,并在main()中结束。
第二章C++的数据类型、运算符和表达式
●C++语言程序中允许出现的所有基本字符的集合,称为C++语言的字符集。
●标识符:
是由程序员定义的命名符。
用来标识常量、变量、函数、数据类型的名字等。
由字母、数字和下划线(其他的都是非法的)组成,且必须以字母或下划线为第一字符。
1)保留字或关键字是系统作特殊用途的单词,不可作用户标识符;
2)标识符的大小写有区别;
3)C++没有规定标识符的长度,即字符个数;
4)标识符尽可能做到见文知意,增加程序可读性
●八进制(octal):
以0开头的八进制数字串;
●十六进制(hexadecimal):
以0x开头的十六进制数字串;
●指数形式,也即科学记数法,用字母E或e表示,一般形式:
aEb,表示a*10的b次方,b必须是整数,且尾数和指数都不能缺省!
●C++的浮点数有3种:
单精度浮点型(float),双精度浮点型(double)和长双精度浮点型(longdouble)。
不加后缀的浮点数默认为double型,float型数据后缀为F或f,longdouble型数据后缀为l或L。
●字符常量:
如:
‘A’=65,‘a’=97;所以这些常量可以参加数值运算,如‘A’+1=65+1=66=‘B’.(0是48)
●转义字符可以组成字符常量,其长度也为1。
如‘\n’.
●字符串:
可以一行或连续几行书写,当连续几行书写时,在每行后加续行符“\”结尾即可。
●每个字符串都有一个串结束标志“\0”,因此字符串在内存中占用的字节数等于字符串的长度加1eg.“\\ABCD\\”:
占内存7个单元。
“\101\102\x43\x44”:
是字符串“abCD”
●字符串的长度不受限制,靠“\0”来判定串的结束;“a”和‘a’是两个不同的概念;字符串常量实际上是一个字符型数组,不存在字符串型的数据类型。
●#defineN100
●longwidth=7,length=7;doublearea,radius=23;(这些是合法的)
●关于“/”如果两个运算对象有一个或两个都是实型,则运算结果是实型。
●关于“%”只能用于整数,取两数相除后的余数;当运算的对象异号时,取%前的运算数的符号作为结果符号,而值为两数绝对值的余数。
●关于逻辑0表示假1表示真。
●逻辑运算符的操作数可以是任何基本数据类型的数据。
●关于位运算符
1)~:
按位求反,将运算元内所有的1变0,0变1
2)&:
按位与,处理两个整形运算元中的每一个二进制位,如果对应位值都为1,则结果位为1,反之结果位值为0。
3)^:
按位异或,对于每个二进制位,如果两个运算元中的对应位有且仅有一个为1时,结果位上的值为1,反之结果为0。
4)|:
按位或,对于每个二进制位,如果两个运算元中的对应位其中有一个为1时,结果位上的值为1,反之结果为0。
5)<<:
左移运算符,将左运算元中的各二进制位全部向左移动一定位数,左移n位相当于乘2的n次方。
6)>>:
右移运算符,运算元中各二进制全部右移一定位置。
●Sizeof:
返回其后的表达式类型标识符所表示的数在内存所占字节的多少,实际上是求所占内存字节数,所以也叫长度运算符。
●如果有多于两个+或两个-连写的情况,则编译首先识别前面两个+或-为增量或减量操作符。
●c=a+++++b;//error
第3章数据的输入与输出
●输入:
信息从计算机的外部设备流入计算机主机称为输入。
●输出:
信息从计算机主机流入计算机外部设备称为输出。
●“>>”从cin输入流中抽取字符,”<<”向cout输出流中插入字符。
(深刻理解一下)
●在用浮点表示的输出中,setprecision(n)表示有效位数。
●将setprecision(n)与setiosflags(ios:
:
fixed)合用,可以控制小数点右边的数字个数。
此时,setprecision(n)设置小数位数为n位,setiosflags(ios:
:
fixed)是用定点方式表示实数。
●将setprecision(n)与setiosflags(ios:
:
scientific)合用,可以控制指数表示法的小数位数。
此时,setprecision(n)表示小数位数为n位,setiosflags(ios:
:
scientific)是用指数方式表示实数。
●C++提供两种数据的输入输出方式:
C的输入输出系统和输入输出流;
●采用库函数printf()和scanf()输入输出,对应于头文件stdio.h;
第4章C++的控制语句
●C++语句的分类:
声明语句操作语句控制语句
●选择的依据通常是关系表达式或逻辑表达式的值。
●三元条件表达式:
表达式1?
表达式2:
表达式3(先求表达式1的值,其值为非0时,整个表达式的值为表达式2的值;否则,整个表达式的值为表达式3的值。
)
●
●switch语句的几点说明
1)常量表达式必须互不相同,否则就会出现矛盾而引起错误
2)各个case和default出现的次序可以任意
3)switch语句可以嵌套
●while语句:
为了正常结束循环,避免死循环,循环体内应有修改循环条件的语句,或终止循环的语句
●求最大公约数的辗转相除法:
m和n为两个正整数,当m>n时,m与n的最大公约数等于n与m%n的最大公约数;当n=0时,m与n的最大公约数等于m。
●m是n的k倍还多r,那么m和n的最大公约数与n和r的最大公约数相同。
若r=0,则n就是m和n的最大公约数;若r不等于0,则对n和r重复上述过程,直到r=0为止。
第5章数组及其使用
●数组要求先定义后使用
●数组说明的作用是在程序运行前分配内存空间。
因此,数组类型符必须是已定义的,下标表达式也须有确定值,不能为变量或实型表达式。
●如果给定的常数的个数不足,则系统对其余元素初始化为0或空字符
●C++的高维数组在内存中以高维优先的方式存放,二维数组中以行为优先排放
●如果全部元素都赋初值,则定义数组时,对第一维的长度可以不指定,但高维的长度不能省,如:
intad[][3]={1,2,3,4,5,6};inty[][2][3]={1,2,3,4,5,6,7,8,9,10,11,12};
●字符数组的定义:
⏹charstr[10];
⏹str[0]=‘C’;str[1]=‘h’;str[2]=‘i’;str[3]=‘n’;str[4]=‘a’;str[5]=‘\0’;
●逐个字符对数组元素进行赋初始值:
charstr1[10]={‘s’,’t’,’u’,’d’,’e’,’n’,’t’};不会添加结束符‘\0’
●用串常量初始化:
charstr2[10]={“student”};
charstr3[]={“student”};——charstr3[]=“student”;
●String.h头文件包含:
1)字符串长度函数strlen()
2)字符串赋值函数strcpy()
3)字符串连接函数strcat()
4)字符串比较函数strcmp()如果两个串相等,函数返回值为0;如果s1串大于s2串,返回值大于0;如果s1串小于s2串,返回值小于0。
注意:
intstrncmp(constchar*s1,constchar*s2,intn);
函数strcmp用于两个串的完全比较;strncmp用于比较两个串的前n个字符。
●用cin流输入字符串时,C++把键盘操作的空格和回车都视为结束,因此无法输入带空格的字符串。
●C语言的函数gets接受键盘输入的空格,以回车作为结束。
使用puts输出字符串,这两个函数在stdio.h中声明。
●#include
●#include
●
●voidmain()
●{
●charstr[10];
●gets(str);
●puts(str);
●}
●
改进版:
#include
voidmain()
{
inta[10],i,j,temp,swap;
for(i=0;i<10;i++)
cin>>a[i];
for(i=0;i<9;i++)
{
swap=1;
for(j=0;j<9-i;j++)
{
if(a[j]>a[j+1])
{
swap=0;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
cout<<"这时第"<
";
for(j=0;j<10;j++)
cout<cout<if(swap)break;
}
}
算法:
引入数组P,将n个人的编号按其原始排列顺序存入数组元素P[0]~P[n-1]中。
从编号为1的人开始循环报数,数到m的人,假定其在数组中的下标为t,就输出P[t],并将它从数组中删除,将P[t]后面的元素依次向左移动一个位置。
删除一个元素后,由于它后面的元素都左移了一个位置,因此,每次报数的起始位置就是上次报数的出列位置。
假设当前数组元素个数为i,上次出列位置为t,则本次出列位置就是(t+m-1)%i。
代码如下:
#include
constintn=8;
voidmain()
{
intP[n];
intm=4;
inti,j,t;
for(i=0;iP[i]=i+1;
t=0;
for(i=n;i>=1;i--)
{
t=(t+m-1)%i;
cout<
for(j=t+1;j<=i-1;j++)
P[j-1]=P[j];
}
cout<}
第六章函数
闰年的条件:
能被4整除,但不能被100整除的年份都是闰年;能被400整除的年份都是闰年;
代码:
if(year%4==0&&year%100!
=0||year%400==0)
●调用函数前先要声明
●
●代码区:
存放程序的代码,即程序中的各个函数代码块
●全局数据区:
存放程序的全局数据和静态数据
●堆区:
存放程序的动态数据
●栈区:
存放程序的局部数据,即各个函数中的数据
●所有静态变量存放在全局数据区,编译时获得存储空间,未初始化时自动全0,且只初始化一次。
●局部静态变量的作用域为块域,但生命期为整个文件
●虽然静态局部变量在函数调用结束后仍然存在,但其它函数不能引用。
●一个全局变量和一个静态全局变量在使用上是不同的,其它文件通过外部变量声明可使用一个全局变量,但却无法使用静态全局变量,静态全局变量只能被定义它的文件所独享
●函数递归调用:
●#include
●intfact(intn)
●{
●intfn;
●if(n==0)fn=1;
●elsefn=n*fac(n-1);
●returnfn;
●}
●用递归法求Fibonacci:
●longFibonacci(intn)
●{
●if(n<=2)
●return1;
●else
●returnFibonacci(n-1)+Fibonacci(n-2);
●}
●定义重载函数时必须保证参数类型不同,仅仅返回值类型不同是不行的。
第七章指针
●数组名代表的是数组的起始地址,是一个常量,而不是指针变量,在程序中是不能改变的。
●随机产生一百以内的数:
a[i]=rand()%100;
●对于二维数组a,虽然a和a[0]都是地址而且值相同,但意义不同;a是指向行(数组)的,一维数组名a[0]是指向列(元素)的。
在指向行的指针前加一个*,就转换成指向列的指针;反之,在指向列的指针前加一个&,就称为指向行的指针
●
●
疑问:
有关字符串判断是否结束的语法:
#include
voidstrCopy(char*dest,char*source)
{
while(*source!
=0)————这句话等号后面的0也可换做【'\0'】或者【NULL】
{
*dest=*source;
source++;
dest++;
}
*dest=0;
}
voidmain()
{
chara[20],*strPtr="Iamastudent.";
strCopy(a,strPtr);
cout<}
●char*name[]与char*name[][20]不同:
⏹char*name[][20]是二维字符数组,在内存中连续存放;
⏹char*name[]是一个指向字符串的指针数组,并未定义行的长度,各行之间也不一定连续存放,只是分别在内存中存储了长度不等的字符串,然后用指针数组中的指针元素分别指向它们
⏹
●函数的返回值为指针:
⏹类型标识符*函数名(参数列表)
◆int*pf(int,int);
◆返回一个指向整型的指针。
●函数指针的定义和使用
⏹类型标识符(*指针变量明)(函数参数表)
⏹intmax(int,int);//说明函数max
⏹int(*fp)(int,int);//定义函数指针,指向有两整型参数和返回值为整型的函数
⏹fp=max;//将函数max的入口地址赋给fp,fp和max都指向函数入口
⏹说明:
◆函数指针指向程序代码区,一般数据变量指针指向数据区
◆函数指针不能随意指向任何一个函数,只能指向与其定义一致的函数
◆在给函数指针变量赋值时,只需给出函数名而不必给出参数
◆fp=max(a,b)————语法错误!
!
◆函数指针不能进行++,--,+,-等运算,因为在程序执行阶段函数代码区不会变动
第8章引用
●int&aRef=a;//引用须在声明的同时初始化
●指针是变量,引用不是变量
●引用没有地址值,它的地址是它被绑定的变量或对象的地址值,一旦被绑定,不能再改变,即不能更新引用;而指针是变量,它有自己的地址值,还可以赋给它其他变量或对象的地址值,即改变指针的指向
●指针可以引用,但不能定义引用的引用,可以传递引用
●int*p,a;
●int*&pRef=p;//pRef是一个指针p的引用
●int&*p;//错误,不能声明基类型为引用的指针对象
●int&aRef=a;//aRef是a的别名
●int&bRef=aRef;//bRef是a的别名
●int&bRef=&aRef;//不能定义引用的引用&Ref是地址,不能将int*转换为&型
●引用是变量的一个别名,他不能代表一个常量如:
⏹int&aRef[10]=a;//错误,数组名不是一个变量,而是一个地址常量值
●可以有空指针,但不可以有空引用
●int*p=NULL;//定义一个指针,其初值为空
●int&pRef=NULL;//错误
第九章结构体
●structure.field
●(&structure)->field
●structure_pointer->field
●(*structure_pointer).field
●对于组合结构体:
●m.sender.name
●(&m)->sender.name
●mp->sender.name
●(*mp).sender.name
第十-十二面向对象的程序设计
类声明以分号作为结束
●public和private为成员访问说明符。
它们规定了用其说明后的成员对于外部程序的可见性,体现了类的隐藏和封装特点。
●用public声明的公有成员能被同类的成员访问,也能被其它类的成员和非成员函数访问。
公有成员定义了类的外部接口
●用private声明的私有成员只能被类内部的其它成员访问,不允许外部成员直接访问。
●若在类的定义中没有给出成员访问说明符,默认为private。
●通常将数据成员定义为private,而将和外部的接口的成员函数定义为public。
一般给出成员访问控制说明符,以使程序更清楚。
●类名:
:
类名(形参1,形参2,…,形参n):
x1(形参1),x2(形参2),…,xn(形参n){}
●
●