一、实验目的
l
熟悉输出格式的设置;
l
熟悉vector、list类型的使用;
l
进一步熟悉string类型的使用。
二、实验环境
P4 1.7G计算机一台,Windows XP操作系统,Microsoft
Visual C++ 2005编程环境。
三、实验内容及分析
(一)求数的平方
1.
题意描述:提示用户输入一个整数 I,编写一个程序来计算从1~I
的双精度浮点数(double)值的平方。程序的输出分为两列:第一列是double值,第二列是double值的平方。使用控制器来控制输出,让数值按列左对齐排列起来。 注意,程序应当有一定灵活性,当 I 增长时我们不需要修正setw的参数(亦即对于任意合理的I值,程序的输出都将以合适的格式显示,而不会出现当I较大时格式混乱的情况)。
2.
问题分析与解决
由于要求当 I 增长时我们不需要修正setw的参数,所以将setw的参数通过log10函数求得并向下取整得出w。这样就可以得到右对齐,要做到左对齐的话,还要用这个求出的参数w减去当前输出数字的宽度加上要输出字符“: ”的宽度2。
3.
调试、测试运行情况及结果分析
(1)
实验中碰到的问题及解决方法
pow、log10函数出现“ambiguous call to overloaded function ”的错误,解决方法:用static_cast
<type-id> ( expression )显式类型转换。后来看到“static_cast conversions are not as safe
as dynamic_cast conversions, because static_cast does no run-time
type check, while dynamic_cast does.”但经过查找发现,static_cast可以用于int转double,但后者就不行。
pow函数并不是很好,通用性太强了,可能精度也会不佳。解决方法:自己写个square函数求平方。
(2) 测试数据及运行结果
(3) 结果分析与结论
这道题并不难,关键是了解setw的用法。
(二)单词分类
1.
题意描述:编写一个程序对于输入的单词进行转换输出,输出的格式是:先输出全部的小写单词,然后输出首字母大写的单词,最后输出大写单词。(假设只有这三种形式的单词)
2.
问题分析与解决
因为输入的单词只有这三种形式,现将输入的单词用list存储,再判断这些单词属于哪种类型,输入小写单词保留,其余的删除并放入各自所属的list。
3.
调试、测试运行情况及结果分析
(1)
实验中碰到的问题及解决方法
遇到错误:将list<string>::iterator 指向const
list<string>,解决方法:list<string > ::const_iterator。
(2) 测试数据及运行结果
(3) 结果分析与结论
这个问题用list在输入单词多的情况下效果会好很多。
(三)回文
1.
题意描述:回文是指顺读和倒读都一样的单词(譬如“上海自来水来自海上”)。编写一个程序,让它找出输入的单词集合中的所有回文,并指出最长的回文。
2.
问题分析与解决
首先,判断单词是否为回文,用equal(word.begin(), word.end(), word.rbegin());再查找其中最长的。
3.
调试、测试运行情况及结果分析
(1)
实验中碰到的问题及解决方法
find_if函数不好用,解决方法:自己写个循环判断是否等于最大长度。
(2) 测试数据及运行结果
(3) 结果分析与结论
“上海自来水来自海上”竟然不是回文,这也不奇怪,string不使用Unicode码存储的,所以一个中文字会分解成两个ASCII码存储。
(四)
1.
题意描述:练习5-6。Rewrite the extract_fails
function from §5.1.1 so that instead of erasing each failing
student from the input vector v
, it copies the records for the passing
students to the beginning of v
, and then uses the resize
function to remove the extra elements from the end of v
. How does
the performance of this version compare with the one in §5.1.1.
http://www.cnblogs.com/lshguang89/archive/2008/10/07/1305430.html
2.
问题分析与解决
用insert成员函数将及格的插入vector开头,再用resize函数调整大小,参数为及格学生的数目。当参数小于vector本身的大小时,就会截取前面的部分。
3.
调试、测试运行情况及结果分析
(1)
实验中碰到的问题及解决方法
开始时发现自己修改的算法比书上原本的算法快上一些,这从常规的想法来看是不对的,经过反复测试,结果仍然如此,在反复思考后,认识到计算时间和数据中及格和不及格学生所占比例有很大的联系,而自己写生成测试数据的程序中并没有考虑到这一点。解决方法:将及格和不及格的学生各占一半,由此可以看出,在操作数量一样的情况下,书上的原程序要比修改后的要快,这是显而易见的。
(2) 测试数据及运行结果
(3) 结果分析与结论
由于及格的学生太少了,所以导致用insert和resize成员函数的时间反而少了,易知如果及格和不及格的学生近乎相等时,用insert和resize成员函数的时间必然增加,当然我也用了一组数据说明。
(五)
1.
题意描述:练习5-11。
说明:本题的意思其实是首先写一个函数判断一个单词是否包含上行字母或者下行字母,然后再以此为基础,编写程序找出输入的单词集合中不包含上行字母或者下行字母的最长单词。
2.
问题分析与解决
这个问题只需要中文版书本92页的思想就可以轻松解决。将上行字母和下行字母列出,对于string中的每一个字符查找是否在其中,则可判断。
3.
调试、测试运行情况及结果分析
(1)
实验中碰到的问题及解决方法
这个程序比较简单,没有遇到什么重大问题。
(2) 测试数据及运行结果
(3) 结果分析与结论
文章评论(0条评论)
登录后参与讨论