牛客 C++刷题day14&15&16&17&18&19&20 假期以后的复习

前几天去大伯家休养了一个星期,打打球,钓钓鱼至关惬意,刷题强度降低了不少。如今恢复正常做息编程

1:fscanf和fprintf数组

fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能类似,都是格式化读写函数,二者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件。

这两个函数的原型为:
函数

int fscanf ( FILE *fp, char * format, ... );
int fprintf ( FILE *fp, char * format, ... );

fp 为文件指针,format 为格式控制字符串,... 表示参数列表。与 scanf() 和 printf() 相比,它们仅仅多了一个 fp 参数。例如:spa

  1. FILE *fp;
  2. int i, j;
  3. char *str, ch;
  4. fscanf(fp, "%d %s", &i, str);
  5. fprintf(fp,"%d %c", j, ch);

fprintf() 返回成功写入的字符的个数,失败则返回负数。fscanf() 返回参数列表中被成功赋值的参数个数。.net

2:面向对象的五大基本原则设计

单一职责原则(SRP)3d

 

1.1,SRP(Single Responsibilities Principle)的定义:就一个类而言,应该仅有一个引发它变化的缘由。简而言之,就是功能要单一。
  1.2,若是一个类承担的职责过多,就等于把这些职责耦合在一块儿,一个职责的变化可能会削弱或者抑制这个类完成其它职责的能力。这种耦合会致使脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。(敏捷软件开发)
  1.3,软件设计真正要作的许多内容,就是发现职责并把那些职责相互分离。(敏捷软件开发)指针

 

小结:orm

 

单一职责原则能够看作是低耦合、高内聚在面向对象原则上的引伸,将职责定义为引发变化的缘由,以提升内聚性来减小引发变化的缘由。职责过多,可能引发它变化的缘由就越多,这样致使职责依赖,相互之间就会产生缘由,大大损伤其内聚性和耦合度。对象

 

开放封闭原则(OCP)

 

 2.1,OCP(Open-Close Principle)的定义:就是说软件实体(类,方法等等)应该能够扩展,可是不能修改。它是软件设计中也是最重要的一种设计原则。
  2.2,OCP的两个特征:
    2.2.1> 对于扩展是开放的。
    2.2.2> 对于修改是封闭的。

 

 

 

  2.3,何时应用OCP原则呢?
    在咱们最初编写代码时,假设变化不会发生,当变化发生时,咱们就建立抽象(好比抽象类,接口等等)来隔离之后发生的同类变化。
  2.4,开放-封闭原则是面向对象设计的核心所在。遵循这个原则能够带来面向对象技术所声称的巨大好处,也就是可维护,可扩展,可复用,灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分作出抽象,然而,对于应用程序中的每一个部分都刻意地进行抽象一样不是一个好主意。拒毫不成熟的抽象和抽象自己同样重要。
  2.5,OCP的UML图:

 

 

小结:

 

开放封闭原则是面向对象设计的核心所在。遵循这个原则能够带来面向对象技术所声称的巨大好处:可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现频繁变化的那些部分作出抽象,然而,对于应用程序中的每一个部分都刻意地进行抽象一样也不是一个好主意。拒毫不成熟的抽象和抽象自己同样重要。“需求老是变化”没有不变的软件,因此须要用开放封闭原则来封闭变化知足需求,同时还能保持软件内部的封装体系稳定,不被需求的变化影响。

依赖倒置原则(DIP)

 

3.1,DIP(Dependence Inversion Principle)的定义:抽象不该该依赖细节,细节应该依赖于抽象。简单说就是,咱们要针对接口编程,而不要针对实现编程。

 

           3.1. 1 高层模块不该该依赖低层模块。两个都应该依赖抽象。

 

           3.1.2 抽象不该该依赖具体(细节)。具体(细节)应该依赖抽象。

 


  3.二、反面例子UML图:

 

      
  缺点:高层模块太依赖低层模块,耦合太紧密。低层模块发生变化会影响到高层模块。
  解决方法:利用依赖倒置原则使高层模块和低层模块都依赖于抽象(接口或抽象类)。
  3.三、修改后的UML图以下:
  
  优势:这样的话修改低层模块不会影响到高层模块,减少了它们之间的耦合度,加强系统的稳定性。
  

 

小结:

 

依赖倒置原则其实能够说是面向对象设计的标志,用哪一种语言来编写程序不重要,若是编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中全部的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。

 

接口隔离原则(ISP)

 

使用多个专门的接口比使用单一的总接口要好。

 

