• 统计电影票房排名前10的电影并存入还有一个文件


    今天看到一个笔试题,是这种:给定一个文件(m.dat)。里面保存了各个电影票房统计。格式例如以下:

    《2012》                                索尼                $769.7
    《哈利波特与死亡圣器(上)》              华纳兄弟            $952.0
    《星球大战》                            二十世纪福克斯      $775.4
    《怪物史莱克4》                         派拉蒙/梦工厂       $750.0
    《阿凡达》                              二十世纪福克斯      $2,782.2
    《哈利波特与火焰杯》                    华纳兄弟            $895.9
    《哈利波特与混血王子》                  华纳兄弟            $934.0
    《指环王2:双塔奇兵》                   新线                $925.3
    《蝙蝠侠前传2:黑暗骑士》               华纳兄弟            $1,001.9
    《哈利波特与魔法石》                    华纳兄弟            $974.7
    《海底总动员》                          迪士尼              $867.9
    《功夫熊猫》                            派拉蒙/梦工厂       $631.7
    《加勒比海盗3:世界的尽头》             迪士尼              $961.0
    《哈利波特与阿兹卡班的囚徒》            华纳兄弟            $795.6
    《E.T.》                                环球                $792.9
    《夺宝奇兵4:水晶骷髅王国》             派拉蒙              $786.6
    《指环王3:王者归来》                   新线                $1,119.1
    《怪物史莱克2》                         梦工厂              $919.8
    《玩具总动员3》                         迪士尼              $1,063.2
    《黑客帝国2:重装上阵》                 华纳兄弟            $742.1

    。。。。。

    。。


    要求敲代码统计票房排名前10的电影。并把统计结果存入还有一个文件。自己试着用C++实现一下,代码分享例如以下:(linux下gcc 编译)

    gcc编译,运行时要传入两个命令行參数,比方:./a.out   m.dat   li.dat (m.dat为源票房文件。li.dat 为存放前10的文件)

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    class Movie {
    public:
    	//重载输入操作
    	friend istream& operator>> (istream& is,
    		Movie& movie) {
    		return is >> movie.m_title >> movie.m_comp
    			>> movie.m_gross;
    	}
    	//重载输出操作
    	friend ostream& operator<< (ostream& os,
    		const Movie& movie) {
    		return os << movie.m_title << ' '
    			<< movie.m_comp << ' ' << movie.m_gross;
    	}
    	//重载小于号,用于List排序
    	bool operator< (const Movie& movie) const {
    		return gross () > movie.gross ();
    	}
    private:
    	//把从文件读取的string转换为double返回
    	double gross (void) const {
    		string str (m_gross);
    		size_t pos = 0;
    		while ((pos = str.find_first_of ("$,", pos)) !=  //去除票房前面的"$"和","
    			string::npos)
    			str.erase (pos, 1);
    		return atof (str.c_str ());
    	}
    	string m_title;  //电影名
    	string m_comp;	 //出品公司名
    	string m_gross;  //票房
    };
    //读文件,读取结果存入Vector<Movie>& vm
    bool read (const char* file, vector<Movie>& vm) {
    	ifstream ifs (file);
    	if (! ifs) {
    		perror ("打开票房文件失败");
    		return false;
    	}
    	Movie movie;
    	while (ifs >> movie)  //调用重载的>>操作符
    		vm.push_back (movie);
    	ifs.close ();
    	return true;
    }
    //写文件,把vector<Movie>& vm中数据写入文件
    bool write (const char* file, const vector<Movie>& vm){
    	ofstream ofs (file);
    	if (! ofs) {
    		perror ("打开排行文件失败");
    		return false;
    	}
    	for (vector<Movie>::const_iterator it = vm.begin();
    		it != vm.end (); ++it)
    		ofs << *it << endl;  //调用重载的<<操作符
    	ofs.close ();
    	return true;
    }
    int main (int argc, char* argv[]) {
    	//推断命令行參数个数是否合法
    	if (argc < 3) {
    		cerr << "使用方法:" << argv[0]
    			<< " <票房文件> <排行文件>" << endl;
    		return -1;
    	}
    	vector<Movie> vm;
    	if (! read (argv[1], vm))
    		return -1;
    	sort (vm.begin (), vm.end ());  //对vm中元素排序
    	if (vm.size () > 10)
    		vm.resize (10);  //取排序前10个
    	if (! write (argv[2], vm))
    		return -1;
    	return 0;
    }




  • 相关阅读:
    update结合查询更新
    查表字段名,注释
    微信access_token
    Oracle中的dual伪表
    Oracle中的null
    UIView九宫格
    UIWebView使用
    sql触发器Tigger
    重写init方法
    OC内存管理示例
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5153619.html
Copyright © 2020-2023  润新知