(一〇〇)第七章复习题

  1. 云栖社区>
  2. 博客>
  3. 正文

(一〇〇)第七章复习题

零零水 2015-12-27 01:32:00 浏览1180
展开阅读全文

1.使用函数的3个步骤是什么?

答:函数原型,函数定义,函数调用。

答:定义函数,提供原型,调用函数。

 

 

2.请创建与下面的描述匹配的函数原型。

aigor()没有参数,且没有返回值。

btofu()接受一个int参数,并返回一个float

cmpg()接受2double参数,并返回一个double

dsummation()将long数组名和数组长度作为参数,并返回一个long

edoctor()接受一个字符串作为参数(不能修改该字符串),并返回一个double值。

fofcourse()将boss结构作为参数,不返回值

gplot()将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]; //初始化maxa[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++程序可以使用哪3C-风格字符串格式?

答:假设字符串名为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++将字符串解释为指其第一个元素的地址,即pt的地址,*给出第一个元素的值,[2]给第三个元素的值,所以分别是pc

 

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);

请将p1p2分别声明为指向f1f2的指针;将ap声明为一个数组,它包含5个类型与p1相同的指针;将pa声明为一个指针,他指向的数组包含10个类型与p2相同的指针。请使用typedef来帮助完成这项工作。

 

答:

typedef void (*name_1)(applicant*);

typedef const char*(*name_2) (const applicant*, const applicant *)  //补充:答题的时候,这里忘写了typedef

//请将p1p2分别声明为指向f1f2的指针;

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]; //这个才是正确答案,看题看漏了

网友评论

登录后评论
0/500
评论
零零水
+ 关注