本文目录一览:
一维数组元素的倒置操作,用C语言写。
void reverse(int p[], int n)
{
int *q, t;
for(q = p + n - 1; p < q; ++p, --q)
{
t = *p;
*p = *q;
*q = t;
}
}
C语言如何实现数组元素倒置??
- 打开c语言编辑器,新建一个空白的文件:
- 这里可以开始写代码了,主函数的前面定义了数组和一些变量,倒置操作在for循环中完成,这里只需要第一个元素和最后一个元素交换、第二个元素和倒数第二个元素交换、以此类推……不管数组元素的个数是奇数还是偶数,这个算法都是成立的,最后则是打印输出结果:
- 最后程序编写完成需要验证一下结果,按下crtl+F5运行程序,弹出的窗口中就能看见逆序输出的数组元素了:
里氏替换原则与依赖倒置原则有什么区别
区别:
- 定义不同:里氏替换原则是关于子类与父类的原则;依赖倒置原则是关于抽象与细节的原则。
- 应用范围不同:依赖倒置原则的应用范围比里氏替换原则更广泛。
- 涉及的对象关系不同:里氏替换原则中的子类具有自己的独立性;依赖倒置原则中的细节依赖于抽象。
衍生知识点:
一、里氏替换原则
定义1:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。 定义2:所有引用基类的地方必须能透明地使用其子类的对象。 通俗来讲:子类可以扩展父类的功能,但不能改变父类原有的功能。是OCP的扩展。它包含以下四层含义:
- 子类可以实现父类的抽象,但不能覆盖父类的非抽象方法
- 子类中可以增加自己特有的方法
- 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入更宽松
- 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类的更严格
二、依赖倒置原则
定义:高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。 解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B和类C发生联系,则会大大降低修改类A的几率。 核心思想:面向接口编程。含有下面3点:
- 低层模块尽量都要有抽象类或接口,或者两者都有
- 变量的声明类型尽量使抽象类或接口
- 用继承时遵循里氏替换原则
用c语言实现数组倒置
#include <stdio.h>
void invert(int x[], int n);
void main()
{
int i, *p, a[10] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
printf("%s\n", "元素倒置前:");
for(p = a; p < a + 10;) printf("%d ", *(p)++);
printf("\n");
p = a;
invert(p, 10);
printf("%s\n", "元素倒置后:");
for(p = a; p < a + 10;) printf("%d ", *(p)++);
printf("\n");
}
void invert(int x[], int n)
{
int temp, i, j, m = (n - 1) / 2;
for (i = 0; i <= m; i++)
{
j = n - 1 - i;
temp = x[i]; x[i] = x[j]; x[j] = temp;
}
}