免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2604 | 回复: 7
打印 上一主题 下一主题

螺旋打印 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-30 11:49 |只看该作者 |倒序浏览
新近想学perl,从螺旋打印入手。

刚开始奇数不能打印正中间的数,后来做个简单判断。
请高手帮忙改改。

  1. #!/usr/bin/env perl
  2. @z=();
  3. $n=1;
  4. #$w=7;

  5.   my $w;

  6.   while (1) {

  7.         print "input number:";

  8.         $w=<STDIN>;;

  9.         chomp($w);


  10.         last if ($w);

  11.   }


  12. if ($w%2!=0) {
  13.         $m=($w+1)/2;
  14.         print "$m\n";
  15.         $z[$m][$m]=$w*$w;
  16. }


  17. sub zong {
  18.         for ( $i=$_[0];$i<$_[1];$i++ ) {
  19.                 for ( $j=$_[0] ) {
  20.                         $z[$i][$j]=$n;
  21.                         $n=$n+1;
  22.                 }
  23.         }
  24. }
  25. sub heng {
  26.         for $i ( $i=$_[1] ){
  27.                 for ( $j=$_[0];$j<$_[1];$j++ ){
  28.                         $z[$i][$j]=$n;
  29.                         $n=$n+1;
  30.                 }
  31.         }
  32. }
  33. sub nzong {
  34.         for ( $i=$_[1];$i>$_[0];$i-- ) {
  35.                 for ( $j=$e ) {
  36.                         $z[$i][$j]=$n;
  37.                         $n=$n+1;
  38.                 }
  39.         }
  40. }
  41. sub nheng {
  42.         for $i ( $i=$_[0] ){
  43.                 for ( $j=$_[1];$j>$_[0];$j-- ){
  44.                         $z[$i][$j]=$n;
  45.                         $n=$n+1;
  46.                 }
  47.         }
  48. }

  49. $b=1;
  50. $e=$w;
  51. $c=($b+$e)/2;

  52. for ( $k=0;$k<=$c;$k++ ) {
  53.         zong($b,$e);
  54.         heng($b,$e);
  55.         nzong($b,$e);
  56.         nheng($b,$e);
  57.         $b=$b+1;
  58.         $e=$e-1;
  59. }



  60. for $i ( 0 .. $#z ) {
  61.         for $j ( 0 .. $#{$z[$i]} ) {
  62.                 print "$z[$i][$j]\t";
  63.                 #print "elt $i $j is $z[$i][$j]\n";
  64.         }
  65.         print "\n";
  66. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-01-30 13:22 |只看该作者
回复 1# zxpxyz


    这程序写的。。。。。。。不是高手,飘。。。。。。

论坛徽章:
0
3 [报告]
发表于 2011-01-30 13:30 |只看该作者
回复 2# bernana

那啥。。。

我知道写得很烂,并且我还不懂perl下的很多方便的函数。。。

当作是2维数组和for循环和if判断的流程控制的熟悉吧。

坦白说我还不了解perl,我希望能给我一个学习的方向。。。

论坛徽章:
0
4 [报告]
发表于 2011-01-30 13:34 |只看该作者
回复  bernana

那啥。。。

我知道写得很烂,并且我还不懂perl下的很多方便的函数。。。

当作是2维 ...
zxpxyz 发表于 2011-01-30 13:30


加上
use strict;
use warnings;

他会告诉你哪错了。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2011-01-30 13:41 |只看该作者
我滴
  1. #!/usr/bin/perl -w

  2. use strict;

  3. my $n = 15;

  4. my @aoa;

  5. my($dx,$dy) = (1, 0);   # 起始方向
  6. my($x, $y) = (0, 0);    # 起始位置

  7. sub next {
  8.     my($nx, $ny) = ($x+$dx, $y+$dy);

  9.     # 过滤不在矩阵内的坐标
  10.     if ($nx >= 0 and $ny >= 0 and $nx < $n and $ny < $n) {
  11.         unless (defined $aoa[$nx][$ny]) {
  12.             ($x, $y) = ($nx, $ny);
  13.             return;
  14.         }
  15.     }
  16.     for ([1,0], [0,1],[-1,0], [0,-1]) { #依次查看四个方向有无可用空位
  17.         my($ndx, $ndy) = @$_;
  18.         ($nx, $ny) = ($x+$ndx, $y+$ndy);

  19.         # 过滤不在矩阵内的坐标
  20.         next if $nx < 0 or $ny < 0 or $nx >= $n or $ny >= $n;
  21.         unless (defined $aoa[$nx][$ny]) {
  22.             ($x, $y) = ($nx, $ny);
  23.             ($dx, $dy) = ($ndx, $ndy);
  24.             return;
  25.         }
  26.     }
  27. }


  28. for (1 .. $n*$n) {
  29.     $aoa[$x][$y] = $_;
  30.     &next;
  31. }

  32. for my $array_ref (@aoa) {
  33.     printf " %3d", $_ for @$array_ref;
  34.     print "\n";
  35. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-01-30 13:43 |只看该作者
回复 4# bernana


感谢,感谢~

加入以后不能执行成功了。。。
看来被我给弄成只能写的代码了

论坛徽章:
0
7 [报告]
发表于 2011-01-30 13:47 |只看该作者
好长好长。

论坛徽章:
0
8 [报告]
发表于 2011-01-30 13:49 |只看该作者
回复 5# zhlong8

好漂亮啊!!
羡慕~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP