PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 疑難雜症區
帳戶
密碼
 

回應
 
主題工具
hyffdmy
Regular Member
 

加入日期: Nov 2003
文章: 84
程式問題(含程式碼以及圖片)

程式碼如下
=========================================================
#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
為什麼呢??
請會的人告訴我
拜託 很急
一直想不出來
謝謝大家
     
      
舊 2005-10-29, 09:13 PM #1
回應時引用此文章
hyffdmy離線中  
hyffdmy
Regular Member
 

加入日期: Nov 2003
文章: 84
推到上面去
 
舊 2005-10-30, 10:47 AM #2
回應時引用此文章
hyffdmy離線中  
瘋狂火星人
Elite Member
 
瘋狂火星人的大頭照
 

加入日期: Jul 2004
您的住址: 無止盡的文件地獄~~
文章: 4,714
引用:
作者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判斷去遞迴呼叫他自己....
當你對程式流程有疑問的時候,自己用中斷去追蹤是最快的做法.....
__________________

歡迎光臨瘋狂火星基地~~
自然進氣可變汽門單缸雙活塞人肉避震
舊 2005-10-30, 11:59 AM #3
回應時引用此文章
瘋狂火星人離線中  
hyffdmy
Regular Member
 

加入日期: Nov 2003
文章: 84
謝謝了
已經用中斷點去跑程式 也看到結果 大概知道怎麼分析
但還有一個問題 因為沒人交過觀念
所以我再問一下好了
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:26 PM #4
回應時引用此文章
hyffdmy離線中  
瘋狂火星人
Elite Member
 
瘋狂火星人的大頭照
 

加入日期: Jul 2004
您的住址: 無止盡的文件地獄~~
文章: 4,714
引用:
作者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迴圈呼叫的參數比對一下,就知道差在哪邊了.....
__________________

歡迎光臨瘋狂火星基地~~
自然進氣可變汽門單缸雙活塞人肉避震
舊 2005-10-30, 05:48 PM #5
回應時引用此文章
瘋狂火星人離線中  
hyffdmy
Regular Member
 

加入日期: Nov 2003
文章: 84
妳的意思我懂了
那程式的流程是否為
一開始假設g1<g2 , 執行完第一次的wwww(c,d) g1=g2
從......開始-->然後(1)符合判斷式-->......-->(1)不符合-->(2)不符合-->(3)-->再回到(2)不符合-->(3)
舊 2005-10-30, 06:47 PM #6
回應時引用此文章
hyffdmy離線中  
瘋狂火星人
Elite Member
 
瘋狂火星人的大頭照
 

加入日期: Jul 2004
您的住址: 無止盡的文件地獄~~
文章: 4,714
引用:
作者hyffdmy
妳的意思我懂了
那程式的流程是否為
一開始假設g1<g2 , 執行完第一次的wwww(c,d) g1=g2
從......開始-->然後(1)符合判斷式-->......-->(1)不符合-->(2)不符合-->(3)-->再回到(2)不符合-->(3)


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

歡迎光臨瘋狂火星基地~~
自然進氣可變汽門單缸雙活塞人肉避震
舊 2005-10-30, 09:13 PM #7
回應時引用此文章
瘋狂火星人離線中  


回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是01:53 PM.


vBulletin Version 3.0.1
powered_by_vbulletin 2026。