CSDN编程竞赛,让更多的人学会编程
CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16
前言/背景
现在社会日益竞争的环境下,能够安心静静的学习编程真的是一件非常快乐的事情了,而CSDN官方推出的编程竞赛能够让我们不怎么接触竞赛的程序员也能融入其中,我觉得这是一件非常值得骄傲的事情,希望大家都能快乐的、能够发挥自己特长的融入进来,让我们的编程大环境越来越纯洁明亮。
大赛简介
本次参赛的具体时间是:9月8日-9月21日投稿比拼,9月23日前公布结果,9月30日前发放礼品。主办方是CSDN,可以说是非常官方了,含金量可以说是非常之高,希望大家多多参与。
参赛流程
接下来我介绍一下具体参赛流程,这个活动是官方主办。
参赛经历
首先拿到参赛题目后,顿时我都慌了,这个题目是我之前没有接触过的领域,但是既然下定决心要参赛了,也不能就此罢休啊,所以我认真分析了大赛的题目,分阶段逐步完成,遇到问题及时查阅资料,相关的论文我都下载下来,跟小伙伴及时研讨,终于功夫不负有心人,还是成功的完成了比赛,最终也获得了名次。
解题思路
我的解体思路大致分为以下阶段:
1、分别读取CSV文件和XML文件;
2、然后对CSV文件和XML文件进行处理;
3、将CSV文件和XML文件交替读取在内存中做对比;
4、不出问题的话将不输出任何信息;
5、如果出现问题将输出具体信息。
CompareCsvXml.h
#pragma once
#include <string>
using namespace std;
namespace extract{
string slice(string str, int start, int end)
{
string str1 = "";
for (int i = 0; i < str.size(); ++i)
{
if (i >= start && i <= end)
{
str1 += str[i];
}
}
return str1;
}
}
CompareCsvXml.cpp
#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <string>
#include <windows.h>
#include <vector>
#include "CompareCsvXml.h"
using namespace std;
using namespace extract;
int main()
{
//1、读取CSV文件
ifstream inCsv("RelayBoardMap.csv", ios::in);//只读的方式打开一个已存在的文件
if (!inCsv)
{
cout << "打开文件失败!" << endl;
exit(1);
}
//1.1 处理CSV文件
string lineCSV;//定义行
int i = 0;//记录行数
int n = 0;//记录错误行数
//2、读取XML文件
ifstream inXml("RelayBoardMap.xml", ios::in);//只读的方式打开一个已存在的文件
if (!inXml)
{
cout << "打开文件失败!" << endl;
exit(1);
}
//2.2 处理XML文件
string line;//定义行
string filed;
//int i = 0;//记录行数
//写入标题行
string strRelayBoardType;
string strVersion;
//string strVersion;
string strRelay;
string strDelay;
string strAddr;
string strBit;
string Version;
string RelayBoardType;
string Relay;
string Delay;
string Addr;
string Bit;
string str = "";
string Begin = "Rev,BoardType,Relay,Addr,Bit,Delay";
bool flag = true;
while (getline(inCsv, lineCSV))//表示按行读取CSV文件中的数据
{
string field;
istringstream sin(lineCSV);//将整行字符串line读入到字符串流给sin
getline(sin, field);//将sin中的字符读入到field字符串中,以逗号为分隔符
if (flag)//直接跳过第一行
{
flag = false;
continue;
}
while (getline(inXml, line))
{
//以下是XML文件的处理
string strStr;
string fieldXML;
vector<char> vec;
istringstream sin(line);//将整行字符串line读入到字符串流给sin
getline(sin, fieldXML);//将sin中的字符读入到field字符串中,
if (string::npos != strLine.find("<Relay Value="))
str += strLine;
else if (string::npos != strLine.find("<Delay"))
str += strLine;
else if (string::npos != strLine.find("<RelayAddr Addr"))
str += strLine;
if (str.size() > 70)
{
//重新按行做一个整理.将下面的代码实现写到这里。
if (string::npos != str.find("Relay Value"))//这行如果成立代表已经找到
{
int pos_1 = str.find("Value=");
int pos_2 = str.find(">");
Relay = slice(str, pos_1 + 7, pos_2 - 2);//查找引号中的内容
}
//实现
if (strRelay != Relay || Bit != strBit) //只要前后两个继电器或者比特位不相同就可以输出
{
//1
if (strVersion != Version)
{
strVersion = Version;
strStr += strVersion;
strStr += ",";
//cout << strVersion;
}
else
strStr += ",";;
// 2
if (strRelayBoardType != RelayBoardType)
{
strRelayBoardType = RelayBoardType;
strStr += strRelayBoardType;
strStr += ",";
//cout << strRelayBoardType;
strRelay = Relay;
strStr += strRelay;
strStr += ",";
strAddr = Addr;
strStr += strAddr;
strStr += ",";
strBit = Bit;
strStr += strBit;
strStr += ",";
strDelay = Delay;
strStr += strDelay;
// cout << "读取CSV:" << field.c_str() << endl; //c_str()返回的是field的首地址
// cout << "读取XML:" << strStr << endl;//位置不能变
//++i;
++i;
int num=strStr.compare(field.c_str());
if (num != 0)
{
cout << "读取XML:" << strStr << endl;
cout << "读取CSV:" << field.c_str() << endl;
cout << "第" << i+1 << "行不相同" << endl;
n++;
}
break;
}
}
if (string::npos != strLine.find("</Relay>"))
str = "";
}
}
cout << "**********************************************" << endl;
cout << "以下行数是以CSV文件为参考" << endl;
cout << "一共遍历了" << i+1 << "行" << endl;
cout << "其中有" << n << "行出现了问题" << endl;
system("pause");
return 0;
}
经验心得
大家在参赛时心态要平和,多一些不为什么的坚持,少一些功利主义的追求,这样的话才能戒骄戒躁,不卑不亢,取得良好的成绩。
资料分享
在整个过程中,C++语言的基础只是非常重要,推荐看黑马程序员推出的《C++语言编程》通俗易懂,我感觉比Primer写的要好,然后就是把相关的数据结构和算法也要弄通,比如常见的数组、链表、堆栈、贪心、二叉树、动态等。