精华内容
下载资源
问答
  • 关键代码怎么写
    千次阅读
    2021-06-13 17:34:23

    html注释:不被程序执行的代码。用于程序员标记代码,在后期的修改,以及他人的学习时有所帮助。对关键代码的注释是一个良好的习惯。在开发网站或者功能模块开发时,代码的注释尤其重要。

    html注释:

    注释标签用来在源文档中插入注释,注释不会在浏览器中显示。

    我们经常要在一些代码旁做一些HTML注释,这样做的好处很多,比如:方便项目组里的其它程序员了解你的代码,而且可以方便以后你对自己代码的理解与修改等等.

    可以在HTML文档中加入自己的注释。注释不会显示在页面中,它可以用来提醒网页设计人员回忆相关的程序信息。注释行的写法如下:

    注:在感叹号后要接两个连字符,大于号前也要有两个连字符。有些浏览器会对此进行严格检查。

    基本语法:

    //和/* */在html里也是常用的注释,但只能用在js和css语言,不对HTML语言起作用!

    豌豆资源搜索网站https://55wd.com 电脑刺绣绣花厂 ttp://www.szhdn.com

    注释的作用

    大家可以看到,用“”注释的内容不会显示在浏览器中。注释标签用于在源代码中插入注释,注释的内容不会显示在浏览器中。对关键代码进行注释,有助于你以后看懂你当时编写的源代码。

    在编写HTML代码时,我们经常要在一些关键代码旁做一下注释,这样做的好处很多,比如:方便理解、方便查找或方便项目组里的其它程序员了解你的代码,而且可以方便以后你对自己代码进行修改。

    对关键代码的注释是一个良好的习惯。在开发网站或者功能模块开发时,代码的注释尤其重要。因为那个时候的代码往往都是几百上千行,你要是不对关键的代码进行注释,往往你自己都会觉得头晕,甚至看不懂自己当时写的代码。

    总结

    以上是编程之家为你收集整理的html注释代码怎么写?全部内容,希望文章能够帮你解决html注释代码怎么写?所遇到的程序开发问题。

    如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

    小编个人微信号 jb51ccc

    喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

    更多相关内容
  • java伪代码怎么

    千次阅读 2021-03-05 18:00:30
    1. 请把下面的java代码用伪代码写出来伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、...

    1. 请把下面的java代码用伪代码写出来

    伪代码(Pseudocode)是一种算法描述语言。

    使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。

    介于自然语言与编程语言之间。以编程语言的书写形式指明算法职能。

    使用伪代码, 不用拘泥于具体实现。相比程序语言(例如Java, C++,C, Dephi 等等)它更类似自然语言。

    它是半角式化、不标准的语言。可以将整个算法运行过程的结构用接近自然语言的形式(可以使用任何一种你熟悉的文字,关键是把程序的意思表达出来)描述出来。

    String path = "***"File f = new File(path);public void test (F f)File []fs = f遍历文件夹;for(。){ if(fs[i]是文件){ 输入 }else{ 递归test(fs[i]); }}。

    2. JAVA 伪代码

    提示输入一个大于2且<11的数字

    输入一整型数值给Vertices,

    if(Vertices < 3 || Vertices >11){

    提示重新输入且应输入

    退出程序

    }else{

    生成一个Vertices * Vertices 大小的数组Graph,

    填充数组 :行号与列号相同填充0,其余填充10以内随机数

    交换元素:以[i][j]位置的数值与[j][i]位置的数值互换

    最后打印数组各元素

    }

    3. 请把下列用java代码 用伪代码写出来

    伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。 介于自然语言与编程语言之间。以编程语言的书写形式指明算法职能。使用伪代码, 不用拘泥于具体实现。相比程序语言(例如Java, C++,C, Dephi 等等)它更类似自然语言。它是半角式化、不标准的语言。可以将整个算法运行过程的结构用接近自然语言的形式(可以使用任何一种你熟悉的文字,关键是把程序的意思表达出来)描述出来。

    String path = "***"

    File f = new File(path);

    public void test (F f)

    File []fs = f遍历文件夹;

    for(。){

    if(fs[i]是文件){

    输入

    }else{

    递归test(fs[i]);

    }

    }

    4. 伪代码怎么写

    伪代码(Pseudocode)是一种算法描述语言。

    使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。

    介于自然语言与编程语言之间。 它以编程语言的书写形式指明算法的职能。

    相比于程序语言(例如Java, C++,C, Dephi 等等)它更类似自然语言。它是半角式化、不标准的语言。

    我们可以将整个算法运行过程的结构用接近自然语言的形式(这里,你可以使用任何一种你熟悉的文字,中文,英文 等等,关键是你把你程序的意思表达出来)描述出来. 使用伪代码, 可以帮助我们更好的表述算法, 不用拘泥于具体的实现. 人们在用不同的编程语言实现同一个算法时意识到,他们的实现(注意:这里是实现,不是功能)很不同。尤其是对于那些熟练于不同编程语言的程序员要理解一个(用其他编程语言编写的程序的)功能时可能很难,因为程序语言的形式限制了程序员对程序关键部分的理解。

    这样伪代码就应运而生了。 当考虑算法功能(而不是其语言实现)时,伪代码常常得到应用。

    计算机科学在教学中通常使用虚拟码,以使得所有的程序员都能理解。 综上,简单的说,让人便于理解的代码。

    不依赖于语言的,用来表示程序执行过程,而不一定能编译运行的代码。在数据结构讲算法的时候用的很多。

    5. 伪代码的写法

    类Pascal语言的伪代码的语法规则是: 在伪代码中,每一条指令占一行(else if,例外)。指令后不跟任何符号(Pascal和C中语句要以分号结尾)。

    伪代码实例如下:

    IF 九点以前 THEN

    do 私人事务;

    ELSE 9点到18点 THEN

    工作;

    ELSE

    下班;

    END IF

    这样不但可以达到文档的效果,同时可以节约时间。更重要的是,使结构比较清晰,表达方式更加直观。

    伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。 介于自然语言与编程语言之间。

    它以编程语言的书写形式指明算法的职能。相比于程序语言(例如Java, C++,C, Dephi 等等)它更类似自然语言。它是半角式化、不标准的语言。

    我们可以将整个算法运行过程的结构用接近自然语言的形式(这里,你可以使用任何一种你熟悉的文字,中文,英文 等等,关键是你把你程序的意思表达出来)描述出来。使用伪代码, 可以帮助我们更好的表述算法,不用拘泥于具体的实现。

    6. 伪代码的写法

    最低0.27元开通文库会员,查看完整内容> 原发布者:wangwenjxnu 伪代码伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。

    每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便、格式紧凑,也比较好懂,便于向程序过渡。

    伪代码的7个主要部分:(1)算法名称(2)指令序列(3)输入/输出(4)分支选择(5)赋值(6)循环(7)算法结束1.算法名称两种表示算法的伪代码:过程(Procedure)函数(Function)过程和函数的区别是:过程是执行一系列的操作,不需要返回操作的结果,无返回数据;函数是执行一系列的操作后,要将操作的结果返回,有返回数据。算法伪代码的书写规则:Procedure([])Function([])如:ProcedureHanoi_Tower()FunctionFac(x)表示名为Fac的一个函数。

    FunctionProg(n)表示名为Prog的一个函数。2.指令序列指令序列是算法的主体。

    指令序列的书写规则:用Begin作为开始、用End作为结束;用“{”作为开始、用“/}”作为结束。例如:Begin指令序列;End或者:{指令序列;/}3.输出/输出输入:Input输出:Output或Return4.分支选择两种分支:IfThen{指令序列/}IfThen{。

    展开全文
  • windows编程学习——关键代码

    千次阅读 2016-09-12 19:09:37
    多线程学习篇(一)关键代码段 一、基本概念 关键代码段:关键代码段也称之为临界区,工作在用户模式下。它是一小段代码,在执行前需要独占对一些共享资源的访问权。   优点:关键代码段工作在用户模式下,因此...

     多线程学习篇(一)关键代码段

    一、基本概念

    关键代码段:关键代码段也称之为临界区,工作在用户模式下。它是一小段代码,在执行前需要独占对一些共享资源的访问权。

     

    优点:关键代码段工作在用户模式下,因此它简单,执行速度快。

     

    缺点:不能在多个进程之间对线程进行同步(原因:它不是内核对象)

    二、API

    1、关键段相关API

    CRITICAL_SECTION结构体:这是一个未公开内部信息的结构体,通过这个结构,我们就可以使用API对想要独占的代码进行操作。

    使用该结构的条件:1、所有想要访问资源的线程,必须知道用来保护资源的CRITICAL_SECTION结构的地址。我们通过传入该结构体的地址,进行操作。2、任何线程在访问被保护的资源之前,都必须对这个结构体进行初始化。

    VOID InitializeCriticalSection(PCRITICAL_SECTION pcs);

    功能:初始化临界区

    参数:psc指向CRITICAL_SECTION结构体的地址

     

    VOID DeleteCriticalSection(PCRITICAL_SECTION pcs);

    功能:重置结构体中的成员变量(而不是删除它)。注意:如果删除的话,别的线程还在使用一个关键段,就会产生不可预料的结果。

    参数:psc指向CRITICAL_SECTION结构体的地址

     

    VOID EnterCriticalSection(PCRITICAL_SECTION pcs)

    功能:EnterCriticalSection会检查结构中的成员变量,这些变量表示是否有线程正在进行访问。以及哪个线程正在访问。如果没有线程访问,则获取访问权限。如果有线程正在访问,则等待。

    注意:这个API内部的实现,其实只是对这个结构体做了一些列的检测,它的价值就在于它可以原子性的执行所有的检测。

    参数:psc指向CRITICAL_SECTION结构体的地址

     

    BOOL TryEnterCriticalSection(PCRITICAL_SECTION pcs)

    功能:和EnterCriticalSection作用相同,只是这个API不会因为另一个线程正在使用pcs这个结构而进入等待状态,它会根据返回值判断是否可以访问。然后继续执行下面的代码

    参数:psc指向CRITICAL_SECTION结构体的地址

     

    VOID LeaveCriticalSection(PCRITICAL_SECTION pcs)

    功能:更新成员函数,以表示没有任何线程访问被保护资源,同时检查其他线程有没有因为调用EnterCriticalSection而处于等待状态。如果有,则更新成员函数,将一个等待的线程切回调度状态

    参数:psc指向CRITICAL_SECTION结构体的地址

     

    2、关键段加自旋锁相关API

    由于当线程试图进入一个关键段,但这个关键段正在被另一个线程占用的时候,函数会立即把调用的线程切换到等待状态。因为线程状态切换需要在内核中进行,因此开销非常大(大约1000个CPU周期)。这样,在一些需要及时获取资源的线程会有很大的影响。为此,windows为大家在关键段中加入了自旋锁,保证了实时性,但却浪费了大量CPU资源。

    注意:关键段加自旋锁在单CPU上使用毫无用处,因为如果一个线程正在循环,那么占用资源的线程就没有时间放弃对资源的访问权。

    BOOL InitializeCriticalSectionAndSpinCount(

    PCRITICAL_SECTION pcs,

    DOWRD dwSpinCount

    )

    功能:初始化一个PCRITICAL_SECTION结构体,和自旋锁自旋转次数。用这个API初始化后,当调用EnterCriticalSection()的时候,会用一个锁不断循环,试图获得对资源的访问权。只有尝试失败时,才会切换到等待状态。

    参数:psc指向CRITICAL_SECTION结构体的地址

      dwSpinCount我们希望旋转的次数。

       DWORD SetCriticalSectionSpinCount(

    PCRITICAL_SECTION pcs,

    DOWRD dwSpinCount

    )

        功能:改变设置的自旋锁自旋转的次数

     

     

     

    三、练习 

    问题:现在使用关键代码段技术,完成一个火车站的售票系统,要求建立两个线程作为售票口,分别向外出售火车票。票数总数为100。编写程序,使得它们可以正常的出售。

     

    #include <Windows.h>
    #include <stdio.h>


    DWORD WINAPI Sell_Window1(LPVOID lpParameter);
    DWORD WINAPI Sell_Window2(LPVOID lpParameter);


    int tickets = 100;
    CRITICAL_SECTION cs;


    void main()
    {
    HANDLE hThread1;
    HANDLE hThread2;
    hThread1 = CreateThread(NULL,0,Sell_Window1,NULL,0,NULL);
    hThread2 = CreateThread(NULL,0,Sell_Window2,NULL,0,NULL);
    InitializeCriticalSection(&cs);
    Sleep(4000);
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    DeleteCriticalSection(&cs);
    }


    DWORD WINAPI Sell_Window1(LPVOID lpParameter)
    {
    while (1)
    {
    EnterCriticalSection(&cs);
    if (tickets > 0)
    {
    printf("窗口1出售第%d张票\n",tickets--);
    LeaveCriticalSection(&cs);
    }
    else
    {
    LeaveCriticalSection(&cs);
    break;
    }
    }
    return 0;
    }
    DWORD WINAPI Sell_Window2(LPVOID lpParameter)
    {
    while (1)
    {
    EnterCriticalSection(&cs);
    if (tickets > 0)
    {
    printf("窗口2出售第%d张票\n",tickets--);
    LeaveCriticalSection(&cs);
    }
    else
    {
    LeaveCriticalSection(&cs);
    break;
    }
    }
    return 0;
    }

     

    展开全文
  • 关键路径(完整实例及C语言完整代码实现)

    千次阅读 多人点赞 2020-08-15 18:36:26
    在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做...

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。

    目录:
    1.AOE网
    2.关键路径
    3.求关键路径的具体实现
    4.关键路径C语言完整代码实现
    5.关键路径小结

    1.AOE网

    AOE 网是在 AOV 网的基础上,其中每一个边都具有各自的权值,是一个有向无环网。其中权值表示活动持续的时间。

    在这里插入图片描述
    如上图所示就是一个 AOE 网,例如 a1=6 表示完成 a1 活动完成需要 6 天;AOE 网中每个顶点表示在它之前的活动已经完成,可以开始后边的活动,例如 V5 表示 a4 和 a5 活动已经完成,a7 和 a8 可以开始。

    使用 AOE 网可以帮助解决这样的问题:如果将 AOE 网看做整个项目,那么完成整个项目至少需要多少时间?

    解决这个问题的关键在于从 AOE 网中找到一条从起始点到结束点长度最长的路径,这样就能保证所有的活动在结束之前都能完成。

    起始点是入度为 0 的点,称为“源点”;结束点是出度为 0 的点,称为“汇点”。这条最长的路径,被称为”关键路径“。

    2.关键路径

    为了求出一个给定 AOE 网的关键路径,需要知道以下 4 个统计数据:

    1. 对于 AOE 网中的顶点有两个时间:最早发生时间(用 Ve(j) 表示)和最晚发生时间(用 Vl(j) 表示);
    2. 对于边来说,也有两个时间:最早开始时间(用 e(i) 表示)和最晚开始时间( l(i) 表示)。
    统计数据代表意义
    Ve(j):最早发生时间对于 AOE 网中的任意一个顶点来说,从源点到该点的最长路径代表着该顶点的最早发生时间,通常用 Ve(j)表示。例如,下图中从 V1 到 V5 有两条路径,V1 作为源点开始后,a1 和 a2 同时开始活动,但由于 a1 和 a2 活动的时间长度不同,最终 V1-V3-V5 的这条路径率先完成。但是并不是说 V5 之后的活动就可以开始,而是需要等待 V1-V2-V5 这条路径也完成之后才能开始。所以对于 V5 来讲,Ve(5) = 7。
    Vl(j):最晚发生时间表示在不推迟整个工期的前提下,事件 Vk 允许的最晚发生时间。例如,下图中,在得知整个工期完成的时间是 18 天的前提下,V7 最晚要在第 16 天的时候开始,因为 a10 活动至少需要 2 天时间才能完成,如果在 V7 事件在推迟,就会拖延整个工期。所以,对于 V7 来说,它的 Vl(7)=16。
    e(i):最早开始时间表示活动 ai 的最早开始时间,如果活动 ai 是由弧 <Vk,Vj> 表示的,那么活动 ai 的最早开始的时间就等于时间 Vk 的最早发生时间,也就是说:e[i] = ve[k]。e(i)很好理解,拿图 1 中 a4 来说,如果 a4 想要开始活动,那么首先前提就是 V2 事件开始。所以 e[4]=ve[2]。
    l(i):最晚开始时间表示活动 ai 的最晚开始时间,如果活动 ai 是由弧 <Vk,Vj> 表示,ai 的最晚开始时间的设定要保证 Vj 的最晚发生时间不拖后。所以,l[i]=Vl[j]-len<Vk,Vj>。

    在这里插入图片描述

    在得知以上四种统计数据后,就可以直接求得 AOE 网中关键路径上的所有的关键活动,方法是:对于所有的边来说,如果它的最早开始时间等于最晚开始时间,称这条边所代表的活动为关键活动。由关键活动构成的路径为关键路径。

    3.求关键路径的具体实现

    还是用下面这个例子
    在这里插入图片描述

    要求关键路径首先完成 Ve(j)、Vl(j)、e(i)、l(i) 4 种统计信息的准备工作。

    1.Ve(j),求出从源点到各顶点的最长路径长度为(长度最大的):

    在这里插入图片描述

    2.Vl(j),求出各顶点的最晚发生时间(从后往前推,多种情况下选择最小的):

    在这里插入图片描述

    3.e(i),求出各边中ai活动的最早开始时间:

    在这里插入图片描述

    4.l(i),求各边中ai活动的最晚开始时间(多种情况下,选择最小的)

    在这里插入图片描述

    通过对比 l(i) 和 e(i) ,其中 a1 、 a4 、 a7 、 a8 、 a10 、 a11 的值都各自相同,所以,在图 1 中的 AOE 网中有两条关键路径:
    在这里插入图片描述

    4.关键路径C语言完整代码实现

    #include <stdio.h>
    #include <stdlib.h>
    #define  MAX_VERTEX_NUM 20//最大顶点个数
    #define  VertexType int//顶点数据的类型
    typedef enum{false,true} bool;
    //建立全局变量,保存边的最早开始时间
    VertexType ve[MAX_VERTEX_NUM];
    //建立全局变量,保存边的最晚开始时间
    VertexType vl[MAX_VERTEX_NUM];
    typedef struct ArcNode{
        int adjvex;//邻接点在数组中的位置下标
        struct ArcNode * nextarc;//指向下一个邻接点的指针
        VertexType dut;
    }ArcNode;
    
    typedef struct VNode{
        VertexType data;//顶点的数据域
        ArcNode * firstarc;//指向邻接点的指针
    }VNode,AdjList[MAX_VERTEX_NUM];//存储各链表头结点的数组
    
    typedef struct {
        AdjList vertices;//图中顶点及各邻接点数组
        int vexnum,arcnum;//记录图中顶点数和边或弧数
    }ALGraph;
    //找到顶点对应在邻接表数组中的位置下标
    int LocateVex(ALGraph G,VertexType u){
        for (int i=0; i<G.vexnum; i++) {
            if (G.vertices[i].data==u) {
                return i;
            }
        }
        return -1;
    }
    //创建AOE网,构建邻接表
    void CreateAOE(ALGraph **G){
        *G=(ALGraph*)malloc(sizeof(ALGraph));
       
        scanf("%d,%d",&((*G)->vexnum),&((*G)->arcnum));
        for (int i=0; i<(*G)->vexnum; i++) {
            scanf("%d",&((*G)->vertices[i].data));
            (*G)->vertices[i].firstarc=NULL;
        }
        VertexType initial,end,dut;
        for (int i=0; i<(*G)->arcnum; i++) {
            scanf("%d,%d,%d",&initial,&end,&dut);
           
            ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));
            p->adjvex=LocateVex(*(*G), end);
            p->nextarc=NULL;
            p->dut=dut;
           
            int locate=LocateVex(*(*G), initial);
            p->nextarc=(*G)->vertices[locate].firstarc;
            (*G)->vertices[locate].firstarc=p;
        }
    }
    //结构体定义栈结构
    typedef struct stack{
        VertexType data;
        struct stack * next;
    }stack;
    
    stack *T;
    
    //初始化栈结构
    void initStack(stack* *S){
        (*S)=(stack*)malloc(sizeof(stack));
        (*S)->next=NULL;
    }
    //判断栈是否为空
    bool StackEmpty(stack S){
        if (S.next==NULL) {
            return true;
        }
        return false;
    }
    //进栈,以头插法将新结点插入到链表中
    void push(stack *S,VertexType u){
        stack *p=(stack*)malloc(sizeof(stack));
        p->data=u;
        p->next=NULL;
        p->next=S->next;
        S->next=p;
    }
    //弹栈函数,删除链表首元结点的同时,释放该空间,并将该结点中的数据域通过地址传值给变量i;
    void pop(stack *S,VertexType *i){
        stack *p=S->next;
        *i=p->data;
        S->next=S->next->next;
        free(p);
    }
    //统计各顶点的入度
    void FindInDegree(ALGraph G,int indegree[]){
        //初始化数组,默认初始值全部为0
        for (int i=0; i<G.vexnum; i++) {
            indegree[i]=0;
        }
        //遍历邻接表,根据各链表中结点的数据域存储的各顶点位置下标,在indegree数组相应位置+1
        for (int i=0; i<G.vexnum; i++) {
            ArcNode *p=G.vertices[i].firstarc;
            while (p) {
                indegree[p->adjvex]++;
                p=p->nextarc;
            }
        }
    }
    
    bool TopologicalOrder(ALGraph G){
        int indegree[G.vexnum];//创建记录各顶点入度的数组
        FindInDegree(G,indegree);//统计各顶点的入度
        //建立栈结构,程序中使用的是链表
        stack *S;
        //初始化栈
        initStack(&S);
        for (int i=0; i<G.vexnum; i++) {
            ve[i]=0;
        }
        //查找度为0的顶点,作为起始点
        for (int i=0; i<G.vexnum; i++) {
            if (!indegree[i]) {
                push(S, i);
            }
        }
        int count=0;
        //栈为空为结束标志
        while (!StackEmpty(*S)) {
            int index;
            //弹栈,并记录栈中保存的顶点所在邻接表数组中的位置
            pop(S,&index);
            //压栈,为求各边的最晚开始时间做准备
            push(T, index);
            ++count;
            //依次查找跟该顶点相链接的顶点,如果初始入度为1,当删除前一个顶点后,该顶点入度为0
            for (ArcNode *p=G.vertices[index].firstarc; p ; p=p->nextarc) {
               
                VertexType k=p->adjvex;
               
                if (!(--indegree[k])) {
                    //顶点入度为0,入栈
                    push(S, k);
                }
                //如果边的源点的最长路径长度加上边的权值比汇点的最长路径长度还长,就覆盖ve数组中对应位置的值,最终结束时,ve数组中存储的就是各顶点的最长路径长度。
                if (ve[index]+p->dut>ve[k]) {
                    ve[k]=ve[index]+p->dut;
                }
            }
        }
        //如果count值小于顶点数量,表明有向图有环
        if (count<G.vexnum) {
            printf("该图有回路");
            return false;
        }
        return true;
    }
    //求各顶点的最晚发生时间并计算出各边的最早和最晚开始时间
    void CriticalPath(ALGraph G){
        if (!TopologicalOrder(G)) {
            return ;
        }
        for (int i=0 ; i<G.vexnum ; i++) {
            vl[i]=ve[G.vexnum-1];
        }
        int j,k;
        while (!StackEmpty(*T)) {
            pop(T, &j);
            for (ArcNode* p=G.vertices[j].firstarc ; p ; p=p->nextarc) {
                k=p->adjvex;
                //构建Vl数组,在初始化时,Vl数组中每个单元都是18,如果每个边的汇点-边的权值比源点值小,就保存更小的。
                if (vl[k]-p->dut<vl[j]) {
                    vl[j] = vl[k]-p->dut;
                }
            }
        }
        for (j = 0; j < G.vexnum; j++) {
            for (ArcNode*p = G.vertices[j].firstarc; p ;p = p->nextarc) {
                k = p->adjvex;
                //求各边的最早开始时间e[i],等于ve数组中相应源点存储的值
                int ee = ve[j];
                //求各边的最晚开始时间l[i],等于汇点在vl数组中存储的值减改边的权值
                int el = vl[k]-p->dut;
                //判断e[i]和l[i]是否相等,如果相等,该边就是关键活动,相应的用*标记;反之,边后边没标记
                char tag = (ee==el)?'*':' ';
                printf("%3d%3d%3d%3d%3d%2c\n",j,k,p->dut,ee,el,tag);
            }
        }
    }
    int main(){
        ALGraph *G;
        CreateAOE(&G);//创建AOE网
        initStack(&T);
        TopologicalOrder(*G);
        CriticalPath(*G);
        return  0;
    }
    

    5.关键路径小结

    在求关键路径的算法中,在求每一个事件的最早最迟发生时间,以及活动得到最早和最迟开始时,都要对所有顶点及每一个顶点边表中的边结点进行检查,因此求关键路径的时间复杂度为O(n+e)

    本篇博客转载C语言中文网

    展开全文
  • 本篇文章就来带大家简单认识一下伪代码,介绍简单的C语言伪代码怎么,希望对大家有所帮助。伪代码是什么?通常,算法是在伪代码的帮助下表示的,因为无论学习什么编程语言或掌握多深的编程知识,程序员都可以解释...
  • 目录目录人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码1.人体姿态估计2D Pose方法2.人体姿态估计数据集(1)COCO数据集(2)MPII数据集(3)关键点示意图(ID序号)3.人体(行人)检测4.人体姿态估计训练...
  • JavaScript进阶:如何出优雅的JavaScript代码

    万次阅读 多人点赞 2022-04-05 15:19:35
    目录一、可维护性代码二、编码规范-可读性三、变量和函数命名四、松散耦合1、解耦HTML和JavaScript2、解耦CSS和JavaScript3、解耦应用程序逻辑和事件处理程序五、编码惯例六、作用域意识1、避免全局查找2、不适用...
  • 菜鸡程序员都是怎样写代码的?

    万次阅读 多人点赞 2021-03-26 13:22:22
    可能不少程序员都会有这样的经历,写代码时灵光乍现,为了保证在灵感消逝前敲出更多代码,敲代码速度飞快,当然命名就显得很随意了。 什么样奇奇怪怪的命名都有:xiaonaigou,ergouzi,xxxx,j1,llst等等,可能...
  • 同一份逻辑,不同人的实现的代码性能会出现数量级的差异; 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升;同一份代码,也可能在不同处理器上运行也会有几倍的性能差异;十倍程序员 不是...
  • 在前面:作者李子昂,阿里巴巴集团研发效能部的第一个算法工程师,目前工作主要方向是代码管理和CI。本文探讨的是:从优化研发交付流程的角度,如何根本上提升研发效能。 先说结论 现在阿里主流的分支开发模式,...
  • 究竟怎样写代码才算是好代码

    万次阅读 多人点赞 2016-09-21 16:05:06
    今天让我们来谈谈代码吧。代码重要吗?当然,代码就是设计(Jack W.Reeves, 1992);代码是最有价值的交付物。我们需要好代码吗?在给“好代码”下个定义之前,这个问题无法回答。那么,究竟什么是好代码?看下面这...
  • 请提供至少两种判断程序卡死(无响应)的思路,请关键代码.请出代码   代码:      Private Declare Function IsHungAppWindow Lib "user32.dll" ( ByVal hWnd As Long) As Long  Sub 子...
  • 代码撰写规范

    千次阅读 2021-05-26 02:55:12
    我们可以通过它将整个算法运行过程的结构用接近自然语言的形式描述出来(这里,你可以使用任何一种你熟悉的文字,中文,英文等等,关键是你把你程序的意思表达出来)。 借助伪代码, 我们可以更好的表述算法,而不用拘泥...
  • 手牵手教你写代码,从入门到精通

    千次阅读 2020-07-27 17:51:03
    在 GitHub 上有一个新项目,它描述了「最佳垃圾代码」的十九条关键准则。从变量命名到注释编写。这些准则将指导你出最亮眼的烂代码。 为了保持与原 GitHub 项目一致的风格,下文没有进行转换。读者们可以以相反的...
  • 一眼看过去,代码一样的简洁,只是一个是因为不会,一个是因为最精简。但你不仔细读代码你是不会注意到的,你只会觉得这个人像新手一样在浑水摸鱼。 而且大佬喜欢在办公室盯代码盯到很晚,不说平时上班到很晚,...
  • 一文教会你如何复杂业务代码

    万次阅读 多人点赞 2019-08-05 14:00:17
    结合实际的业务场景,我沉淀了一套“如何复杂业务代码”的方法论,在此分享给大家。 我相信,同样的方法论可以复制到大部分复杂业务场景。 一个复杂业务的处理过程 业务背景 简单的介绍下业...
  • 原作者也已经毕业了,曾经的代码的学弟也能独挡一面了。不知道你是否会想起曾经代码的那段经历?
  • 应届毕业生,只会抄代码,该怎么办?

    万次阅读 多人点赞 2020-08-03 10:56:30
    还有就是,到目前为止,我也只会对着资料、书籍抄代码,而不是完完全全自己,我感觉我一点东西都没学会,这正常吗?我该怎么办?二哥有好的学习方法介绍吗? 以上是读者遗愿焰火在 6 月份私信我的一个问题,我一直...
  • so easy! 10行代码写个"狗屁不通"文章生成器

    万次阅读 多人点赞 2019-11-20 17:35:00
    前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 ...背后实现代码一定很复杂吧,里面...当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不中文变量名的, 中文...
  • 如何代码

    万次阅读 多人点赞 2018-01-19 08:35:42
    原文链接:https://www.cnblogs.com/huipengkankan/archive/2011/07/28/2120416.html伪代码(Pseudocode)是一种...因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。 介于自然语言与编程语言之间。
  • 如何在vue的html中js代码

    千次阅读 2021-05-12 22:59:49
    如题所示,v-if的写法大家都知道,但是如果要在html的class或者其他属性里面js判断该如何呢? 1. 使用三元表达式判断属性 :readonly="xxx ? true : false" 2. js根据条件判断使用不同的class //如果xxx变量...
  • 十行代码搞定人体关键点定位
  • 昨天有个读者问我要 C语言的学习路线,他今年刚上大一,书上的代码完全看不懂。 讲真,大一新生,一般都是零基础的纯小白,看不懂书上的代码很正常,除非是小学、初中、高中就开始卷计算机的硬核少年;或者是因为...
  • 今天在代码开发中看到一位同事的代码,所有的代码都是在Controller中的,当时觉得很奇怪,然后再再看了看他的service层——干净的就像一张白纸,当时我强迫症就犯了。 上学的时候,上班的时候-领导一直要求代码...
  • 代码整洁 vs 代码肮脏

    万次阅读 多人点赞 2019-09-16 12:05:12
    出整洁的代码,是每个程序员的追求。《clean code》指出,要想出好的代码,首先得知道什么是肮脏代码、什么是整洁代码;然后通过大量的刻意练习,才能真正出整洁的代码。 WTF/min是衡量代码质量的唯一标准,...
  • 怎么提升写代码的能力

    千次阅读 多人点赞 2021-01-18 14:44:33
    对于程序员而言,我始终认为代码是展现能力的关键,一个优秀程序员代码,和一个普通程序员代码是很容易看出差别的,代码作为程序员的硬实力和名片的展示,怎么提升写代码的能力始终是一个关键的话题,不过很...
  • 聊聊写代码的20个反面教材

    千次阅读 多人点赞 2022-07-14 17:03:16
    今天跟大家聊一个有趣的话题:如何出让人抓狂的代码?大家看到这个标题,第一印象觉得这篇文章可能是一篇水文。但我很负责的告诉你,它是一篇有很多干货的技术文。曾几何时,你在阅读别人代码的时候,有没有抓狂,...
  • 关于如何写代码和学习代码

    万次阅读 2017-05-20 08:55:40
    1.0当完一大代码以后,编译程序时是一大堆的错误(原因:语法不熟悉) --这个时候需要很大的耐心以及细心,对每一行代码仔细阅读和更改。改动代码的过程中能够极大的培养自己对代码的理解能力。常常读程序并且推算...
  • 如何一个代码分析文档

    千次阅读 2018-11-08 01:16:23
    持续更新 目录 1.给出这段代码的功能描述,让读者知道这篇文章主要介绍哪一部分 2.这段代码入口方法,以及如何找到入口类、方法 3.给出结论的代码调用图 4.具体代码说明 ...(2)跟哪些关键代码有交互...
  • 代码精进之代码规范(二)

    千次阅读 2022-03-19 11:04:02
    文章目录代码整理的关键逻辑好注释好声明的“八项纪律”Java注解 代码整理的关键逻辑 一个好的程序员,要识别并且区分代码块,让它们易于阅读和辨认。 程序代码分块时,我们需要注意以下三个点: 保持代码块的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 859,962
精华内容 343,984
关键字:

关键代码怎么写