﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-TanZek's 技术空间-文章分类-Subject-Study</title><link>http://www.cppblog.com/urgentmind/category/436.html</link><description>勇往直前，专注于技术...</description><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 05:22:51 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 05:22:51 GMT</pubDate><ttl>60</ttl><item><title>计算机图形学---DDA算法</title><link>http://www.cppblog.com/urgentmind/articles/13404.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Fri, 06 Oct 2006 22:42:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/13404.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/13404.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/13404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/13404.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/13404.html</trackback:ping><description><![CDATA[
		<div>DDA直线的生成算法：</div>
		<div>[初级版]</div>
		<div>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<span style="COLOR: #008080"> 1</span>
						<img id="Codehighlighter1_8_16_Open_Image" onclick="this.style.display='none'; Codehighlighter1_8_16_Open_Text.style.display='none'; Codehighlighter1_8_16_Closed_Image.style.display='inline'; Codehighlighter1_8_16_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_8_16_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_8_16_Closed_Text.style.display='none'; Codehighlighter1_8_16_Open_Image.style.display='inline'; Codehighlighter1_8_16_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
						<span style="COLOR: #000000">POINT A</span>
						<span style="COLOR: #000000">=</span>
						<span id="Codehighlighter1_8_16_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_8_16_Open_Text">
								<span style="COLOR: #000000">{</span>
								<span style="COLOR: #000000">100</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">100</span>
								<span style="COLOR: #000000">}</span>
						</span>
						<span style="COLOR: #000000">, B</span>
						<span style="COLOR: #000000">=</span>
						<span id="Codehighlighter1_21_29_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_21_29_Open_Text">
								<span style="COLOR: #000000">{</span>
								<span style="COLOR: #000000">200</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">200</span>
								<span style="COLOR: #000000">}</span>
						</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080"> 2</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> dda_line(HDC</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000"> hdc)<br /></span>
						<span style="COLOR: #008080"> 3</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_56_660_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_660_Open_Text.style.display='none'; Codehighlighter1_56_660_Closed_Image.style.display='inline'; Codehighlighter1_56_660_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
								<img id="Codehighlighter1_56_660_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_660_Closed_Text.style.display='none'; Codehighlighter1_56_660_Open_Image.style.display='inline'; Codehighlighter1_56_660_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_56_660_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_56_660_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 4</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">double</span>
								<span style="COLOR: #000000"> length;<br /></span>
								<span style="COLOR: #008080"> 5</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">double</span>
								<span style="COLOR: #000000"> dx,dy;<br /></span>
								<span style="COLOR: #008080"> 6</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">double</span>
								<span style="COLOR: #000000"> x,y;<br /></span>
								<span style="COLOR: #008080"> 7</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">char</span>
								<span style="COLOR: #000000"> a[</span>
								<span style="COLOR: #000000">20</span>
								<span style="COLOR: #000000">];<br /></span>
								<span style="COLOR: #008080"> 8</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
								</span>
								<span style="COLOR: #008080"> 9</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(abs(B.x</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">A.x) </span>
								<span style="COLOR: #000000">&gt;=</span>
								<span style="COLOR: #000000"> abs(B.y</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">A.y))<br /></span>
								<span style="COLOR: #008080">10</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          length</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">abs(B.x</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">A.x);<br /></span>
								<span style="COLOR: #008080">11</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">12</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          length</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">abs(B.y</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">A.y);<br /></span>
								<span style="COLOR: #008080">13</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     <br /></span>
								<span style="COLOR: #008080">14</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     dx</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">((B.x</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">A.x)</span>
								<span style="COLOR: #000000">/</span>
								<span style="COLOR: #000000">length);<br /></span>
								<span style="COLOR: #008080">15</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     dy</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">((B.y</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">A.y)</span>
								<span style="COLOR: #000000">/</span>
								<span style="COLOR: #000000">length);<br /></span>
								<span style="COLOR: #008080">16</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
								</span>
								<span style="COLOR: #008080">17</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     x</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">A.x</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">0.5</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080">18</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     y</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">A.y</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">0.5</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080">19</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     sprintf(a,</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">A(%d,%d)</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">(x),</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">(y));<br /></span>
								<span style="COLOR: #008080">20</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     TextOut(hdc,</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">(x),</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">(y),a,</span>
								<span style="COLOR: #000000">10</span>
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080">21</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> i</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080">22</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">while</span>
								<span style="COLOR: #000000">(i </span>
								<span style="COLOR: #000000">&lt;=</span>
								<span style="COLOR: #000000"> length)<br /></span>
								<span style="COLOR: #008080">23</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_460_568_Open_Image" onclick="this.style.display='none'; Codehighlighter1_460_568_Open_Text.style.display='none'; Codehighlighter1_460_568_Closed_Image.style.display='inline'; Codehighlighter1_460_568_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_460_568_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_460_568_Closed_Text.style.display='none'; Codehighlighter1_460_568_Open_Image.style.display='inline'; Codehighlighter1_460_568_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span>
								<span id="Codehighlighter1_460_568_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_460_568_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">24</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          SetPixel(hdc,</span>
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000">(x),</span>
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000">(y),RGB(</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">,</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">,</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">));<br /></span>
										<span style="COLOR: #008080">25</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          x</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">x</span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000">dx;<br /></span>
										<span style="COLOR: #008080">26</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          y</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">y</span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000">dy;<br /></span>
										<span style="COLOR: #008080">27</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          i</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080">28</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">29</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    sprintf(a,</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">B(%d,%d)</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">(x),</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">(y));<br /></span>
								<span style="COLOR: #008080">30</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    TextOut(hdc,</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">(x),</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">(y),a,</span>
								<span style="COLOR: #000000">10</span>
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080">31</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080">32</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">33</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</div>
				<font size="1">
						<br />看书上出来的一段DDA算法。实践出来了，拿上来记忆~~<br />[修改版]</font>
		</div>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> dda_line(HDC</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000"> hdc, POINT A, POINT B, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> color)<br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_53_476_Open_Image" onclick="this.style.display='none'; Codehighlighter1_53_476_Open_Text.style.display='none'; Codehighlighter1_53_476_Closed_Image.style.display='inline'; Codehighlighter1_53_476_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_53_476_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_476_Closed_Text.style.display='none'; Codehighlighter1_53_476_Open_Image.style.display='inline'; Codehighlighter1_53_476_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_53_476_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_53_476_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 3</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">double</span>
						<span style="COLOR: #000000"> length;<br /></span>
						<span style="COLOR: #008080"> 4</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">double</span>
						<span style="COLOR: #000000"> dx,dy;<br /></span>
						<span style="COLOR: #008080"> 5</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">double</span>
						<span style="COLOR: #000000"> x,y;<br /></span>
						<span style="COLOR: #008080"> 6</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(abs(B.x</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">A.x) </span>
						<span style="COLOR: #000000">&gt;=</span>
						<span style="COLOR: #000000"> abs(B.y</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">A.y))<br /></span>
						<span style="COLOR: #008080"> 7</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          length</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">abs(B.x</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">A.x);<br /></span>
						<span style="COLOR: #008080"> 8</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080"> 9</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          length</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">abs(B.y</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">A.y);<br /></span>
						<span style="COLOR: #008080">10</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /></span>
						<span style="COLOR: #008080">11</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     dx</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">((B.x</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">A.x)</span>
						<span style="COLOR: #000000">/</span>
						<span style="COLOR: #000000">length);<br /></span>
						<span style="COLOR: #008080">12</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     dy</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">((B.y</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">A.y)</span>
						<span style="COLOR: #000000">/</span>
						<span style="COLOR: #000000">length);<br /></span>
						<span style="COLOR: #008080">13</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     x</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">A.x</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">0.5</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">15</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     y</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">A.y</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">0.5</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> i</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">17</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000">(i </span>
						<span style="COLOR: #000000">&lt;=</span>
						<span style="COLOR: #000000"> length)<br /></span>
						<span style="COLOR: #008080">18</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_358_462_Open_Image" onclick="this.style.display='none'; Codehighlighter1_358_462_Open_Text.style.display='none'; Codehighlighter1_358_462_Closed_Image.style.display='inline'; Codehighlighter1_358_462_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_358_462_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_358_462_Closed_Text.style.display='none'; Codehighlighter1_358_462_Open_Image.style.display='inline'; Codehighlighter1_358_462_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span>
						<span id="Codehighlighter1_358_462_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_358_462_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">19</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          SetPixel(hdc,</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">(x),</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">(y), color);<br /></span>
								<span style="COLOR: #008080">20</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          x</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">x</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">dx;<br /></span>
								<span style="COLOR: #008080">21</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          y</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">y</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">dy;<br /></span>
								<span style="COLOR: #008080">22</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          i</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080">23</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">24</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">25</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">26</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<br />为使算法更适用于各种编程方法，加入A和B的点参数，更加入颜色值color。在我的实际应用中，color被用来清除上一条画线结果的。 <img src ="http://www.cppblog.com/urgentmind/aggbug/13404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2006-10-07 06:42 <a href="http://www.cppblog.com/urgentmind/articles/13404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算机图形学---Bresenham画线算法</title><link>http://www.cppblog.com/urgentmind/articles/13403.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Fri, 06 Oct 2006 22:40:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/13403.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/13403.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/13403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/13403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/13403.html</trackback:ping><description><![CDATA[
		<p>Bresenham画线算法。<br />[初级版]<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> Bresenham_line(HDC</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000"> hdc)<br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_30_1572_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_1572_Open_Text.style.display='none'; Codehighlighter1_30_1572_Closed_Image.style.display='inline'; Codehighlighter1_30_1572_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_30_1572_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_1572_Closed_Text.style.display='none'; Codehighlighter1_30_1572_Open_Image.style.display='inline'; Codehighlighter1_30_1572_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_30_1572_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_30_1572_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 3</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000"> a[</span>
						<span style="COLOR: #000000">20</span>
						<span style="COLOR: #000000">];<br /></span>
						<span style="COLOR: #008080"> 4</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">double</span>
						<span style="COLOR: #000000"> dx,dy;<br /></span>
						<span style="COLOR: #008080"> 5</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     dx</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">abs(B.x</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">A.x); dy</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">abs(B.y</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">A.y);<br /></span>
						<span style="COLOR: #008080"> 6</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> tx</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">(B.x</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">A.x)</span>
						<span style="COLOR: #000000">&gt;=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">?</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">: </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080"> 7</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> ty</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">(B.y</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">A.y)</span>
						<span style="COLOR: #000000">&gt;=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">?</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">: </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080"> 8</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> tag</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080"> 9</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(dx </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> dy)<br /></span>
						<span style="COLOR: #008080">10</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_213_512_Open_Image" onclick="this.style.display='none'; Codehighlighter1_213_512_Open_Text.style.display='none'; Codehighlighter1_213_512_Closed_Image.style.display='inline'; Codehighlighter1_213_512_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_213_512_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_213_512_Closed_Text.style.display='none'; Codehighlighter1_213_512_Open_Image.style.display='inline'; Codehighlighter1_213_512_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span>
						<span id="Codehighlighter1_213_512_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_213_512_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">11</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          tag</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080">12</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          </span>
								<span style="COLOR: #0000ff">double</span>
								<span style="COLOR: #000000"> temp</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">A.x; </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">x1,y1互换</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">13</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">          A.x</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">A.y;<br /></span>
								<span style="COLOR: #008080">14</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          A.y</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">temp;<br /></span>
								<span style="COLOR: #008080">15</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          temp</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">B.x; </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">x2,y2互换</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">16</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">          B.x</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">B.y;<br /></span>
								<span style="COLOR: #008080">17</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          B.y</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">temp;<br /></span>
								<span style="COLOR: #008080">18</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          temp</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">dx; </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">dx,dy互换</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">19</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">          dx</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">dy;<br /></span>
								<span style="COLOR: #008080">20</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          dy</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">temp;<br /></span>
								<span style="COLOR: #008080">21</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          temp</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">tx; </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">tx,ty互换</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">22</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">          tx</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">ty;<br /></span>
								<span style="COLOR: #008080">23</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          ty</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">temp;<br /></span>
								<span style="COLOR: #008080">24</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">25</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> curx</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">A.x;<br /></span>
						<span style="COLOR: #008080">26</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> cury</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">A.y;<br /></span>
						<span style="COLOR: #008080">27</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(tag)<br /></span>
						<span style="COLOR: #008080">28</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_570_720_Open_Image" onclick="this.style.display='none'; Codehighlighter1_570_720_Open_Text.style.display='none'; Codehighlighter1_570_720_Closed_Image.style.display='inline'; Codehighlighter1_570_720_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_570_720_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_570_720_Closed_Text.style.display='none'; Codehighlighter1_570_720_Open_Image.style.display='inline'; Codehighlighter1_570_720_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span>
						<span id="Codehighlighter1_570_720_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_570_720_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">29</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          SetPixel(hdc,cury,</span>
								<span style="COLOR: #000000">600</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">curx,RGB(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">));<br /></span>
								<span style="COLOR: #008080">30</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          sprintf(a,</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">A(%d,%d)</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,cury,curx);<br /></span>
								<span style="COLOR: #008080">31</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          TextOut(hdc,cury,</span>
								<span style="COLOR: #000000">600</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">curx,a,strlen(a));<br /></span>
								<span style="COLOR: #008080">32</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">33</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">34</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_737_887_Open_Image" onclick="this.style.display='none'; Codehighlighter1_737_887_Open_Text.style.display='none'; Codehighlighter1_737_887_Closed_Image.style.display='inline'; Codehighlighter1_737_887_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_737_887_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_737_887_Closed_Text.style.display='none'; Codehighlighter1_737_887_Open_Image.style.display='inline'; Codehighlighter1_737_887_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span>
						<span id="Codehighlighter1_737_887_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_737_887_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">35</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          SetPixel(hdc,curx,</span>
								<span style="COLOR: #000000">600</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">cury,RGB(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">));<br /></span>
								<span style="COLOR: #008080">36</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          sprintf(a,</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">A(%d,%d)</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,curx,cury);<br /></span>
								<span style="COLOR: #008080">37</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          TextOut(hdc,curx,</span>
								<span style="COLOR: #000000">600</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">cury,a,strlen(a));<br /></span>
								<span style="COLOR: #008080">38</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">39</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">double</span>
						<span style="COLOR: #000000"> d</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">dy</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">dx;<br /></span>
						<span style="COLOR: #008080">40</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000">(cury</span>
						<span style="COLOR: #000000">&lt;=</span>
						<span style="COLOR: #000000">B.y </span>
						<span style="COLOR: #000000">&amp;&amp;</span>
						<span style="COLOR: #000000"> curx</span>
						<span style="COLOR: #000000">&lt;=</span>
						<span style="COLOR: #000000">B.x)<br /></span>
						<span style="COLOR: #008080">41</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_951_1251_Open_Image" onclick="this.style.display='none'; Codehighlighter1_951_1251_Open_Text.style.display='none'; Codehighlighter1_951_1251_Closed_Image.style.display='inline'; Codehighlighter1_951_1251_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_951_1251_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_951_1251_Closed_Text.style.display='none'; Codehighlighter1_951_1251_Open_Image.style.display='inline'; Codehighlighter1_951_1251_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_951_1251_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_951_1251_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">42</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />         </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(d</span>
								<span style="COLOR: #000000">&gt;=</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">)<br /></span>
								<span style="COLOR: #008080">43</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_980_1044_Open_Image" onclick="this.style.display='none'; Codehighlighter1_980_1044_Open_Text.style.display='none'; Codehighlighter1_980_1044_Closed_Image.style.display='inline'; Codehighlighter1_980_1044_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_980_1044_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_980_1044_Closed_Text.style.display='none'; Codehighlighter1_980_1044_Open_Image.style.display='inline'; Codehighlighter1_980_1044_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />         </span>
								<span id="Codehighlighter1_980_1044_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_980_1044_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">44</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />              d</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">d</span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000">2</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">(dy</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">dx);<br /></span>
										<span style="COLOR: #008080">45</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />              cury</span>
										<span style="COLOR: #000000">+=</span>
										<span style="COLOR: #000000">ty;<br /></span>
										<span style="COLOR: #008080">46</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />         }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">47</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />         </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">48</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />              d</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">d</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">2</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">dy;<br /></span>
								<span style="COLOR: #008080">49</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />              curx</span>
								<span style="COLOR: #000000">+=</span>
								<span style="COLOR: #000000">tx;<br /></span>
								<span style="COLOR: #008080">50</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />         </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(tag)<br /></span>
								<span style="COLOR: #008080">51</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />              SetPixel(hdc,cury,</span>
								<span style="COLOR: #000000">600</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">curx,RGB(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">));<br /></span>
								<span style="COLOR: #008080">52</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />         </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">53</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />              SetPixel(hdc,curx,</span>
								<span style="COLOR: #000000">600</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">cury,RGB(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">));<br /></span>
								<span style="COLOR: #008080">54</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">55</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(tag)<br /></span>
						<span style="COLOR: #008080">56</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_1269_1412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1269_1412_Open_Text.style.display='none'; Codehighlighter1_1269_1412_Closed_Image.style.display='inline'; Codehighlighter1_1269_1412_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1269_1412_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1269_1412_Closed_Text.style.display='none'; Codehighlighter1_1269_1412_Open_Image.style.display='inline'; Codehighlighter1_1269_1412_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_1269_1412_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1269_1412_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">57</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        SetPixel(hdc,cury,</span>
								<span style="COLOR: #000000">600</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">curx,RGB(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">));<br /></span>
								<span style="COLOR: #008080">58</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        sprintf(a,</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">B(%d,%d)</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,cury,curx);<br /></span>
								<span style="COLOR: #008080">59</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        TextOut(hdc,cury,</span>
								<span style="COLOR: #000000">600</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">curx,a,strlen(a));<br /></span>
								<span style="COLOR: #008080">60</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">61</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">62</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_1427_1570_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1427_1570_Open_Text.style.display='none'; Codehighlighter1_1427_1570_Closed_Image.style.display='inline'; Codehighlighter1_1427_1570_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1427_1570_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1427_1570_Closed_Text.style.display='none'; Codehighlighter1_1427_1570_Open_Image.style.display='inline'; Codehighlighter1_1427_1570_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_1427_1570_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1427_1570_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">63</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        SetPixel(hdc,curx,</span>
								<span style="COLOR: #000000">600</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">cury,RGB(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">));<br /></span>
								<span style="COLOR: #008080">64</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        sprintf(a,</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">B(%d,%d)</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,curx,cury);<br /></span>
								<span style="COLOR: #008080">65</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        TextOut(hdc,curx,</span>
								<span style="COLOR: #000000">600</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">cury,a,strlen(a));<br /></span>
								<span style="COLOR: #008080">66</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">67</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
<img src ="http://www.cppblog.com/urgentmind/aggbug/13403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2006-10-07 06:40 <a href="http://www.cppblog.com/urgentmind/articles/13403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操作系统实验(Operating System Experiment)</title><link>http://www.cppblog.com/urgentmind/articles/7866.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Tue, 30 May 2006 05:46:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/7866.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/7866.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/7866.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/7866.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/7866.html</trackback:ping><description><![CDATA[1、进程调度中多级反馈队列调度算法的模拟实现<br />Following The Source Code:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">queue</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">iostream</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">cstdlib</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 128, 0);">--------+ |Ready Queue 1| --------+ to CPU<br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 128, 0);">   __________________|<br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 128, 0);">  +<br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 128, 0);">--------+ |Ready Queue 2| --------+ to CPU<br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 128, 0);">   __________________|<br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 128, 0);">  +<br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 128, 0);">--------+ |Ready Queue 3| --------+ to CPU<br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 128, 0);">   __________________|<br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 128, 0);">  +<br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 128, 0);">---------+ |Ready Queue 4| --------+ to CPU<br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 128, 0);">  +__________________|<br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 128, 0);">以上加号为进程执行流向<br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> time[</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">{</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">};  </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">各个队列的时间片 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">str[</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">first</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">second</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">third</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">fourth</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">};<br /></span><span style="color: rgb(0, 128, 128);">23</span> <span style="color: rgb(0, 0, 0);">queue</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> Rqueue[</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">];   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">各个优先级队列定义 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">24</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">25</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> execu(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> n)   <br /></span><span style="color: rgb(0, 128, 128);">26</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">n是指哪一个队列 <br /></span><span style="color: rgb(0, 128, 128);">27</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">proc假设为一个进程 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">28</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);">29</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> proc;   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">代表一个进程 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">30</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">Rqueue[n</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">].empty())<br /></span><span style="color: rgb(0, 128, 128);">31</span> <span style="color: rgb(0, 0, 0);">    {<br /></span><span style="color: rgb(0, 128, 128);">32</span> <span style="color: rgb(0, 0, 0);">        proc</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">Rqueue[n</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">].front(); </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">取队首进程进行调度 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">33</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        proc </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> proc </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> time[n</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">时间片轮转，执行调度后得到的进程 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">34</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        cout</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> proc </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> in the </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">str[n</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> queue</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">endl;                </span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">35</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">( proc </span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);"> )   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">假设进程时间片用完，但还没有执行完 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">36</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        {<br /></span><span style="color: rgb(0, 128, 128);">37</span> <span style="color: rgb(0, 0, 0);">          </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(n</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)Rqueue[n].push(proc); </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">将其压入下一个低优先级的队列 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">38</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">          </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">39</span> <span style="color: rgb(0, 0, 0);">            Rqueue[n</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">].push(proc); </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">如果是最后一个队列，则压入本身 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">40</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        }<br /></span><span style="color: rgb(0, 128, 128);">41</span> <span style="color: rgb(0, 0, 0);">        Rqueue[n</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">].pop();       </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">进行下一次队列调度</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">42</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">43</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;  </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">返回，代表该队列的所有进程均已调度过 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">44</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">}<br /></span><span style="color: rgb(0, 128, 128);">45</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">46</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> schedule(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);"> proc) </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">最初执行一个程序，创建一个进程，调度算法开始 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">47</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);">48</span> <span style="color: rgb(0, 0, 0);">    Rqueue[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">].push(proc);   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">将进程压入第一个队列 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">49</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">; i</span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">; i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">50</span> <span style="color: rgb(0, 0, 0);">    execu(i);    <br /></span><span style="color: rgb(0, 128, 128);">51</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">当execu()返回时，意味着上一优先级队列里的进程均已调度完，进行下一个队列的调度 </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">52</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">}<br /></span><span style="color: rgb(0, 128, 128);">53</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">54</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">55</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> main(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> argc, </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> argv[])<br /></span><span style="color: rgb(0, 128, 128);">56</span> <span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);">57</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">58</span> <span style="color: rgb(0, 128, 0);">    for(int i=0; i&lt;100; i++)<br /></span><span style="color: rgb(0, 128, 128);">59</span> <span style="color: rgb(0, 128, 0);">    {<br /></span><span style="color: rgb(0, 128, 128);">60</span> <span style="color: rgb(0, 128, 0);">        int n=int(rand())%4;    <br /></span><span style="color: rgb(0, 128, 128);">61</span> <span style="color: rgb(0, 128, 0);">        Rqueue[n].push(int(rand())%3);<br /></span><span style="color: rgb(0, 128, 128);">62</span> <span style="color: rgb(0, 128, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">63</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">64</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> proc</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">15</span><span style="color: rgb(0, 0, 0);">;        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">新进程</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">65</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">    schedule(proc); <br /></span><span style="color: rgb(0, 128, 128);">66</span> <span style="color: rgb(0, 0, 0);">    system(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">PAUSE</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">67</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">68</span> <span style="color: rgb(0, 0, 0);">}<br /></span><span style="color: rgb(0, 128, 128);">69</span> <span style="color: rgb(0, 0, 0);"></span></div><br />以上即为我的实验成果，经编译运行后，证明是正确的。<br />如果中间还有不正确的，请不吝指教。<br />谢谢！<br /><img src ="http://www.cppblog.com/urgentmind/aggbug/7866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2006-05-30 13:46 <a href="http://www.cppblog.com/urgentmind/articles/7866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]《数据库原理》练习题及答案</title><link>http://www.cppblog.com/urgentmind/articles/7747.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Sat, 27 May 2006 15:47:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/7747.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/7747.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/7747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/7747.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/7747.html</trackback:ping><description><![CDATA[
		<p class="main">第一部分：选择题 <br />
  　　 一、单项选择题 <br />
  　　 1．DBS是采用了数据库技术的计算机系统。DBS是一个集合体，包含数据库、计算机硬件、软件和 <br />
  　　 A.系统分析员 B.程序员　C.数据库管理员 D.操作员 <br />
  　　 2．模型是对现实世界的抽象，在数据库技术中，用模型的概念描述数据库的结构与语义，对现实世界进行抽象。表示实体类型及实体间联系的模型称为 <br />
  　　 A.数据模型 B.实体模型　C.逻辑模型 D.物理模型 <br />
  　　 3．关系模型概念中，不含有多余属性的超键称为 <br />
  　　 A.候选键 B.对键　C.内键 D.主键 <br />
  　　 4．设R、S为两个关系，R的元数为4，S的元数为5，则与R <img src="http://51zk.csai.cn/sjkyl/images/lxt1.jpg" height="36" width="52" />S等价的操作是 <br />
  　　 A．σ3&lt;6(R×S) B.σ3&lt;2(R×S）　C.σ3&gt;6(R×S) D.σ7&lt;2(R×S) <br />
  　　 5．分布式数据库存储概念中，数据分配是指数据在计算机网络各场地上的分配策略，一般有四种，分别是集中式、分割式、全复制式和 <br />
  　　 A. 任意方式 B.混合式　C.间隔方式 D.主题方式 <br />
  　　 6．数据库系统中，类是指具有相同的消息，使用相同的方法，具有相同的变量名和 <br />
  　　 A. 变量值 B. 特征 C. 定义 D. 类型 <br />
  　　 7．随着计算机应用领域的扩大，第一代、第二代DBS不能适应处理大量的 <br />
  　　 A.格式化数据 B.网络数据 C.非格式数据 D.海量数据 <br /><img src="http://51zk.csai.cn/sjkyl/images//lxt2.jpg" height="489" width="484" /><br />
  　　 9．数据库并发控制概念中，使用X封锁的规则称为 <br />
  　　 A.PS协议 B.PX协议　C.PSC协议 D.两段封锁协议 <br />
  　　 10.在数据库操作过程中事务处理是一个操作序列，必须具有以下性质：原子性、一致性、隔离性和 <br />
  　　 A.共享性 B.继承性 C.持久性 D.封装性 <br />
  　　 11．面向对像模型概念中，类可以有嵌套结构。系统中所有的类组成一个有根的 <br />
  　　 A.有向无环图 B.有向有环图　C.无向有环图 D.无向无环图 <br />
  　　 12．在教学管理系统中，有教师关系T（T＃，NAME），学生关系S（S＃，NAME），学生成绩关系S(S＃，NU)。其中T＃表示教师工号，S＃表示学生学号，则T和N存在联系为 <br />
  　　 A. 1：1 B. 1：N　C. M：N D. 无联系 <br />
  　　 13．一个数据库一般不是由独立的对象组成的，对象的聚集形式的数学意义是 <br />
  　　 A. 笛卡尔积 B. 选择　C. 投影 D. 联接 <br />
  　　 14．对象标识是指针一级的概念是一个强有力的数据操纵原语言，是集合、元组和递归等复合对象操纵的基础，标识是 <br />
  　　 A.任意的 B. 可以改变的 C.不唯一的 D.不能改变的 <br />
  　　 15．数据库系统中除了可用层次模型和关系模型表示实体类型及实体间联系的数据模型以外，还有 <br />
  　　 A. E-R 模型 B. 信息模型 C.网络模型 D.物理模型 </p>
		<p class="main">　　第二部分：非选择题 <br />
  　　 二、填空题 <br />
  　　 16. 数据库系统中，存放 ___________ 的数据库，称为数据字典（DD）。 <br />
  　　 17．关系演算可分为元组关系演算和域关系演算，而在元组演算中，元组关系演算表达式的一般形式为_______________。 <br />
  　　 18．DB是与一个特定组织各项应用有关的全部数据的集合，通常由两大部分组成：一部分是应用数据的集合，称为______________ ，它是数据库的主题；另一部分是关于各级数据结构的描述，称为描述数据库，由DD系统管理。 <br />
  　　 19．在关系模型中，关系中每一个属性值都是____________。 <br />
  　　 20．SQL-SELECT语句完整的句法中，FROM子句是强制性的，FROM子句的作用是_________。 <br />
  　　 21．设关系模式R是第一范式，且每个属性都不传递依赖于R的候选键，则称R是_______ 的模式。 <br />
  　　 22．数据库设计过程中，常常从一些可选方案中选取一种数据库结构，需要有选择的原则，称为评价准则，评价准则可分成 __________ 两类。 <br />
  　　 23．分布式数据管理系统是分布式数据库系统中的_______ 负责管理分布环境下，逻辑集成数据的存取，一致性、有效性和完备性。 <br />
  　　 24．对象关系数据库概念中继承性可以发生在类型一级或 ______________ 一级。 <br /><br />
  　　 25．客户／服务器体系结构的关键在于 ___________ 的分布，能减少计算机系统的各种瓶颈问题。 <br />
  　　 三、简答题 <br />
  　　 26．什么是多值依赖中的数据依赖？举例说明。 <br />
  　　 27．数据库系统生存期是什么？ <br />
  　　 28．为什么说需求分析是数据库系统开发中最困难的任务之一？ <br />
  　　 29．简述ORDBS的中文含义。 <br />
  　　 30．数据库的三级模式和两级映象体系结构中，模式／内模式映象存在于概念级和内部级之间，用于定义概念模式和内模式间的对应性。其主要作用是什么？ <br />
  　　 31．简述逻辑数据的独立性。 <br />
  　　 32．数据库是一个共享资源，在多用户共享系统中，并发操作的含义是什么？ <br />
  　　 33．没有关系R和S如下，写出R÷S计算结果。 <br /><img src="http://51zk.csai.cn/sjkyl/images/lxt3.jpg" height="170" width="355" /></p>
		<p>
				<span class="main">34．设有描述学校情况的U关系。 <br />
  　　 U（S＃，SD，MN，CN，G） <br />
　　
其中：S＃属性表示学生学号，SD表示学生所在系名，MN表示系主任，CN表示课程名，G表示成绩。一个系有若干名学生，一个学生只属于一个系，一个系只
有一名系主任，一个学生可选多门课，每个学生选每门课有一个成绩。试写出U关系中的函数依赖，并给每个函数依赖一个简短说明。 <br />
  　　 35．什么是数据库的并发控制？ <br /><br />
  　　 四、设计题 <br />
  　　 36．设数据库中有基本表： <br />
  　　 教师（工号，姓名，性别，职称，工龄，基本工资，补贴） <br />
  　　 请用SQL语句写出工龄在20年以上（包括20年）基本工资低于1500元的教师的所有信息。 <br />
  　　 37．在教学管理系统中，含有二个关系： <br />
  　　 学生（学号，姓名，性别，出生日期，系名） <br />
  　　 成绩（学号，课程名，成绩） <br />
  　　 若查询每个学生的选修课程数、总成绩、平均成绩，写出实现上述要求的SQL语句。 <br />
  　　 38. 基于数据库中的成绩表： <br />
  　　 成绩（学号，课程名，成绩） <br />
  　　 用SQL语句写出往成绩表中插入一个元组（20010101，管理信息系统，80） <br />
  　　 39．基于数据库中的学生表、成绩表、任课表： <br />
  　　 学生（学号，姓名，性别，出生日期，系名） <br />
  　　 成绩（学号，课程名，成绩） <br />
  　　 任课（课程名，任课教师名） <br />
  　　 用SQL语言中的CREATE语句创建一个含有学号、姓名、性别、系名、课程名、成绩、任课教师名的学生成绩视图。 <br />
  　　 40．基于数据库中的成绩表： <br />
  　　 成绩（学号，课程名，成绩） <br />
  　　 用SQL语句写出只选修一门的学生的学号、课程名、成绩。 <br />
  　　 五、综合题 <br /><br />
  　　 41．下面是医院组织的结构图 <br />
  　　 要求完成以下工作： <br />
  　　 （1）画出医院组织的E-R图； <br />
  　　 （2）查询所有外科病区和内科病区的所有医生姓名； <br />
  　　 （3）查询内科病区患胃病的病人的姓名。 <br /><img src="http://51zk.csai.cn/sjkyl/images/lxt4.jpg" height="95" width="576" /><br /><strong><br /></strong></span>
		</p>
		<p class="main" align="left"> Traceback: http://51zk.csai.cn/sjkyl/NO00001.htm<br /></p>
<img src ="http://www.cppblog.com/urgentmind/aggbug/7747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2006-05-27 23:47 <a href="http://www.cppblog.com/urgentmind/articles/7747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]数据库学习笔记</title><link>http://www.cppblog.com/urgentmind/articles/7721.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Sat, 27 May 2006 02:22:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/7721.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/7721.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/7721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/7721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/7721.html</trackback:ping><description><![CDATA[Trackback: http://51zk.csai.cn/sjkyl<br /><br /><p class="样式1" align="center">第一章 数据库概论 </p><p></p><p class="main">　　本章属于基础知识，主要是对一些概念的理解和记忆。没有难点，相对的重点在于ER模型的设计和关系模型的掌握。 </p><p class="main"><strong>一、数据管理技术的发展阶段( 识记 ) </strong></p><p class="main">数据管理技术共经历了三个阶段： 人工管理阶段 、 文件系统阶段 、 数据库阶段 ： </p><p class="main">1、人工管理阶段的特点： </p><p class="main">　　<span class="main">(1)数据不保存在机器中
        </span></p><p class="main">　　<span class="main">(2)没有专用软件对数据进行管理
        </span></p><p class="main">　　(3)只有程序的概念，没有文件的概念。 </p><p class="main">2、文件系统阶段的特点与缺陷：</p><p class="main">　　<span class="main">(1)数据可长期保存在磁盘上。
          </span>
      　　</p><p class="main">　　<span class="main">(2)数据的逻辑结构与物理结构有了区别
          </span></p><p class="main">　　<span class="main">(3)文件组织呈现多样化
          </span></p><p class="main">　　(4)数据不再属于某个特定程序，可以重复使用。 </p><p class="main">其缺陷是： </p><p class="main">　　<span class="main">数据冗余性
          </span></p><p class="main">　　<span class="main">数据不一致性
          </span></p><p class="main">　　数据联系弱 </p><p class="main">3、数据库阶段的特点 </p><p class="main">　　<span class="main">采用复杂的数据模型表示数据结构
          </span></p><p class="main">　　<span class="main">有较高的数据独立性(数据结构分成用户的逻辑结构、整体逻辑结构和物理结构三级)
          </span></p><p class="main">　　<span class="main">数据库系统为用户提供方便的用户接口，可以使用查询语言、终端命令或程序方式操作数据库。
          </span></p><p class="main">　　<span class="main">系统提供了四个方面的数据控制功能：数据库的恢复、并发控制、数据完整性和数据安全性。
          </span></p><p class="main">　　对数据的操作不一定以记录为单位，还可以数据项为单位。 </p><p class="main">数据库技术中的四个名词:DB、DBMS、DBS、数据库技术。其概念是不同的，要分清。 </p><p class="main"><strong>　　DB </strong>：数据库（Database),DB是统一管理的相关数据的集合。 </p><p class="main"><strong>　　DBMS </strong>：
数据库管理系统（Database Management
System)，DBMS是位于用户与操作系统之间的一层数据管理软件，为用户或应用程序提供访问DB的方法，包括DB的建立、查询、更新及各种数据控
制。DBMS总是基于某种数据模型，可以分为层次型、网状型、关系型、面向对象型DBMS。 </p><p class="main"><strong>　　DBS </strong>：数据库系统（Database System),DBS是实现有组织地、动态地存储大量关联数据，方便多用户访问的计算机软件、硬件和数据资源组成的系统，即采用了数据库技术的计算机系统。 </p><p class="main"><strong>数据库技术 </strong>：是一门研究数据库结构、存储、管理和使用的软件学科。 </p><p class="main"><strong>二、数据描述的术语( 领会 ) </strong></p><p class="main">1、数据描述的三个领域：现实世界、信息世界和机器世界。 </p><p class="main">　　信息世界中的几个概念： 实体 (即客观存在可以相互区别的事物)、 实体集 (同类实体的集合)、属性(实体的特性)、 实体标识符 (唯一标识实体的属性(集))。 </p><p class="main">　　机器世界中的四个概念： 字段、记录、文件、键 (关键码)。 </p><p class="main">2、数据描述的两种形式： 物理描述 和 逻辑描述 。前者是指数据在存储设备上的存取方式，后者是指程序员或用户以用以操作的数据形式。 </p><p class="main">3、物理描述用到的术语有：位、字节、字、块、桶、卷 </p><p class="main">4、数据联系的描述： </p><p class="main">　　<strong>1：1联系 </strong>：如果实体集E1中的每个实体最多只能和实体集E2中的一个实体有联系，反之亦然，好么实体集E1对E2的联系称为“一对一联系”，记为“1：1”。 </p><p class="main">　　<strong>1：N联系 </strong>：如果实体集E1中每个实体与实体集E2中任意个（零个或多个）实体有联系，而E2中每个实体至多和E1中的一个实体有联系，那么E1对E2的联系是“一对多联系”，记为“1：N”。 </p><p class="main"><strong>　　M：N联系 </strong>：如果实体集E1中每个实体与实体集E2中任意个（零个或多个）实体有联系，反之亦然，那么E1对E2的联系是“多对多联系”，记为“M：N”。 </p><p class="main"><strong>三、数据模型 </strong></p><p class="main">1、 <strong>数据模型 </strong>的概念( 领会 )： </p><p class="main">　　表示实体类型及实体类型间联系的模型称为“数据模型”。它可分为两种类型： 概念数据模型 和 结构数据模型 。 </p><p class="main">2、 <strong>概念数据模型( </strong>简单应用 ) ： </p><p class="main">　　它是独立于计算机系统的模型，完全不涉及信息在系统中的表示，只是用来描述某个特定组织所关心的信息结构。 <em>( 应当掌握教材例1.1，设计简单的ER模型 ) </em></p><p class="main">3、 <strong>结构数据模型 </strong>：</p><p class="main">　　它是直接面向数据库的逻辑结构，是现实世界的第二层抽象。这类模型涉及到计算机系统和数据库管理系统，所以称为“结构数据模型”。结构数据模型应包含：数据结构、数据操作、数据完整性约束三部分。它主要有： 层次 、 网状 、 关系 三种模型。 </p><p class="main"><strong>　　层次模型( </strong>识记 <strong>) </strong>：用树型结构表示实体间联系的数据模型 </p><p class="main"><strong>　　网状模型 </strong>( 识记 )：用有向图结构表示实体类型及实体间联系的数据模型。 </p><p class="main"><strong>　　关系模型( </strong>领会 )：是由若干个关系模式组成的集合，其主要特征是用二维表格结构表达实体集，用外鍵表示实体间联系。 </p><p class="main"><strong>4、面向对象模型(识记):</strong></p><p class="main">　　通过对象和类的概念来建立的数据库模型，是面向对象技术与数据库技术结合的产物，本节了解一下即可。 </p><p class="main"><strong>四、数据库的体系结构( 领会 ) </strong></p><p class="main">1、三级结构模式：数据库的体系结构分为三级：内部级、概念级和外部级： </p><p><span class="main"><strong>　　外部级 </strong>：单个用户所能看到的数据特性，称外模式。
          </span></p><p><span class="main"><strong>　　概念级 </strong>：涉及到所有用户的数据定义，是全局的数据视图,称“概念模式”。</span></p><p> 　　
            <span class="main"><strong>内部级 </strong>：最接近于物理存储，涉及到实际数据存储的结构，称“内模式”。 </span></p><p class="main">2、两级映象： </p><p><span class="main"><strong>　　模式/内模式映象 </strong>：用于定义概念模式和内模式之间的对应性。一般在内模式中描述。
          </span></p><p><span class="main"><strong> 　　外模式/模式映象 </strong>：用于定义外模式和概念模式间的对应性。一般在外模式中描述。 
              </span></p><p class="main">3.两级数据独立性： </p><span class="main"><strong>　　物理数据独立性 </strong>：修改内模式时尽量不影响概念模式及外模式，则达到物理数据独立性。
        </span><span class="main"><strong> 　　逻辑数据独立性 </strong>：修改概念模式时尽量不影响外模式和应用程序。 
      </span><p class="main">4.用户及用户界面：这里插一句，数据库模式可以理解为数据库结构。 </p><p class="main"><strong>五、数据库管理系统( DBMS 领会 ) </strong></p><p class="main">1、DBMS的主要功能： <br />
  　　（1）数据库的定义功能 <br />
  　　（2）数据库的操纵功能 <br />
  　　（3）数据库的保护功能 <br />
  　　（4）数据库的存储管理 <br />
  　　（5）数据库的维护功能 <br />
  　　（6）数据字典 </p><p class="main">2、DBMS的组成： </p><p class="main">　　由两大部分组成：查询处理器和存储管理器，前者包括DDL编译器、DML编译器、嵌入型DML预编译器、查询运行核心程序。后者包括授权和完整性管理器，事务管理器、文件管理器，缓冲区管理器。 </p><p class="main"><strong>六、数据库系统(DBS 领会 ) </strong></p><p class="main">　　DBS由四部分组成：数据库、硬件、软件、数据库管理员。 </p><p class="main">　　DBS的全局结构及DBS的效益，了解一下。 <br /></p><p class="main"><br /></p><p class="样式2" align="center"><b>第二章 关系模型</b></p><p></p><p class="main">　　本章为次重点章，我们经常使用的数据库均采用关系模型，本章主要介绍了关系模型的关系运算理论，主要在于对关系演算运算的理解，为后面章节的SQL作准备。 </p><p class="main"><strong>一、关系模型的基本概念( </strong>识记 <strong>) </strong></p><p class="main">1、关系模型的基本术语： </p><p class="main">　　用二维表格 结构表示实体集、外键表示实体间联系的数据模型称为 关系模型 。 </p><p class="main">　　基本术语有： 字段(属性)、字段值(属性值)、记录(元组)、二维表格(元组集合、关系或实例)。 在这里，括号中的表述为关系模型中的术语。它与表格中术语可以一一对应。还有，关系中属性个数称为元数，元组个数为基数。 </p><p class="main">　　键 ：由一个或几个属性组成。(注意键不一定是唯一的一个属性)。 </p><p><span class="main">　　　　超键 ：在关系中能唯一标识元组的属性集称为关系模式的超键。(注意，超键也是一个属性集，不一定只是一个属性)
          </span></p><p><span class="main">　　　　候选键 ：不含有多余属性的超键称为候选键。
             </span></p><p><span class="main">　　　　主键 ：用户选作元组标识的一个候选键为主键。
           </span></p><p><span class="main">　　　　外键 ：某个关系的主键相应的属性在另一关系中出现，此时该主键在就是另一关系的外键，如有两个关系S和SC,其中S#是关系S的主键，相应的属性S#在关系SC中也出现，此时S#就是关系SC的外键。 <br /></span></p><p class="main">2、关系模式、关系子模式和存储模式 </p><p><span class="main">　　关系模式 ：关系模式实际上就是记录类型。它包括：模式名，属性名，值域名以及模式的主键。关系模式仅是对数据特性的描述。 (这通常在数据库中表现为一个数据表的结构)
                 </span></p><p><span class="main">　　关系子模式 ：就是用户所用到那部分数据的描述。
                     </span></p><p><span class="main">　　存储模式 ：关系存储时的基本组织方式是文件，元组是文件中的记录。 
               
                                         </span></p><p class="main">3、关系模型的三类完整性规则 </p><p><span class="main">　　实体完整性规则 ：要求关系中组成主键的属性上不能有空值。
                                     </span></p><p><span class="main">　　参照完整性规则 ：要求不引用不存在的实体。
                                         </span></p><p><span class="main">　　用户定义完整性规则 ：由具体应用环境决定，系统提供定义和检验这类完整性的机制。 
                                   
                                                                                                     </span></p><p class="main">4、关系模型的形式定义：数据结构、数据操作和完整性规则。 </p><p class="main"><strong>二、关系代数运算(简单应用) </strong></p><p class="main"><strong>1、关系代数的五个基本操作：并、差、笛卡尔积、投影和选择。 </strong></p><p class="main">　　并 (∪)：两个关系需有相同的关系模式，并的对象是元组，由两个关系所有元组构成。 </p><p class="main">　　差 (-)：同样，两个关系有相同的模式，R和S的差是由属于R但不属于S的元组构成的集合。 </p><p class="main">　　投影( σ)：对关系进行垂直分割，消去某些列，并重新安排列的顺序。 </p><p class="main">　　选择 (π)：根据某些条件关系作水平分割，即选择符合条件的元组。 </p><p class="main"><strong>2、关系代数的四个组合操作：交、联接、自然联接和除法 </strong></p><p class="main">　　交 (∩)：R和S的交是由既属于R又属于S的元组构成的集合。 </p><p class="main">　　联接 包括θ联接和F联接，是选择R×S中满足iθ(r+j)或F条件的元组构成的集合，特别注意 等值联接 (θ为等号“=”)。 </p><p class="main">　　自然联接 (R|X|S)：在R×S中，选择R和S公共属性值均相等的元组，并去掉R×S中重复的公共属性列。如果两个关系没有公共属性，则自然联接就转化为笛卡尔积。 </p><p class="main">　
