1. 程式人生 > >公牛和母牛競猜遊戲《c++程式設計原理與實踐》第5章習題12,13

公牛和母牛競猜遊戲《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習題1213

原題目: 程式隨機生成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>