、编写静态数码管显示的C51程序。功能要求:实验板上最后一个静态数码管循环?

、编写静态数码管显示的C51程序。功能要求:实验板上最后一个静态数码管循环?,第1张

以下是一份简单的C51程序,能够实现静态数码管的显示:

```c

#include <reg51.h>

// 数码管码表

unsigned char code LED[] = {

0xc0, 0xf9, 0xa4, 0xb0, 0x99,

0x92, 0x82, 0xf8, 0x80, 0x90

}

void delay(unsigned int t) {

unsigned int i, j

for (i = 0i <ti++) {

for (j = 0j <1200j++)

}

}

void main() {

unsigned char i, cnt

// 定义P1口为输出端口

P1 = 0x00

while(1) {

cnt = 0

// 循环显示0~9

for (i = 0i <10i++) {

P1 = LED[i]

delay(500)

cnt++

if (cnt == 4) {

cnt = 0

P1 = 0

delay(500)

}

}

}

}

```

这份程序中,首先定义了静态数码管的码表,然后通过循环依次将每个数码管的码值赋值给P1口进行显示,同时凳手亩控制最后一个数码管不同步显示,即循环显示四个数码管后关闭所有数码管的显示,再等待一段时间后才开始下一轮的显示。

在具体的硬件实现中,需要将P1口连接到数码管的控制芯片的输入口上,同枣森时还需要设置好时钟等系薯差统参数。

在 C++ 中动态联编需要虚函数的支持,这是因为虚函数的工作原理决定的,而正是因为使用了虚函数来实现动态联编,也让动态联编的效率略低于静态联编。通常,编译器处理虚函数的方法是: 给每个对象添加一个隐藏成员,隐藏成员保存了一个指向函数地址数组的指针 ,这个数组就是虚函数表(virtual function table, vtbl)。虚函数表中存储了为类对象进行声明的虚函数的地址,调用虚函数时,程序橡春将查看存储在对象中的 vtbl 地址,然后转向相应的函数地址表,如果使用类声明中定义的第一个虚函数,则程序将使用数组中的第一个函数地址,并执行具有该地址的函数。

虚函数这个概念是 C++ 的精华之一,遇到虚函数时要注意以下几点:

1.定义一个函数为虚函数,不代表函数为不被实现的函数(可以有自己袜如喊的实现)

2.定义它为虚函数是为了允许用基类的指针来调用子类的这个函数(提供了基类调用子类函数的方式)

3.定义一个函数为纯虚函数,代表函数没有被实现(声明后面接=0,例如:virtual func() = 0 此时派生类必须要实现此虚函数)

4.具有纯虚函数的类是抽象类,不能用于生成对告野象(即不能实例化),只能派生,它派生的类如果没有实现纯虚函数,那么他的派生类还是抽象类。虚析构函数

虚析构函数顾名思义就是将析构函数定义为虚函数。如果我们在派生中分配了内存空间,但是基类的析构函数不是虚析构函数,就会发生内存泄漏。看下面的例子:

#include <iostream>using namespace stdclass Base{public:

virtual void print(){

cout <<"This is Base's print function" <<endl

}

/* 对比加与不加 virtual 析构函数的调用情况 */

~Base(){

// virtual ~Base(){

cout <<"The destructor of Base" <<endl

}

}

class Derived : public Base{public:

void print(){

cout <<"This is Derived's print function" <<endl

}

~Derived(){

cout <<"The destructor of Derived" <<endl

}

}

int main(){

Base *p =

new Derived()

p->print()

delete p

return 0

}

不加 virtual 的运行结果:

加上 virtual 的运行结果:

在上面程序示加上 virtual 时编译器还是按照 Base 类型调用了析构函数,没有执行 Derived 类的虚析构函数,就造成了内存泄露。修改 Base 类的析构函数为虚析构函数后实现了多态,就可以确保执行正确的析构函数,完成资源的释放

public class Max

{

public static void main(String[] args)

{

int i=max(15,18)

double j=max(15.0,18.0)

double k=max(15.0,18.0,14.0)

System.out.println("两个整数的最大值"+i)

System.out.println("两个双精度数的最大值"+j)

System.out.println("三个双精度数的凳渣最大值"+k)

}

private static int max(int m,int n){

return Math.max(m,n)

}

private static double max(double m,double n){

return Math.max(m,n)

}

private static double max(double m,double n,double g){

double h=Math.max(m,n)

return Math.max(h,g)

}

}

////////枣亩悄输出结果

两个整数的最大值18

两个双精度数的最大值18.0

三个双精度数的最大值18.0

////这个程序是耐陪熟悉方法的重载,你好好看看这一部分


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12322774.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存