美文网首页
Golang小项目-算数测验

Golang小项目-算数测验

作者: c4a1d989518e | 来源:发表于2018-03-14 15:01 被阅读32次

问题描述

在命令行界面,给出12道数学加法算数题(这12道数学题目来自于problems.csv这个文件),最后12道题目做完,能够给出最后最终的得分,实验最终实现的效果如下图。

关键技能点

csv文件读取,命令行参数解析,字典

该项目下有两个文件



在main.go文件中,全部的实现代码如下

package main

import (
    "bufio"
    "encoding/csv"
    "flag"
    "fmt"
    "log"
    "os"
    "strings"
    "time"
)

var (
    //加一个定时,如果30秒内没有答题,就报告超时
    //关于flag的用法详见  http://www.cppblog.com/kenkao/archive/2017/06/21/215013.html
    // set flags
    csvPath = flag.String("csv", "problems.csv", "a csv file in the format of 'question,answer'")
    limit   = flag.Int("limit", 30, "the time limit for the quiz in seconds'")
)

func main() {
    //通过调用flag.Parse()来进行对命令行参数的解析
    // parse the flags
    flag.Parse()

    // open the csv file
    file, err := os.Open(*csvPath)
    if err != nil {
        log.Println(err)
        return
    }
    defer file.Close()

    // open the csv file
    csvReader := csv.NewReader(file)
    // parse the csv file
    csvData, err := csvReader.ReadAll()
    if err != nil {
        log.Println(err)
        return
    }

    // put question/answer pairs into a map where questions are keys and answers are values
    //map这里会把读取的东西转换为字典,for循环中_这里替换的是key,也就是序号1234
    qaPair := make(map[string]string, len(csvData))
    for _, data := range csvData {
        qaPair[data[0]] = data[1]
    }

    // create a ticker for the time limit and a channel to signal the user finished the quiz
    ticker := time.NewTicker(time.Second * time.Duration(*limit))
    done := make(chan bool)

    // create a scanner for user input
    scanner := bufio.NewScanner(os.Stdin)

    var userAnswer string
    qNum, numCorrect := 0, 0
    go func() {
        // iteration order for maps in go is randomized so the questions won't be in the same order every time
        for question, answer := range qaPair {
            qNum++
            // ask a question
            fmt.Printf("Problem #%d: %s = ", qNum, question)
            // get an answer
            scanner.Scan()
            userAnswer = scanner.Text()
            // trim leading and trailing whitespace
            //TrimSpace的作用就是去除空格等符号
            userAnswer = strings.TrimSpace(userAnswer)
            userAnswer = strings.ToLower(userAnswer)
            answer = strings.ToLower(answer)
            // check the answer
            if answer == userAnswer {
                numCorrect++
            }
        }
        done <- true
    }()

    // select chooses the first channel with an available value
    // if done is available first, the user finished
    // if ticker is available first, the time limit has been reached
    select {
    case <-done:
    case <-ticker.C:
        fmt.Println("time's up!")
    }

    // print the results
    fmt.Printf("You scored %d out of %d.\n", numCorrect, len(qaPair))
}

参考链接:
Quiz Game

相关文章

  • Golang小项目-算数测验

    问题描述 在命令行界面,给出12道数学加法算数题(这12道数学题目来自于problems.csv这个文件),最后1...

  • 2019-02-27

    golang学习图 golang创建项目goland创建项目

  • docker+jenkins+github实现golang项目自

    本文jenkins部署golang项目流程 jenkins服务拉取github上的项目 构建golang项目并生成...

  • 小测验

    文 | 望之 如果你希望1小时速成,那么我建议你可以去看看别的文章。 下载文末链接中的文件,并打开全屏运行。试试你...

  • 小测验

    2020年10月29日 星期四 阴 日记(890) 上周六,女儿所在的班级进行了一次测验,只考了五门功课。周末下午...

  • 小测验

    三年二班开始测试了 题目非常的难考试时间只有30分钟 天天和淘气咬着笔想了半天才答上来一道题但还是踩着点完成了 淑...

  • 小测验

    明天有个小测验,是对近期培训的一个小总结。虽然是个小测验,但是上面说要利用这次测验筛选一些人,明眼人都知道要干什么...

  • 测验长度-写在浙江高考英语赋权加分事件之后

    测验长度,其实就是试卷长度,千万不要误解为实际的物理长度,测验长度(testlength)是指测验项目(题目...

  • golang应用快速搭建框架jotnar

    golang应用快速搭建框架jotnar 博客/golang jotnar 是一个golang项目快速搭建的框架,...

  • 工具与文章收集

    golang开源项目速查表 goland快捷键 在线画图工具 leetcode golang中文文档 golang...

网友评论

      本文标题:Golang小项目-算数测验

      本文链接:https://www.haomeiwen.com/subject/dbnqxftx.html