读入一个C程序,统计程序中代码行数、注释行数、注释总字数、和空行的行数以及统计自定义函数的个数并计算出平均行数 ,并利用统计信息分析评价该程序的风格。 [基本要求] )把C程序文件作为TEXT文件读入源程序; (2)边读入程序,边识别统计代码行、注释行相空行,同时还要识别过程函数的开始 和结束,以便统计其个数和平均行数。,用c语言实现
时间: 2024-02-12 16:05:56 浏览: 180
好的,我可以为您提供一个用C语言实现的程序,用于统计C程序中的代码行数、注释行数、注释总字数、空行数和自定义函数数量,并计算出平均行数。程序的基本逻辑如下:
1. 打开C程序文件,逐行读入文件内容。
2. 对于每一行,识别其类型(代码行、注释行、空行、函数开始行、函数结束行),并进行相应的计数。
3. 如果当前行是函数开始行,则记录函数名和起始行号。
4. 如果当前行是函数结束行,则根据起始行号和结束行号计算出该函数的行数,并进行相应的计数(函数数量和总行数)。
5. 在读取完整个文件后,根据计数结果进行统计和分析,输出相应的结果和风格评价。
以下是一个简单的C程序,用于实现上述逻辑:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_LINE_LEN 1024
/* 函数名和起始行号 */
typedef struct {
char name[MAX_LINE_LEN];
int start_line;
} FunctionInfo;
int main(int argc, char *argv[]) {
FILE *fp;
char line[MAX_LINE_LEN];
int code_lines = 0, comment_lines = 0, comment_chars = 0, blank_lines = 0;
int total_lines = 0, function_lines = 0, function_count = 0;
int in_comment = 0, in_function = 0, function_start = 0;
FunctionInfo *functions = NULL;
if (argc < 2) {
printf("Usage: %s <filename>\n", argv[0]);
exit(1);
}
fp = fopen(argv[1], "r");
if (!fp) {
printf("Failed to open file: %s\n", argv[1]);
exit(1);
}
/* 逐行读取文件内容 */
while (fgets(line, MAX_LINE_LEN, fp)) {
total_lines++;
/* 去除行末空格和换行符 */
int len = strlen(line);
while (len > 0 && isspace(line[len - 1])) {
line[--len] = '\0';
}
if (len == 0) {
/* 空行 */
blank_lines++;
} else if (line[0] == '/' && line[1] == '/') {
/* 单行注释 */
comment_lines++;
in_comment = 1;
} else if (line[0] == '/' && line[1] == '*') {
/* 多行注释开始 */
comment_lines++;
in_comment = 1;
comment_chars += strlen(line) - 2;
} else if (line[0] == '*' && line[1] == '/') {
/* 多行注释结束 */
comment_lines++;
in_comment = 0;
comment_chars += strlen(line) - 2;
} else if (in_comment) {
/* 多行注释 */
comment_lines++;
comment_chars += strlen(line);
} else if (line[0] == '#') {
/* 预处理指令 */
code_lines++;
} else if (line[0] == '}') {
/* 函数结束行 */
code_lines++;
in_function = 0;
function_lines += total_lines - function_start + 1;
} else if (in_function) {
/* 函数内部 */
code_lines++;
} else {
/* 函数开始行 */
code_lines++;
in_function = 1;
function_start = total_lines;
function_count++;
functions = realloc(functions, function_count * sizeof(FunctionInfo));
strcpy(functions[function_count - 1].name, line);
functions[function_count - 1].start_line = function_start;
}
}
fclose(fp);
/* 计算平均行数和注释行比例 */
double avg_function_lines = (double) function_lines / function_count;
double comment_ratio = (double) comment_lines / total_lines;
/* 输出统计结果 */
printf("Code lines: %d\n", code_lines);
printf("Comment lines: %d\n", comment_lines);
printf("Comment chars: %d\n", comment_chars);
printf("Blank lines: %d\n", blank_lines);
printf("Function count: %d\n", function_count);
printf("Average function lines: %.2f\n", avg_function_lines);
printf("Comment ratio: %.2f%%\n", comment_ratio * 100);
/* 输出风格评价 */
printf("Code style: ");
if (code_lines == 0) {
printf("D\n");
} else if (comment_lines == 0) {
printf("C\n");
} else if (comment_ratio < 0.1) {
printf("B\n");
} else {
printf("A\n");
}
printf("Comment style: ");
if (comment_ratio == 0) {
printf("D\n");
} else if (comment_ratio < 0.2) {
printf("C\n");
} else if (comment_ratio < 0.5) {
printf("B\n");
} else {
printf("A\n");
}
printf("Blank line style: ");
if (blank_lines == 0) {
printf("D\n");
} else if (blank_lines < code_lines / 4) {
printf("C\n");
} else if (blank_lines < code_lines / 2) {
printf("B\n");
} else {
printf("A\n");
}
free(functions);
return 0;
}
```
这是一个简单的实现,可能存在一些漏洞和不足。您可以根据需要进行修改和完善。
阅读全文
相关推荐


















