zoukankan      html  css  js  c++  java
  • 第三周作业(三)---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] == '	')
    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] = '';
    13 
    14 }

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

     1 while (!feof(temp)) {
     2         fgets(content, 256, temp);
     3         //printf("%d  %s
    ", charcounter(content), content);
     4         fprintf(output, "
    
    code:%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, "
    
    ----------统计数据汇总---------
    
    有效行:%d 
    无效行: %d 
    注释行: %d 
    字符数: %d 
    单词数: %d 
    ", line, spaceline, noteline, charnum, wordnum);
    14     printf("
    有效行:%d 
    无效行: %d 
    注释行: %d 
    字符数: %d 
    单词数: %d 
    ", 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] = '';
     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] == '	')
     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
    ", filename);
    117     while (!feof(temp)) {
    118         fgets(content, 256, temp);
    119         //printf("%d  %s
    ", charcounter(content), content);
    120         fprintf(output, "
    
    code:%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, "
    
    ----------统计数据汇总---------
    
    有效行:%d 
    无效行: %d 
    注释行: %d 
    字符数: %d 
    单词数: %d 
    ", line, spaceline, noteline, charnum, wordnum);
    130     printf("
    有效行:%d 
    无效行: %d 
    注释行: %d 
    字符数: %d 
    单词数: %d 
    ", line, spaceline, noteline, charnum, wordnum);
    131     printf("
    
    详细信息请看当前目录下同名txt文件
    输入任意数字结束程序
    ");
    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] == '	')
     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	%s
    ", 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("
    有效行:%d 
    无效行:%d 
    注释行:%d 
    字符数: %d 
    单词数: %d 
    ", line, spaceline, noteline, charnum, wordnum);
    102     scanf("%d", &charnum);
    103     return 0;
    104 }
    test.c
  • 相关阅读:
    React组件的生命周期
    机器人api
    智能机器人
    已复制该虚拟机 之后需要的处理工作
    在虚拟机上安装CentOS6.5(minimal)
    fastdfs
    redis安装
    FtpClient上传文件异常:java.net.SocketException: Connection reset
    redis的学习笔记
    git命令2
  • 原文地址:https://www.cnblogs.com/lishida/p/5308378.html
Copyright © 2011-2022 走看看