第二次作业参考答案

说明:

1.由于第一次作业太简单就不公布参考答案。

2.每次参考答案我会尽量从同学们的优秀作业中挑选,被选中的同学在最后成绩评定中会有额外加分。

3.挑选从第四次开始,第二次和第三次作业都是林凡同学的作业,希望大家向林凡同学学习。

4.以下代码中的部分格式问题都是博客自身造成的,林凡同学打代码本身写得非常精彩。

5.代码中的注释都是我加上的,如果有哪些不足、写错或者您有更深入的体会,不妨在下面留言,供大家交流学习。


一、新建一个名为”in.txt”的文本文档,输入两行以上的英文或数字并存盘,然后编写程序,开启该文本文档,将其中的每个字符串或数字都读取到一个vector<string>中,便利该vector,将vector中元素倒序显示到另一个名为”out.txt”的文本文档中。

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

/*
 ** iostream是对屏幕上输入输出
 ** fstream 是对文件输入输出
*/

int main()
{
    ifstream infile;
    ofstream outfile;
    
	//ofstream的用法和cout其实没太大区别
	//ofstream将内存内容写出到文件(磁盘)上
	//cout    将内存内容输出到显示屏上
    outfile.open("in.txt");
    outfile << "This is my first program about file" << endl
            << "Student number is 1152789" << endl
            << "My name is Linfan" << endl;
    outfile.close();
    
    //使用文件类前必须先打开文件
    infile.open("in.txt");//以相对路径形式打开文件,就是存放CPP文件的当前目录
    outfile.open("out.txt");//也可以用绝对路径打开文件
    
	//从输入文件读取内容到内存的ivec中
    vector<string> ivec;
    string rdata;
	//ifstream的用法和cin其实没太大区别
	//ifstream将文件(磁盘)内容写出到内存中
	//cout    将键盘输入的内容写到内存中
    while (infile >> rdata)
        ivec.push_back(rdata);
    
	//将内容倒着显示出来
    while (!ivec.empty())
    {
        outfile << ivec.back() << " ";
        ivec.pop_back();
    }
    outfile << endl;
	//文件类使用完了之后一定要关闭
    infile.close();
    outfile.close();
    
    return 0;
}



二、数列的求值公式是a1=1, a2=1, an=an-1+2*an-2(n>=3),借此产生1,1,3,5,11,21等元素值。试定义一个函数,利用上述公式,输入n值,计算a1, a2,…, an的值,并将这些值存入一个vector之中,元素数目n由用户指定,请检查元素数目的有效性,太大则可能引发overflow问题,接下来撰写第二个函数,能够将所接获的vector的所有元素一一印出,最后再写一个main(),测试上述两个函数。

#include <iostream>
#include <vector>

using namespace std;

//有效性检查
inline bool is_size_ok(int length)
{
     if (length <= 0 || length > 32)
     {
         cerr << "Length " << length << " is not supported" << endl;
         return false;
     }
     return true;
}

//传引用一般用在大数据类中,一般的内置型变量不需要穿引用
//string\vector\list\deque\自定义的类等
//内置型变量有int double float 等
bool count(vector<int> &ivec, int size)
{
     if (!is_size_ok(size))
         return false;
     vector<int> tvec;
     if (size >= 1) 
         tvec.push_back(1);
     if (size >= 2)
         tvec.push_back(1);
     for (int ix = 2; ix < size; ix ++)
         tvec.push_back(tvec[ix - 2] * 2 + tvec[ix - 1]);
     ivec = tvec;
     return true;
}

void display(const vector<int> &ivec)
{
	for (int ix = 0; ix != ivec.size(); ix ++)
		cout << ivec[ix] << " ";
	cout << endl;
}

int main()
{
    cout << "Please input an num:" << endl;
    int n;   
    cin >> n;
    
    vector<int> ivec;
    if (!count(ivec, n))
        return -1;        
    display(ivec);
    
    return 0;
}

