1. 程式人生 > >2017 程式設計實習之C++部分作業題彙總

2017 程式設計實習之C++部分作業題彙總

1、C01:看上去好坑的運算子過載

總時間限制: 1000ms 記憶體限制: 65536kB
描述
程式填空

#include <iostream> 
using namespace std;
class MyInt 
{ 
    int nVal; 
    public: 
    MyInt( int n) { nVal = n ;}
// 在此處補充你的程式碼
    MyInt& operator-(int n)
    {
        nVal -= n;
        return *this;
    }
    operator int()
    {
        return
nVal; } // end of my code }; int Inc(int n) { return n + 1; } int main () { //分析main函式的執行過程: //1.int型為引數的有參建構函式,已實現 //2.過載以int為引數的"-"運算子,由於修改了nVal,所以返回值是自身,返回值型別為類引用 //3.Inc的引數為int,而objInt為類物件,需要過載型別轉換運算子 int n; while(cin >>n) { MyInt objInt(n); objInt-2
-1-3; cout << Inc(objInt); cout <<","; objInt-2-1; cout << Inc(objInt) << endl; } return 0; }

輸入
多組資料,每組一行,整數n
輸出
對每組資料,輸出一行,包括兩個整數, n-5和n - 8
樣例輸入
20
30
樣例輸出
15,12
25,22
來源
Guo Wei

2、C02:驚呆!Point竟然能這樣輸入輸出

總時間限制: 1000ms 記憶體限制: 65536kB
描述
程式填空

#include <iostream> 
using namespace std;
class Point { 
    private: 
        int x; 
        int y; 
    public: 
        Point() { };
// 在此處補充你的程式碼
    friend istream & operator>>(istream & is, Point &rhs)
    {
        is >> rhs.x >> rhs.y;
        return is;
    }
    friend ostream & operator<<(ostream & os, const Point &rhs)
    {
        os << rhs.x << "," << rhs.y;
        return os;
    }
// end of my code
}; 
int main() 
{ 
    //分析main函式的執行過程:
    //1.無參建構函式,已實現
    //2.過載引數為類物件的>>運算子
    //3.過載引數為類物件的<<運算子
    //Note:istream和ostream類的物件,建構函式均為private,不能自定義流物件
    //運算子<<和運算子>>的過載一律宣告為友元函式,引數型別和返回值的型別均為流物件的引用
    Point p;
    while(cin >> p) {
        cout << p << endl;
     }
    return 0;
}

輸入
多組資料,每組兩個整數
輸出
對每組資料,輸出一行,就是輸入的兩個整數
樣例輸入
2 3
4 5
樣例輸出
2,3
4,5
來源
Guo Wei

3、C03:第四周程式填空題3

總時間限制: 1000ms 記憶體限制: 65536kB
描述
寫一個二維陣列類 Array2,使得下面程式的輸出結果是:

0,1,2,3,

4,5,6,7,

8,9,10,11,

next

0,1,2,3,

4,5,6,7,

8,9,10,11,

程式:

#include <iostream>
#include <cstring>
using namespace std;

class Array2 {
// 在此處補充你的程式碼
private:
    int row;
    int col;
    int size_;
    int *pInt;
public:
    Array2(int r = 0, int c = 0) :row(r), col(c), size_(r*c) 
    { 
        if (size_ == 0)
            pInt = nullptr;
        else
            pInt = new int[size_]; 
    }
    Array2 & operator=(const Array2 & rhs)
    {
        if (this == &rhs)
            return *this;
        row = rhs.row;
        col = rhs.col;
        size_ = rhs.size_;
        if (size_ == 0)
            pInt = nullptr;
        else
        {
            pInt = new int[size_];
            memcpy(pInt, rhs.pInt, size_ * sizeof(int));
        }       
        return *this;
    }
    int * operator[](int n)
    {
        return pInt + n * col;
    }
    int operator()(int i, int j)
    {
        return *(pInt + i * col + j);
    }
// end of my code
};

