C语言代码统计器

合集下载

cloc统计代码

cloc统计代码

cloc统计代码
CLoc(Count Lines of Code)是一个用于统计代码行数的工具,可以统计各种编程语言的代码行数,包括源代码、注释和空行。

以下是使用CLoc统计代码行数的示例:
cloc /path/to/project
其中,/path/to/project是你要统计代码行数的项目路径。

CLoc将会统计该项目中所有源代码文件的行数,包括.c、.cpp、.h、.java、.py等文件。

如果你只想统计特定类型的文件,可以使用--include-lang参数,例如:cloc --include-lang="C++" /path/to/project
这将会只统计C++源代码文件的行数。

CLoc还提供了许多其他参数,例如:
--exclude-dir:排除指定的目录。

--by-file:按文件输出统计结果。

--by-lang:按语言输出统计结果。

--sum-one-line:将所有代码行数相加并输出。

可以通过运行cloc --help来查看所有可用的参数和选项。

如何用C语言编写计数器

如何用C语言编写计数器

单片机计数器C语言练习要求:编写一个计数器程序,将T0作为计数器来使用,对外部信号计数,将所计数字显示在数码管上。

该部分的硬件电路如图所示,U1的P0口和P2口的部份引脚构成了6位LED数码管驱动电路,数码管采用共阳型,使用PNP型三极管作为片选真个驱动,所有三极管的发射极连在一起,接到正电源端,它们的基极则分别连到P2.0…P2.5,当P2.0…P2.5中某引脚输是低电平时,三极管导通,给相应的数码管供电,该位数码管点亮哪些笔段,则取决于笔段引脚是高或低电平。

图中看出,所有6位数码管的笔段连在一起,通过限流电阻后接到P0口,因此,哪些笔段亮就取决于P0口的8根线的状态。

编写程序时,首先根据硬件连线写出LED数码管的字形码、位驱动码,然后编写程序如下:#include "reg51.h"#define uCHAR unsigned CHAR#define uint unsigned intuCHAR code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB}; //位驱动码uCHAR codeDispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0 xA1,0x86,0x8E,0xFF}; //字形码uCHAR DispBuf[6]; //显示缓冲区void Timer1() interrupt 3{ uCHAR tmp;uCHAR Count; //计数器,显示程序通过它得知现正显示哪个数码管TH1=(65536-3000)/256;TL1=(65536-3000)%256; //重置初值tmp=BitTab[Count]; //取位值P2=P2|0xfc; //P2与11111100B相或P2=P2&tmp; //P2与取出的位值相与tmp=DispBuf[Count];//取出待显示的数tmp=DispTab[tmp]; //取字形码P0=tmp;Count++;if(Count==6)Count=0;}void main(){ uint tmp;P1=0xff;P0=0xff;TMOD=0x15; //定时器0工作于计数方式1,定时器1工作于定时方式1 TH1=(65536-3000)/256;TL1=(65536-3000)%256; //定时时间为3000个周期TR0=1; //计数器0开始运行TR1=1;EA=1;ET1=1;for(;;){ tmp=TL0|(TH0<<8); //取T0中的数值DispBuf[5]=tmp%10;tmp/=10;DispBuf[4]=tmp%10;tmp/=10;DispBuf[3]=tmp%10;tmp/=10;DispBuf[2]=tmp%10;DispBuf[1]=tmp/10;DispBuf[0]=0;}}这个程序中用到了一个新的知识点,即数组,首先作一个先容。

统计代码量 linux

统计代码量 linux

统计代码量 linux
统计代码量是软件工程中的一个重要指标,用于衡量项目的规模和复杂度。

在 Linux 系统中,开发人员能够使用各种工具来统计代码量,以便更好地管理和优化代码库。

常用的代码统计工具包括 cloc、sloccount、tokei 等。

其中,cloc 是一款功能强大的跨平台代码统计工具,支持多种语言的代码统计,包括 C、C++、Java、Python、PHP 等等。

sloccount 则是一款基于 Perl 的代码统计工具,能够生成详细的代码统计报告,包括代码行数、注释行数、空行数等等。

tokei 则是一款 Rust 编写的代码统计工具,具有快速、轻量级和易于使用的特点。

在 Linux 系统中,开发人员可以选择以上任意一款代码统计工具来统计代码量。

一般来说,代码行数是代码量的主要指标之一,包括代码、注释和空行。

通过统计代码行数,开发人员可以了解项目的规模和复杂度,以便更好地管理和优化代码库。

除了代码行数之外,开发人员还可以根据项目的具体情况选择其他的代码统计指标,比如代码质量、代码复杂度等等。

在统计代码量的同时,开发人员还应该注意保护代码的版权和知识产权,遵守相关的法律法规,以确保代码的安全和合法性。

- 1 -。

学生成绩管理系统c语言源代码

学生成绩管理系统c语言源代码

学生成绩管理系统c语言源代码介绍学生成绩管理系统是一个能够帮助学校、教师和学生管理和查询学生成绩的软件系统。

通过该系统,教师可以录入学生的考试成绩,并进行统计和分析;学生可以查询自己的成绩和排名;学校可以通过系统生成各种报表和分析数据。

本文将介绍一个使用C语言编写的学生成绩管理系统的源代码实现。

功能设计学生成绩管理系统的功能设计可以分为以下几个主要模块:登录模块1.输入用户名和密码;2.验证用户名和密码是否匹配;3.登录成功后进入主菜单。

学生管理模块1.输入学生信息(学号、姓名、性别、年龄等);2.添加学生信息到系统中;3.删除指定学号的学生信息;4.修改指定学号的学生信息;5.查询指定学号的学生信息;6.显示所有学生的信息。

课程管理模块1.输入课程信息(课程号、课程名称、授课教师等);2.添加课程信息到系统中;3.删除指定课程号的课程信息;4.修改指定课程号的课程信息;5.查询指定课程号的课程信息;6.显示所有课程的信息。

成绩管理模块1.输入学号和课程号;2.输入成绩信息(平时成绩、期末成绩、总评成绩等);3.添加成绩信息到系统中;4.修改指定学号和课程号的成绩信息;5.查询指定学号和课程号的成绩信息;6.统计指定课程的平均成绩、最高成绩和最低成绩;7.统计指定学生的平均成绩、最高成绩和最低成绩。

数据导入与导出模块1.从文件导入学生信息和成绩信息;2.将学生信息和成绩信息导出到文件。

源代码实现以下是一个使用C语言实现的学生成绩管理系统的源代码实例:#include <stdio.h>#include <stdlib.h>#include <string.h>// 定义学生结构体typedef struct {int id;char name[100];char gender[10];int age;} Student;// 定义课程结构体typedef struct {int id;char name[100];char teacher[100];} Course;// 定义成绩结构体typedef struct {int studentId;int courseId;float ordinaryGrade;float finalGrade;float totalGrade;} Grade;// 学生管理函数void addStudent(Student *students, int *studentCount) {// 添加学生信息到系统}void deleteStudent(Student *students, int *studentCount, int studentId) { // 删除指定学号的学生信息}void modifyStudent(Student *students, int studentId) {// 修改指定学号的学生信息}void queryStudent(Student *students, int studentId) {// 查询指定学号的学生信息}void displayAllStudents(Student *students, int studentCount) { // 显示所有学生的信息}// 课程管理函数void addCourse(Course *courses, int *courseCount) {// 添加课程信息到系统}void deleteCourse(Course *courses, int *courseCount, int courseId) { // 删除指定课程号的课程信息}void modifyCourse(Course *courses, int courseId) {// 修改指定课程号的课程信息}void queryCourse(Course *courses, int courseId) {// 查询指定课程号的课程信息}void displayAllCourses(Course *courses, int courseCount) {// 显示所有课程的信息}// 成绩管理函数void addGrade(Grade *grades, int *gradeCount) {// 添加成绩信息到系统}void modifyGrade(Grade *grades, int gradeCount, int studentId, int courseId) { // 修改指定学号和课程号的成绩信息}void queryGrade(Grade *grades, int gradeCount, int studentId, int courseId) { // 查询指定学号和课程号的成绩信息}void calculateCourseStatistics(Grade *grades, int gradeCount, int courseId) { // 统计指定课程的平均成绩、最高成绩和最低成绩}void calculateStudentStatistics(Grade *grades, int gradeCount, int studentId) {// 统计指定学生的平均成绩、最高成绩和最低成绩}// 数据导入与导出函数void importData() {// 从文件导入学生信息和成绩信息}void exportData() {// 将学生信息和成绩信息导出到文件}int main() {// 主程序菜单return 0;}总结学生成绩管理系统是一个非常有用的工具,可以帮助学校、教师和学生高效地管理和查询学生成绩。

