资源描述
1.1在下面的语句中错误的是 。
A、int n=5; int y[n]
B、const int n=5; int y[n]
C、in n=5; int *py=new int[n];
D、const int n=5; int *py=new int[n]
答:A ,选项中n是变量,int y[n]企图定义一动态数组是不可行的。B选项中n为常量,C、D选项均为用new动态操作内存从而可正确定义可调数组。
1.2在下列函数原型中错误的是 。
A、 int add(int X=3,int y=4,int Z=5)
B、 int add(int x,int y=4,jint z)
C、 int add(int x,int y=4,int z=5)
D、 int add(int x,int y,int z=5)
答:B,带默认参数的缺省定义按从右到左顺序进行,在出现缺省定义后不可以再出现非缺省参数。
2.问答题
2.1下面是一个C程序,改写它,使它采用C++风格的I/O语句。
#include <stdio.h>
main()
{
int a,b,c;
int temp;
printf("Enter a,b,c:");
scanf("%d%d%d",&a,&b,&c);
temp=a;
a=b;
b=c;
c=temp;
printf("a=%d b=%d c=%d\n",a,b,c);
}
解: #include <iostream.h> //C++风格得I/O语句是以流对象为特征的,
//所以在选择头文件时应包含”iostream.h”。
void main() //C++的主函数一般要求在前面写上返回类型,若函数
//没有指出返回类型,C++默认该函数的返回类型为
//int。而本题中无返回值,应为void型。
{
int a,b,c;
int temp;
cout<<"Enter a,b,c:"; //cin,cout,及运算符<<,>>在C语言中是没有的,它们正是
//C++提供得新得输入输出方式。其中cin称为标准输入流,cout是标
cin>>a>>b>>c; //准输出流,它们都是流对象;<<是输出运算符,>>是输入运算符。
temp=a;
a=b;
b=c;
c=temp;
cout<<"a="<<a<<" b="<<b<<" c= "<<c<<"\n"; //当需要连续输出不同变量值时,
//注意使用进行分割,避免出现cout<<a ,b, c;这样的错误。
}
2.2C++中为什么提倡用const定义一个常量,这样做与用#define来定义有什么不同?
答:这两种写法得差别在于使用宏#define定义的常量没有数据类型,而使用const来定义的常量则有数据类型,当我们将这些常量当做函数得参数来传递时,可以帮助编译程序来检查参数间的数据类型是否正确。
2.3一个标识符的作用域指的是什么?作用域分为哪5种?试举例说明文件作用域。
答:一个标识符的作用域是出现中的一段区域,用于确定该标识符是否可用(可见性)。作用域分为:块作用域(局部作用域)、文件作用域(全局作用域)、函数原型作用域、函数作用域和类作用域。
具有文件作用域(全局作用域)的变量是在所有块、函数和类之外说明的标识符,其作用域从说明点开始到文件结束处结束。如果标识符出现在头文件的文件作用域中,则它的作用域扩展到包含了该头文件的程序文件中,直到该程序文件结束。例如:
1. #include "iostream.h"
2. int i; //全局作用域
3. void main()
4. {
5. i=5; //局部作用域
6. {
7. int i;
8. i=7;
9. cout<<"i="<<i<<endl; //输出“7”
10. }
11. cout<<"i="<<i<<endl; //输出“5”
12. }
第2行中的i(下面称为i2)为文件作用域(全局作用域),第7行中的i(下面称为i7)为块作用域(局部作用域),i7屏蔽外面的i2,这时在包含i7的复合语句(即7~10行)无法存取i2。
通过使用作用域运算符::可以在块作用域中存取被屏蔽的全局作用域中的i2。例如:
1. #include "iostream.h"
2. int i; //全局作用域
3. void main()
4. {
5. i=5; //局部作用域
6. {
7. int i;
8. i=7;
9. ::i=1;
10. cout<<"i="<<i<<endl; //输出“7”
11. }
12. cout<<"i="<<i<<endl; //输出“1”
13. }
变量可以在文件作用域中说明称为全局变量,在块作用域中说明为局部变量。
3.填空题
3.1在C++中,表达式cout<<endl还可表示为 。
解答:cout<<’\n’; cout<<’\12’,cout<<”\xA”或其他等价形式。
因为在C语言中曾讲过用‘\’引导转义字符。’\12’,’\xA’分别为十进制和十六进制。参看C语言课本。
3.2下列定义中,ptr所指向的地址可更改,但*ptr不可更改的是 。
ptr所指向的地址不可更改,但*ptr可更改的是 。
ptr所指向的地址可更改, *ptr也可更改的是 。
ptr所指向的地址不可更改, *ptr也不可更改的是 。
A、const int *ptr; B、int *const ptr; C、const int *const ptr ; D、int *ptr;
解:A,B,D,C
在辨别const与指针一起使用时,简单的方法是从右往左看,例如const int *ptr;首先ptr是指针(*),指向整型(int)的常量(const),得出ptr所指向的地址可更改,但*ptr是不可更改的;再如int *const ptr;首先ptr是常(const)指针(*),指向整型(int)变量,得出ptr所指向的地址不可更改,但*ptr是可更改的。
4.程序填空
4.1以下程序的功能是:输入两个字符串,把这两个字符串拼成一个新的字符串,输出拼接后的字符串.
# include<iostream.h>
char *stringcat(char *to,char *from)
{
char *p= 1 ;
while (*to++);
2 ;
while( 3 =*from++);
to='\0';
return p;
}
void main(void)
{
char s1[200],s2[100];
cout<<"输入第一个字符串:";
cin.getline(s1,100);
cout<<"输入第二个字符串:";
cin.getline(s2,100);
cout<<"拼接后的字符串为:"<<stringcat( 4 )<<'\n';
}
解析:
1. to 使得指针p指向第一个字符串的首部
2. to— 使得指针指向第一个字符串得结束符'\n'
3. *to++ 完成拼接
4. s2,s1 用实参调用函数
5.改错与读程
5.1分析下列程序的输出结果
#include "iostream.h"
void main()
X
200
Num
{
int num=200;
int &x=num; //为num定义一个引用变量x,
X
300
Num
cout<<x<<endl;
x=x+100; //对引用变量x的操作,因和num同地址
cout<<num<<endl; //num的值随之发生变化
X
350
Num
num=num+50; //同样对num的操作,也反应在x上
cout<<x;
}
输出为: 200
300
350
5.2分析下列程序的输出结果
#include "iostream.h"
void swap(int &m,int &n)
{
int temp;
temp=m;n=m=y;n=temp;
}
void main()
{
int x=10,y=20;
swap(x,y);
cout<<"x="<<x<<",y="<<y<<endl;
}
解答:x=10,y=10
在传递参数时使得m为x的引用,n为y的引用。则在函数中对m,n的操作等同于对主函数中的x,y进行操作,随着函数的结束,作为局部变量m,n失去作用,但x,y的值已经发生互换。这里的函数调用采用引用方式,其效果与传地址方式是相同的,但使用引用更加简洁直观。
6.编程题
6.1下面是使用带参宏定义完成求平方的功能。
#include "iostream.h"
#define sq(x) x*x
int main()
{
for(int k=2;k<=3;k++)
cout<<k<<" square is "<<sq(k)<<endl;
cout<<"1+3 square is "<<sq(1+3)<<endl;
return 0;
}
程序输出结果为
2 square is 4
3 square is 9
1+3 square is 7
请使用内置函数替代宏定义进行正确的运算。
解:
#include "iostream.h"
inline int sq(int x) //内置函数消除了#define得不安全因素
{return x*x}
int main()
{
for(int k=2;k<=3;k++)
cout<<k<<" square is "<<sq(k)<<endl;
cout<<"1+3 square is "<<sq(1+3)<<endl;
return 0;
}
展开阅读全文