第三周作业(三)---WordCounter

需求是这样的。写出一个程序,模仿wc.exe,可以统计出文件的一些信息(比如字符数、单词数目等等)

对于这个程序,我仍然用我从大一学来的C语言写的。

第一步:打开文件

1 printf("请输入文件名称");
2     scanf("%s", filename);
3     transName(filename, outputname);
4     if( ((fp = fopen(filename, "r")) == NULL) || ((output = fopen(outputname, "w")) == NULL) ){
5         printf("ERROR: 无法打开统计文件");
6         return 0;
7     }

第二步:读取文件进行处理,这里我采用的是fgets函数来进行按行的读取。

fgets(content, 256, temp); //content: char[] 用来存放读取内容

第三步:对获取到的内容进行处理。

  a)获取内容字符数。这里将出空格换行以及tab以外的其他字符都计入统计。代码如下

1 int charCounter(char *content) {
2     int lengh = strlen(content);
3     for (int i = 0; i < strlen(content); i++)
4     {
5         if (32 == content[i] || 10 == content[i] || content[i] == ‘\t‘)
6             lengh--;
7     }
8     return lengh;
9 }

  b)获取单词数。这里明确,单词应以字母开头,以非字母、数字、点和下划线结尾。所以判断代码如下:

 1 bool IsChar(char c) { //判断首字母是否为英文字符
 2     if ((c >= ‘a‘&&c <= ‘z‘) || (c >= ‘A‘&&c <= ‘Z‘))
 3         return true;
 4     return false;
 5 }
 6
 7 bool IsRight(char c) { //用以判断单词结束
 8     if (IsChar(c) || c == ‘.‘ || c == ‘_‘ || (c <= ‘9‘&&c >= ‘0‘))
 9         return true;
10     return false;
11 }
12
13 int wordCounter(char *content) {
14     int num = 0;
15     int len = strlen(content);
16     for (int i = 0; i < len; i++) {
17         if (IsChar(content[i])) {
18             while (i<len) {
19                 if (!IsRight(content[i++]))
20                 {
21                     num++;
22                     break;
23                 }
24             }
25         }
26     }
27     return num;
28 }

  c)行数的判断运用到了字符数的判断,判断当这行内容字符数不为0时,为非空行。代码如下:

if (charCounter(content))
    line++; //非空行计数+1
else
    spaceline++; //空行计数+1

  d)注释行的判断,针对注释的两种情况,可以在传入内容时传入一个数字flag以确定状态(0:上文中无未结束的"/*" 1:上文中有未结束的"/*")。这样在判断注释行时,首先检察状态。当flag为0时,查找内容,如有"//"则注释行返回true,如有"/*"则将flag置1并返回true。否则,返回false;当flag为1时,只需查找内容中是否有"*/",如有,则置flag为0。这里返回值一定为true。代码如下:

 1 bool IsNoteline(char* content,int* flag) {  //flag 0:当前无多行注释 1:当前有多行注释
 2     if (*flag) {
 3         for (int i = 0; i < strlen(content); i++) {
 4             if (content[i] == ‘*‘ && content[i + 1] == ‘\/‘)
 5             {
 6                 *flag = 0;
 7             }
 8         }
 9         return true;
10     }else {
11         for (int i = 0; i < strlen(content); i++)
12         {
13             if (content[i] == ‘\/‘) {
14                 if (content[i + 1] == ‘\/‘)
15                     return true;
16                 else if (content[i + 1] == ‘*‘)
17                 {
18                     *flag = 1;
19                     return true;
20                 }
21             }
22         }
23         return false;
24     }
25 }

第四步,格式化输出统计信息。这里采用文件及控制窗口两种方式输出。代码如下:

  a)输出文件名称的转换。(默认读取的文件为非txt格式)

  

 1 void transName(char *filename, char *outputname) {//转换文件名,存储统计文件
 2     int i;
 3     for (i = 0; i < strlen(filename); i++) {
 4         if (filename[i] == ‘.‘)
 5             break;
 6         outputname[i] = filename[i];
 7     }
 8     outputname[i] = ‘.‘;
 9     outputname[++i] = ‘t‘;
10     outputname[++i] = ‘x‘;
11     outputname[++i] = ‘t‘;
12     outputname[++i] = ‘\0‘;
13
14 }

  b)输出统计信息,以及将详细信息输出到文件里。

 1 while (!feof(temp)) {
 2         fgets(content, 256, temp);
 3         //printf("%d  %s\n", charcounter(content), content);
 4         fprintf(output, "\n\ncode:%schar:%d  word: %d", content, charCounter(content), wordCounter(content));//统计信息输出到文件
 5         if (charCounter(content))
 6             line++;
 7         else
 8             spaceline++;
 9         charnum += charCounter(content);
10         wordnum += wordCounter(content);
11         noteline += (IsNoteline(content, &flag) ? 1 : 0);
12     }
13     fprintf(output, "\n\n----------统计数据汇总---------\n\n有效行:%d \n无效行: %d \n注释行: %d \n字符数: %d \n单词数: %d \n", line, spaceline, noteline, charnum, wordnum);
14     printf("\n有效行:%d \n无效行: %d \n注释行: %d \n字符数: %d \n单词数: %d \n", line, spaceline, noteline, charnum, wordnum);

