LinuxSir.cn,穿越时空的Linuxsir!

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

我也找来个题大家一起做~~~~~

[复制链接]
发表于 2004-3-5 13:34:23 | 显示全部楼层 |阅读模式
这是Perl by Example上的一道题

物理学家告诉我们,最低的温度是绝对零度,绝对零度是华氏-459.69度。
   1。接受用户输入:开始温度,结束温度和增值(都是华氏)
   2。检查错误输出:小于绝对零度的温度和结束温度小于开始温度的情况。如果发现这种情况,程序发送消息到STDERR。
   3。打印标题:"Fahrenheit Celcius"。打印从开始到结束温度的所有值,使用循环机制,转换公式是:C=(F-32)/1.8
   *加分:确保用户输入的是数字,小数或浮点数,如5.5,.5,5
发表于 2004-3-8 10:32:01 | 显示全部楼层

  1. #!/usr/bin/perl -w
  2. print "input initialization temperature :\n";
  3. while (1) {
  4.       chomp($init=<>);
  5.       if( $init < -459.69) {
  6.               print "initialzation temperature less then -459.69F\n";
  7.       }else {
  8.               $init=($init-32) / 1.8 ;
  9.               last ;
  10.       }
  11. }
  12. print "input termination  temperature:\n";
  13. while (1) {
  14.       chomp($tem=<>);
  15.       if($tem < -459.69) {
  16.               print "termination temperature less then -459.69F\n";
  17.       }else {
  18.               $tem=($tem-32) / 1.8 ;
  19.               last ;
  20.       }
  21. }
  22. print "input step temperature:\n";
  23. while (1) {
  24.       chomp($step=<>);
  25.       if( $step < -459.69) {
  26.               print "step temperature less then-459.69F\n";
  27.       }else {
  28.               last ;
  29.       }
  30. }
  31. while ($init < $tem ) {
  32.        print "$init ";
  33.        $init += $step ;
  34. }
  35. print "\nDone\n";
复制代码


这个办法比较笨,怎么把chomp($val=<>)放到判断那一行里?
 楼主| 发表于 2004-3-8 17:48:08 | 显示全部楼层
我的程序写出来了一半,没有确保用户输入的是数字,其他条件符合,等下帖上来
发表于 2004-3-8 18:11:58 | 显示全部楼层
照home的改改:

  1. #!/usr/bin/perl -w
  2. print "input initialization temperature :\n";
  3. while (1) {
  4.     chomp($init=<> );
  5.     if( $init =~ /\D/ ) { #如果$init匹配所有的非数字的字符。
  6.          print "initialization tempereature type is erroe\n";
  7.          if( $init < -459.69 ) {
  8.              print "initialzation temperature less then -459.69F\n";
  9.          }else {
  10.               $init=($init-32) / 1.8 ;
  11.               last ; #这里得到正确得参数,推出while(){}循环,保留最后的值,下面的同理。
  12.          }
  13.     }  
  14. }
  15. print "input termination  temperature:\n";
  16. while (1) {  #这个循环的内容增加了对$init 和$tem的比较。
  17.     chomp($tem=<> );
  18.     if($tem =~ /\D/ ) {
  19.         print "termination temperature type is error\n";
  20.         if($tem < -459.69) {
  21.             print "termination temperature less then -459.69F\n";
  22.             if($tem < $init ) {
  23.                      print " termination temperature less then initialization temperature,please input a new termination\n";
  24.             }else {
  25.                      $tem=($tem-32) / 1.8 ;
  26.                      last ;
  27.             }
  28.         }
  29.     }
  30. }
  31. print "input step temperature:\n";
  32. while (1) {
  33.     chomp($step=<> );
  34.     if($step =~ /\D/ ) { #如果$step匹配匹配非数字的字符。
  35.         print "step temperature type is error\n";
  36.         if( $step<0 ) {
  37.               print "step temperature less then 0 \n";
  38.         }else{
  39.               last ;
  40.                   #这里得到正确得参数,推出while(){}循环,保留最后的值。
  41.         }
  42.     }
  43. }
  44. while ($init < $tem ) {
  45.     print "$init ";
  46.     $init += $step ;
  47. }
  48. print "\nDone\n";
复制代码

