2013-01-14 75 views
-2

我不能讓我的程序工作,我已經用標記(goto)試過了。 但我無法得到它的工作。我也試圖改進循環,但它以無限循環結束。感謝幫助!C + +循環(三角形抽屜)

#include <iostream> //includes 
using namespace std; 
int makedreieck(int länge) // function for drawing a triangle 
{ 
    int rows=0; //rows 
    int draw=0; //drawed 
    while(draw <= länge) 
    { 
     draw++; 
     cout << "*"; 
     if(draw == länge-1) 
     { 
      rows++; 
      draw = länge-rows; 
      cout << endl; 
     } 
     if(draw == 1) 
     { 
      getchar(); 
      return 0; 
     } 
    } 
} 

int main(char argument) 
{ 
    int dreieck; 
    cin >> dreieck; 
    makedreieck(dreieck); 
    getchar(); 
    return 0; 
} 

終於拿到了所有的工作......如果有人需要的代碼:

#include <iostream> 
#include <time.h> 
#include <windows.h> 
#include <tchar.h> 
using namespace std; 

int createtriangle(int length, bool custom, char symbol) 
{ 
    clock_t start, finish; 
    length++; 
    int OK=0; 
    int OK_ABORT; 
    int TRIANGLE_NOT_ALLOWED; 
    enum returnvalues{OK, OK_ABORT, TRIANGLE_NOT_ALLOWED}; 
    if(length<=0) 
    { 
     cerr << "Dreieck mit einer Laenge von " << length-1 <<" unerlaubt."; 
     return TRIANGLE_NOT_ALLOWED; 
    } 
    if(length>81) 
    { 
     cout << "Es wurde eine ueber 80 Sternchen lange Treppe entdeckt." << endl << "Es wird empfohlen die Operation abzubrechen"<< endl << "1: abbrechen 2: weiter"<<endl<<"Auswahl: "; 
     int sel; 
     cin >> sel; 
     getchar(); 
     if(sel>2) 
     { 
      cout << "Es gibt die Auswahl: "<<sel<<" nicht."; 
     } 
     system("cls"); 
     switch(sel) 
     { 
     case 1: 
      return OK_ABORT; 
      break; 
     case 2: 
      break; 
     } 
    } 
    int rows=0; 
    int draw=0; 
    start = clock(); 
    while(draw <= length) 
    { 
     draw++; 
     if(rows>=1&&custom==false) 
     { 
     cout << "*"; 
     } 
     if(rows>=1&&custom==true) 
     { 
      cout << symbol; 
     } 

    if(draw == length) 
    { 
     if(rows>=1) 
     { 
     cout << endl; 
     } 
     rows++; 
     draw = length-rows; 
    } 
    if(rows == length) 
    { 
     finish=clock(); 
     if(custom==false) 
     { 
     cout << "Es wurde eine "<<length-1<<" Sternchen lange Treppe gebaut."<<endl; 
     } 
     else if(custom==true) 
     { 
      cout << "Es wurde eine "<<length-1<<" "<<symbol<<" lange Treppe gebaut."<<endl; 
     } 
     cout << "Es wurden "<< static_cast<double>(finish - start) /CLOCKS_PER_SEC<< " Sekunden gebraucht."; 
     return OK; 
    } 
    } 
    return OK; 
} 
int main() 
{ 
START: 
    system("cls"); 
    int dreieck; 
    char time[9]; 
    cout << "Wie gross soll die Treppe sein?: "; 
    cin >> dreieck; 
    system("cls"); 
    cout << "Soll ein custom symbol verwendet werden?"<<endl<<"Ja:1 Nein:2"<<endl<<"Auswahl: "; 
    int menu2; 
    cin >> menu2; 
    system("cls"); 
    bool customtrue; 
    char symbolcustom; 
    if(menu2>2) 
    { 
     cout << "Die Auswahl: " << menu2 << " ist nicht verfügbar"; 
     getchar(); 
     goto START; 
    } 
    switch(menu2) 
    { 
    case 1: 
     customtrue = true; 
     cout << "Symbol angeben(1Char max): "; 
     cin >> symbolcustom; 
     break; 
    case 2: 
     customtrue = false; 
     break; 
    } 
    system("cls"); 
    createtriangle(dreieck,customtrue,symbolcustom); 
    getchar(); 
    getchar(); 
    menumark: 
    system("cls"); 
    cout << "Soll erneut eine Treppe gebaut werden?"<<endl<<"1: Ja 2: Nein"<<endl<<"Auswahl: "; 
    int menu; 
    cin >> menu; 
    if(menu>2) 
    { 
     cout <<"Es gibt keine "<<menu<<" Auswahl."; 
     getchar(); 
      goto menumark; 
    } 
    switch(menu) 
    { 
    case 1: 
     goto START; 
     break; 
    case 2: 
     exit(0); 
     break; 
    } 
    return 0; 
} 
+2

什麼都行不通。你調試了嗎? –

+2

這裏沒有多少東西 - 你期望輸出什麼,你會得到什麼輸出? –

+0

