创建一个空心矩形

时间:2019-03-22 02:13:19

标签: c++

我的任务是允许用户输入宽度,高度和字符,以便创建空心矩形。我在编码中碰到了墙,由于某种原因,我的矩形没有“顶部”,并且右侧不在正确的列上。我对C ++相当陌生,因此欢迎您提出任何批评!

下面是我的代码和收到的输出。

#include <iostream>
using namespace std;
int main()
{
int i, j, height, width;
char ch;
char cont ='Y';
while (cont=='Y' || cont=='y')
{
cout << "Enter desired height (3 to 20): ";
cin >> height;
while (height > 20 || height < 3 )
{
    cout<<"Illegal entry. Please enter height value from 3 to 20: ";
    cin >> height;
}

cout <<"Enter desired width (3 to 20): ";
cin >> width;
while (width > 20 || width < 3)
{
    cout<<"Illegal entry. Please enter width value from 3 to 20: ";
    cin >> width;
}

cout << "What character would you like to set as your border?: ";
cin >> ch;

for(int i = 1; i <= height; i++) {
   if(width <= 1)
   for(int i = 1; i <=width; i++) {
                cout << " " << ch;
            }
        else if(i < height) {
            cout << endl;
                for(int j = 1; j <= width; j++) {
                            if(j == 1 || j == width)
                                cout << " " << ch;
                            else
                                cout << " ";
                                                }
                            }
                else {
                cout<< endl;
                    for(int k = 1; k <= width; k++)
                        {
                        cout <<" "<< ch;
                        }
                    }
                                    }



cout<<"\nDo you want to continue? (Y): ";
cin >> cont;
}
 cout <<"\nYou are done here, good job.\n";
 cout <<'\n';
}

enter image description here

3 个答案:

答案 0 :(得分:1)

虽然我不会深入研究代码本身,但首先要考虑要完成的工作,然后编写循环。 (我建议使用rowcol作为变量名。)

由于您需要空心矩形,并且要使用所需的widthheight,因此我们知道以下内容(wh是输入量。)

所以按顺序打印以下内容:

  1. 您需要一行*,其长度为w
  2. 您需要h - 2的{​​{1}}行,它们之间有*个空格。
  3. 您需要另一行,例如1。

依次执行这些操作,您将获得空心矩形。

示例输入:w - 2

所以我们有:

w = 5, h = 7

答案 1 :(得分:0)

尽管您已经有了一个很好的答案,但是您没有使用C ++语言函数来简化任务,更重要的是,您没有正确验证输入。例如,尝试以下操作:

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

事情很快就失控了。

通常,当您要验证用户输入并确保接收到特定范围内的值时,您只需要一个连续循环,即可在其中提示,验证输入,检查/处理流状态> McNiel CSC 2050.exe Enter desired height (3 to 20): No, I don't think I will 和{ {1}}(请参阅:std::basic_iostream),并在下次尝试读取之前清空输入缓冲区中的所有剩余字符。

您的.eof(), .bad()输入循环的示例类似于以下内容(请注意,同时读取.fail()h x w,如果您愿意,可以自由使用两个循环你喜欢):

h

有关清空输入流和std::basic_istream::ignore的详细信息,请参见std::basic_ios::clear

接下来,您只需使用std::setw来处理w之间的间距即可制作空心矩形,而不是使用某些循环方案来输出空格。顶部和底部是固定的,但对于中间的行,您需要做的只是 int h, w; for (;;) { std::cout << "enter height & width (3 <= h w <= 20): "; if (!(std::cin >> h >> w)) { if (std::cin.eof() || std::cin.bad()) { std::cerr << "(user canceled/unrecoverable error)\n"; return 1; } else if (std::cin.fail()) { std::cerr << "error: invalid integer input.\n"; std::cin.clear(); std::cin.ignore (std::numeric_limits<std::streamsize>::max(),'\n'); } } else if (3 <= h && h <=20 && 3 <= w && w <= 20) break; else std::cerr << "error: h or w not within (3 <= x <= 20)\n"; } 。例如,您的整个输出循环减少为:

'*'

将其放在一起,您可以执行以下操作:

std::cout << '*' << std:setw(w-1) << '*';

使用/输出示例

    for (int i = 0; i < h; i++) {
        if (!i || i == h - 1)
            for (int j = 0; j < w; j++)
                std::cout << '*';
        else
            std::cout << '*' << std::setw(w-1) << '*';
        std::cout << '\n';
    }

第二个#include <iostream> #include <iomanip> #include <limits> int main (void) { int h, w; for (;;) { std::cout << "enter height & width (3 <= h w <= 20): "; if (!(std::cin >> h >> w)) { if (std::cin.eof() || std::cin.bad()) { std::cerr << "(user canceled/unrecoverable error)\n"; return 1; } else if (std::cin.fail()) { std::cerr << "error: invalid integer input.\n"; std::cin.clear(); std::cin.ignore (std::numeric_limits<std::streamsize>::max(),'\n'); } } else if (3 <= h && h <=20 && 3 <= w && w <= 20) break; else std::cerr << "error: h or w not within (3 <= x <= 20)\n"; } for (int i = 0; i < h; i++) { if (!i || i == h - 1) for (int j = 0; j < w; j++) std::cout << '*'; else std::cout << '*' << std::setw(w-1) << '*'; std::cout << '\n'; } } 示例:

$ ./bin/hollowrect
enter height & width (3 <= h w <= 20): No, I don't think I will
error: invalid integer input.
enter height & width (3 <= h w <= 20): OK
error: invalid integer input.
enter height & width (3 <= h w <= 20): 10 2
error: h or w not within (3 <= x <= 20)
enter height & width (3 <= h w <= 20): 10 3
***
* *
* *
* *
* *
* *
* *
* *
* *
***

用户通过手动h x w取消:

$ ./bin/hollowrect
enter height & width (3 <= h w <= 20): 3 10
**********
*        *
**********

仔细检查一下,如果还有其他问题,请告诉我。

答案 2 :(得分:-1)

如果要在分配高度和宽度为4时低于结果,则

* * * *
*     *
*     *
* * * *

您的for循环是错误的,请在您的for循环中使用此代码。

***** // Step 1.
*   * // Step 2. Note there are 5 - 2 spaces between them. (w - 2). 
*   *
*   *
*   *
*   *
***** // Step 3.