C++:设计一个保留字(或关键字)的统计程序,从源数据文件(C或C++语言程序)中,读取字符或字符串,与保留字文件中的保留字进行匹配比较,并统计计数。

news2024/11/19 20:41:40

2.1题目:

设计一个保留字(或关键字)的统计程序

  1. l建立保留字文件;
  1. l从源数据文件(C或C++语言程序)中,读取字符或字符串,与保留字文件中的保留字进行匹配比较,并统计计数。
  1. l输出两张表文件:保留字及其计数,非保留字及其计数。
  1. l输出源文件的扫描次数和扫描所用时间。

2.2需求分析:

在大数据时代的背景下,通过对用户日常浏览,搜索内容的关键字进行提取并且进行统计,并把出现次数较频繁的非关键字提取成关键字,通过这种方法可以计算出用户的偏好。很多购物平台以及短视频平台都有此机制。通过对关键字的提取和统计,不仅方便用户,还能够给这些平台带来更多的收益。

此外,如果对源代码中的程序设计语言的关键字进行统计,也可以得出一些结论,如:代码量的多少,该源代码作者的写作风格等等。

2.3设计思想和方案设计:

  1. 首先要明确什么是关键字:就C++来说,关键字是指是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字。就是像数据类型(int,double,char等),定义操作(class,struct等)等。
  2. 根据题意要求,从源代码里获取关键字,那么前提就是代码的语句应该基本是合法的,如果出现关键字,那么关键字一定是标准的,另外像以下这些形式都不能算关键字:intt,classes,charcharchar。也就是说,关键字一旦添加其他的任何符号,它就从关键字变成了变量名,不具有关键字功能。
  3. 总结起来,就是从源代码中提取字符串和关键字进行比对,相同则数量加一。而执行时可以采用每次读一行,从没行中提取多个字符串的方法。具体判定条件就是以特定字符(不是字母和数字而且不是下划线的字符)为分割。

2.4核心代码(全部代码):

#include<iostream>
#include<string>
#include<fstream>
#define Maxsize 5000
using namespace std;
string ss[Maxsize]; int ss_[Maxsize] = {0};		/*关键字、次数*/
string uss[Maxsize]; int uss_[Maxsize] = {0};	/*非关键字、次数*/
int length = 0, ulength = 0;	/*个数*/
int legal(char c);
int main() {
	ifstream ifs;
	ifs.open("key_words.dat", ios::in);
	if (!ifs.is_open())
	{
		cout << "Erro Read" << endl;
	}
	string buf;			//文件读取
	while (getline(ifs, buf))
	{
		bool p = true;
		for (int i = 0; i < length; i++) {
			if (ss[i] == buf) {		/*判重*/
				p = false;
				break;
			}
		}
		if (p) {
			ss[length] = buf;
			length++;
		}
	}
	ifs.close();
	cout << "共有" << length << "个关键字" << endl;
	ifs.open("test.cpp", ios::in);
	while (getline(ifs, buf))
	{
		for (int i = 0; i < buf.length(); i++) {
			string s;	
			bool t = true;	/*是否为关键字*/
			while (legal(buf[i])) {
				s.push_back(buf[i]);		/*符合要求字符组合成字符串*/
				i++;
			}
			if (s == " " || s.length() == 0)continue;
			for (int i = 0; i < length; i++) {		
				if (ss[i] == s) {
					ss_[i]++;
					t = false;
					break;
				}
			}
			if (t) {
				bool p = true;
				for (int i = 0; i < ulength; i++) {		/*先找有没有出现过*/
					if (uss[i] == s) {
						p = false;
						uss_[i]++;
						break;
					}
				}
				if (p) {	/*没出现过新建非关键字*/
					uss[ulength] = s;
					uss_[ulength] = 1;
					ulength++;
				}
			}
		}
	}
	ofstream ofs;
	ofs.open("no_keywords.dat", ios::trunc);		/*轮流写入*/
	ofs << "非关键字:" << endl;
	for (int i = 0; i < ulength; i++) {
		ofs << uss[i] << " " << uss_[i] << "次" << endl;
	}
	ofs.close();
	ofs.open("keywords.dat", ios::trunc);
	ofs << "关键字:" << endl;
	for (int i = 0; i < length; i++) {
		ofs << ss[i] << " " << ss_[i] << "次" << endl;
	}
	ofs.close();
}