count在c语言中的用法

count在c语言中的用法

count在c语言中的用法在C语言中,count通常表示计数器或计数值,用于统计某个特定元素或事件的出现次数。

count可以在各种情况下使用,如以下:1. 循环计数器:count可以在循环中使用,用于循环迭代的计数器。

2. 数组索引:count可以用作数组索引,表示数组中元素的数量。

3. 字符串长度:count可以被用来计算字符串中字符的数量。

4. 数据统计:count可以用于统计数据中特定元素的出现数量。

5. 文件计数:count可以用于统计文件中行数、字节数等等。

示例代码:1. 循环计数器```for(int count = 0; count < 10; count++){// 执行语句}```2. 数组索引```int array[5];for(int i = 0; i < count; i++){// 索引操作array[i] = i;}```3. 字符串长度```char str[] = "hello world";int count = 0;while(str[count] != '\0'){count++;}printf("字符串长度为:%d", count);```4. 数据统计```int array[] = {1, 2, 3, 2, 4, 1};int count = 0;for(int i = 0; i < sizeof(array)/sizeof(int); i++){ if(array[i] == 2){count++;}}printf("数字2出现的次数为:%d", count); ```5. 文件计数```FILE *file;char c;int count = 0;file = fopen("test.txt", "r");while((c = fgetc(file)) != EOF){if(c == '\n'){count++;}}fclose(file);printf("文件行数为:%d", count);```。

sourcecounter指导书

sourcecounter指导书

sourcecounter指导书sourcecounter是一款强大的代码统计分析工具,广泛应用于软件开发、项目管理和代码审查等领域。

本文将详细介绍sourcecounter的使用方法、实战案例以及优缺点分析,帮助读者更好地掌握这款工具。

一、sourcecounter简介sourcecounter是一款基于Python的开源代码统计工具,可以快速对源代码进行统计分析。

它支持多种编程语言,如C、C++、Java、Python等,能够统计代码行数、函数数、类数等指标,并提供详细的报告。

二、sourcecounter安装与配置1.安装:在命令行中输入以下命令即可安装sourcecounter:```pip install sourcecounter```2.配置:sourcecounter默认使用Python的unicode编码,如果需要更改编码格式,可以在命令行中添加`-f`参数,如下:```sourcecounter -f utf-8 your_code.py```三、sourcecounter使用方法与技巧1.基本用法:在命令行中输入`sourcecounter`,然后传入需要统计的源代码文件,如下:```sourcecounter your_code.py```2.输出结果:sourcecounter会将统计结果输出到命令行窗口,同时生成一份详细的报告(以HTML格式保存)。

3.参数说明:- `-h`:显示帮助信息。

- `-f`:指定输出文件的编码格式。

- `-o`:指定输出文件的路径。

- `-n`:不输出统计结果,仅生成报告。

- `--csv`:输出CSV格式的统计数据。

四、sourcecounter实战案例解析1.统计单个项目的代码量:对一个项目中的所有源代码文件进行统计,了解项目的总体规模。

2.代码审查:在代码审查过程中,使用sourcecounter对代码进行统计,以便更好地评估代码的质量。

代码统计工具使用指南[1].20120925.161535

代码统计工具使用指南[1].20120925.161535

深圳天源迪科信息技术股份有限公司文件编号:DIC-QMD-851-16 版本:5.0 代码统计工具使用指南本文件属深圳天源迪科信息技术股份有限公司所有,未经书面许可,不得以任何形式复印或传播。

自发布之日起执行文件建立/修改记录目录1简介 (4)1.1目的 (4)1.2适用范围 (4)1.3背景描述 (4)1.4术语表 (4)1.5参考资料 (4)2描述 (4)2.1主要统计工具 (4)2.2代码工具优缺点 (4)2.2.1Linecounter代码统计工具 (4)2.2.2CCT代码统计工具 (5)2.3统计代码方法 (5)2.3.1Linecounter代码统计工具使用方法 (5)2.3.2Linecounter代码统计工具操作界面 (5)2.3.3CCT代码统计工具操作界面 (9)2.4计算方法: (11)2.5其他:运行问题 (11)3附录 (11)1简介1.1目的本文制定的目的是为公司内所有代码统计活动提供统一的计算标准,从而更好的提高代码统计的精确度。