　除法
(÷)：首先除法的结果中元数为两个元数的差，以例2.6为例，我们可以直接用观察法来得到结果，把S看作一个块，拿到R中去和相同属性集中的元组作比
较，如果有相同的块，且除去此块后留下的相应元组均相同，那么可以得到一条元组，所有这些元组的集合就是除法的结果。 </p><p class="main"><em>　　对于上述的五个基本操作和组合操作，应当从实际运算方面进行理解和运用，对其形式定义可不必深究。注意课本上的例子。 </em></p><p class="main"><strong>3、关系代数表达式及应用 </strong></p><p class="main">　　在关系代数表达式中，复合了上述五个基本操作，在给出相应的表格(关系)中，应该能够根据给出的关系代数表达式计算关系值，也要能根据相应查询要求列出关系表达式。 </p><p class="main">在列关系表达式时，通常有以下形式： </p><p class="样式2" align="center">π...(σ...(R×S))或者π...(σ...(R|X|S)) </p><p class="main">　　首先把查询涉及到的关系取来，执行笛卡尔积或自然联接操作得到一张大的表格，然后对大表格执行水平分割(选择)和垂直分割(投影)操作。但是注意当查询涉及到否定或全部值时，就不能用上述形式，而要用到差或除法操作。 </p><p class="main"><strong>三、关系演算( </strong>领会 <strong>) </strong></p><p class="main">　　关系演算分为元组关系演算或域关系演算，前者以元组为变量，后者以域为变量。 </p><p class="main">　　元组演算表达式的一般形式为：{t|P(t)}，其含义为：这是一个元组集合，其中的每个元组t(t是元组变量)满足公式P所规定的条件。所以在书写演算表达式时，应该注重理解公式P如何表达。 </p><p class="main">　　域演算表达式的一般形式为：{t1...tk|P(t1...,tk)},其含义为：这是一个域集合，其中每个域变量的取值关系满足公式P所规定的条件。也是注意公式P的表达。 </p><p class="main"><em>　　以上两类演算需要一定的离散数学基础，如果不能很深刻的掌握，问题也不大，主要应看懂表达式即可，对于给定的表达式和给定的关系，应当能计算表达式的结果(得到一个关系) </em></p><p class="main"><strong>四、查询优化 </strong></p><p class="main">　　查询优化的目的就是为了系统在执行时既省时间又能提高效率，在关系代数运算中，通常是先进行笛卡尔积或联接运算，再进行选择和投影，恰当地安排选择、投影和联接的顺序，就可实现查询优化。 </p><p><span class="main">  优化的策略主要有以下几点：
          </span></p><p><span class="main">　　(1)在关系代数表达式中尽可能早地执行选择操作(早选择).
              </span></p><p><span class="main">　　(2)把笛卡尔积和随后的选择操作合并成F联接运算(F联接)
              </span></p><p><span class="main">　　(3)同时计算一连串的选择和投影操作(同时算)
              </span></p><p><span class="main">　　(4)保留同一子表达式的结果
              </span></p><p><span class="main">　　(5)适当对关系文件进行预处理
              </span></p><p><span class="main">　　(6)计算表达式之前先估计一下怎么计算合算。 
        
                                                                </span></p><p class="main"><em>　　以上几点需要理解。根据表达式优化的算法步骤对给定表达式进行优化。 </em></p><br /><p class="样式2" align="center"><b>第三章 关系数据库SQL语言</b></p><p></p><p class="main">　　本章为重点章，应熟悉和掌握SQL的数据定义、数据查询、数据更新的句法及其应用，特别是数据查询的应用。结合上机操作进行理解和掌握。 </p><p class="main"><strong>一、SQL概述。 </strong></p><p class="main"><strong>1、SQL发展历程( 识记 ) </strong></p><p class="main">　