int main() {
    //分析main函式的執行過程:
    //1.引數為兩個int型的有參建構函式,指明瞭row和col
    //開闢了一塊記憶體空間,有成員int* ptr,用size記錄需要申請空間的大小
    //2.a[i][j]可以作為左值被賦值,類過載了運算子[],返回int*,
    //第二個[]是內部型別的解析,不用理會
    //3.a(i,j)得到了a[i][j],類過載了引數為兩個int型的運算子(),返回值為int
    //4.Array2 b,需要無參建構函式,需要初始化各個成員變數,可以併到有參建構函式     
    //5.b = a,需要過載賦值運算子函式
    Array2 a(3,4);
    int i,j;
    for(  i = 0;i < 3; ++i )
        for(  j = 0; j < 4; j ++ )
            a[i][j] = i * 4 + j;
    for(  i = 0;i < 3; ++i ) {
        for(  j = 0; j < 4; j ++ ) {
            cout << a(i,j) << ",";
        }
        cout << endl;
    }
    cout << "next" << endl;
    Array2 b;     b = a;
    for(  i = 0;i < 3; ++i ) {
        for(  j = 0; j < 4; j ++ ) {
            cout << b[i][j] << ",";
        }
        cout << endl;
    }
    return 0;
}

4、C04:別叫,這個大整數已經很簡化了!

總時間限制: 1000ms 記憶體限制: 65536kB
描述
程式填空,輸出指定結果

#include <iostream> 
#include <cstring> 
#include <cstdlib> 
#include <cstdio> 
using namespace std;
const int MAX = 110; 
class CHugeInt {
// 在此處補充你的程式碼
//核心功能為+運算,需要低位對齊,帶進位地向高位計算,int與char * 均按每一位的值逆序儲存
//儲存運算元的位數,在輸出的時候需要用到
//s最多為200位,如果按實際位數分配,那麼在實際的+操作時,可能需要比較運算元的位數...等額外的判別
//所以一律固定申請的位數為200+,用length代表實際位數,用空間換取一些邏輯上的簡化
//Note:空間大小固定,逆序儲存,儲存位數
private:
    int *ptr;
    int length;
public:
    CHugeInt(const char *pstr)
    {
        length = strlen(pstr);
        ptr = new int[210];
        memset(ptr, 0, 210 * sizeof(int));
        for (int i = 0; i < length; ++i)
            *(ptr + i) = *(pstr + length - 1 - i) - '0';
    }
    CHugeInt(int n)
    {
        ptr = new int[210];
        memset(ptr, 0, 210 * sizeof(int));
        int i = 0;
        while (n)
        {
            *(ptr + i) = n % 10;
            n /= 10;
            ++i;
        }
        length = i;
    }
    CHugeInt(const CHugeInt & rhs) //copy constructor
    {
        length = rhs.length;
        ptr = new int[210];
        memset(ptr, 0, 210 * sizeof(int));
        memcpy(ptr, rhs.ptr,210*sizeof(int));
    }
    //為了支援+=,++這種改變了自身狀態的操作,需要過載賦值運算子
    //由於涉及pointer,淺複製會double free,需要自定義深複製的操作
    CHugeInt & operator=(const CHugeInt & rhs)
    {
        if (this == &rhs)
            return *this;
        length = rhs.length;
        memcpy(ptr, rhs.ptr, 210 * sizeof(int));
        return *this;
    }
    CHugeInt & operator +=(const int &n)
    {
        //思路是委託函式CHugeInt operator+(const CHugeInt & x, const int & y)執行
        //再委託operator+(const CHugeInt & x, const CHugeInt & y)執行
        return *this = *this + n;
    }
    //核心功能bolck,由於3個加法函式又是過載關係,又是委託關係,都設定為友元函式
    friend CHugeInt operator+(const CHugeInt & x, const CHugeInt & y)
    {
        CHugeInt temp(0);//operarator + 返回一個CHugeInt類的物件
        //temp作為儲存和的物件,兩個運算元非負,其長度至少為兩個加數中較大的那個
        //加法執行完畢之後可能還需依進位增加其長度
        temp.length = x.length > y.length ? x.length : y.length;
        //這裡體現出申請的是int型空間的優越性,一輪完成加法,暫不處理進位
        //若是申請的char型的空間,想要表示10到18這9個溢位的加法標誌就有些折騰了
        //用空間換邏輯性
        for (int i = 0; i < temp.length; ++i)
            *(temp.ptr + i) = *(x.ptr + i) + *(y.ptr + i);
        for (int i = 0; i < temp.length; ++i)
        {
            if (*(temp.ptr + i)>=10)
            {
                *(temp.ptr + i) -= 10;
                *(temp.ptr + i + 1) += 1;
            }               
        }
        //最高位有進位,更新加法結果的位數
        if (*(temp.ptr + temp.length) == 1)
            ++temp.length;
        //return call copy constructor
        return temp;
    }
    //下面的兩個形式,核心思路都是用引數構造臨時物件,委託核心模組完成功能
    friend CHugeInt operator+(const int & x, const CHugeInt & y)
    {
        CHugeInt temp(x);
        return temp + y;
    }
    friend CHugeInt operator+(const CHugeInt & x, const int & y)
    {
        CHugeInt temp(y);
        return x + temp;
    }
    //下面的兩個形式,核心思路都是通過構造臨時物件,委託核心模組完成功能
    //不同點在於:後置++,返回+完成之後的物件
    //前置++,以示區別,過載形式多了個int型的引數,返回+完成之前的物件
    CHugeInt operator++()
    {
        return *this = *this + CHugeInt(1);
    }
    CHugeInt operator++(int)
    {
        CHugeInt temp(*this);
        *this = temp + CHugeInt(1);
        return temp;
    }
    //過載<<運算子,因為按位逆序儲存,輸出時從有效儲存空間的尾部一直輸出到起始位置
    friend ostream & operator<<(ostream & os, const CHugeInt & rhs)
    {
        for (int i = rhs.length - 1; i >= 0; --i)
            cout << *(rhs.ptr + i);
        return os;
    }
    ~CHugeInt()
    {
        delete []ptr;
    }
// end of my code
};
int  main() 
{ 
    //分析main函式的執行過程:
    // 1.CHugeInt a(s),CHugeInt b(n)說明需要引數型別為int和char*的建構函式
    // 2.根據3個加法表示式,需要過載+運算子,有3種不同形式的過載形式,為了委託都設定為友元函式
    //    2.1 a + b 需要過載引數為分別為CHugeInt型,CHugeInt型
    //    2.2 n + a 需要過載引數為分別為int型,CHugeInt型,委託2.1中的函式執行
    //    2.3 a + n 需要過載引數為分別為CHugeInt型,int型的運算子+,委託2.1中的函式執行
    // 3. 需要過載+=運算子,同樣可以複用+運算子
    // 4. 需要過載兩種形式的++運算子
    // 5. 需要過載引數為CHugeInt型的<<運算子
    // EX:根據運算型別,需要複製建構函式,過載賦值運算子
    char s[210];
    int n;

    while (cin >> s >> n) {
        CHugeInt a(s);
        CHugeInt b(n);

        cout << a + b << endl;
        cout << n + a << endl;
        cout << a + n << endl;
        b += n;
        cout  << ++ b << endl;
        cout << b++ << endl;
        cout << b << endl;
    }
    return 0;
}