1.2适用范围公司中的各软件项目的代码统计活动,均需遵循本规范相关要求执行。

1.3背景描述无。

1.4术语表无。

1.5参考资料无。

2描述2.1主要统计工具Linecounter代码统计工具和CCT代码统计工具。

2.2代码工具优缺点2.2.1L i n e c o u n t e r代码统计工具Linecounter智能源码统计专家是一款小型的软件规模统计工具;其口碑甚佳,无需安装,运行比较稳定,业界使用广泛。

Linecounter统计的代码文件类型包括:java文件、xml文件及其他配置文件、sql脚本文件、jsp文件及其他web页面文件、js等脚本文件、css等样式文件,另外还有C、C++、ProC语言等程序文件。

有效代码行数主要包括代码和注释,无效代码主要是空行,统计时应去除无效代码行数。

优势:操作简单,能扩展统计类型缺点:无法统计基础版本与新版本的差异代码。

代码行统计工具-设计文档

代码行统计工具-设计文档

一、分析:统计部分可以独立成一块,输出部分可以独立成一块;0、外部接口:command file.c outfile.txt1、统计模块:函数:void CodeStat(FILE* infp)功能:统计出总行数、代码行数、空行数、注释行数输入参数:infp:文件指针,指向被统计的文件输出参数:无返回:无调用的全局变量:CodeNum:代码行数PlantNum:空行数AnotNum:注释行数TotalNum:总行数2、输出模块:函数:void OutPut(File* outfp)功能:把四个全局变量代码行数、空行数、注释行数、总行数输出到outfp指向的文件输入参数:outfp:指向数据的文件输出参数:无返回:无调用的全局变量:CodeNum:代码行数PlantNum:空行数AnotNum:注释行数TotalNum:总行数二、详细设计:1、统计模块:(此方法不考虑printf(“/*……*/”)的情况)void CodeStat(FILE* infp)int AnotFlag = 0;//注释标志,当注释为/*……*/时,使用此标志char ch;char ch_front;初始化代码行数CodeNum为0;初始化空行数PlantNum 为0;初始化注释行数AnotNum 为0;初始化注释行数TotalNum 为0;if(infp 为空)打印打开文件input错误;return;fseek(infp,0,0);ch = fgetc(infp);if(ch为EOF)return;fseek(infp,0,0);while(非文件结束)TotalNum++ch = fgetc(infp);while(ch == ' ' || ch == 9)//滤掉空格和TAB键ch = fgetc(infp);if滤掉空格后的首字符为回车或文件结束符PlantNum++;else if(注释标志AnotFlag为1)AnotNum++;while(ch != '\n' && ch != EOF)//判断最后一次读到的ch是否是"/";//如果是,则“/* */”注释结束,注释标志需置成0if ch == '/'if ch_front == '*'AnotFlag = 0;else if ch为字符“*”ch = fgetc(infp);if ch为字符'/'置注释标志AnotFlag 为0;//如果注释标志为0,则表示注释结束,后面可以有代码if 注释标志AnotFlag 为0 //后面可能还有代码ch = fgetc(infp);while(ch == ' ' || ch == 9 )//滤掉“*/”后面的空格和TAG键ch = fgetc(infp);如果ch != '/' 且ch != '\n' 且ch != EOFCodeNum++;继续读本行,直到本行结束;//如果ch不是回车符和文件结束符,表示需要继续while循环if(ch != '\n' && ch != EOF)//加此,因为上面可能出现读到回车符ch_front = ch;ch = fgetc(infp);else if注释标志为0,且非空格首字符不是“/”CodeNum++;while(ch != '\n' && ch != EOF)ch = fgetc(infp);if(ch为'/')ch = fgetc(infp);if(ch 为'/')AnotNum++;继续读本行,直到本行结束;else if(ch 为'*')AnotNum++;AnotFlag = 1;ch_front = ' ';//此处可以赋值为除*以外的任何符号while(ch != '\n' || ch != EOF)ch = fgetc(infp);if(ch == '/' && ch_front =='*')AnotFlag = 0;elsech_front = ch;else if非空格首字符为“/”ch = fgetc(infp);if(ch 为'/')AnotNum++;继续读本行,直到本行结束;else if(ch 为'*')AnotNum++;AnotFlag = 1;while(ch != '\n' || ch != EOF)ch = fgetc(infp);if(ch 为'*')ch = fgetc(infp);if(ch 为'/')AnotFlag = 0; // “/* */”注释结束else if(AnotFlag == 0)ch = fgetc(infp);while(ch == ' ' || ch == 9)ch = fgetc(infp);if(ch != '/' && ch != '\n' && ch != EOF)CodeNum++;继续读本行,直到本行结束;2、输出模块:void OutPut(FILE* outfp){ if(outfp 为空)打印outfp参数为空;return;fprintf(outfp, "\n-----------------------------------------");fprintf(outfp, "\n文件总行数:");fprintf(outfp, "%d ", TotalNum);fprintf(outfp, "\n代码行数:");fprintf(outfp, "%d ", CodeNum);fprintf(outfp, "\n注释行数:");fprintf(outfp, "%d ", AnotNum);fprintf(outfp, "\n空行数:");fprintf(outfp, "%d ", PlantNum);fprintf(outfp, "\n-----------------------------------------"); }3、主函数:void main(int argc, char* argv[]){FILE *infp, *outfp;if(argc <= 2)打印命令参数个数错误;exit(1);if((infp = fopen(argv[1], "r+")) == NULL)打印读文件打开错误;exit(1);if((outfp = fopen(argv[2], "w+")) == NULL)打印写文件打开错误;exit(1);CodeStat(infp);OutPut(outfp);关闭infp;关闭outfp;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要本课题的主要任务是开发一款代码行数统计器,专门用于统计C语言或C++语言程序代码文件。

