-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:警告:未使用的变量“行”[-Wunused-variable]
foo.cpp:32:1: 错误:输入结束时预期为“}”
foo.cpp:32:1:警告:函数中没有返回语句返回非 void [-Wreturn-type]

[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)' 只需要零个或两个参数 [-Wmain]
foo.cpp:在函数'int main(char)'中:
foo.cpp:30:13: 错误: 'getchar' 未在此范围内声明
foo.cpp:在函数“int makedreieck(int)”中:
foo.cpp:23:1:警告:控制到达非无效函数的结尾 [-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)' 只需要零个或两个参数 [-Wmain]
foo.cpp:在函数“int makedreieck(int)”中:
foo.cpp:25:1:警告:控制到达非无效函数的结尾 [-Wreturn-type]

[d:\开发\测试]
> _

非标准main签名意味着即使包含所需的标头,这也是无效的 C++

只需删除(未使用的)形式参数。

然后代码编译,只剩下一个非常严重的警告:

[d:\开发\测试]
> gnuc foo.cpp
foo.cpp:在函数“int makedreieck(int)”中:
foo.cpp:25:1:警告:控制到达非无效函数的结尾 [-Wreturn-type]

[d:\开发\测试]
> _

这绝对需要修复!

加起来:

  • 将代码更改为不在标识符中使用非英文字母。那些民族角色还可以。C++ 标准,但很少有编译器支持它们。特别是 g++ 没有。

  • 包括所有必需的标题。

  • 对 .使用符合标准的签名main

并记住修复丢失的return语句。

然后就可以开始调试了!

于 2013-01-14T15:40:37.930 回答
0

draw在您设置为 1的第一次迭代中,(draw == 1)为 true 并且函数返回。

尝试递减länge而不是drawwhen draw == länge-1,此时重置draw为 0,并在循环结束时退出 when länge == 1。调整口味。

于 2013-01-14T15:31:03.020 回答