“三天打鱼两天晒网”C++以及编程风格要求

/* *程序名:三天打鱼两天晒网
   *计算渔夫在指定的日期做什么事
   *姓名:侯明会
   *日期:2019/3/1
*/
#include<iostream>
using namespace std;
class Date
{public:
    int year;
	int month;
	int day;
	Date(){};
	Date(int y,int m,int d):year(y),month(m),day(d){}
	int Set();                                         //输入指定日期的函数
};	
int k=1;                                               //用来做验证循环 
int Date::Set()
{
	cout<<"请输入指定日期:"<<endl;
	cin>>year>>month>>day;
	return 0;
}
int Count(Date a1,Date a2)                              //计算起始日期到指定日期的天数
{
	int sum=0;                                          //总天数 
	for(int i=a1.year;i<a2.year;i++)                    //计算2010年到指定年的前一年的天数
	{
		if(i%4==0&&i%100!=0||i%400==0)                  //为闰年
			sum+=366;
		else sum+=365;                                  //为平年
	}
	int mon[2][13]={                                    //平均每月的天数
		{0,31,28,31,30,31,30,31,31,30,31,30,31},
        {0,31,29,31,30,31,30,31,31,30,31,30,31}
	};
	if(a2.year%4==0&&a2.year%100!=0||a2.year%400==0)    //指定年为闰年,2月份天数为29天 
		for(int j=0;j<a2.month;j++) sum+=mon[1][j];
	else for(int k=0;k<a2.month;k++) sum+=mon[0][k];    //指定年为平年,2月份天数为28天 
	sum+=a2.day;                                        //计算总天数
	return sum;
}
int test(Date a)                                        //验证数据的正确性 
{
    if(a.year<2010||a.year>2100||a.month<1||a.month>12) //输入年份和月份要考虑事实以及渔夫的年纪 
	{
		cout<<"输入的日期不符合事实,请重新输入:"<<endl;
		k=1;
		return 0;
	}
	switch(a.month)                                     //对一定天数的月份验证输入天数的正确性 
	{
		case(1): if(a.day<1||a.day>31) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
		case(3): if(a.day<1||a.day>31) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
		case(4): if(a.day<1||a.day>30) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
		case(5): if(a.day<1||a.day>31) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
		case(6): if(a.day<1||a.day>30) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
		case(7): if(a.day<1||a.day>31) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
		case(8): if(a.day<1||a.day>31) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
		case(9): if(a.day<1||a.day>30) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
		case(10): if(a.day<1||a.day>31) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
		case(11): if(a.day<1||a.day>30) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
		case(12): if(a.day<1||a.day>31) {cout<<"输入的日期不符合事实,请重新输入:"<<endl;k=1;}break;
	} 
	if(a.month==2)                                      //2月份在闰年有29天,平年有28天,因此要单独验证 
	{
		if(a.year%4==0&&a.year%100!=0||a.year%400==0)   //若为闰年 
		{
			if(a.day<1||a.day>29) 
			{
				cout<<"输入的日期不符合事实,请重新输入:"<<endl;
				k=1;
			}
		}
		else                                            //若为平年 
		{
			if(a.day<1||a.day>28) 
			{
				cout<<"输入的日期不符合事实,请重新输入:"<<endl;
				k=1;
			}		 
		}
	}
	return 0;	
} 
int main()
{
	Date a1(2010,01,01);                               //a1代表起始日期,a2代表指定日期
	Date a2;
	while(k)                                           //当数据验证错误时,重新输入 
	{
		k=0;                                           //数据正确时用来跳出循环 
		a2.Set();
		test(a2);
	} 
	int day;                                          //代表总天数模5的余数 
	day=Count(a1,a2)%5;                               //打渔和晒网5天一循环,判断余数为几,可计算出渔夫在做什么 
	if(day>3) cout<<"该渔夫那一天在晒网"<<endl;       //余数大于3时,说明渔夫在晒网 
	else cout<<"该渔夫那一天正在打渔"<<endl;
	return 0;
}

