第二周作业

github地址:https://github.com/violetshellz/software_wc

1.项目简介

基本功能:

wc.exe -c file.c     //返回文件 file.c 的字符数
wc.exe -w file.c     //返回文件 file.c 的单词总数
wc.exe -l file.c     //返回文件 file.c 的总行数
wc.exe -o outputFile.txt     //将结果输出到指定文件outputFile.txt

注意:

空格,水平制表符,换行符,均算字符。

由空格或逗号分割开的都视为单词,且不做单词的有效性校验,例如:thi#,that视为用逗号隔开的2个单词。

-c, -w, -l参数可以共用同一个输入文件,形如:wc.exe –w –c file.c 。

-o 必须与文件名同时使用,且输出文件必须紧跟在-o参数后面,不允许单独使用-o参数。

扩展功能:

wc.exe -s            //递归处理目录下符合条件的文件
wc.exe -a file.c     //返回更复杂的数据(代码行 / 空行 / 注释行)
wc.exe -e stopList.txt  // 停用词表,统计文件单词总数时,不统计该表中的单词

[file_name]: 文件或目录名,可以处理一般通配符。

其中,

代码行:本行包括多于一个字符的代码。

空   行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。

注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:

}//注释

在这种情况下,这一行属于注释行。

-e 必须与停用词文件名同时使用,且停用词文件必须紧跟在-e参数后面,不允许单独使用-e参数。

stopList.txt中停用词可以多于1个,单词之间以空格分割,不区分大小写,形如:while if switch

高级功能

wc.exe -x  //该参数单独使用,如果命令行有该参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、单词数、行数等全部统计信息。

2.代码分析

(1)根据传达给judge()的参数判断要调用的功能:

当par=='-c',返回文件的字符数;当par==‘-w’时,返回文件单词数;当par==‘l’时,返回文件的行数;当par==‘a’时,返回文件的代码、空格、注释行数。

def judge(par, file, out='result.txt'):
    if par == '-c':
        with open(file, 'r') as f:
            count = 0
            while f.read(1):
                count += 1
            with open(out, 'a') as fm:
                fm.write(file + ',字符数:' + str(count) + '\n')
    if par == '-w':
        with open(file, 'r') as f:
            count = 0
            for line in f:
                sp = re.split(',|\x20', line)
                for i in sp:
                    if i not in table:
                        count += 1
            with open(out, 'a') as fn:
                fn.write(file + ',单词数:' + str(count) + '\n')
    if par == '-l':
        with open(file, 'r') as f:
            count = 0
            for line in f:
                count += 1
            with open(out, 'a') as fl:
                fl.write(file + ',行数:' + str(count) + '\n')
    if par == '-a':
        with open(file,'r') as f:
            c1,c2,c3=0,0,0
            for line in f:
                pattern2 = re.compile(r'.?\n')
                if pattern2.match(line):
                    c2+=1
                else:
                    line=line.strip()
                    pattern3 = re.compile(r'^(})?//')
                    pattern4 = re.compile(r'^(})?/\*')
                    pattern5 = re.compile(r'^\*/$')
                    if pattern3.match(line) or pattern4.match(line) or pattern5.match(line):
                        c3 += 1
                    else:
                        c1 += 1
            with open(out,'a') as fo:
                fo.write(file + ',代码行/空行/注释行:' + str(c1) +'/' + str(c2)+ '/'+str(c3) + '\n')

(2)实现高级功能

wc.exe -x

  该参数单独使用,如果命令行有该参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、单词数、行数等全部统计信息。

if i <=(LEN-1) and sys.argv[i] == '-x':
    default_dir = r"CC:\Python27\PyInstaller-3.3.1\wc\dist"  # 设置默认打开目录
    fname = tkFileDialog.askopenfilename(title=u"选择文件", initialdir=(os.path.expanduser(default_dir)))
    for i2 in ['-c','-w','-l','-a']:
        judge(i2,fname,'outputFile.txt')
    os._exit(0)

(3)实现停用词表

wc.exe -e stopList.txt  // 停用词表,统计文件单词总数时,不统计该表中的单词
if i <= (LEN - 1) and sys.argv[i] == '-e':
    i += 1
    if i <= (LEN - 1):
        with open(sys.argv[i], 'r') as f:
            i += 1
            for line in f:
                for SP in re.split(',|\x20', line):
                    table.append(SP)
    else:
        print("输入错误")

(4)

将结果输入到制定文件夹  wc.exe -o outputFile.txt 

实现递归处理目录下符合条件的文件  wc.exe -s

