当前位置: 首页 > news >正文

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写的要好,然后就是把相关的数据结构和算法也要弄通,比如常见的数组、链表、堆栈、贪心、二叉树、动态等。

相关文章:

  • 测试团队技术转型实践方法
  • 类和对象·引入
  • Java 数据结构 ---》 泛型
  • 模型部署——融合BN和Conv层
  • 美化你的Xfce桌面
  • 【.Net实用方法总结】 整理并总结System.IO中BufferedStream类及其方法介绍
  • Android移动应用开发之TextView实现阴影跑马灯文字效果
  • MySQL是怎样运行的:从根儿上理解MySQL | 查询优化器(二):基于规则的优化
  • 数据分享|WEKA用决策树、随机森林、支持向量机SVM、朴素贝叶斯、逻辑回归信贷违约预测报告
  • JavaSE学习----(八)常用类之Stirng类
  • 跨境电商自养号测评补单+广告结合打法,打造爆款产品
  • 01_中间件
  • 记录QUME上模拟ARM运行环境(内核 2.6.30)
  • JavaWeb开发之——MySQL数据模型(04)
  • c语言分层理解(c语言字符串+内存库函数)
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【剑指offer】让抽象问题具体化
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ES学习笔记(12)--Symbol
  • iOS | NSProxy
  • iOS小技巧之UIImagePickerController实现头像选择
  • java第三方包学习之lombok
  • java中的hashCode
  • jQuery(一)
  • leetcode讲解--894. All Possible Full Binary Trees
  • mysql 数据库四种事务隔离级别
  • nodejs实现webservice问题总结
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • php中curl和soap方式请求服务超时问题
  • SpiderData 2019年2月13日 DApp数据排行榜
  • SQL 难点解决:记录的引用
  • STAR法则
  • 成为一名优秀的Developer的书单
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从tcpdump抓包看TCP/IP协议
  • 从零开始的无人驾驶 1
  • 服务器从安装到部署全过程(二)
  • 给github项目添加CI badge
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 开发基于以太坊智能合约的DApp
  • 利用jquery编写加法运算验证码
  • 前端面试之CSS3新特性
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用docker-compose进行多节点部署
  • AI算硅基生命吗,为什么?
  • PostgreSQL之连接数修改
  • 交换综合实验一
  • # C++之functional库用法整理
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (LeetCode 49)Anagrams
  • (转)shell中括号的特殊用法 linux if多条件判断
  • ***原理与防范
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .bat批处理(四):路径相关%cd%和%~dp0的区别