　SQL从1970年美国IBM研究中心的E.F.Codd发表论文到1974年Boyce和Chamberlin把SQUARE语言改为SEQUEL语
言，到现在还在不断完善和发展之中，SQL(结构式查询语言)虽然名为查询，但实际上具有定义、查询、更新和控制等多种功能。 </p><p class="main"><strong>2、SQL数据库的体系结构( 领会 ) </strong></p><p class="main">　　SQL数据库的体系结构也是三级结构 ，但术语与传统关系模型术语不同，在SQL中，关系模式称为" 基本表 "，存储模式称为" 存储文件 "，子模式称为" 视图 "，元组称" 行 "，属性称" 列 "。 </p><p class="main">SQL数据库体系的结构要点如下： </p><p><span class="main">　　(1)一个SQL数据库是表的汇集。
          </span></p><p><span class="main">　　(2)一个SQL表由行集构成，行是列的序列，每列对应一个数据项。
              </span></p><p><span class="main">　　(3)表或者是基本表，或者是视图。基本表是实际存储在数据库中的表，视图由是由若干基本表或其他视图构成的表的定义。
              </span></p><p><span class="main">　　(4)一个基本表可以跨一个或多个存储文件，一个存储文件也可存放一个或多个基本表。存储文件与物理文件对应。
              </span></p><p><span class="main">　　(5)用户可以用SQL语句对表进行操作，包括视图和基本表。
              </span></p><p><span class="main">　　(6)SQL的用户可以是应用程序，也可以是终端用户。 
        
                                            </span></p><p class="main"><strong>3、SQL的组成( 识记 ) </strong></p><p class="main">SQL由四部分组成： </p><p><span class="main"> 　　(1)数据定义：SQL DDL。定义SQL模式，基本表、视图和索引。
          </span></p><p><span class="main">　　(2)数据操纵：SQL DML。包括数据查询和数据更新(增、删、改)。
              </span></p><p><span class="main">　　(3)数据控制：包括对基本表和视图的授权、完整性规则的描述，事务控制等。
              </span></p><p><span class="main">　　(4)嵌入式SQL的使用规定。 
        
                            </span></p><p class="main"><strong>二、SQL的数据定义( </strong>简单应用 <strong>) </strong></p><p class="main"><strong>1、SQL模式的创建和撤消： </strong></p><p class="main">　　SQL 模式的创建 可简单理解为建立一个数据库，定义一个存储空间，其句法是： </p><p class="样式2" align="center">CREAT SCHEMA &lt;模式名&gt; AUTHORIZATION &lt;用户名&gt;</p><p class="main">　　撤消SQL模式的句法为： </p><p class="样式2" align="center">DROP SCHEMA &lt;模式名&gt; [ CASCADE | RESTRICT ] </p><p class="main">　　方括号中的选项参数CASCADE表示连锁方式，执行时将模式下所有基本表、视图、索引等元素全部撤消。RESTRICT表示约束式，执行时必须在SQL模式中没有任何下属元素时方可撤消模式。 </p><p class="main">2、SQL提供的基本数据类型 </p><p><span class="main"> 　　数值型：包括 integer、smallint、real、double precision 、float(n),numeric(p，d)</span></p><p><span class="main">　　字符串型：char(n)、varchar(n)，前者是定长，后者为变长串
            </span></p><p><span class="main"> 　　位串型：bit(n),bit varying(n)，同上。
                </span></p><p><span class="main">　　时间型：date、time。 </span></p><p class="main">3、基本表的创建、修改和撤消 </p><ul><li><span class="main">基本表的创建：(可理解为建立表结构) <br />
    CREAT TABLE SQL 模式名.基本表名 <br />
    (列名，类型， <br />
    …… <br />
    完整性约束...) <br />
    完整性约束包括主键子句(PRIMARY KEY)、检查子句(CHECK)和外键子句(Foreign KEY).
        </span></li><li><span class="main">基本表结构的修改 <br />
    ALTER TABLE 基本表名 ADD/ DROP (增加/删除) 列名 类型名(增加时写出) <br />
    删除时有子句 [CASCADE|RESTRICT]，前者为连锁删除，后者为约束删除，即没有对本列的任何引用时才能删除。
        </span></li><li class="main">基本表的撤消 <br />
    DROP TABLE 基本表名 [CASCADE|RESTRICT] </li></ul><p class="main">4、视图的创建和撤消 </p><ul><li><span class="main">创建： CREAT VIEW 视图名(列名表) AS SELECT 查询语句
        </span></li><li class="main">撤消： DROP VIEW 视图名 </li></ul><p class="main">5、索引的创建和撤消 </p><ul><li><span class="main">创建： CREAT [UNIQUE] INDEX 索引名 ON 基本表名(列名表 [ASC|DESC])
        </span></li><li class="main">撤消： DROP INDEX 索引名 </li></ul><p class="main">　　总结：凡创建都用 CREAT ,删除都用 DROP ,改变用 alter ,再跟类型和名字，附加子句很容易了。 </p><p class="main"><strong>三、SQL的数据查询( </strong>综合应用 <strong>) </strong></p><p class="main">这一段是本章的重点内容，应该熟练掌握。首先了解基本句法： </p><p class="main">1、 SELECT -FROM- WHERE 句型 </p><ul><li class="main">SELECT 列名表(逗号隔开) FROM 基本表或视图序列 WHERE 条件表达式 </li></ul><p class="main">　　在这里，重点要掌握条件表达式中各种运算符的应用，如=，&gt;,&lt;,&lt;&gt;等算术比较运算符、逻辑运算符 AND、OR、NOT 、集合成员资格运算符： IN，NOT IN ，以及嵌套的 SELECT 语句的用法要特别注意理解。 <em>针对课本的例题和课后习题进行掌握。 </em></p><p class="main">　　在查询时， SELECT 语句可以有多种写法，如 联接查询、嵌套查询和使用存在量词的嵌套查询 等。最好都掌握，但是起码应能写出一种正确的查询语句。 </p><p class="main">2. SELECT 语句完整的句法： </p><ul><li class="main">SELECT 列名表(逗号隔开) <br />
    FROM 基本表或视图序列 <br />
    [ WHERE 条件表达式] (此为和条件子句) <br />
    [GROUP BY 列名序列] (分组子句) <br />
    [HAVING 组条件表达式] (组条件子句) <br />
    [ORDER BY列名[ASC|DESC]..] (排序子句) </li></ul><p class="main">这段关于完整句法的内容能够理解也就问题不大了。 </p><p class="main">3、 SELECT 语句中的限定 </p><p class="main"><em>　　这一段内容主要是对 SELECT 语句进一步使用进行的深入学习，领会下列各种限定的使用目的和方法。 </em></p><ul><li><span class="main">要求输出表格中不出现重复元组，则在 SELECT 后加一DISTINCT
        </span></li><li><span class="main">SELECT 子句中允许出现加减乘除及列名，常数的算术表达式
        </span></li><li><span class="main">WHERE 子句中可以用BETWEEN...AND...来限定一个值的范围
        </span></li><li><span class="main">同一个基本表在 SELECT 语句中多次引用时可用AS来增加别名
        </span></li><li><span class="main">WHERE 子句中字符串匹配用LIKE和两个通配符，%和下划线_.
        </span></li><li><span class="main">查询结果的结构完全一致时可将两个查询进行并(UNION)交(INTERSECT)差(EXCPT)操作
        </span></li><li><span class="main">查询空值操作不是用='null',而是用 IS NULL来测试。
        </span></li><li><span class="main">集合成员资格比较用 IN/NOT IN ，集合成员算术比较用元组θSOME/ALL
        </span></li><li><span class="main">可以用子查询结果取名(表名(列名序列))来作为导出表使用
        </span></li><li class="main">基本表的自然联接操作是用 NATURAL INNER JOIN来实现的。</li></ul><p class="main"><strong>四、SQL的数据更新( </strong>简单应用 <strong>) </strong></p><p class="main">简单应用就是掌握基本的句型并能套用在一些简单的查询要求上。 </p><p class="main">1、数据插入： </p><p class="main">INSERT INTO 基本表名(列名表) <br />
