【问题标题】:Is there any flush(stdin) like in C++ to clear the buffer in F#?是否有类似 C++ 中的刷新(stdin)来清除 F# 中的缓冲区?
【发布时间】:2021-10-23 12:59:08
【问题描述】:

目前我正在学习一种新的程序语言,即 F#。现在,我正在做一个关于食品订购系统的项目。而且,我目前遇到的一个问题是,当我完成所有订购后,系统会提示“您要继续购买吗?”。然后我输入与条件相关的小y和大Y,但系统直接给我“感谢您的购买”,然后按任意键继续声明。有没有人有任何想法来处理这个问题?谢谢,谢谢。

open System

let menu()=
        printfn "---------------------------------------"
        printfn "        Food ordering system"
        printfn "---------------------------------------"
        printfn "1. ORDER FOOD "
        printfn "2. ORDER DRINK"   
        Console.Write("Enter your selection : ")


let loop()=
       Console.Write("Do you want to continue pruchase?:")

let choice=Console.ReadLine()
if(choice="y"||choice="Y")then
    menu()

let food()=

printfn "\n1.MCD CHICKEN RM 10 \n2.FILET-O-FISH RM 13 \n3.FRENCH FRIES RM 5 \n4.APPLE PIE RM 4"

Console.Write("\nEnter food code that you want :")
let option=Console.ReadLine()
Console.Write("How many you want :")
let qty=Console.ReadLine()

if(option = "1")then
    let price = 10
    let total = int qty*int price
    Console.Write("\nThe price for {0} set MCD CHICKEN ",qty)
    Console.Write("is RM {0} \n",total)
    loop()
    Console.Write("\nThank you for your purchase ")
elif(option = "2")then
    let price = 13
    let total = int qty*int price
    Console.Write("\nThe price for {0} set FILET-O-FISH ",qty)
    Console.Write("is RM {0} \n",total)
    loop()
    Console.Write("\nThank you for your purchase ")
elif(option = "3")then
    let price = 5
    let total = int qty*int price
    Console.Write("\nThe price for {0} FRENCH FRIES ",qty)
    Console.Write("is RM {0} \n",total)
    loop()
    Console.Write("\nThank you for your purchase ")
elif(option = "4")then
    let price = 4
    let total = int qty*int price
    Console.Write("\nThe price for {0} APPLE PIE ",qty)
    Console.Write("is RM {0} \n",total)
    loop()
    Console.Write("\nThank you for your purchase ")
else
    printfn "Invalid input"
    menu()

let drink()=

printfn "\n1.ICE BLENDED CHOCOLATE MEDIUM RM 8 \n2.MANGO PEACH RM 11 \n3.PEPSI RM 4 \n4.ICE LEMON TEA RM 4"
Console.Write("\nEnter beverage code that you want :")
let option=Console.ReadLine()
Console.Write("How many you want :")
let qty=Console.ReadLine()

if(option = "1")then
    let price = 8
    let total = int qty*int price
    Console.Write("\nThe price for {0} ICE BLENDED CHOCOLATE MEDIUM ",qty)
    Console.Write("is RM {0} \n",total)

    loop()
elif(option = "2")then
    let price = 11
    let total = int qty*int price
    Console.Write("\nThe price for {0} MANGO PEACH ",qty)
    Console.Write("is RM {0} \n",total)
    loop()
    Console.Write("\nThank you for your purchase ")
elif(option = "3")then
    let price = 4
    let total = int qty*int price
    Console.Write("\nThe price for {0} PEPSI ",qty)
    Console.Write("is RM {0} \n",total)
    loop()
    Console.Write("\nThank you for your purchase ")
elif(option = "4")then
    let price = 4
    let total = int qty*int price
    Console.Write("\nThe price for {0} ICE LEMON TEA ",qty)
    Console.Write("is RM {0} \n",total)
    loop()
    Console.Write("\nThank you for your purchase ")
else
    printfn "Invalid input"
    menu()


let main()=

menu()
let selection=Console.ReadLine()
if(selection = "1") then
    food()
else
    drink()

main()

【问题讨论】:

    标签: debugging compiler-errors f#


    【解决方案1】:

    这不是刷新缓冲区的问题。您正在从loop 调用menu,但在继续之前没有等待用户输入。

    解决此问题的一种方法是将ReadLine 调用移动到menu,但您最终会从menu 递归调用fooddrink,而这已经从loop 调用在fooddrink 内。这会创建可能不是您真正想要的嵌套控制流。

    我建议重新考虑设计,以便不同级别之间的依赖关系清晰。每个函数都应该返回一个由其调用函数使用的值,而不是包含返回菜单的循环。

    【讨论】:

    • 哦,好吧,我会调查的。谢谢~
    【解决方案2】:

    说实话,这段代码在很多方面都过于命令式和非惯用的 F#。

    我谦虚地建议您将此代码发布到 https://codereview.stackexchange.com/ 并在那里进行代码审查以从中学习。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多