我的任务是允许用户输入宽度,高度和字符,以便创建空心矩形。我在编码中碰到了墙,由于某种原因,我的矩形没有“顶部”,并且右侧不在正确的列上。我对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';
}
答案 0 :(得分:1)
虽然我不会深入研究代码本身,但首先要考虑要完成的工作,然后编写循环。 (我建议使用row
和col
作为变量名。)
由于您需要空心矩形,并且要使用所需的width
和height
,因此我们知道以下内容(w
和h
是输入量。)>
所以按顺序打印以下内容:
*
,其长度为w
。h - 2
的{{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.