软著代码整理工具(针对cpp代码),python实现

news2024/12/25 9:04:15

一. 内容简介

软著代码整理工具(针对cpp代码),python实现

二. 软件环境

2.1vsCode

2.2Anaconda

version: conda 22.9.0

2.3代码链接

https://gitee.com/JJW_1601897441/csdn

三.主要流程

3.1 格式要求

  1. 代码语法要求

    对软件著作权提交源代码是提供原始的代码(不是关键代码)语法上要求代码具备完整性。而且要求提交者提供的源代码是对应的代码文件的最原始文本信息。

    例如:C++代码应该是以include之类作为开头,而不能以函数开头;

    C#代码应该是using之类作为开头,而不能以函数开头;

  2. 首页要求

    对软件著作权提交源代码的首页应该具备以下至少一种情况所在的页面的原始代码;

    a.主函数

    b.程序的入口(比如登录函数)

    c.主页(比如index default页面)

  3. 避免因素

    对软件著作权提交的源代码尽量少提供或者不提供设计器生成的代码;

    例如:以C#语言设计器生成的代码语言文件一般为XXXt.designer.cs

  4. 提交数量要求

    对软件著作权申请都要提供软件60页的源代码,超出60页的应至少提交最前和最后的各连续30页源程序文本,不足60页的,应当将所有的源程序文本全部提交,程序要有比较鲜明的开始段落和结尾的段落,还注意去掉一些注释性的内容。

    例如: 要求是50行一页,如果你的源程序文件有59页,那就要提交全部的文件,即59页;如果你的源程序文件有个100页,那只需要提交前30页和最后的30页(70-100页),当中的不用提交。

  5. 程序数量要求

    对软件著作权提交源代码的源程序要求每页有50行程序代码,并要求前30页是程序的前半部分有开头并具有连续性,后30页是程序的后半部分包括结尾也要具有连续性。30和31页之间可以不连续。

  6. 注意事项

    源程序和文档都应当在页眉上标注相应的软件名称和版本号,在每页的右上角通过电脑以阿拉伯数字连续标注页码。除第60页外,每页不能出现只有半页代码的情况。

软件著作权对提交源代码的格式要求:
字号不大于13,除第60页外,每页不少于50行,纯空白行不算;
包含人名、地址、时间、版权的注释全部删掉,大段乱码、描述性的注释删掉;
第1页第一行必须是软件或模块开头,第60页一行必须是软件或模块结尾。

官网找的,官网只写了这个

4.软件鉴别材料

一般交存:

源程序的连续的前30页和连续的后30页;

提交任何一种文档的连续的前30页和连续的后30页。

整个程序和文档不到60页的,应当提交整个源程序和文档。除特定情况外,程序每页不少于50行,文档每页不少于30行。

例外交存,选择下列方式之一:

a.提交源程序的前、后各连续的30页,其中的机密部分用黑色宽斜线覆盖,但覆盖部分不得超过交存源程序的50%;

b.提交源程序连续的前10页和任何部分的连续的50页;

c.提交目标程序的前、后连续的30页和源程序的任何部分的连续的20页。

3.2 格式处理

python读出目录的所有文件

import os

def get_files_by_extensions(extensions):
    current_directory = os.getcwd()
    files = []
    for file_name in os.listdir(current_directory):
        if os.path.isfile(file_name) and any(file_name.endswith(ext) for ext in extensions):
            files.append(file_name)
    return files

if __name__ == "__main__":
    # 让用户输入文件类型,可以输入多个类型,以空格分隔,例如:cpp h txt
    extensions = ['cpp', 'h']

    files = get_files_by_extensions(extensions)
    print(files)

读出clang-format.exe应用位置,用于格式化c++代码

import os

def get_files_by_extensions(extensions):
    current_directory = os.getcwd()
    files = []
    for file_name in os.listdir(current_directory):
        file_path = os.path.join(current_directory, file_name)
        if os.path.isfile(file_path) and any(file_name.endswith(ext) for ext in extensions):
            files.append(file_path)
    return files