valueS (元组值) </p><p class="main">或 <br />
  INSERT INTO 基本表名(列名表) <br />
  SELECT 查询语句 </p><p class="main">其中元组值可以连续插入。用查询语句可以按要求插入所需数据。 </p><p class="main">2、数据删除： </p><p class="main">DELETE FROM 基本表名 [ WHERE 条件表达式] </p><p class="main">3、数据修改： </p><p class="main">UPDATE 基本表名 <br />
  SET 列名=值表达式,[列名=值表达式...] <br />
  [ WHERE 条件表达式] </p><p class="main">4、对视图的更新： </p><p class="main">我们知道，对视图的查询是和基本表相同的，但是更新操作则受到下列三条规则的限制：(领会一下) </p><ul><li><span class="main">如果视图是从多个基本表使用联接操作导出的，则不允许更新。
        </span></li><li><span class="main">如果导出的视图使用了分组和聚合操作，也不允许更新。
        </span></li><li class="main">如果视图是从单个基本表使用选择和投影操作导出的，并且包括了基本表的主键或某个候选键，则可以执行操作。(这就相当于在基本表上操作)。 </li></ul><br /><p class="main"><em> 　　这一节的关于增删改的操作要和前面关于数据库模式、表的增删改操作进行对比学习，以加深理解。不要忘记上机实践 </em>。 <br /></p><p class="main"><br /></p><p class="样式2" align="center"><b>第四章 关系数据库的模式设计</b></p><p></p><p class="main">　　　本章的理论性较强，学习时有无从下手的感觉，在学习时应多加思考，从概念出发去理解理论，前后的理论有较强的联系，因此要逐个理解，但对于理论的证明等内容则不必深究，本章重点是函数依赖，无损联接、保持依赖和范式的概念。 </p><p class="main"><strong>一、关系模式的设计问题( </strong>识记 <strong>) </strong></p><p class="main">　　关系数据库 是以关系模型为基础的数据库，它利用关系来描述现实世界。一个关系既可以用来描述一个实体及其属性 ，也可以用来描述实体间的联系。关系实质上就是一张二维表 ，表的 行称为元组 ，列称为属性 。 </p><p class="main">　　关系模式是用来定义关系的，这里的关系模式我们可以简单地理解为一个表的结构，一个关系数据库包含一组关系，也就是包含一组二维表，这些二维表结构体的集合就构成数据库的模式(也可以理解为数据库的结构)。 </p><p class="main">　　关系数据库 设计理论包括三个方面内容： 数据依赖 、范式 、模式设计方法。核心内容是数据依赖。 </p><p class="main">　　泛关系模式 ：把现实问题的所有属性组成一个关系模式R(U)，这个关系模式就称为泛关系模式。 </p><p class="main">　　数据库模式 ：把泛关系模式用一组关系模式的集合ρ来表示时，这个ρ就是数据库模式。 </p><p class="main">下面我们总结一下关系模式的相关内容从"大"到"小"的排列 </p><p class="main">　　泛关系模式→数据库模式→关系数据库→表结构→关系模式实例(表)→记录(行、列.) </p><p class="main">　　关系模式的存储异常: 数据冗余 、更 新异常 、 插入异常和删除异常 </p><p class="main"><strong>二、函数依赖(FD) </strong></p><p class="main"><strong>　　1、函数依赖的定义 </strong>(
领会
)：设有关系模式R(A1，A2，...An)或简记为R(U)，X，Y是U的子集，r是R的任一具体关系，如果对r的任意两个元组t1,t2,由t1
[X]=t2[X]导致t1[Y]=t2[Y]，则称X函数决定Y，或Y函数依赖于X，记为X→Y。X→Y为模式R的一个函数依赖。 </p><p class="main"><em>　　这个定义可以这样理解 </em>：有一张设计好的二维表，X，Y是表的某些列(可以是一列，也可以是多列)，若在表中的第t1行，和第t2行上的X值相等，那么必有t1行和t2行上的Y值也相等，这就是说Y函数依赖于X。 </p><p class="main"><strong>2、函数依赖的逻辑蕴涵 </strong>( 识记 ) </p><p class="main">　　设F是关系模式R的一个函数依赖集，X,Y是R的属性子集，如果从F中的函数依赖能够推出X→Y，则称F逻辑蕴涵X→Y，记为F|=X→Y. </p><p class="main">　　而函数依赖的闭包F + 是指被F逻辑蕴涵的函数依赖的全体构成的集合。 </p><p class="main"><strong>3、键和FD的关系 </strong>( 领会 ) </p><p class="main">　　键是唯一标识实体的属性集。对于键和函数依赖的关系：有两个条件：设关系模式R(A1,A2...An)，F是R上的函数依赖集，X是R的一个子集， </p><p><span class="main"> 　　(1)X→A1A2...An∈F + (它的意思是X能够决定唯一的一个元组)
          </span></p><p><span class="main">　　(2)不存在X的真子集Y，使得Y也能决定唯一的一个元组，则X就是R的一个候选键。(它的意思是X能决定唯一的一个元组但又没有多余的属性集) 
        
            </span></p><p class="main">　　包含在任何一个候选键中的属性称为主属性 ，不包含在任何键中的属性为非主属性(非键属性)，注意主属性应当包含在候选键中。 </p><p class="main"><strong>4、函数依赖(FD)的推理规则 </strong>( 简单应用 ) </p><p class="main">　　前面我们举的例子中是以实际经验来确定一个函数依赖的逻辑蕴涵，但是我们需要一个推理规则才能完全确定F或F+的所有函数依赖。 </p><p class="main">　　设有关系模式R(U)，X，Y，Z，W均是U的子集，F是R上只涉及到U中属性的函数依赖集，推理规则如下： </p><ul><li><span class="main">自反律 ：如果Y <img src="http://www.ezikao.com/xjzl/sub/sjkylpsr/note4/UI.GIF" height="17" width="12" />X <img src="http://www.ezikao.com/xjzl/sub/sjkylpsr/note4/UI.GIF" height="17" width="12" />U,则X→Y在R上成立。
        </span></li><li><span class="main">增广律 ：如果X→Y为F所蕴涵，Z <img src="http://www.ezikao.com/xjzl/sub/sjkylpsr/note4/UI.GIF" height="17" width="12" />U，则XZ→YZ在R上成立。(XZ表示X∪Z，下同)
        </span></li><li><span class="main">传递律 ：如果X→Y和Y→Z在R上成立，则X→Z在R上成立。 <br /><br /></span></li><li><span class="main">合并律 ：如果X→Y和X→Z成立，那么X→YZ成立。
        </span></li><li><span class="main">伪传递律 ：如果X→Y和WY→Z成立，那么WX→Z成立。
        </span></li><li class="main">分解律 ：如果X→Y和Z <img src="http://www.ezikao.com/xjzl/sub/sjkylpsr/note4/UI.GIF" height="17" width="12" />Y成立，那么X→Z成立。 </li></ul><p class="main"><strong>5、函数依赖推理规则的完备性 </strong>( 识记 ) </p><p class="main">　　函数依赖推理规则系统(自反律、增广律和传递律)是完备的。由推理规则的完备性可得到两个重要结论： </p><ul><li><span class="main">属性集X + 中的每个属性A，都有X→A被F逻辑蕴涵，即X + 是所有由F逻辑蕴含X→A的属性A的集合。
        </span></li><li class="main">F + 是所有利用Amstrong推理规则从F导出的函数依赖的集合 </li></ul><p class="main"><strong>6、函数依赖集的等价和覆盖 </strong>( 识记) </p><p class="main">　　在关系模式R(U)上的两个函数依赖集F和G，如果 满足F + =G + ，则称F和G是 等价 的，称F和G等价也称F 覆盖 G或G覆盖F。 </p><p class="main">每个函数依赖集F都可以被一个 右部只有单属性的函数依赖集 G所覆盖。 </p><ul><li><span class="main">如果函数依赖集合F满足：
        </span></li><li><span class="main">(1)F中每一个函数依赖的右部都是单属性；
        </span></li><li><span class="main">(2)F中的任一函数依赖X→A，其F-{X→A}是不等价的；
        </span></li><li><span class="main">(3)F中的任一函数依赖X→A，Z为X的子集。(F-{X→A})∪{Z→A}与F不等价。
        </span></li><li class="main">则称F为最小函数依赖集合。 </li></ul><p class="main">如果函数依赖集F和G等价，并且G是最小集，那么称G是F的一个 最小覆盖 。 </p><p class="main"><em>这一段并不要求掌握最小集的求法，但是应当通过其求法理解最小集的概念 </em>。 </p><p class="main"><strong>三、关系模式的分解特性 </strong></p><p class="main">1、 <strong>模式分解中存在的问题 </strong>：( 识记 ) </p><p class="main">　　模式分解 就是将一个泛关系模式 R分解成 数据库模式ρ ，以ρ代替R的过程。它不仅仅是属性集合的分解，它是对关系模式上的函数依赖集、以及关系模式的当前值分解的具体表现。 </p><p class="main">　　分解一个模式有很多方法，但是有的分解会出现失去函数依赖、或出现插入、删除异常等情况，而有的分解则不出现相关问题。 </p><p class="main">　　衡量一个分解的标准有三种： 分解具有无损联接 ； 分解要保持函数依赖 ；分解 既要保持依赖，又要具有无损联接 。 </p><p class="main">那么什么是无损联接呢?什么又是保持依赖? </p><p class="main">2、 <strong>无损联接的定义和性质 </strong>( 识记 ) </p><p class="main">　
