stroke-width 外部輪廓的邊框的大小

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到黎平網(wǎng)站設(shè)計(jì)與黎平網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋黎平地區(qū)。
bbsmax
繪制基本圖形和線型(StrokeStyle)的設(shè)置詳解
HackerVirus 2022-10-20 原文
繪制基本圖形和線型(StrokeStyle)的設(shè)置詳解
目前,在博客園上,相對(duì)寫得比較好的兩個(gè)關(guān)于Direct2D的教程系列,分別是萬(wàn)一的Direct2D系列和zdd的Direct2D系列。有興趣的網(wǎng)友可以去看看。本系列也是介紹Direct2D的教程,是基于Windows API Code Pack 1.1的Direct2D的教程,如果要調(diào)試文中的代碼的話,還得參考前文 Direct2D教程I——簡(jiǎn)介及首個(gè)例子 下載導(dǎo)入Windows API Code Pack 1.1的動(dòng)態(tài)庫(kù)
在前文 Direct2D教程I——簡(jiǎn)介及首個(gè)例子 簡(jiǎn)單介紹了Direct2D,并給了一個(gè)簡(jiǎn)單的示例。接下來(lái),本文對(duì)一些基本的繪圖命令做個(gè)介紹
繪制基本圖形:直線、矩形、圓角矩形、橢圓
和GDI+類似,在RenderTarget對(duì)象下有各個(gè)繪圖命令(GDI+是在Graphics對(duì)象下有各個(gè)繪圖命令),下面是各個(gè)基本圖形的繪圖命令的函數(shù)原型
直線:
Public Sub DrawLine(firstPoint As Direct2D1.Point2F, secondPoint As Direct2D1.Point2F, brush As Direct2D1.Brush, skrokeWidth As Single, strokeStyle AsDirect2D1.StrokeStyle)
矩形:
Public Sub DrawRectangle(rect As Direct2D1.RectF, brush As Direct2D1.Brush, strokeWidth As Single)
Public Sub DrawRectangle(rect As Direct2D1.RectF, brush As Direct2D1.Brush, strokeWidth As Single, strokeStyle As Direct2D1.StrokeStyle)
Public Sub FillRectangle(rect As Direct2D1.RectF, brush As Direct2D1.Brush)
圓角矩形:
Public Sub DrawRoundedRectangle(roundedRect As Direct2D1.RoundedRect, brush As Direct2D1.Brush, strokeWidth As Single)
Public Sub DrawRoundedRectangle(roundedRect As Direct2D1.RoundedRect, brush As Direct2D1.Brush, strokeWidth As Single, strokeStyle As Direct2D1.StrokeStyle)
Public Sub FillRoundedRectangle(roundedRect As Direct2D1.RoundedRect, brush As Direct2D1.Brush)
橢圓:
Public Sub DrawEllipse(ellipse As Direct2D1.Ellipse, brush As Direct2D1.Brush, strokeWidth As Single)
Public Sub DrawEllipse(ellipse As Direct2D1.Ellipse, brush As Direct2D1.Brush, strokeWidth As Single, strokeStyle As Direct2D1.StrokeStyle)
Public Sub FillEllipse(ellipse As Direct2D1.Ellipse, brush As Direct2D1.Brush)
從上面的函數(shù)原型可以看出,以Draw開頭的函數(shù)都是繪制函數(shù)。以Fill開頭的函數(shù)都是填充函數(shù)。繪制函數(shù)的線寬由strokeWidth參數(shù)指定,繪制函數(shù)的線型由strokeStyle參數(shù)指定(默認(rèn)是實(shí)線)。和GDI+不同的是,在Direct2D中,不再區(qū)分Brush(畫刷)和Pen(畫筆)對(duì)象,而統(tǒng)一用Brush(畫刷)對(duì)象,在用Brush(畫刷)繪制線的時(shí)候再指定線寬和線型參數(shù)。
從參數(shù)strokeWidth和參數(shù)strokeStyle來(lái)看,都帶有單詞stroke。熟悉PS的都知道,stroke指的是描邊,在PS中描邊的位置分為“外部”、“內(nèi)部”、“居中”。那么在Direct2D中,這里的描邊的位置在哪兒呢?我們用代碼實(shí)驗(yàn)一下。
說(shuō)明:為了代碼的復(fù)用,我們把前文中的_d2DFactory和_renderTarget修飾限定詞從Private改為Protected。這樣在后面的例子中直接繼承前文的類,也可以直接用_d2DFactory和_renderTarget這兩個(gè)對(duì)象。
先給出Point2F、RectF、RoundedRect、Ellipse這四個(gè)類的原型定義,參數(shù)都簡(jiǎn)介明了,不再詳述
Direct2D1.Point2F(x As Single, y As Single)
Direct2D1.RectF(left As Single, top As Single, right As Single, buttom As Single)
Direct2D1.RoundedRect(rect As Direct2D1.RectF, radiusX As Single, radiusY As Single)
Direct2D1.Ellipse(point As Direct2D1.Point2F, radiusX As Single, radiusY As Single)
下面是實(shí)驗(yàn)示例代碼
Public Class clsDirect2DSample2
Inherits clsDirect2DSample
Public Shadows Sub Render()
If Not _renderTarget Is Nothing Then
With _renderTarget
.BeginDraw()
Dim F1 As New Direct2D1.RectF(0, 0, 100, 50)
Dim F2 As New Direct2D1.RectF(200, 200, 300, 250)
Dim B As Direct2D1.SolidColorBrush = _renderTarget.CreateSolidColorBrush(New Direct2D1.ColorF(1, 0, 0))
_renderTarget.DrawRectangle(F1, B, 10)
_renderTarget.DrawRectangle(F2, B, 10)
.EndDraw()
End With
End If
End Sub
End Class
從上圖的代碼來(lái)看,在(0,0)位置上畫了一個(gè)100*50的矩形,描邊寬度10px。在(200,200)位置上畫了一個(gè)矩形,描邊寬度10px,如下圖所示
從上面的效果可以看出兩點(diǎn):
一是左上角的矩形說(shuō)明,Direct2D中的描邊類型應(yīng)該是“居中”;
二是右邊的矩形說(shuō)明Direct2D中的RectF定義和原本GDI+中的RectangleF定義不同,Direct2D中的RectF中后兩個(gè)參數(shù)是右下角的坐標(biāo),而GDI+中的RectangleF中的后兩個(gè)參數(shù)指的是矩形的寬和高。
線型(StrokeStyle)的設(shè)置
在上面的函數(shù)原型中,線型是由參數(shù)strokeStyle決定的,它是StrokeStyle類。這個(gè)類不能直接初始化,必須由D2DFactory對(duì)象的CreateStrokeStyle函數(shù)創(chuàng)建(Direct2D中有不少的類不能直接初始化,必須由D2DFactory或RenderTarget對(duì)象的相應(yīng)的函數(shù)創(chuàng)建,如上面的SolidColorBrush對(duì)象就必須由RenderTarget對(duì)象的CreateSolidColorBrush函數(shù)創(chuàng)建)。
先看看CreateStrokeStyle函數(shù)的原型定義:
Public Function CreateStrokeStyle(strokeStyleProperties As Direct2D1.StrokeStyleProperties) As Direct2D1.StrokeStyle
Public Function CreateStrokeStyle(strokeStyleProperties As Direct2D1.StrokeStyleProperties, dashes() As Single) As Direct2D1.StrokeStyle
主要是通過(guò)strokeStyleProperties參數(shù)來(lái)設(shè)置線型,來(lái)看看StrokeStyleProperties結(jié)構(gòu)及其參數(shù)對(duì)象的原型定義。
Direct2D1.StrokeStyleProperties(startCap As Direct2D1.CapStyle, endCap As Direct2D1.CapStyle, dashCap As Direct2D1.CapStyle, _
lineJoin As Direct2D1.LineJoin, miterLimit As Single, _
dashStyle As Direct2D1.DashStyle, dashOffset As Single)
Public Enum CapStyle
Flat = 0
Square = 1
Round = 2
Triangle = 3
End Enum
Public Enum LineJoin
Miter = 0
Bevel = 1
Round = 2
MiterOrBevel = 3
End Enum
Public Enum DashStyle
Solid = 0
Dash = 1
Dot = 2
DashDot = 3
DashDotDot = 4
Custom = 5
End Enum
其中CapStyle枚舉指的是線端的線頭類型,分別是Flat(平整,即無(wú))、Square(方塊)、Round(圓)、Triangle(三角)。和GDI+中的DashCap枚舉類似,多了一個(gè)Square(方塊),而在下面的例子中會(huì)說(shuō)明Flat和Square的區(qū)別。參數(shù)startCap決定線起點(diǎn)的線頭類型、endCap決定線終點(diǎn)的線頭類型、dashCap決定中間劃線端的線頭類型。
而DashStyle枚舉指的是線型,分別是Solid(實(shí)線)、Dash(劃線)、Dot(點(diǎn)線)、DashDot(點(diǎn)劃線)、DashDotDot(點(diǎn)點(diǎn)劃線)、Custom(自定義)。和GDI+中的DashStyle一樣。
參數(shù)dashOffset指的是點(diǎn)劃線的偏移量
下面的代碼是對(duì)上面的兩個(gè)枚舉的演示,請(qǐng)注意枚舉CapStyle中的Flat和Square的區(qū)別。
Public Class clsDirect2DSample3
Inherits clsDirect2DSample
Public Shadows Sub Render()
If Not _renderTarget Is Nothing Then
With _renderTarget
.BeginDraw()
Dim B As Direct2D1.SolidColorBrush = _renderTarget.CreateSolidColorBrush(New Direct2D1.ColorF(1, 0, 0))
Dim SP As New Direct2D1.StrokeStyleProperties()
Dim S As Direct2D1.StrokeStyle
SP.StartCap = Direct2D1.CapStyle.Flat
SP.EndCap = Direct2D1.CapStyle.Flat
S = _d2DFactory.CreateStrokeStyle(SP)
_renderTarget.DrawLine(New Direct2D1.Point2F(10, 20), New Direct2D1.Point2F(200, 20), B, 8, S)
SP.StartCap = Direct2D1.CapStyle.Square
SP.EndCap = Direct2D1.CapStyle.Square
S = _d2DFactory.CreateStrokeStyle(SP)
_renderTarget.DrawLine(New Direct2D1.Point2F(10, 40), New Direct2D1.Point2F(200, 40), B, 8, S)
SP.StartCap = Direct2D1.CapStyle.Round
SP.EndCap = Direct2D1.CapStyle.Round
S = _d2DFactory.CreateStrokeStyle(SP)
_renderTarget.DrawLine(New Direct2D1.Point2F(10, 60), New Direct2D1.Point2F(200, 60), B, 8, S)
SP.StartCap = Direct2D1.CapStyle.Triangle
SP.EndCap = Direct2D1.CapStyle.Triangle
S = _d2DFactory.CreateStrokeStyle(SP)
_renderTarget.DrawLine(New Direct2D1.Point2F(10, 80), New Direct2D1.Point2F(200, 80), B, 8, S)
SP.StartCap = Direct2D1.CapStyle.Flat
SP.EndCap = Direct2D1.CapStyle.Flat
SP.DashCap = Direct2D1.CapStyle.Round
SP.DashStyle = Direct2D1.DashStyle.Solid
S = _d2DFactory.CreateStrokeStyle(SP)
_renderTarget.DrawLine(New Direct2D1.Point2F(10, 120), New Direct2D1.Point2F(200, 120), B, 6, S)
SP.DashStyle = Direct2D1.DashStyle.Dash
S = _d2DFactory.CreateStrokeStyle(SP)
_renderTarget.DrawLine(New Direct2D1.Point2F(10, 140), New Direct2D1.Point2F(200, 140), B, 6, S)
SP.DashStyle = Direct2D1.DashStyle.Dot
S = _d2DFactory.CreateStrokeStyle(SP)
_renderTarget.DrawLine(New Direct2D1.Point2F(10, 160), New Direct2D1.Point2F(200, 160), B, 6, S)
SP.DashStyle = Direct2D1.DashStyle.DashDot
S = _d2DFactory.CreateStrokeStyle(SP)
_renderTarget.DrawLine(New Direct2D1.Point2F(10, 180), New Direct2D1.Point2F(200, 180), B, 6, S)
SP.DashStyle = Direct2D1.DashStyle.DashDotDot
S = _d2DFactory.CreateStrokeStyle(SP)
_renderTarget.DrawLine(New Direct2D1.Point2F(10, 200), New Direct2D1.Point2F(200, 200), B, 6, S)
.EndDraw()
End With
End If
End Sub
End Class
上面四條線是演示枚舉CapStyle的四種類型,注意第一條線是Flat,第二條線是Square。雖然都是方形,但是很明顯第二條線比第一條線兩邊還多出一點(diǎn)(方形線帽)
下面五條線是演示枚舉DashStyle表示的五個(gè)線型。注意:上面代碼中紅色的部分,DashCap不能設(shè)置為Direct2D1.CapStyle.Flat,如果設(shè)置為Flat,則所有的點(diǎn)都不見(jiàn)了;設(shè)置其他三種類型分別代表不同的點(diǎn)(方形點(diǎn)、圓點(diǎn)、菱形點(diǎn))。
再說(shuō)說(shuō)枚舉DashStyle中的Custom線型。設(shè)定為Custom后,必須用一個(gè)數(shù)組來(lái)指定自定義劃線的線型。數(shù)組按照{實(shí)、空、實(shí)、空……}順序來(lái)指定各部分的長(zhǎng)度,單位是線寬。
例如{2,2}表示2線寬長(zhǎng)的實(shí)線和2線寬長(zhǎng)的空白組成的劃線,也就是枚舉DashStyle中的Dash
{0,2}表示0線寬長(zhǎng)的實(shí)線和2線寬長(zhǎng)的空白組成的劃線,就是枚舉DashStyle中的Dot。這也解釋了DashCap設(shè)置為Direct2D1.CapStyle.Flat時(shí),為何點(diǎn)不見(jiàn)了(設(shè)置為其他值時(shí),點(diǎn)實(shí)際上是由線頭組成的,點(diǎn)本身的長(zhǎng)度為0)。
以此類推,{2,2,0,2}表示DashStyle中的DashDot,{2,2,0,2,0,2}表示DashStyle中的DashDotDot
要注意的是,只有枚舉DashStyle設(shè)置為Custom時(shí),才能傳遞數(shù)組,否則會(huì)直接報(bào)錯(cuò)的。
最后說(shuō)說(shuō)LineJoin枚舉,指的是連接兩條線的連接方式。分別是Miter(折角)、Bevel(倒角)、Round(圓角)、MiterOrBevel(折角或倒角)。和GDI+中的LineJoin枚舉類似,只是MiterOrBevel好像對(duì)應(yīng)GDI+中LineJoin枚舉中的MiterClipped。
說(shuō)說(shuō)MiterOrBevel,當(dāng)折角的值沒(méi)有超過(guò)指定的值(系統(tǒng)指定)時(shí),是Miter(折角),反之超過(guò)的話是Bevel(倒角)。
參數(shù)miterLimit是指折角的限制,低于限制時(shí)會(huì)自動(dòng)添加倒角。參數(shù)miterLimit最小是1。注意的是miterLimit參數(shù)并不是配合LineJoin使用。當(dāng)miterLimit設(shè)置為1的時(shí)候,下面的例子中,LineJoin枚舉設(shè)置成Miter、Bevel、MiterOrBevel效果是一樣的。當(dāng)miterLimit設(shè)置為3的時(shí)候,LineJoin枚舉設(shè)置成Miter、Bevel、MiterOrBevel效果才是不一樣的
下面是LineJoin的示例,由于是演示兩條線的連接,故用了一些后面才會(huì)詳述的代碼。不過(guò),不影響我們理解枚舉LineJoin的各個(gè)設(shè)置值的意義。
左上是Miter,右上是Bevel,左下是Round,右下是MiterOrBevel
Public Class clsDirect2DSample4
Inherits clsDirect2DSample
Public Shadows Sub Render()
If Not _renderTarget Is Nothing Then
With _renderTarget
.BeginDraw()
Dim B As Direct2D1.SolidColorBrush = _renderTarget.CreateSolidColorBrush(New Direct2D1.ColorF(1, 0, 0))
Dim SP As New Direct2D1.StrokeStyleProperties()
Dim S As Direct2D1.StrokeStyle
Dim PG As Direct2D1.PathGeometry
Dim sink As Direct2D1.GeometrySink
PG = _d2DFactory.CreatePathGeometry
sink = PG.Open
sink.BeginFigure(New Direct2D1.Point2F(17, 17), Direct2D1.FigureBegin.Hollow)
sink.AddLine(New Direct2D1.Point2F(45, 85))
sink.AddLine(New Direct2D1.Point2F(85, 45))
sink.AddLine(New Direct2D1.Point2F(85, 125))
sink.AddLine(New Direct2D1.Point2F(165, 17))
sink.EndFigure(Direct2D1.FigureEnd.Open)
sink.Close()
SP.LineJoin = Direct2D1.LineJoin.Miter
SP.MiterLimit = 3
S = _d2DFactory.CreateStrokeStyle(SP)
.DrawGeometry(PG, B, 10, S)
PG = _d2DFactory.CreatePathGeometry
sink = PG.Open
sink.BeginFigure(New Direct2D1.Point2F(217, 17), Direct2D1.FigureBegin.Hollow)
sink.AddLine(New Direct2D1.Point2F(245, 85))
sink.AddLine(New Direct2D1.Point2F(285, 45))
sink.AddLine(New Direct2D1.Point2F(285, 125))
sink.AddLine(New Direct2D1.Point2F(365, 17))
sink.EndFigure(Direct2D1.FigureEnd.Open)
sink.Close()
SP.LineJoin = Direct2D1.LineJoin.Bevel
SP.MiterLimit = 3
S = _d2DFactory.CreateStrokeStyle(SP)
.DrawGeometry(PG, B, 10, S)
PG = _d2DFactory.CreatePathGeometry
sink = PG.Open
sink.BeginFigure(New Direct2D1.Point2F(17, 217), Direct2D1.FigureBegin.Hollow)
sink.AddLine(New Direct2D1.Point2F(45, 285))
sink.AddLine(New Direct2D1.Point2F(85, 245))
sink.AddLine(New Direct2D1.Point2F(85, 325))
sink.AddLine(New Direct2D1.Point2F(165, 217))
sink.EndFigure(Direct2D1.FigureEnd.Open)
sink.Close()
SP.LineJoin = Direct2D1.LineJoin.Round
SP.MiterLimit = 3
S = _d2DFactory.CreateStrokeStyle(SP)
.DrawGeometry(PG, B, 10, S)
PG = _d2DFactory.CreatePathGeometry
sink = PG.Open
sink.BeginFigure(New Direct2D1.Point2F(217, 217), Direct2D1.FigureBegin.Hollow)
sink.AddLine(New Direct2D1.Point2F(245, 285))
sink.AddLine(New Direct2D1.Point2F(285, 245))
sink.AddLine(New Direct2D1.Point2F(285, 325))
sink.AddLine(New Direct2D1.Point2F(365, 217))
sink.EndFigure(Direct2D1.FigureEnd.Open)
sink.Close()
SP.LineJoin = Direct2D1.LineJoin.MiterOrBevel
SP.MiterLimit = 3
S = _d2DFactory.CreateStrokeStyle(SP)
.DrawGeometry(PG, B, 10, S)
.EndDraw()
End With
End If
End Sub
End Class
下面是效果圖
從上圖能看出四種類型的不同。左上是Miter,右上是Bevel,左下是Round,右下是MiterOrBevel
繪制基本圖形和線型(StrokeStyle)的設(shè)置詳解的更多相關(guān)文章
Jupyter自定義設(shè)置詳解
今天專門花時(shí)間總結(jié)梳理一下jupyter的一些高級(jí)設(shè)置,jupyter我已經(jīng)介紹過(guò)一次基本內(nèi)容了,Setup and Linux | James Chen's Blogs,尤其是如何在服務(wù)器運(yùn)行jup ...
【轉(zhuǎn)】Eclipse Java注釋模板設(shè)置詳解
Eclipse Java注釋模板設(shè)置詳解 設(shè)置注釋模板的入口: Window-Preference-Java-Code Style-Code Template 然后 ...
Win7 NFS 設(shè)置詳解 | X-Space
Win7 NFS 設(shè)置詳解 | X-Space Win7 NFS 設(shè)置詳解
[轉(zhuǎn)]JAVA環(huán)境變量JAVA_HOME、CLASSPATH、PATH設(shè)置詳解
[轉(zhuǎn)] JAVA環(huán)境變量JAVA_HOME.CLASSPATH.PATH設(shè)置詳解 - dreamman的日志 - 網(wǎng)易博客 ...
fiddler軟件測(cè)試——Fiddler抓取https設(shè)置詳解(圖文)(摘抄)
隨筆- 8 文章- 0 評(píng)論- 0 fiddler軟件測(cè)試——Fiddler抓取https設(shè)置詳解(圖文) 強(qiáng)烈推薦(原創(chuàng)親測(cè))!!!Fiddler抓取https設(shè)置詳解(圖文)轉(zhuǎn) 本文主要說(shuō) ...
fiddler軟件測(cè)試——Fiddler抓取https設(shè)置詳解(圖文)
強(qiáng)烈推薦(原創(chuàng)親測(cè))!!!Fiddler抓取https設(shè)置詳解(圖文)轉(zhuǎn) 本文主要說(shuō)明了自己在設(shè)置fiddler抓取https過(guò)程中所遇到的問(wèn)題及解決步驟,特別是fiddler在設(shè)置證書的環(huán)節(jié)遇到的各 ...
MySQL高可用架構(gòu)之Mycat-關(guān)于Mycat安裝和參數(shù)設(shè)置詳解
MySQL高可用架構(gòu)之Mycat-關(guān)于Mycat安裝和參數(shù)設(shè)置詳解 作者:尹正杰 版權(quán)聲明:原創(chuàng)作品,謝絕轉(zhuǎn)載!否則將追究法律責(zé)任. 一.Mycat介紹 1.什么是Mycat Mycat背后是 ...
【轉(zhuǎn)載】 Eclipse注釋模板設(shè)置詳解
Eclipse注釋模板設(shè)置詳解 網(wǎng)站推薦: 金絲燕網(wǎng)(主要內(nèi)容是 Java 相關(guān)) 木秀林網(wǎng)(主要內(nèi)容是消息隊(duì)列)
loadrunner 運(yùn)行腳本-Run-time Settings-Browser Enmulation設(shè)置詳解
運(yùn)行腳本-Run-time Settings-Browser Enmulation設(shè)置詳解 by:授客 QQ:1033553122 瀏覽器模擬 所有Internet Vuser Header包含一個(gè)標(biāo) ...
隨機(jī)推薦
c# WebBrowser開發(fā)參考資料
原文:c# WebBrowser開發(fā)參考資料 c# WebBrowser開發(fā)參考資料,所有資料的采集均來(lái)自網(wǎng)上 話說(shuō)有了WebBrowser類,終于不用自己手動(dòng)封裝SHDocVw的AxWebBrows ...
設(shè)計(jì)模式組合模式(Composite)精華
23種子GOF設(shè)計(jì)模式一般分為三類:創(chuàng)建模式.結(jié)構(gòu)模型.行為模式. 創(chuàng)建模式抽象的實(shí)例,他們幫助如何創(chuàng)建一個(gè)系統(tǒng)獨(dú)立.這是一個(gè)這些對(duì)象和陳述的組合. 創(chuàng)建使用繼承類的類架構(gòu)更改實(shí)例.的對(duì)象類型模型的建 ...
sdut 3-4 長(zhǎng)方形的周長(zhǎng)和面積計(jì)算
3-4 長(zhǎng)方形的周長(zhǎng)和面積計(jì)算 Time Limit: 1000MS Memory limit: 65536K 標(biāo)題敘述性說(shuō)明 通過(guò)本題的練習(xí)能夠掌握拷貝構(gòu)造函數(shù)的定義和用法: 設(shè)計(jì)一個(gè)長(zhǎng)方形類Rec ...
poj 3273 Monthly Expense (二分)
//最大值最小 //天數(shù)的a[i]值是固定的 不能改變順序 # include algorithm # include string.h # include s ...
JSLint是一個(gè)JavaScript的代碼質(zhì)量工具
JSLint是一個(gè)JavaScript的代碼質(zhì)量工具 可能都或多或少的知道JSLint是一個(gè)JavaScript的代碼質(zhì)量工具,一個(gè)JavaScript語(yǔ)法檢查器和校驗(yàn)器,它能分析JavaScript ...
3. SQL Server數(shù)據(jù)庫(kù)狀態(tài)監(jiān)控 - 可用空間
原文:3. SQL Server數(shù)據(jù)庫(kù)狀態(tài)監(jiān)控 - 可用空間 數(shù)據(jù)庫(kù)用來(lái)存放數(shù)據(jù),那么肯定需要存儲(chǔ)空間,所以對(duì)磁盤空間的監(jiān)視自然就很有必要了. 一. 磁盤可用空間 1. 操作系統(tǒng)命令或腳本.接口或工具 ...
Warning: Cannot modify header information - headers already sent by (output started at
一般來(lái)說(shuō)在header函數(shù)前不能輸出html內(nèi)容,類似的還有setcookie() 和 session 函數(shù),這些函數(shù)需要在輸出流中增加消息頭部信息.如果在header()執(zhí)行之前有echo等語(yǔ)句,當(dāng) ...
JS復(fù)選框選中
Web前端之復(fù)選框選中屬性 熟悉web前端開發(fā)的人都知道,判斷復(fù)選框是否選中是經(jīng)常做的事情,判斷的方法很多,但是開發(fā)過(guò)程中常常忽略了這些方法的兼容性,而是實(shí)現(xiàn)效果就好了.博主之前用戶不少方法,經(jīng)常 ...
leetcode[158] Read N Characters Given Read4 II - Call multiple times
想了好一會(huì)才看懂題目意思,應(yīng)該是: 這里指的可以調(diào)用更多次,是指對(duì)一個(gè)文件多次操作,也就是對(duì)于一個(gè)case進(jìn)行多次的readn操作.上一題是只進(jìn)行一次reandn,所以每次返回的是文件的長(zhǎng)度或者是n, ...
shell腳本中執(zhí)行另一個(gè)shell腳本
分類: 可以在一個(gè)shell腳本中執(zhí)行另一個(gè)shell腳本(或非可執(zhí)行文件,主要用于取得一些變量的值),方法是: . 文件名(包括路徑) 或 變量=文件名(包括路徑) . $變量 注意,圓點(diǎn)后面有 ...
熱門專題
微服務(wù)INSTALL服務(wù)端一直報(bào)錯(cuò)CENTOS 7 安裝截圖軟件SHUTTERDB與LOG對(duì)數(shù)關(guān)系雅虎YUI的RESETECHARTS地圖 關(guān)閉漣漪效果THIS方法用數(shù)組顏色ARDUINO報(bào)錯(cuò)373WINFORM的冒泡雙數(shù)組TRIE樹 AC自動(dòng)機(jī)FLUENT中怎么看傳熱系數(shù)C# LIST 獲取前1000條JS PUSH 參數(shù)REACT 字段超長(zhǎng)縮放顯示,鼠標(biāo)懸浮氣泡顯示JAVA PDF加水印 斜著一層層 鋪滿CHROME ERR_UNSAFE_PORT 所有端口VUE CESIUM 繪制立方體如何利用VAR來(lái)調(diào)資產(chǎn)類別的權(quán)重LINUX運(yùn)行MAPREDUCE的JAR時(shí)報(bào)錯(cuò)ADB抓取LOG命令LINUX9 安裝 VLC
Home
Powered By WordPress
程序設(shè)計(jì)初步 一、 順序結(jié)構(gòu)程序設(shè)計(jì) 1.輸入語(yǔ)句read和readln 功能:從鍵盤或文件讀入數(shù)據(jù)項(xiàng),并把它存到變量中去,使該數(shù)據(jù)能在以后的計(jì)算中使用。 輸入語(yǔ)句的一般形式為: read(v1,v2,…,vn); readln(v1,v2,…,vn);從鍵盤逐次讀入數(shù)據(jù),分別賦給變量v1,v2,…,vn,一次輸入多個(gè)變量值時(shí),要求數(shù)據(jù)之間用空格分隔,readln語(yǔ)句要求輸入數(shù)據(jù)后必須回車,使得后繼操作從下一行的頭上開始。
Slide 2read語(yǔ)句與readln語(yǔ)句區(qū)別是: (1) read語(yǔ)句是一個(gè)接一個(gè)地讀數(shù)據(jù),在執(zhí)行完本Read語(yǔ)句( 讀完本語(yǔ)句中變量所需的數(shù)據(jù))后,下一個(gè)讀語(yǔ)句接著從該數(shù)據(jù)輸入行中繼續(xù)讀數(shù)據(jù),也就是說(shuō),不換行。如: Read(a,b); Read(c,d); Read(e); 如果輸入數(shù)據(jù)行如下: 1□2□3□4□5□6□←┘ 則a,b,c,d,e的值分別為1,2,3,4,5,如果后面無(wú)讀語(yǔ)句則數(shù)據(jù)6是多余的,這是允許的。
Slide 3Readln則不同,在讀完本Readln語(yǔ)句中變量所需的數(shù)據(jù)后, 該數(shù)據(jù)行中剩余的數(shù)據(jù)多余無(wú)用,或者說(shuō),在讀完本Readln語(yǔ)句中變量所需數(shù)據(jù)后,一定要讀到一個(gè)回車,否則多余的數(shù)據(jù)無(wú)用。設(shè)有下列語(yǔ)句: read(a,b,c); readln(d,e); readln; readln(f); 其中,所有變量均為整型。再設(shè)輸入的數(shù)據(jù)如下: 1□2←┘ 3□4□5□6□7□8←┘ 9□10←┘ 11←┘ 結(jié)果為:1 2 3 4 5 11
Slide 4(2)readln語(yǔ)句與read語(yǔ)句的第二個(gè)區(qū)別是: read 后一定要有參數(shù)表, readln可以不帶參數(shù)表,即可以沒(méi)有任何輸入 項(xiàng), 只是等待讀入一個(gè)換行符(回車)。 經(jīng)常用于暫停程序的運(yùn)行,直到輸入 一個(gè)回車
Slide 52、輸出語(yǔ)句write和writeln 功能:把程序計(jì)算的結(jié)果,按適當(dāng)?shù)男问捷敵龅狡聊换蛭募?1)、write語(yǔ)句格式Write(表達(dá)式1,表達(dá)式2,……);如: write(x,5,a+b); write(‘My name is Liping’); 2)、writeln語(yǔ)句格式: Writeln(表達(dá)式1,表達(dá)式2,……) 或writeln
Slide 6Write語(yǔ)句與writeln語(yǔ)句格式上都相似,但它們?cè)诠δ苌嫌兴煌瑑蓚€(gè)語(yǔ)句的區(qū)別在于: write語(yǔ)句將其后括號(hào)中的表達(dá)式一個(gè)接一個(gè)輸出后,沒(méi)有換行。 而writeln語(yǔ)句則在輸出各個(gè)表達(dá)式的值后換行。例如以下兩個(gè)程序段的輸出分別為: write(1,2,3,4); write(5,6); 輸出為: 123456 writeln(1,2,3,4); write(5,6); 輸出為: 1234 56
Slide 74)實(shí)數(shù)的輸出格式實(shí)數(shù)(real)以浮點(diǎn)型格式輸出。例如805.67對(duì)應(yīng)的浮點(diǎn)數(shù)為8.056700000000E+02。這種實(shí)數(shù)表達(dá)方式很不方便。我們可以通過(guò)下述形式強(qiáng)迫實(shí)數(shù)以定點(diǎn)型格式輸出: 實(shí)數(shù)表達(dá)式:域?qū)挘盒?shù)位數(shù)例如,t的值設(shè)為63.123。下面三條輸出語(yǔ)句分別有它們右邊所示的輸出格式: write(t); 6.312300000000E+01 write(t:6:2); 63.12 write(t:10:5); 63.12300 輸出語(yǔ)句的輸出格式: 場(chǎng)寬的分類:標(biāo)準(zhǔn)場(chǎng)寬和自定義場(chǎng)寬。 自定義場(chǎng)寬又分為單場(chǎng)寬和雙場(chǎng)寬。 單場(chǎng)寬的形式: x:n; 可以輸出的項(xiàng)目有整型、字符型、布爾型,不允許實(shí)型。 雙場(chǎng)寬的形式: x:n1:n2; 控制實(shí)型數(shù)據(jù)的輸出。
Slide 83:復(fù)合語(yǔ)句:定義:復(fù)合語(yǔ)句是由若干條語(yǔ)句組成的語(yǔ)句序列。形式: begin 語(yǔ)句1; 語(yǔ)句2; ···· 語(yǔ)句n end;用保留字begin和end括起來(lái),構(gòu)成一條邏輯上的語(yǔ)句,語(yǔ)法上充當(dāng)一條語(yǔ)句。
Slide 9二、 選擇結(jié)構(gòu)程序設(shè)計(jì) 一:什么是選擇結(jié)構(gòu)?選擇結(jié)構(gòu)的特點(diǎn)? 二:選擇結(jié)構(gòu)的幾種語(yǔ)句: 1.if 語(yǔ)句:格式:if 條件 then 語(yǔ)句1; if 條件 then 語(yǔ)句1 else 語(yǔ)句2;功能:執(zhí)行過(guò)程說(shuō)明:1)該語(yǔ)句為一個(gè)語(yǔ)句; 2)條件是一個(gè)布爾表達(dá)式或一個(gè)布爾變量,then 和else后的語(yǔ)句可以是單個(gè)語(yǔ)句,當(dāng)需要多條語(yǔ)句時(shí),用begin和end括起來(lái)構(gòu)成復(fù)合語(yǔ)句。 3)靈活運(yùn)用該語(yǔ)句,條件是關(guān)鍵。
Slide 10補(bǔ)充:邏輯運(yùn)算及布爾表達(dá)式 1、布爾常量: true false const t=true;f=false; 2、 布爾變量: var t,f:Boolean; 順序型數(shù)據(jù)false(0),true(1),有ord,succ,pred等函數(shù)運(yùn)算 3、關(guān)系表達(dá)式:定義;運(yùn)算符;運(yùn)算結(jié)果 對(duì)于數(shù)值型數(shù)據(jù)的比較,直接比較數(shù)值的大小如:136 的結(jié)果為true 對(duì)于其它類型數(shù)據(jù)的比較,則按其序號(hào)進(jìn)行比較如:’a’=’b’的結(jié)果為false 邏輯運(yùn)算:三個(gè)運(yùn)算符(優(yōu)先級(jí)):not(單目) and(雙目) or(雙目) 運(yùn)算結(jié)果為布爾型數(shù)據(jù):true,false 布爾表達(dá)式:由邏輯運(yùn)算符將幾個(gè)類型相容且有序的表達(dá)式聯(lián)結(jié)起來(lái)的式子。 邏輯、算術(shù)、關(guān)系運(yùn)算符的運(yùn)算次序:括號(hào)——函數(shù)、not——*、/、div、mod、and——+、-、or——、=、、=、=、 例:若a=true,b=false,x=7,y=12,m=3,n=35,求下列布爾表達(dá)式的值。 a and not (mn) and (xy-m) or (a or b) ① ② ③
Slide 112.if 語(yǔ)句的嵌套:格式: (1) if 語(yǔ)句嵌套在then語(yǔ)句中 if 條件1 then if 條件2 then 語(yǔ)句21 else 語(yǔ)句22 else 語(yǔ)句12;(2)if 語(yǔ)句嵌套在else語(yǔ)句中 if 條件1 then 語(yǔ)句11 else if 條件2 then 語(yǔ)句21 else 語(yǔ)句22 ;
Slide 12【例】:計(jì)算下列函數(shù) 分析:根據(jù)輸入的x值,先分成x0與x≤0兩種情況,然后對(duì)于情況x≤0,再區(qū)分x是小于0,還是等于0。
Slide 13程序代碼: program ex; var x:real; y:integer; begin write('input x:');readln(x); if x0 then y:=1 else if x=0 then y:=0 else y:=-1; writeln('x=',x:6:2,'y=',y); end.
Slide 143.case 語(yǔ)句:分情況語(yǔ)句(多分支語(yǔ)句)格式:case 表達(dá)式 of 常數(shù)表1:語(yǔ)句1; 常數(shù)表2:語(yǔ)句2; ···· 常數(shù)表n:語(yǔ)句n; else 語(yǔ)句n+1 end; 功能:執(zhí)行過(guò)程說(shuō)明:1)end 與case 對(duì)應(yīng) 2)表達(dá)式的類型通常是整型、字符型 3)常量表是常量,其類型與表達(dá)式的類型要一致。常量表中的常量不能重復(fù)。
Slide 15【例】:輸入兩個(gè)數(shù)(均不為零)及一個(gè)算術(shù)運(yùn)算符,輸出其運(yùn)算的結(jié)果程序代碼: program ex3(input,output); var x,y,s:real; ch:char; begin writeln(‘input x y ch:’); readln(x,y); readln(ch); case ch of ‘+’:s:=x+y; ‘-‘:s:=x-y; ‘*’:s:=x*y; ‘/’:s:=x/y end; writeln(x,ch,y,’=’,s) end.
Slide 16上機(jī)練習(xí)題 1.求一元二次方程ax2+bx+c=0的根。 算法分析:方程的系數(shù)a,b,c決定了方程有無(wú)根,是幾個(gè)根,是實(shí)數(shù)根還是復(fù)根。 2.打印某年某月有幾天。 算法分析:可分為以下3種情況: 每年的1,3,5,7,8,10,12這七個(gè)月每月為31天; 每年的4,6,9,11這四個(gè)月為30天; 2月又分為兩種情況:閏年為29天,否則為28天。 判斷閏年的條件:年數(shù)能被4整除,并且不能被100整除,或者年數(shù)能被400整除; (year mod 4=0)and (year mod 1000) or (year mod 400=0)
Slide 17第三節(jié) 循環(huán)結(jié)構(gòu)程序設(shè)計(jì) 一、什么是循環(huán)結(jié)構(gòu)?其特點(diǎn)是什么?二、循環(huán)結(jié)構(gòu)的三種形式: 1.for語(yǔ)句:(“計(jì)數(shù)循環(huán)”):就是將規(guī)定循環(huán)體重復(fù)執(zhí)行的次數(shù)。格式:for 控制變量:=初值 to 終值 do 循環(huán)體語(yǔ)句; for 控制變量:=初值 downto 終值 do 循環(huán)體語(yǔ)句;功能:執(zhí)行過(guò)程說(shuō)明:1) 初值和終值可以是表達(dá)式,控制變量和初值、終值的類型相同,且必須是整型、布爾型和字符型等順序類型,不能為實(shí)型。 2)遞增按succ函數(shù)規(guī)律變化,遞減按pred函數(shù)規(guī)律變化,整型按數(shù)值大小變化,如果為字符型量,按ASCII碼表的順序計(jì)算。 3)初值和終值在循環(huán)之前計(jì)算,重復(fù)過(guò)程中,其值不受影響;不得在循環(huán)語(yǔ)句中對(duì)控制變量進(jìn)行賦值。 4)當(dāng)初值超過(guò)終值,不執(zhí)行循環(huán),循環(huán)次數(shù)為零。
Slide 18【例1】:計(jì)算1+2+3+4+···+100之和。算法分析:對(duì)于求和,我們使用的是累加的辦法。程序代碼: program ex1(input,output); var i,sum:integer; begin sum:=0; for i:=1 to 100 do sum:=sum+I; writeln(‘sum=’,sum) end. 補(bǔ)充說(shuō)明:類似sum迭加變量這樣的功能稱為“累加器”;類似i這樣的變量稱為“計(jì)數(shù)器”;“計(jì)數(shù)器”和“累加器”是在程序中經(jīng)常使用的基本操作語(yǔ)句。
Slide 192.while語(yǔ)句:(“當(dāng)型循環(huán)”):當(dāng)條件滿足時(shí)反復(fù)執(zhí)行循環(huán)體。格式:while 布爾表達(dá)式 do 語(yǔ)句;功能:執(zhí)行過(guò)程:先求布爾表達(dá)式的值,值為真時(shí),執(zhí)行語(yǔ)句;值為假時(shí),退出循環(huán)。說(shuō)明:1)為了while循環(huán)能正常終止,布爾表達(dá)式中的變量必須在循環(huán)體中的某語(yǔ)句中有所改變,即有可能是布爾表達(dá)式的值為假,使循環(huán)結(jié)束,否則將出現(xiàn)死循環(huán)。 2)循環(huán)體中的語(yǔ)句一般是多條語(yǔ)句,用begin和end使其成為一條復(fù)合語(yǔ)句。
Slide 20【例】:輸出1~100之間的奇數(shù)。程序代碼: program ex5(input,output); var x:integer; begin x:=1; while x100 do begin write(x:5); x:=x+2 end end.
Slide 213.until語(yǔ)句:(“直到型循環(huán)”):反復(fù)執(zhí)行循環(huán)體直到條件滿足為止。格式:repeat 語(yǔ)句1; 語(yǔ)句2; 語(yǔ)句3; ··· 語(yǔ)句n until 布爾表達(dá)式;功能:執(zhí)行過(guò)程:先執(zhí)行指定的語(yǔ)句序列,然后判別表達(dá)式。
Slide 22說(shuō)明:while語(yǔ)句和repeat語(yǔ)句都可以實(shí)現(xiàn)循環(huán)結(jié)構(gòu),但它們有四點(diǎn)不同:
Slide 23【例】:輸出1~100之間的奇數(shù)。(用repeat則應(yīng)該是)程序代碼: program ex5(input,output); var x:integer; begin x:=1; repeat write(x:5); x:=x+2 Until x=100 end.
Slide 24三、多重循環(huán): 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 ………………………………………….. 9*1=9 9*2=18 9*3=27 ………….. …... 9*9=81 打印出如下的九九表:
Slide 25program jjb(input,output); var i,j:integer; begin for i:=1 to 9 do begin for j:=1 to i do write(i,'*',j,'=',i*j,‘ ':3); writeln; end end.
Slide 26四、轉(zhuǎn)向語(yǔ)句:goto Goto語(yǔ)句并不是循環(huán)語(yǔ)句,而是一個(gè)無(wú)條件的強(qiáng)制跳轉(zhuǎn)語(yǔ)句。格式: goto 語(yǔ)句標(biāo)號(hào); 1、標(biāo)號(hào)說(shuō)明通常放在程序說(shuō)明部分第一個(gè)出現(xiàn),格式如下: label 標(biāo)號(hào)1,標(biāo)號(hào)2……… 標(biāo)號(hào)只起到一個(gè)表明位置的作用,它并不改變?cè)Z(yǔ)句的功能 標(biāo)號(hào)并不代表實(shí)際的行數(shù),標(biāo)號(hào)之間也可不按大小順序 2、只能從一個(gè)語(yǔ)句結(jié)構(gòu)中轉(zhuǎn)出來(lái),不允許從外部轉(zhuǎn)進(jìn)去例如:求100以內(nèi)的所有質(zhì)數(shù)
Slide 27program js(input,output); Var n,i,j:integer; begin write('2,'); for i:=3 to 100 do begin n:=2; while i mod n0 do n:=n+1; if i=n then write(i,','); end; end.
Slide 28上機(jī)練習(xí)題 1.編程求出1!+2!+3!+……….+n!的值 2.編程找出四位整數(shù)abcd中滿足下述關(guān)系的數(shù)。 (ab+cd)(ab+cd)=abcd 3.已知:faibonacci(費(fèi)波那契)數(shù)列的前幾個(gè)數(shù)分別為0,1,1,2,3,5,···,編程求出此數(shù)列的前n項(xiàng)。 4.試編寫能打印如下輸出圖形的程序。########### ######### ####### ##### ### #思考:如果把圖形上下顛倒的話,程序應(yīng)如何修改
Slide 295. (1)求出兩個(gè)自然數(shù)a和b的最大公約數(shù)。 (2)求出兩個(gè)自然數(shù)a和b的最小公倍數(shù)。 6. 用5元錢買100只紐扣,其中金屬紐扣每只5角,有機(jī)玻璃紐扣每只一角,小按扣1分錢3個(gè),編程求出各種紐扣各買了多少只? 7.(1)隨機(jī)產(chǎn)生一個(gè)三位自然數(shù),判斷這個(gè)數(shù)是否為水仙花數(shù)。 (2)求100~999中的水仙花數(shù)。(若三位數(shù)abc,abc=a3+b3+c3,則稱為水仙花數(shù)。如:153,13+53+33=1+125+27=153)
Slide 30program jjb(input,output); var i,n,s,m:integer; begin read(n); s:=0; m:=1; for i:=1 to n do begin m:=m*i; s:=s+m; end; writeln('s=',s); end. 1.編程求出1!+2!+3!+……….+n!的值
Slide 312、【算法分析:這道題屬于搜索問(wèn)題,因?yàn)槭撬奈徽麛?shù),其范圍從1000——9999,所求的數(shù)究竟在哪里,無(wú)法確定,只有在這個(gè)范圍內(nèi)從小到大一個(gè)一個(gè)進(jìn)行搜索,對(duì)每一個(gè)數(shù),看它的高兩位數(shù)與低兩位數(shù)和的平方是否為該數(shù)。高兩位數(shù):abcd div 100=ab 低兩位數(shù):abcd mod 100=cd 程序代碼: program ex4(input,output); var i,m,n,k:integer; begin for i:=1000 to 9999 do begin m:=i div 100; n:=i mod 100; k:=(m+n)*(m+N); If k=i then write(I:8) end end. 補(bǔ)充說(shuō)明:以上用的方法也叫“枚舉法”,又稱“窮舉法”。它是用計(jì)算機(jī)解題的一種常用的辦法。它的基本思路是:一一枚舉各種可能的情況,并判斷哪一種可能是符合要求的解。方法雖然很笨,然而與計(jì)算機(jī)高速的處理能力相結(jié)合,也不失為一種較有用的方法
Slide 323.已知:faibonacci(費(fèi)波那契)數(shù)列的前幾個(gè)數(shù)分別為0,1,1,2,3,5,···,編程求出此數(shù)列的前n項(xiàng)。 program fbnqsl(input,output); var f1,f2,fn,i,n:integer; begin writeln('input n:'); readln(n); f1:=0; f2:=1; write(f1:6,f2:6); for i:=3 to n do begin fn:=f1+f2; write(fn:6); f1:=f2; f2:=fn; end; end.
Slide 334、########### ######### ####### ##### ### # program ex10(input,output); var i,j,k:integer; begin for i:=6 downto 1 do begin for j:=1 to 6-i do write(‘ ‘); for k:=2*i-1 downto 1 do write(‘#’); writeln end end. # ### ##### ####### #################### program ex10(input,output); var i,j,k:integer; begin for i:=1 to 6 do begin for j:=6-i downto 1 do write(' '); for k:=2*i-1 downto 1 do write('#'); writeln end end.
Slide 345、program fbnqsl(input,output); var m,n,t,r:integer; begin writeln('input m and n:'); readln(m,n); if mn then begin t:=m; n:=m; m:=t; end; r:=m mod n; while r0 do begin m:=n; n:=r; r:=m mod n; end; write(n); end. program fbnqsl(input,output); var m,n,i,s:integer; begin writeln('input m and n:'); readln(m,n); i:=1; s:=m*i; while s mod n0 do begin i:=i+1; s:=m*i; end; write(s); end. 最小公倍數(shù):
Slide 356、用5元錢買100只紐扣,其中金屬紐扣每只5角,有機(jī)玻璃紐扣每只一角,小按扣1分錢3個(gè),編程求出各種紐扣各買了多少只? var x,y,z:integer; begin for x:=1 to 10 do for z:=1 to 100 do begin y:=100-x-z; if 50*x+10*y+z/3=500 then writeln(x:4,y:4,z:4); end; end.
Slide 367、program ex9(input,output); var a,b,c:integer; begin for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do if a*a*a+b*b*b+c*c*c=a*100+b*10+c then write(a*100+b*10+c:6); writeln end.
循環(huán)結(jié)構(gòu)
by guest102525 | Added: 1 month ago
Language: Chinese | Topic: Nature
4 Views 1 Embeds
Share via email
URL:
Embed: HTML XHTML
For WordPress: Get SlideBoom plugin for WordPress
More by this UserMost ViewedRelated presentations
This user doesn't uploaded any other presenations.
Share via email
(comma-separated)Emails*:
Your name*:
Message:
Refresh
Please enter the characters you see.
Characters are not case sensitive.
Send
* indicates a required field
Share presentation with a group
Group:
Select group
Message:
Post
http協(xié)議中的請(qǐng)求頭,具體google,一般在程序開發(fā)中沒(méi)什么意義。
wordpress使用的是PHP語(yǔ)言的開源系統(tǒng),我們都知道PHP經(jīng)常會(huì)使用到include來(lái)引用PHP文件,wordpress為了簡(jiǎn)化這些常用文件的引用,特別為我們準(zhǔn)備了 get_header()、get_footer()、get_sidebar()等主題模板文件包含語(yǔ)句。get_header()函數(shù)是我們主題開發(fā)過(guò)程必用的函數(shù),一般用于包含公用的頭部文件header.php,如果你有多個(gè)頭部文件你可以使用get_header($name)來(lái)獲取指定頭部文件header-{$name}.php。
什么是滲透測(cè)試?
滲透測(cè)試,是滲透測(cè)試工程師完全模擬黑客可能使用的攻擊技術(shù)和漏洞發(fā)現(xiàn)技術(shù),對(duì)目標(biāo)網(wǎng)絡(luò)、主機(jī)、應(yīng)用的安全作深入的探測(cè),發(fā)現(xiàn)系統(tǒng)最脆弱的環(huán)節(jié)。
如何進(jìn)行Web滲透測(cè)試?
完整web滲透測(cè)試框架當(dāng)需要測(cè)試的web應(yīng)用數(shù)以千計(jì),就有必要建立一套完整的安全測(cè)試框架,流程的最高目標(biāo)是要保證交付給客戶的安全測(cè)試服務(wù)質(zhì)量。
1、立項(xiàng):項(xiàng)目建立,時(shí)間安排,人力分配,目標(biāo)制定,廠商接口人確定;
系統(tǒng)分析威脅分析:針對(duì)具體的web應(yīng)用,分析系統(tǒng)架構(gòu)、使用的組件、對(duì)外提供的接口等,以STRIDE為威脅模型進(jìn)行對(duì)應(yīng)的安全威脅分析,輸出安全威脅分析表,重點(diǎn)關(guān)注top3威脅;
制定測(cè)試用例:根據(jù)威脅分析的結(jié)果制定對(duì)應(yīng)的測(cè)試用例,測(cè)試用例按照模板輸出,具備可執(zhí)行性;
測(cè)試執(zhí)行漏洞挖掘:測(cè)試用例執(zhí)行發(fā)散測(cè)試,挖掘?qū)?yīng)的安全問(wèn)題or漏洞;
問(wèn)題修復(fù)回歸測(cè)試:指導(dǎo)客戶應(yīng)用開發(fā)方修復(fù)安全問(wèn)題or漏洞,并進(jìn)行回歸測(cè)試,確保安全問(wèn)題or漏洞得到修復(fù),并且沒(méi)有引入新的安全問(wèn)題;
項(xiàng)目總結(jié)評(píng)審:項(xiàng)目過(guò)程總結(jié),輸出文檔評(píng)審,相關(guān)文檔歸檔。
2、Web應(yīng)用的滲透測(cè)試流程
主要分為3個(gè)階段,分別是:信息收集→漏洞發(fā)現(xiàn)→漏洞利用,下面仔細(xì)分析一下各個(gè)階段流程:
一、信息收集
在信息收集階段,我們需要盡量多的收集關(guān)于目標(biāo)web應(yīng)用的各種信息,比如:腳本語(yǔ)言的類型、服務(wù)器的類型、目錄的結(jié)構(gòu)、使用的開源軟件、數(shù)據(jù)庫(kù)類型、所有鏈接頁(yè)面,用到的框架等
腳本語(yǔ)言的類型:常見(jiàn)的腳本語(yǔ)言的類型包括:php、asp、aspx、jsp等
測(cè)試方法:
1 爬取網(wǎng)站所有鏈接,查看后綴
2 直接訪問(wèn)一個(gè)不存在頁(yè)面后面加不同的后綴測(cè)試
3 查看robots.txt,查看后綴
服務(wù)器的類型:常見(jiàn)的web服務(wù)器包括:apache、tomcat、IIS、ngnix等
測(cè)試方法:
1 查看header,判斷服務(wù)器類型
2 根據(jù)報(bào)錯(cuò)信息判斷
3 根據(jù)默認(rèn)頁(yè)面判斷
目錄的結(jié)構(gòu):了解更多的目錄,可能發(fā)現(xiàn)更多的弱點(diǎn),如:目錄瀏覽、代碼泄漏等。
測(cè)試方法
1 使用字典枚舉目錄
2 使用爬蟲爬取整個(gè)網(wǎng)站,或者使用google等搜索引擎獲取
3 查看robots.txt是否泄漏
使用的開源軟件:我們?nèi)绻懒四繕?biāo)使用的開源軟件,我們可以查找相關(guān)的軟件的漏洞直接對(duì)網(wǎng)站進(jìn)行測(cè)試。
測(cè)試方法
指紋識(shí)別(網(wǎng)絡(luò)上有很多開源的指紋識(shí)別工具)
數(shù)據(jù)庫(kù)類型:對(duì)于不同的數(shù)據(jù)庫(kù)有不同的測(cè)試方法。
測(cè)試方法
1 使應(yīng)用程序報(bào)錯(cuò),查看報(bào)錯(cuò)信息
2 掃描服務(wù)器的數(shù)據(jù)庫(kù)端口(沒(méi)做NAT且防火墻不過(guò)濾時(shí)有效)
所有鏈接頁(yè)面:這個(gè)跟前面的獲取目錄結(jié)構(gòu)類似,但是這個(gè)不只是獲取網(wǎng)站的所有功能頁(yè)面,有時(shí)候還可以獲取到管理員備份的源碼。
測(cè)試方法
1 使用字典枚舉頁(yè)面
2 使用爬蟲爬取整個(gè)網(wǎng)站,或者使用google等搜索引擎獲取
3 查看robots.txt是否泄漏
用到的框架:很多網(wǎng)站都利用開源的框架來(lái)快速開發(fā)網(wǎng)站,所以收集網(wǎng)站的框架信息也是非常關(guān)鍵的。
測(cè)試方法
指紋識(shí)別(網(wǎng)絡(luò)上有很多開源的指紋識(shí)別工具)
二、漏洞發(fā)現(xiàn)
在這個(gè)階段我們?cè)谧鰷y(cè)試的時(shí)候要對(duì)癥下藥,不能盲目的去掃描,首先要確定目標(biāo)應(yīng)用是否使用的是公開的開源軟件,開源框架等、然后在做深一度的漏洞掃描。
關(guān)于開源軟件的漏洞發(fā)現(xiàn)
開源的軟件:常見(jiàn)的開源軟件有wordpress、phpbb、dedecms等
開源的框架:常見(jiàn)的開源框架有Struts2、 Spring MVC、ThinkPHP等
中間件服務(wù)器:常見(jiàn)的中間件服務(wù)器有jboss、tomcat、Weblogic等
數(shù)據(jù)庫(kù)服務(wù):常見(jiàn)的數(shù)據(jù)庫(kù)服務(wù)mssql、mysql、oracle、redis、sybase、MongoDB、DB2等
對(duì)于開源軟件的測(cè)試方法
1 通過(guò)指紋識(shí)別軟件判斷開源軟件的版本信息,針對(duì)不同的版本信息去開放的漏洞數(shù)據(jù)庫(kù)查找相應(yīng)版本的漏洞進(jìn)行測(cè)試
2 對(duì)于默認(rèn)的后臺(tái)登錄頁(yè)、數(shù)據(jù)庫(kù)服務(wù)端口認(rèn)證等入口可以進(jìn)行簡(jiǎn)單的暴力破解、默認(rèn)口令嘗試等操作
3 使用開源的漏洞發(fā)現(xiàn)工具對(duì)其進(jìn)行漏洞掃描,如:WPScan
關(guān)于自主開發(fā)的應(yīng)用
手動(dòng)測(cè)試:這個(gè)階段,我們需要手工測(cè)試所有與用戶交互的功能,比如:留言、登入、下單、退出、退貨、付款等操作
軟件掃描:使用免費(fèi)的軟件掃描,如:appscan、wvs、netsparker,burp等
可能存在的漏洞
Owasp關(guān)鍵點(diǎn)
代碼安全之上傳文件
代碼安全之文件包含
代碼安全之SSRF
邏輯漏洞之密碼重置
邏輯漏洞之支付漏洞
邏輯漏洞之越權(quán)訪問(wèn)
平臺(tái)安全之中間件安全
三、漏洞利用
針對(duì)不同的弱點(diǎn)有不同的漏洞利用方式,需要的知識(shí)點(diǎn)也比較多。一般這個(gè)階段包括兩種方式,一種是手工測(cè)試,一種是工具測(cè)試
手工測(cè)試
手工測(cè)試是通過(guò)客戶端或服務(wù)器訪問(wèn)目標(biāo)服務(wù),手工向目標(biāo)程序發(fā)送特殊的數(shù)據(jù),包括有效的和無(wú)效的輸入,觀察目標(biāo)的狀態(tài)、對(duì)各種輸入的反應(yīng),根據(jù)結(jié)果來(lái)發(fā)現(xiàn)問(wèn)題的漏洞檢測(cè)技術(shù)。手工測(cè)試不需要額外的輔助工具,可由測(cè)試者獨(dú)立完成,實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單。但這種方法高度依賴于測(cè)試者,需要測(cè)試者對(duì)目標(biāo)比較了解。手工測(cè)試可用于Web應(yīng)用程序、瀏覽器及其他需要用戶交互的程序。
這種方式對(duì)于有特殊過(guò)濾等操作,或者網(wǎng)絡(luò)上沒(méi)有成型的利用工具的時(shí)候可以使用。
工具測(cè)試
網(wǎng)絡(luò)上有很多好用的免費(fèi)利用工具,比如針對(duì)sql注入的sqlmap、針對(duì)軟件漏洞的matesploit等。
新聞名稱:wordpress枚舉 swagger 枚舉
當(dāng)前地址:http://chinadenli.net/article46/dojihhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、關(guān)鍵詞優(yōu)化、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站收錄、網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)