2016-10-22 56 views
0

(Perl新手) 我有一個小型的perl程序可以計算階乘。我想使用一個while循環,以便在用戶得到結果後,他們會被要求「計算另一個階乘?Y/N」並且讓Y再次運行代碼&有N結束程序。perl - 嘗試使用while循環詢問用戶是否他們想再次這樣做

這裏是我的代碼:

print"Welcome! Would you like to calculate a factorial? Y/N\n"; 

$decision = <STDIN>; 

while $decision == "Y"; 
{ 
    print"Enter a positive # more than 0: \n"; 

    $num = <STDIN>; 
    $fact = 1; 

    while($num>1) 
    { 
     $fact = $fact * $num; 
     $num $num - 1; 
    } 

    print $fact\n; 
    print"Calculate another factorial? Y/N\n"; 
    $decision = <STDIN>; 
} 
system("pause"); 

什麼是給我的麻煩就是把while循環,以及如何使Y/N選項的工作。我也不清楚system("pause")sleep的功能。我知道system("pause")可以讓我的程序正常工作。

+0

需要一個'chomp',和''==是一個數字比較 - 你可能想'eq' – Sobrique

+0

當我運行它,它會立即自行關閉,儘管'系統( 「暫停」);'待辦事項你知道爲什麼會通過查看代碼來實現嗎? –

+1

當我嘗試你的代碼,然後我得到'標量找到操作符預期在err.pl行15,在$ num $ num「附近$ \t(在$ num之前缺少操作符) 找到反斜槓,其中操作符預期在err.pl第18行,接近「$ fact \」 \t(在\之前缺少運算符) 語法錯誤在err.pl第5行附近「while $ decision」 語法錯誤在err.pl第15行附近「$ num $ num 「 執行err.pl因編譯錯誤而中止.',即Perl甚至沒有機會考慮你的'system(」pause「)'行。 – PerlDuck

回答

4

你的程序是幾乎權,只是一個幾個問題:

  1. 請習慣於隨時添加use strict;use warnings;到腳本。他們將 (超出其他事情)迫使你聲明你使用的所有變量(與my $num=…;) 並警告你常見的錯誤(如錯別字)。有些人認爲這是一個缺陷, use strict;use warnings;默認情況下沒有打開。
  2. 當從STDIN(或其他文件句柄)讀取一行時,讀取行將包含尾隨換行符「\ n」 。爲了您的比較工作,您必須擺脫使用 chomp函數。
  3. 在Perl中有兩套不同的比較運算符:一種用於字符串,一種用於數字。 將數字與<,>,<=,>=,==!=進行比較。對於字符串,您必須使用 lt(小於),gt,le(小於或等於),ge,eqne。如果在字符串上使用 運算符中的一個,Perl會嘗試將您的字符串解釋爲數字,因此$decision == "Y" 會檢查$decision是否爲0。如果你有use warnings; Perl會注意到你。 改爲使用$decision eq "Y"
  4. while循環有一個尾隨;剛過,這將給你無限 循環或無操作(取決於$decision內容)的比較。
  5. 您忘記了$num = $num - 1;中的=
  6. 你忘了引號"周圍print "$fact\n";
  7. system("pause")僅適用於Windows,其中pause是一個外部命令。在Linux上(我剛剛測試的 )沒有這樣的命令,system("pause")command not found而失敗。 我用sleep(5);替換它,它只需等待5秒鐘。

#!/usr/bin/env perl 

use strict; 
use warnings; 

print "Welcome! Would you like to calculate a factorial? Y/N\n"; 

my $decision = <STDIN>; 
chomp($decision); # remove trailing "\n" from $decision 

while ($decision eq 'Y') { 
    print "Enter a positive # more than 0: \n"; 

    my $num = <STDIN>; 
    chomp($num); 
    my $fact = 1; 

    while ($num > 1) { 
     $fact = $fact * $num; 
     $num = $num - 1; 
    } 

    print "$fact\n"; 
    print "Calculate another factorial? Y/N\n"; 
    $decision = <STDIN>; 
    chomp($decision); 
} 
print "ok.\n"; 

sleep(5); # wait 5 seconds 
+0

'sleep(5)'不適合替換'system(「pause」)'。此外,這個計劃實際上並不需要。 – ikegami

+0

提示:標準是在提示中使用小寫字母,但默認情況除外。那會提示'y/N'。此外,這裏應該同時接受小寫和大寫輸入,所以'$ decision eq'Y''應該是'fc($ decision)eq'y''。 – ikegami

+0

提示:' - $ num;'可以替代'$ num = $ num-1;' – ikegami

0

總是將use warningsuse strict添加到程序的開頭。 您的代碼中存在大量錯別字,可能會被此錯誤捕獲。

#!/usr/bin/perl 
use warnings; 
use strict; 


print "Welcome! Would you like to calculate a factorial? Enter 'Y' or 'N': "; 

my $answer = <STDIN>; 
chomp($answer); 

while($answer =~ /^[Yy]$/){ 
    my $fact = 1; 
    print"Enter a positive number greater than 0: "; 

    my $num = <STDIN>; 
    chomp($num); 
    my $number_for_printing = $num; 

    while($num > 0){ 
     $fact = $fact * $num; 
     $num--; 
    } 
    print "The factorial of $number_for_printing is: $fact\n"; 

    print"Calculate another factorial? Enter 'Y' or 'N': "; 
    $answer = <STDIN>; 
    chomp($answer); 
} 

print "Goodbye!\n"; 
相關問題