该统计器的主要功能是统计代码文件的文件行数、有效代码行数、注释行数、空白行数,以及计算代码的注释率。

和那些只能统计单个文件的统计器不同,这款统计器能够接受文件夹路径,批量统计整个文件夹的所有文件,包括子文件夹中的有效文件。

这样可以大大的提高统计效率,节约用户的时间,使编程人员能集中更多精力编写程序。

该统计器在测试时统计了大量的文件,基本上没有错误,精度相当高,用户可安全使用。

本课题所用的编译环境是C-free 5,最终结果exe可执行文件。

目录第1章绪论 (1)第2章需求分析 (2)2.1 可行性分析 (2)2.2 整体功能 (2)第3章关键技术 (3)3.1 文件操作 (3)3.1.1 文件的打开与读取 (3)3.1.2 遍历文件夹 (3)3.2 变量处理 (4)3.3 错误识别与防范 (4)3.3.1 内存错误 (4)3.3.2 用户输入有误 (4)第4章概要设计 (5)4.1.1 路径判断 (5)4.1.2 遍历文件 (6)4.1.3 字符判断 (7)4.1.4 信息统计输出 (8)第5章详细设计 (10)5.1 文件类型判断 (10)5.2 遍历文件夹 (10)5.3 文件字符的判断和变量处理 (11)5.3.1 定义变量 (11)5.3.2 注释标记 (12)5.3.3 Space和tab (12)5.3.4 转义字符 (12)5.3.5 其他字符 (13)第6章设计结果和使用说明 (14)6.1 程序运行界面 (14)6.2 使用说明 (15)第7章总结 (16)致谢 (17)参考文献 (18)附录A (19)第1章绪论随着计算机技术的发展与普及,越来越多的人开始学习编程技术。

而C语言是在国内外广泛使用的一种计算机语言,它凭借自己功能丰富、使用灵活、可移植性强等优点,不仅为计算机专业工作者所使用,还博得了广大计算机应用人员以及计算机爱好者的青睐。

但在项目开发的时候,项目负责人经常需要审查代码、统计各种相关信息(如:代码总行数、注释行数、注释率等),其中项目的源代码行数和注释率是非常重要的项目健康度指标,一般来说,比较理想的注释率在20%~30%,这样的代码比较容易维护。

因此,为了减少编程人员的工作量,提高工作效率,就需要设计一种专门的软件来替代项目开发人员统计代码行数以及注释行数等相关信息。

