大家好,又见面了,我是全栈君。
今天看到一个笔试题,是这种:给定一个文件(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的文件)
代码语言:javascript复制#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;
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116208.html原文链接:https://javaforall.cn