三、数列的求值公式是a1=1,an=an-1+2*n(n>=2),写一个函数,以局部静态(local static)的vector存储数列元素。此函数返回一个const指针,指向该vector。如果vector的容量小于指定的元素数目,就扩充vector的容量。接下来再实现第二个函数,接受一个n值并返回该位置上的元素。最后,撰写main()测试这些函数。

#include <iostream>
#include <vector>

#define MAXN 103621

using namespace std;
//有效性检查,容量是定死的,无法扩充
//此处只是练习就不强求大家
inline bool is_size_ok(int length)
{
     if (length <= 0 || length > MAXN)
     {
         cerr << "Length " << length << " is not supported" << endl;
         return false;
     }
     return true;
}
//此处并不是预先存储好
const vector<int> *iseq(int ilength)
{
	//此处static变量在本函数调用结束后,elems变量仍然存在,
	//如果再次调用的时候就不用
	static vector<int> elems;
	for (int ix = elems.size(); ix < ilength; ix ++)
	{
		if (ix == 0)
			elems.push_back(1);
		else
			elems.push_back(elems[ix - 1] + 2 * (ix + 1));
	}
	return &elems;
}

int seq_elem(int ipos)
{
	if (!is_size_ok(ipos))
		return -1;
	const vector<int> *seq = iseq(ipos);
	if (!seq)
		return 0;
	return (*seq)[ipos - 1];
}

int main()
{
    cout << "Please input an num:" << endl;
    int ipos;
    cin >> ipos;
    
    int elem = seq_elem(ipos);
    if (elem <= 0)
        cout << "Error" << endl;
    else
        cout << elem << endl;
        
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二次作业: 1. 编写点类(Point类),属性成员有x,y,都是double数据类型。需要为Point类编写构造函数。 编写直线类(Line类),需要提供两点确定一条直线的函数功能。 如果两点重合,可以返回异常或者返回null引用来解决这个问题。 直线类的数据成员和函数成员请自行设计。 2. 给定文本文件,文件名称为a.txt,文件内容为一个8行8列的字符矩阵,内容为1和0字符, 请编程计算出该矩阵中水平方向或者垂直方向或者斜线方 向连续1最多的个数。 例如: 11001101 10110101 01010101 11001000 01010101 11001101 00011000 11110000 3. 编写程序求出1万以内的所有素数,并将这些素数输出到一个文本文件中,每行文本只包含一个素数数据。 该文本文件内容要求可以用记事本程序来查看。 4. 编写程序求出1万以内的所有素数,然后再判断这些素数中哪些是由素数拼接而成的。 例如素数23就符合条件,23本身是素数,其由素数2,和素数3拼接(连接)组成。 素数29就不满足条件,2是素数,而9不是素数。素数307不满足条件,不能忽略0. 7907这个素数符合条件,7是素数,907是素数。 需要把符合条件的拼接素数全部输出,并统计个数。 5. 要求从控制台输入英语单词及单词解释两项数据, 把录入的数据追加到文件中。要求提供单词查询功能。 用户输入单词后,从单词库文件中查找,如果存在则输出 该单词的解释。注意,单词不能有重复,如果重复则覆盖替换 以前的解释数据。 6. 通过命令行参数输入一个文件夹的路径名称,然后编写程序找出该文件夹下文件名称重复并且文件大小也一样的文件, 如果没有“重复文件”,则输出“没有重复文件”的提示,如果有,需要输出文件名称,和文件所在的文件夹路径(绝对路径)。 提示,需要遍历该文件夹下所有子文件夹,设计一个文件类,属性包括文件名称,文件路径,文件大小,然后进行“重复” 判断,如果文件重复,则需要记录并输出,有可能有文件名重复,但是文件大小不一样,重复的文件可能不止2个,可能 在不同的子文件夹下有多个文件重复。 7. 霍夫曼编码实现压缩文本文件,见文件huffman.rar. 对文件数据读写等功能已经实现,程序在Q2Resources.zip中。 Q2Resources.zip中的文件禁止修改。请将TextZip.java文件所有未实现的函数按照要求给以实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值