c++ while干什么的才刚刚学女人这东西 电子书看下我代码中是什么意思。空注释求详细解释下。谢谢

C++统计代码注释行数 & 有效代码行数 & 代码注释公共行 & 函数个数 - 未
名 - 博客园
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&北国风光,千里冰封,万里雪飘。
江山如此多娇,引无数英雄竞折腰。
posts - 5, comments - 2, trackbacks - 0, articles - 0
问题来源,在14年的暑假的一次小项目当中遇到了一个这样的问题,要求统计C++代码的注释行数,有效代码行数,代码注释公共行数,以及函数个数。
下面稍微解释一下问题,
1)注释行数:指有注释的行,包括有代码和注释的公共行(如:3,4,15,22...)
2)有效代码行:指有代码的行,包括有代码和注释的公共行(如:1,4,11,15,25....)
3)代码注释公共行:指又有代码又有注释的行(如:4,15...)
4)函数个数:这个不用说明了吧。
以下为注释情况展示代码:
1 #include &stdio.h&
3 //follow is a common line
4 void swap(char *p/* = NULL */)
printf("this is a function /*is not comments*/");
9 int main(void)
int a = 10;
char *p = NULL;
//common line
if (10 == a)
printf("//is not comments");
//pure comments/*no use*/
printf("not use\n");*/
b = 3;/*i'm a comment*/ a = 5; /*comments line
pure //"*/......"look there*/
printf("test \" escape char");
//and the follow,maybe affect the count of function
if (*p == '{')
printf("the '{' is a question\n");
上面的这个代码片段,已经基本上展示了各种注释可能出现的情况,接着我们来分析一下注释出现的位置:
一、&//&双斜杠注释
1)可能出现在行头部,如:第3行;
2)可能出现在行末尾,如:第15行;
注意:第18行,第26行。第18行中,//位于双引号中,注释失效;第26行中,//位于/**/注释中,//失效。
二、&/**/&斜杠星注释
1)可能出现在函数参数里,如:第4行;
2)可能注释一个段落,如:22,23行;
3)也可能出现在代码中部,如25,26行那样的复杂注释;
注意:第20行,第26行。第20行,/**/位于//注释中,失效。第26行,有一个*/位于&&中,*/失效。
好了,位置分析完毕,下面分析一下如何设计算法:
三、具体算法设计思路
1)解决文件读取
这里我们用c++文件读取,每次读取一行,将读取结果放到string变量里面,这样string变量尾部自动为'\0'。我们用于判断行尾部。
2)双引号问题
由于双引号里面的内容都是无效的,所以我们可以直接来个过滤双引号里面的内容。(具体实现见代码)
3)单引号问题
上面的展示代码里面也看到了,单引号里面的内容(如:if (ch == '{'))可能会影响函数个数的统计,所以我们需要过滤单引号。
这个最简单,如果string为空就是空行。包括(\t\n\r' '等等,无效字符,都算空行)。
5)&//&注释
这个较为简单,遇到//就可以进行统计,同时该行也不需要继续遍历了,直接然后读取下一行。
6)&/**/&注释
较麻烦,我们这里用到了代码标记,注释标记,同时还设置了当遍历到行最尾部的时候,才进行行数统计,这样避免了一行被统计多次。(具体实现见代码)
7)函数个数
首先说一下统计思路,我们统计函数的时候,只是以大括号({})为统计标记。用栈来表示,遇到左括号,入栈;遇到右括号,弹出一个左括号。知道弹到栈空,函数个数+1,
这样的话,就实现了只保留最外层那对{},里层的括号全部抵销。我们又想了一下,简化了一下,不用栈,直接用一个变量来表示括号个数,遇到左括号,++top;遇到右括号--top,直到top==0,也就相当于栈空,函数个数+1。
其实如下代码的函数个数统计还有问题:
示例:对于类、结构体、枚举体、全局数组,会被统计为一个函数。也就是说,那些在函数体外面的,但是又带有大括号({})的代码,都会被识别为函数。
以下为实现代码:
1 #include &iostream&
2 #include &fstream&
3 #include &string&
4 using namespace
6 int main(void)
string line="";
ifs.open("Test.cpp");
cout&&"文件打开失败"&&
//////////////////////////////////////////////
//标记:双引号 斜杠星
int bSyh = 0, bXgx = 0, bHs = -1, bCode = 0, bZs = 0;
/////////////////////////////////////////////
//个数:空行
int i,nKh = 0, nZs = 0, nDm = 0, nGg = 0, nHs = 0;
while (!ifs.eof())
getline(ifs,line);
//读取一行文件
bCode = 0;
//该行没有代码
//该行没有注释
//bXgx 斜杠星注释标记
//该行有注释
//过滤无效符号
while (line[i] == ' ' || line[i] == '\t' || line[i] == '\r' || line[i] == '\n')
//&以下为空行统计区域:开始&
if (!bXgx && line[i] == '\0')
//&空行统计:结束&
//第一次遇到双引号
引号为非转义字符(\")
if (!bSyh && line[i] == '\"' && ((i & 0 && line[i-1] != '\\') || (i == 0)))
//&正在进行双引号屏蔽....&
//& \&结束&
if (line[i] == '\"' && ((i & 0 && line[i-1] != '\\') || (i == 0)))
else if (line[i] == '\0')
if (bCode)
if (bZs && bCode)
//遇到单引号(避免'{','}'),且非转义字符\',连续跳过3个(第二个'后位置)
if (line[i] == '\'' && ((i & 0 && line[i-1] != '\\') || (i == 0)))
//&//注释行&
if (!bXgx && line[i] == '/' && line[i+1] == '/')
if (bCode)
//&前有代码,混合注释行&
//纯注释行
//跳出当前行(即,内while循环),&//&后代码不做判断
//&/*注释开始&
if (!bXgx && line[i] == '/' && line[i+1] == '*')
//跳过/*符号
//标记&/*&开始
//&发现注释&
//&正在进行多行注释....&
//&*/注释结束&
if (line[i] == '*' && line[i+1] == '/')
//&跳过*/&注意后有一个 ++i;
else if (line[i] == '\0')
if (bCode)
//注释前有代码,即&混合行&
//&纯注释&
if (line[i] == '\0')
if (bCode)
if (bZs && bCode)
//&以下全是有效代码区域&
//&函数个数统计区域:开始&
if (line[i] == '{')
//记录函数左括号
else if (line[i] == '}') //遇到函数右括号
if (bHs == 0)
//&发现一个函数&
//&函数统计:结束&
bCode = 1;
//能执行到这里,说明该行存在代码
cout&&"注释: "&&nZs&&
cout&&"代码: "&&nDm&&
cout&&"空行: "&&nKh&&
cout&&"公共: "&&nGg&&
cout&&"函数: "&&nHs&&
&原文地址:C++课程设计的问题,谁帮我注释翻译一下,急~~_百度知道11065人阅读
3) C++(59)
当你阅读别人的代码时如果没有注释那会是件比较痛苦的事.一说到注释我们马上想到是通过//或/* */这样来添加一些描述信息.这只是狭义的注释.
广义的注释我们可以理解为,任何有助于理解代码的信息都可以看成注释.
我们可以把写代码和写文章类比下.自然语言会有词法,句法,语义这几个概念.代码中的语法和句法就相当于一个编程语言中的基本语法规范.这是我们学习一门编程语言必须掌握的.所以注释的时候一般不会涉及到这些信息.
注释主要涉及到语义的描述.语义从大的方向,软件产品面向的应用来说,就是要解决的问题本身的逻辑,如果是些应用软件也可以叫业务逻辑.我们把业务逻辑理清头绪后就会来个啥数据建模之类的.然后写设计文档之类的,有啥概要设计与详细设计,这些文档可以看成非常重要的注释.
然后就是写到代码里的注释了,通过//或/* */标识出来.还有一种注释叫自我注释,就是通过函数或变量名字就得得到一些有用的信息
这里主要讲下用//或/* */做的注释
用// 还是/* */就看你自己的偏好了.最重要的是保持一致,就是在一个项目中大家达成一致,全部用哪一种或者在某个地方用//,另外的地方用/* */
注释的位置及常见内容
1.文件注释
在C++的代码都是分布在一个个的头文件和源文件中,如果是用的VS则是h后缀文件和cpp后缀文件. 当然了有时你用以内联函数还可能会有inl文件.每个文件的开头部分你可以添加注释信息.
内容一般是:版权,作者,编写日期,功能描述.例如
/**************************************************************************
Copyright:MyCompany
Author: Arwen
Description:Provide& functions& to connect Oracle
**************************************************************************/
//Copyright:MyCompany
//Author: Arwen
//Description:Provide functions to connect Oracle
有时如果修改了代码,还可以添加修改人,日期,修改内容有目的这些信息.
一般是简单的说下这个类的功能,如果你在文件开头已经描述了这里也可以省略.如果要注释的话就可以这样简单的描述下.
// COleDataObject -- simple wrapper for IDataObject
class COleDataObject
/*COleDataObject -- simple wrapper for IDataObject*/
3.函数注释
描述函数的功能及参数,其他相关信息.例如
//Summary:& connect the database
//Parameters:
//&&&&&&&connInfo:A class contains the connect info ,such as user name ,pwd,etc.
//&&&&&& directConnect : use TNS name or use direct connection info
//Return : true is connect successfully.
bool ConnectDatabase(ConnectInfo connInfo, bool directConnect);
*Summary: connect the database
*Parameters:
*&&&& connInfo:A class contains the connect info ,such as user name ,pwd,etc.*&&&&
*&&&& directConnect : use TNS name or use direct connection info
*Return : true is connect successfully.
4.变量注释
一个变量如果代表的意思不容易从变量名看出来,而且又挺重要的话最好也加点注释.例如
UINT m_nGrowBy;&&&& // number of cache elements to grow by for new allocs
UINT m_nGrowBy;&&&& /* number of cache elements to grow by for new allocs*/
5.实现注释
在一些逻辑性很强,不容易理解的代码块前添加注释.特别是是像一些算法,看起来就几行,但想个半天都未必明白到底是啥意思来着.
// copy elements into the empty space
&while (nCount--)
&&&&& m_pData[nIndex++] = newE
还有就是如果想针对函数的某些个参数做些注释,那最好把参数分几行写.
void MyFunction(string name, //This is my name
&&&&&&&&&&&&&&&&&&&&&&&&&int age)
另外有时一个函数很长,里面有奶多个大括号{ } ,这样一嵌套,有时你不知道谁对应谁了,你要往里面插入代码就容易出错.你也可以在些结尾的大括号加个注释,表明它是哪个if或while语句的结束处.
在C#中是可以通过#region 加 #endregion 来做注释.同时开发环境VS能提供支持让你方便的折叠这样注释的代码.
VS也支持在C++中通过#pragma region 与 #pragma endregion
来做注释,但这在其它编译器中不会被识别,所以需要考虑到跨平台的话或者会使用不同的编译器的话就最好别用.
6.TODO 注释
todo的意思就是待做的事.比如你代码写了一半,然后下班了.为了方便你第二天很快的找到那具体地方,或者防止你忘记.就可以用todo注释下.因为一些开发环境提供了对它的支持,可以让你方便的找到哪些个地方有todo注释,起个书签的作用.你选View--&Task List,然后在下面的下拉列表中选择comments就会列出所有TODO注释信息.
另外你也可以写个TODO留着以后实现那功能也行,注释信息一般可以写上你的名字和邮箱,然后说下待实现的功能或其他事项
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:973479次
积分:11954
积分:11954
排名:第793名
原创:281篇
评论:119条
(2)(1)(1)(2)(1)(1)(1)(2)(2)(4)(1)(3)(1)(4)(2)(3)(14)(7)(5)(12)(43)(14)(12)(4)(24)(35)(23)(1)(1)(13)(5)(1)(1)(4)(30)(3)(1)看到很多C++代码中写cin.get()后面注释说这是吸收回车符,不知道是什么意思!_百度知道岳麓生活网
解释一下这段C++代码是什么意思
代码如下,我知道是什么意思,但是这个代码有更深的意义,能不能解释的更加优美一点(特别是for那个地方)。for(int i=0;i30)changeJob(Boss);}
推荐答案:这段代码是最最基本的循环,看来出什么"更深的意义"for(int i=0;i
其他答案:
把字符串前半字符与后半字符交换,如第一个字符与最后一个字符交换,第二个字符与倒数第二个字符交换,直到字符串中间
这是一个单向链表,目的是使链表中的数据data递减排列,最后返回头结点L
H1是一个临时变量,最后free释放
p最后指向尾节点~~
类成员啊 serveraddr好比班级,就像sin_family好比班级中的某一个学生
%*d是抑制赋值的意思,即让scanf匹配一个%d,但不将这个%d赋值给变量。这里的话,i=第一个数,j=第三个数,k并没有被赋值。
整个程序主要是从uart接受字符,并打印出来。详细看代码后的注释。
void Main(void){...
uart_printf(\n);
uart_printf(szLogo);
else //如果不是换行,这指针...
文件没用。。
请给完整代码和
C:\windows\date.ini
C:\w.ini
整体的输出是个带星期的日历,每列的日期同为星期一、二等等。 给for做了个注释,希望采纳!如有问题欢迎继续交流!
if(L->elem[j]==x)
return(j+1);
return(0);
int sqInsert(SqList *L,elemtype x,int i) // 注意大小写,SqList 应改为sqList
if(in+1) // 应该是i&g...
代码中。这段代码是用Adapter控件,填充dataSet的ReadDetails数据表。即把数据库的内容,放到本地缓存中。 Else 如果TextBox的内容不为空时 Dim c As String If Me.RadioBu...
这小伙子还真是急性子
给你个实例附带相关解释:
连接到SAMPLE数据库,查询LASTN... SQL开始,表明它是一条SQL语句。这也是告诉预编译器在EXEC SQL和;之间是嵌入S...

我要回帖

更多关于 男人这东西 电影 的文章

 

随机推荐