2017-08-23 9 views
5

मैं एक ही गणित सीखने के कार्यक्रम को प्रोग्रामिंग करके गणित और हास्केल सीखने की कोशिश कर रहा हूं। यादृच्छिक संख्या जनरेट कर रहा हैक्यों प्रोग्राम प्रवाह नियंत्रण यादृच्छिक रूप से निष्पादित करता है

  1. :

    यह द्वारा शुरू होता है।

  2. उन नंबरों को फ़िल्टर करने के लिए एक आसान समस्या बनाने के लिए फ़िल्टर करता है।
  3. प्रदर्शन सवाल तो, यह मेरे प्रतिक्रिया देने के लिए दोनों मेरा उत्तर और एक अन्य समारोह के लिए सही जवाब हाथ मेरा उत्तर
  4. अन्त में ले (एक "बधाई" --or-- "क्षमा करें, सही जवाब खाली है । क्या मैं इसे करने की उम्मीद

    1. यह (मुख्य रिटर्न है जो:)

    किसी कारण से, बधाई समारोह समाप्त होने के बाद, यह बेतरतीब ढंग से चयन करने के लिए है जहां वह अगले चला जाता है, लगता है या तो करो)

  5. या यादृच्छिक लूप पर यह तुरंत गणित परीक्षण फ़ंक्शन पर जाएगा। जब ऐसा होता है, तो ऊपर से चरण 2 नहीं होता है और मुझे प्रश्न में आंशिक संख्याएं मिलती हैं। फिर यह इस चरण को दोहरा सकता है या मुख्य पर वापस जा सकता है।

समस्या को डीबग करने का प्रयास करते समय मैं केवल रिटर्न को मारता रहता हूं और यह अलग-अलग समय पर होता है। मैंने कुछ डीबग 'प्रिंट' कथन भी जोड़े हैं।

यहां कार्यक्रम से 3 फ़ंक्शन हैं। ध्यान दें कि मुख्य कॉल funPercentOfNumberToAnother:

funPercentOfNumberToAnother :: IO() 
funPercentOfNumberToAnother = do 
    (percentDec, percentStr) <- getPercent 
    ofNum <- getDecimal (200 :: Decimal) 
    let isNum = percentDec * ofNum 
    if uglyAnswers ([ofNum, isNum], [percentDec]) 
     then do 
      putStrLn ("ofNum: " ++ show ofNum) 
      putStrLn ("isNum: " ++ show isNum) 
      putStrLn "___________________________" 
      funPercentOfNumberToAnother 
     else do 
      putStrLn ("ofNum: " ++ show ofNum) 
      putStrLn ("isNum: " ++ show isNum) 
      putStrLn "Percents" 
    -- putStrLn "\n\n" 
    putStrLn (show isNum ++ " is what percent of " ++ show ofNum ++ "?\n") 
    putStr "> " 
    ans <- getLine 
    submitStringAnswer (ans, percentStr ++ "%") 

submitStringAnswer :: (String, String) -> IO() 
submitStringAnswer (myAns, correctAns) = do 
    if myAns == correctAns 
     then putStrLn "Congratz!" 
     else do 
      putStrLn ("Sorry the correct answer is: " ++ show correctAns) 
    pause 


pause :: IO() 
pause = do 
    x <- getLine 
    putStrLn "" 

यहां मेरा डीबग आउटपुट है। ध्यान दें कि यह केवल अंशकालिक संख्या देता है जब यह विराम समाप्त होने के तुरंत बाद मुख्य पर वापस नहीं आता है।

 __ __  _ _       _ _   
    | \/ | __ _| |_| |__ ___ _ __ ___ __ _| |_(_) ___ ___ 
    | |\/| |/ _` | __| '_ \/_ \ '_ ` _ \/_` | __| |/ __/ __| 
    | | | | (_| | |_| | | | __/ | | | | | (_| | |_| | (__\__ 
    |_| |_|\__,_|\__|_| |_|\___|_| |_| |_|\__,_|\__|_|\___|___/ 

1.) Learn Math 
2.) Math Lookup 
3.) Quit Excolo 

1 
ofNum: 35 
isNum: 15.75 
___________________________ 
ofNum: 120 
isNum: 102 
Percents 
102 is what percent of 120? 

> 
Sorry the correct answer is: "85%" 


15.75 is what percent of 35? 

> 
Sorry the correct answer is: "45%" 



    __ __  _ _       _ _   
    | \/ | __ _| |_| |__ ___ _ __ ___ __ _| |_(_) ___ ___ 
    | |\/| |/ _` | __| '_ \/_ \ '_ ` _ \/_` | __| |/ __/ __| 
    | | | | (_| | |_| | | | __/ | | | | | (_| | |_| | (__\__ 
    |_| |_|\__,_|\__|_| |_|\___|_| |_| |_|\__,_|\__|_|\___|___/ 

1.) Learn Math 
2.) Math Lookup 
3.) Quit Excolo 

