PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   程式問題(含程式碼以及圖片) (https://www.pcdvd.com.tw/showthread.php?t=554024)

hyffdmy 2005-10-29 09:13 PM

程式問題(含程式碼以及圖片)
 
程式碼如下
=========================================================
#include <iostream.h>

void wwww(int *a,int f,int t) {
int i=f; int j=t; int mid=(f+t)/2; int key=a[mid]; int c=0;
cout << "f=" << f << " " << "t=" << t << " ";
cout << "\n";
do{
while(a[i] < key) i++; while(a[j] > key) j--;
if(i <= j) {
int temp=a[i]; a[i]=a[j]; a[j]=temp;
i++; j--;
}
for(c=0;c<=5;c++) cout << a[c] << " ";
cout << "i=" << i << " " << "j=" << j << " ";
cout << "\n";
} while(i <= j);
if(f < j) wwww(a,f,j);
if(i < t) wwww(a,i,t);
}

void main()
{
int a[6],i;

for(i=0;i<=5;i++) cin >> a[i]; wwww(a,0,5);
for(i=0;i<=5;i++) cout << a[i] << " ";
cout << "\n";
}
============================================================

為什麼結果的第14行i=1 ; j=-1
在if的判斷不是就false了
為什麼還會有第15行的f=2 ; t=4
為什麼呢??
請會的人告訴我
拜託 很急
一直想不出來
謝謝大家

hyffdmy 2005-10-30 10:47 AM

推到上面去

瘋狂火星人 2005-10-30 11:59 AM

引用:
作者hyffdmy
程式碼如下
=========================================================
#include <iostream.h>

void wwww(int *a,int f,int t) {
int i=f; int j=t; int mid=(f+t)/2; int key=a[mid]; int c=0;
cout << "f=" << f << " " << "t=" << t << " ";
cout << "\n";
do{
while(a[i] < key) i++; while(a[j] > key) j--;
if(i <= j) {
int temp=a[i]; a[i]=a[j]; a[j]=temp;
i++; j--;
}
for(c=0;c<=5;c++) cout << a[c] << " ";
cout << "i=" << i << " " << "j=" << j << " ";
cout << "\n";
} while(i <= j);
if(f <...


你說的if是哪邊的???
這個wwww裡面最後還有兩個if判斷去遞迴呼叫他自己....
當你對程式流程有疑問的時候,自己用中斷去追蹤是最快的做法.....

hyffdmy 2005-10-30 05:26 PM

謝謝了
已經用中斷點去跑程式 也看到結果 大概知道怎麼分析
但還有一個問題 因為沒人交過觀念
所以我再問一下好了
void wwww(a,b)
{
............
............
if (g1<g2) wwww(c,d);.........(1)
if (g1>g2) wwww(x,y);.........(2)
}...........................................(3)
當第一次執行到第(1)這一行時,又會在call一次wwww(a,b);
那麼當程式執行完畢(3)(兩個if判斷是都沒有成立時,),程式是不是又會回到(2)這一行再判斷一次呢???
然後又執行到(3)完畢。

瘋狂火星人 2005-10-30 05:48 PM

引用:
作者hyffdmy
謝謝了
已經用中斷點去跑程式 也看到結果 大概知道怎麼分析
但還有一個問題 因為沒人交過觀念
所以我再問一下好了
void wwww(a,b)
{
............
............
if (g1<g2) wwww(c,d);.........(1)
if (g1>g2) wwww(x,y);.........(2)
}...........................................(3)
當第一次執行到第(1)這一行時,又會在call一次wwww(a,b);
那麼當程式執行完畢(3)(兩個if判斷是都沒有成立時,),程式是不是又會回到(2)這一行再判斷一次呢???
然後又執行到(3)完畢。


這就是所謂的遞迴......

首先在void main()這邊,for(i=0;i<=5;i++) cin >> a[i]; wwww(a,0,5);
這個FOR迴圈會去把A陣列裡的每個元素依序取出,然後去呼叫wwww,wwww後面括弧的三個參數a、0、5就是傳進wwww的參數,

接下來再wwww副程式裡面.....
} while(i <= j);
if(f < j) wwww(a,f,j);
if(i < t) wwww(a,i,t);
}
當i小於等於j的時候,會去重新呼叫自己,然後傳不一樣的參數進去

把這兩行跟主程式那一行FOR迴圈呼叫的參數比對一下,就知道差在哪邊了.....

hyffdmy 2005-10-30 06:47 PM

妳的意思我懂了
那程式的流程是否為
一開始假設g1<g2 , 執行完第一次的wwww(c,d) g1=g2
從......開始-->然後(1)符合判斷式-->......-->(1)不符合-->(2)不符合-->(3)-->再回到(2)不符合-->(3)

瘋狂火星人 2005-10-30 09:13 PM

引用:
作者hyffdmy
妳的意思我懂了
那程式的流程是否為
一開始假設g1<g2 , 執行完第一次的wwww(c,d) g1=g2
從......開始-->然後(1)符合判斷式-->......-->(1)不符合-->(2)不符合-->(3)-->再回到(2)不符合-->(3)


那個g1、g2的值,是wwww副程式裡面處理過的,依據後面if判斷之後遞迴呼叫所傳進去的值,又會再產生新的g1、g2......


所有的時間均為GMT +8。 現在的時間是02:06 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。