一个循环语句的练习题,敢不敢和我较量一下。我想知道有没有更简单的算法。
题目如下:
编写一个程序,它能够读入一个正方形的边长,然后输出一个有星号和空格组成的、边长为刚刚读入边长的空心正方形。该程序应可以处理边长在1-20之间的所有正方形。例如,程序读入的边长是5,那么它应输出如下的空心正方形:
*****
* *
* *
* *
*****
下面是我写的代码,大致思路是:用到两个嵌套的while语句,外层语句负责打印第一列和最后一列星号以及换行。里层语句负责打印其他星号和空格。由于边长为1时比较特殊,所以单列出来。
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main()
{
int b,I,i;//分别声明正方形边长变量b,和两个计数变量
cout << "请输入正方形的边长(1-20)" << endl;
cin >> b;
//有效性确认
while ( b < 1 )
{
cout << "非法输入,请重新输入!";
cin >> b;
}
while ( b > 20 )
{
cout << "非法输入,请重新输入!";
cin >> b;
}
//当边长为1时
if ( b == 1 )
{
cout << "*" << endl;
return 0;
}
//嵌套的循环
I = b;
while ( I >= 1 )
{
cout << "*";//打印第一列星号
i = b;
while ( i >= 3 )
{
//第一行和最后一行打印星号,其余行打印空格
if ( I == b )
cout << "*";
else if ( I == 1 )
cout << "*";
else
cout << " ";
i--;
}
cout << "*" << endl;//打印最后一列星号并换行
I--;
}
return 0;
}
[解决办法]
#include <iostream>using namespace std;int main(){ int n; cin >> n; if (n==1) { cout << "*" << endl; return 0; } else { int i,j; for (j=1;j<=n;j++) cout << "*"; cout << endl; for (i=2;i<=n-1;i++) { cout << "*"; for (j=2;j<=n-1;j++) cout << " "; cout << "*"; cout << endl; } for (j=1;j<=n;j++) cout << "*"; cout << endl; return 0; }}
[解决办法]
好吧,算我欺负你
#include "stdafx.h"#include <iostream>int _tmain(int argc, _TCHAR* argv[]){ int length = 0; std::cin >> length; char *buff = new char[length + 1]; buff[length] = 0; memset(buff, '*', length); std::cout << buff << std::endl; memset(buff + 1, ' ', length -2); for (int index = 0; index < length - 2 ; ++index) { std::cout << buff << std::endl; } memset(buff, '*', length); std::cout << buff << std::endl; system("pause"); return 0;}
[解决办法]
for(int y=0;y<len;y++)
{
for(int x=0;x<len+1;x++)
{
if(x==len+1) cout<<"\n"
else if(x==y && x!=1 && x!=len) cout<<" ";
else cout<<"*"
}
}
//当然容易命中的条件应该放于优先处,先判"*"的再判" "的再"\n"的
//足见代码长度和效率是两回事