頁:
[1]
猜數字!如何用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> 就 rand 然後 迴圈 去比較使用者輸入的答案
這種CODE 都不會太難 本帖最後由 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> 如果是想練習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> 說到 C++ 的奇技淫巧
有沒有大大要用 TMP 或是 Policy Based Design 之類的東西刻一個猜數字出來? XDD
或是用 class 間的繼承關係來當作流程控制之類的?
不要叫我寫,我不會 XDDD<br><br><br><br><br><div></div> 什麼啊
"首先要處理使用者輸入,讓他不能輸入不是數字的字元,用一個while加上regex應該可已解決,雖然還沒有用過的C++11的regex,但我想因該不是問題。"
ASCII code 不是就能解決了? coal511464 發表於 2017-5-20 02:06 PM static/image/common/back.gif
什麼啊
"首先要處理使用者輸入,讓他不能輸入不是數字的字元,用一個while加上regex應該可已解決,雖然還 ...
輸入是utf8,這老師有規定{:31:} 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]