if i <= (LEN - 1) and sys.argv[i] == '-o':
    # print sys.argv[i]
    i += 1
    if i <= (LEN - 1):
        if '-s' not in para:
            for j in para:
                judge(j, sys.argv[ip], sys.argv[i])
        else:
            para.remove('-s')
            # files = os.listdir(sys.argv[ip])
            FILES = []
            for root, dirs, files in os.walk(sys.argv[ip], topdown=True):
                for name in files:
                    FILES.append(os.path.join(root, name))
            res = []
            for file in FILES:
                pattern = re.compile(r'.*\.c')
                if pattern.match(file):
                    res.append(file)
            for j in para:
                for k in res:
                    judge(j, k, sys.argv[i])

    else:
        print("输入错误")
else:
    if '-s' not in para:
        for j in para:
            judge(j, sys.argv[ip])
    else:
        para.remove('-s')
        # files = os.listdir(sys.argv[ip])
        FILES = []
        for root, dirs, files in os.walk(sys.argv[ip], topdown=True):
            for name in files:
                FILES.append(os.path.join(root, name))
        res = []
        for file in FILES:
            pattern = re.compile(r'.*\.c')
            if pattern.match(file):
                res.append(file)
        for j in para:
            for k in res:
                judge(j, k)

3.测试用例

运行测试脚本wc\BIN\ceshi.py,结果在result.txt内

若测试脚本不能用:①在BIN目录下shift+鼠标右键打开命令行(也许需要管理员模式)②在命令行下一个个测试下面os.system()函数中的命令

(1)统计字符

import os
os.system(r'wc.exe -c char.c')

os.system(r'wc.exe -c whitespace.c')

(2)单词数和行数

os.system(r'wc.exe –w –l wordtest.c')

 

(3)

1.统计代码行、空行、注释行

os.system(r'wc.exe –a atest.c')

  

2.    停用词表

os.system('wc.exe –w stoptest.c –e stoplist.txt')

 

 3.文件夹遍历

遍历当前文件夹下 a目录下所有 .c结尾文件

os.system('wc.exe -s -a –w a')

(4)高级功能

以图形界面输入文件

wc.exe -x 会返回字符、单词、行数、注释代码空格行数(结果在outputFile.txt中)

os.system('wc.exe –x')

(5)输出测试(结果在result.txt内)

os.system('wc.exe –s –a –w –c –l a')

 

4.PSP

PSP阶段预估耗时(分钟)实际耗时(分钟)
计划2030
估计这个任务需要多少时间1520
开发300600
需求分析(包括学习新技术)60120
生产设计文档6060
设计复审(和同事审核设计文档)3050
代码规范(为目前的开发制定合适的规范)3040
具体设计2040
具体编码120300
代码复审30100
测试(自我测试,修改代码,提交修改)100200
报告120150
测试报告2060
计算工作量3040
事后总结,并提出过程改进计划2030
合计9751840

4.参考文件

https://www.cnblogs.com/zxyfanta/p/4032093.html
http://blog.csdn.net/woshisangsang/article/details/73230433
http://www.runoob.com/python/att-string-split.html
https://zhidao.baidu.com/question/308587899.html
http://www.runoob.com/python3/python3-os-walk.html

转载于:https://www.cnblogs.com/zuokunlin/p/8612402.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!改善深层神经网络的方法有很多,以下是一些常见的方法: 1. 使用更好的激活函数:传统的激活函数如Sigmoid、tanh等可能存在梯度消失或爆炸的问题。可以尝试使用ReLU、Leaky ReLU、ELU等激活函数,以减轻这些问题。 2. 使用批标准化(Batch Normalization):批标准化对网络的输入进行标准化,有助于加快网络的训练速度,并且可以缓解梯度问题,使得更深层的网络也能够训练得更好。 3. 使用残差连接(Residual Connections):残差连接可以帮助信息在网络中更好地流动,从而减轻梯度消失的问题。通过将某些层的输出与输入相加,可以使得网络更易于训练。 4. 使用更好的优化算法:传统的梯度下降算法如随机梯度下降(SGD)可能存在训练速度慢、易陷入局部最优等问题。可以尝试使用更高级的优化算法如Adam、RMSprop等,以加快模型的收敛速度。 5. 添加正则化:过拟合是深层神经网络常见的问题之一。可以通过添加正则化项如L1正则化、L2正则化等来限制模型的复杂度,防止过拟合的发生。 6. 数据增强:通过对训练数据进行一些随机的变换,如平移、旋转、缩放等,可以增加模型的泛化能力,防止过拟合。 这些方法只是改善深层神经网络的一部分,具体的选择和调整需要根据具体问题和数据集来进行。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值