【我的青春coding物语果然有问题!】23年第二次上机补题
呀哈喽!大概十几个小时没见到米娜桑咯
我们直接看题,最近感觉还是蛮累的
不想多说话
01:编程填空:第i字节
描述
规定一个int型整数从低位到高位的四个字节编号分别是0,1,2,3。给出一个int表示范围内的正整数x,输出其第i个字节所表示的整数值。
#include <iostream>
using namespace std;
int getByte(int x, int i){
return
// 在此处补充你的代码
;
}
int main(){
int n;
cin >> n;
while(n--){
int x, i;
cin >> x >> i;
cout << getByte(x, i) << endl;
}
return 0;
}
输入
第一行是整数n(n < 100),表示有n个正整数要处理。
接下来的n行,每行输入一组x和i,x是int范围内的正整数, i表示要取x的第i个字节的整数值,0 <= i <= 3。
输出
对每组数据,输出其第i个字节所表示的整数值。
样例输入
3
1 0
256 1
512 1
样例输出
1
1
2
Solution
其实这道题不是我们这学期学的内容 估计两年前到现在的内容也有点变化
不过人家还以为这门课是十几年都没变内容的清朝老课的说 毕竟魔兽大作业确实有十几年了
好吧 我们做OI题还是要用到这玩意
是什么呢? 位运算
看代码就知道了 还有 0xff指的是 $ (11111111)_2 $
#include <iostream>
using namespace std;
int getByte(int x, int i){
return (x>>i*8)&0xff;
// 在此处补充你的代码
;
}
int main(){
int n;
cin >> n;
while(n--){
int x, i;
cin >> x >> i;
cout << getByte(x, i) << endl;
}
return 0;
}
02:编程填空:两种计数
描述
填写代码,使输出结果为
0
2
1
11
7
11
4
3
#include <iostream>
using namespace std;
class Counter {
private:
static int nGlobalNumber;
int nLocalNumber;
public:
// 在此处补充你的代码
void add(int n) { nLocalNumber += n; }
void PrintLocalNumber(){
cout << nLocalNumber << endl;
}
static void PrintGlobalNumber() {
cout << nGlobalNumber << endl;
}
};
int Counter::nGlobalNumber = 0;
int main()
{
Counter::PrintGlobalNumber();
Counter b1, b2;
Counter::PrintGlobalNumber();
b1.PrintLocalNumber();
b2.add(10);
b2.PrintLocalNumber();
Counter* b3 = new Counter(7);
b3->PrintLocalNumber();
Counter b4 = b2;
b4.PrintLocalNumber();
Counter::PrintGlobalNumber();
if (b3 != NULL)
{
delete b3;
b3 = NULL;
}
Counter::PrintGlobalNumber();
return 0;
}
输入
-
输出
0
2
1
11
7
11
4
3
样例输入
-
样例输出
0
2
1
11
7
11
4
3
Solution
其实这道题我们的上机也有,但是为什么我要写?
因为当时我的处理方法有点太蠢了
之前我们通过将默认构造函数设置成:
Counter(){
nGlobalNumber++;
if(nGlobalNumber==2) nLocalNumber=1;
else nLocalNumber=nGlobalNumber;
}
但其实完全没有必要,因为b1,b2都是调用默认构造函数生成的,而nLocalNumber不一定要跟nGlobalNumber有关系啊!
所以,只需要在默认构造函数中把nLocalNumber赋值为1就可以了
下面看代码:
#include <iostream>
using namespace std;
class Counter {
private:
static int nGlobalNumber;
int nLocalNumber;
public:
Counter(){
nGlobalNumber++;
nLocalNumber=1;
}
Counter(int x){
nLocalNumber=x;
nGlobalNumber++;
}
Counter(Counter &s){
nLocalNumber=s.nLocalNumber;
nGlobalNumber++;
}
~Counter(){
nGlobalNumber--;
}
// 在此处补充你的代码
void add(int n) { nLocalNumber += n; }
void PrintLocalNumber(){
cout << nLocalNumber << endl;
}
static void PrintGlobalNumber() {
cout << nGlobalNumber << endl;
}
};
int Counter::nGlobalNumber = 0;
int main()
{
Counter::PrintGlobalNumber();
Counter b1, b2;
Counter::PrintGlobalNumber();
b1.PrintLocalNumber();
b2.add(10);
b2.PrintLocalNumber();
Counter* b3 = new Counter(7);
b3->PrintLocalNumber();
Counter b4 = b2;
b4.PrintLocalNumber();
Counter::PrintGlobalNumber();
if (b3 != NULL)
{
delete b3;
b3 = NULL;
}
Counter::PrintGlobalNumber();
system("pause");
return 0;
}
08:编程填空:a+b+c问题
描述
完善代码,使其能够按照指定方式输出
#include <iostream>
using namespace std;
// 在此处补充你的代码
int main() {
int t;
cin >> t;
while (t --){
int aa, bb, cc;
cin >> aa >> bb >> cc;
A a(aa);
B b(bb);
C c(cc);
A* x = &a;
A* y = &b;
A* z = &c;
cout << (x->get_value() + y->get_value() + z->get_value()) << " ";
cout << ((*x) + y + z)->get_value() << endl;
}
return 0;
}
输入
第一行是数据组数t
每组数据1行,为三个整数 a 和 b 和 c
输出
对每组数据,输出 a+b+c,连续输出两次中间空格隔开。(数据保证结果在int范围内)
每组数据输出占一行
样例输入
3
1 2 3
1 2 4
6 6 6
样例输出
6 6
7 7
18 18
Solution
其实,我看了我一个多月前写的那篇
确实感觉没写清楚
现在来看这道题有更深的理解,我就重新讲一遍吧
首先,我们看到x,y,z是分别用A* 类型指向的A,B,C类变量 这说明B,C必然是A的派生类,并且get_value()这个函数应该是属于A类的
然后,我们现在已经学到了解指针这个东西 我们看倒数第四行 *x是x的解指针 释出一个A类
所以我们想啊 这个加号应该重载成什么呢?
它是一个A+A*类 说明我们应该返回一个A类 因为后面的z还是A*类
然后,前面的括号就返回了一个A类,我们知道,A类是不能用->这个运算符的
所以我们还需要重载->这个运算符
这个运算符的重载有一些特殊的地方
一般的->是返回一个指针的对象 我们知道
但是 通常的重载是如下面所示:
A* operator->(){
return this;
}
也就是返回当前对象的指针,但是,->不能返回指针类对象,所以它会再次进行->操作(这是->操作的特殊规则)
下面看代码:
#include <iostream>
using namespace std;
class A{
private:
int value;
public:
A(int x):value(x) { }
int get_value(){
return value;
}
A* operator->(){
return this;
}
A operator+(A* x){
return value+x->get_value();
}
};
class B:public A{
private:
int value;
public:
B(int x):A(x){
value=x;
}
};
class C:public B{
private:
int value;
public:
C(int x):B(x){
value=x;
}
};
// 在此处补充你的代码
int main() {
int t;
cin >> t;
while (t --){
int aa, bb, cc;
cin >> aa >> bb >> cc;
A a(aa);
B b(bb);
C c(cc);
A* x = &a;
A* y = &b;
A* z = &c;
cout << (x->get_value() + y->get_value() + z->get_value()) << " ";
cout << ((*x) + y + z)->get_value() << endl;
}
system("pause");
return 0;
}
后半学期,也请各位继续关注:
《我的青春线代物语果然有问题》
《高数女主养成计划》
《程设の旅》
《青春猪头少年不会梦到多智能体吃豆人》
《某Linux的开源软件》
还有——
《我的算法竞赛不可能这么可爱》
本期到此结束!

浙公网安备 33010602011771号