输出空心菱形是c语言初学者经常遇到的问题,由于涉及c语言的基础知识较多,也是经常在考试中出现的题型。
第一个程序是我自己想的,要是要找方便记忆的简便方法,请直接跳过前半部分,看后半部分的其他代码,我觉得这些代码的思想很好
在写程序之前要仔细观察空心菱形的规律。先分析,不要急于写程序。
将问题化整为零:
1、输入行数
printf("please input n:");
scanf("%d",&n);
3、在输出n行的空心菱形时,发现第一行和最后一行与其他行有些区别,可以使用单独的语句将此两行输出,为了使代码整洁,使用子函数完成。
void star_end(int n)
{
int i;
for(i=1;i<=(n-1)/2;i++)
printf(" ");
printf("*");
printf("\n");
}
传递参数:要完成的菱形行数n
使用循环输出空格数:(n-1)/2
2、以9行的空心菱形为例,讨论中间部分的情况:
上图中部黑色数列为中间每行的空格数,用右侧红色数列为表示黑色数列(见箭头)。
使用一数列a,将a初始化,使a为上图右侧的的红色数列形式。
int a[20];
for(i=1;i<=(m+1)/2;i++)
a[m-i+1]=a[i]=i;
例如:n=7时 a[1]-a[7]为 1 2 3 4 3 2 1
此时左侧的红色数列可表示为 (m+1)/2-a[i]
3、使用循环输出每行的” ”与”*”
for(i=1;i<=m;i++)
{
for(j=1;j<=(m+1)/2-a[i];j++)
printf(" ");
printf("*");
for(j=1;j<=2*a[i]-1;j++)
printf(" ");
printf("*");
printf("\n");
}
对于每行,
先输出(m+1)/2-a[i]个” ”,
再输出一个”*”,
再输出2*a[i]-1个” ”,
再输出一个”*”
完整程序:
#include<stdio.h> void star_end(int n); main() { int n,m,i,j,a[20]; printf("please input n:"); scanf("%d",&n); m=n-2; for(i=1;i<=(m+1)/2;i++) a[m-i+1]=a[i]=i; star_end(n); for(i=1;i<=m;i++) { for(j=1;j<=(m+1)/2-a[i];j++) printf(" "); printf("*"); for(j=1;j<=2*a[i]-1;j++) printf(" "); printf("*"); printf("\n"); } star_end(n); } void star_end(int n) { int i; for(i=1;i<=(n-1)/2;i++) printf(" "); printf("*"); printf("\n"); }
其他算法:(这些思想很好)
一、//空心菱形图,原理是建立坐标系,原点为菱形中心
#include<stdio.h> void main() { int y,x,n,k; printf("please input number of rows:"); scanf("%d",&n); k=n/2; for(y=-k;y<=k;y++) { for(x=-k;x<=k;x++) { if((x==y+k)||(x==y-k)||(x==k-y)||(x==-k-y)) printf("%c",'*'); else printf(" "); } printf("\n"); } }
二、以上程序可使用math.h中的abs()函数,用于求绝对值。
Abs函数 描述 返回数字的绝对值。 语法 Abs(number)
代码简化为
#include<stdio.h> #include<math.h> main() { int i,j,n,k; printf("Please input the number of rows:"); scanf("%d",&n); k=n/2; for(i=-k;i<=k;i++) { for(j=-k;j<=k;j++) { if(abs(i)+abs(j)==k) printf("*"); else printf(" "); } printf("\n"); } }
/************水平有限,仅供参考,欢迎批评指正****************/