公牛和母牛競猜遊戲《c++程式設計原理與實踐》第5章習題12,13
原題目:
程式隨機生成4個 0到 9之間的整數,作為神祕數字。玩家通過反覆的猜測找到這4個數。並且要求先後順序也要正確,數值和位置都正確是公牛,數值正確,位置不對是母牛。
例如:神祕數字是 1234 ,而玩家猜測的是 1355,程式的反饋結果是“一頭公牛 一頭母牛”。
通過網上的資料追加要求:如果相同的母牛重複出現多次只能算一個母牛,不能重複計次。
例如:神祕數字是 1234 ,玩家猜測的是 2222,程式的反饋是“一頭公牛 一頭母牛”,而不是“一頭公牛 三頭母牛”。
解題思路:
1,為了方便玩家對4個數字的輸入,可以把數字儲存為字串型別,這樣數字輸入時中間不用留空格,能一次性對4個數字全部讀取。
2,公牛和母牛很容易辨別,關鍵是相同的母牛多次出現只能計一次,不能重複計次。
3,為了避免相同母牛的重複計次,只需要在確定該數值是母牛後,把神祕數字裡面與該值相同的數遮蔽掉,這樣下次再遇到這個數值時就會跳過,不會重複計次了。
4,遮蔽時為了不改變其它數值的位置,可以把該值設定為0到9以外的任意一個字元(我設為一個空格)。
5,第3,4步修改的不能是神祕數字的原資料,因為這樣會對公牛的確認造成麻煩,所以要有一個神祕數字的複本,確認母牛時和神祕數字的複本比較,確認公牛時直接和原資料比較。
特別提醒:本程式碼只是簡單的暴力求解,不含任何演算法,不含任何特殊的資料結構。因為我是新手,網上那些什麼雜湊表等方法,我都是看不懂的。
程式碼如下:
執行結果:#include<iostream> #include<string> #include<vector> #include<algorithm> #include<stdexcept> #include<ctime> #include<cstdlib> #include<cstdio> #include<limits> using namespace std; int get_niu(string secret,string guess) //計算公牛和母牛數量的函式 { int ox,cow; ox=cow=0; string c; c=secret; for(int i=0; i<4; i++) { if(guess[i]==secret[i]) //和secret字串比較,來確定公牛 ox++; else { for(int n=0; n<4; n++) //不是公牛就和secret的複本c比較,來確定是否是母牛 { if(guess[i]== c[n]) //如果是母牛,則母牛數量+1,並且再次遇到這個值時跳過檢測 { cow++; c[n]=' '; for(int j=n+1; j<4; j++) if(c[j]==guess[i]) c[j]=' '; break; } } } } if(ox==4) cout<<"\n4頭公牛\n"; else cout<<endl<<ox<< "頭公牛 "<<cow<< "頭母牛\n"; return ox; } int main() { cout<<"\t\t公牛和母牛\n\n"; srand(time(NULL)); //置隨機數種子 cout<< "輸入任意字元開始遊戲,q退出\n"; char n; while(cin>>n) { cin.ignore(numeric_limits<streamsize>::max(),'\n'); //清空輸入行 if(n=='q') return 0; string secret; for(int i=0; i<4; i++) //設定4個隨機數 並存儲為secret字串 secret+= char(rand()%10+48); cout<<"顯示本局的神祕數字,便於除錯程式\n"; cout<<"神祕數字為:"<<secret<<"\n\n"; cout<< "是哪4個數?請輸入(數字之間不要空格):"; string guess; while(1) { cin>>guess; cin.clear(); //清除cin的錯誤標記 cin.sync(); //清空輸入緩衝區 if(guess.size()!=4) { cout<< "長度不對,請重新輸入(4個數字之間不留空格):"; continue; } if(get_niu(secret,guess)==4) break; cout<< "再猜(數字之間不要空格):"; } cout<< "\n恭喜你全部猜中!輸入任意字元開始下一局,q退出\n"; } }
新知識總結:
1,cin.clear() 清空 cin 的錯誤標記
cin.ignore(numeric_limits<streamsize>::max(),'\n') 清空輸入行
cin.sync() 清空輸入緩衝區
2,引數為向量的函式宣告: void abc(vector<int>& a,vector<char>& b)
引用時格式: abc(a,b) 其中a,b為向量。
3,string abc abc就是一個空字串
abc= "Hello world"
string efg
efg= abc efg內容是“Hello world” ,在不改變 efg 資料的時候,efg 指向的記憶體地址和 abc 記憶體地址相同 (淺複製)
只有在改變efg 資料時,才會真正複製abc 的內容到新的 記憶體地址,不改變abc原資料。
4,random(n) 取隨機數 範圍:0到 n-1 之間
random(m,n) 取隨機數 範圍:m 到 n-1 之間 ,需要編譯器支援C++11 標準。
相關推薦
公牛和母牛競猜遊戲《c++程式設計原理與實踐》第5章習題12,13
原題目: 程式隨機生成4個 0到 9之間的整數,作為神祕數字。玩家通過反覆的猜測找到這4個數。並且要求先後順序也要正確,數值和位置都正確是公牛,數值正確,位置不對是母牛。 例如:神祕數字是 1234 ,而玩家猜測的是 1355,程式的反饋結果是“一頭公牛 一頭母牛”。 通過
c++程式設計 原理與實踐 第一章、
c++程式設計 原理與實踐 第一章 沒有重要內容 第二章 hello word 2.2 cout發音see-out 輸出操作符<< 2.3 原始碼字尾 .cpp 目的碼字尾.obj 第一個程式 #include #include #include #i
《C++程式設計原理與實踐》第九章習題12答案
《C++程式設計原理與實踐》第九章習題12要改寫Date類,類實現不是用年月日的方法而是用距1970年1月1日的天數來實現。當時感到有點棘手,就搜尋了網上別人的實現方法,我看人實現還是保留了年月日,我覺得這違背了作者的本意。所以還是硬著頭皮自己寫。其實也不難,只是有一個小技巧
《C++程式設計原理與實踐》部分習題答案 3
8.2 #include <iostream> #include <string> #include <vector> using namespace std; void print(string& s,vector<
【備忘】C++程式設計原理與實踐 PDF下載
作者簡介:Bjarne Stroustrup,英國劍橋大學電腦科學博士,C++的設計者和*初的實現者。他現在是德州農工大學電腦科學首席教授。1993年,由於在C++領域的重大貢獻,他獲得了ACM的Grace Murray Hopper大獎併成為ACM院士。在進入學術界之前,
面向介面程式設計原理與實踐
## 面向介面程式設計原理 “基於介面而非實現程式設計”這條原則的英文描述是:“Program to an interface, not an implementation”。我們理解這條原則的時候,千萬不要一開始就與具體的程式語言掛鉤,侷限在程式語言的“介面”語法中(比如 Java 中的 interfac
C primer plus 學習筆記 第5章
第5章 運算子、表示式和語句 5.1 一個例子 5.2 基本運算子 (operator) 5.2.1 賦值運算子:不一樣的 = :和數學的=不同, C語言的=不是相等 而是賦值。 在C語言如果要比較是否相等,用 == 。 bmw = 2004 是將 2004 賦值給bmw
Java程式設計思想學習(五)----第5章:初始化與清理
隨著計算機革命的發展,“不安全”的程式設計方式已逐漸成為程式設計代價高昂的主因之一。 C++引入了構造囂(constructor)的概念,這是一個在建立物件時被自動呼叫的特殊方法。Java中也採用了構造器,並額外提供了“垃圾回收器”。對於不再使用的記憶體資源,垃圾回收器能自動將其釋放。 5.1 用構造器確
python程式設計從入門到實踐第三章習題答案
3.1-3.2names = ['zhichao' , 'yujie' , 'yifei'] for name in names: print( name.title() + " , good night.") 3.3transportation = ['car'
《NLP漢語自然語言處理原理與實踐》第一章
一.基本知識 規則派還是統計派: 1.規則派:以語言學理論為基礎,根據語言學家對語言現象的認識,採用規則形式描述或解釋歧義行為或歧義特性。規則派首先要對大量的語言現象進行研究,歸納出一系列的語言規則。然後再形成一套複雜的規則集----語言分析或生產系統,對自然語言進行分析處
【讀書筆記-從Paxos到ZooKeeper分散式一致性原理與實踐】第二章 一致性協議
2PC與 3PC 在分散式系統中,每個節點都明確知道自己事務操作的成功或失敗,但無法獲取其他分散式節點的操作結果。因此當一個事務需要跨節點進行事務操作時,需要引入協調者(Coordinator)元件來統一排程所有分散式節點的執行邏輯,這些被排程的節點稱為參與者
新書《OpenShift雲原生架構:原理與實踐》第一章第三節:企業級PaaS平臺OpenShift
近十年來,資訊科技領域在經歷一場技術大變革,這場變革正將我們由傳統IT架構及其所支撐的臃腫應用系統時代,遷移至雲原生架構及其所支撐的敏捷應用系統時代。在這場變革中,新技術的出現、更新和淘汰之迅速,以及新技術的架構整合度、複雜度之高,都是前所未有的。從虛擬化到雲端計算,從虛擬機器到容器,從微服
有符號數和無符號數------c++程序設計原理與實踐(進階篇)
效果 進階 str 二進制位 bsp () 都是 有符號 重新 有符號數與無符號數的程序設計原則: 當需要表示數值時,使用有符號數(如 int)。 當需要表示位集合時,使用無符號數(如unsigned int)。 有符號數和無符號數混合運算有可能會帶來災難性的後果。例如
編譯原理SLR(1)文法的C++實現(基於SLR(1)分析法的語法制導翻譯及中間程式碼生成程式設計原理與實現)
程式功能描述完成以下描述賦值語句 SLR(1)文法語法制導生成中間程式碼四元式的過程。G[A]:A→V=EE→E+T∣E-T∣TT→T*F∣T/F∣FF→(E)∣iV→i[設計說明] 終結符號i為使用者定義的簡單變數,即識別符號的定義。[設計要求](1)構造文法的SLR(1)
【C++程式設計練習】任意給定 n 個有序整數,求這 n 個有序整數序列的最大值,中位數和最小值
題目來源 CCF模擬試題>>小中大>>201903-1 題目描述 老師給了你n個整陣列成的測量資
編碼原則實例------c++程序設計原理與實踐(進階篇)
組類型 運算 奇怪 head 不能 gui 簡單的 版本 布局 編碼原則: 一般原則 預處理原則 命名和布局原則 類原則 函數和表達式原則 硬實時原則 關鍵系統原則 (硬實時原則、關鍵系統原則僅用於硬實時和關鍵系統程序設計) (嚴格原則都用一個大寫字母R及其編號標識,而
動態內存分配存在的問題(內存空洞)------c++程序設計原理與實踐(進階篇)
我們 程序 動態 height ++ idt 很多 alt 空間 new的問題究竟在哪裏呢?實際上問題出在new和delete的結合使用上。考察下面程序中內存分配和釋放過程: while(1){ Big* p=new big; //...... Smal
數值限制------c++程序設計原理與實踐(進階篇)
c++程序 its positive size true 設置 malle 設計原理 硬件 每種c++的實現都在<limits>、<climits>、<limits.h>和<float.h>中指明了內置類型的屬性,因此程序
實現求解線性方程(矩陣、高斯消去法)------c++程序設計原理與實踐(進階篇)
ipy 類型 cat sys sca solution gaussian 拷貝 img 步驟: 其中A是一個n*n的系數方陣 向量x和b分別是未知數和常量向量: 這個系統可能有0個、1個或者無窮多個解,這取決於系數矩陣A和向量b。求解線性系統的方法有很多,這裏使用一種經典
(c++11)隨機數------c++程序設計原理與實踐(進階篇)
ber linear 而在 希望 double 元素 light eal 區間 隨機數既是一個實用工具,也是一個數學問題,它高度復雜,這與它在現實世界中的重要性是相匹配的。在此我們只討論隨機數哦最基本的內容,這些內容可用於簡單的測試和仿真。在<random>