輸入
多組資料,每組資料是兩個非負整數s和 n。s最多可能200位, n用int能表示
輸出
對每組資料,輸出6行,內容分別是:
樣例輸入
99999999999999999999999999888888888888888812345678901234567789 12
6 6
樣例輸出
99999999999999999999999999888888888888888812345678901234567801
99999999999999999999999999888888888888888812345678901234567801
99999999999999999999999999888888888888888812345678901234567801
25
25
26
12
12
12
13
13
14
來源
Guo Wei

相關推薦

2017 程式設計實習C++部分作業題彙總

1、C01:看上去好坑的運算子過載 總時間限制: 1000ms 記憶體限制: 65536kB 描述 程式填空 #include <iostream> using namespace std; class MyInt {

我們程式設計 C++學習手冊v0.1

我們程式設計吧 之 cpp 學習手冊 * Version 0.1 * 轉義字元的使用 參考程式escape_char.cpp typedef與#define 的區別 typedef的用法 typedef常用來定義一個識別符號及關鍵字的別名,它

程式設計實習STL專項練習

#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <string> #include <sstream> using

程式設計哲學 C# 篇:007——如何創造萬物

上帝擁有建立萬物的能力,本文介紹創造萬物的道,讓你也擁有上帝般創造萬物的能力! 道 中國哲學家,道家學派創始人——老子,在《道德經》寫到: 道生一,一生二,二生三,三生萬物 那麼,是什麼 道 可以創造萬物? 古希臘的哲學家們曾做過這樣的推理: 如果將水、沙子、肉無限切分,最後得到的將是相同的不可分的顆粒

Winform/C#入門程式設計第二部分常用控制元件(九:進度條控制元件ProgressBar)

簡介:         介紹進度條控制元件ProgressBar。常用於上傳、下載等,來體現進度。給使用者提示當前執行的進度,防止被認為介面卡主或宕機。   介紹: 1.屬性 常用屬性

Winform/C#入門程式設計第二部分常用控制元件(八:列表控制元件ListBox)

