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

本文深入探讨C++编程实践,涵盖数组操作、循环控制、结构体使用、字符串处理及嵌套循环应用,通过具体实例解析常见编程问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/***************************************************************************
编程练习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 = 373.346;此时循环体还未结束,再执行 for (int years = 1; Daphne >= Cleo; years++);这一句,先比较 Daphne 和 Cleo 的值,发现 Daphne = 370 < Cleo = 373.346,根据上面for测试条件不成立时,跳出循环体,即Daphne = Daphne + Dap; Cleo += Cl * Cleo;不执行,但是for (int years = 1; Daphne >= Cleo; years++);这一句还是要执行完,刚才执行完比较 Daphne >= Cleo; 这段代码,然后后面 years++这个还要执行,于是27++=28,所以最后输出第28年,看来用for循环不好处理这个问题,用do...while循环来继续完善下


#include<iostream>
using namespace std;

void main()
{
	double Daphne = 100.0, Cleo = 100.0;
	int years;
	do
	{
		++years;
	    Daphne = Daphne + 10;
	    Cleo = Cleo + 0.05 * Cleo;
	
	}while (Daphne > Cleo);
	

	cout << "投资价值, 第" << years << "年, Dephne的价值: " << Daphne << ",\tCleo的价值: " << Cleo <<  endl;
}

输入结果:

 价值是正确的,为何年份会是一个随机数,难道不是说声明不赋值int类型时候会自动设置为0么,找了资料有说 “当然在有一些编译器里,一旦定义了int a;会自动帮你设置成0.”看来这里要把years先赋值为0;于是再一次运行

改成while语句

#include<iostream>
using namespace std;

void main()
{
	double Daphne = 100.0, Cleo = 100.0;
	int years = 0;

	while (Daphne >= Cleo)    //不知道为何这里一定要用 >= 用 > 只打印出错误结果
	{
		++years;
		Daphne = Daphne + 10;
		Cleo = Cleo + 0.05 * Cleo;
	
	}
	

	cout << "投资价值, 第" << years << "年, Dephne的价值: " << Daphne << ",\tCleo的价值: " << Cleo <<  endl;
}

 while (Daphne >= Cleo)    //不知道为何这里一定要用 >= 用 > 只打印出错误结果,有待研究....

 最后找到一个用for循环解决年份的问题,在前面定义一个int i;循环里用一个将years的值赋值给i,即加一句i = years;此时跳出循环的时候for语句years是28,但是循环语句里却还是27,然后打印语改成打印i ,这个方法可行。
好了,此题至此为止,继续下一题

/*************************************************************************************
编程练习5,
假设要销售<<C++For Fools>>一书。请编写一个程序,输入全年中每个月的销售量(图书数量,而
不是销售额)。程序通过循环,使用初始化为月份字符串的char *数组(或string对象数组)逐月
进行提示,并将输入的数组储存到一个int数组中。然后,程序计算数组中各元素的总数,并报告
这一年的销售情况。
**************************************************************************************/
刚看到此题时完全不知道从何下手,大概分析一下,要输入全年中每个月的销售量,输入12个整数,
并将它储存到一个int数组中,声明并初始化一个char *的数组,里面包含12个月了字符串,然后利用循环
逐月进行提示,最后再计算这一年的销售情况,也就是int数组的和

#include<iostream>
using namespace std;
const int mouthes = 12;