　设R是一关系模式，分解成ρ={R1,R2，...,Rk}，F是R上的一个函数依赖集。无损联接就是指R中每一个满足F的关系r(也就是一个关系实
例)都有r=π R1 (r)|X|π R2 (r)...|X|π R3 (r)，即r为它在Ri上的投影的自然联接。 </p><p class="main"><em>　　最简单的理解， </em>也就是说，分解后的关系 自然连接后 完全等于 分解前的 关系，则这个分解相对于F是无损联接分解。 </p><p class="main">　　设R的分解为ρ={R1,R2},F为R所满足的函数依赖集，则分解ρ具有无损联接性的 充分必要条件 是： </p><ul><li><span class="main">R1∩R2→(R1-R2)
        </span></li><li class="main">R1∩R2→(R2-R1) </li></ul><p class="main">　　也就是说，分解后的两个模式的交能决定这两个模式的差集，即R1、R2的公共属性能够函数决定R1或R2中的其他属性 ，这样的分解就必定是无损联接分解 。 </p><p class="main">3、 <strong>保持函数依赖的分解 </strong>( 识记 ) </p><p class="main">　　在分解过程中，要求模式分解的无损联接是必要的，只有无损联接分解才能保证任何一个关系能由它的那些投影进行自然联接得到恢复。 </p><p class="main">　　同时，分解关系模式时还应保证关系模式的函数依赖集在分解后仍在数据库模式中保持不变，这就是保持函数依赖的问题。也就是所有分解出的模式所满足的函数依赖的全体应当等价于原模式的函数依赖集。只有这样才能确保整个数据库中数据的语义完整性不受破坏。 </p><p class="main"><strong>四、关系模式的范式( </strong>领会 <strong>) </strong></p><p class="main">1、1NF、2NF、3NF、BCNF的定义： </p><ul><li><span class="main">1NF：第一范式 。 <br />
    即关系模式中的属性的 值域 中 每一个值 都是 不可再分解 的值。如果某个数据库模式都是第一范式的，则称该数据库模式是属于第一范式的数据库模式。</span></li><li><span class="main">2NF：第二范式 。 <br />
  如果关系模式R为 第一范式 ，并且R中每一个 非主属性 完全函数依赖于 R的某个候选键，则称为 第二范式模式 。 <br /><br />
  在这里要先了解“非主属性”、“完全函数依赖”、“候选键”这三个名词的含义。 <br />
  候选键 就是指可以唯一决定关系模式R中某元组值且不含有多余属性的属性集。 <br />
  非主属性 也就是非键属性，指关系模式R中不包含在任何建中的属性。 <br />
  设有函数依赖W→A，若存在X <img src="http://51zk.csai.cn/sjkyl/NO00044_%5B.gif" height="17" width="12" />W，有X→A成立，那么称W→A是局部依赖，否则就称W→A是 完全函数依赖 。 <br /><em><br /></em>在分析是否为第2范式时，应 <em>首先确定 </em>候选键 ，然后把关系模式中的非主属性与键的依赖关系进行考察，是否都为完全函数依赖，如是，则此关系模式为2NF。如果数据库模式中每个关系模式都是2NF的，则此数据库模式属于2NF的数据库模式。 <em><br /></em><br /></span></li><li><span class="main">3NF：第三范式 。 <br />
  如果关系模式R是 第二范式 ，且 每 个 非主属性 都 不 传递依赖 于R的 候选键 ，则称R为第三范式的模式。 <br /><br />
  这里首先要了解 传递依赖 的含义： 在关系模式中，如果Y→X，X→A，且X不决定Y和A不属于X，那么Y→A是传递依赖。 <br /><br />
  注意的是，这里要求非主属性都不传递依赖于候选键。 <br /><br /></span></li><li><span class="main">BCNF ：这个范式和第三范式有联系，它是3NF的改进形式。若关系模式R是 第一范式 ，且 每个属性 都 不 传递依赖于R的候选键。这种关系模式就是BCNF模式。 </span></li></ul><p><span class="main">纵观四种范式，可以发现它们之间存在如下关系： </span></p><p align="center"><img src="http://51zk.csai.cn/sjkyl/images/NO00044_001.GIF" height="186" width="290" /></p><p class="main">5、 <strong>分解成BCNF模式集的算法( </strong>识记 <strong>) </strong></p><p class="main">　　对于任一关系模式，可找到一个分解达到3NF，且具有无损联接和保持函数依赖性。而对于BCNF分解，则可以保证无损联接但不一定能保证保持函数依赖集。 </p><ul><span class="main">  无损联接分解成BCNF模式集的算法：
        </span><li><span class="main">(1)置初值ρ={R};
        </span></li><li><span class="main">(2)如果ρ中所有关系模式都是BCNF，则转(4);
        </span></li><li><span class="main">(3)如果ρ中有一个关系模式S不是BCNF，则S中必能找到一个函数依赖集X→A有X不是S的键，且A不属于X，设S 1 =XA，S 2 =S-A，用分解S 1 ,S 2 代替S，转(2)；
        </span></li><li class="main">(4)分解结束。输出ρ。 </li></ul><p class="main">　　在这个过程中， <em>重点在于(3)步 </em>，判断哪个关系不是BCNF，并找到X和A。这里，S的判断用BCNF的定义，而X不是S的键则依靠分析。 </p><p class="main">6、 <strong>分解成3NF模式集( </strong>识记 <strong>) </strong></p><ul><span class="main">  算法：
        </span><li><span class="main">(1)如果R中的某些属性在F的所有依赖的左边和右边都不出现，那么这些属性可以从R中分出去，单独构成一个关系模式。
        </span></li><li><span class="main">(2)如果F中有一个依赖X→A有XA→R，则ρ={R}，转(4)
        </span></li><li><span class="main">(3)对于F中每一个X→A，构成一个关系模式XA，如果F有有X→A 1 ，X→A 2 ...X→A n ,则可以用模式XA 1 A 2 ...A n 代替n个模式XA 1 ,XA 2 ...XA n ;
        </span></li><li class="main">(4)w分解结束，输入ρ。 </li></ul><p class="main">　　这个过程的 <em>重点是这一句 </em>“对于F中每一个X→A，构成一个关系模式XA”，这使我们的分解十分容易，然后依据合并律(合并律：如果X→Y和X→Z成立，那么X→YZ成立)将有关模式合并即得到所需3NF模式。 </p><p class="main">7、 <strong>模式设计方法的原则( </strong>识记 <strong>) </strong></p><p class="main">　　关系模式R相对于函数依赖集F分解成数据库模式ρ={R 1 ,R 2 ...R k }，一般具有下面 四项特性 ： </p><ul><li><span class="main">ρ中每个关系模式R i 上应具有某种 范式性质 (3NF或BCNF)
        </span></li><li><span class="main">无损联接 性。
        </span></li><li><span class="main">保持函数依赖 集。
        </span></li><li class="main">最小性 ，即ρ中模式个数应最少且模式中属性总数应最少。 </li></ul><p class="main">一个好的模式设计方法应符合下列三条原则： </p><ul><li><span class="main">表达性
        </span></li><li><span class="main">分离性
        </span></li><li class="main">最小冗余性 </li></ul><p class="main">8、多值依赖。简单了解一下。</p><br /><p class="样式2" align="center"><b>第五章 数据库设计</b></p><p></p><p class="main">　　与上一章不同，本章的实用性较强，详细讲述了数据库应用系统设计的全过程。 重点 是概念设计中 ER模型的设计方法， 逻辑设计中 ER模型向关系模型的转换方法 。 </p><p class="main"><strong>一、数据库设计概述( </strong>识记 <strong>) </strong></p><p class="main">1、 软件生存期 ：是指从软件的规划、研制、实现、投入运行后的维护、直到它被新的软件所取代而停止使用的整个期间。它包括六个阶段：( 规需设编试运维 ) </p><ul><li><span class="main">(1)规划阶段
        </span></li><li><span class="main">(2)需求分析阶段
        </span></li><li><span class="main">(3)设计阶段
        </span></li><li><span class="main">(4)程序编制阶段
        </span></li><li><span class="main">(5)调试阶段
        </span></li><li class="main">(6)运行维护阶段 </li></ul><p class="main">2、数据库系统生存期 </p><p class="main">　　数据库应用系统的开发也是一项软件工程，称为数据库工程，数据库应用系统也有生存期的概念，通常包括七个阶段： </p><ul><li><span class="main">(1)规划阶段
        </span></li><li><span class="main">(2)需求分析阶段
        </span></li><li><span class="main">(3)概念设计阶段
        </span></li><li><span class="main">(4)逻辑设计阶段
        </span></li><li><span class="main">(5)物理设计阶段
        </span></li><li><span class="main">(6)实现阶段
        </span></li><li class="main">(7)运行维护阶段 </li></ul><p class="main">3、数据库设计方法学 </p><p class="main">　　一个好的数据库设计方法应该能在合理的期限内，以合理的工作量产生一个有实用价值的数据库结构。 </p><p class="main">　　数据库及其应用系统的设计分为以下几个阶段：规划、需求分析、概念设计、逻辑设计、物理设计。 </p><p class="main"><strong>二、规划( </strong>识记 <strong>) </strong></p><p class="main">　　数据设计中的规划阶段的主要任务是进行建立数据库的必要性及可性性分析，确定数据库系统在组织中和组织中和信息系统中的地位，以及各个数据库之间的联系。 </p><p class="main"><strong>三、需求分析( </strong>识记 <strong>) </strong></p><p class="main">　　需求分析阶段应对系统的整个应用情况作全面的、详细的调查、确定用户的目标，收集支持系统总的设计目标的基础数据和对这些数据的要求，确定用户需求，并把这些要求写成用户和数据库设计者都能够接受的文档。 </p><p class="main">　　确定用户需求可以通过对不同层次的企业管理人员进行个人访问得到。还应了解系统将来要发生的变化，充分考虑系统的可能的扩充和变动，使系统设计更符合未来发展方向。 </p><p class="main">　　需求分析的步骤大致分为三步：即 需求信息的收集、分析整理和评审。 </p><p class="main">　　数据字典：是对系统中数据的详尽描述，它提供对数据库数据描述的集中管理。它包含以下几个部分：数据项、数据结构、数据流、数据存储和加工过程。 </p><p class="main"><strong>四、概念设计( </strong>识记 <strong>) </strong></p><p class="main">1、 概念模型 ：可以看成是现实世界到机器世界的一个过渡的中间层次。在设计数据库系统时，要把现实世界的事物通过认识和抽象转换为信息世界的概念模型，再把概念模型转换为机器世界的数据模型。 </p><p class="main">2、 概念设计的主要步骤 ：分三步完成：(1)进行 数据抽象 ，设计局部概念模式；(2)将局部概念模式 综合 成全局概念模式；(3) 评审 。 </p><p class="main">3、 数据抽象 ：数据抽象的两种形式：聚集和概括： </p><p class="main">　　聚集 ：其数学意义就是笛卡尔积的概念，通过聚集，形成对象之间的一个联系对象。如有一些对象:"老师，课程,班级,上课时间"，通过聚集可以得到一个联系对象"课程表"。聚集表示的是"is_part_of"的关系。 </p><p class="main">　　概括 ：是从一类其他对象形成一个对象。如有桃树、李树、杏树等对象，我们通过概括或以得到一个对象"树"。概括表示的是"is_a"的关系，如“李树”是一种“树”。 </p><p class="main">4、基本ER模型的扩展( 领会 ) </p><p class="main">　　ER(实体联系)模型 是对现实世界的一种抽象，它的主要成份是 实体 、 联系 和 属性 。但是在现实世界中还有一些特殊的语义。需要扩展ER模型的概念才能更好地模拟现实世界。 </p><p class="main">　
