WordCount-第三次作业

 

一、开头

码云链接:https://gitee.com/coNgY1/projects

(1)合作者:201631062122,201631062321

二、正文

(1)、制定编码规范

  • 变量命名必须有意义,做到见名知用途
  • 所有的类型/类/函数名都用Pascal形式,所有的变量都用Camel形式
  • 注释应简洁清晰地描述代码用途
  • 一个变量仅用一行语句声明
  • {和}单独占一行

(2)、代码自审并修正
经过代码自审发现了以下问题

最开始没有判断-s参数,导致输入数据时候没有输出所有的文件

最开始没有判断参数的个数,导致错误

 

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
#include<algorithm>
#include<vector>
#include<io.h>
using namespace std;

class CFileRecord
{
private:
	int m_Wordnum;
	int m_Charnum;
	int m_Linenum;
	int m_Codeline;
	int m_Spaceline;
	int m_Noteline;
	string m_record;
	const string OUT_FILE = "result.txt";
	ifstream input;
	ofstream out;

private:
	bool IsStopword(string szWord);

public:
	string m_szFile;
	vector<string> m_mode;
	vector<string> m_Stopword;

public:
	CFileRecord();
	~CFileRecord()
	{
		if (input.is_open())
			input.close();
		if (out.is_open())
		{
			out << m_record;
			out.close();
		}
	};
	inline int GetCharnum() { return m_Charnum; }
	inline int GetLinenum() { return m_Linenum; }
	inline int GetWordnum() { return m_Wordnum; }
	void GetStopword(string szStopFile);
	inline string GetHang() { 
		char szFormat[0x20] = {0};
		sprintf(szFormat, "%d//%d//%d",m_Codeline,m_Spaceline,m_Noteline);
		return szFormat;
	}
	void OutRecord(string szFile)
	{
		ofstream out(szFile, ostream::ate);
		if (out.is_open())
		{
			for (auto iter = m_mode.begin(); iter != m_mode.end(); iter++)
			{
				if (*iter == "-c")
					out << "字符数 : " + to_string(m_Charnum) + "\r\n";
				else if (*iter == "-l")
					out << "行数 : " + to_string(m_Linenum) + "\r\n";
				else if (*iter == "-w")
					out << "单词数 : " + to_string(m_Wordnum) + "\r\n";
				else if(*iter == "-a")
					out << m_szFile << ",代码行/空行/注释行" << GetHang() << endl;
			}
			out.close();
		}
	}
	void OpenFile(string szFile);
	void UpdateData();
	void PrintData();
};

vector<string> GetAllfile();

int main(int argc, char **argv)
{
	string szInfile;
	string mode;

	if (argc % 2 == 0)
	{
		//cout << "wrong param!" << endl;;
		return 1;
	}

	{
		szInfile = argv[2];
		CFileRecord CRecord;

		for (int i = 1; i < argc; i ++)
		{
			mode = argv[i];
			if (mode.find(".") != -1)
				CRecord.m_szFile = mode;
			else
			{
				CRecord.m_mode.push_back(mode);
				if (mode == "-e")
					CRecord.GetStopword(argv[++i]);

			}
		}	
		CRecord.PrintData();
	}

	getchar();

	return 0;
}

bool CFileRecord::IsStopword(string szWord)
{
	for (auto word : m_Stopword)
	{
		if (word == szWord)
			return true;
	}
	return false;
}

CFileRecord::CFileRecord() :m_Wordnum(0), m_Charnum(0), m_Linenum(0), out(OUT_FILE)
{
}

void CFileRecord::GetStopword(string szStopFile)
{
	ifstream iFile(szStopFile);
	string word,szLine;
	while (getline(iFile, szLine))
	{
		istringstream iss(szLine);
		while (iss >> word)
		{
			m_Stopword.push_back(word);
		}
	}
}

void CFileRecord::OpenFile(string szFile)
{
	if(input.is_open())
		input.close();
	input.open(szFile);
	m_szFile = szFile;
}

