查看完整版本: 猜數字!如何用C++寫出來?
頁: [1]

weirdococo 發表於 2017-3-29 07:20 PM

猜數字!如何用C++寫出來?

本帖最後由 weirdococo 於 2017-3-29 08:14 PM 編輯

最近學校再教C++,出了個作業,然後我用perl寫了一次如下,

#!/usr/bin/env perl6
use v6;

my $howManyShouldPick = { repeat { $_ = prompt("要猜幾個數字,也就是說要生成幾個亂數") } until $_ ~~ /^ \d+ $/; $_ }.();
my @randPick =  ^10 .roll($howManyShouldPick);
my $inputString;
my $countForHowManyTimes = 0;

"猜數字,有 $howManyShouldPick 個數字(每一個範圍是0 .. 9)".say;
repeat {
    repeat { $inputString = prompt("請輸入 $howManyShouldPick 個數字,不能多不能少") } until $inputString ~~ /^ \d ** {$howManyShouldPick} $/;
    $inputString = $inputString.split("",:skip-empty).map({ $_.Int }).cache;
    say qq:to/END/;
    你答的次數有 { ++ $countForHowManyTimes } 次
    你答對的元素有 { ($inputString.Bag ∩ @randPick.Bag).values.sum } 個
    你答對的順序有 { [+] (@$inputString «==» @randPick) } 個
    END
}
until  [&&] (@$inputString «==» @randPick) ;


"你答對了,恭喜".say;     

其實我可以想辦法把上面的東西全部用C++照寫一次,但我想要了解C++想事情的方法!
畢竟C++有比較豐富友善的語法(照老師的說法,其他語在語法概念少於C++,像是perl有只有regex可以和C++比而已)!
那這題用C++怎麼寫呢?(提外話,現在perl開始要做javascript backend,期待哪一天C++也有javascript backend,這樣就不用學會javascript了!)


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

coal511464 發表於 2017-3-30 07:30 PM

就 rand 然後 迴圈 去比較使用者輸入的答案
這種CODE 都不會太難

weirdococo 發表於 2017-3-30 08:24 PM

本帖最後由 weirdococo 於 2017-3-30 08:37 PM 編輯

coal511464 發表於 2017-3-30 07:30 PM static/image/common/back.gif
就 rand 然後 迴圈 去比較使用者輸入的答案
這種CODE 都不會太難
我C++也只學了半個學期,所以想法因該很差,
先說我看到這題想的解題藍圖,
首先要處理使用者輸入,讓他不能輸入不是數字的字元,用一個while加上regex應該可已解決,雖然還沒有用過的C++11的regex,但我想因該不是問題。
再來就是要把比對使用者輸入和程式自己產生的集合,不知道C++98或C++11裏面的set是不是我想的集合,如果是的話,那看看有沒有交集運算,如果沒有那就自己寫一個。


但是這樣還是沒有辦法做出"任意長度"的亂數,如果用rand一個一個挑放在array中,那還是要決定長度,又不想用malloc,目前卡在這邊,而且我覺得這樣解題和C或用perl都一樣,沒有C++的味道的感覺!...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ren1244 發表於 2017-3-31 12:13 AM

如果是想練習C++特性的話,可以用class來做這題。
也就是說,做一個GaussNumber物件出來。
可以先定義出我們要的功能在 gauss.h 中:
#ifndef GAUSSNUMBER
#define GAUSSNUMBER

#include <string>
#define GAUSS_MAXLENGTH 6

class GaussNumber
{
private:
    int N; //數字長度(允許區間:)
    int count; //已猜次數
    char num; //亂數產生的數字放這邊
public:
    //建構函數
    GaussNumber(int n=4);
   
    //操作
    void reset(); //重置遊戲狀態
    void gauss(std::string& g,int &A,int &B); //猜數字,將結果存在A跟B
   
    //查詢資料
    int getGaussCount(); //回傳已猜次數
    int getLength(); //回傳猜數字長度
};
#endif然後主程式  main.cpp 就可以這樣寫:
#include <iostream>
#include "Gauss.h"

int main()
{
    int howManyShouldPick,A,B;
    std::cout<<"How many:";
    std::cin>>howManyShouldPick;
    GaussNumber G(howManyShouldPick);
    std::string myGauss;
    if(G.getLength()<0)
    {
        std::cout<<"Error";
        return 0;
    }
    do
    {
        std::cout<<"Gauss("<<G.getGaussCount()+1<<")";
        std::cin>>myGauss;
        G.gauss(myGauss,A,B);
        std::cout<<A<<'A'<<B<<"B\n";
    }while(A<howManyShouldPick);
    return 0;
}最後我們還需要把 gauss.h 中的內容實作出來
寫在 gauss.cpp 中:(這邊細節就由您來完成了)
#include "Gauss.h"
#include <cstdlib>

GaussNumber::GaussNumber(int n)
{
    //建構函數,檢查正確的 n 值,儲存在 N 後初始化
}
void GaussNumber::reset()
{
    //將 count 重置
    //重新取亂數
}
void GaussNumber::gauss(std::string& g,int &A,int &B)
{
    //根據輸入的資料 g 判斷有幾 A 幾 B
}
int GaussNumber::getGaussCount()
{
    return count;
}
int GaussNumber::getLength()
{
    return N;
}



...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

CoNsTaRwU 發表於 2017-4-4 02:00 AM

說到 C++ 的奇技淫巧
有沒有大大要用 TMP 或是 Policy Based Design 之類的東西刻一個猜數字出來? XDD
或是用 class 間的繼承關係來當作流程控制之類的?
不要叫我寫,我不會 XDDD<br><br><br><br><br><div></div>

coal511464 發表於 2017-5-20 02:06 PM

什麼啊

"首先要處理使用者輸入,讓他不能輸入不是數字的字元,用一個while加上regex應該可已解決,雖然還沒有用過的C++11的regex,但我想因該不是問題。"

ASCII code 不是就能解決了?

weirdococo 發表於 2017-5-20 11:55 PM

coal511464 發表於 2017-5-20 02:06 PM static/image/common/back.gif
什麼啊

"首先要處理使用者輸入,讓他不能輸入不是數字的字元,用一個while加上regex應該可已解決,雖然還 ...

輸入是utf8,這老師有規定{:31:}

o_g349 發表於 2017-9-14 01:24 PM

weirdococo 發表於 2017-3-30 08:24 PM static/image/common/back.gif
我C++也只學了半個學期,所以想法因該很差,
先說我看到這題想的解題藍圖,
首先要處理使用者輸入,讓他不 ...

你指的 C++ 的味道是甚麼意思,演算法沒改變要怎麼不一樣?用 C++ 寫大致上就是你說的那樣,其他作法也只是把部份使用的 C++ 功能換成別的而已...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁: [1]