LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 611|回复: 7

练习题:打印任意边长的正方形

[复制链接]
发表于 2004-6-3 17:47:18 | 显示全部楼层 |阅读模式

  1. /*
  2. * 打印任意边长的正方形,图案形状如下:
  3. *          *
  4. *        * * *
  5. *      * * * * *
  6. *    * * * * * * *
  7. *      * * * * *
  8. *        * * *
  9. *          *
  10. *
  11. */
  12. #include <stdio.h>
  13. main()
  14. {
  15.   int j, i, a = 1, n=5;

  16.   printf("请输入边长:\n");
  17.   scanf("%d",&n);
  18.   if (n <= 0)printf("输入非法边长!\n");

  19.   for (j = 1; j < 2*n; j++, (j > n)?(a -= 2):(a += 2))

  20.       {for (i = 1; i <= ((j < n)?(n - j):(j - n));i++)
  21.              printf("  ");

  22.            for (i = 1;i <= a; i++)
  23.              {if (i == a)printf("* \n");
  24.                   else printf("* ");
  25.               }

  26.          }

  27. }
复制代码


不知道能否进一步改进?望指教:thank
 楼主| 发表于 2004-6-4 17:46:20 | 显示全部楼层

  1. /*
  2. * 打印任意边长的正方形,图案形状如下:
  3. *          *
  4. *        * * *
  5. *      * * * * *
  6. *    * * * * * * *
  7. *      * * * * *
  8. *        * * *
  9. *          *
  10. *
  11. *  version 0.9.0
  12. *   2004-06-03
  13. *  seablue at linuxsir.cn
  14. *
  15. *  改进算法,使程序更加精炼。
  16. */
  17. #include <stdio.h>
  18. main()
  19. {
  20.   int j, i, a, n=5;
  21.   printf("请输入边长:\n");
  22.   scanf("%d",&n);

  23.   if (n <= 0)
  24.      [color=red]/* { */[/color]
  25.        printf("输入非法边长!\n");
  26.     [color=red]/*   exit(1);
  27.       }*/[/color]

  28.   for (j = 1, a = 1; a < 2*n; a++,(a > n)?(j--):(j++))
  29.       {for (i = 1; i <j+n;i++)
  30.          printf("%s",i>(n-j)?"* ":"  ");
  31.          printf("\n");
  32.        }
  33. }
复制代码
发表于 2004-6-4 22:00:53 | 显示全部楼层
if (n <= 0)应该有个exit
 楼主| 发表于 2004-6-5 07:11:47 | 显示全部楼层
最初由 libinary 发表
if (n <= 0)应该有个exit

啊,是个大bug:thank

再仔细看看好象没有问题!看仔细喽...
发表于 2004-6-6 08:22:40 | 显示全部楼层
一看题目把我下了一跳。
还以为是 长度是任意的,
也就是说比如超出了 int,long 所能承受的范围的数字呢?

正无穷怎么打印呢?
发表于 2004-6-8 13:31:22 | 显示全部楼层
当输入字母的时候  输出的是边长是5的正方形~~~
 楼主| 发表于 2004-6-8 17:57:36 | 显示全部楼层
:thank
改进如下:

  1. /*
  2. * 打印任意边长的正方形,图案形状如下:
  3. *          *
  4. *        * * *
  5. *      * * * * *
  6. *    * * * * * * *
  7. *      * * * * *
  8. *        * * *
  9. *          *
  10. *
  11. *  version 1.0.0
  12. *   2004-06-08
  13. *  By seablue at linuxsir.cn
  14. *
  15. *  改正bug:当输入非数字的时候 输出边长5的正方形。
  16. */
  17. #include <stdio.h>
  18. main()
  19. {
  20.   int j, i, a, n=0;
  21.   printf("请输入边长:\n");
  22.   scanf("%d",&n);
  23.   if (n <= 0)printf("输入非法边长!\n");
  24.      [color=green]else if (!isdigit(n))printf("以数字开头的有效边长打印!\n");/*rev 1.1.0*/[/color]
  25.      [color=red]/*
  26.      *省略的exit(1),被合并到初始化n=0和下面的条件判断:a<2*n
  27.      */[/color]

  28.   for (j = 1, a = 1; a < 2*n; a++,(a > n)?(j--):(j++))
  29.       {
  30.        /*调整打印边距,让图形始终打印在屏幕中央。*/
  31.            for (i = 1; i < 40-2*n; i++)
  32.                printf(" ");
  33.            for (i = 1; i <j+n;i++)
  34.              printf("%s",i>(n-j)?"* ":"  ");
  35.                  printf("\n");
  36.            }
  37. }
复制代码
发表于 2004-6-8 22:09:26 | 显示全部楼层

  1.       1 #include <stdio.h>
  2.       2
  3.       3 int main()
  4.       4 {
  5.       5     int i, j, k;    /* counters */
  6.       6     int n;          /* line-length */
  7.       7     int a;
  8.       8
  9.       9     printf("Please input line-length:\n");
  10.      10     scanf("%d",&n);
  11.      11
  12.      12     for ( i = 1; i < 2 * n; i++)
  13.      13     {
  14.      14         if(i <= n)
  15.      15             a = i;
  16.      16         else
  17.      17             a = 2 * n - i;
  18.      18
  19.      19         for( j = 0; j < n - a; j++)
  20.      20             printf("  ");
  21.      21         for( k = 0; k < 2 * a -1; k++ )
  22.      22             printf("* ");
  23.      23
  24.      24         printf("\n");
  25.      25     }
  26.      26 }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表