一个类对另一个类的依赖性应当是创建在最小的接口上的。

 

一个接口表明一个角色,不该当将不一样的角色都交给一个接口。没有关系的接口合并在一块儿,造成一个臃肿的大接口,这是对角色和接口的污染。

 

“不该该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。”这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,若是强迫用户使用它们不使用的方法,那么这些客户就会面临因为这些不使用的方法的改变所带来的改变。

 

 小结:

 

接口隔离的方法有两种(分享客户就是分离接口):
一、使用委托(此委托非.net委托[delegate])分离接口
使用委托即,建立一个委托类,用此类去实现分离后的其它接口中的方法。
二、使用多重继承分离接口、
此方法,即将现有“胖”接口分红供不一样客户程序调用的两个或多个接口,而须要实现多个接口的客户程序,则使用多重继承来实现。

 

里氏替换原则(LSP)

5.1,LSP(Liskov Substitution Principle)的定义:子类型必须可以替换掉它们的父类型。简单地说,这是由于子类型继承了父类,因此子类能够以父类的身份出现。

  实例UML图:

     

 

小结:

任何基类能够出现的地方,子类必定能够出现。 LSP是继承复用的基石,只有当衍生类能够替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也可以在基类的基础上增长新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,因此里氏代换原则是对实现抽象化的具体步骤的规范。

 

补充:

迪米特法则(LoD):

     自从咱们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚。不管是面向过程编程仍是面向对象编程,只有使各个模块之间的耦合尽可能的低,才能提升代码的复用率。低耦合的优势不言而喻,可是怎么样编程才能作到低耦合呢?那正是迪米特法则要去完成的。

迪米特法则又叫最少知道原则,最先是在1987年由美国Northeastern University的Ian Holland提出。通俗的来说,就是一个类对本身依赖的类知道的越少越好。也就是说,对于被依赖的类来讲,不管逻辑多么复杂,都尽可能地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。迪米特法则还有一个更简单的定义:只与直接的朋友通讯。首先来解释一下什么是直接的朋友:每一个对象都会与其余对象有耦合关系,只要两个对象之间有耦合关系,咱们就说这两个对象之间是朋友关系。耦合的方式不少,依赖、关联、组合、聚合等。其中,咱们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出如今局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要做为局部变量的形式出如今类的内部。

   1,LoD(Law of Demeter)的定义:若是两个类没必要彼此直接通讯,那么这两个类就不该当直接的相互做用。若是其中一个类须要调用另外一个类的某一个方法的话,能够经过第三者转发这个调用。

   2,在类的结构设计上,每个类都应当尽可能下降成员的访问权限,也就是说,一个类包装好本身的private状态,不须要让别的类知道的字段或行为(方法)就尽可能不要公开。

 

定义:一个对象应该对其余对象保持最少的了解。

问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另外一个类的影响也越大。

解决方案:尽可能下降类与类之间的耦合。

小结:

迪米特法则的初衷是下降类之间的耦合,因为每一个类都减小了没必要要的依赖,所以的确能够下降耦合关系。可是凡事都有度,虽然能够避免与非直接的类通讯,可是要通讯,必然会经过一个“中介”来发生联系,例如本例中,总公司就是经过分公司这个“中介”来与分公司的员工发生联系的。过度的使用迪米特原则,会产生大量这样的中介和传递类,致使系统复杂度变大。因此在采用迪米特法则时要反复权衡,既作到结构清晰,又要高内聚低耦合。

3:关于整数强转为指针变量

int是能够强制转换的,而float,double均不可。且咱们知道整数的位长不能超过寻址范围。

4:一个类中的构造函数能够是私有的好比单例模式。

5:二维数组做为形参时,一维能够省略可是二维不可省略,声明二维数组一维不可省略,二维能够。

6:常成员只能在初始列表初始化,常静态变量只能经过类外定以。要注意定以时加上const type 不须要static

7:静态联编是经过对象名调用虚函数,这个是在编译阶段就肯定了的。

可是动态联编在编译阶段没法经过语句自己肯定调用哪个类的虚函数,只有在运行时指向一个对象后才能肯定调用哪一个类的虚函数。

8:

小端存储:低位存低位,高位存高位

大端存储:低位存高位,高位存低位

还有结构体中先声明的是低地址,后声明的是高地址

9:静态变量,全局变量其实不在栈区而是在另一个单独的区,这里不要搞混淆了

 10:逗号运算符获得的结果都是括号最后一个表达式的值....16位机器下不考虑字节对齐,划重点,要考的(shit!!!)

相关文章
相关标签/搜索