void main()
{
	int MouthValue[ mouthes ], i = 0;
    //使用初始化为月份字符串的char *数组
	const char * Mouth[ mouthes ]=
	{
		"January",
		"february",
		"March",
		"April",
		"May",
		"June",
		"July",
		"August",
		"September",
		"October",
		"November",
		"December",
	};

	cout << "Enter the twelve mouths value of for <<C++For Fools>>: \n";
	//cin >> mouth[ 0 ] >> mouth[ 1 ] >> mouth[ 2 ] >> mouth[ 3 ] >> mouth[ 4 ] >> mouth[ 5 ];
    //输入12个月的销售额,并储存到数组MouthValue[ i ]中
	while (i <= 11)
	{
		cin >> MouthValue[ i ];
		i ++;
	}
    cout << "twelve mouths value of for <<C++For Fools>>: \n";
    //逐月显示每个月的销售量,
	for (i = 0; i <= 11; i++)
	{
		cout << Mouth[ i ] << ":\t" << MouthValue[ i ] << endl;
		
	}
	//cout << "January: " << ": " << MouthValue[ 0 ] << endl;
	//cout << "February: " << MouthValue[ 1 ] << endl;
	int sum_Year = 0;    //要计算总和声明一定要赋值为0,不然只会显示随机数
    //计算全年的销售总和
	for (i = 0; i <= 11; i++)
		sum_Year += MouthValue[ i ];
	cout << "The sum of twelve mouths value is : " << sum_Year << endl;
}

这是运行的结果,不知道是不是题目所要求的 ,在买包子的路上我想了下,既然输入12个整数存储在一个数组的循环,和这12个整数求和应该可以放到一个循环里实现吧(哈哈,不错,之前总听到视频或者书上说实现实现,总是一知半解,模棱两可的,终于自己也可以说出这个词了,真是不错,不知道这里用这个词合不合适,姑且先这样说吧),于我把计算一年总和的for循环去掉,把声明变量sum_Year = 0;移到最前面,然后在while循环体里加一句sum_Year += MouthValue[ i ],循环体代码变成:

        cin >> MouthValue[ i ];
        i++;
        sum_Year += MouthValue[ i ];

运行代码:

其它都一样,就是和不一样,是个随机数, 出现这个的原因按照之前的经验,应该是sum_Year 没有初始化为0所致,可以我在main函数一开始就声明并初始化了的,为何还会出现这种情况,我就想,是不是这个sum_Year的第一个值应该是整形数组的第一个元素MouthValue[ 0 ]的值,只有进入while循环体后,MouthValue[ 0 ]才会被赋值,或者要循环体循环一次才能给MouthValue[ 0 ]赋值,我就认为while不适合求和,于是我就换成一个for循环,while循环代码改成如下for循环:

for (i = 0; i <= 11; i++)
    {
        cin >> MouthValue[ i ];
        sum_Year += MouthValue[ i ];
    }

然后再运行代码,结果没有问题,再想想while循环的问题,用F10来查找问题所在,当输入第一个数101后,程序来到

这里明明MouthValue[ i ]已经赋值第一个数了,F10继续 

MouthValue[ i ]竟然又变回随机数了,明白了,关键就是这个i上, cin >> MouthValue[ i ];这一步运行完的时候,看上一张图,        i =  0,时,MouthValue[ 0 ] = 101,即第一个元素的值为101,接下来程序到i++,此时i = 1,程序到 sum_Year += MouthValue[ i ];即sun_Year = MouthValue [ 1 ];sum_Year = 0,但MouthValue[ 1 ]却还没有赋值,所以是个随机数,即如图上所示,原来是顺序有问题,把顺序改下:

    while (i <= 11)
    {
        cin >> MouthValue[ i ];
        i++;
        sum_Year += MouthValue[ i ];
        
    }                                                                                                                                                                                                                                再运行下代码:已经没有问题了

/*************************************************************************************
编程练习5,
假设要销售<<C++For Fools>>一书。请编写一个程序,输入全年中每个月的销售量(图书数量,而
不是销售额)。程序通过循环,使用初始化为月份字符串的char *数组(或string对象数组)逐月
进行提示,并将输入的数组储存到一个int数组中。然后,程序计算数组中各元素的总数,并报告
这一年的销售情况。
6,完成编程练习5,但这一次使用一个二维数组来存储输入-3年中每个月的销售量。程序将报告每
年销售量以及三年的总销售量
**************************************************************************************/
用一个二维数组来存储3年中每个月的销售量,那么第一维数组用来存储年份,三个元素,第二维数组存储每12个月的销量,不过这应该又是一个二维数组啊,还是就只和第五题样的存储12个月的字符串和12个月的销量整数?存储12个月的字符串是个常量,三年也可以是个字符串常量,这个都好说,但三年12个月就是36个整数,将36个整数存储到三组12个元素中,如何办到呢?是不是可以一组组的输入,先输入一组12个整数,保存到第一年中,然后继续输入一组12个整数,又保存到第二年中,再输入一组12个整数,保存到第三年中,这个应该可以办到,如果一次输入36个数保存到三个数组中,暂时还没想到实现方法。第二天早上跑步的时候想到方法,用for嵌套循环,是不是可以如下:

三层嵌套for循环

for (......)      //这里条件1-12次循环
    {
             for (......)      这里条件13-24次循环 
          {
                    for (......)      这里条件25-36次循环 
                {
                    ......
                } 
          ......
          } 
   ......
      } 
  或者for循环里串联两个for循环

for (......)      //这里条件1-12次循环
    {
             for (......)      这里条件13-24次循环 
          {
                   ......
          } 
             for (......)      这里条件25-36次循环 
          {
                   ......
          } 
   ......
      } 
  看下这两种是不是都能成功,实现这个词不知道用得合不合适,暂就不用了,通俗点吧,用错了,糗大了。                                       最初整出一段代码:                                                                                                                                                                                            for (int value = 1; value < 37 ; value++)
    {
        for (value = 13; value <=24; )
        {
            cin >> val[ 2 ][ value ];
            cout << "val[ 2 ][ " << value << " ]: " <<val[ 2 ][ value ] << endl;
        }
        for (value = 25; value <= 36; )
        {
            cin >> val[ 3 ][ value ];
            cout << "val[ 3 ][ " << value << " ]: " <<val[ 3 ][ value ] << endl;
        }
    }                                                                                                                                                                                                                              想用一个变量来作for嵌套循环,意思是,循环1-12输入一组,当循环13-24输出一组,最后循环25-36输出最后一组,期间代码运行不成功,想到第一个for循环条件的问题,是不是value++不能用,或者条件要为空,研究了半天不得其果,我就想这应该是if语句的活儿吧,我现在这种水平搞不定,于是在网上找代码,“C++用for循环输入二维数组”,还找到一个,一看别人写的代码,用的是两个变量作为for嵌套循环,我找到一个c语言的代码,我将其修改一下 可以先符合上面的题目:                                                  int a[ 3] [ 12 ];
int i, j;
for (i = 0;i < 3; i++)
{
    for (j = 0; j < 12; j++)
    {
        printf("输入第%d行的第%d个数的值:",i,j);   //cout << "输入第" << i << "行的第" << j << "个数的值: ";
        scanf("%d",&a[i][j]);                                       //cin >> a[ i ][ j ];
    }
}
for (i= 0; i < 3; i++)
{
    for (j = 0; j < 12; j++)
    {
        printf("%d ",a[i][j]);                                     //cout << a[ i ][ j ];
    }
    printf("\n");                                                   //cout << endl;
}这是一段C语言代码,简单改下,改成C++代码,运行起来没问题,于是我就再改

void main()
{
    //int value;
    const char * Mouth[ 12 ] =
    {
        "January",
        "february",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
    };

    

}这样打印出

已经初见成效了,那么继续完善

int a[3][12];
    int i, j;
    cout << "Enter the twelve mouthes value for one year: \n";
    for (i = 1;i <= 3; i ++)
    {
    for (j = 0; j < 12; j++)
    {

        cin >> a[i][j];
    }
    }

    for (j = 0; j < 12; j++)
    {
    cout << Mouth[ j ] << "  月份销售量: " << a[ 1 ][ j ] << " \t" << a[ 2 ][ j ] << " \t" << a[ 3 ][ j ] <<  endl;
    }
    cout << endl;

运行代码