if __name__ == "__main__":
    # 让用户输入文件类型,可以输入多个类型,以空格分隔,例如:cpp h txt
    extensions = ["exe"]
    files = get_files_by_extensions(extensions)
    print(files)

然后对读出来的代码进行格式化处理

import subprocess

def format_cpp_file(file_path):
    try:
        # Run clang-format command to format the C++ file
        subprocess.run([clang_format_path, '-i', file_path], check=True)
        print(f"{file_path} formatted successfully.")
    except subprocess.CalledProcessError as e:
        print(f"Error occurred while formatting {file_path}: {e}")

# Example usage:
# 批量格式化
for element in files:
    print(element)
    format_cpp_file(element)

格式要求,在.clang-format文件中设置

BasedOnStyle: Microsoft

IndentWidth: 4
UseTab: Never
TabWidth: 4
ColumnLimit: 120

BraceWrapping:
  AfterControlStatement: true
  PreserveBlocks: true

SpaceBeforeParens:
  ControlStatements: true
  Always: true

CommentPragmas: '^ MY_PRAGMA'

AllowAllParametersOfDeclarationOnNextLine: true

PointerAlignment: Left
ContinuationIndentWidth: 4


然后就是清除注释

import re


def clearCcomment(file_path):
    # 读取文件内容
    with open(file_path, 'r') as file:
        content = file.read()

    # 使用正则表达式删除C++注释
    # 删除多行注释 /* ... */
    content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL)
    # 删除单行注释 // ...
    content = re.sub(r'//.*', '', content)

    # 将修改后的内容写回文件
    with open(file_path, 'w') as file:
        file.write(content)
for element in files: 
    print(element)
    clearCcomment(element)
    print(element+"formatted successfully")

清除空格

def clearSpaces(file_path ):
    # 以读写模式打开C++或H文件

    # 读取文件内容
    with open(file_path, 'r') as file:
        lines = file.readlines()

    # 删除空白行
    non_empty_lines = [line for line in lines if line.strip()]

    # 将修改后的内容写回文件
    with open(file_path, 'w') as file:
        file.write(''.join(non_empty_lines))

for element in files:
    print(element)
    clearSpaces(element)
    print(element+"formatted successfully")

然后统计代码行数

def count_lines_in_cpp_file(file_path):
    try:
        # 打开C++文件并读取内容
        with open(file_path, 'r') as file:
            lines = file.readlines()
        return len(lines)
    except FileNotFoundError:
        print(f"文件 '{file_path}' 未找到。")
        return -1
sum = 0
for element in files:
    print(element)
    line_count = count_lines_in_cpp_file(element)
    sum = sum + line_count
    print(element+"formatted successfully")
    if line_count >= 0:
        print(f"文件 '{element}' 共有 {line_count} 行。")
print(f"总行数 '{sum}' 行")

3.3 自己处理

看要求,自己整理一下哪些代码放前面,哪些放后面,感觉直接批量生成的可能不太符合要求,自己手动选一下代码把,

3.4 读入代码,按要求生成文档

选完代码以后,把代码放入code.txt,写入的是按一页五十行代码写入的,代码都在上面那个链接里面,我演示的代码就不放了
在这里插入图片描述
然后拷贝一下模板文件

import shutil

def copy_docx(original_docx_file_path, new_docx_file_path):
    shutil.copyfile(original_docx_file_path, new_docx_file_path)

if __name__ == "__main__":
    original_docx_file_path = "code_copy.docx"
    new_docx_file_path = "code.docx"

    copy_docx(original_docx_file_path, new_docx_file_path)

把txt中的代码写入docx中

from docx import Document
from docx.shared import Pt

def read_txt_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        return file.read().strip()  # 使用 strip() 方法去除首尾空白字符

