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