就是将打二个cout 的 j 换成了 Mouth[ j ] ,竟然不循环了,用F10一步步看,前面的嵌套循环没有问题,嵌套循环完了程序就直接完了不经过打印的循环,我把代码copy到vs2010中再次运行

可以显示结果,虽然结果有些问题,但是非法, 这我就弄不懂了,我一比较代码,应该是我改了对应数组下标显示的原因

下面是完整代码

#include<iostream>
using namespace std;

const int mouthes = 12;
const int years = 3;

void main()
{
	//int value;
	const char * Mouth[ 12 ] =
	{
		"January",
		"february",
		"March",
		"April",
		"May",
		"June",
		"July",
		"August",
		"September",
		"October",
		"November",
		"December",
	};

	int a[3][12];
    int i, j,sum = 0;
    cout << "Enter the twelve mouthes value for one year: \n";
    for (i = 0;i < 3; i ++)
    {
    for (j = 0; j < 12; j++)
    {

        cin >> a[ i ][ j ];
		sum += a[ i ][ j ];
    }
    }
	cout << endl;
	cout << "Enter the value for per one year: \n";
    for (j = 0; j < 12; j++)
    {
    cout << Mouth[ j ] << "     销售量: \t" << a[ 0 ][ j ] << "\t" << a[ 1 ][ j ] << "\t" << a[ 2 ][ j ] <<  endl;
    }
    cout << endl << "三年的总销售量: \t" << sum << endl;
	//}

	/*int val[years][ mouthes]  ;
	cout << "Enter the twelve mouthes value for one year: \n";
	for (int value = 1;  ; value++)
	{
		for (value = 13; value <=24; )
		{
			cin >> val[ 2 ][ value ];
			cout << "val[ 2 ][ " << value << " ]: " <<val[ 2 ][ value ] << endl;
		}
		for (value = 25; value <= 36; )
		{
			cin >> val[ 3 ][ value ];
			cout << "val[ 3 ][ " << value << " ]: " <<val[ 3 ][ value ] << endl;
		}
	}
	for(value = 1; value <= 4; value++)
	{
		//for (int year =1; year <= 3; year++)
		cin >> val[1][ value ] ;

	}
	cout << "Enter the twelve mouthes value for two year: \n";
	for(value = 1; value <= 4; value++)
	{
		//for (int year =1; year <= 3; year++)
		cin >> val[2][ value ] ;

	}
	cout << "Enter the twelve mouthes value for three year: \n";
	for(value = 1; value <= 4; value++)
	{
		//for (int year =1; year <= 3; year++)
		cin >> val[3][ value ] ;

	}
	//for (year = 0; year <= 2; year++)
	//	cout << "val[years][ " << year << " ]: " << val[years][ year ] << endl;
		for(value = 1; value <= 4; value++)
	{
		for (int year =1; year <= 3; year++)
			cout << "val[ " << year << " ][ " << value << " ]: " << val[year][ value ] << endl;

	}*/
}

 注释掉的初始自己想当然的代码,运行结果结果果然很666哈

写代码的时候总是在一些小问题上浪费过多的时间 

/**************************************************************************************************************
编程练习7:
设计一个名为car的结构,用它存储下述有关汽车的信息:生产商(存储在字符数组或string对象
中的字符串)、生产年份(整数)。编写一个程序,向用户询问有多少车汽车。随后程序使用new
来创建一个由相应数量的car结构组成的动态数组。接下来,程序提示用户输入每辆车的生产商
(可能由多个单调组成)和年份信息。请注意,这需要特别小心,因为它将交替读取数值和字符串
(参见第4章)。最后,程序将显示每个结构的内容。该程序的运行情况如下:
How many cars do you wish to catalog?        2
Car #1:
Please enter the make:        Hudson Hornet
Please enter the year made:        1952
Car #2:
Please enter the make:        Kaiser
Please enter the year made:        1951
Here is your collection:
1952    Hudson Hornet
1951    Kaiser
*****************************************************************************************************************/

