C++学习之路(四),C++primer plus 第五章 循环和关系表达式编程练习题

/***************************************************************************
编程练习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 &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值