查看完整版本: 關於while的執行
頁: [1]

b2581167 發表於 2016-9-23 02:27 PM

關於while的執行

我知道while的用法
但是最近看一本書一直不了解他是怎麼跑的
我們一般while都是這樣用

while(迴圈條件)
{執行動作}

但我看到那本書它裡面用法是這樣
while(迴圈條件);
他竟然就這樣結束了
這樣這個迴圈不會搞自閉嗎?

他程式是這樣寫
left=0:right=10

void fun::Quicksort(int A[],int left,int right)
{
     int i,j,s,temp;
     if(left<right){
                    s = A[(left + right)/2];
                    i = left -1;
                    j = right +1;             -------***

while(1)
{
   while(A[++i] < s);
   while(A[--j] > s);                -------------***
   if (i >= j)
       break;

      執行動作;
}


我想知道while(A[++i] < s);這句為否還回執行while(A[--j] > s);這句嗎?
他while(A[++i] < s);本身是只跑自己嗎?還是用來他為真跑while(A[--j] > s);的?
還有我標記***的地方,執行第一次的時候j=11到whlie(1)裡
所以while(A[--j] > s)第一次應該會是while(A > s)對吧!!
但是int A;索引直不是0~9嗎? 他這樣程式為什麼不會錯

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

msn965 發表於 2016-9-23 07:44 PM

照理講 應該符合條件就會往下執行
a[10]這個問題 應該主程式在call  quick sort(A,left,right-1) function 的時候
應該會長這樣吧 不然滿不合理。找找主程式看看

kilean 發表於 2016-9-26 11:38 PM

本帖最後由 kilean 於 2016-9-26 11:47 PM 編輯

基本上是沒什麼太大的問題,是你觀念的問題。
條件不符合自然會離開回圈,只是缺乏力外處理。
雖然是sort當然要有sort的動作,這你沒看到,
或許是因為你斷章取義。

那就針對你的問題回答,
你所疑惑的while迴圈是否會執行,
答案是會的,

從sort的使用來講,
這個函式不是只有傳入left 及 right
還有一維陣列,由傳入值left=0及right=10判斷,
應該要傳入一維陣列,內容需要有11個整數。

假設是


int A[]={5,14,1,3,2,9,11,8,7,6,10};



第一個判斷當然是會先判斷傳入的參數是否正確
符合下列程式碼運作所需,
由left<right判斷,設計者索引值小的在左邊,
大的在右邊,與宣告的習慣同方向,
初步例外處理掉如果填入相同所引值或者將left比right大導致下列程式發生錯誤的問題。

s=A[(0+10)/2]
s=A
s=9

s的值主要用來判斷用

i與j都是定義初始的索引值
為何是-1 與 11呢?
因為設計者習慣用++i --j,與i++ j-- 不同,
依照你問的問題深度來講,
我必須回答你前者是先做運算,在判斷,後者是先判斷在運算。所以i與j的初始值不是定義0 與 10

while(A[++i] < 9);
i=-1,因此做完++運算後判斷 while(A < 9);
而A = 5
5小於9 條件為True,因此會繼續做
i=0,因此做完++運算後判斷 while(A < 9);
而A = 14
14不小於9條件為False,離開回圈

因此這個while迴圈是由左往右搜尋
但沒有例外處理,搜尋有可能超出範圍

至於while(A[--j] > s);
與上面同理,從右往左搜尋
也是沒有例外處理,搜尋有可能超出範圍


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

cockroachrun 發表於 2016-9-29 11:54 AM

其實. C 對於if() while() 在() 中的東西因該叫做運算式, 不該叫作 迴圈條件
運算式的結果非0 為 true , 0 為false
至於什麼是運算式. 最簡單的說法. 就是 你寫的程式中的任何 記算式 都是運算式 當然也包含
a >=b
a == b
a <= b  ... 這些比較運算式

CoNsTaRwU 發表於 2016-9-30 06:48 AM

本帖最後由 CoNsTaRwU 於 2016-9-30 06:59 AM 編輯

cockroachrun 發表於 2016-9-29 11:54 AM
其實. C 對於if() while() 在() 中的東西因該叫做運算式, 不該叫作 迴圈條件
運算式的結果非0 為 true , 0  ...
這位正解
 
補充一下,expression 的中文會翻成「表達式」
if ( expr )
  stmt
 
在小括號中的任何表達式 expr 都會先被轉型為 int,轉型後不為 0 則執行任何敘述 stmt
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

coal511464 發表於 2016-9-30 12:40 PM

你那行問的while 就是一直執行 條件不合時跳出

hoare 發表於 2016-10-1 11:09 PM

先看維基百科對quick sort的介紹
1. 從數列中挑出一個元素,稱為"基準"(pivot),
2. 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割結束之後,該基準就處於數列的中間位置。這個稱為分割(partition)操作。
3. 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序


再對照你的程式碼,其中s就是pivot,while(A[++i] < s);是要找出右半邊比s小的值,下一個while就是找出左半邊比s大的值,找到之後把他們交換就會符合上面所說的第二點。你書中的這種寫法其實不是很好,有點炫技的感覺。
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁: [1]