精华内容
下载资源
问答
  • 2020-09-02 05:31:39

    页面结构图示例图

    htmlcss2thumb

    The following is an extract from our book, HTML5 & CSS3 for the Real World, 2nd Edition, written by Alexis Goldstein, Louis Lazaris, and Estelle Weyl. Copies are sold in stores worldwide, or you can buy it in ebook form here.

    以下摘自Alexis Goldstein,Louis Lazaris和Estelle Weyl编写的《现实世界HTML5和CSS3,第二版 》一书。 副本在世界各地的商店中都有出售,或者您可以在此处以电子书形式购买

    Now that we’ve covered the basics of page structure and the elements in HTML5 that will assist in this area, it’s time to start building the parts of our page that will hold the content.

    既然我们已经介绍了页面结构的基础知识以及HTML5中将在此方面提供帮助的元素,是时候开始构建页面的内容部分了。

    Let’s start from the top, with a header element. It makes sense to include the logo and title of The Herald in here, as well as the tagline. We can also add a nav element for the site navigation.

    让我们从顶部开始,用header元素。 在此处包括《先驱报》的徽标和标题以及标语是很有意义的。 我们还可以为网站导航添加一个nav元素。

    After the header, the main content of our site is divided into three columns. While you might be tempted to use section elements for these, stop and think about the content. If each column contained a separate “section” of information (such as a sports section and an entertainment section), that would make sense. As it is, though, the separation into columns is really only a visual arrangement, so we’ll use a plain old div for each column.

    header之后,我们网站的主要内容分为三列。 尽管您可能会想将section元素用于这些内容,但请停下来思考一下内容。 如果每一列都包含一个单独的信息“部分”(例如运动部分和娱乐部分),那将是有意义的。 虽然如此,但实际上分成几列只是一种视觉上的安排,因此我们将为每列使用简单的旧div

    Inside those divs, we have newspaper articles; these, of course, are perfect candidates for the article element.

    在这些div内,我们有报纸文章; 当然,这些是article元素的完美候选人。

    The column on the far right, though, contains three ads in addition to an article. We’ll use an aside element to wrap the ads, with each ad placed inside an article element. This may seem odd, but look back at the description of article: “a self-contained composition […] that is, in principle, independently distributable or reusable.” An ad fits the bill almost perfectly, as it’s usually intended to be reproduced across a number of websites without modification.

    不过,最右边的一列除包含文章外,还包含三个广告。 我们将使用aside元素包装广告,并将每个广告放置在article元素内。 这可能看起来很奇怪,但请回顾一下article的描述:“一种独立的组合物[…],原则上可以独立分发或重用。” 广告通常可以在多个网站上未经修改地复制,因此几乎完全可以满足要求。

    Next up, we’ll add another article element for the final article that appears below the ads. That final article will be excluded from the aside element that holds the three ads. To belong in the aside, the article needs to be tangentially related to the page’s content. This isn’t the case: this article is part of the page’s main content, so it would be wrong to include it in the aside.

    接下来,我们将为广告下方显示的最后一篇文章添加另一个article元素。 最后一篇文章将从包含这三个广告的aside元素中排除 。 要asidearticle需要与页面内容切线相关。 情况并非如此:本文是页面主要内容的一部分,因此将其aside是错误的。

    Now the third column consists of two elements: an aside and an article, stacked one on top of the other. To help hold them together and make them easier to style, we’ll wrap them in a div. We’re not using a section, or any other semantic markup, because that would imply that the article and the aside were somehow topically related. They’re not—it’s just a feature of our design that they happen to be in the same column together.

    现在第三列包括两个元素:一个asidearticle ,一个堆叠在另一个的顶部上。 为了帮助将它们固定在一起并使它们更容易样式化,我们将它们包装在div 。 我们没有使用section或任何其他语义标记,因为这暗示着articleaside在某种程度上是局部相关的。 它们不是—它们恰好在同一列中只是我们设计的一个功能。

    新的main元素 (The New main Element)

    At this point, it’s probably a good time to introduce another major structural element that’s been introduced in HTML5: the main element. This element was not originally part of the HTML5 spec, but has been added since the first edition of this book was published.

    在这一点上,可能是引入HTML5中引入的另一个主要结构元素: main元素的好时机。 该元素最初不是HTML5规范的一部分,但自本书第一版发布以来已添加。

    Unfortunately, defining the main element and how it can be used is a little tricky. But let’s start with where the element originated. In some HTML documents, developers were wrapping their primary content in a generic element, like this:

    不幸的是,定义main元素以及如何使用它有些棘手。 但是,让我们从元素的起源开始。 在一些HTML文档中,开发人员将其主要内容包装在一个通用元素中,如下所示:

    <body> <header> ... </header>
    <div id="main"> ... </div>
    <footer> ... </footer>
    </body>

    Notice the generic div element used here as a sibling to the header and footer elements. Notice also the ID attribute with a value of "main". In addition to this, many developers were adding an ARIA role to this element:

    注意这里使用的通用div元素作为headerfooter元素的同级元素。 还要注意ID属性的值为"main" 。 除此之外,许多开发人员还在此元素中添加了ARIA role

    <div id="main" role="main"> ...
    </div>

    We’ll avoid going into the details of ARIA here―that’s covered in Appendix B―but basically, the new main element is meant to replace this practice.

    在这里,我们将避免进入ARIA的细节(附录B中已对此进行了介绍),但基本上,新的main元素旨在替代此做法。

    The W3C spec defines main as follows: “The main element represents the main content of the body of a document or application. The main content area consists of content that is directly related to or expands upon the central topic of a document or central functionality of an application.”

    W3C规范main定义如下:main元素表示文档或应用程序正文的主要内容。 主要内容区域由与文档的中心主题或应用程序的中心功能直接相关或扩展的内容组成。”

    The WHATWG spec defines it similarly; however, the two specs have very different definitions beyond that. The WHATWG spec says:

    WHATWG规范对此进行了类似的定义; 但是,这两个规范的定义非常不同。 WHATWG规范说

    “There is no restriction as to the number of main elements in a document. Indeed, there are many cases where it would make sense to have multiple main elements. For example, a page with multiple article elements might need to indicate the dominant contents of each such element.”

    “文件中的main元素数量没有限制。 确实,在许多情况下,拥有多个main要素是有意义的。 例如,包含多个article元素的页面可能需要指示每个此类元素的主要内容。”

    But uncharacteristically, in complete contradiction to that, the W3C spec says:

    但与众不同的是,W3C规范与此完全矛盾:

    “Authors must not include more than one main element in a document. Authors must not include the main element as a descendant of an article, aside, footer, header, or nav element.”

    “作者在文档中不得包含多个main元素。 作者不得将main元素作为article的后代, asidefooterheadernav元素包括在内。”

    In addition, the W3C spec adds the recommendation to use the role="main" attribute on the main element until the main element is fully recognized by user agents. Having that knowledge, we’re going to adopt the W3C’s recommendation, and use only a single main element on our page, using an ARIA role as a fallback.

    另外,W3C规范添加了在main元素上使用role="main"属性的建议,直到该main元素被用户代理完全识别为止。 有了这些知识,我们将采用W3C的建议,并使用ARIA角色作为后备,仅使用页面上的单个main元素。

    Going back to our Herald markup, this is how it will look after we’ve added the main element inside the body tag:

    回到我们的先驱标记,这是我们在body标签内添加main元素后的外观:

    <body> <header> ... </header> <main role="main">
    </main> <footer> ... </footer> <script src="js/scripts.js"></script>
    </body>

    As you can see, the main element exists outside the header and footer. Inside the main is where we’ll put the three columns we discussed, which make up the layout and primary content for The HTML5 Herald.

    如您所见, main元素位于headerfooter 。 在main内部放置了我们讨论的三列,它们构成了HTML5 Herald的布局和主要内容。

    继续构建《先驱报》 (Continuing to Structure The Herald)

    The last part of our layout we’ll consider here is the footer, which you can see in The Herald screenshot in its traditional location—at the bottom of the page. Because the footer contains a few different chunks of content, each of which forms a self-contained and topically related unit, we’ve split these out into section elements inside the footer. The author information will form one section, with each author sitting in their own nested section. Then there’s another section for the copyright and additional information.

    布局的最后一部分是页脚,您可以在页面底部的《先驱报》屏幕截图中的传统位置中看到该页脚。 由于页脚包含一些不同的内容块,每个内容块构成一个独立且局部相关的单元,因此我们将这些内容拆分为页脚内部的section元素。 作者信息将形成一个section ,每个作者都位于自己的嵌套section 。 然后是版权和其他信息的另一section

    Let’s add the new elements to our page so that we can see where our document stands:

    让我们将新元素添加到页面中,以便我们可以看到文档的位置:

    <body>
      <header>
        <nav></nav>
      </header>
    
      <main role="main">
        <div class="primary">
          <article></article>
        </div>
    
        <div class="secondary">
          <article></article>
        </div>
    
        <div class="tertiary">
          <aside>
            <article></article>
          </aside>
    
          <article>
          </article>
    
        </div>
      </main><!-- main -->
    
      <footer>
        <section id="authors">
          <section></section>
        </section>
        <section id="copyright">
        </section>
      </footer>
    
      <script src="js/scripts.js"></script>
    </body>

    The figure below shows a screenshot that displays our page with some labels indicating the major structural elements we’ve used.

    下图显示了一个截图,该截图显示了我们的页面,其中包含一些标签,这些标签指示我们已使用的主要结构元素。

    fig_2_structure

    We now have a structure that can serve as a solid basis for the content of our website.

    现在,我们的结构可以作为我们网站内容的坚实基础。

    注意:如果我使用了错误的元素怎么办? (Note: What if I use the wrong element?)

    Although it can be confusing at times to remember which elements to use in which situations, we encourage you to avoid stressing or spending too much time making decisions on semantics. While it is good to be consistent, there are few repercussions from using the wrong elements. If your pages are accessible, that’s what is important. Of course, there are cases where the correct semantic element will be beneficial to accessibility, so we encourage you to research this and make sure your choice of element won’t cause your pages to become inaccessible. A good place to start might be HTML5 Accessibility or The Accessibility Project.

    尽管有时记住在哪种情况下要使用哪些元素可能会造成混淆,但我们鼓励您避免在语义上施加压力或花太多时间进行决策。 保持一致是件好事,但是使用错误的元素几乎不会带来任何影响。 如果您的页面可访问,那很重要。 当然,在某些情况下,正确的语义元素将有利于可访问性,因此我们鼓励您进行研究,并确保对元素的选择不会导致页面无法访问。 HTML5 AccessibilityThe Accessibility Project是一个不错的起点

    包装东西 (Wrapping Things Up)

    That’s it for this chapter. We’ve learned some of the basics of content structure in HTML5, and we’ve started to build our sample project using the knowledge we’ve gained.

    本章就是这样。 我们已经学习了HTML5内容结构的一些基础知识,并且已经开始使用所获得的知识来构建示例项目。

    In the next chapter, we’ll have a more in-depth look at HTML5 content, and continue to add semantics to our page when we deal with some of the other elements available in HTML5.

    在下一章中,我们将更深入地了解HTML5内容,并在处理HTML5中的其他一些元素时继续在页面中添加语义。

    翻译自: https://www.sitepoint.com/defining-sample-sites-page-structure/

    页面结构图示例图

    更多相关内容
  • 一种不变的数据结构,旨在使用关系查询进行访问。 像数据库老板一样。 动机 所有数据结构都附带您应对其执行的操作类型的意见。 例如,链接列表使定义在列表中所有项目上运行的递归过程变得非常容易,但使它无法为...
  • 运行Hello World 首先打开我们的微信Web开发者工具,然后用自己的微信账号扫码登陆,接着选择小程序就会看到我们接下来的画面: 如: 这里我们点击小程序/小游戏会出现一个测试appid,接下来点击确定,会进...

    前言

    通过上一篇我们已经完成了注册及开发环境的搭建,今天我们来开发我们的第一个微信小程序
    微信小程序开发注册流程

    附微信开发工具下载地址:
    微信开发工具

    方便上一篇没有安装的同学。

    运行Hello World

    首先打开我们的微信Web开发者工具,然后用自己的微信账号扫码登陆,接着选择小程序就会看到我们接下来的画面:
    如图:
    在这里插入图片描述
    这里我们点击小程序/小游戏会出现一个测试appid,接下来点击确定,会进入到我们的开发界面:
    如图:
    在这里插入图片描述
    此时点击
    编译
    按钮
    如图:
    在这里插入图片描述
    现在我们可以在左侧模拟器点击
    获取头像昵称**,授权后就会出现我们自己的头像和昵称信息
    如图:
    在这里插入图片描述
    也可以通过预览真机调试,点击后只需要扫描二维码即可。

    代码构成

    如图:我们可以看到四种类型的文件
    在这里插入图片描述

    1 .json 后缀的 JSON 配置文件

    2 .wxml 后缀的 WXML 模板文件

    3 .wxss 后缀的 WXSS 样式文件

    4 .js 后缀的 JS 脚本逻辑文

    json配置

    我们可以看到在项目的根目录有一个 app.json 和 project.config.json,此外在 pages/logs 目录下还有一个 logs.json,我们依次来说明一下它们的用途。

    小程序配置 app.json

    小程序根目录下的 app.json 文件用来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。

    DEMO里的app.json代码如下:

    {
      "pages":[
        "pages/index/index",
        "pages/logs/logs"
      ],
      "window":{
        "backgroundTextStyle":"light",
        "navigationBarBackgroundColor": "#fff",
        "navigationBarTitleText": "WeChat",
        "navigationBarTextStyle":"black"
      }
    }
    

    我们简单说一下这个配置各个项的含义:

    1、pages字段 —— 用于描述当前小程序所有页面路径,这是为了让微信客户端知道当前你的小程序页面定义在哪个目录。

    2、window字段 —— 定义小程序所有页面的顶部背景颜色,文字颜色定义等。

    更多详细属性参见小程序的配置 app.json

    工具配置 project.config.json

    工具配置就相当于我们对当前的idea进行了界面配置、编译配置等,只不过小程序把这个配置文件写入了工程中,当我们换一台电脑打开同一个工程,你会发现还是原来的味道。避免了有些同学换台电脑就不会编程的痛苦。

    我们看一下DEMO里面的工具配置文件:

    {
    	"description": "项目配置文件",
    	"packOptions": {
    		"ignore": []
    	},
    	"setting": {
    		"urlCheck": true,
    		"es6": true,
    		"postcss": true,
    		"minified": true,
    		"newFeature": true,
    		"autoAudits": false
    	},
    	"compileType": "miniprogram",
    	"libVersion": "2.0.4",
    	"appid": "wxe7c297ecaaaa0735",
    	"projectname": "%E5%B0%8F%E7%A8%8B%E5%BA%8F",
    	"debugOptions": {
    		"hidedInDevtools": []
    	},
    	"isGameTourist": false,
    	"condition": {
    		"search": {
    			"current": -1,
    			"list": []
    		},
    		"conversation": {
    			"current": -1,
    			"list": []
    		},
    		"game": {
    			"currentL": -1,
    			"list": []
    		},
    		"miniprogram": {
    			"current": -1,
    			"list": []
    		}
    	}
    }
    

    我们简单说一下这个配置各个项的含义:
    packOptions 用以配置项目在打包过程中的选项。打包是预览、上传时对项目进行的必须步骤。
    setting 项目设置,包括(是否启用 es6 转 es5,上传代码时样式是否自动补全、上传代码时是否自动压缩、是否进行代码保护等)
    compileType 编译类型
    appid 项目的 appid,只在新建项目时读取
    projectname 项目名字,只在新建项目时读取
    debugOptions 调试配置选项

    更多详细参见 开发者工具的配置

    页面配置 page.json

    这里的 page.json 其实用来表示 pages/logs 目录下的 logs.json 这类和小程序页面相关的配置。

    如果你整个小程序的风格是蓝色调,那么你可以在 app.json 里边声明顶部颜色是蓝色即可。实际情况可能不是这样,可能你小程序里边的每个页面都有不一样的色调来区分不同功能模块,因此我们提供了 page.json,让开发者可以独立定义每个页面的一些属性,例如刚刚说的顶部颜色、是否允许下拉刷新等等。

    我们来看一下DEMO中的logs.jsonindex.json

    logs.json中重新定义了标题

    {
      "navigationBarTitleText": "查看启动日志"
    }
    

    index.json中没有做任何修改,也就是完全使用app.json中的配置信息

    {}
    

    其他配置项细节可以参考文档 页面配置

    WXML 模板

    从事过网页编程的人知道,网页编程采用的是 HTML + CSS + JS 这样的组合,其中HTML 是用来描述当前这个页面的结构,CSS 用来描述页面的样子,JS 通常是用来处理这个页面和用户的交互。

    同样道理,在小程序中也有同样的角色,其中 WXML 充当的就是类似 HTML 的角色。
    我们来看一下首页pages/index/index.wxml

    <!--index.wxml-->
    <view class="container">
      <view class="userinfo">
        <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
        <block wx:else>
          <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
          <text class="userinfo-nickname">{{userInfo.nickName}}</text>
        </block>
      </view>
      <view class="usermotto">
        <text class="user-motto">{{motto}}</text>
      </view>
    </view>
    

    在这里插入图片描述
    和 HTML 非常相似,WXML 由标签、属性等等构成。但是也有很多不一样的地方,我们来一一阐述一下:

    1、标签名字有点不一样

    往往写 HTML 的时候,经常会用到的标签是 div, p, span,开发者在写一个页面的时候可以根据这些基础的标签组合出不一样的组件,例如日历、弹窗等等。小程序的将常用的组件封装了起来,用 view, button, text 等等

    2、多了一些 wx:if 这样的属性以及 {{ }} 这样的表达式

    通过 {{ }} 的语法把一个变量绑定到界面上,我们称为数据绑定。仅仅通过数据绑定还不够完整的描述状态和界面的关系,还需要 if/else, for等控制能力,在小程序里边,这些控制能力都用 wx: 开头的属性来表达。

    更详细的文档可以参考 WXML

    WXSS 样式

    WXSS 具有 CSS 大部分的特性,小程序在 WXSS 也做了一些扩充和修改。

    1、新增了尺寸单位。在写 CSS 样式时,开发者需要考虑到手机设备的屏幕会有不同的宽度和设备像素比,采用一些技巧来换算一些像素单位。WXSS 在底层支持新的尺寸单位 rpx ,开发者可以免去换算的烦恼,只要交给小程序底层来换算即可,由于换算采用的浮点数运算,所以运算结果会和预期结果有一点点偏差。

    2、提供了全局的样式和局部样式。和前边 app.json, page.json 的概念相同,你可以写一个 app.wxss 作为全局样式,会作用于当前小程序的所有页面,局部页面样式 page.wxss 仅对当前页面生效。

    3、此外 WXSS 仅支持部分 CSS 选择器

    /**index.wxss**/
    .userinfo {
      display: flex;
      flex-direction: column;
      align-items: center;
    }
    
    .userinfo-avatar {
      width: 128rpx;
      height: 128rpx;
      margin: 20rpx;
      border-radius: 50%;
    }
    
    .userinfo-nickname {
      color: #aaa;
    }
    
    .usermotto {
      margin-top: 200px;
    }
    

    都是一些常见的属性,看名知意。

    更详细的文档可以参考 WXSS

    JS 交互逻辑

    一个服务仅仅只有界面展示是不够的,还需要和用户做交互:响应用户的点击、获取用户的位置等等。在小程序里边,我们就通过编写 JS 脚本文件来处理用户的操作。

    <view>{{ msg }}</view> <button bindtap="clickMe">点击我</button>
    

    点击 button 按钮的时候,我们希望把界面上 msg 显示成 “Hello World”,于是我们在 button 上声明一个属性: bindtap ,在 JS 文件里边声明了 clickMe 方法来响应这次点击操作:

    Page({
      clickMe() {
        this.setData({msg: 'Hello World'})
      }
    })
    

    响应用户的操作就是这么简单,更详细的事件后续介绍。

    此外,小程序还给我们提供了更多丰富的API,用这些 API 可以很方便的调起微信提供的能力,例如获取用户信息、本地存储、微信支付等。在前边的 QuickStart 例子中,在 pages/index/index.js 就调用了 wx.getUserInfo 获取微信用户的头像和昵称,最后通过 setData 把获取到的信息显示到界面上。
    更多详细API后续介绍。

    小程序API

    扫码关注公众号“伟大程序猿的诞生“,更多干货新鲜文章等着你~

    公众号回复“资料获取”,获取更多干货哦~

    有问题添加本人微信号“fenghuokeji996” 或扫描博客导航栏本人二维码

    展开全文
  • 《算法和数据结构》学习路线指引

    万次阅读 多人点赞 2021-07-01 11:16:15
    WorldFinal 选手对学习算法的一点总结。五张思维导解决你的困惑
    本文已收录于专栏
    🌳《画解数据结构》🌳

    🙉饭不食,水不饮,题必须刷🙉

    C语言免费动漫教程,和我一起打卡!
    🌞《光天化日学C语言》🌞

    LeetCode 太难?先看简单题!
    🧡《C语言入门100例》🧡

    数据结构难?不存在的!
    🌳《画解数据结构》🌳

    闭关刷 LeetCode,剑指大厂Offer!
    🌌《LeetCode 刷题指引》🌌

    LeetCode 太简单?算法学起来!
    💜《夜深人静写算法》💜

    前言

      所谓活到老,学到老,虽然我感觉自己已经学了很多算法了,但是昨天熬夜整理完以后发现,自己还是个弟弟,实在忍不住了,打算把 算法学习路线 发出来,我把整个算法学习的阶段总结成了五个步骤,分别为: 基础语法学习(重要)、语法配套练习、数据结构、算法入门、算法进阶。本文梳理了这五个大项的思维导图,在下文会有详细介绍。
      希望各位能够找到自己的定位,通过自己的努力在算法这条路上越走越远。
      刚开始切勿心浮气躁,千万不要给自己立 flag,说一定要把这么多东西都学会。就算你的精力旺盛,日夜操劳,时间也是有限的。所以,首先是明确我们要做什么,然后制定好一个合理的 目标 ,再一点一点将要学习的内容逐步付诸实践才是最重要的。


    图片较大,文章中有拆解,需要原图可以留言找我要哈

    1、基础语法学习

    • 算法是以编程语言为基础的,所以选择一门编程语言来学习是必须的。
    • 因为作者本身是C/C++技术栈的,所以就拿C语言来举例子吧。如果是 Java、Python 技术栈,可以跳过 C语言相关的内容。这一小节,先给出学习路线图,然后我再来讲,每部分应该如何去学。

    1)HelloWorld

    • 无论是 Java、Python、C/C++,想要上手一门语言,第一步一定是 HelloWorld,先不要急着去配环境。如果环境配了几个小时,可能一开始的雄心壮志就被配环境的过程消磨殆尽,更加不要谈日后的丰功伟业了。

    2)让自己产生兴趣

    • 所以,我们需要让这件事情从一开始就变得 有趣,这样才能坚持下去。比如找一个相对较为有趣的教程,这里我会推荐这个:《光天化日学C语言》。听名字就比较搞笑,可能作者本身也不是什么正经人,哈哈哈!虽然不能作为一个严谨的教程去学,起码可以对搞笑的内容先产生兴趣。从而对于语言本身有学习下去的动力。
    • 刚才提到的这个系列,可以先收藏起来。回头再去看,它讲述的是 对白式C语言教学,从最简单的输出 HelloWorld 这个字符串开始讲起,逐渐让读者产生对C语言的兴趣。这个系列的作者是前 WorldFinal 退役选手,一直致力于 将困难的问题讲明白 。我看了他的大部分教程,基本都能一遍看懂。算了,不装了,摊牌了,因为我就是这个作者。

    3)目录是精髓

    • 然后,我们大致看下你选择的教程的前几个章节,那些标题是否有你认知以外的名词出现,比如以这个思维导图为例。
    • 如果你觉得这些名词中有 3 / 4 以上是没有什么概念的。那么,可能需要补齐一些数学、计算机方面的基础知识。反之,我们就可以继续下一步了。

    4)习惯思考并爱上它

    • 只要对一件事情养成习惯以后,你就会发现,再难的事情,都只是一点一点积累的过程。重要的是,每天学习的过程一定要吃透,养成主动思考的好习惯。因为,越到后面肯定是越难的,如果前期不养成习惯,后面很可能心有余而力不足。
    • 就像刷题,一旦不会做就去找解题报告,最后就养成了看解题报告才会做题的习惯。当然这也是一种习惯,只不过不是一种好习惯罢了。

    5)实践是检验真理的唯一标准

    • 光看教程肯定是不行的,写代码肯定还是要动手的,因为有些语法你看一遍,必定忘记。但是写了几遍,永世难忘。这或许就是写代码的魅力所在吧。
    • 所以,记得多写代码实践哟 (^U^)ノ~YO

    6)坚持其实并没有那么难

    • 每天把教程上的内容,自己在键盘上敲一遍,坚持一天,两天,三天。你会发现,第四天就变成了习惯。所以坚持就是今天做了这件事情,明天继续做。

    7)适当给予正反馈

    • 然而,就算再有趣的教程,看多了都会乏味,这是人性决定的,你我都逃不了。能够让你坚持下去的只有你自己,这时候,适当给予自己一些正反馈就显得尤为重要。比如,可以用一张表格将自己的学习计划记录下来,然后每天都去分析一下自己的数据。
    • 当然,你也可以和我一样,创建一个博客,然后每天更新博文,就算没有内容,也坚持日更,久而久之,你会发现,下笔如有神,键盘任我行!更新的内容,可以是自己的学习笔记,心路历程 等等。
    • 看着每天的粉丝量呈指数级增长,这是全网对你的认可,应该没有什么会是比这个更好的正反馈了。
    • 那么,至此,不知道屏幕前的你感想如何,反正正在打字的我已经激情澎湃了。已经全然忘记这一章是要讲C语言基础的了!
    • 介于篇幅,我会把C语言基础的内容,放在这个专栏 《光天化日学C语言》 里面去讲,一天更新一篇,对啊,既然说了要坚持,要养成习惯,我当然也要做到啦~如果你学到了哪一章,可以在评论区评论 “打卡” ,也算是一种全网见证嘛!
    • 我也很希望大家的学习速度能够超越我的更新速度。

    2、语法配套练习

    • 学习的过程中,做题当然也是免不了的,还是应征那句话:实践是检验真理的唯一标准。
    • 而这里的题库,是我花了大量时间,搜罗了网上各大C语言教程里的例题,总结出来的思维导图,可以先大致看一眼:

    • 从数学基础、输入输出、数据类型、循环、数组、指针、函数、位运算、结构体、排序 等几个方面,总结出的具有概括性的例题 100 道 《C语言入门100例》,目前还在更新中。
    • 这里可以列举几个例子:

    1、例题1:交换变量的值

    一、题目描述

      循环输入,每输入两个数 a a a b b b,交换两者的值后输出 a a a b b b。当没有任何输入时,结束程序。

    二、解题思路

    难度:🔴⚪⚪⚪⚪

    • 这个题的核心是考察如何交换两个变量的值,不像 python,我们可以直接写出下面这样的代码就实现了变量的交换。
    a, b = b, a
    
    • 在C语言里,这个语法是错误的。
    • 我们可以这么理解,你有两个杯子 a a a b b b,两个杯子里都盛满了水,现在想把两个杯子里的水交换一下,那么第一个想到的方法是什么?

    当然是再找来一个临时杯子:
      1)先把 a a a 杯子的水倒进这个临时的杯子里;
      2)再把 b b b 杯子的水倒进 a a a 杯子里;
      3)最后把临时杯子里的水倒进 b b b 杯子;

    • 这种就是临时变量法,那么当然,还有很多很多的方法,接下来就让我们来见识一下吧。

    三、代码详解

    1、正确解法1:引入临时变量

    #include <stdio.h>
    int main() {
        int a, b, tmp;
    	while (scanf("%d %d", &a, &b) != EOF) {
    	    tmp = a;   // (1)
    	    a = b;     // (2)
    	    b = tmp;   // (3)
    	    printf("%d %d\n", a, b);
    	}
    	return 0;
    }
    
    • ( 1 ) (1) (1) tmp = a;表示把 a a a 杯子的水倒进这个临时的杯子里;
    • ( 2 ) (2) (2) a = b;表示把 b b b 杯子的水倒进 a a a 杯子里;
    • ( 3 ) (3) (3) b = tmp;表示把临时杯子里的水倒进 b b b 杯子里;
    • 这三步,就实现了变量 a a a b b b 的交换。

    2、正确解法2:引入算术运算

    #include <stdio.h>
    int main() {
        int a, b;
    	while (scanf("%d %d", &a, &b) != EOF) {
    	    a = a + b;   // (1)
    	    b = a - b;   // (2)
    	    a = a - b;   // (3)
    	    printf("%d %d\n", a, b);
    	}
    	return 0;
    }
    
    • ( 1 ) (1) (1) a = a + b;执行完毕后,现在最新的a的值变成原先的a + b的值;
    • ( 2 ) (2) (2) b = a - b;执行完毕后,相当于b的值变成了a + b - b,即原先a的值;
    • ( 3 ) (3) (3) a = a - b;执行完毕后,相当于a的值变成了a + b - a,即原先b的值;
    • 从而实现了变量ab的交换。

    3、正确解法3:引入异或运算

    • 首先,介绍一下C语言中的^符号,代表的是异或。
    • 二进制的异或,就是两个数转换成二进制表示后,按照位进行以下运算:
    左操作数右操作数异或结果
    000
    110
    011
    101
    • 也就是对于 0 和 1,相同的数异或为 0,不同的数异或为 1。
    • 这样就有了三个比较清晰的性质:
    • 1)两个相同的十进制数异或的结果一定位零。
    • 2)任何一个数和 0 的异或结果一定是它本身。
    • 3)异或运算满足结合律和交换律。
    #include <stdio.h>
    int main() {
        int a, b;
    	while (scanf("%d %d", &a, &b) != EOF) {
    	    a = a ^ b;   // (1)
    	    b = a ^ b;   // (2)
    	    a = a ^ b;   // (3)
    	    printf("%d %d\n", a, b);
    	}
    	return 0;
    }
    
    • 我们直接来看 ( 1 ) (1) (1) ( 2 ) (2) (2) 这两句话,相当于b等于a ^ b ^ b,根据异或的几个性质,我们知道,这时候的b的值已经变成原先a的值了。
    • 而再来看最后一句话,相当于a等于a ^ b ^ a,还是根据异或的几个性质,这时候,a的值已经变成了原先b的值。
    • 从而实现了变量ab的交换。

    4、正确解法4:奇淫技巧

    • 当然,由于这个题目问的是交换变量后的输出,所以它是没办法知道我程序中是否真的进行了交换,所以可以干一些神奇的事情。比如这么写:
    #include <stdio.h>
    int main() {
        int a, b;
    	while (scanf("%d %d", &a, &b) != EOF) {
    	    printf("%d %d\n", b, a);
    	}
    	return 0;
    }
    
    • 你学废了吗 🤣?

    2、例题2:整数溢出

    一、题目描述

      先输入一个 t ( t ≤ 100 ) t (t \le 100) t(t100),然后输入 t t t 组数据。每组输入为 4 个正整数 a , b , c , d ( 0 ≤ a , b , c , d ≤ 2 62 ) a,b,c,d(0 \le a,b,c,d \le 2^{62}) a,b,c,d(0a,b,c,d262),输出 a + b + c + d a+b+c+d a+b+c+d 的值。

    二、解题思路

    难度:🔴🔴⚪⚪⚪

    • 这个问题考察的是对补码的理解。
    • 仔细观察题目给出的四个数的范围: [ 0 , 2 62 ] [0, 2^{62}] [0,262],这四个数加起来的和最大值为 2 64 2^{64} 264。而C语言中,long long的最大值为: 2 63 − 1 2^{63}-1 2631,就算是unsigned long long,最大值也只有 2 64 − 1 2^{64}-1 2641
    • 但是我们发现,只有当四个数都取得最大值 2 62 2^{62} 262 时,结果才为 2 64 2^{64} 264,所以可以对这一种情况进行特殊判断,具体参考代码详解。

    三、代码详解

    #include <stdio.h>
    typedef unsigned long long ull;                           // (1)
    const ull MAX = (((ull)1)<<62);                           // (2)
    
    int main() {
    	int t;
    	ull a, b, c, d;
    	scanf("%d", &t);
    	while (t--) {
    		scanf("%llu %llu %llu %llu", &a, &b, &c, &d);     // (3)
    		if (a == MAX && b == MAX && c == MAX && d == MAX) // (4)
    			printf("18446744073709551616\n");             // (5)
    		else
    			printf("%llu\n", a + b + c + d);              // (6)
    	}
    	return 0;
    }
    
    • ( 1 ) (1) (1) 由于这题数据量较大,所有数据都需要用64位无符号整型。ull作为unsigned long long的别名;
    • ( 2 ) (2) (2) 用常量MAX表示 2 62 2^{62} 262,这里采用左移运算符直接实现 2 2 2 是幂运算;
    数学C语言
    2 n 2^n 2n1<<n
    • 需要注意的是,由于 1 是int类型,所以需要对 1 进行强制转换。(ull)1等价于(unsigned long long)1
    • ( 3 ) (3) (3) %llu是无符号64位整型的输入方式;
    • ( 4 ) (4) (4) 这里是对所有数都等于最大值的特殊判断,&&运算符的优先级低于==,所以这里不加括号也没事;
    • ( 5 ) (5) (5) 由于 2 64 2^{64} 264 是无法用数字的形式输出的,所以我们提前计算机算好以后,用字符串的形式进行输出;
    • ( 6 ) (6) (6) 其它情况都在 [ 0 , 2 64 − 1 ] [0, 2^{64}-1] [0,2641] 范围内,直接相加输出即可。

    3、数据结构

    • 《C语言入门100例》上的例题,如果能理解前面 25 道,那基本C语言的学习就可以告一段落了,接下来就要开始我们的数据结构的学习了。

    1、什么是数据结构

    • 你可能听说过 数组、链表、队列、栈、堆、二叉树、图,没错,这些都是数据结构,但是你要问我什么是数据结构,我突然就一脸懵逼了。
    • 如果一定要给出一个官方的解释,那么它就是:

    计算机存储、组织数据的方式。相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。往往同高效的检索算法和索引技术有关。

    • 是不是还不如说它是堆,是栈,是队列呢?
    • 是这样的,我们学习的过程中,跳过一些不必要的概念,能够节省我们更多的时间,从而达到更好的效果,当你还在理解数据结构是什么的时候,可能人家已经知道了栈有哪些操作了。

    2、数据结构和算法的关系

    • 很多同学搞不明白,数据结构与算法有哪些千丝万缕的关系?甚至有些同学以为算法里本身就包含了数据结构。
    • 数据结构主要讲解数据的组织形式,比如链表,堆,栈,队列。
    • 而算法,则注重的是思想,比如链表的元素怎么插入、删除、查找?堆的元素怎么弹出来的?栈为什么是先进后出?队列又为什么是先进先出?
    • 讲得直白一点,数据结构是有实体的,算法是虚拟的;数据结构是物质上的,算法是精神上的。当然,物质和精神 缺一不可。

    3、数据结构概览

    • 周末花了一个下午整理的思维导图,数据结构:
    • 数据结构相关入门可以参考以下文章:数据结构入门

    4、算法入门

    • 算法入门,其实就是要开始我们的刷题之旅了。先给出思维导图,然后一一介绍入门十大算法。
    • 十个最基础的算法可以参考以下文章:算法入门精选

    5、算法进阶

    • 算法进阶这块是我打算规划自己未来十年去完成的一个项目,囊括了 大学生ACM程序设计竞赛、高中生的OI竞赛、LeetCode 职场面试算法 的算法全集,也就是之前网络上比较有名的 《夜深人静写算法》 系列,这可以说是我自己对自己的一个要求和目标吧。
    • 如果只是想进大厂,那么 算法入门 已经足够了,不需要再来看算法进阶了,当然如果对算法有浓厚兴趣,也欢迎和我一起打卡。由于内容较难,工作也比较忙,所以学的也比较慢,一周基本也只能更新一篇。

    这个系列主要分为以下几个大块内容:
      1)图论
      2)动态规划
      3)计算几何
      4)数论
      5)字符串匹配
      6)高级数据结构(课本上学不到的)
      7)杂项算法

    • 先来看下思维导图,然后我大致讲一下每一类算法各自的特点,以及学习方式:

    在这里插入图片描述

    1)图论

    1、搜索概览

    • 图论主要围绕搜索算法进行展开。搜索算法的原理就是枚举。利用计算机的高性能,给出人类制定好的规则,枚举出所有可行的情况,找到可行解或者最优解。
    • 比较常见的搜索算法是 深度优先搜索(又叫深度优先遍历) 和 广度优先搜索(又叫广度优先遍历 或者 宽度优先遍历)。各种图论的算法基本都是依靠这两者进行展开的。

    2、深度优先搜索

    • 深度优先搜索一般用来求可行解,利用剪枝进行优化,在树形结构的图上用处较多;而广度优先搜索一般用来求最优解,配合哈希表进行状态空间的标记,从而避免重复状态的计算;
    • 原则上,天下万物皆可搜,只是时间已惘然。搜索会有大量的重复状态出现,这里的状态和动态规划的状态是同一个概念,所以有时候很难分清到底是用搜索还是动态规划。
    • 但是,大体上还是有迹可循的,如果这个状态不能映射到数组被缓存下来,那么大概率就是需要用搜索来求解的。
    • 如图所示,代表的是一个深度优先搜索的例子,红色实箭头表示搜索路径,蓝色虚箭头表示回溯路径。
    • 红色块表示往下搜索,蓝色块表示往上回溯,遍历序列为:
    	0 -> 1 -> 3 -> 4 -> 5 -> 2 -> 6
    
    • 同样,搜索的例子还有:
    • 计算的是利用递归实现的 n n n 的阶乘。

    3、记忆化搜索

    • 对于斐波那契函数的求解,如下所示:
    • f ( n ) = { 1 ( n = 0 ) 1 ( n = 1 ) f ( n − 1 ) + f ( n − 2 ) ( n > 2 ) f(n) = \begin{cases}1 & (n = 0) \\1 & (n = 1) \\f(n-1) + f(n-2) & (n > 2) \end{cases} f(n)=11f(n1)+f(n2)(n=0)(n=1)(n>2)
    • 对于 f ( 5 ) f(5) f(5) 的求解,程序调用如下:
      在这里插入图片描述
    • 这个过程用到了很多重复状态的搜索,我们需要将它优化,一般将一些状态缓存起来。
    • 我们通过一个动图来感受一下:
      在这里插入图片描述
    • 当第二次需要计算 f ( 2 ) f(2) f(2) f ( 3 ) f(3) f(3) 时,由于结果已经计算出来并且存储在 h [ 2 ] h[2] h[2] h [ 3 ] h[3] h[3] 中,所以上面这段代码的fib != inf表达式为真,直接返回,不再需要往下递归计算,这样就把原本的 “递归二叉树” 转换成了 “递归链”, 从而将原本指数级的算法变成了多项式级别。
    • 这就是记忆化搜索,像这种把状态缓存起来的方法,就是动态规划的思想了。

    4、广度优先搜索

    • 单向广搜就是最简化情况下的广度优先搜索(Breadth First Search),以下简称为广搜。游戏开发过程中用到的比较广泛的 A* 寻路,就是广搜的加强版。
    • 我们通过一个动图来对广搜有一个初步的印象。

    • 从图中可以看出,广搜的本质还是暴力枚举。即对于每个当前位置,枚举四个相邻可以行走的方向进行不断尝试,直到找到目的地。有点像洪水爆发,从一个源头开始逐渐蔓延开来,直到所有可达的区域都被洪水灌溉,所以我们也把这种算法称为 FloodFill。
    • 那么,如何把它描述成程序的语言呢?这里需要用到一种数据结构 —— 队列。
    • 这时候,算法和数据结构就完美结合了。

    2)动态规划

    动态规划算法三要素:
      ①所有不同的子问题组成的表;
      ②解决问题的依赖关系可以看成是一个图;
      ③填充子问题的顺序(即对②的图进行拓扑排序,填充的过程称为状态转移);

    • 如果子问题的数目为 O ( n t ) O(n^t) O(nt),每个子问题需要用到 O ( n e ) O(n^e) O(ne) 个子问题的结果,那么我们称它为 tD/eD 的问题,于是可以总结出四类常用的动态规划方程:(下面会把opt作为取最优值的函数(一般取 m i n min min m a x max max ), w ( j , i ) w(j, i) w(j,i)为一个实函数,其它变量都可以在常数时间计算出来)。

    1、1D/1D

    • d [ i ] = o p t ( d [ j ] + w ( j , i ) ∣ 0 < = i < j ) d[i] = opt( d[j] + w(j, i) | 0 <= i < j ) d[i]=opt(d[j]+w(j,i)0<=i<j)
    • 状态转移如图四所示(黄色块代表 d [ i ] d[i] d[i],绿色块代表 d [ j ] d[j] d[j]):
    • 这类状态转移方程一般出现在线性模型中。

    2、2D/0D

    • d [ i ] [ j ] = o p t ( d [ i − 1 ] [ j ] + x i , d [ i ] [ j − 1 ] + y j , d [ i − 1 ] [ j − 1 ] + z i j ) d[i][j] = opt( d[i-1][j] + x_i, d[i][j-1] + y_j, d[i-1][j-1] + z_{ij} ) d[i][j]=opt(d[i1][j]+xi,d[i][j1]+yj,d[i1][j1]+zij)
    • 状态转移如图四所示:
    • 比较经典的问题是最长公共子序列、最小编辑距离。
    • 有关最长公共子序列的问题,可以参考以下文章:夜深人静写算法(二十一)- 最长公共子序列
    • 有关最小编辑距离的问题,可以参考以下文章:夜深人静写算法(二十二)- 最小编辑距离

    3、2D/1D

    • d [ i ] [ j ] = w ( i , j ) + o p t ( d [ i ] [ k − 1 ] + d [ k ] [ j ] ) d[i][j] = w(i, j) + opt( d[i][k-1] + d[k][j] ) d[i][j]=w(i,j)+opt(d[i][k1]+d[k][j])
    • 区间模型常用方程,如图所示:
      在这里插入图片描述
    • 另外一种常用的 2D/1D 的方程为:
    • d [ i ] [ j ] = o p t ( d [ i − 1 ] [ k ] + w ( i , j , k ) ∣ k < j ) d[i][j] = opt( d[i-1][k] + w(i, j, k) | k < j ) d[i][j]=opt(d[i1][k]+w(i,j,k)k<j)

    4、2D/2D

    • d [ i ] [ j ] = o p t ( d [ i ′ ] [ j ′ ] + w ( i ′ , j ′ , i , j ) ∣ 0 < = i ′ < i , 0 < = j ′ < j ) d[i][j] = opt( d[i'][j'] + w(i', j', i, j) | 0 <= i' < i, 0 <= j' < j) d[i][j]=opt(d[i][j]+w(i,j,i,j)0<=i<i,0<=j<j)
    • 如图所示:
      在这里插入图片描述
    • 常见于二维的迷宫问题,由于复杂度比较大,所以一般配合数据结构优化,如线段树、树状数组等。
    • 对于一个tD/eD 的动态规划问题,在不经过任何优化的情况下,可以粗略得到一个时间复杂度是 O ( n t + e ) O(n^ {t+e}) O(nt+e),空间复杂度是 O ( n t ) O(n^t) O(nt) 的算法,大多数情况下空间复杂度是很容易优化的,难点在于时间复杂度,后续章节将详细讲解各种情况下的动态规划优化算法。

    3)计算几何

    • 计算几何的问题是代码量最大的。它是计算机科学的一个分支,以往的解析几何,是用代数的方法,建立坐标系去解决问题,但是很多时候需要付出一些代价,比如精度误差,而计算几何更多的是从几何角度,用向量的方法来尽量减少精度误差,例如:将除法转化为乘法、避免三角函数等近似运算 等等。
    • 如果一个比赛中,有一道计算几何的题,那么至少,它不会是一道水题。

    1、double 代替 float

    • c++ 中 double 的精度高于 float,对精度要求较高的问题,务必采用 double;

    2、浮点数判定

    • 由于浮点数(小数)中是有无理数的,即无限不循环小数,也就是小数点后的位数是无限的,在计算机存储的时候不可能全部存下来,一定是近似的存储的,所以浮点数一定是存在精度误差的(实际上,就算是有理数,也是存在误差的,这和计算机存储机制有关,这里不再展开,有兴趣可以参见我博客的文章:C++ 浮点数精度判定);
    • 两个浮点数是否相等,可以采用两数相减的绝对值小于某个精度来实现:
    const double eps = 1e-8;
    bool EQ(double a, double b) {
        return fabs(a - b) < eps;
    }
    
    • 并且可以用一个三值函数来确定某个数是零、大于零还是小于零:
    int threeValue(double d) {
        if (fabs(d) < eps)
            return 0;
        return d > 0 ? 1 : -1;
    }
    

    3、负零判定

    • 因为精度误差的存在,所以在输出的时候一定要注意,避免输出 -0.00:
        double v = -0.0000000001;
        printf("%.2lf\n", v);
    
    • 避免方法是先通过三值函数确定实际值是否为0,如果是0,则需要取完绝对值后再输出:
        double v = -0.0000000001;
        if(threeValue(v) == 0) {
            v = fabs(v);
        }
        printf("%.2lf\n", v);
    

    4、避免三角函数、对数、开方、除法等

    • c++ 三角函数运算方法采用的是 CORDIC算法,一种利用迭代的方式进行求解的算法,其中还用到了开方运算,所以实际的算力消耗还是很大的,在实际求解问题的过程中,能够避免不用就尽量不用。
    • 除法运算会带来精度误差,所以能够转换成乘法的也尽量转换为乘法运算。

    5、系统性的学习

    基础知识:点、向量、叉乘、点乘、旋转、线段、线段判交、三角形面积;
    进阶知识:多边形面积、凸多边形判定、点在多边形内判定;
    相关算法:二维凸包、三维凸包、旋转卡壳、多边形面积交、多边形面积并、多边形面积异或、多边形和圆的面积交、半平面交、最小覆盖圆、最小包围球、模拟退火。

    • 学习计算几何,最好是系统性的,刷题的过程中不断提炼出自己的模板。

    4)数论

    • 刷题的时候遇到不会的数论题,真的是很揪心,从头学起吧,内容实在是太多了,每个知识点都要证明吃透,不然下次遇到还是不会;不学吧,又不甘心,就是单纯的想把这个题过了,真是进退两难!
    • 数论对一个人的数学思维要求较高,但是一般也是一些固定的模式,所以把模板整理出来很重要。
    • 当然,数论也有简单问题,一般先做一些入门题提升信心。

    1、数论入门

    • 主要是一些基本概念,诸如:
    • 整除性、素数与合数、素数判定、素数筛选法、因数分解、算术基本定理、因子个数、因子和、最大公约数 (GCD) 和 最小公倍数 (LCM)、辗转相除、同余、模运算、快速幂取模、循环节;

    2、数论四大定理

    • 这四个定理学完,可以KO很多题:
    • 欧拉定理、中国剩余定理、费马小定理、威尔逊定理

    3、数论进阶

    • 系统性的学习,基本也就这些内容了:
    • 扩展欧几里得、逆元、欧拉函数、同余方程组、扩展欧拉定理、RSA、卢卡斯定理、整数分块、狄利克雷卷积、莫比乌斯反演、大数判素、大数因子分解、大步小步离散对数等等。

    5)字符串匹配

    • 字符串匹配学习路线比较明确。
    • 先学习前缀匹配:字典树。
    • 然后可以简单看一下回文串判定算法:Manacher。
    • 以及经典的单字符串匹配算法:KMP。
    • 实际上平时最常用的还是 BM 算法,而ACM中基本不考察。
    • 然后就是较为高阶的 前缀自动机、后缀数组、后缀树、后缀自动机了。

    • 关于 《画解数据结构》学习路线 的内容到这里就结束了。
    • 如果还有不懂的问题,可以 「 想方设法 」找到作者的「 联系方式 」 ,随时线上沟通。

    展开全文
  • 分分钟教你绘制基因结构图

    千次阅读 2020-12-02 15:19:20
    原标题:分分钟教你绘制基因结构图!最近全国大幅度降温,这样的天气最适合坐在电脑前整理整理数据,看看文献,作作图表...还可以联合其他数据绘制进化树-基因结构图,展现基因结构与系统进化关系。 打开这个工具,...

    原标题:分分钟教你绘制基因结构图!

    最近全国大幅度降温,这样的天气最适合坐在电脑前整理整理数据,看看文献,作作图表。小编今天给大家介绍一款在线绘制基因结构的工具Gene Structure Dispaly Server,简单好用功能还挺强大。运用它能够绘制清晰的基因结构,清晰明了地展示外显子、内含子及UTR的位置。还可以联合其他数据绘制进化树-基因结构图,展现基因结构与系统进化关系。

    打开这个工具,它的界面如下:

    1.数据输入类型

    绘图的输入文件有四种类型的数据可选:

    BED:大家可以在基因组GFF文件筛选基因的这些信息,第一列是基因ID,第二列是起始位置,第三列是终止位置,第四列是基因在这个位置是外显子还是UTR,第四列是注释信息,第四列可以不要

    GenBank Accession Number or GI:可以从GenBank获得,要注意的是你输入的Accession Number or GI必须包含有mRNA序列

    GTF/GFF3:基因注释文件(包含基因的结构信息,具体信息可以自行百度,有详细解释),可以在数据库中下载基因组的GFF文件,筛选出你的基因注释信息

    Sequence (FASTA):第一个框里存放基因的CDS序列,第二个框里存放基因的完整序列,可以在NCBI数据库下载,或者在基因组数据中搜索需要ID的序列

    小编这里推荐BED格式数据,数据格式简单,可以在基因组GFF文件筛选基因的这些信息 ,可以看我们以前文章(如何下下载一个基因组)下载基因组GFF文件

    2.绘图及图片的修改和保存

    选中一个数据类型,点击Example,就会显示一个该类型数据的例子,可以将自己的数据直接复制粘贴到下图框里,或者直接选择存放数据的文件导入数据。

    数据输入后点击右下角的Submit就会跳转到结果页面。如果想保存这张图片,右下角有三种图片保存类型。选中你想要保存的图片格式,例如你想保存图片为PNG格式,单击PNG就会弹出一个图片界面。

    下图为弹出的图片页面,右键网页另存为就会弹出一个框,输入图片名字点击保存就可以了。

    如果你觉得网站的颜色不好看,你可以改变这些位点的颜色,例如想修改代表 CDS的形状的颜色,点击左下方Color后面的黄色的框,就会弹出一个选颜色的界面,在Solid Color界面选取颜色,点击OK就会又回到结果的界面,再点击图片左下方的Redraw,所有代表CDS的形状就会变成你选择的颜色。

    下图为修改颜色后的图片:

    3.添加其他信息绘图

    基础功能就讲完了,说好的功能强大呢!不要慌,下面给大家介绍两个延伸功能。第一是能将进化树跟基因结构结合在一起,第二除了进化树和基因结构还能添加基因的其他结构信息例如motif或者是domain。

    首先我们将进化树跟基因结构结合在一起,先导入基因结构数据文件,点击下图绿色数据框所在的位置,就会延伸出一个输入数据界面,输入构建进化树时生成的nwk文件(注意:进化树文件中的ID必须要与基因结构数据里的ID一致),点击Submit就能生成图片,图片的保存与修改参照上面方法。

    如果你还想在图片里显示基因的其他信息例如motif或者是domain,点开Other Features,输入数据,第一列是ID,第二三列分别是这个位点的起始、结束,第三列是这个位点的名称,例如motif1或者domain的名称,点击Submit绘图。

    大功告成,又是一张好看实用的图片。

    如果您有什么心得建议,欢迎来评论区留言讨论!

    另附工具地址:http://gsds.cbi.pku.edu.cn/index.php,点开就能使用,再也不用担心画图了!

    更多生物信息技能,请到组学大讲堂进行学习,超多人学习,超高好评的生信视频等你来:

    https://study.163.com/provider/400000000234009/course.htm?share=1&shareId=1031472710返回搜狐,查看更多

    责任编辑:

    展开全文
  • 针对现有基于生成文本和社交关系的联合位置推断方法对社交媒体中异质数据间的位置关联性挖掘不充分的问题,提出了一种基于多种提及关系的社交媒体用户位置推断方法。首先,综合考虑社交媒体文本中用户之间的提及关系...
  • word树状怎么分支

    千次阅读 2021-01-17 12:33:12
    方式:1、在“绘图”工具栏上,单击“插入组织结构图或其他图示”,如1所示,在接着出现的“图示库”中选择“用于显示层次关系”的第一种后,单击“确定”按钮后会出现一个层次结构图,如2所示。这时,在方框中...
  • 解压 解压后,得到 3 个文件,只需要用到两个: sakila-schema.sql :数据库结构文件 sakila-data.sql: 数据文件 3. 导入 MySQL 对于 Linux: mysql> source /home/data/sakila-db/sakila-schema.sql; mysql> ...
  • 微信小程序 之 Hello World!

    千次阅读 2021-05-24 09:34:06
      在微信小程序之前,最好要有一些JavaScript和Html、css的基础,不过没有也没关系,学习中慢慢了解也可以,只不过你需要花费的时间就多一些。 正文   微信小程序的开发常规是使用微信开放平台提供的工具
  • 为工程目录结构 . ├── hello.c ├── hello.h ├── main.c ├── Makefile ├── world.c └── world.h hello.c文件 #include<stdio.h> #include"hello.h" void hello() { prin
  • 机器学习 tensorflow 2 的hello world

    千次阅读 2019-10-24 08:34:31
    我们学习什么都是学习一个最简单例子开始,有时就叫hello world。 我们学basic, c,c++,python,最简单的程序就是打印显示一个hello world。 ...写一个最简单的tensorflow 程序,演示其基本结构...
  • 鸿蒙——HelloWorld

    2021-10-27 16:12:27
    文章目录[隐藏] 安装软件 注册登录 HelloWorld 页面的包含关系 配置文件 启动流程 安装软件 参考HUAWEI DevEco Studio – HarmonyOS应用开发官网,随后根据个人喜好进行个性化设置 注册登录...
  • 在word中树状的方法步骤详解

    千次阅读 2021-01-17 12:33:13
    word中树状的方法word中树状的方法1在“绘图”工具栏上,单击“插入组织结构图或其他图示”,如1所示,在接着出现的“图示库”中选择“用于显示层次关系”的第一种后,单击“确定”按钮后会出现一个层次...
  • IntelliJ IDEA使用教程 (总目录篇) ...然后我就示范一下,如何使用这个IntelliJ IDEA 创建一个Java web 项目的hello world项目。 因为maven的中央仓库不一定是国产的,所以,你在跟我测试的时候,可能...
  • SQL(Structured Query Language)结构化查询语言,是一种用于操作关系数据库的标准化计算机语言。 它也可以设计“Hello, World!”。 CREATE   TABLE  message ( text   char ( 15 )); INSERT   INTO  message...
  • redis的五种数据结构

    千次阅读 2022-01-26 19:04:21
    简而言之,redis就是一个速度非常快的非关系型数据库(Nosql),可以存储键(key)与五种不同类型的值(value)之间的映射,就像散列表一样。 提示:以下是本篇文章正文内容,下面案例可供参考 一、字符串(Strin....
  • SLAM GMapping(3)地图结构

    千次阅读 2021-12-30 19:59:05
    地图是整个SLAM建图过程中维护的对象,简单解析GMapping中的扫描匹配地图数据结构ScanMatcherMap
  • 了解这些游戏的共同结构有助于理解特定方法有效的原因及其局限。论文研究的就是现实游戏的几何结构。 在论文提出的Game of Skill假说中,策略显示出类似陀螺的几何结构。纵轴表示transitive strength,横轴表示non-...
  • er转换成关系模型 关系 (Relations) Relations specify that how a entity of a entity set is related to the entity of other set. 关系指定一个实体集的实体如何与另一个集的实体相关。 关系类型 (Types of ...
  • 【java基础】hello, world

    千次阅读 2020-04-28 14:19:01
    背景 在学习每一个编程语言的时候,在第一次使用这个编程语言编程时,我们都应该...因为《The C Programming Language》中使用它为第一个演示程序,非常著名,所以后来的程序员在学习编程或进行设备调试时延续了这...
  • 使用联机搜索求解Wumpus World

    千次阅读 多人点赞 2020-11-12 18:19:55
    Wumpus World PEAS 描述: 性能度量: gold +1000, death -1000- 1 per step, -10 for using the arrow 环境描述: Squares adjacent to wumpusare smelly Squares adjacent to pit are breezy Glitter iffgold is ...
  • 最简单的JVM内存结构图

    千次阅读 2021-03-11 20:42:03
    JVM内存结构图 方法区 堆 栈 程序计数器 本地方法栈 直接内存 内存分配性能优化-逃逸分析 总结 JVM内存结构图 大家好,好几天没有更新了,今天的内容有点多,我们详细介绍下JVM内部结构图,还是和之前...
  • 文章目录TIOBE介绍HelloWorld TIOBE介绍 TIOBE排行榜 [1] 是根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube和Baidu(百度)统计出...
  • Python3数据结构

    千次阅读 多人点赞 2022-01-31 14:43:11
    Python3数据结构数字 Number数字类型转换数字运算字符串 str字符串的查询字符串大小写转换字符串对齐字符串拆分、切片字符串判断相关字符串其他操作格式化字符串输出字符串编码列表 list列表的特点列表的创建列表...
  • 以hello world为例,详细分析程序的运行过程 (一)环境说明: IDE :Visual Studio 2017 语言:C++ 示例代码: #include<iostream> using namespace std; void main() { cout << “Hello World”; } 在...
  • 该系列文章主要讲解知识图谱及Neo4j数据库的用法,本篇文章是作者学习《Neo4j基础入门》书籍的在线笔记,主要讲解Neo4j的基础知识及基本语法,希望大家喜欢。
  • neo4j的Hello World

    千次阅读 2022-03-23 15:42:19
    总结 在计算机科学中,数据库(英语:graph database,GDB[1])是一个使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。该系统的关键概念是,它直接将存储中的数据项,与数据节点和节点...
  • 初识C语言与Hello world

    2022-03-10 17:14:33
    相信大家在编程初期都会学到C语言并且让你编写程序在屏幕上输出Hello world,但关于Hello world你又了解多少呢?下面就让我带着大家一起去了解C语言和Hello world。 C语言作为计算机编程语言,具有功能强、语句...
  • 软件体系结构期末考试总结

    万次阅读 多人点赞 2019-12-30 23:19:35
    今天刚考完软件体系结构,把考前的知识点总结发到群里,仅供自己参考,但是里面的内容确实有用也是面试会问到的基础,所以这门课很重要的还是,只可惜我是预习了一两天就参加考试了 对了我们的教材是《软件工程体系...
  • Towards Open World Object Detection 论文:https://arxiv.org/abs/2103.02603 代码:https://github.com/JosephKJ/OWOD 摘要 人类拥有认知身边未知事物的天性。当最后有相应的知识可用的时候,对未知实例...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 158,345
精华内容 63,338
关键字:

world做结构关系图