刚一看题目挺长,看一句写一句代码,先设计一个名为car的结构,然后声明两个结构成员,生产商和生产年份这个简单,然后使用new创建一个由相应数量的car结构组成的动态数组,这个还真的不记得了,大概知道,这个还在网上找了下资料,然后就先写着代码

#include<iostream>
#include<string>
using namespace std;

struct car
{
    string CarMaker;
    int YearMake;
};

void main()
{
    string str;
    char ch;
    int year;
    cout << "How many cars do you wish to catalog(目录,一览表): ";
    cin.get(ch);
  car * Car = new car[ 2 ]    ;        //创建动态结构数组,
    //{
    //{ "Hudson hornet",1952},         //刚开始这样初始化,这样是不对的,
   //}
    //Car[ 0 ].CarMaker = "Hudson hornet";            //要这样初始化动态结构数组各元素
    //Car[ 0 ].YearMake = 1952;                        //用大括号里面大括号初始化编译器不能通过
    //写到这时我就想,应该不会简单,这样的话就会不是这一章的题了
    cin.get(ch);
    cout << "please enter the make: ";
    getline (cin, Car[ 0 ].CarMaker);
    cout << "Please enter the year made: ";
    cin >> Car[ 0 ].YearMake;

    cin.get(ch);                        //注意这里要加一句cin.get(ch),否则下面一句输入将不可行
    cout << "Please enter the make: ";
    getline(cin, Car[ 1 ].CarMaker);
    cout << "Please enter the year made: ";
    cin >> Car[ 1 ].YearMake;

    cout << endl << "Here is your collection: \n";//发现同样的两句输入的时候明白这里可以用循环来解决
    cout << Car[ 0 ].CarMaker << "\t" << Car[ 0 ].YearMake << endl;
    cout << Car[ 1 ].CarMaker << "\t" << Car[ 1 ].YearMake << endl;

        delete [] Car;
}下面是没有加 cin.get(ch);代码的运行结果

下面是第二次运行结果

我想代码应该不是这样的,至少会有循环,一个输入汽车信息的循环,一个打印循环,然后应该可以定义一个手动输入的循环数次,把Car #1和Car #2打印出来,再想想,先动手:                                                                                                                                         cout << "How many cars do you wish to catalog(目录,一览表): ";             //向用户询问有多少车汽车,然后把用户输入的数作变量     int count;           //定义一个变量用来存储用户输入汽车数量,来作for循环                                                                                                     cin >> count;                                                                                                                                                                                                          for(count = 1; count <=                       //这里就卡住了,虽然题目明说了是2,可以填2,也可以填10,但是扩展的话,这应该是个变量,应该是根据用户的输入来定的,一时半会这里不知道怎么填了...................                                                                                          就在我下楼不知道干嘛的时候,突然想到,为何不多声明一个变量是i,用i作为循环,虽然不知道count的值是多少,但是可以让变量i的值小于或等于用户输入的值么,笨死了                                                                                                                                                     int year, count, i;
    cout << "How many cars do you wish to catalog(目录,一览表): ";
    cin >> count;
    for (i = 1; i <= count; i++)
    {
        cout << "Car #" << i << endl;
    }                                                                                                                                                                                                                                运行代码看下效果:                           然后完整代码如下:

#include<iostream>
#include<string>
using namespace std;

struct car
{
	string CarMaker;
	int YearMake;
};