这款C语言代码统计器能够接收用户输入的文件夹路径,批量统计整个文件夹的所有文件,更大程度地提高了项目开发人员的工作效率。

2.1 可行性分析前面已经说过,现在使用计算机编程的人已经越来越多了,其中使用C语言或C++语言编程的更是占了很大的比列。

由于C语言的编写工程很大,但有时却需要统计一些其中的有关信息。

如果用人工统计的话,既浪费时间,也浪费编程人员的精力,降低工作效率。

所以现在对一些辅助型的软件需求量特别大。

面对这样的现状,这款C&C++代码统计器应运而生。

它能够弥补人力的不足,大大地提高了人们的工作效率,使程序员能集中精力编写更多有用的程序。

另一方面,这个代码统计器占用空间很小,电脑的要求很低并且很便携,更能使大多数人接受,而且使用简单,更便于推广。

总体来说,这款代码统计器满足了当前大多数编程人员的部分需求,并且凭借着它独自的特点使大多数人能够接受。

2.2 整体功能这款C&C++代码统计器是用纯C编写的控制台程序,它既能单独地够统计单个文件,还能批量统计整个文件夹中所有文件,这也是前面说的提高效率的关键地方。

主要统计的项目有:文件总数、代码总行数、有效代码总行数、注释行数、空白行数以及注释率等,由此看出,该统计器不仅可以用在它的本职工作(统计代码行数),还能用来统计一个文件夹中的所有文件个数。

除了以上功能,该统计器还有以下优点:操作简单,用户既可以手动输入所需统计的文件或文件夹路径,也可以直接将文件或文件夹拖入特定区域进行统计,方便快捷。

由于该代码统计器是在DOS下运行的控制台程序,所以运行速度比Windows程序要快很多,这也弥补了它在界面上的劣势。

3.1 文件操作前面已经说到,文件操作很重要,特别是文件夹的遍历问题。

3.1.1 文件的打开与读取在C标准库函数中,头文件<stdio.h>下包含了各种输入输出函数,其中就包括了实现文件操作的一系列函数:FILE *fopen(char *filename, char *mode) :以指定的方式打开一个文件。

在该代码统计器的程序中,是以只读(r)方式打开一个文件的。

为什么选只读呢?因为以只读方式打开的文件,无论是否有其他程序在使用它,都不会影响到对它的统计,这样使用起来也是更加的方便。

int fgetc(FILE *fp) :从文件中当前位置读一个字符。

由于该程序中需要连续读取两个字符,而这个函数在读取时会自动移动文件内部指针,所以必须采取特殊措施才能实现连续读取。

该程序是将文件打开两次,两个指针一前一后交替读取字符,从而达到连续读取的目的。

int fclose(void) :关闭所有已打开的文件。

文件打开之后一定要关闭,否则将会使数据丢失。

3.1.2 遍历文件夹在头文件< io.h>中,定义了一个结构体:struct _finddata_t {unsigned attrib;time_t time_create;time_t time_access;time_t time_write;_fsize_t size;char name[260];};并且定义函数long __cdecl _findfirst(const char *, struct _finddata_t *),利用该函数,能够对一个文件夹路径进行检索,返回所给文件夹路径的子文件或子文件夹指针。

从而,我们就可以从这个返回的结构体指针中获取文件夹子目录的全部相关信息,例如:文件或文件夹名、文件类型、文件大小以及更改日期等得知这些信息之后,我们只需要对不同类型的文件分别进行处理,就能实现对整个目录的遍历。

这个程序是采用递归算法,如果所给文件夹的子目录是文件,则直接统计;如果所给文件夹的子目录是文件夹,则将对子文件夹的路径继续调用该函数,直至没有子文件夹为止。

3.2 变量处理由于要统计代码源文件中的文件行数、代码函数、注释行数、空白行数等信息,则需要使用多个变量来分别统计各种信息。

并且,有些变量不只在一个函数中使用,有些变量在递归时不能改变它的值。

为此,在该统计器的程序设计中,一共使用了五个全局变量、九个静态变量。

其中,五个全局变量分别统计用户输入的文件夹中的文件总数、总代码行数、总有效代码行数、总注释行数、总空白行数;九个静态变量位于字符判断的模块,分别用来统计单个文件的代码行数、有效代码行数、注释行数、注释率,以及用来标记字符是否在注释中、是否在字符串中、该行是否有注释、是否有代码等。