　依赖联系
：在现实世界中，有些实体对一另一些实体有很强的依赖关系，即一个实体的存在必须以另一实体的存在为前提。前者就称为"弱实体"，如在人事管理系统中，职
工子女的信息就是以职工的存在为前提的，子女实体是弱实体，子女与职工的联系是一种依赖联系。在ER图中用双线框表示弱实体。用箭头表示依赖联系。 </p><p class="main">　　子类 ：在现实中，存在某个实体类型中所有实体同时也是另一实体类型中的实体，此时，我们称前一实体类型为者的子类，后一实体类型称为超类。子类有一个很重要的性质继承性。在ER图中，超类用两端双线框表示，并用加圈的线与子类相连。 </p><p class="main">5、ER模型的操作( 领会 ) </p><p class="main">　　ER模型在数据库概念设计过程中经常需要进行变换，包括实体类型、联系类型和属性的分裂、合并和增删等。 </p><p class="main">　　实体类型的分裂包括 垂直分割 、水平分割 。 </p><p class="main">　　注意：在垂直分割时，键必须在分裂后的每个实体类型中出现。在联系类型合并时，所合并的联系类型必须是定义在相同的实体类型中。 </p><p class="main">6、 采用ER方法的数据库概念设计( 领会 ) </p><p class="main">采用ER方法进行数据库概念设计分成三步进行： </p><ul><li><span class="main">首先设计局部ER模式
        </span></li><li><span class="main">然后把各局部ER模式综合成全局ER模式
        </span></li><li class="main">最后对全局ER模式进行优化 </li></ul><p class="main"><strong>五、逻辑设计 </strong></p><p class="main">1、概念设计的结果是得到一个与DBMS无关的概念模式。而 逻辑设计 的目的是把概念设计阶段设计好的基本 ER图转换 为与选用的具体机器上的DBMS所支持的数据模式相符合的 逻辑结构 (包括数据库模式和外模式)。 </p><br /><p class="样式2" align="center"><b>第六章 数据库保护</b></p><p></p><p class="main"> 　　本章不是重点章节，主要内容包括数据库保护的四种措施，数据库的恢复、并发控制、完整性和安全性。了解这些内容及其在SQL语言中的实现方式。 </p><p class="main"><strong>一、数据库的恢复( </strong>领会 <strong>) </strong></p><p class="main">1、 事务的概念 ： 事务是一个操作序列 。这些操作要么什么都做，要么都不做，是一个 不可分割 的工作单位。事务以BEGIN TRANSACTION语句开始，以COMMIT(提交)语句或ROLLBACK(回退或撤消)语句结束。 </p><p class="main">一个程序的执行可通过若干事务的执行序列来完成。 </p><p class="main">2、 事务的性质 ： 原子性 (atomicity)、 一致性 (consistency)、 隔离性 (isolation)和 持久性 (durability)。称为事务的ACID性质。 </p><p class="main"><em>通过教材的例子来理解事务的性质 </em>。 </p><p class="main">3、故障类型和恢复方法 </p><p align="center"><img src="http://51zk.csai.cn/sjkyl/images/NO00046_001.GIF" height="93" width="528" /></p><p class="main">4、恢复的基本原则和实现方法 </p><p class="main">　　恢复的基本原则 很简单，就是“ 冗余 ”，即数据的重复存储 。 </p><ul><span class="main">  实现方法有：
        </span><li><span class="main">(1)定期对数据库进行 复制 或转储(dump)。注意几个概念：静态转储、动态转储、海量转储和增量转储。
        </span></li><li><span class="main">(2)建立“ 日志 ”文件。
        </span></li><li class="main">(3) 恢复 。发生故障时有两种处理方法，如数据库已破坏，则由DBA装入最近备份的数据库然后利用"日志文件"执行REDO(重做)操作。如数据库未被损坏，但某些数据不可靠，则系统会自动执行UNDO操作恢复数据。 </li></ul><p class="main">5、 运行记录优先原则 (即 先记录，再更新，先记完，再结束 ) </p><ul><li><span class="main">(1)至少要等相应的运行记录已经写入“日志”文件后，才能允许事务往数据库在写数据。
        </span></li><li class="main">(2)直到事务的所有运行记录都已写入运行“日志”文件后，才能允许事务完成“END TRANSACTION”处理。 </li></ul><p class="main">6、SQL中的恢复操作,可上机观察。 </p><p class="main"><strong>二、数据库的并发控制( </strong>领会 <strong>) </strong></p><p class="main">1、并发控制带来的三类问题： </p><ul><li><span class="main">(1)丢失更新的问题
        </span></li><li><span class="main">(2)不一致分析问题
        </span></li><li class="main">(3)“脏数据”的读出。(在数据库技术中，未提交的随后又被撤消的数据为“脏数据”。) </li></ul><p class="main">2、为解决并发控制带来的问题，通常要采用 封锁 (locking)技术，常用的封锁有：排它型封锁( X封锁) 和共享型封锁( S封锁 )两种。 </p><p class="main">　　X封锁的规则称为 PX协议 ，其内容为：任何企图更新记录R的事务必须先执行LOCK X(R)操作，以获得对该记录进行寻址的能力，并对它取得X封锁。如果未获得X封锁，那么这个事务进入等待状态，一直到获准X封锁，事务继续进行。 </p><p class="main">　　简记为： 先锁X，再执行，取不到，就等待。 </p><p class="main">　　PXC协议 ：它由PX协议及一条规则"X封锁必须保留到 事务终点 (COMMIT或ROLLBACK)"组成。 </p><p class="main">　
