C++若干复习要点.docx
《C++若干复习要点.docx》由会员分享,可在线阅读,更多相关《C++若干复习要点.docx(14页珍藏版)》请在冰豆网上搜索。
C++若干复习要点
C++语言的若干重要问题及其实例解释
朱从旭老师最后一节课的讲稿(2010年6月13日)
教学邮箱:
teacher601.z@/密码:
student
C++课考试范围:
第1-6章为主;第7-9章有12分左右;第10章文件部分(5分)
考试题型:
(见考试网站
单选题、填空题、程序阅读题、程序语句填空题、1道编程题。
考试时间、地点:
2010-06-26(17周星期六)中午1:
20~3:
00,综合实验楼404机房
(班号097162_015所有选课学生)。
●关于输出格式问题
cout.setf(ios:
:
fixed);等价于:
cout<:
fixed);
――设置浮点数输出格式为定点方式。
cout.setf(ios:
:
scientific);等价于:
cout<:
scientific);
――设置浮点数输出格式为科学计数法方式。
cout.precision(n);等价于:
cout<――单独使用时是设置浮点数输出的有效数字位数为n。
cout.precision(n);/cout<cout.setf(ios:
:
fixed);/cout<:
fixed);
cout.setf(ios:
:
scientific);/cout<:
scientific);
――precision(n)的含义是设置浮点数输出的小数点后数字位数为n。
例:
precision(n)单独使用,表示输出数据取n位有效数字.
doublex=123.12544;cout<<"x="<//不使用格式控制,则按浮点数默认输出形式输出。
浮点数默认输出6位有效数字,故输出结果为:
123.125
cout.precision
(2);//设置输出数据保留2位有效数字
cout<1.2e+002
cout.precision(5);//设置输出数据保留5位有效数字
cout<123.13
cout.precision(7);//设置输出数据保留7位有效数字
cout<123.1254
例:
precision(n)与格式控制符配合使用,表示输出数保留n位小数。
doublex=123.12544;
cout.setf(ios:
:
fixed);//设置以“定点方式”输出
cout.precision
(2);//输出数据保留2位小数
cout<123.13
cout.precision(3);//输出数据保留3位小数
cout<123.125
cout.precision(6);//输出数据保留6位小数
cout<123.125440
doublex=123.12544;
cout.setf(ios:
:
scientific);//设置以“科学计数法”方式输出
cout.precision
(2);//输出数据保留2位小数
cout<1.23e+002
cout.precision(3);//输出数据保留3位小数
cout<1.231e+002
cout.precision(6);//输出数据保留6位小数
cout<1.231254e+002
●关于x++,++x或x--,--x的表达式值和变量终值问题
(1)自增(自减)算符在变量后,表达式的值取变量的原值计算;自增(自减)算符在变量前,表达式的值取变量的终值(增减1后)计算。
(2)无论自增(自减)算符在变量前或在变量后,变量的终值一样。
例:
x++,++x;x--,--x的使用。
#include
voidmain(void)
{intn=0,m;
charc='A',d;
doublex=4.25,y;
m=n++;d=++c;y=x--;
cout<<"m="<cout<<"d="<cout<<"y="<cout<<"n="<cout<<"c="<cout<<"x="<若开始n=3;则表达式(n++)+(n++)+(n++)的值是9,表达式执行后n的终值为6.
●关于表达式求值、数据类型的问题(算符优先级、结合方向)
例:
表达式18/4*sqrt(4.0)/8值的数据类型是(double),其值是(1.0)。
解:
(1)因为表达式中精度最高的参数是4.0(为浮点数),而表达式的结果是取精度最高的参数的类型;另外,当结果是浮点数时,C++自动将浮点数转化为double类型(双精度实数类型)。
(2)因18/4参与运算的两数均为整数型,故结果也为整数(即18/4的结果为4,并非4.5);sqrt(4.0)为4.0开平方,即为2.0;于是18/4*sqrt(4.0)的值为4×2.0==8.0;故18/4*sqrt(4.0)/8的值为8.0/8==1.0。
例:
若有定义“inta=7;floatx=2.5,y=4.7;”,则表达式x+a%3*(int)(x+y)%2/4的值是(2.5或2.500000)。
解:
本题涉及的算符优先级如下(从先到后):
()(int)*、/、%同为2级(见主教材p27表)+。
优先级属同一级的运算按自左到右顺序运算即可。
所以:
x+a%3*(int)(x+y)%2/4x+a%3*(int)(7.2)%2/4x+a%3*7%2/4x+1*7%2/4x+7%2/4x+1/4x+0x2.5。
即结果绝对值是2.5(直接输出是2.5);如果按定点格式(fixed)输出,浮点数的输出默认保留6位小数,则为2.500000。
例:
若有定义“intm=5,y=2;”,则执行表达式y+=y-=m*=y后的y值是(-16)。
解:
本题涉及复合赋值运算符(+=,-=,*=),它们和赋值运算符的结合性一样,都是右结合性(自右往左)计算。
计算步骤阐述如下(每步应该先计算的那部分加了下划线突出):
y+=y-=m*=y(m*=y即为m=m*y,此部分执行后,m为10)
y+=y-=10(y-=10即为y=y-10,此部分执行后,y为-8)
y+=-8即y=y+(-8)(注意此时的老y即右边的y已经是-8,故得到新y即左边的y为-16)
y=-16
●关于if语句和循环语句的条件表达、循环次数的确定
if(条件)语句;
for(表达式1;条件;表达式3)语句;
下列意思等价:
“条件”成立,“条件”为真,“条件”为非0值。
例:
下面for语句的循环次数是( 6)次:
for(inti=0,x=0;!
x&&i<=5;i++);
解:
循环条件为“!
x&&i<=5”的值,当它为“真”(非0数)时执行循环体语句。
按照关系运算符、逻辑运算符的优先级,该表达式相当于“(!
x)&&(i<=5)”。
即要求(!
x)为非0(即x为0,这部分始终成立),同时要求“i<=5”成立,才执行循环体语句(本题的循环体语句为空语句:
;)。
当执行6次循环后,i值将变为6,这时才使得条件“i<=5”首次不成立(终止循环);故循环次数为6。
●一个指向任何数据类型的指针变量占4字节存储空间
例:
写出下面程序输出结果:
#include
#include
voidmain(void)
{charc[8],*p[8];//1个字符类型数据占1字节,数组c有8个元素
char*p1;int*p2;
float*p3;double*p4;
cout<cout<}
答:
8,32(p是指针数组,有8个元素,相当于有8个指向字符型的指针变量)
4,4,4,4
●字符串的长度等于其有效字符个数,字符串存储时所占字节数等于“字符串的长度+1”。
注意转义字符的表示。
转义字符是一个特殊字符,用‘\’开头,有:
‘\n’、‘\t’、‘\v’、‘\b’、‘\r’、‘\f’:
换行、横向跳格、纵向跳格、退格、回车、换页。
‘\\’:
反斜杠字符本身。
‘\’’:
单引号字符本身。
‘\ddd’:
以1~3位8进制数ddd为ASCII码的对应字符。
‘\xhh’:
以1~2位16进制数hh为ASCII码的对应字符。
例如:
已知字符’A’的ASCII码是十进制值65,则
‘\101’即表示字符’A’(因为八进制数101等于十进制数65);
同理:
‘\x41’也表示字符’A’(因为十六进制数41等于十进制数65)。
又如:
字符串“LineOne\x0aLineTwo\12”的长度为(16)。
解释:
因为‘\x0a’、‘\12’各代表1个转义字符,故本字符串中共有2个转义字符,以及14个普通字符,故共有16个字符。
●程序阅读题举例
例:
下列程序运行后输出的结果是(36)。
#include
usingnamespacestd;
floatcacl(float,float);
voidmain()
{floatx;floaty;
x=4;y=3;
y=cacl(y,x);//相当于y=cacl(3,4);
cout<}
floatcacl(floatx,floaty)//形参x得到3,形参y得到4
{return(2*x+3*y)*2;}
例:
写出下列程序的运行结果。
#include
#include
usingnamespacestd;
chara='A';intb='B';
答案为:
A,X
B,X
AAAaa
voidsub()
{charb='X';
cout<a++;b++;
}
voidmain()
{intk;
for(k=1;k<=2;k++)sub();}
●程序语句填空题举例
这种题目一般先会给出一段文字描述程序的主要功能是什么,要充分利用这段描述文字来帮助你整体理解程序;然后理解程序的算法,再结合空白地方上下文的意思推出该处的语句。
必须理解程序算法才能判断所缺语句应该承担的功能(类似英语的完型填空)。
例:
本程序打印下列图案所示的数字金字塔到计算机屏幕:
设最下面一行左端无空格输出,金字塔的行数由参数n决定。
1
121
12321
1234321
123454321
#include
usingnamespacestd;
voidgold_tawer(intn)
{
inti,j;
for(i=1;i<=①;i++)//①n,打印n行
{
for(j=1;j<=n-i;j++)cout<<'';//打印每行开头的空格
for(j=1;j<=②;j++)cout<for(j=i-1;j>③;j--)cout<cout<<'\n';//光标换行
}
}
voidmain()
{intn;
cout<<"pleaseinputn:
\n";
cin>>n;
gold_tawer(n);
}
解释:
外循环(对i的循环)表示对行的循环,题目说打印的行数由形式参数n决定,故第①空白处应该填n。
外循环中嵌套的三个内循环(并列的三个对j的循环)分别打印同一个第i行的开头空格、中位数以左的数(含中位数)、中位数后面的数。
据题意说最下面一行左端无空格输出,故第i行的开头空格数应该是n-i个,这是第1个内循环的次数(已给出);第i行中位数及其左边的数应该依次是1,2,..,i共i个,这是第2个内循环的次数(所以空白②处应该填i);第i行中位数后面的数应该依次是i-1,i-2,..,1循环变量j从初值i-1开始,逐步递减,只要j>0就要执行它的循环体语句cout<
例:
给二维数组a赋值为下列结果,程序关键代码语句填空。
答案:
①i==j||j==0
②j-i+1
③a[i-1][j]+a[i-1][j-1]
123456
112345
121234
133123
146412
15101051
for(i=0;i<6;i++)
{for(j=0;j<6;j++)
{if(①)a[i][j]=1;//注意i==j不能写成i=j,
//①对角线上的元素满足条件i==j,最开头那一列元素满足j==0
elseif(ielsea[i][j]=③;//对角线下方元素i>j
cout<}
cout<}
●编程题:
熟悉常用算法(限定为下列9类算法)
(1)累加
例:
求指定区间[N,M]之间偶数之和,写函数(N,M为形参)。
解:
longf(IntN,IntM)
{inti;//i表示区间所有整数,做循环变量
longs;//s存结果,与函数值同类型long
s=0;//存放累加和的变量应初始化为0
for(i=N;i<=M;i++)
if(i%2==0)s=s+i;
returns;
}
(2)计数(类似于累加)
例:
求指定区间[N,M]之间有多少自然数满足条件:
能被5整除但不能被7整除,写函数(N,M为形参),结果由函数值返回。
解:
longf(intN,intM)
{inti;//i表示区间所有整数,做循环变量
longn;//n存结果,与函数值同类型long
n=0;//存放计数的变量应初始化为0
for(i=N;i<=M;i++)
if(i%5==0&&i%7!
=0)n=n+1;//n=n+1亦可n++
returnn;
}
(3)连乘
例:
求具有N个元素的数组a中偶数下标元素的乘积,写函数(N,a[]为形参),结果由函数值返回。
解:
longf(intN,inta[])
{inti;//i表示所有元素下标,做循环变量
longs;//s存结果,与函数值同类型long
s=1;//存放连乘的变量应初始化为1
for(i=0;iif(i%2==0)s=s*a[i];
returnn;
}
(4)最大、最小值问题
例:
对给定的一维数组a及其元素个数n两个参数,找出数组中的最小元素及其下标,最小值由全局变量minnum存储,对应元素下标由函数值返回。
如果a中有多个并列最小的元素,以第一次出现的元素为准。
longminnum;//全局变量minnum定义在函数外
intf(longa[],intn)
{inti,minI;
minnum=a[0];
for(i=1;iif(a[i]returnminI;}
(5)判断指定数N是否为素数或某种特殊数
例:
对给定的n位正整数N(假定数的位数n不超过5位),判断N是否为“回文数”,回文数是指正读和反读都一样的正整数,如34143就是一个4位的回文数。
如果N是回文数,则函数返回值为1;否则,函数返回值为0。
intf(intn,intN)
{inti,M,a[5];
M=N;
for(i=0;i{a[i]=M%10;//第i位数字存于a[i]中,最低位i=0
M=M/10;//老M去掉第i位数字后,剩余数位构成新M
}
//以下循环求出N的反序数,结果存放在M中
M=0;
for(i=0;iM=M*10+a[i];
//以下判断N的反序数M是否与N相等
if(M==N)return1;
elsereturn0;
}
(6)查找问题
例:
给定一维数组a及某个指定数x,找出数组a中元素值等于x的元素个数,以及值为x且下标最小的那个元素的下标。
下标最小的那个元素的下标在函数中输出;而元素值等于x的元素个数作为函数值返回。
intf(longa[],intn,longx)//n是数组a的元素个数
{inti,minI,s;
s=0;//s计数(等级找到等于x数的个数)
minI=-1;//minI存放找到的最小下标
for(i=1;iif(a[i]==x)
s++;
for(i=1;iif(a[i]==x&&minI<0)
minI=i;
cout<<"minI="<returns;
}
(7)求二元一次方程整数解问题(如鸡兔共笼)
例:
本题自定义函数f()的功能是:
求满足下列二元一次方程组的正整数解并输出所有的正整数解。
x+y=M,1.5x+5.5y=N。
其中,M和N是将给定的两个确定参数。
voidf(intM,intN)
{intx,y;
for(x=1;x<=M-1;x++)
{y=M-x;
if(1.5*x+5.5*y==N)cout<}
}
(8)给定数组a及其元素个数,将a的元素反序存放
例:
给定数组x及其元素个数n,将数组x的元素反序存放。
反序的操作是将第1个位置的元素与倒数第1个位置的元素交换,将第2个位置的元素与倒数第2个位置的元素交换,…按这个规律做下去,交换的元素组数与元素总数n有关。
voidf(intx[],intn)
{inti,j,t;
for(i=0,j=n-1;i<=n/2-1;i++,j--)
{t=x[i];
x[i]=x[j];
x[j]=t;
}
}
(9)打印某种有规律的简单图案
例:
编写一个自定义函数f(),其功能是:
对给定的正整数N(N<10),生成一个N行的字符图案。
如当N=5时,图案如本题图所示。
#include
usingnamespacestd;
voidf(longN)
{inti,j;
for(i=0;i{for(j=0;j
for(j=0;j<2*i+1;j++)cout<<'k';
cout<}
return;
}