int legal(char c) {		/*判断是否为允许的字符*/
	if (c >= 'a' && c <= 'z') {
		return 1;
	}
	else if (c >= 'A' && c <= 'Z') {
		return 1;
	}
	else if (c == '_' )return 1;
	else return 0;
}

2.5测试用例:

此程序涉及文件操作:

key_words.dat:

包含部分c++关键字

test.cpp:

和此代码完全一致,只是复制版本文件名不同。

运行后得:

Keywords.dat:

no_keywords.dat:

2.6总结:

  1. 在此次试验中,我对C++的文件操作和字符串处理能力有了很大的提升,更能够分辨不同文件操作方式的真正用途,能在适当的时机和位置采用正确的文件操作方式。
  2. 体会到了关键字提取的重要性,认识到了关键字统计具体实施上的一些问题,并且学会了如何解决这些问题。
  3. 相对于现在热度很高的大数据关键字提取,本程序还存在一定的不足,主要在于关键字也有可能以子串的方式存在于字符串中,而对于源代码的检索方面则没有这种需求,但是如果需要的话可以在程序中添加相关字符串操作,如:KMP算法,字符串分割,字符串提取等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python数据分析(1)numpy基础

iamseancheney/python_for_data_analysis_2nd_chinese_version: 《利用Python进行数据分析第2版》 (github.com) NumPy的ndarray&#xff1a;一种多维数组对象 1.性质 NumPy最重要的一个特点就是其N维数组对象&#xff08;即ndarray&#xff09;&#xff0c;该对象是一个快速…

73.qt quick-通用可拖拽表盘示例

截图如下所示: 效果如下所示: 源码已上传至专栏群(第一章底部获取)中,感兴趣的自行下载 demo使用介绍 控件自定义属性已经封装出来了,如下图所示: main.qml如下所示: import QtQuick 2.14 import QtQuick.Window 2.14 import QtQuick.Extras 1.4 import QtQuick.Layouts 1.1…

微信小程序-会议OA项目03

目录 1.Flex布局简介 1.1 什么是flex布局 1.2 flex属性 2.轮播图--组件的使用 3.会议OA项目-首页 1.Flex布局简介 布局的传统解决方案&#xff0c;基于盒状模型&#xff0c;依赖 display属性 position属性 float属性 1.1 什么是flex布局 1) Flex是Flexible Box的缩写&…

攻防世界-fileclude

