【我的青春coding物语果然有问题!】23年第一次上机补题
今天开始刷往年上机题
为什么是上机题?因为作业题大部分是一样的
上机题反而有几题有差别
甚至还有某些题目需要完整输入输出
下面看题目:
02:编程填空:输出指定结果一
描述
填写代码,使输出结果为
2
2
8
10
#include <iostream>
using namespace std;
class Number {
public:
int num;
Number(int n): num(n) {
}
// 在此处补充你的代码
};
int main() {
Number a(2);
Number b = a;
cout << a.value() << endl;
cout << b.value() << endl;
a.value() = 8;
cout << a.value() << endl;
a+b;
cout << a.value() << endl;
return 0;
}
输入
不需要输入。
输出
使输出结果为
2
2
8
10
样例输入
不需要输入。
样例输出
2
2
8
10
Solution
本题其实跟我们上机的第一次题目是重合的
那么,为什么我要讲?当然是因为我忘了()
从题目的报错来看 我们这里需要重载一个+运算符,然后要重载一下这个value函数
一开始我就在想 这个a.value()=8是怎么来的,后面想了有点久才发现是用int& 函数类型,返回一个拷贝,这样就可以直接改了
下面看代码:
#include <iostream>
using namespace std;
class Number {
public:
int num;
Number(int n): num(n) {
}
int& value(){
return num;
}
Number &operator+(const Number &b){
num+=b.num;
return *this;
}
};
int main() {
Number a(2);
Number b = a;
cout << a.value() << endl;
cout << b.value() << endl;
a.value() = 8;
cout << a.value() << endl;
a+b;
cout << a.value() << endl;
return 0;
}
09:编程填空:简单的对象
描述
程序填空,使得程序输出:
2
1
1
0
#include <iostream>
using namespace std;
class A
{
static int num;
public:
A(){num+=1;}
void func()
{
cout<< num <<endl;
}
// 在此处补充你的代码
};
int A::num=1;
int main()
{
A a1;
const A a2 = a1;
A & a3 = a1;
const A & a4 = a1;
a1.func();
a2.func();
a3.func();
a4.func();
return 0;
}
输入
无
输出
2
1
1
0
样例输入
None
样例输出
2
1
1
0
Solution
这也是我们第一次上机的题目
上次我们确实还在打野拳,没有讲清楚原理,只讲了思维
那么,这次我来介绍一下这个是怎么想到的
对常对象a2,a4来说,它们只能调用常成员函数(这点很重要),所以,我们需要重载一个func函数为常成员函数,并且减了二说明只有这个函数被调用的时候静态变量减一(哦还有,常成员函数只能不能修改非静态成员变量),就完事了
#include <iostream>
using namespace std;
class A
{
static int num;
public:
A(){num+=1;}
void func()
{
cout<< num <<endl;
}
void func()const{
num--;
cout<<num<<endl;
}
};
int A::num=1;
int main()
{
A a1;
const A a2 = a1;
A & a3 = a1;
const A & a4 = a1;
a1.func();
a2.func();
a3.func();
a4.func();
return 0;
}
10:编程填空:三生三世
描述
近年来,国内电视剧吸引了越来越多的关注;有的以当红的演员阵容而吸引观众,比如《三生三世十里桃花》(Life After Life,Blooms Over Blooms);有的以贴近时代的剧情而备受关注,比如《人民的名义》(In the Name of People);有的则以精湛的演技赢得观众的喜欢,比如《大明王朝:1566》(Ming Dynasty: 1566)。
你的任务是根据电视剧的不同属性(演员、剧情和演技)对电视剧进行排行。
#include<iostream>
#include<cstring>
#include<list>
#include<algorithm>
using namespace std;
class TV_Drama{
public:
char name[100];
int actor;
int story;
int acting_skill;
// 在此处补充你的代码
int main(){
list<TV_Drama> lst;
int n;
cin>>n;
char _name[100];
int _actor, _story, _acting_skill;
for (int i=0; i<n; i++){
cin.ignore();
cin.getline(_name,100);
cin>>_actor>>_story>>_acting_skill;
lst.push_back(TV_Drama(_name, _actor, _story, _acting_skill));
}
lst.sort();
for_each(lst.begin(), lst.end(), Printer);
cout<<endl;
lst.sort(comparator_1);
for_each(lst.begin(), lst.end(), Printer);
cout<<endl;
lst.sort(comparator_2());
for_each(lst.begin(), lst.end(), Printer);
cout<<endl;
return 0;
}
输入
首先输入整数n,代表电视剧的个数。接下来,对于每个电视剧有两行输入:第一行一个字符串(可能含有空格,逗号,冒号等标点符号)作为电视剧的名字;第二行包括三个整数,分别为演员阵容、剧情和演技的评分。
输出
输出包括三行,分别为电视剧按演员阵容、剧情和演技的排行榜(评分由高到低),电视剧名字之间以分号隔开
样例输入
3
In the Name of People
98 97 99
Life After Life, Blooms Over Blooms
99 82 73
Ming Dynasty: 1566
97 100 100
样例输出
Life After Life, Blooms Over Blooms;In the Name of People;Ming Dynasty: 1566;
Ming Dynasty: 1566;In the Name of People;Life After Life, Blooms Over Blooms;
Ming Dynasty: 1566;In the Name of People;Life After Life, Blooms Over Blooms;
Solution
这题倒是没出过 但是难度有点太大了的说
也是瞎搞搞出来的
首先,题目给了我们一个list 很容易看出,我们要写出comparator_1,Printer,comparator_2这三个东西
然后,几个坑点来了:
1.在给name这个字符数组赋值的时候,如果它是字符串类型,要在所有字符后多一个'\0'
2.我们可以看到,第一个comparator_1是没有括号的,说明这是一个单纯的指示函数,而第二个是有括号的,这是新知识,说明这里需要创建一个临时函数对象,来完成我们的排序,所以真正的comparator_2()应该是一个类,并且重载了一个()当成函数用(哇!),这种我们称为反函数
3.默认的list.sort()拿去排序是会报错的,而且报错很奇怪,是因为list是一个TV_Drama类的链表,需要重载一下<这个运算符
下面看代码:
#include<iostream>
#include<cstring>
#include<list>
#include<algorithm>
using namespace std;
class TV_Drama{
public:
char name[100];
int actor;
int story;
int acting_skill;
int flag;
TV_Drama(string s,int a,int b,int c):actor(a),story(b),acting_skill(c){
int l=s.length();
for(int i=0;i<=l-1;i++){
name[i]=s[i];
}
name[l]='\0';
flag=1;
}
bool operator<(const TV_Drama &s){
return actor>s.actor;
}
};
bool comparator_1(TV_Drama x,TV_Drama y){
return x.story>y.story;
}
void Printer(TV_Drama x){
cout<<x.name<<';';
return ;
}
class comparator_2 {
public:
bool operator()(const TV_Drama& a, const TV_Drama& b) const {
return a.acting_skill > b.acting_skill;
}
};
// 在此处补充你的代码
int main(){
list<TV_Drama> lst;
int n;
cin>>n;
char _name[100];
int _actor, _story, _acting_skill;
for (int i=0; i<n; i++){
cin.ignore();
cin.getline(_name,100);
cin>>_actor>>_story>>_acting_skill;
lst.push_back(TV_Drama(_name, _actor, _story, _acting_skill));
}
lst.sort();
for_each(lst.begin(), lst.end(), Printer);
cout<<endl;
lst.sort(comparator_1);
for_each(lst.begin(), lst.end(), Printer);
cout<<endl;
lst.sort(comparator_2());
for_each(lst.begin(), lst.end(), Printer);
cout<<endl;
system("pause");
return 0;
}
接下来每天做一份上机 还会补题
所以更新会比较频繁
P.S:今天发现树洞的默认背景是英梨梨,图片名写的是“平成著名画师”,当时没多想就换上春物的了
今天意识到了赶紧换回来,毕竟谁能拒绝一个金发双马尾傲娇青梅竹马的天才本子画师败犬呢,前几届开发的学长也是有心夹带私货了
对不起长官,刚才没有认出您
后半学期,也请各位继续关注:
《我的青春线代物语果然有问题》
《高数女主养成计划》
《程设の旅》
《青春猪头少年不会梦到多智能体吃豆人》
《某Linux的开源软件》
还有——
《我的算法竞赛不可能这么可爱》
本期到此结束!

浙公网安备 33010602011771号