討論區快速選單
知識庫快速選單
討論區最近新進100則主題 傑米的攝影旅遊筆記 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
有甚麼方法可以做到選擇性地進入主程式
更改我的閱讀文章字型大小
作者 : yuyukai(魚仔)
[ 貼文 17 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/6/21 下午 11:03:51
問題如下:

假設有三組基本的字元輸入輸出,分別為A、B與C

當在A輸入0時,會跳至B並進行輸入輸出

當在A輸入1時,會跳至C並進行輸入輸出

---------------------

舉個例子:

當我在A程式輸入"吃飯",會跑出B程式的輸出部分,然後可再次輸入,而且只會出現B程式所設定的字

那當我在A程式輸入"睡覺",則會跑出C程式的輸出部分,然後可再次輸入,而且只會出現C程式所設定的字


請問有甚麼方法可以做到這種概念?

謝謝!
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4473 | 人氣 37262 | 評價 10900 | 評價/貼文 2.44 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/6/22 上午 09:17:15
Regarding program A , B , and C as three different process and communicate each other via ipc
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 386 | 人氣 0 | 評價 1770 | 評價/貼文 4.59 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/6/22 上午 09:19:41
你的問題好難看懂,能不能再具體點說明?
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4473 | 人氣 37262 | 評價 10900 | 評價/貼文 2.44 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/6/22 上午 09:22:19
http://bcbjournal.org/articles/vol2/9807/Message-handling_for_non-visual_components.htm
作者 : yuyukai(魚仔)
[ 貼文 17 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/6/22 上午 10:12:42
具體點說明

A程式部分:
int a =0;
int b =1";
cout<<"選一個數字:"<<endl;

//若輸入0則會跳至B程式,輸入1則會跳至C程式
-----------------

B程式部分:
char c[10];
char d[]="asd";
cout<<"輸入:";
cin>>c;
cout<<"輸出:"<<d;
-----------------

C程式部分:
char x[10];
char y[]="asd";
cout<<"輸入:";
cin>>x;
cout<<"輸出:"<<y;
-----------------

預想的模擬如下:

選一個數字:0  //進入B程式後,就不會再進入C程式
輸入:c
輸出:asd


以上,不知道有沒有表達清楚,謝謝!
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 386 | 人氣 0 | 評價 1770 | 評價/貼文 4.59 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人yuyukai註記此篇回應為很有道理 2016/6/22 下午 12:58:59
不知你說的 A、B、C 是不同的函式還是真的不同的程式,如果是函式的話只要:

void functionC()
{
    char x[10];
    char y[]="asd";
    cout<<"輸入:";
    cin>>x;
    cout<<"輸出:"<<y;
}

void functionB()
{
    char c[10];
    char d[]="asd";
    cout<<"輸入:";
    cin>>c;
    cout<<"輸出:"<<d;
}

void functionA()
{
    int a =0;
    int b =1";
    cout<<"選一個數字:"<<endl;

    int sel;
    cin>>sel;
    switch(sel)
    {
    case 0:
     functionB();
     break;
    case 1:
     functionC();
    }
}
作者 : yuyukai(魚仔)
[ 貼文 17 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/6/22 下午 03:23:47
對,執行起來是我想要的,只是我給的地方有些沒改到而已,所以可能看起來怪怪的,謝謝!

再來又出現了一個新問題

我將functionA()的case值設為0
輸入0後進入functionA(),但這時出現了問題

程式如下

void functionA()
{
     bool condition = true;  //加入迴圈用意是可以一直跑functionA()
     do
     {
     char a[]="Who are you ?";
     char a1[]="aaa";
    
     char input[100];
     cout<<"Q: ";
    
     cin.getline(input,100);
     int dista=ldistance(a,input); //這是演算法,對輸入的字與預設的字做處理
     if(dista<=2)
     {
     delay(2); //這是延遲
     cout<<"A: "<<a1<<endl;
     }
     }while(condition);
}

跑出來的結果如下

Q: Q:

請問這是甚麼原因?
謝謝!

作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4473 | 人氣 37262 | 評價 10900 | 評價/貼文 2.44 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人yuyukai註記此篇回應為很有道理 2016/6/23 下午 07:06:33
maybe your input causes the result. try to input different input and observe its output.
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人yuyukai註記此篇回應為很有道理 2016/6/24 上午 12:03:03
>再來又出現了一個新問題
>
>我將functionA()的case值設為0
>輸入0後進入functionA(),但這時出現了問題
>
>跑出來的結果如下
>
>Q: Q:
>
>請問這是甚麼原因?

你應該貼出完整程式, 不然只能用猜的...
應該是你之前輸入 int 類型的關係, 跟你修改後的 functionA() 沒有關係.
  int sel;
  cin >> sel;
你輸入資料最後一定要按 enter 鍵, 所以輸入的資料最後一定有一個 '\n' 字元. 這個字元會不會被輸入函式讀取決定於輸入類型. 整數類型, 浮點數類型會停在無法轉換的字元為止, 比方說 '\n' 字元. 無法轉換的字元會繼續留在輸入端等待下一個讀取. 你下一個讀取是
  cin.getline(input, 100);
它讀的剛好就是之前遺留下來的 '\n' 字元. 這也就造成了你看到的結果.

所以, 混合字元/非字元輸入要非常小心. 非字元輸入遺留下來的資料會在字元輸入時被讀取.
作者 : yuyukai(魚仔)
[ 貼文 17 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/6/24 上午 01:18:17
完整程式法如下,請指點迷津

#include <iostream.h>
#include <stdio.h>
#include <cstdlib>
#include <string.h>
#include <ctype.h>
#include <vector>

using namespace std;

int ldistance(const string source,const string target)
{
    int n=source.length();
    int m=target.length();
    if (m==0) return n;
    if (n==0) return m;

    typedef vector< vector<int> > Tmatrix;
    Tmatrix matrix(n+1);
    for(int i=0; i<=n; i++) matrix[i].resize(m+1);

    for(int i=1;i<=n;i++) matrix[i][0]=i;
    for(int i=1;i<=m;i++) matrix[0][i]=i;

     for(int i=1;i<=n;i++)
     {
     const char si=source[i-1];
     for(int j=1;j<=m;j++)
     {
     const char dj=target[j-1];
     int cost;
     if(si==dj){
     cost=0;
     }
     else{
     cost=1;
     }
     const int insert=matrix[i-1][j]+1;
     const int remove=matrix[i][j-1]+1;
     const int replace=matrix[i-1][j-1]+cost;
     matrix[i][j]=min(insert,min(remove,replace));
     }
     }
     return matrix[n][m];
}

void functionA()
{
   bool condition = true;
   do
   {
   char b[]="How are you ?";
   char b1[]="good";
   char input[20];
   cout<<"Q:"<<endl;
   cin.getline(input,20);
   int distb=ldistance(b,input);
   if(distb<2)
   {
   cout<<"A: "<<b1<<endl;
   }
   }while(condition);
}
void functionB()
{
     bool condition = true;
     do
     {
     char z[]="Who are you ?";
     char z1[]="AI";
    
     char input[20];
     cout<<"Q:";
     cin.getline(input,20);
    
     cout<<input<<endl;
     int distz=ldistance(z,input);

     if(distz<2)
     {
     cout<<"A: "<<z1<<endl;
     }
     }while(condition);
}
int main()
{
int A=1;
int B=2;
cout<<"Please select :"<<endl;
int sel;
cin>>sel;
switch(sel)
 {
case
1:
functionA();
 break;
case 2:
functionB();
 }
 system("pause");
 return 0;
}
作者 : gmailjoey(建中) 貼文超過200則
[ 貼文 206 | 人氣 0 | 評價 190 | 評價/貼文 0.92 | 送出評價 13 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/6/25 上午 01:25:36
你可能在if敘述裡面的數字打錯了,
把下面這兩個敘述的數字2改成數字20,
可以讓你的程式動起來。

void functionA()
{
...

if(distb<20) // <---把2改成20
   {
   cout<<"A: "<<b1<<endl;
   }
...
}

void functionB()
{
...

if(distz<20) // <---把2改成20
   {
   cout<<"A: "<<z1<<endl;
   }
...
}

接下來你可以修改你的ldistance()敘述,
由於你的char b[]="How are you?"一共有13個字元,
所以你的distb = 13
由於你的char z[]="Who are you?"一共有13個字元,
所以你的distz = 13
因此要讓cout<<"A: "這樣的敘述跑出來,
只要把2改成20就可以了。
不過我還沒看懂你的ldistance()是在計算啥咪啊~~
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人yuyukai註記此篇回應為最佳解答 2016/6/26 上午 12:15:27
你的問題就是之前所講的問題. 在 main() 裡讀了 int 類型的 sel, 所以 input buffer 裡還有個 '\n'. 在 functionA() 或 functionB() 那裡, 第一次 loop 時, cin.getline() 讀的就是之前遺留的 '\n'.

至少有兩個解決的方法, 第一個方法是在讀 sel 後, 加入這行:
  cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

另一個方法是所有的資料全部用字元或字串格式來讀, 然後再轉換成你要的類型:
  std::string sSel;
  std::getline(std::cin, sSel);
  std::stringstream ss(sSel);
  int sel;
  ss >> sel;

std::stringstream 需要標準頭檔 <sstream>.

沒時間看你的邏輯, 單就你的程式表面來看, 你有幾個錯誤及可改進的地方:

- <iostream.h> 不是標準頭檔. 標準頭檔的名字是 <iostream>.

- <stdio.h> 跟 <cstdio> 幾乎是一樣的, 前者是 C 語言的標準頭檔, 後者是 C++ 語言的標準頭檔. 如果你用 C++ 語言, 雖然兩個任一個都可以用, 但一般的習慣是用 <cstdio>, 沒有必要兩個重複使用.

- <string.h> 是 C 語言的標準頭檔, 它裡面主要是 strXXX() 等 C-字串的處理函式. std::string 的頭檔是 <string>. 在 C++ 如果要用 C-字串的處理函式, 應該用 <cstring>.

注意到所有的 C++ 的標準頭檔都沒有 file extension, 移植到 C++ 的 C 頭檔同樣也沒有 extension, 只是在檔名前加個 'c'. 這是 C++ 標準頭檔檔名的命名政策, 而造成這個政策的其中一個原因就是因為字串頭檔的檔名.

- 不要用 using namespace std, 盡量養成用 std:: 的習慣.

- ldistance() 的參數可以改成 const reference:
   int ldistance(const string& source, const string& target)

- functionA() 及 functionB() 裡面的 b, b1, z, 及 z1 可以移到 do-loop 外面定義. 如果你不打算更改它們, 應該定義成指標而不是陣列.
   char *b = "How are you?";
   char *b1 = "good";
   do
   {
     ...
   } while (condition);

- C++ 的字串輸入最好用 std::string + std::getline() 來做, 不須擔心用字元陣列會有溢出或長度不夠的問題.
   std::string input;
   std::getline(std::cin, input);

- 你的 do-while 是個無限迴圈嗎? 因為看不出你的 condition 什麼時候會變 false. 如果 condition 的變化沒有在迴圈外使用, 可以考慮用 for 來做:
   for (bool condition = true; condition; )
   {
     ...
   }

 板主 : 徵求中
 > C++ Builder - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ Builder - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++ Builder
1 windblown 5420 
2 Raynor 3120 
3 阿泰 2980 
4 workman 1650 
5 Linkin 1360 
6 CrazyStar 1260 
7 青衫 1160 
8 jonay 1080 
9 charlie 900 
10 小呆 770 
C++ Builder
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.078125