注:效果截图如下,末尾处为源代码和测试文件 test.c:

  1 /*
  2     @version 1.0
  3     @author Coder Li
  4     @description
  5         This is a tool for count your code.
  6 */
  7 #include<stdio.h>
  8 #include<string.h>
  9 #include<stdlib.h>
 10
 11 void transName(char *filename, char *outputname) {//转换文件名,存储统计文件
 12     int i;
 13     for (i = 0; i < strlen(filename); i++) {
 14         if (filename[i] == ‘.‘)
 15             break;
 16         outputname[i] = filename[i];
 17     }
 18     outputname[i] = ‘.‘;
 19     outputname[++i] = ‘t‘;
 20     outputname[++i] = ‘x‘;
 21     outputname[++i] = ‘t‘;
 22     outputname[++i] = ‘\0‘;
 23
 24 }
 25
 26 int charCounter(char *content) {
 27     int lengh = strlen(content);
 28     for (int i = 0; i < strlen(content); i++)
 29     {
 30         if (32 == content[i] || 10 == content[i] || content[i] == ‘\t‘)
 31             lengh--;
 32     }
 33     return lengh;
 34 }
 35
 36 bool IsChar(char c) { //判断首字母是否为英文字符
 37     if ((c >= ‘a‘&&c <= ‘z‘) || (c >= ‘A‘&&c <= ‘Z‘))
 38         return true;
 39     return false;
 40 }
 41
 42 bool IsRight(char c) { //判断单词结束
 43     if (IsChar(c) || c == ‘.‘ || c == ‘_‘ || (c <= ‘9‘&&c >= ‘0‘))
 44         return true;
 45     return false;
 46 }
 47
 48 int wordCounter(char *content) {
 49     int num = 0;
 50     int len = strlen(content);
 51     for (int i = 0; i < len; i++) {
 52         if (IsChar(content[i])) {
 53             while (i<len) {
 54                 if (!IsRight(content[i++]))
 55                 {
 56                     num++;
 57                     break;
 58                 }
 59             }
 60         }
 61     }
 62     return num;
 63 }
 64
 65
 66 bool IsNoteline(char* content,int* flag) {  //flag 0:当前无多行注释 1:当前有多行注释
 67     if (*flag) {
 68         for (int i = 0; i < strlen(content); i++) {
 69             if (content[i] == ‘*‘ && content[i + 1] == ‘\/‘)
 70             {
 71                 *flag = 0;
 72             }
 73         }
 74         return true;
 75     }else {
 76         for (int i = 0; i < strlen(content); i++)
 77         {
 78             if (content[i] == ‘\/‘) {
 79                 if (content[i + 1] == ‘\/‘)
 80                     return true;
 81                 else if (content[i + 1] == ‘*‘)
 82                 {
 83                     *flag = 1;
 84                     return true;
 85                 }
 86             }
 87         }
 88         return false;
 89     }
 90 }
 91
 92
 93
 94
 95
 96
 97
 98 int main() {
 99     FILE *fp, *temp, *output;
100     char filename[80],outputname[80];
101     char content[256];
102     int line = 0, spaceline = 0, noteline = 0, flag = 0;
103         //行数统计 line:有效行 spaceline:无效行 noteline:含注释的行 flag:注释行标记
104     int charnum = 0;//字符数统计
105     int wordnum = 0; //单词数统计
106
107     printf("请输入文件名称");
108     scanf("%s", filename);
109     transName(filename, outputname);
110     if( ((fp = fopen(filename, "r")) == NULL) || ((output = fopen(outputname, "w")) == NULL) ){
111         printf("ERROR: 无法打开统计文件");
112         return 0;
113     }
114
115     temp = fp;
116     fprintf(output, "文件名:%s\n", filename);
117     while (!feof(temp)) {
118         fgets(content, 256, temp);
119         //printf("%d  %s\n", charcounter(content), content);
120         fprintf(output, "\n\ncode:%schar:%d  word: %d", content, charCounter(content), wordCounter(content));//统计信息输出到文件
121         if (charCounter(content))
122             line++;
123         else
124             spaceline++;
125         charnum += charCounter(content);
126         wordnum += wordCounter(content);
127         noteline += (IsNoteline(content, &flag) ? 1 : 0);
128     }
129     fprintf(output, "\n\n----------统计数据汇总---------\n\n有效行:%d \n无效行: %d \n注释行: %d \n字符数: %d \n单词数: %d \n", line, spaceline, noteline, charnum, wordnum);
130     printf("\n有效行:%d \n无效行: %d \n注释行: %d \n字符数: %d \n单词数: %d \n", line, spaceline, noteline, charnum, wordnum);
131     printf("\n\n详细信息请看当前目录下同名txt文件\n输入任意数字结束程序\n");
132     scanf("%d", &charnum);
133     fclose(fp);
134     fclose(output);
135     return 0;
136 }