这样做减少了函数之间值的地址的传递,出错也就更少,安全性也就越高。

3.3 错误识别与防范3.3.1 内存错误C语言中,指针一直都是最容易出错的地方。

为了防止指针出错,本程序在关键处使用了C标准库函数中,<assert.h>头文件下void assert(int exp) 这个函数,它是用于表达式结果的正确性测试并且当表达式结果为假时使程序终止。

本程序总共在三个地方使用到了它:1、在接受用户所输入的文件(夹)路径,将该路径传递给一个数组时,用于判断数组下标是否越界。

2、在递归遍历文件夹时,函数入口参数是一个指针变量,接受文件夹路径。

此处是用它来防止指针为空的情况。

3、在判断文件是否为C或C++代码文件时,和第二种情况差不多,也是用来防止接收的文件名指针为空。

3.3.2 用户输入有误为了让用户更好地使用软件,就需要有很好的人机对话,当用户输入错误信息的时候,就应该有所提示。

这款软件能识别用户所输入的参数是否为文件(夹)路径,并且会给出相应的语言提示。

并且,当用户所输入的文件或文件夹路径不存在时,也会给出相应的提示或警告,从而不会出现统计对象出错等现象。

第4章概要设计4.1.1 路径判断为了高效统计用户所需的代码文件,就要求统计器能够批量统计文件夹。

因此,首要任务就是要识别用户输入的信息,看用户所给的路径名是文件还是文件夹,从而做出相应的处理,该部分流程图如下:判断完用户所输路径后,就需要对其分开处理。

因为该代码统计器是专门用来统计C 语言或C++语言的,所以当接收路径名为文件时,就需要判断该文件的种类,如果是C或C++程序代码文件,则直接进行统计;否则报错,提示用户文件格式不正确。

该部分流程图如下:4.1.2 遍历文件因为要实现批量处理文件,所以如果用户输入的是文件夹路径,就需要对该文件中的所有文件进行遍历,包括子文件夹中的所有文件,再分别统计出各个文件的相关信息。

文件遍历是一个很关键的部分,遍历是否完全关系到统计的精确度,该统计器采用的是递归遍历法,其流程如下:4.1.3 字符判断如果说文件遍历很重要,那么对文件字符的判断则是整个程序的核心部分。

因为这部分直接关系到单个文件的统计是否正确。

由于代码中存在许多关键字符,如:“/*”,“*/”,“//”等,这都需要两个字符连续判断,所以在读取时,需要从文件中连续读取两个字符。

该部分还关系到了文件的打开与读取,以及文件有效性的判断和从文件中读取字符,大致流程如下:字符判断又分为几大类:1、注释符:“/*”、“*/”、“//”;2、引号:单引号和双引号;3、空白:空格和制表符;4、转义字符:如“\\”;5、换行符:回车键;6、其它一般字符。

这些字符的判断以及相应的处理在后面会相对详细的给出说明,这里就不赘述。

4.1.4 信息统计输出字符判段以及相应的处理后,就需要对文件行数、有效代码行数、注释率等一系列信息进行统计并输出,然后结束。

大致流程如下:这就是该代码统计器的设计思路,至于一些关键部分的处理,接下来会有详细的说明。

第5章详细设计该代码统计器的关键部分有三个:文件类型的判断、文件夹的遍历、文件字符的判断和变量处理。

5.1 文件类型判断C和C++源代码文件加起来一共有三类,分别是以.C、.H、.CPP为后缀名,有了这个依据,我们就能准确地从一系列文件中找出我们所需要的这三种文件。

在设计程序时,为了避免有些文件对判断的干扰(比如:文件名为*.c.txt 这样的文件),我们是从文件名末尾开始判断的。

由于由函数接收来的文件名是正常次序的,因此需要另外设定函数将文件名字符串倒置,然后再依据文件名后缀来进行判断筛选。

值得一提的是,文件命名时不区别字母大小写,所以在判断之前要做一下简单的处理,那就是把文件名字符串的字符全部转换成小写或大写,这样就避免了同样的事代码写两遍,显得啰嗦复杂,不简明,使用函数为“stdio.h”头文件下的strlwr( )函数。

相关文档
最新文档