题目 访问题目场景 阅读php代码 <?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET["file1"]) && isset($_GET["file2"])) {$file1 $_GET["file1"];$file2 $_GET["file2"];if(!empty($f…

法国半导体制造企业RIBER部署MBE技术以支持量子计算

图片来源&#xff1a;网络 法国半导体制造企业RIBER在2022年进一步提升了其在量子处理器耗材市场的发展水平。 早在2021年6月&#xff0c;RIBER已开始部署系统&#xff0c;它在法国图卢兹与 法国国家科学研究中心系统分析与架构实验室&#xff08;LAAS-CNRS&#xff09;创办联合…

Google Guice 1:如何实现依赖注入?

1. 待完善的邮箱程序 1.1 手动注入依赖 前一篇博文《谈谈自己对依赖注入的理解》&#xff0c;笔者只是基于依赖注入的思想&#xff0c;为EmailClient预留了依赖注入的入口 到目前为止&#xff0c;我们只是让dependent class预留了依赖注入的入口&#xff0c;要想实现依赖的自动…

TOPLAS‘07: Effective Field-Sensitive Pointer Analysis for C 字段敏感C程序指针分析

文章目录1. 集合约束式的指针分析1.1 基本介绍1.2 求解约束1.2.1 图传播1.2.2 迭代顺序1.2.3 节点替换 (Variable Subsititution)1.2.4 传递化简 (Transitive Reduction)1.2.5 集合的表示1.2.6 差分传播1.2.7 相同解的集合2. 扩展约束模型2.1 简介2.2 处理函数指针2.3 处理字段…

NNOM第一个模型实例

目录 一、keras开发环境搭建 二、安装visual studio 2019 1. 下载安装 2. 配置使用MSVC编译器 三、编译第一个NNOM的demo 1. 下载源码 2. 安装依赖库 3. 编译auto_test 四、移植 1. 新建新的VS项目 2. 拷贝相关源码 3. 配置工程 4. 编译并运行 一、keras开发环境搭…

Java并发——线程池

线程池 一、线程池的作用 线程的创建和销毁需要占用CPU资源&#xff0c;若频繁的进行创建和销毁会产生很大的开销&#xff0c;影响性能和系统稳定性。 线程池的优点&#xff1a; 线程池可以保存创建好的线程随用随取&#xff0c;降低资源消耗&#xff08;重复利用线程池中的…

一文读懂堡垒机对企业信息安全起到的重要作用

堡垒机的发展历程大致可分为以下三个阶段&#xff1a;      第一代堡垒机&#xff1a;堡垒机最初的理念起源于跳板机&#xff0c;但跳板机无法实现对运维人员操作行为进行控制和审计&#xff0c;一旦出现违规操作导致操作事故&#xff0c;很难快速定位原因和责任人。    …

Java分析-对象头

前言 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding) HotSpot虚拟机的对象头(Object Header)包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁…

移动是否是商业bi的前景?

一 前言 五年前就有人预言商业智能BI移动化会成为必然趋势&#xff0c;如今5年时间已过&#xff0c;移动BI的普及程度并不如预期。原因主要是数据分析的交互性一直是很高的要求&#xff0c;手机屏幕的限制一直抑制了商业智能BI在移动端得到更好发挥的障碍。 比如数据看板或可…

[笔记] - springboot-jpa 使用sqlite 踩坑

前言&#xff08;可略过&#xff09; 最近准备写一些小项目来验证一下脑袋中的项目 因为是“小项目”&#xff0c;所以对于数据持久化的实现&#xff0c;就不想用mysql等很重的db了 而且不用考虑安全性&#xff0c;故首先想到的就是使用 sqlite 本地数据库即可 然后因为是使用…

Android进阶 之 SPI机制及实现原理

什么是SPI SPI &#xff0c;全称为 Service Provider Interface&#xff0c;是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件&#xff0c;自动加载文件里所定义的类。是Java提供的一套用来被第三方实现或者扩展的API&#xff0c;它可以用来启用…

BCryptPasswordEncoder加密与MD5加密的区别

MD5 加密说明 MD5&#xff08;Message Digest Algorithm 5&#xff09;中文名为消息摘要算法第五版&#xff0c;是计算机安全领域广泛使用的一种散列函数&#xff0c;用以提供消息的完整性保护。 MD5作为一种常用的摘要算法&#xff08;或指纹算法&#xff09;&#xff0c;其…

一文教会你如何利用领英多账号高效开发客户资源

作为全球最大的职业社交平台&#xff0c;领英&#xff08;linkedin&#xff09;的属性关键词包括“商业、互动和机会”。这些属性覆盖了领英全球超过6亿的用户&#xff0c;这决定了领英是一个拥有无限商业交易机会的社交平台。因此&#xff0c;越来越多的国内外企业不断在领英上…

如何在右键菜单添加将文档“转换为PDF”选项

本文介绍一种方法&#xff0c;可以实现右键快速将docx、doc、txt、ppt等文档转换为PDF文档 文章目录1. Acrobat DC 软件安装2.添加右键“转PDF”功能选项3.功能效果1. Acrobat DC 软件安装 下载链接&#xff1a; 1.百度网盘:链接 提取码: vumk 2.阿里云盘&#xff1a;链接…

虹科分享|关于SANS报告的顶级勒索软件洞察

近年来&#xff0c;勒索软件攻击经历了大流行加速的演变&#xff0c;而防御系统则难以跟上。勒索软件的第一阶段已经让位于新的、不同的、更好的和更坏的东西。为了帮助理解这一演变&#xff0c;Morphisec赞助了一份来自SANS的报告&#xff0c;探索勒索软件防御的现状。它研究了…

从Pearson相关系数到模板匹配的NCC方法

文章目录<center> NCC(Normalized Cross Correlation)1.**Pearson相关系数**2.**协方差 covariance**3. **方差 variance**4.模板匹配中的NCC方法5.实现过程6.测试结果7.部分核心源码NCC.cppNCC(Normalized Cross Correlation)从Pearson相关系数到模板匹配的NCC方法 1.P…

HTML5 本地存储

文章目录HTML5 本地存储Cookie的缺点localStorage简介简单使用sessionStorage简介简单使用indexedDB简介HTML5 本地存储 Cookie的缺点 在HTML4.01中&#xff0c;想要在浏览器端存储用户的某些数据时&#xff0c;我们一般只能使用Cookie来实现。 但是Cookie存在一些问题&…