1 
ofNum: 80 
isNum: 44 
Percents 
44 is what percent of 80? 

> 
Sorry the correct answer is: "55%" 



    __ __  _ _       _ _   
    | \/ | __ _| |_| |__ ___ _ __ ___ __ _| |_(_) ___ ___ 
    | |\/| |/ _` | __| '_ \/_ \ '_ ` _ \/_` | __| |/ __/ __| 
    | | | | (_| | |_| | | | __/ | | | | | (_| | |_| | (__\__ 
    |_| |_|\__,_|\__|_| |_|\___|_| |_| |_|\__,_|\__|_|\___|___/ 

1.) Learn Math 
2.) Math Lookup 
3.) Quit Excolo 

1 
ofNum: 15 
isNum: 2.25 
___________________________ 
ofNum: 60 
isNum: 0.6 
___________________________ 
ofNum: 40 
isNum: 30 
Percents 
30 is what percent of 40? 

> 
Sorry the correct answer is: "75%" 


0.6 is what percent of 60? 

> 
Sorry the correct answer is: "1%" 


2.25 is what percent of 15? 

> 
Sorry the correct answer is: "15%" 

यदि यह मदद करता है, केवल बात यह है कि दूर से प्रासंगिक है कि मैं अब तक मिल गया है है: Second of several forked processes does not run in Haskell

आखिरकार, मैं मोनाड्स के प्रवेश स्तर पर सही हूं यदि यह आपके उत्तर को तैयार करने में मदद करता है।

मैं किसी भी मदद किसी को क्या हो रहा है, id est, क्यों यह समाप्त होता है ठहराव के बाद मुख्य के लिए सीधे लौटने नहीं कर रहा है के रूप में दे सकते हैं की सराहना करते हैं, और क्यों यह आंशिक संख्या फिल्टर छोड़ जाएगा।

धन्यवाद ^^

उत्तर

7

funPercentOfNumberToAnother में, आप इस खंड है:

if uglyAnswers ([ofNum, isNum], [percentDec]) 
    then do 
     putStrLn ("ofNum: " ++ show ofNum) 
     putStrLn ("isNum: " ++ show isNum) 
     putStrLn "___________________________" 
     funPercentOfNumberToAnother 
    else do 
     putStrLn ("ofNum: " ++ show ofNum) 
     putStrLn ("isNum: " ++ show isNum) 
     putStrLn "Percents" 

आपका आशय वापस समारोह की शुरुआत करने के लिए जाना और फिर से प्रारंभ, यदि संख्या बदसूरत हैं करने के लिए है; या अन्यथा उपयोगकर्ता को संख्या दिखाने के साथ जारी रखें। यह तब तक काम करता है जब तक यह जाता है, लेकिन खुद से पूछें ... if खंड के अंत में क्या होता है?then या else शाखा में मौजूद सामग्री को बिना किसी then या else निष्पादित किया जाता है, इस पर ध्यान दिए बिना सामान निष्पादित किया जाता है।

तो, जब आपको कुछ बदसूरत संख्या मिलती है, तो आप एक रिकर्सिव कॉल शुरू करते हैं जो बेहतर संख्याओं की तलाश करता है और उन्हें प्रदर्शित करता है। फिर जब वह रिकर्सिव कॉल समाप्त हो जाता है, तो आप उपयोगकर्ता को मूल, बदसूरत संख्याओं को दिखाने के लिए आगे बढ़ते हैं!

आपको यहां एक अलग नियंत्रण प्रवाह की आवश्यकता होगी, जैसे एक ऐसा फ़ंक्शन लिखना जो हमेशा एक गैर-बदसूरत संख्या देता है, और उसके बाद केवल अपने (अब गैर-पुनरावर्ती) funPercentOfNumberToAnother फ़ंक्शन में इसका उपयोग कर रहा है। या आप के else भाग में उपयोगकर्ता के नंबरों को दिखाते हुए भाग के बाकी हिस्सों को खींच सकते हैं, ताकि आप बदसूरत संख्याओं के लिए ऐसा न करें।

0

अमलोय के महान स्पष्टीकरण के अनुसार मुझे समझ में आया कि क्या हो रहा था और तय किया गया था, फिर इस मुद्दे का परीक्षण किया। की अगर बयान के बाहर कोड होने से:

if uglyAnswers 
    then funPercentOfNumberToAnother 
    else ... 

वजह से बुरा जवाब बाद में उनके रास्ते नीचे बनाने के लिए जब प्रत्यावर्तन बंद कर दिया। इसलिए अनिवार्य रूप से मैं उन पर भंडार कर रहा था।

शायद यह इसे बेहतर समझा सकता है। देखें कि मुझे पहली कोशिश पर एक साफ जवाब मिला है, इसलिए इसे रिकर्सन के माध्यम से जाना नहीं था। दूसरी जाने के लिए वहाँ दो कॉल थे क्योंकि पहली कॉल एक भिन्नात्मक जवाब मिला:

funPercentOfNumberToAnother :: IO() 
funPercentOfNumberToAnother = do 
    (percentDec, percentStr) <- getPercent 
    ofNum <- getDecimal (200 :: Decimal) 
    let isNum = percentDec * ofNum 
    if uglyAnswers ([ofNum, isNum], [percentDec]) 
     then funPercentOfNumberToAnother 
     else do 
      let message = show isNum ++ " is what percent of " ++ show ofNum ++ "?\n" 
      testProblem (percentStr ++ "%", message) 


testProblem :: (String, String) -> IO() 
testProblem (correctAns, message) = do 
    putStrLn message 
    putStrLn "\n\n" 
    putStr "> " 
    myAns <- getLine 
    if myAns == correctAns 
     then putStrLn "Congratz!" 
     else do 
      putStrLn ("Sorry the correct answer is: " ++ show correctAns) 
    pause 
:

 __ __  _ _       _ _   
    | \/ | __ _| |_| |__ ___ _ __ ___ __ _| |_(_) ___ ___ 
    | |\/| |/ _` | __| '_ \/_ \ '_ ` _ \/_` | __| |/ __/ __| 
    | | | | (_| | |_| | | | __/ | | | | | (_| | |_| | (__\__ 
    |_| |_|\__,_|\__|_| |_|\___|_| |_| |_|\__,_|\__|_|\___|___/ 

1.) Learn Math 
2.) Math Lookup 
3.) Quit Excolo 

1 
In the else statement 
=================================== 
Finally outside the else statement 
ofNum: 10 
isNum: 4 

    __ __  _ _       _ _   
    | \/ | __ _| |_| |__ ___ _ __ ___ __ _| |_(_) ___ ___ 
    | |\/| |/ _` | __| '_ \/_ \ '_ ` _ \/_` | __| |/ __/ __| 
    | | | | (_| | |_| | | | __/ | | | | | (_| | |_| | (__\__ 
    |_| |_|\__,_|\__|_| |_|\___|_| |_| |_|\__,_|\__|_|\___|___/ 

1.) Learn Math 
2.) Math Lookup 
3.) Quit Excolo 

1 
Bad answer alert! 
=================================== 
In the else statement 
=================================== 
Finally outside the else statement 
ofNum: 160 
isNum: 80 
=================================== 
Finally outside the else statement 
ofNum: 55 
isNum: 0.55 

यहाँ मूल प्रश्न से व्यावहारिक कोड के टुकड़े है

संबंधित मुद्दे