void CFileRecord::UpdateData()
{
	m_Linenum = 0;
	m_Wordnum = 0;
	m_Charnum = 0;
	m_Codeline = 0;
	m_Spaceline = 0;
	m_Noteline = 0;
	if (input.is_open())
	{
		string szLine;
		while (getline(input, szLine))
		{
			m_Linenum++;
			m_Charnum += szLine.size();
			istringstream record(szLine);
			if (szLine.find_first_of("") == 0 || szLine.find_first_of("}//") == 0)
				m_Noteline++;
			else if (szLine.empty())
				m_Spaceline++;
			else
				m_Codeline++;

			string word;
			if (find(m_mode.begin(), m_mode.end(), "-e") != m_mode.end())
			{
				while (record >> word)
				{
					if (IsStopword(word))
						continue;
					m_Wordnum += count(begin(word), end(word), ',') + 1;
				}
			}
			else
			{
				while (record >> word)
				{
					m_Wordnum += count(begin(word), end(word), ',') + 1;
				}
			}
		}
	}

	m_record += m_szFile + ",字符数 : " + to_string(m_Charnum) + "\r\n"
		+ m_szFile + ",单词数 : " + to_string(m_Wordnum) + "\r\n"
		+ m_szFile + ",行数 : " + to_string(m_Linenum) + "\r\n"
		+ m_szFile + ",代码行/空行/注释行" + GetHang() + "\r\n"
		;
}

void CFileRecord::PrintData()
{
	if (find(m_mode.begin(), m_mode.end(), "-s") != m_mode.end())
	{
		vector<string> vecFile = GetAllfile();
		for (auto iter = vecFile.begin(); iter != vecFile.end(); iter++)
		{
			OpenFile(*iter);
			UpdateData();
			if (find(m_mode.begin(), m_mode.end(), "-c") != m_mode.end())
				cout << m_szFile << ",字符数: " << GetCharnum() << endl;
			if (find(m_mode.begin(), m_mode.end(), "-l") != m_mode.end())
				cout << m_szFile << ",行数: " << GetLinenum() << endl;
			if (find(m_mode.begin(), m_mode.end(), "-w") != m_mode.end())
				cout << m_szFile << ",单词数: " << GetWordnum() << endl;
			if (find(m_mode.begin(), m_mode.end(), "-a") != m_mode.end())
				cout << m_szFile << ",代码行/空行/注释行" << GetHang() << endl;
			if (find(m_mode.begin(), m_mode.end(), "-o") != m_mode.end())
				OutRecord(m_szFile);
		}
	}
	else
	{
		OpenFile(m_szFile);
		UpdateData();
		if (find(m_mode.begin(), m_mode.end(), "-c") != m_mode.end())
			cout << m_szFile << ",字符数: " << GetCharnum() << endl;
		if (find(m_mode.begin(), m_mode.end(), "-l") != m_mode.end())
			cout << m_szFile << ",行数: " << GetLinenum() << endl;
		if (find(m_mode.begin(), m_mode.end(), "-w") != m_mode.end())
			cout << m_szFile << ",单词数: " << GetWordnum() << endl;
		if (find(m_mode.begin(), m_mode.end(), "-a") != m_mode.end())
			cout << m_szFile << ",代码行/空行/注释行" << GetHang() << endl;
		if (find(m_mode.begin(), m_mode.end(), "-o") != m_mode.end())
			OutRecord(m_szFile);
	}
}

vector<string> GetAllfile()
{
	vector<string> vecstr;
	_finddata_t sFind;
	long result = 0;
	result = _findfirst("*.txt", &sFind);
	if (result == -1)
		return vecstr;
	do
	{
		vecstr.push_back(sFind.name);
	} while (_findnext(result, &sFind) != -1);
	return vecstr;
}

  (4)、静态代码审查 本次审查使用工具VS的扩展工具StyleCop,未检查出问题

  (5)、性能测试和优化 本项目采用的性能测试工具:JProfilerJProfiler直觉式的GUI可以找到性能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。 它让程序员对heap walker作资源回收器的root analysis,可以轻易找出内存漏失。通过性能测试,我们找出了一些内存消耗的代码并对其进行了优化,提升了代码执行性能。

转载于:https://www.cnblogs.com/coNgY1/p/9826926.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值