在'makedreieck'中有一個'return 0;';你最後沒有一個。該函數應該返回'void',因爲您忽略了它的返回值,但是您應該_not_忽略關於不返回值的函數的編譯器警告。在發佈代碼之前,應該修復編譯器警告。 (如果你的編譯器沒有警告,找出如何打開警告;如果你的編譯器不能發出警告,請更好地編譯。)這與你的問題無關。 'makedreieck()'中的'getchar()'可能是什麼?這似乎沒有必要。 –

回答

0

在第一次迭代設置draw爲1,所以(draw == 1)是真實的,函數返回。

嘗試遞減länge代替drawdraw == länge-1,在該點處復位draw爲0,並且在循環結束時länge == 1退出。適應口味。

2

使用你的源代碼&hellip;

#include <iostream> //includes 
using namespace std; 
int makedreieck(int länge) // function for drawing a triangle 
{ 
    int rows=0; //rows 
    int draw=0; //drawed 
    while(draw <= länge) 
    { 
     draw++; 
     cout << "*"; 
     if(draw == länge-1) 
     { 
      rows++; 
      draw = länge-rows; 
      cout << endl; 
     } 
     if(draw == 1) 
     { 
      getchar(); 
      return 0; 
     } 
    } 
} 

int main(char argument) 
{ 
    int dreieck; 
    cin >> dreieck; 
    makedreieck(dreieck); 
    getchar(); 
    return 0; 
} 

g ++頭幾個編譯錯誤,&hellip;

 
[d:\dev\test] 
>gnuc foo.cpp 
foo.cpp:3:1: error: stray '\344' in program 
foo.cpp:7:5: error: stray '\344' in program 
foo.cpp:11:9: error: stray '\344' in program 
foo.cpp:14:13: error: stray '\344' in program 
foo.cpp:3:23: error: expected ',' or '...' before 'nge' 
foo.cpp: In function 'int makedreieck(int)': 
foo.cpp:7:21: error: expected ')' before 'nge' 
foo.cpp:7:21: error: 'nge' was not declared in this scope 
foo.cpp:7:24: error: expected ';' before ')' token 
foo.cpp:5:9: warning: unused variable 'rows' [-Wunused-variable] 
foo.cpp:32:1: error: expected '}' at end of input 
foo.cpp:32:1: warning: no return statement in function returning non-void [-Wreturn-type] 

[d:\dev\test] 
> _ 

是由於MinGW的克++編譯器的Windows不符合C++標準有關標識符接受的字符集。報告的特定字符數字有點奇怪,因爲源代碼被保存爲Windows ANSI Western,但是g ++也與源代碼一起以UTF-8格式出錯。截至2013年少數編譯器是符合wrt。源字符集。

唯一安全的字符爲A至Z,下劃線和數字0到9

實際上,這意味着:編寫源代碼的英文,則用得上的軟件開發和那麼可以由其他人維護並由其他編譯器編譯。

 
[d:\dev\test] 
>gnuc foo.cpp 
foo.cpp: In function 'int makedreieck(int)': 
foo.cpp:19:21: error: 'getchar' was not declared in this scope 
foo.cpp: At global scope: 
foo.cpp:25:5: warning: first argument of 'int main(char)' should be 'int' [-Wmain] 
foo.cpp:25:5: warning: 'int main(char)' takes only zero or two arguments [-Wmain] 
foo.cpp: In function 'int main(char)': 
foo.cpp:30:13: error: 'getchar' was not declared in this scope 
foo.cpp: In function 'int makedreieck(int)': 
foo.cpp:23:1: warning: control reaches end of non-void function [-Wreturn-type] 

[d:\dev\test] 
> _ 

錯誤,不過是由於不包括聲明getchar函數的頭<stdio.h>

固定,我得到以下編譯錯誤後。

修復後沒有更多的錯誤報告。

然而,警告是嚴重:

 
[d:\dev\test] 
>gnuc foo.cpp 
foo.cpp:27:5: warning: first argument of 'int main(char)' should be 'int' [-Wmain 
foo.cpp:27:5: warning: 'int main(char)' takes only zero or two arguments [-Wmain] 
foo.cpp: In function 'int makedreieck(int)': 
foo.cpp:25:1: warning: control reaches end of non-void function [-Wreturn-type] 

[d:\dev\test] 
> _ 

非標準main簽名意味着,即使包括所需的報頭之後,這是無效C++

只要刪除(未使用)的形式參數。

然後代碼編譯,只有一個非常嚴重的警告剩餘:

 
[d:\dev\test] 
>gnuc foo.cpp 
foo.cpp: In function 'int makedreieck(int)': 
foo.cpp:25:1: warning: control reaches end of non-void function [-Wreturn-type] 

[d:\dev\test] 
> _ 

這絕對需要修復!

總結:

  • 更改代碼中的標識符不使用非英文字母。那些民族特色是可以的。 C++標準,但很少有編譯器支持它們。特別是g ++沒有。

  • 包括所有必需的標題。

  • main使用符合標準的簽名。

並記住要修復缺少return聲明的事情。

然後你可以開始調試了!