1.使用函数的3个步骤是什么?
答:函数原型,函数定义,函数调用。
答:定义函数,提供原型,调用函数。
2.请创建与下面的描述匹配的函数原型。
a。igor()没有参数,且没有返回值。
b。tofu()接受一个int参数,并返回一个float
c。mpg()接受2个double参数,并返回一个double
d。summation()将long数组名和数组长度作为参数,并返回一个long值
e。doctor()接受一个字符串作为参数(不能修改该字符串),并返回一个double值。
f。ofcourse()将boss结构作为参数,不返回值
g。plot()将map结构的指针作为参数,并返回一个字符串。
答:
a. void igor(void);
b. float tofu(int);
c. double mpg(double,double);
d. long summation(long[],int);
e. double doctor(const char*);
f. void ofcourse(boss);
g. char*plot(map*);
3.编写一个接受3个参数的函数:int数组名、数组长度和一个int值,并将数组的所有元素都设置为该int值。
答:
void start(int a[],int long,int m)
{
for(int i=0;i<long;++)
a[i]=m;
}
4.编写一个接受3个参数的函数:指向数组区间中第一个元素的指针、指向数组区间最后一个元素后面的指针,以及一个int值,并将数组中每一个元素都设置为该int值。
答:
void shuzu(int*first, int*last, int m)
{
while(first != last)
{
*first=m;
first++;
}
}
//注:在函数内部移动指针,离开函数后,指针恢复到初始位置(应该是在函数内部创建了一个指针副本)。因此无需在函数内部新创建一个指针
5.编写将double数组名和数组长度作为参数,并返回该数组中最大值的函数。该函数不应修改数组的内容。
答:
double findmax(const double*a, int long)
{
double max = a[0]; //初始化max为a[0]
for (int i=1;i<long;i++)
{
if(a[i]>max) max=a[i]; //如果新的double值比max大,则赋值给max
}
return max; //返回max
}
//注:未考虑到数组长度为0的情况。
6.为什么不对类型为基本类型的函数参数使用const限定符?
答:因为函数在调用参数时,使用的是一个副本,而不是原来的数,因此不会修改作为实参的基本类型的值。而指针不同,指针为函数参数时,可以通过修改直着,来修改指针所指向的值。
7.C++程序可以使用哪3种C-风格字符串格式?
答:假设字符串名为abc:
①char abc{]
②char*
③char []
答:字符串可以被储存在char数组中,可以使用带双引号的字符串来表示(比如"abc",但这种无法被修改),也可以用指向字符串第一个字符的指针来表示。
8.编写一个函数,其原型如下:
int replace (char*str, char c1, char c2);
该函数将字符串中所有的c1都替换为c2,并返回替换次数。
答:
int replace(char*str, char c1, char c2)
{
int number = 0;
for( ;str[0]!='\0';str++)
{
if (str[0] == c1)
//把==写成了=
{
str[0]=c2;
number++;
}
}
return number;
}
9.表达式*"pizza"的含义是什么?"taco"[2]呢?
答:
*"pizza"的含义是:"pizza"是一个常量字符串,其名字表示为指向其地址的指针(类型为char*),对这个指针解除运算,是字符串的第一个字符——即p。*"pizze"的结果是:p
"taco"[2]的含义是:原理同上,这个常量字符串的第三个字符——是c。
以上答案存疑。
参考答案给的是:C++将字符串解释为指其第一个元素的地址,即p和t的地址,*给出第一个元素的值,[2]给第三个元素的值,所以分别是p和c。
10.C++允许按值传递结构,也允许传递结构的地址。如果glitz是一个结构变量,如何按值传递他它?如何传递他的地址?这两种方法有何利弊?
答:
按值传递则是传递他的类型,然后glitz作为参数进行传递。按地址传递则是参数使用结构指针。
按值传递的好处是不会修改原结构变量,按地址传递的好处正好是可以在函数内修改原结构变量。
假如结构类型是abc,则声明结构是abc glitz;
按值传递函数原型假如为:void mmm(abc);
按地址传递函数原型假如为:void mmm(abc*);
glitz作为参数时,按值是glitz,按地址则为&glitz。
补充:按值传递将自动保护原始数据,但这是以时间和内存为代价的(因为要复制副本),按地址传递可节省内存和时间,但不能保护原始数据,解决办法是使用const限定符。
11.函数judge()的返回类型是int,它将这样一个函数的地址作为参数:将const char指针作为参数,并返回一个int值,请编写judge()函数的原型。
答:
int judge(int(*abc)(const char*));
12.假设有如下结构声明:
struct applicant {
char name[30];
int credit_ratings[3];
};
a。编写一个函数,它将applicant结构作为参数,并显示该结构的内容。
b。编写一个函数,他将applicant结构的地址作为参数,并显示该参数指向的结构的内容。
答:
void show_1(applicant m)
{
cout<<m.name<<endl;
for(int i=0;i<3;i++)
cout<<m.credit_ratings[i]<<endl;
}
void show_2(applicant*m)
{
cout<<m->name<<endl;
for(int i=0;i<3;i++)
cout<<(*m).credit_ratings[i]<<endl; //补充:(*m)后面少了一个.
}
//再注释:(*m).变量名和m->变量名是等价的。
13.假设函数f1()和f2()的原型如下:
void f1(applicant *a);
const char*f2 (const applicant*a1, const applicant *a2);
请将p1和p2分别声明为指向f1和f2的指针;将ap声明为一个数组,它包含5个类型与p1相同的指针;将pa声明为一个指针,他指向的数组包含10个类型与p2相同的指针。请使用typedef来帮助完成这项工作。
答:
typedef void (*name_1)(applicant*);
typedef const char*(*name_2) (const applicant*, const applicant *)
//补充:答题的时候,这里忘写了typedef
//请将p1和p2分别声明为指向f1和f2的指针;
name_1 p1= f1;
name_2 p2= f2;
//将ap声明为一个数组,它包含5个类型与p1相同的指针;
name_1 ap[5];
//将pa声明为一个指针,他指向的数组包含10个类型与p2相同的指针
name_2 pa[10];
name_2 (*pa)[10]; //这个才是正确答案,看题看漏了