2013-03-16 4 views
2

루프를 도와 줄 수 있습니까? 나는 1과 10 사이의 숫자를 추측하도록 요청하는 프로그램을 작성하려고합니다. 올바른 답이 아닌 경우 다른 기회 등이 생깁니다.간단한 루프를 쓰려고 시도합니다

제 인쇄물을 올바르게 인쇄 할 수 있습니까? 한 번만,이 스크립트에 사용자가 다시 시도 할 수있는 가능성을 어떻게 추가합니까 (올바른 숫자를 추측 할 때까지)?

내 기본 스크립트는 다음과 같습니다. 매우 단순하고 오류가 많을 것입니다. 누군가가이 간단한 문제를 해결할 수 있도록 도와 줄 수 있습니까?

나쁜 레이아웃으로 죄송 합니다만,이 사이트에 내 스크립트를 배치하는 방법을 모르겠다, 미안 해요!

use strict; 
use warnings; 

print "Hello, I've thought of a number, do you know what number it is?\n"; 
sleep (1); 
print "Try and guess, type in a number between 1 and 10!\n"; 
my $div = <STDIN>; 
my $i = 0; 
my $int = int(rand (10)) + 1; 
chomp $div; 
if ($div < $int) { 
    print ("The number I though of is higher than $div, try again?\n"); 
} 

if ($div > $int) { 
    print ("The number I though of is lower that $div, try again?\n"); 
} 

if ($div == $int) { 
    print ("Amazing, you've guessed mt number\n"); 
} 
+1

루프가 필요 없다는 것을 알고 있더라도 거기에는 루프가 없습니다. 정확히 당신이 알고 싶은 것은 무엇입니까? 루프 구문? – Ingo

+0

until 루프를 시험해보고 내가 필요한 것이 있는지 살펴 보겠습니다. 나는 그렇다고 생각한다. – joesh

+1