def add_text_to_docx(text, docx_file_path):
    document = Document(docx_file_path)
    paragraph = document.add_paragraph()
    run = paragraph.add_run(text)
    font = run.font
    font.name = '宋体'
    font.size = Pt(11)
    document.save(docx_file_path)

if __name__ == "__main__":
    txt_file_path = "code.txt"
    docx_file_path = "code.docx"

    txt_content = read_txt_file(txt_file_path)
    add_text_to_docx(txt_content, docx_file_path)

写入完成以后,把第一行的空格删掉(没解决),然后把页眉改一下就好了
在这里插入图片描述

四.参考

【手把手教你申请软件著作权系列教程(基于本人2021年申请软件著作权一次性顺利通过后录制)】 https://www.bilibili.com/video/BV1U3411B7GJ/?share_source=copy_web&vd_source=7b377d4a833a67013df5f95f32b390f8
【软件设计说明书模版(申请软件著作权可供参考)】
http://t.csdn.cn/jJqZl
【vscode之软著代码格式整理】
http://t.csdn.cn/4qy8o

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

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

相关文章

AcWing241. 楼兰图腾(树状数组)

输入样例: 5 1 5 3 2 4输出样例: 3 4解析: 以某个点 i 为最低点的 V 的数量,为 i 左侧和右侧比 a[ i ] 大的数量 a,b 的乘积。 但是,直接求这两个数的复杂度为O(n),则整个复杂度为O( n^2 )&am…

TortoiseGit安装

1、TortoiseGit简介 TortoiseGit是基于TortoiseSVN的Git版本的Windows Shell界面。它是开源的,可以完全免费使用。 TortoiseGit 支持你执行常规任务,例如commit、显示日志、区分两个版本、创建分支和标签、创建补丁等。 2、TortoiseGit下载 (1)Tortois…

MySQL高级篇第2章(MySQL的数据目录)

文章目录 1、MySQL8的主要目录结构1.1 数据库文件的存放路径1.2 相关命令目录1.3 配置文件目录 2、数据库和文件系统的关系2.1 查看默认数据库2.2 数据库在文件系统中的表示2.3 表在文件系统中的表示2.3.1 InnoDB存储引擎模式2.3.2 MyISAM存储引擎模式 2.4 小结 1、MySQL8的主要…

论文笔记--Skip-Thought Vectors

论文笔记--Skip-Thought Vectors 1. 文章简介2. 文章概括3 文章重点技术3.1 Skip Thought Vectors3.2 词表拓展 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题:Skip-Thought Vectors作者:Ryan Kiros, Yukun Zhu, Ruslan Salakhutdinov, Rich…

【设计模式——学习笔记】23种设计模式——桥接模式Bridge(原理讲解+应用场景介绍+案例介绍+Java代码实现)

问题引入 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等),如图 【对应类图】 【分析】 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们…

JDK9 接口特性(heima)

JDK9 接口特性(heima) 将log方法私有化

04. Idea集成Docker

目录 1、前言 2、开启docker远程 2.1、配置远程访问模式 2.2、重启docker服务 2.3、验证 3、Idea配置Docker 3.1、配置证书登录 4、创建Dockerfile 4.1、编写Dockerfile 4.2、配置启动项 4.3、访问接口 1、前言 上一节中,我们介绍了Dockerfile的方式构建…

MURF20100CT-ASEMI快恢复对管20A 1000V

编辑:ll MURF20100CT-ASEMI快恢复对管20A 1000V 型号:MURF20100CT 品牌:ASEMI 封装:TO-220F 恢复时间:50ns 正向电流:20A 反向耐压:1000V 芯片大小:102MIL*2 芯片个数&…

C语言每日一题:4.消失的数字+数字在升序数组中出现的次数+整数转换

消失的数字: 思路1:排序遍历 1.使用qsort排序数组判断当前数值1是否是数组下一个元素的数值。 2.如果是一直循环注意数组越界,如果不是那么当前的数组的数值1就是消失的数。 3.存在0——n的数字是第n个数没有了。循环过程中从头到尾也找不到这…

C++ 哈希的应用【位图】

✨个人主页: 北 海 🎉所属专栏: C修行之路 🎃操作环境: Visual Studio 2022 版本 17.6.5 文章目录 🌇前言🏙️正文1、问题一2、位图概念3、位图的模拟实现3.1、基本思路3.2、set3.3、reset3.4、…

从电商指标洞察到运营归因,只需几句话?AI 数智助理准备好了!

Lily 是名入职不久的电商运营助理,最近她想要根据 2022 年的客单价情况,分析品牌 A 在不同电商渠道的用户行为和表现,并提供一些有价值的洞察和建议给客户。然而在向技术人员提报表需求后,技术人员以需求排满为借口拒绝了。 Lily …

STM32CUBEMX配置 定时器中断 和 上升沿中断(实现检测1s以内的脉冲个数)

———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动&#x…

速锐得开发社区-新一代汽车网络通信技术CAN FD的特点归纳

随着汽车工业的快速发展,汽车逐渐走向智能化,功能也越来越丰富,例如特斯拉、比亚迪、理想汽车为代表,在车载导航、驻车雷达、胎压监测、倒车影像、无钥匙启动、定速巡航、自动泊车、高级辅助驾驶系统、自动驾驶、域控制器、智能网…

慎投!中科院2区TOP期刊被标记为“On Hold”!

近日,小编从科睿唯安旗下的“Master Journal List”官网查到,知名老牌期刊Chemosphere竟然被标记为“On Hold”状态!究竟是怎么回事呢? 中科院TOP期刊标记为“On Hold” 出版社:Elsevier ISSN:0045-6535 …

【广州华锐互动】无人值守变电站AR虚拟测控平台

无人值守变电站AR虚拟测控平台是一种基于增强现实技术的电力设备巡检系统,它可以利用增强现实技术将虚拟信息叠加在真实场景中,帮助巡检人员更加高效地完成巡检任务。这种系统的出现,不仅提高了巡检效率和准确性,还降低了巡检成本…

vray GPU渲染如何设置?最适合 VRay 渲染的 GPU 是什么?

Chaos 提供的 Vray GPU是一个独立的渲染引擎,提供 GPU 硬件加速。它还与 CPU(处理器)配合使用,并利用 CPU 和 GPU 硬件进行无缝混合渲染。 GPU 渲染使 Vray GPU 渲染引擎能够在系统的 GPU 而不是 CPU 上执行光线跟踪计算。由于 G…

Linux学习之case

case的格式如下: case "变量" in值1)指令集1;;值2)指令集2;;*)指令集n;; esaccase会将变量的值跟值1、值2等进行比较,符合就执行后边对应的指令集,注意)只是一个标识,表明这是一个分支,;;是一个分支结束&am…

Qt控件样式设置、QSS语法介绍

一、前言 QT是比较流行的跨平台应用程序框架,提供了丰富的控件库和功能强大的工具,用于创建各种类型的应用程序。虽然QT默认提供的样式看起来很不错,但是如果想要自定义的应用程序的外观,可以使用QT样式表(QSS)来设置控件的外观和行为。 QSS是一种基于CSS的样式表语言,…

DB-GPT:强强联合Langchain-Vicuna的应用实战开源项目,彻底改变与数据库的交互方式

今天看到 蚂蚁科技 Magic 开源的DB-GPT项目,觉得创意很好,集成了当前LLM的主流技术,主要如下 Langchain: 构建在LLM之上的应用开发框架HuggingFace: 模型标准,提供大模型管理功能Vicuna: 一个令GPT-4惊艳的开源聊天机…

odoo服务相关shell脚本

odoo服务相关shell脚本 1 确定系统不会自动休眠 ubuntu 22.04登陆之后,如果系统较长时间不操作,系统就自动休眠了。 如果重启之后,从来都没有登陆,就不会出现系统自动休眠的情况。 观察系统日志,发现类似如下的内容…