簡介:         介紹列表控制元件ListBox。常用於日誌的顯示。   介紹: 1.屬性 常用屬性 Name 獲取或設定控制元件的名稱。 Ho

Winform/C#入門程式設計第二部分常用控制元件(七:數字顯示框控制元件NumericUpDown)

簡介:         介紹數字顯示框控制元件NumericUpDown。一般用在跟數字有關的顯示中。當是純數字時,可以優先使用此控制元件,而不是編輯框控制元件TextBox。   介紹: 1.屬性 常用屬性

Winform/C#入門程式設計第二部分常用控制元件(六:標籤控制元件Label)

簡介:         介紹標籤控制元件Label。一般單獨或者配合編輯框控制元件等使用,用作提示或解釋等。   介紹: 1.屬性 常用屬性 Name 獲取或設定控制元件的名稱

Winform/C#入門程式設計第二部分常用控制元件(五:單選框控制元件RadioButton)

簡介:         介紹單選框控制元件RadioButton。當多個 RadioButton 控制元件出現時,使使用者能夠從一組選項中選擇一個選項。   介紹: 1.屬性 常用屬性

Winform/C#入門程式設計第二部分常用控制元件(四:複選框控制元件CheckBox)

簡介:         介紹複選框控制元件CheckBox。常用在某些功能的是否啟用判斷。   介紹: 1.屬性 常用屬性 Name 獲取或設定控制元件的名稱。

Winform/C#入門程式設計第二部分常用控制元件(三:組合框控制元件ComboBox)

簡介:         介紹組合框控制元件ComboBox。   介紹: 1.屬性 常用屬性 Name 獲取或設定控制元件的名稱。 Text

Winform/C#入門程式設計第二部分常用控制元件(十:圖片控制元件PictureBox)

簡介:         介紹圖片控制元件PictureBox。常用於相機影象的採集顯示。   介紹: 1.屬性 常用屬性 Name 獲取或設定控制元件的名稱。

網易2017年暑期實習程式設計趕去公司

趕去公司 題目描述: 終於到週末啦!小易走在市區的街道上準備找朋友聚會,突然伺服器發來警報,小易需要立即回公司修復這個緊急bug。假設市區是一個無限大的區域,每條街道假設座標是(X,Y),小易當前在(0,0)街道,辦公室在(gx,gy)街道上。小易周圍有多個計程車打車點,小易趕去辦公室有兩種選擇

程式設計實習【從C走進C++】

函式指標 基本概念 程式執行期間,每個函式都會佔用一 段連續的記憶體空間。而函式名就是該函式所 佔記憶體區域的起始地址(也稱“入口地址”)。 我們可以將函式的入口地址賦給一個指標變 量,使該指標變數指向該函式。然後通過指 針變數就可以呼叫這個函式。

嵌入式Linux C程式設計學習路(二)——常用命令彙總1

一、使用者管理類命令 1:格式:useradd [選項] 使用者名稱 useradd kkkw   -新增名字為kkkw的使用者,當用戶建立成功後,會在/home/ 目錄下生成與使用者名稱同名的目錄 [root@loc home]# useradd kkkw [roo

2017 計蒜道 初賽 第五場 C. UCloud 的安全秘鑰(中等)

移動 如果 space -m 變化 安全 ont con esp 暴力。 $O(m*n)$的算法可以通過此題,每次詢問$O(m)$掃S數組,統計不同數字的個數,每次移動最多只會變化兩個數字,如果不同數字個數為$0$,那麽答案加$1$。 #include <io

C++ Primer 5th(中文版)》“概覽的概覽”第一部分——C++基礎,第二章

常量 隱藏 默認值 基礎 ons int 整數 構造 基於 C++ Primer已經快讀完了,但這本書光讀一遍是絕對不行的。至少讀兩遍,把大部分可操作的習題做一遍,才能記住大部分細節。在這裏,我想對C++第一部分——C++基礎進行一次非常非常非常簡略但結合核心部分的整合,帶

C++ traits程式設計技法__type_traits

//以下是鋪墊,__type_trivial的作用在後面,下面是一些概念性介紹。  __type_trivial  雙底線字首,表示是SGI STL以外的東西,不在STL標準範圍之內。 __type_trivial負責萃取型別(Type)的特性,究竟是什麼特性呢? &

C語言嵌入式系統程式設計修煉

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

QTC++和QML混合程式設計學習筆記

QML中使用C++物件 建立一個測試用的C++物件 #ifndef PIECHART_H #define PIECHART_H #include <QtQuick/QQuickPaintedItem> #include <QColor> #include <