标题:编写一个程序统计一个C源文件中注释所占的百分比,大佬们看看怎么编写呢?
只看楼主
第五先生
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2020-5-7
结帖率:40%
 问题点数:0 回复次数:9 
编写一个程序统计一个C源文件中注释所占的百分比,大佬们看看怎么编写呢?
一个好的程序要有一定比例的注释。编写一个程序统计一个C源文件中注释所占的百分比。百分比计算公式为:程序注释中有效字符总数(/*和*/之间的所有非空白字符,不包括/*和*/)除以程序文件中总有效字符数(程序文件中的所有非空白字符),空白字符包括空格符、回车换行符和制表符。
注:只简单考虑/*…*/的注释,不要考虑其它复杂情况,但要考虑注释跨行的情况。
 
【输入形式】
 
从当前目录下的filein.c源程序文件获得输入。
 
【输出形式】
 
向控制台输出注释所占百分比,百分数无小数(小数部分直接截掉,不要四舍五入),后跟百分号%。
 
【样例输入】
 
假设filein.c的内容为:
 
#include <stdio.h>
void main()
{
    FILE * in;
    /*Open the file*/
    if((in=fopen("in.txt","r"))==NULL)
    {
       printf("Can’t open in.txt!");
       return;
    }
    /*Close the file,
    and return.*/
    fclose(in);
}
 
【样例输出】
 
21%
 
【样例说明】
 
filein.c文件的总字符数为160,注释中的字符数为34,则注释所占百分比为21%。
 
【评分标准】
 
该题要求输出注释所占百分比,共有5个测试点。上传C语言文件名为exam3.c。
搜索更多相关主题的帖子: 注释 编写 输出 百分比 字符 
2020-06-03 18:52
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
俺倒是写了一个,但实在整不出总数160

#include <stdio.h>

void main(void)
{
    FILE *fin = fopen("filein.c", "r");
    long n_char = 0;
    long n_comment = 0;
    int c, d;

    while ((c = fgetc(fin)) != EOF) {
        ++n_char;
        if (c == '/')
            if ((d = fgetc(fin)) == '*') {
                ++n_char;
                c = fgetc(fin);
                ++n_char;
                d = fgetc(fin);
                ++n_char;
                while (c != '*' || d != '/') {
                    ++n_comment;
                    c = d;
                    d = fgetc(fin);
                    ++n_char;
                }
            }
    }
    fclose(fin);
    printf("n_char = %ld\n", n_char);
    printf("n_comment = %ld\n", n_comment);
    printf("%ld%%\n", n_comment * 100 / n_char);
}

梦想拥有一台龙芯3A-4000
2020-06-03 21:20
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
审题有误

[此贴子已经被作者于2020-6-5 03:56编辑过]


梦想拥有一台龙芯3A-4000
2020-06-05 03:49
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
程序代码:
#include <stdio.h>

int main(int argc, char **argv)
{
    FILE *fin = fopen("filein.c", "r");
    long n_char = 0;
    long n_comment = 0;
    int c, d;

    while ((c = fgetc(fin)) != EOF) 
    {
        if (c == '/') 
        {
            ++n_char;
            if ((d = fgetc(fin)) == '*') 
            {
                ++n_char;
                c = fgetc(fin);
                if (!(c == ' ' || c == '\n' || c == '\t'))
                    ++n_char;
                d = fgetc(fin);
                if (!(d == ' ' || d != '\n' || d == '\t'))
                    ++n_char;
                while (c != '*' || d != '/') 
                {
                    if (!(c == ' ' || c == '\n' || c == '\t'))
                        ++n_comment;
                    c = d;
                    d = fgetc(fin);
                    if (!(d == ' ' || d == '\n' || d == '\t'))
                        ++n_char;
                }
            }
        }
        else if (!(c == ' ' || c == '\n' || c == '\t'))
        {
            ++n_char;
        }
    }
    fclose(fin);
    printf("n_comment =\t%ld\n", n_comment);
    printf("n_char =\t%ld\n", n_char);
    printf("\t\t%ld%%\n", n_comment * 100 / n_char);
    return 0;
}

梦想拥有一台龙芯3A-4000
2020-06-05 07:19
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
(1)printf("\t\t%ld%%\n", (n_char == 0) ? 0 : n_comment * 100 / n_char);
(2)#define也没写,呵呵

梦想拥有一台龙芯3A-4000
2020-06-05 09:03
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
发现一个重大错误……

呼叫r版 - 呼叫r版

梦想拥有一台龙芯3A-4000
2020-06-05 10:25
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 6楼 ditg
不会,瞎写了一个

程序代码:
#include <stdio.h>
#include <stdbool.h>

int main( void )
{
    FILE* fin = fopen( "filein.c", "r" );

    unsigned n_char = 0;
    unsigned n_comment = 0;
    bool in_comment = false;
    for( int pre_char=0,ch; ch=fgetc(fin),ch!=EOF; pre_char=ch )
    {
        if( ch!=' ' && ch!='\n' && ch!='\t' )
        {
            ++n_char;

            if( in_comment )
                ++n_comment;
        }

        if( !in_comment && pre_char=='/' && ch=='*' )
        {
            in_comment = true;
        }
        else if( in_comment && pre_char=='*' && ch=='/' )
        {
            in_comment = false;
            n_comment -= 2;
        }
    }

    fclose(fin);
    printf( "%u%%\n", n_comment*100/n_char );
}

2020-06-08 09:10
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
r版,您的这个字符数感觉计算结果可能是162

俺的d != '\n'调试的时候整错了,反正结果162,晚上再试试,谢谢指教!

梦想拥有一台龙芯3A-4000
2020-06-08 11:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 8楼 ditg
题主的例题中有个中文全角字符
Cant
我也不知道这种情况下,“”算是一个字符还是两个字符。

如果将“”改为“'”的话,我的程序算出一共有160个字符。
2020-06-08 12:33
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
回复 9楼 rjsp
应该是这个问题

梦想拥有一台龙芯3A-4000
2020-06-08 13:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501950-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.191559 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved