Untitled Document

二：简答及编程

1．答：
num 的作用域为从第__2__行到第__18__行.
i 的作用域为从第__7__行到第__14__行.
temp 的作用域为从第__10__行到第__13__行.
cout 的作用域为从第__1__行到第__18_行.
func 的作用域为从第__3__行到第__18__行.
2．答：
int sum(int n)
{
if(n==1)
return 1;
else
return n + sum(n-1);
}
3．答：
（1）、 程序的运行结果：25
（2）、 因为程序中需要利用cout对象进行输出，而cout是在C++标准I/O库iostream中定义的类ostream的一个对象。
（3）、 在函数main()中不可以直接调用函数g()，因为g()是静态函数，只在它所在的文件内可见。
（4）、 如果把文件file1.cpp中的两个函数定义的位置换一下，程序不正确，因为C++规定所有使用的变量和函数需要先声明，后使用。在函数f中用到了函数g，所以函数f不能出现在函数g的定义或声明之前。
（5）、 文件file1.cpp中的变量i的作用域从它的定义开始到文件结束。File2.cpp中的变量i的作用域从它的定义开始到main函数结束。
4．答：(1) 25 (2) 6 , 11
(3) 分析这道题首先要弄清楚两点：1：未赋初值的变量，它的值是什么。2：形参变量的值和实参变量的值的关系。本题在main函数中定义了一个整型变量c,系统为其分配了一个存储单元。此单元中的原有信息并未被清除，这时变量c的值是不确定的"随机数"。调用函数fun时，将实参常量2和3分别传给了形参a和b，实参变量c中的随机值传给了形参变量c。通过函数fun的运算，形参变量c中存放了a*b的运算结果，这一结果并不能反馈给实参变量c。因此在主函数中输出的c值是一个不确定的值。
(4) 输出结果为：
a= 300 b= 400
a= 300 b= 400
本题只要把握住一点即可：当函数调用的参数传递方式为值传递时，形参变量的值的改变不影响到实参变量。因此在outputab函数内部对变量a、b的赋值并不会对main函数中的a、b的值造成影响。

5．答：使用函数可以将大程序分成许多独立的模块，而且函数能在模块中单独编译并链接。使用函数还可将复杂的过程分解为简单的模块组合。函数声明要给出名称、返回值和参数。函数体中则是程序调用该函数时该函数所需执行的语句。
6．答：
#include "iostream.h"
//定义facto函数，在这里facto函数定义在main()函数之前，
//如果定义在main()函数之后，
//main()函数在调用facto函数之前需要先对facto函数进行声明
long facto(int x)
{
long y;
for(y=1;x>0;--x)
y*=x;
return y;
}

void main()
{
int m,n,temp;
double cmn;
cout<<"input m :"<<endl;
cin>>m;
cout<<"input n :"<<endl;
cin>>n;

if ( m < n )
{
temp = n;
n = m;
m = temp;
}
cmn=facto(m)/(facto(n)*facto(m-n));
//三次调用facto函数
cout<<"the combination is "<<cmn<<endl;
}
7．答：
为了得到最多的利息，存入银行的钱应该在到期时马上取出来，然后立刻将原来的本金和利息加起来再作为新的本金存入银行，这样本利不断的滚动直到满20年为止。由于存款的利率不同，所以有很多不同的存款方法（年限）存20年得到的利息也是不一样的。
分析题意：设2000元存20年，其中一年期存了i1次，二年期存了i2次，三年期存了i3次，五年期存了i5次，八年期存了i8次，则到期时存款人应该得到的本利合计应该为：
2000*(1+rate1) *(1+rate2) * (1+rate3) * (1+rate5) * (1+rate8) 其中rateN为对应存款年限的利率。根据题义还可以得到以下的限制条件：
0<=i8<=2
0<=i5<=(20-8*i8)/5
0<=i3<=(20-8*i8-5*i5)/3
0<=i2<=(20-8*i8-5*i5-3*i3)/2
0<=i1<=20-8*i8-5*i5-3*i3-2*i2
可以采用穷举法穷举所有的i8、i5、i3、i2、i1的组合，带入求本利的公式，算出本利为最大值时的存款方案。
#include "iostream.h"
#include <math.h>
void main()
{
int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;
//i:存款的年限，n：当前找到的最佳存款方法
double max=0,term;
for(i8=0;i8<3;i8++)
for(i5=0;i5<=(20-8*i8)/5;i5++)
for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)
for(i2=0; i2<=(20-8*i8-5*i5-3*i3)/2;i2++)
{
i1=20-8*i8-5*i5-3*i3-2*i2;
term=2000.0*pow(1+0.0063*12,(double)i1)
*pow(1+2*0.0066*12,(double)i2)
*pow(1+3*0.0069*12,(double)i3)
*pow(1+5*0.0063*12,(double)i5)
*pow(1+8*0.0063*12,(double)i8);
if(term>max)
{
max=term;
n1=i1;
n2=i2;
n3=i3;
n5=i5;
n8=i8;
}
}
cout<<"8 year: "<<n8<<endl;
cout<<"5 year: "<<n5<<endl;
cout<<"3 year: "<<n3<<endl;
cout<<"2 year: "<<n2<<endl;
cout<<"1 year: "<<n1<<endl;
cout<<"Total: "<<max<<endl;
}
8．答： C++函数调用的一般形式为： 函数名（实参1，实参2……）
其中实参可以是常量、变量或者是表达式。本题中容易知道前面的rec1,rec2+1均为实参，前者是一个变量，后者是一个表达式；关键是要正确识别（rec3,rec4），这也是一个表达式--逗号表达式。因为逗号表达式的优先级最低，所以只有用圆括号括起来才可以将他们看成是一个表达式。明确这一点后，就可以清楚地辨别出上述语句共有3个实参。
9．答：
可以利用强制类型转换方法实现，程序如下：
int newint(double x)
{
int I;
I=(int)x;
return I;
}
10. 答：
#include "iostream.h"
int fn(int a);
void main()
{
int s=0;
cout<<"please putin a num:";
int num;
cin>>num;
for(int i=1;i<=num;i++) s+=fn(i);
cout<<"1!+2!+...+num!="<<s<<endl;
}
int fn(int a)
{
static int b=1;
b*=a;
return b;
}