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 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
QT之C++和QML混合程式設計學習筆記
QML中使用C++物件 建立一個測試用的C++物件 #ifndef PIECHART_H #define PIECHART_H #include <QtQuick/QQuickPaintedItem> #include <QColor> #include <