C语言由键盘输入正数n(n<30),要求输出具有n行的如下图案。

由键盘输入正数n(n<30),要求输出具有n行的如下图案。
输入样例7输出样
*******
*** ***
** **
* *
** **
*** ***
*******

#include<stdio.h>
void main()
{
int n,i,j;
printf("请输入n(0<n<30)的值:\n");
scanf("%d",&n);

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i<n/2) //前n/2行
{
//什么情况下输出空格n为奇数和偶数两种情况都包含进去了
if((n%2==1&&j>n/2-i&&j<n/2+i)||(n%2==0&&j>n/2-1-i&&j<n/2+i))
printf(" ");
else
printf("*");
}
else //后面n/2行
{
//什么情况下输出空格n为奇数和偶数两种情况一样
if(j>i-n/2&&j<n+n/2-1-i)
printf(" ");
else
printf("*");
}
}
//换行
printf("\n");
}
}

//花了我很长时间的呢,运行结果非常OK,记得给分哦!
//其实这种题关键在于分析什么情况下输入空格
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-16
1 #include<stdio.h>
2 main()
3 {
4 int line,i,j,k,targetnum;
5 scanf("%d",&targetnum);
6 if(targetnum%2==0)
7 {
8 printf("the num must be odd\n");
9 return 0;
10 }
11 for(line=1;line<=targetnum;line++)
12 {
13 //每行都是分成三部分打印的,第一行是例外单独处理
14 if(line==1)
15 {
16 for(i=1;i<=targetnum;i++)printf("*");
17 printf("\n");
18 continue;
19 }
20 if(line==targetnum)
21 {
22 for(i=1;i<=targetnum;i++)printf("*");
23 printf("\n");
24 continue;
25 }
26 if((targetnum-(line-1)*2+1)/2>=1)
27 {
28 for(i=1;i<=(targetnum-(line-1)*2+1)/2;i++)printf("*");
29 for(i=1;i<=(line-1)*2-1;i++)printf(" ");
30 for(i=1;i<=(targetnum-(line-1)*2+1)/2;i++)printf("*");
31 printf("\n");
32 }else
33 {
34 for(i=1;i<=1+line-(targetnum+1)/2;i++)printf("*");
35 for(i=1;i<=2*targetnum-2*line-1;i++)printf(" ");
36 for(i=1;i<=1+line-(targetnum+1)/2;i++)printf("*");
37 printf("\n");
38 }
39 }
40 }
可以直接编译运行,结果绝对正确。另外为了达到你这个输出要求,输入的数字必须是奇数,才能达到,所以我就在程序里面限制了。
满意请给分
第2个回答  2012-11-16
#include <stdio.h>
void main()
{
int n;
char s[1000] = {0};
scanf("%d",&n);// n must be odd.
for( int i = 0; i < n; i++ )
{
int ii = i < n / 2 ? i : n - i - 1;
int left = n / 2 - ii;
int right = n / 2 + ii;
int j;
for( j = 0; j <= left; j++ )
s[j] = '*';
for( j = left + 1; j < right; j++ )
s[j] = ' ';
for( j = right; j < n; j++ )
s[j] = '*';
printf( "%s\n", s );
}
}
第3个回答  2012-11-17
规律是中间空白区域的1,3,5,。。。,5,3,1,程序本身不难,考查的是循环!