/***************************************************************************
编程练习1
编写一个要求用户输入两个整数的程序。该程序将计算并输出这两个整数之间(包括这两个整数)
所有整数的和。这里假设输入较小的整数。例如,如果用户输入的是2和9,则程序将指出2~9之间
所有整数的和为44.
***************************************************************************/
#include<iostream>
using namespace std;
void main()
{
int a, b;
cout << "Enter two number: " << endl;
cin >> a >> b ;
cout << "Sum of " << a << "~" << b << " is: "; //第一次写的时候写到循环体里去了,最后输入"47~9的和"
for (int i = a + 1; i <= b; i ++) //第一次写代码赋值int i = a ,结果和是46,找半天
//原因,一步步的跟踪才发现a = 2, i =2,然后下面a += i ,循环到最后就是等于46
a += i; //最后一步步跟踪才想到int i = a + 1
cout << a ;
cout << endl;
}
运行结果没有任何问题
/**************************************************
2,使用array对象(而不是数组)和long double(而不是long long)重新编写程序清单5.4,并计算100!的值
程序清单5.4如下
//mor looping with for 用for循环的价乘
#include<iostream>
using namespace std;
const int ArSize = 16;
void main()
{
__int32 factorials[ ArSize ];
//或者可以用 long double factorials[ ArSize ];
factorials[ 0 ] = factorials[ 1 ] = 1;
for (int i = 2; i <= ArSize; i ++)
factorials[ i ] = i * factorials[ i - 1 ];
for (i = 0; i <= ArSize; i ++)
cout << i << "! = " << factorials[ i ] << endl;
}
如下我写了两个版本,一个ventor,一个array,VC++6不支持array,而我一直在用VC6++,运行速度快
ventor版本代码:
#include<iostream>
#include<vector>
using namespace std;
const int ArSize = 101;
void main()
{
vector< long double > factorials( ArSize ); //注意这里是小括号(),不是中括号[]
factorials[ 0 ] = factorials[ 1 ] = 1;
for (int i = 2; i < ArSize; i ++)
factorials[ i ] = i * factorials[ i - 1 ];
for (i = 0; i < ArSize; i ++)
cout << i << "! = " << factorials[ i ] << endl;
}
vector代码运行结果:
我XP装了VS2010,于是又写了array版本,代码如下:
#include<iostream>
#include<vector>
using namespace std;
const int ArSize = 101;
void main()
{
array<long double, ArSize> factorials;
factorials[ 0 ] = 1;
factorials[ 1 ] = 1;
for (int i = 2; i < ArSize; i++)
{
factorials[ i ] = i * factorials[ i - 1];
}
for (int i = 0; i < ArSize; i++)
{
cout << i << "! = " << factorials[ i ] << endl;
}
}
array版本代码运行结果如下
说明:代码就是将 __int32 factorials[ ArSize ];改成vector< long double > factorials( ArSize );其余全部未变,不知道是不是出题的意思,虽说复习题本来就是简单的,也不可能就这样简单吧,其中发现一个问题,因为之前的代码不是这样,
如果这样改动:
const int ArSize = 100; //这里改成赋值100
...
for (int i = 2; i <= ArSize; i++) //这里由 i < ArSize改成 i <= ArSize
...
for (int i = 0; i <= ArSize; i++) //这里由 i < ArSize改成 i <= ArSize
则无论是vc6的vector版本还是vs2010的array版本,就是提示非法
这是VC6的非法,但仍然可以显示正确结果,三处改动
下面是VS2010的非法提示,结果都显示不出来,也是三处同样的改动
VS2010会自动触发一个中断,来到头文件array错误处,如下:
“subscript out of range”数组索引超范围,串下标超限。我用单步看了下,i来到100后就提示非法了,这个有何来的超标,不解......可能以后深入了会知道问题之所在吧
/*******************************************************
编程练习3,编写一个要求用户输入数字的程序。每次输入后,
程序都将报告到目前为止,所有输入的累计和。当用户输入0时,
程序结束。
*******************************************************/
#include<iostream>
using namespace std;
void main()
{
char ch;
int count = 0;
cout << "Enter the number, and enter the 0 to quit: \n" ;
cin.get(ch) ;
while (ch != '0')
{
cout << ch ;
++count;
cin.get(ch);
}
cout << endl << count << " numbers reads.\n";
}
运行结果如下,这个基本上不完全照抄程序清单5.16.只是改到一个循环条件
/********************************************************************************************************************
编程练习4;
Daphne以10%的单利投资了100美元。也就是说,每一年的利润都是投资额的10%,即每年10美元;
利息 = 0.10 × 原始存款
而Cleo以5%的复利投资了100美元,也就是说,利息是当前存款(包括获得的利息)的5%:
利息 = 0.05 × 当前存款
Cleo在第一年投资100美元的盈利是5%-----得到105美元。下一年的盈利是105美元的5%----即
5.25美元,依此类推。请编写一个程序,计算多少年后,Cleo的投资价值才能超过Daphne的投
资价值,并显示此时两个人的投资价值。
******************************************************************************************************************/
#include<iostream>
using namespace std;
double Da = 0.10;
double Cl = 0.05;
void main()
{
int years;
double Daphne = 100, Cleo = 100, Dap = Da * Daphne;
cout << "Enter the years:\n";
cin >> years;
for (int i = 1; i <= years; i++)
{
double sum_Da = Daphne + Dap * i;
Cleo += Cl * Cleo;
cout << "投资价值, 第" << i << "年, Dephne的价值: " << sum_Da << ",\tCleo的价值: " << Cleo << endl;
}
}
代码运行如下:
可以看到27年后 Cleo的投资价值才能超过Daphne的投资价值,然后我想,能不能直接输入第27年的结果,于是修改了下代码:
#include<iostream>
using namespace std;
const double Da = 0.10;
const double Cl = 0.05;
void main()
{
double Daphne = 100.0, Cleo = 100.0;
const Dap = Daphne * Da;
for (int years = 1; Daphne >= Cleo; years ++)
{
Daphne = Daphne + Dap; //Daphne * Da 每年增长的值是10 不变
Cleo += Cl * Cleo;
cout << "投资价值, 第" << years << "年, Dephne的价值: " << Daphne << ",\tCleo的价值: " << Cleo << endl;
}
}
运行下看结果
已经差不多了,程序在第27年处跳出了循环体,也显示了Dephne和Cleo各自的投资价值,
第13行代码,Daphne = Daphne + Dap; 由于Dap = 100 * 0.10是个不变量数,因此改成Daphne = Daphne + (Daphne * Da);不行,因为每轮循环Daphne的值会改变,要么这里直接改成10,要么在前面声明一个常量,这里再直接引用,打印出了所有的结果应该是cont这行不应该放在循环体内,把它移出循环体,再看下运行结果
这次又出状况了,竟然是28年,价值是一样的,在网上查了一下几个人写的版本,要么用do..while写的,输入为27年,用for循环写的都是28年,有个版本用 for循环写的,cout的时候用了i -1,用一步步运行,才知道当 for (int years = 1; Daphne >= Cleo; years++) ;i=27时,执行循环体,Daphne = 370; Cleo &