최근 [codereview] (http://codereview.stackexchange.com/a/23556/21609)에서 "내 번호 추측"기능이 풍부한 구현을 발표했습니다. 영감을 얻기 위해 그곳을 바라 볼 수도 있습니다. – amon

답변

2

때까지 더 간단한 방법은 while loop 될 것이다.

use strict; 
use warnings; 

print "Hello, I've thought of a number, do you know what number it is?\n"; 
sleep (1); 
my $int = int(rand (10)) + 1; 
print "Try and guess, type in a number between 1 and 10!\n"; 

while (my $div = <STDIN>) { 
    chomp $div; 
    if ($div < $int) { 
     print "The number I though of is higher than $div, try again?\n"; 
    } 
    elsif ($div > $int) { 
    print "The number I though of is lower that $div, try again?\n"; 
    } 
    else { 
    print "Amazing, you've guessed mt number\n"; 
    last; 
    } 
} 

동안 (말장난 의도) (그것을 위해 야호, 당신은 strictwarnings을 사용하고 구문 오류가 없습니다!) 코드가 이미 매우 좋은이 나는 변경 몇 가지가 있으며, 좀 더 어디 것 개선을 제안합니다.

하지만 먼저 루프를 살펴 보겠습니다. 조건이 참일 경우 프로그램은 루프 while에 머무를 것입니다. 사용자가 입력 할 수있는 모든 것 (심지어 빈 줄)은 Perl에 의해 true로 간주되기 때문에 이것은 영원한 것이다. 루프를 빠져 나갈 조건이 있기 때문에 괜찮습니다. ifelse 부분에 있습니다. last 문은 Perl에게 루프를 종료하도록 지시합니다. else이 실행되지 않으면 다시 while 블록의 시작으로 돌아가고 사용자는 다시 시도해야합니다. 영원히. 당신이 그것을 을 사용하지 않은과 같이 $i 필요하지 않습니다 - - 세 가지 별도의 if 문을 사용 :

의 변화는 내가했다. print

제안을 필요가 없습니다 괄호 ()에 - 세 가지 조건 중 하나만이 경우에는 사실 일 수 있기 때문에, 나는 1 로 병합 : - 당신은 그들이 무엇에 대한 귀하의 변수 이름을 지정해야하지 그들이 아르. $int은 좋은 이름이 아닙니다. 나는 $random 또는 심지어 $random_number으로 갈 것입니다. 나중에 코드로 돌아 가야하는 경우 자세한 내용이 중요합니다. - use feature 'say';으로 활성화 할 수있는 function called say이 있습니다. print "stuff\n"에 해당하는 say "stuff"을 추가합니다.


편집 :

당신이, 당신이 다른 if을 추가 할 수 있습니다 직접하는 번호를 사용자가 입력 한 관련이없는 다른 조건을 추가하려면.

while (my $div = <STDIN>) { 
    chomp $div; 

    if ($div eq 'quit') { 
    print "You're a sissy... the number was $int. Goodbye.\n"; 
    last; 
    } 

    if ($div < $int) { 
     print "The number I though of is higher than $div, try again?\n"; 
    } 
    elsif ($div > $int) { 
    print "The number I though of is lower that $div, try again?\n"; 
    } 
    else { 
    print "Amazing, you've guessed mt number\n"; 
    last; 
    } 
} 

사용자가 전화 번호를 입력했는지 확인해도됩니다. 단어 나 문자를 입력하면 현재 코드에서 경고가 나타납니다. 그렇게하려면 정규식이 필요합니다.perlre에서 해당 내용을 읽어보십시오. m//=~과 함께 작동하는 match operator입니다. \D은 숫자가 아닌 문자 (0-9)와 일치합니다. nextwhile 블록의 나머지 부분을 단계적으로 처리하고 while 조건 확인부터 시작합니다.

while (my $div = <STDIN>) { 
    chomp $div; 

    if ($div =~ m/\D/) { 
    print "You may only guess numbers. Please try again.\n"; 
    next; 
    } 

    # ... 
} 

따라서, 전체 검사 수단 '물건의 모양은 사용자가 입력 한하고있는 수보다 다른 것을 전혀있을 경우, 불평 그를 다시 해보자'.

+0

환상적입니다, 나는 알지 못해서 - 내가 깨달은 것보다 더 가까이에있었습니다. 고맙습니다. Perl을 대학 수업에서 배워야 할 때가 있습니다. 때로는 자신이해야 할 일을 이해함에 따라 약간의 좌절감을 느끼지 만, '명령'이 무엇인지 알 필요가 없습니다. 당신은 내 문제를 완벽하게 해결하는 데 도움을주었습니다. 가장 감사드립니다. 귀하의 의견을 다시 읽으므로이 반복문에서 정말로 분명합니다. – joesh

+0

몇 가지 의견과 질문. a) 'int'는 내가 사용하려고했던 것이었고 나서 꺼내는 것을 잊었다 - 내 실수. b) 'if'또는 'elsif'를 두 번 이상 사용할 수 있습니까? 나는 당신이 설명하는 것처럼, 나는 그 'if'명령을 모두 필요로하지 않는다는 것을 알아 차린다. 그러나 플레이어가 10 회 시도한 후 추측하지 못한 'if'와 같은 또 다른 요소를 추가하고 싶다고 말한 다음 루프를 종료합니다. 나는 또 다른 'if'또는 'elsif'를 추가 할까? c) 네, 변수를 올바르게 지정해야한다는 것을 완전히 추가 할 수 있습니다. 이 프로그램은 원래 프랑스어로 작성 되었기 때문에 변수의 이름이 잘못되었거나 혼란 스럽습니다. – joesh

+0

Perl을 제공하는 대학은 어느 곳입니까? Randal L. Schwartz의 * [Learning Perl] (http://shop.oreilly.com/product/0636920018452.do) * 서적을 얻으시기 바랍니다. 그것은 초보자를위한 최고의 하나입니다. 어느 책을 사든간에 ​​최신판인지 확인하십시오. 오래된 구식 물건이 많이 있습니다. 게다가'strict'와'warnings'을 가지지 않은 튜토리얼을 무시하거나'my'로 vars를 선언하지 않습니다. 그것들은 길기 때문에 무시당하는 것이 가장 좋습니다. 고품질 자습서 목록을 보려면 http://perl-tutorial.org/를 참조하십시오. – simbabque

2

사용 루프

my $guessed = 0; 
do { 
    print "Try and guess, type in a number between 1 and 10!\n"; 

    my $div = <STDIN>; 

    ...; 

    if ($div == $int) { 

     print ("Amazing, you've guessed mt number\n"); 
     $guessed = 1; 

    } 
} until ($guessed) 
+0

위대한, 내가 이것을 시도하고 내가 일어날 수있는 것을 참조하십시오. 제가 제대로 이해한다면 원본 스크립트를 스크랩합니다. 아마도 어색 할 것입니다. – joesh

+0

좋아, 나 다시. '이 루프를 어디에 두어야하는지'에 대해 설명해 주시겠습니까? 매우 감사합니다. – joesh

관련 문제