目录
例题描述
例题来自鹤壁海昌智能面试题。
有一个.cav文件,文件内容如下图:
该文件内容共有1024行*2列的int型数据。
现有如下需求:
1.寻找name.csv里第二列小于等于40000的最大数
输出格式:endy <Third1 endx="0" endy="40000" />
2.寻找最接近39500的数的对应的行第一个数end50y
输出格式:<Third1 end50x="50" end50y="32143" />
3.寻找最接近39500的数Defaulty
输出格式:<Third1 Defaultx="150" Defaulty="39499" />
4.寻找最接近寻找最接近39000的数
输出格式:<Third1 end100x="100" endy="39001" />
5.生成cc.xml并写入。
需求实现
1.主要思路和设计过程
(1)结构体设计
定义一个结构体 Row
表示CSV文件的一行数据,包含两个整数。这样有助于更好地组织和处理数据。
struct Row {int col1;int col2;};
(2)CSV文件读取
使用 readCSV
函数读取CSV文件,将每一行的两个整数保存到结构体 Row
中,并将所有行数据保存在一个 vector
中。
vector<Row> readCSV(const string& filename) {// 读取CSV文件并返回包含行数据的向量// ...}
(3)寻找第二列小于等于40000的最大值
使用 findMaxBelowThreshold
函数遍历所有行数据,找到第二列小于等于40000的最大值。
Row findMaxBelowThreshold(const vector<Row>& rows, int threshold) {// 寻找第二列小于等于给定阈值的最大值// ...}
(4)寻找最接近39500的数
使用 findClosestToValue
函数遍历所有行数据,找到最接近39500的数。
Row findClosestToValue(const vector<Row>& rows, int value) {// 寻找最接近给定值的行// ...}
(5)生成xml标签
使用 writeXML
函数根据找到的结果生成XML标签。
void writeXML(const string& filename, const Row& result) {// 写XML文件,表示结果行数据// ...}
2.程序实现
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
/*
1.寻找name.csv里第二列小于等于40000的最大数
endy <Third1 endx="0" endy="40000" />
2.寻找最接近39500的数的对应的行第一个数end50y
<Third1 end50x="50" end50y="32143" />
3.寻找最接近39500的数Defaulty
<Third1 Defaultx="150" Defaulty="39499" />
4.寻找最接近寻找最接近39000的数
<Third1 end100x="100" endy="39001" />
5.生成cc.xml并写入。*/
struct Data {
int col1;
int col2;
};
vector<Data> readCSV(string filename) {
vector<Data> data;
ifstream file(filename);
if (file.is_open()) {
string line;
while (getline(file, line)) {
Data d;
sscanf_s(line.c_str(), "%d,%d", &d.col1, &d.col2);
data.push_back(d);
}
file.close();
}
else
cerr << "无法打开文件: " << filename << endl;
return data;
}
int findMax(vector<Data> data) {
int max = -1;
for (int i = 0; i < data.size(); i++) {
if (data[i].col2 <= 40000 && data[i].col2 > max) {
max = data[i].col2;
}
}
return max;
}
int findClosest50(vector<Data> data) {
int closest = -1;
int minDiff = INT_MAX;
for (int i = 0; i < data.size(); i++) {
int diff = abs(data[i].col2 - 39500);
if (diff < minDiff) {
closest = data[i].col1;
minDiff = diff;
}
}
return closest;
}
int findClosestDefault(vector<Data> data) {
int closest = -1;
int minDiff = INT_MAX;
for (int i = 0; i < data.size(); i++) {
int diff = abs(data[i].col2 - 39500);
if (diff < minDiff) {
closest = data[i].col2;
minDiff = diff;
}
}
return closest;
}
int findClosest100(vector<Data> data) {
int closest = -1;
int minDiff = INT_MAX;
for (int i = 0; i < data.size(); i++) {
int diff = abs(data[i].col2 - 39000);
if (diff < minDiff) {
closest = data[i].col2;
minDiff = diff;
}
}
return closest;
}
void writeXML(int max, int closest50, int closestDefault, int closest100) {
ofstream file("cc.xml");
if (file.is_open()) {
file << "<Results>" << endl;
file << " <Result1 endx=\"0\" endy=\"" << max << "\" />" << endl;
file << " <Result2 end50x=\"50\" end50y=\"" << closest50 << "\" />" << endl;
file << " <Result3 Defaultx=\"150\" Defaulty=\"" << closestDefault << "\" />" << endl;
file << " <Result4 end100x=\"100\" endy=\"" << closest100 << "\" />" << endl;
file << "</Results>" << endl;
file.close();
cout<<"写入成功"<<endl;
}
}
int main() {
vector<Data> data = readCSV("填入你的.cav文件的路径");
if (data.empty()) {
cerr << "CSV文件读取失败." << endl;
return 1;
}
int max = findMax(data);
int closest50 = findClosest50(data);
int closestDefault = findClosestDefault(data);
int closest100 = findClosest100(data);
writeXML(max, closest50, closestDefault, closest100);
return 0;
}