　S封锁的规则称为 PS协议 ：其内容为：任何要更新记录R的事务必须先执行LOCK
S(R)操作，以获得对该记录寻址的能力并对它取得S封锁。如果未获准S封锁，那么这个事务进入等待状态，一直到获准S封锁，事务才继续进行下去。当事务
获准对记录R的要封锁后，在记录R修改前必须把S封锁升级为X封锁。 </p><p class="main">　　简记为： 先锁S，再执行，锁不到，就等待，若要修改则升X 。 </p><p class="main">　　PSC协议：由PS协议和“将S封锁保持到事务终点”组成。 </p><p class="main">3、 活锁 ：是指某个事务永远处于等待状态，得不到执行的现象。避免活锁的方法是采用“先来先服务”策略。 </p><p class="main">　　死锁 ：有两个或以上的事务处于等待状态，每个事务都在等待另一个事务解除封锁，它才能继续执行下去，结果任何一个事务都无法执行，这种现象就是死锁。 </p><p class="main">　　解除死锁的方法是由DBMS中的“死锁测试程序”来检查，如发现死锁则牺牲一个事务，并做回退操作,解除它的所有封锁。 </p><p class="main">4、 两段封锁法 ( 识记 ) </p><p class="main">　　两段封锁协议规定所有事务都要遵守下列规则：(1)在对任何数据进行读写操作之前，事务首先要获得对该数据的封锁；(2)在释放一个封锁之后，事务不再获得任何其他封锁。 </p><p class="main">　　针对课本的例子来理解。 </p><p class="main"><strong>三、数据库的完整性( </strong>领会 <strong>) </strong></p><p class="main">1、数据库的 完整性 是指数据的 正确性和相容性 。数据库中数据发生错误，往往是由非法更新引起的。 </p><p class="main">数据库完整性是通过DBMS的 完整性子系统 实现的，它有两个功能： </p><ul><li><span class="main">(1)监督事务的执行，并测试是否违反完整性规则。
        </span></li><li class="main">(2)如有违反，则采取恰当的操作，如拒绝、报告违反情况，改正错误等方法进行处理。 <br /></li></ul><p class="main">　　数据库完整性子系统 是根据“ 完整性规则集 ” 工作的，这些完整性规则包括： 域 完整性规则、 域联系 的规则、 关系完整性 规则(一个比一个大) </p><p class="main">2、SQL中的完整性约束 </p><p class="main">　　在SQL中，表达完整性约束的规则有 主键约束 、 外键约束 、 属性值约束 和 全局约束等 多种形式。 </p><ul><li><span class="main">主键约束：可用主键子句或主键短语 PRIMARY KEY 来定义。
        </span></li><li><span class="main">外键约束：可用外键子句来定义如 FOREIGN KEY (S#) REFERNCE S(S#)
        </span></li><li><span class="main">属性值约束：包括非空值约束( NOT NULL )和基于属性的检查子句( CHECK ) 及域约束子句 如 CREAT DOMAIN AGE SMALLINT CHECK (&amp;#118alue&gt;10) </span></li><li class="main">全局约束：包括基于元组的检查子句( CHECK )和断言( CREATE ASSERTION 断言名 CHECK 条件)。 </li></ul><p class="main"><strong>四、数据库的安全性( </strong>识记 <strong>) </strong></p><p class="main">数据库的安全性是指保护数据库防止不合法的使用，以免数据的泄漏、非法更改和破坏。 </p><p class="main">1、安全性级别：包括 环境级 、 职员级 、 OS级 、 网络级 和 数据库系统级 。 </p><p class="main">2、用户或应用程序 使用数据库的方式称为权限 ，权限的种类： </p><ul><li><span class="main">访问数据权限： 读、插入、修改、删除 四种
        </span></li><li class="main">修改数据库模式权限： 索引 (创建或删除索引)、 资源 (创建新关系)、 修改 (增删关系结构属性)和 撤消权限 (撤消关系) </li></ul><p class="main">3、权限的转授与回收：画一个 权限图 ，只要根结点到用户结点之间存在一条 路径 ，那么它就有权限，回收时就是删去某些路径。 </p><p class="main">4、SQL中的安全性控制 </p><p class="main">　　SQL中有两个安全机制：一是 视图机制 、二是 授权子系统 。 </p><p class="main">　　视图是从一个或几个 基本表 导出的表，是 虚表 ，视图定义后可以像基本表一样用于查询和删除，但其 更新操作(增、删、改) 会受到限制。 </p><p class="main">　　视图机制 把用户可以使用的数据定义在视图中，这样用户就不能使用视图定义外的其他数据，从而保证了数据库的安全性。视图机制使系统具有 三个优点 ： 数据安全性 、 数据独立性 和 操作简便性 。 </p><p class="main">　　授权机制 可以保证用户只能进行其权限范围内的操作。 </p><p class="main">6、数据加密可更好地保证数据库中数据的安全性，采用加密算法给把源文变为密文来实现。常用的加密算法有“ 替换方法 ”和 明键加密法 。 </p><p class="main">　　同时，为保证数据库的安全，也应注意自然环境的安全性。 </p><br /><img src ="http://www.cppblog.com/urgentmind/aggbug/7721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2006-05-27 10:22 <a href="http://www.cppblog.com/urgentmind/articles/7721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>国外大学部分现用教材及教学参考书</title><link>http://www.cppblog.com/urgentmind/articles/1903.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Tue, 20 Dec 2005 07:49:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/1903.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/1903.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/1903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/1903.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/1903.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 国 外 大 学 部 分 现 用 教 材 及 教 学 参 考 书04.03.20.&nbsp;索书号书名 / 作者 / 版次出版社/出版年现用院校及适用对象O413.1 FC25 2002Problems &amp; solutions in nonrelativistic quantum mechanics/非相对论量子力...&nbsp;&nbsp;<a href='http://www.cppblog.com/urgentmind/articles/1903.html'>阅读全文</a><img src ="http://www.cppblog.com/urgentmind/aggbug/1903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2005-12-20 15:49 <a href="http://www.cppblog.com/urgentmind/articles/1903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>递归模型与递归算法的设计</title><link>http://www.cppblog.com/urgentmind/articles/1381.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Mon, 28 Nov 2005 16:28:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/1381.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/1381.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/1381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/1381.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/1381.html</trackback:ping><description><![CDATA[<P><STRONG>递归模型<BR><BR></STRONG>一般由<STRONG>递归出口</STRONG>和<STRONG>递归体</STRONG>两部分组成，前者确定递归到何时为止，后者确定递归的方式。<BR><BR><STRONG>递归出口</STRONG>的一般格式为：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f(s<SUB>0</SUB>)=m<SUB>0</SUB><BR>这里s<SUB>0</SUB>与m<SUB>0</SUB>均为常量，有些递归问题可能有多个递归出口。<BR><BR><STRONG>递归体</STRONG>一般格式为：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f(s)=g(f(s<SUB>1</SUB>),f(s<SUB>2</SUB>),……,f(s<SUB>n</SUB>),c<SUB>1</SUB>,c<SUB>2</SUB>,……,c<SUB>m</SUB>)<BR>这是S是一个递归大问题，s<SUB>1</SUB>,s<SUB>2</SUB>,……,s<SUB>n</SUB>为递归小问题，c<SUB>1</SUB>,c<SUB>2</SUB>,……,c<SUB>m</SUB>是若干个可以直接解决的问题。g为递归函数，反映了递归问题的结构。<BR><BR>递归设计的步骤：<BR>1.&nbsp;&nbsp;&nbsp;对原问题f(s)进行分析，假设出合理的较小问题f(s')。<BR>2.&nbsp;&nbsp;&nbsp;假设f(s')是可解的，并在此基础上确定f(s)的解，即给出f(s)与f(s')之间的关系。<BR>3.&nbsp;&nbsp;&nbsp;确定一个特定情况（如f(1)或f(0)）的解，作为递归出口。</P><img src ="http://www.cppblog.com/urgentmind/aggbug/1381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2005-11-29 00:28 <a href="http://www.cppblog.com/urgentmind/articles/1381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>排列问题</title><link>http://www.cppblog.com/urgentmind/articles/1380.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Mon, 28 Nov 2005 16:08:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/1380.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/1380.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/1380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/1380.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/1380.html</trackback:ping><description><![CDATA[<P><FONT face=宋体>排列问题最初出现在计数中，今日学习《离散数学结构》，发现定义竟源于此科。</FONT><SPAN lang=EN-US><BR><BR></SPAN><STRONG><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体">由<SPAN lang=EN-US>A</SPAN>到<SPAN lang=EN-US>A</SPAN>的一个双射称为<SPAN lang=EN-US>A</SPAN>的一个排列（<SPAN lang=EN-US>permutation</SPAN>）。</SPAN></STRONG><B><SPAN lang=EN-US><BR></SPAN></B><FONT face=宋体>如果<SPAN lang=EN-US>A={a<SUB>1</SUB>,a<SUB>2</SUB>,……,a<SUB>n</SUB>}</SPAN>是有限集，<SPAN lang=EN-US>p</SPAN>是<SPAN lang=EN-US>A</SPAN>上的双射，可以用另一种方式表示这个双射，把<SPAN lang=EN-US>A</SPAN>的<SPAN lang=EN-US>n</SPAN>个元素<SPAN lang=EN-US>a<SUB>1</SUB>,a<SUB>2</SUB>,……,a<SUB>n</SUB></SPAN>和对应的<SPAN lang=EN-US>n</SPAN>个函数值<SPAN lang=EN-US>p(a<SUB>1</SUB>),p(a<SUB>2</SUB>),……,p(a<SUB>n</SUB>)</SPAN>排成两行，如下所示。<BR><IMG height=57 alt=equation.bmp src="http://www.cppblog.com/images/cppblog_com/urgentmind/equation.bmp" width=287 border=0><BR>A中元素的n个函数值<SPAN lang=EN-US>p(a<SUB>1</SUB>),p(a<SUB>2</SUB>),……,p(a<SUB>n</SUB>)的序列，实际是A中元素的重新排列。<BR>（这是一种新的方式表示双射。注意对比关系的有序对表示形式，与函数表示形式。）<BR><BR>（未完，待续）</SPAN></FONT></P><img src ="http://www.cppblog.com/urgentmind/aggbug/1380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2005-11-29 00:08 <a href="http://www.cppblog.com/urgentmind/articles/1380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>