谢谢the_threeeyes的提醒,我考虑得不周到,忽略了$step要大于零,还有算法错了。请大家再看看。。有什么错误的地方请大家指出。
\D的意思是匹配除任意数字的字符。
 楼主| 发表于 2004-3-8 22:42:17 | 显示全部楼层
#!/usr/bin/perl -w

。。。。。      
#假设确定用户输入的是数字,并且分别保存在$init,$tem, $step
#表示开始,结束和增值

SWITCH:{
   last if {$init<-459.69;}  #小于绝对零度,退出
   last if {$tem<=$init;}    #结束温度要大于开始温度
   last if {$step<=0;}       #增值要大于零
   do {
     print "Fahrewhietinit",'    ';  #打印开始温度(华氏)
     $c=($init-32)/1.8;                #求对应摄氏温度  
     print "Celciusc\n";             #打印摄氏温度值,新行
     $init+=$step;                     #增值后的温度
       }
   while ($init>=$tem){                #温度大于结束温度停
     print "Fahrewhiettem",'    ';   #打印结束温度
     $c=($tem-32)/1.8;                 #求摄氏
     print "Celciusc\n";             #打印结束温度
     }
  }

这样的话每一行打印出的是华氏和对应的摄氏,然后换行。
没有设计开始的输入开始,结束和增值温度,及没有确保用户输入的是数字,小数或浮点数。
有遗漏的地方请大家指导
发表于 2004-3-8 23:46:48 | 显示全部楼层
应该对每一个参数都分别检查,请看看上一贴。。
 楼主| 发表于 2004-3-9 12:33:28 | 显示全部楼层
可能是对题意理解的不一样,我是这样理解的:
例如,输入开始温度0度,结束100度,增值11度(均为华氏)
得出这样的输出:
   Fahrenheit    Celcius
      0           ....
     11           ....
     22           ....
     ..            ..
     99           ....
    100           ....
我的意思就是要满足三个条件才计算并输出,开始温度不小于绝对温度,结束温度要高于开始温度,增值要大于零,三个条件同时满足才开始计算并循环。否则就视为用户捣蛋,不为他计算输出:P
 楼主| 发表于 2004-3-9 12:36:55 | 显示全部楼层
应该象列表那样对齐的
发表于 2004-3-9 13:13:50 | 显示全部楼层
不能推出while(){} 循环阿。。看上去没什么问题了,怎么推出while(){}循环呢???请教高手!!
发表于 2004-3-9 23:48:07 | 显示全部楼层
我的,大概测试了一下,还行,不保证没有错误

  1. #! /usr/bin/perl -w

  2. while(2){
  3.   if(!defined($begin = getInput("begin"))){
  4.     next;
  5.   }
  6.   if(!defined($end = getInput("end"))){
  7.     next;
  8.   }
  9.   if(!defined($step = getInput("step"))){
  10.     next;
  11.   }
  12.   if($begin > -459.69 && $begin < $end && $step > 0){
  13.     last;
  14.   }else{
  15.     print "error\n";
  16.   }
  17. }
  18. print "  No.  Fahrenheit   Celsius\n";
  19. for($i = 1, $f = $begin; $f <= $end; $f += $step, $i++){
  20.   $c = ($f - 32) / 1.8;
  21.   write;
  22. }

  23. sub getInput{
  24.   my $name = $_[0];
  25.   print "${name}: ";
  26.   my $num = <>;
  27.   if(!defined($num)){ [color=red]# Ctrl+d 退出[/color]
  28.     print "\n";
  29.     exit;
  30.   }
  31.   chomp $num;
  32.   if(!isNumber($num)){
  33.     print "error\n";
  34.     undef $num;
  35.   }
  36.   return $num;
  37. }

  38. sub isNumber{
  39.   my $n = $_[0];
  40.   if($n =~ /^[+-.]+$/){ [color=red]# 如果只包含+-.则返回假[/color]
  41.     return 0;
  42.   }
  43.   [color=red]# 判断是否是数字,可接受的形式有-2、.3、-.6、3.7、+50等等[/color]
  44.   if($n =~ /^[+-]?\d*\.?\d*$/){
  45.     return 1;
  46.   }
  47.   return 0;
  48. }

  49. format STDOUT=
  50. @####  @######.##  @####.##
  51. $i, $f, $c
  52. .
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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