源码

  1 /*
  2     @version 1.1
  3     @author Coder Li
  4     @description    This is a tool for  your code.*/
  5
  6 #include<stdio.h>
  7 #include<string.h>
  8 #include<stdlib.h>
  9
 10 bool IsNoteline(char* content,int* flag) {  //flag 0:当前无多行注释 1:当前有多行注释,找不到多行注释
 11     for (int i = 0; i < strlen(content); i++)
 12     {
 13         if (!(*flag)) {
 14             if (content[i] == ‘\/‘) {
 15                 if (content[i + 1] == ‘\/‘)
 16                     return true;
 17                 else if (content[i + 1] == ‘*‘)
 18                 {
 19                     *flag = 1;
 20                     return true;
 21                 }
 22             }
 23         }
 24         else {
 25             if (content[i] == ‘*‘ && content[i + 1] == ‘\/‘)
 26             {
 27                 *flag = 0;
 28                 return true;
 29             }
 30         }
 31     }
 32     return false;
 33 }
 34
 35 bool IsChar(char c) {
 36     if ((c >= ‘a‘&&c <= ‘z‘)||(c>=‘A‘&&c<=‘Z‘))
 37         return true;
 38     return false;
 39 }
 40
 41 bool IsRight(char c) {
 42     if (IsChar(c) || c == ‘.‘ || c == ‘_‘ || (c <= ‘9‘&&c >= ‘0‘))
 43         return true;
 44     return false;
 45 }
 46
 47 int charcounter(char *content) {
 48     int lengh = strlen(content);
 49     for (int i = 0; i < strlen(content); i++)
 50     {
 51         if (32 == content[i] || 10 == content[i] || content[i] == ‘\t‘)
 52             lengh--;
 53     }
 54     return lengh;
 55 }
 56
 57 int wordcounter(char *content) {
 58     int num = 0;
 59     int len = strlen(content);
 60     for (int i = 0; i < len; i++) {
 61         if (IsChar(content[i])) {
 62             while(i<len){
 63                 if (!IsRight(content[i++]))
 64                 {
 65                     num++;
 66                     break;
 67                 }
 68             }
 69         }
 70     }
 71     return num;
 72 }
 73
 74 int main() {
 75     FILE *fp, *temp, *output;
 76     char filename[256];
 77     char content[1024];
 78     int line = 0, spaceline = 0 , noteline = 0 , flag = 0; //行数统计 line:有效行 spaceline:无效行 noteline:含注释的行 flag:注释行标记
 79     int charnum = 0;//字符数统计
 80     int wordnum = 0; //单词数统计
 81     output = fopen("output.txt", "w");
 82     printf("请输入文件名称");
 83     scanf("%s", filename);
 84     if ((fp = fopen(filename, "r")) == NULL) {
 85         printf("ERROR: 无法打开文件");
 86         return 0;
 87     }
 88     while (!feof(fp)) {
 89         fgets(content, 100, fp);
 90         fprintf(fp,"%d%s", charcounter(content), content);
 91         printf("%d\t%s\n", charcounter(content), content);
 92         if (charcounter(content))
 93             line++;
 94         else
 95             spaceline++;
 96         charnum += charcounter(content);
 97         wordnum += wordcounter(content);
 98
 99         noteline += IsNoteline(content, &flag) ? 1 : 0;
100     }
101     printf("\n有效行:%d \n无效行:%d \n注释行:%d \n字符数: %d \n单词数: %d \n", line, spaceline, noteline, charnum, wordnum);
102     scanf("%d", &charnum);
103     return 0;
104 }

test.c

时间: 2024-10-24 16:12:02

第三周作业(三)---WordCounter的相关文章

马哥2016全新Linux+Python高端运维班第三周作业作答

                    马哥2016全新Linux+Python高端运维班第三周作业                                           1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可.     [[email protected] ~]# who | awk '{print $1 $NF}'| uniq -d     [[email protected] ~]# who     yicx     :0  

解题报告——-2018级2016第二学期第三周作业

解题报告——2018级2016第二学期第三周作业 A:[NOIP2002P]过河卒 题目: 描述 如图,A 点有一个过河卒,需要走到目标 B   点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例 如上图 C  点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点. 棋盘用坐标表示,A 点(0,0).B 点(n,m)(n,m 为不超过 20  的整数,并由键盘输入)

魏昊卿——《Linux内核分析》第三周作业:Linux系统启动过程

魏昊卿——<Linux内核分析>第三周作业:Linux系统启动过程 一.实验部分 实验指导 使用实验楼的虚拟机打开shell 1 cd LinuxKernel/ 2 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动完成后进入menu程序(<软件工程C编码实践篇>的课程项目),支持三个命令help.version和quit,您也可以添加更多的命令,对选修过<软件工程C编码实践篇>

第三周作业(一)VS安装及单元测试练习

第三周作业(一) 需求:练习教科书第22~25页单元测试练习,要求自行安装Visual Studio开发平台,版本至少在2010以上,要求把程序安装过程和练习过程写到博客上,越详细越好,要图文并茂,没有书的同学可以向班内助教同学借阅. 1.visual studio 开发平台安装 事实上我对Visual Studio了解不多,只知道支持的编程语言多,用的人也挺多,功能强大.至于到底好在哪里,还是要用上一阵自己体验一下才知道.听同学说VS2015有些卡,所以这里我选择了VS2013. 如图,具体版

2017-2018-2《网络攻防实践》第三周作业

第三周作业: 第一节:第三章学习: 1.1网络信息收集 网络信息收集的目的是尽可能了解目标,这包括目标的漏洞IP地址范围,外部网络阔朴结构等. 1.2网络信息收集方法 网络踩点: Web搜索与挖掘(Google Hacking,百度,雅虎) IP与DNS查询 1.3 网络拓扑侦察 tracert也被称为Windows路由跟踪实用程序,在命令提示符(cmd)中使用tracert命令可以用于确定IP数据包访问目标时所选择的路径.本文主要探讨了tracert命令的各个功能 1.3 网络扫描 网络踩点相

5月15日----疯狂猜成语-----三周第三次站立会议 参会人员:杨霏,袁雪,胡潇丹,郭林林,尹亚男,赵静娜

疯狂猜成语-----三周第三次站立会议 参会人员:杨霏,袁雪,胡潇丹,郭林林,尹亚男,赵静娜 会议内容:总结自己的工作任务,验收自己的任务成果,领取明日任务.并且在会议上讨论我们的最后作品要求以及离最终效果的距离. 已经完成任务: 小组成员 已完成的任务 尹亚男    袁雪 数据资料收集完毕 郭林林 高级游戏代码基本成型,正在进行测试 胡潇丹 高级游戏的数据库基本建成 杨霏 后台代码连接完成 赵静娜 记录会议内容,总结会议 明日任务: 小组成员 计划任务 尹亚男 优化游戏界面,实现图片图标的转换

三周第三次课(12月27日) 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录

三周第三次课(12月27日)3.7 su命令3.8 sudo命令3.9 限制root远程登录 su命令: 用户和工作组管理: su命令用于切换当前用户身份到其他用户身份, 变更时须输入所要变更的用户帐号与密码. 语法: su(选项)(参数) 选项: -c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份: -f或--fast:适用于csh与tsch,使shell不用去读取启动文件: -l或--login:改变身份时,也同时变更工作目录,以及HOME,SHE

【作业】第三周作业

从第三周开始,作业不再是是老师布置,因为这个时候,你们基本上都开始做项目了, 于是, 作业的来源: 1.书上的课后作业 2.课件上面的随堂讨论或作业 3.你瞎想到的问题 4.[推荐]在实际项目中,结合软件工程知识点,提出作业 最为推荐第四种方式,比如, 关于白盒测试的知识点,结合你的项目实践,就可以得出如下题目: 白盒测试有几种,请结合你的代码片段,一一举例说明,并给出测试用例. 作业的评分,还是10/5/0,三种,请参见: http://www.cnblogs.com/jerry1979/p/

软件工程_东师站_第三周作业

身体是革命的本钱,这话一点不假,白天昏沉,晚上发烧,一直不好,啥都干不动.   代码行数 博客字数 知识点 第一周 400 430 见我博客软件工程——师大站1 第二周 0 5200 见我博客软件工程_东师站_课堂笔记 第三周 0 63 站立会议.单元测试

第三次作业三总结与心得

知识点总结: 1.调用幂函数pow()生成乘方表 power=pow(); 2.#include<math.h>程序中调用了数学函数,需包含头文件math.h 3.调用自定义函数fact(i)计算i! product=fact(i); 4.double fact(int n);自定义函数的声明,以分号结束 5.double product;变量product用于存放结果(阶乘的值) 6.return product;将结果送回主函数 7.定义求n!的函数double fact(int n)函数