-3

プログラムを動作させることができません。既にマーカー (goto) を使用して試しました。しかし、私はそれを機能させることができません。私もループを改善しようとしましたが、無限ループで終わります。手伝ってくれてありがとう!

#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;
}
4

2 に答える 2

2

ソースコードを使用して…

#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++ での最初のいくつかのコンパイル エラー、…

[d:\開発\テスト]
> gnuc foo.cpp
foo.cpp:3:1: エラー: プログラム内の '\344' が外れています
foo.cpp:7:5: エラー: プログラム内の '\344' が外れています
foo.cpp:11:9: エラー: プログラム内の '\344' が外れています
foo.cpp:14:13: エラー: プログラム内の '\344' が外れています
foo.cpp:3:23: エラー: 「nge」の前に「,」または「...」が必要です
foo.cpp: 関数 'int makedreieck(int)' 内:
foo.cpp:7:21: エラー: 'nge' の前に ')' が必要です
foo.cpp:7:21: エラー: 'nge' はこのスコープで宣言されていません
foo.cpp:7:24: エラー: 予想される ';' ')' トークンの前
foo.cpp:5:9: 警告: 未使用の変数 'rows' [-Wunused-variable]
foo.cpp:32:1: エラー: 入力の最後に '}' が必要です
foo.cpp:32:1: 警告: 非 void [-Wreturn-type] を返す関数に return ステートメントがありません

[d:\開発\テスト]
> _

これは、Windows 用の MingW g++ コンパイラが、識別子で受け入れられる文字セットに関する C++ 標準に準拠していないためです。ソース コードが Windows ANSI Western として保存されているため、レポートされる特定の文字数は少し奇妙ですが、g++ はソース コードが UTF-8 であってもエラーになります。2013 年現在、ほとんどのコンパイラはwrt に準拠しています。ソース文字セット。

安全な文字は、A ~ Z、アンダースコア、および数字の 0 ~ 9 だけです。

実際には、これは次のことを意味します:ソフトウェア開発の共通語である英語でソース コードを記述し、それを他の人が保守し、他のコンパイラーでコンパイルできます。

それを修正した後、次のコンパイル エラーが発生します。

[d:\開発\テスト]
> gnuc foo.cpp
foo.cpp: 関数 'int makedreieck(int)' 内:
foo.cpp:19:21: エラー: 'getchar' はこのスコープで宣言されていません
foo.cpp: グローバル スコープ:
foo.cpp:25:5: 警告: 'int main(char)' の最初の引数は 'int' にする必要があります [-Wmain]
foo.cpp:25:5: 警告: 'int main(char)' はゼロまたは 2 つの引数しか取りません [-Wmain]
foo.cpp: 関数 'int main(char)' 内:
foo.cpp:30:13: エラー: 'getchar' はこのスコープで宣言されていません
foo.cpp: 関数 'int makedreieck(int)' 内:
foo.cpp:23:1: 警告: コントロールが void 以外の関数の最後に達しました [-Wreturn-type]

[d:\開発\テスト]
> _

ここでのエラーは、関数<stdio.h>を宣言するヘッダーが含まれていないことが原因です。getchar

これ以上エラーが報告されていないことを修正した後。

ただし、警告は深刻です。

[d:\開発\テスト]
> gnuc foo.cpp
foo.cpp:27:5: 警告: 'int main(char)' の最初の引数は 'int' にする必要があります [-Wmain
foo.cpp:27:5: 警告: 'int main(char)' はゼロまたは 2 つの引数しか取りません [-Wmain]
foo.cpp: 関数 'int makedreieck(int)' 内:
foo.cpp:25:1: 警告: コントロールが void 以外の関数の最後に達しました [-Wreturn-type]

[d:\開発\テスト]
> _

非標準のmain署名は、必要なヘッダーを含めた後でも、有効な C++ ではないことを意味します。

(未使用の)仮引数を削除するだけです。

その後、コードがコンパイルされ、非常に重大な警告が 1 つだけ残ります。

[d:\開発\テスト]
> gnuc foo.cpp
foo.cpp: 関数 'int makedreieck(int)' 内:
foo.cpp:25:1: 警告: コントロールが void 以外の関数の最後に達しました [-Wreturn-type]

[d:\開発\テスト]
> _

これは絶対に修正する必要があります!

要約:

  • 識別子に英語以外の文字を使用しないようにコードを変更します。それらの国の文字は問題ありません。C++ 標準ですが、それらをサポートしているコンパイラはほとんどありません。特に g++ はそうではありません。

  • 必要なすべてのヘッダーを含めます。

  • には標準準拠の署名を使用してくださいmain

そして、不足しているreturnステートメントを修正することを忘れないでください。

その後、デバッグを開始できます。

于 2013-01-14T15:40:37.930 に答える
0

最初の反復drawで1に設定したので、(draw == 1)trueであり、関数は戻ります。

whenlängeの代わりにデクリメントしてみて、その時点で0にリセットし、。のときにループの最後で終了します。好みに合わせて調整します。drawdraw == länge-1drawlänge == 1

于 2013-01-14T15:31:03.020 に答える