用 * 字符打印边长为 n 的菱形。
思路:菱形分为上下两个三角形,先考虑上面n行的三角形。第 i 行第一个 * 之前有 n-i 个空格,接着跟上 i 个*加空格。然后考虑下面n-1行的三角形。有 n-i 个 * 号的那一行形式还是和上面一致,只是考虑上面三角形是从1到n,下面是从n-1到1。
代码实现:
法一:
#include<iostream>
using namespace std;
int main()
{
int n,i,j;
cin>>n; //输入边长n
//输出上三角形n行
for(i=1;i<=n;i++){ // i 从 1 开始递增到 n
for(j=1;j<=n-i;j++) //输出 n-i 个空格
cout<<' ';
for(j=1;j<=i;j++) //输出 i 个 * 和空格
cout<<"* ";
cout<<endl; //第 i 行输出完毕,换下一行
}
//输出下三角形n-1行
for(i=n-1;i>=1;i--){ // i 从 n-1 开始递减到 1
for(j=1;j<=n-i;j++) //每行 * 之前仍是 n-i 个空格
cout<<' ';
for(j=1;j<=i;j++) //输出 i 个 * 和空格
cout<<"* ";
cout<<endl; //第 i 行输出完毕,换行
}
return 0;
}
法二:
放在一个总的循环实现(边长为 n 的菱形共有 2n-1 行)
#include<iostream>
using namespace std;
int main()
{
int n,i,j;
cin>>n; //输入边长n
for(i=1;i<=2*n-1;i++){ //菱形一共有 2n-1 行
if(i<=n){ //前 n 行,按照上三角形输出
for(j=1;j<=n-i;j++) //输出n-i个空格
cout<<' ';
for(j=1;j<=i;j++) //输出i个*和空格
cout<<"* ";
cout<<endl; //第i行输出完毕,换下一行
}
else{ //后 n-1 行,按照下三角形输出
for(j=1;j<=i-n;j++) //第 i 行要输出 2n-i 个 *号,
cout<<' '; //故之前的空格为 n-(2n-i)=i-n
for(j=1;j<=2*n-i;j++) //第 i 行要输出 2n-i 个 *号
cout<<"* ";
cout<<endl;
}
}
return 0;
}
tips:双重循环,外层控制行数,内层输出每一行的具体内容。
主要是通过控制行数的 i 来表达每一行的 * 的个数以及空格的个数,eg.第 i 行第一个 * 前有 n-i 个空格,之后跟着 i 个*加空格。