【我的青春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的开源软件》
还有——

《我的算法竞赛不可能这么可爱》

本期到此结束!

posted @ 2025-04-23 13:24  elainafan  阅读(21)  评论(0)    收藏  举报