void main()
{
	char ch;
	int count, i;
	cout << "How many cars do you wish to catalog(目录,一览表): ";
	cin >> count;
	
	car * Car = new car[ 2 ]	;		//创建动态结构数组,
	//Car[ 0 ].CarMaker = "Hudson hornet";			//要这样初始化动态结构数组各元素
	//Car[ 0 ].YearMake = 1952;						//用大括号里面大括号初始化编译器不能通过
	
	//cin.get(ch);
	for (i = 0; i < count; i++)
	{
		cin.get( );
		cout << "Car #" << i+1 << endl;
		cout << "Please enter the make: ";
		getline(cin, Car[ i ].CarMaker);

		cout << "Please enter the year made: ";
		cin >> Car[ i ].YearMake;

	}
	
	cin.get( ch );
	cout << "Here is your collection:\n";
	for (i = 0; i < count; i++)
	{
		cout << Car[ i ].YearMake << "\t" << Car[ i ].CarMaker << endl;
	}
	delete [] Car;

运行结果如下:                                 应该没问题了吧,我想再加一辆车试下,结果却                                                             这是什么情况,输入大于2的数都会出现这样的情况,我看下代码,按照经验这应该是没有加cin.get(ch);所导致的吧,我在第一个for循环的前、后、以及第一个for循环体里加上cin.get(ch);但结果仍没有变,这又是神马情况,我再看下源代码,当我看到          car * Car = new car[ 2 ]; 这一句的时候,明白了,我只定义了两个数组,这是由题目根据题目来的,问题应该是在这里了,既然前面已经定义了一个变量,这里就应该改成定义的变量,而不是一个常量,改成 car * Car = new car[ count ]; 再运行代码:

OK~此题没有问题了,继续下一题;

/***********************************************************************************
编程练习8;
编写一个程序,它使用一个char数组和循环来每次读取一个单词,直到用户输入dong为止。随后,
该程序指出用户输入了多少个单词(不包括dong在内)。下面是该程序运行情况:
Enter words (to stop, type the word done):
anteater birthday category dumpster
envy finagle geometry done for sure
You entered a total of 7 words.
您应在程序中包含头文件cstring,并使用函数strcmp()来进行比较测试。
***********************************************************************************/
这个题还没开始,抄了一段代码就出了问题                                                                                                                                                     

#include<iostream>
#include<cstring>
using namespace std;

void main()
{
    char ch;
    int count = 0;
    cout << "Enter words (to stop, type the word done): " << endl;
    
    while(ch != EOF)
    {
        cout << ch;
        ++count;
        cin.get(ch);
    } 
}

运行代码竟然                                       第一次输入出现乱码,第二次就正常了,总是在一些小事上出问题,后来发现就是少了一句代码 cin.get(ch); 。先定义一个char数组,char word[  20 ],然后用循环把输入的单词存储在这个数组中,再用strcpy比较单词是不是done,不是的继续比较,是done后跳出循环,然后打印出比较了多少个单词,如何用循环把输入的单词存储在char数组中;是不是把输入的单词先存储在char数组中,然后用for循环比对,从第一个字符开始,比较有没有空格,有空格了,就把从第一个字符到空格之间的字符放到char word[1]中,然后继续如何比对,直到输入结尾,然后再用strcmp(word[ i ], "done"); 比对,看比对了多少次;然后我一想,循环比较到空格后就退出了循环了,如何进入空格后的字符?想不出所以原,还准备去网上抄些代码进行修改,后来晚上九点多了,回宿舍,边走也边想,之后发生了一件比较有意思的事;洗了澡在床上躺着想如何解决把单词存储到数组中,想着想着竟然睡着了,然后做了一个梦,梦中大概是这样:梦到吃桃子,桃子里面有白色的虫子,这些虫子繁殖起来很快,不知道什么原因,虫子繁殖了好多,并按照每排每列的顺序排列着,我当时就想,这些虫子就好像是字符,如何把虫子归列到数组中,在梦中灵机一动,把若干个虫子和虫与虫之间的间隙当成一个字符串,好比是:字符 + 空格 = 若干排列的虫子 + 虫与虫之间的间隙;那么所有的虫子排列不都可以这样来处理,虫子 + 间隙,然后(虫子 + 间隙)虫子 + 间隙,然后继续((虫子 + 间隙)虫子 + 间隙)虫子 + 间隙,一直这样循环下去,大概酱紫;然后差不多我就醒了,想不到会做这样的梦,记得老早以前在读者里看过一篇文章,是说有人研究人在梦中会不会解题,于是弄了一些人来出了一个题,题目好像是五张图片,第一张图片写的是字母O,第二张图片写的是字母“T”,第三张图片写的是字母“T”,第四、五张图片是空白,问这最后两张图片应该填什么,于是弄来这些人,有一部分人可能智商高,没用多久就答出来了,肯定有些人放弃,回答不上来,而其中就有那么三两个在梦中也梦到了题,并且也是在梦中解开了这个题,我大概记得其中某个做梦的人说,他来到一个展览馆,展览了好些画,他正在欣赏,欣赏了第一二三幅画,当欣赏第四幅画的时候,发现第四幅画是什么样的(不记得了),于是那个就想,这肯定是题目的关键,于是那个又从第一幅,第二幅,第三幅开始找线索,一, 二, 三; 四, 五,一, 二, 三; 四, 五,就这样想着,ONE, TWO, THREE; FOUR, FIVE,后来就样想到了,第四张图片填F,第五张图片填F。不知道这个故事是真是假,反正我只记得这么多。由于晚上做了个梦也和解题有关,于是就联想到了那篇文章,不过我虽然也梦到了那个题 ,但是我的问题还没有解开,早上六点钟起来跑步,我又在想,怎么把输入带空格的字符分别存储到数组中,突然想到之前做的,输入两个数,存储到两个变量中,可以用cin >> a >> b; 而之后的输入36个数也能分别存储到一个二维数组中,这么简单的怎么没有想到,用循环cin >> word[ i ];这样不就行了么,在代码中运行发现不行,word[ i ]只是存储单个字符并不个字符串,果然不得其决:

#include<iostream>
#include<cstring>
using namespace std;

void main()
{
    char word[ 20 ];    
    int count;

    cout << "Enter words (to stop, tpye the word done): " << endl;
    cin >> word;        //有点不明白这里为何是存储一个单词,
    while(strcmp(word, "done"))
    {
        count++;
        cin >> word;
    }
    cout << "You entered a total of " << count << " words. " << endl;
}

就是TMD简简单单的几句代码,还是有点不明白,输入的字符为何可以用定义的字符数组来存储单个单词,运行结果:

 

/***********************************************************************************
编程练习9;
编写一个满足前一个练习中描述的程序,但使用string对象而不是字符数组。请在程序中包含
文件string,并使用关系运算符来比较测试。下面是前一题描述:

编写一个程序,它使用一个char数组和循环来每次读取一个单词,直到用户输入done为止。随后,
该程序指出用户输入了多少个单词(不包括dong在内)。下面是该程序运行情况:
Enter words (to stop, type the word done):
anteater birthday category dumpster
envy finagle geometry done for sure
You entered a total of 7 words.
您应在程序中包含头文件cstring,并使用函数strcmp()来进行比较测试。
************************************************************************************/
有了前面题的代码,这里就简单了,直接写代码:
 

#include<iostream>
#include<string>
using namespace std;

void main()
{
    string str;
    int count;

    cout << "Enter words (to stop, tpye the word done): " << endl;
    cin >> str;
    while(str != "done")
    {
        count++;
        cin >> str;
    }
    cout << "You entered a total of " << count << " words. " << endl;
}

/*****************************************************************************************************************
编程练习10;
编写一个使用嵌套循环的程序,要求用户输入一个值,指出要显示多少行。然后,程序将显示相
应行数的星号,其中第一行包括一个星号,第二行包括两个星号,依此类推。每一行包含的字符
数组等于用户指定的行数,在星号不够的情况下,在星号前面加上句点。该程序的运行情况如下:

  Enter number of rows:    5
  ....*
  ...**
  ..***
  .****
  *****
**************************************************************************************************************/

 此题暂时不知道如何写代码,后来在网上查到有人写了一段打印三角形的代码:

    int i, j, k;                         
    for (i = 1; i <= 5; i++)                    //控制行数
    {
        for (j = 1; j <= 5 - i; j++)                //控制空格数
            cout << " ";
        for (k = 1; k <= 2 * i - 1; k++)            //控制打印*号的数量
            cout << "*";
        cout << endl;
    }打印出的结果是:

我看到第三个for循环的条件是 k = 2 * i - 1; 打印*的数目是第一行1,第二行3,第三行5,第四行7,第五行9,而我要打印*的个数目和行数相同,即第一行1, 第二行2, 第三行3,以此类推,那么我这里的条件表达式就应该是 k = i; 我编写i是由键盘输入的数值,代码如下:

    int i, a, b, c;

    cout << "Enter number of rows: ";
    cin >> i;
    for (a = 1; a <= i; a++)
    {
        for (b = 1; b <= i - a; ++b)
        {
            cout << " ";
        }
        for (c = 1; c <= i; c++)
        cout << "*";
            cout << endl;
    }

打印结果却是:

*的数目不对,打印*的数目是个变量,而不是 i 常量,应该和打印的行数一致,这里行数是第一个for循环的a, 于是把第三个for循环条件表达改为 c <= a; 再运行下代码:

这回差不多了,再把第二个for循环打印出空格的换成"."完整代码如下:

#include<iostream>
using namespace std;

void main()
{
	int i, a, b, c;
	cout << "Enter number of rows: ";
	cin >> i;								//要求用户输入一个值,指出要显示多少行
	for (a = 1; a <= i; a++)				//控制行数
	{
		for (b = 1; b <= i - a; ++b)		 //控制空格数
		{
			cout << ".";
		}
		for (c = 1; c <= a; c++)			//控制打印*号的数量, *号数目和行数一致,即这里行数是a, 所以c < = a;
		cout << "*";
			cout << endl;
	}
}

 

 延伸一下,碰巧在C++贴吧看到有人打印  <<乘法口决 >>, 我也来试下                                                                                                           int a, b, c;
    for (a = 1; a <= 9; a++)            
    {
        for (b = 1; b <= 9; ++b)
        {
            for (c = a; c <= b; c++)
            cout << b << "×" << c << "=" << b * c << " ";
        }
            cout << endl;
    }
我的意思,b = 1,进入第三个循环体,此时c = 1, 条件表达式(c = 1) <= (b = 1),表达式成立,进入循环体,输出1x1=1; 然后此时c++ = 2;条件表达式(c = 2) <= (b = 1),表达式不成立,跳出第三个循环,而输出cout << endl,然后再跳到第二个循环体,此时b = 2, 再进次第三个for循环,c = 1,条件成立,进入循环体输出1x2=2,然后c++=2,条件成立,输出1x2=4, c++=3,条件不成立,跳出循环,输出cout << endl;依此类推....然而当我运行找码的时候却发现,事实并非我想像的:修改下代码如下:

#include<iostream>
using namespace std;

void main()
{
	int a, b, c;
	for (a = 1; a <= 9; a++)			
	{
		for (b = 1; b <= a; ++b)
		{
			for (c = a; c <= a; c++)
			cout << b << "×" << c << "=" << b * c << " ";
		}
			cout << endl;
	}
}


//或者

#include<iostream>
using namespace std;

void main()
{
	int a, b, c;
	for (a = 1; a <= 9; a++)			
	{
		for (b = a; b <= a; ++b)
		{
			for (c = 1; c <= b; c++)
			cout << b << "×" << c << "=" << b * c << " ";
		}
			cout << endl;
	}
}

//或者

#include<iostream>
using namespace std;

void main()
{
	int a, b, c;
	for (a = 1; a <= 9; a++)			
	{
		for (b = a; b <= a; ++b)
		{
			for (c = 1; c <= a; c++)
			cout << b << "×" << c << "=" << b * c << " ";
		}
			cout << endl;
	}
}

代码运行如下:
好了,此章就先到此了,进入下一章。
                                                                                                                                                                 2019 年 8 月 1 日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值