JAVA及C/C++的编程风格要求
华为公司:
代码总体原则
1、清晰第一
清晰性是易于维护、易于重构的程序必需具备的特征。代码首先是给人读的,好的代码应当可以像文章一样发声朗诵出来。
简洁为美
简洁就是易于理解并且易于实现。代码越长越难以看懂,也就越容易在修改时引入错误。写的代码越多,意味着出错的地方越多,也就意味着代码的可靠性越低。因此,我们提倡大家通过编写简洁明了的代码来提升代码可靠性。
选择合适的风格,与代码原有风格保持一致
产品所有人共同分享同一种风格所带来的好处,远远超出为了统一而付出的代价。在公司已有编码规范的指导下,审慎地编排代码以使代码尽可能清晰,是一项非常重要的技能。
头文件
1.头文件中适合放置接口的声明,不适合放置实现
2.头文件应向稳定的方向包含。
说明:头文件的包含关系是一种依赖,一般来说,应当让不稳定的模块依赖稳定的模块,从而当不稳定的模块发生变化时,不会影响(编译)稳定的模块。
3.头文件应当职责单一。
说明:头文件过于复杂,依赖过于复杂是导致编译时间过长的主要原因。很多现有代码中头文件过大,职责过多,再加上循环依赖的问题,可能导致为了在.c中使用一个宏,而包含十几个头文件。
每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口。
说明:如果一个.c文件不需要对外公布任何接口,则其就不应当存在,除非它是程序的入口,如main函数所在的文件。
5.禁止头文件循环依赖。
说明:头文件循环依赖,指a.h包含b.h,b.h包含c.h,c.h包含a.h之类导致任何一个头文件修改,都导致所有包含了a.h/b.h/c.h的代码全部重新编译一遍。而如果是单向依赖,如a.h包含b.h,b.h包含c.h,而c.h不包含任何头文件,则修改a.h不会导致包含了b.h/c.h的源代码重新编译。
函数
1.重复代码应该尽可能提炼成函数。
说明:重复代码提炼成函数可以带来维护成本的降低。
2.一个函数仅完成一件功能。
说明:一个函数实现多个功能给开发、使用、维护都带来很大的困难。将没有关联或者关联很弱的语句放到同一函数中,会导致函数职责不明确,难以理解,难以测试和改动。3.函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用。
说明:带有内部“存储器”的函数的功能可能是不可预测的,因为它的输出可能取决于内部存储器(如某标记)的状态。这样的函数既不易于理解又不利于测试和维护。在C语言中,函数的static局部变量是函数的内部存储器,有可能使函数的功能不可预测,然而,当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类,则返回为错针。 4.重复代码应该尽可能提炼成函数. 说明:重复代码提炼成函数可以带来维护成本的降低。
重复代码是华为公司不良代码最典型的特征之一。在“代码能用就不改”的指导原则之下,大量的烟囱式设计及其实现充斥着各产品代码之中。新需求增加带来的代码拷贝和修改,随着时间的迁移,产品中堆砌着许多类似或者重复的代码。项目组应当使用代码重复度检查工具,在持续集成环境中持续检查代码重复度指标变化趋势,并对新增重复代码及时重构。当一段代码重复两次时,即应考虑消除重复,当代码重复超过三次时,应当立刻着手消除重复。
变量
1.一个变量只有一个功能,不能把一个变量用作多种用途。 说明:一个变量只用来表示一个特定功能,不能把一个变量作多种用途,即同一变量取值不同时,其代表的意义也不同。 2.结构功能单一;不要设计面面俱到的数据结构。 说明:相关的一组信息才是构成一个结构体的基础,结构的定义应该可以明确的描述一个对象,而不是一组相关性不强的数据的集合。设计结构时应力争使结构代表一种现实事务的抽象,而不是同时代表多种。结构中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同事务的元素放到同一结构中。
3.不用或少用全局变量 。
说明:单个文件内部可以使用static的全局变量,可以将其理解为类的私有成员变量。全局变量应该是模块的私有数据,不能作用对外的接口使用,使用static类型定义,可以有效防止外部文件的非正常访问,建议定义一个STATIC宏,在调试阶段,将STATIC定义为static,版本发布时,改为空,以便于后续的打补丁等操作。
腾讯公司:
总体原则
所有使用Java作为开发语言的软件产品都须遵照本规范的内容进行编码。
文件组织
1.由于超过2000行的程序难以阅读,应该尽量避免出现超过2000行的程序;
2.一个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相关联,可以将它们和公共类放入同一个源文件。公共类必须是这个文件中的第一个类
或接口。
代码风格
1.程序块的分界符左大括号"{" 和右大括号"}“都另起一行,应各独占一行并且位于同一列,同时与引用它们的语句左对齐;
2.对齐只使用TAB键,不使用空格键; 
3.不允许把多个短语句写在一行中,即一行只写一条语句;
4 .if、for、do、while、case、switch、default等语句自占一行。
换行 
一行的长度超过80个字符需要换行,换行规则如下:
1.在一个逗号后面断开;
2.在一个操作符前面断开; 
3.长表达式要在低优先级操作符处划分新行;
4.新行缩进2个TAB。
间隔 
1.类、方法及相对独立的程序块之间、变量说明之后必须加空行; 
2.关键字之后要留空格, 象if、for、while  等关键字之后应留一个空格再跟左括号”(", 以突出关键字; 
3.方法名与其左括号"("之间不要留空格, 以与关键字区别;。
注释
1.文件注释 
所有的源文件都应该在开头有一个注释,其中列出文件的版权声明、文件名、功能描述以及创建、修改记录:     
2.类或接口注释 
采用JavaDoc文档注释,在类、接口定义之前应当对其进行注释,包括类、接口的描述、最新修改者、版本号、参考链接等:
3.字段注释 
采用JavaDoc文档注释,定义为public的字段必需给出注释,在类的(静态)变量、实例变量定义之前当对其进行注释,给出该字段的描述等:    
4.方法注释 
采用JavaDoc文档注释,在方法定义之前当对其进行注释,包括方法的描述、输入、输出及返回值说明、抛出异常说明、参考链接等:   
命名
1.基本规则 
1.1使用可以准确说明变量、字段、类、接口、包等完整的英文描述符;
1.2采用大小写混合,提高名字的可读性; 
1.3采用该领域的术语;尽量少用缩写,但如果一定要使用,当使用公共缩写和习惯缩
写等; 
1.4避免使用相似或者仅在大小写上有区别的名字。
2.包命名 
2.1包名一律小写, 少用缩写和长名;
2.2采用以下规则:[基本包].[项目名].[模块名子模块名]… 
2.3基本包:com.tencent或 com.qq 
2.4不得将类直接定义在基本包下,所有项目中的类、接口等都应当定义在各自的项目 和模块包中; 
3.类或接口命名 
类或接口名是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽量使类名简洁而富于描述。使用完整单词,避免用缩写词(除非该缩写词被更广泛使用。
4.变量命名 
4.1采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写;
4.2变量名不应以下划线或美元符号开头; 
4.3尽量避免单个字符的变量名,除非是一次性的临时变量。
4.5组件或部件变量使用其类型名或类型名缩写作其后缀。
5.常量命名 
全部采用大写,单词间用下划线隔开:   
6.方法命名 
方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写;取值类可使用get前缀,设值类可使用set前缀,判断类可使用is(has)
前缀。
百度公司:
在程序的版式上 
1、程序块要采用缩进风格编写 ,缩进的空格数为 4 个。
原因说明: 由开发工具自动生成的代码可能不一致,但如果开发工具可以配置,则应该统一配 置缩进为 4 个空格。
2、缩进或者对齐只能使用空格键 ,不可使用 TAB 键。
说明 : 使用 TAB 键需要设置 TAB 键的空格数目是 4 格。
3、相对独立的程序块之间,变量说明之后必须加空行。
4、 较长的语句(>80 字符)要分成多行书写。  
5、不允许把多个短语句写在一行中,即一行只写一条语句。 
说明: 一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅 读,并且方便于写注释。
6、if、for、do、while、case、switch、default default default 等语句自占一行 等语句自占一行,且 if、for、 do、while 等语句的执行语句部分无论多少都要加括号,等语句的执行语句部分无论多少都要加括号{}。
在标识符命名上
1、命名尽量使用英文单词 :力求简单清楚 ,避免使用引起误解的词汇和模糊的 ,使人产生误解。
2、命名规范必须与所使用的系统风格保持一致,并在同一项目中统一 ,并在同一项目中统一。
3、常量、宏和模板名采用全大写的方式 、宏和模板名采用全大写的方式,每个单词间用下划线隔。      
4、枚举类型 enum 常量应以大写字母开头或全部大写 enum 常量应以大写字母开头或全部大写。
5、命名中若使用了特殊约定或缩写,则要有注释说明。       
6、自己特有的命名风格,要自始至终保持一致,不可来回变化。
7、函数名以大写字母开头,采用谓-宾结构(动-名),且应反映函数执行什么 操作以及返回什么内容。
在程序的可读性上
1、用括号明确表达式的操作顺序 ,避免使用默认优先级。
2、不要编写太复杂、多用途的复合表达式。
3、涉及物理状态或者含有物理意义的常量 ,避免直接使用数字,必须用有意义的枚举或常量来代替。
4、禁止使用难以理解,容易产生歧义的语句。
在变量、结构上 
1、留心具体语言及编译器处理不同数据类型的原则及有关细节。
2、尽量减少没有必要的数据类型默认转换与强制转换。
3、当声明用于分布式环境或不同 CPU 间通信环境的数据结构时 CPU 间通信环境的数据结构时,必须考虑机器 的字节顺序、使用的位域及字节对齐等问题 、使用的位域及字节对齐等问题。
C++专用规范
1、在高警告级别下干净地编译。 使用编译器的最高警告级别。要求干净的(没有警告的)构建(build)并理解所有 的警告。通过修改代码来消除警告,而不是通过降低警告级别来消除。对于明确理解其 含义,确信不会造成任何问题的警告,则可以局部关闭。
2、确保资源为对象所占有,使用显式的 RAII 和智能指针 RAII 和智能指针。
3、主动使用 const,避免使用宏。 应该尽可能的使用常量而不用变量,另外在定义数值的时候,应该把 const 做为默 认的选项。
4、合理使用组合和继承 。继承是 C++中耦合度最强的关系之一。软件工程的一条重要原则是尽量减少耦合,在 组合和继承都能均可适用的情况下,应该优先考虑使用组合。组合的意思是将一种类型 以成员变量方式嵌入相关类型中。    
5、尽可能局部地声明变量,这通常是在程序具备了足够的数据来初始化变量之后, 并紧接着首次使用该变量之前。
6、尽量用异常来报告错误。与错误码相比,要尽量用异常来报告错误。对一些无法使用异常的错误,或者一些不属于错误的情况,可以用状态码来报告。如果不可能或不需要从错误中恢复,那么可以使用其它方法,比如正常或非正常地终止程序。在 C++中,和用错误码来报告错误相比,用异常来报告错误具有许多明显的优势,所有这些都使得编出来的代码更健壮。
在可测性上 
1、在同一项目组或产品组内,要有一套统一的为集成测试与系统联调准备的调测开关及相应打印函数,并且要有详细的说明。
2、在同一项目组或产品组内,调测打印出的信息串的格式要有统一的形式。信息串中至少要有所在模块名(或源文件名)及行号。
3、编程的同时要为单元测试选择恰当的测试点,并仔细构造测试代码、测试用例,同时给出明确的注释说明。测试代码部分应作为(模块中的)一个子模块,以方便测试代码在模块中的安装与拆卸(通过调测开关)。
4、在进行集成测试/系统联调之前,要构造好测试环境、测试项目及测试用例,同时仔细分析并优化测试用例,以提高测试效率。
个人感悟
在刚开始学习编程时,我的编程能力可以说是非常弱,在编写程序时我也遇到了不少困难,可以说是大错小错不断,而且我还不懂得用简便的方法编程,因此我只能用过于繁琐的方法编程,但经过几个学期来对编程的学习,我的编程能力也有所提高。通过这次对各个企业编程风格要求的查询,我也认识到了我原本在编程方面一些不注意的地方,我也会在以后编写程序时注意这些地方,以便让编写出来的程序更加简便,功能更加符合实际需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值