Fork me on GitHub

小城过客

我住在龙眠河畔。

下游的水变得细长清澈,那些没有水流过的地方就长出了丰茂的野草。清晨走过这里,看见当地的人们用那河水洗菜,看见白鹭捕食河里的小鱼。龙眠河被誉为桐城人的母亲河,由是可窥见一些。

走到中游和下游交界的位置,有一座古色古香的长桥。走近,发现桥上坐满了人,有卖菜的,有下棋的,有打牌的,有闲聊吹风的,甚至还有剪头发的……在这样的地方你最能感受到人间烟火气。

六尺巷实在平平无奇,但有了那一段故事,便觉得别有一番风趣了。

“张文端公居宅旁有隙地,与吴氏邻,吴氏越用之。家人驰书于都,公批书于后寄归。家人得书,遂撤让三尺,故六尺巷遂以为名焉。”
书曰:“千里家书只为墙,让他三尺又何妨。长城万里今犹存,不见当年秦始皇”。

她的外婆家离这很近。似乎,她的外婆家就在附近的一条小巷子里,而院子里有一棵很大的树,可以给整座宅院提供阴凉。我已记不清当时是如何描述的了。

印象里,老太太家里也有一棵大树。老宅院早已变成了光鲜亮丽的新房,那些我曾经度过的夏天也终于无迹可寻。今年年初,老太太也走了。

文庙的瓦有着历史的痕迹,但墙壁却是新刷的漆。

文庙里有座状元桥,在过去只有取得功名的举子才能从这里走过,其他人都要绕泮池而行。桐城是文都,在过去文化是很昌盛的,出过不少文人,也不乏拜相的人才。六尺巷故事里的张英的儿子张廷玉就做过清朝内阁首辅。

在近代,桐城中学也出过很多有名的大家,比如朱光潜。前几日,读过他的“给青年的十二封信”。印象最深的是,觉得里面最有趣的是朱光潸,不必多说,懂的人自然懂了。

文庙外面有两座极具现代化气息的博物馆建筑,但是没有开放。

这座城市处处都在施工,推土机,塔吊,水泥匠,楼房外面绿色的防护网……即使在文庙里,也能找到正在劳作的工人。

我去拜访孔城老街,绕了不少路。

上个月大雨演了这座古镇,最深的积水到达了两米。四天前,孔城老街才刚恢复开放。

原是要买票的,在门口看守的人望了望,大概是卖票的人也还没有上班,挥一挥手让我进去了。

冷清,实在冷清。没有游人,也没有商户。开门的店铺大约十一之数,有些地方还见得到大水冲刷后晾晒东西的痕迹。

斑驳的马头墙,脚下有些打滑的青砖,疯长的野草,笔记淡漠的牌匾。走了两步路,开始下起细雨。

这样的清净为我所喜。江浙一带的古镇,大多商业化气息严重,少了几分古镇的清雅,多了几分市侩。在孔城的老街,寻得了几分安宁。

在檐下躲雨,换镜头时,一时急了,卡口插不进去。一位大叔耐心地指导我,萍水相逢,颇为感动。

原来,遇上了几位中国摄影家协会的“老法师”。

中国摄影家协会是很难进的,会员大多已在摄影界有所建树,或是发表过很多作品,或者举办过个人展览,或是参与编写教材……

老街的门口摆了很多作品,在我看来,都是拍得很好的。我猜想这几位摄影家,或许就是它们的作者。

摄影最需要发现美的眼睛。寻找生活中,别人不能发现的美,这是一种浪漫。

[HDU6754] Distinct Sub-palindromes

题目:HDU6754
题意:
S是长度为n的字符串。 S由小写英文字母组成。
您的任务是计算具有最少亚种回文数的不同S的数目。 亚种回文是回文的子字符串。
如果两个子回文式u和v的长度不同或对于某些i(0≤i≤length)ui≠vi,则它们是不同的。 例如,字符串“ aaaa”仅包含四个不同的子回文,即“ a”,“ aa”,“ aaa”和“ aaaa”。

思路:
注意到,当n = 1的时候,Sub-palindrome的数目最少为1,答案为26个字母。
当n = 2的时候,aa的Sub-palindrome有a和aa,为2个;ab的Sub-palindrome有a,b,两个。(ab不是回文串)所以n = 2的时候答案是26 * 26 = 676;
当n = 3的时候,aaa的Sub-palindrome有a,aa和aaa,为3个;abc有a,b,c,三个……aba则有a,b和aba,三个……发现找不到长度为3以下的Sub-palindrome,所以答案是262626;
当n >= 4的时候,为了让Sub-palindrome的数目最少,我们可以用abc,abc,abc的方法构造。这样的构造法下,答案是262524.
“Since the answer can be huge, output it modulo 998244353.”这一行就是误导人的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
if(n <= 3)
cout << pow(26,n) << endl;
else
cout << 26 * 25 * 24 << endl;
}
return 0;
}

南京扬州游记

闲云小院

在扬州住的地方,名为闲云小院。

沿着皮市街的小巷子走百米,转三个方向,才能寻到这处藏在闹市之中的小院子。

院子虽小,五脏俱全。有一水池,游动着几只肥美的金鱼。有竹,簇拥在院子的东南角,一竹成林,在那角落里肆意地生长着。挂着几只常亮的红灯笼,在晚上便有微光。房主人爱茶,于是有茶室。大堂里摆放着古筝,红木的八仙桌和太师椅。

寻到一处清净是难得的,唯独蚊虫蚂蚁实在过多,亦是不堪其扰了。

二十四桥仍在

去瘦西湖的那一天,天气并不好。阴云密布,已不见蓝天。闷热潮湿,却也盼不到落雨。五亭桥是最惹眼的景观,乘凉倒是不错。

美自然是美的。扬州园林的精致小巧,在这里可见一斑了。

只是斧凿的痕迹重了,为我不喜。

扬大瘦西湖校区便在旁边,大学生进此处是免票的,扬州大学的学生,晚上来此漫步,岂不妙哉。

高中同桌便在扬大读书。印象里,他是一个有些腼腆而温柔的男孩。我和他都不是擅长维系关系的人,毕业之后于是联系减少了。离别多是这样的。

此去扬州,他已回家,便没能再见,也是有些可惜的。

热闹喧嚣

似乎每个城市都有这样一条仿古建筑的步行街。苏州之平江路、山塘街,北京的南锣鼓巷,成都的宽窄巷子,就连太仓都有沙溪、陆渡古镇。扬州的皮市街和东关街便是这样了。

东关街的尽头是一处高大的城门,再往外便是古运河。古运河的一段,异常狭窄,见过了之后大失所望,比之太仓的新浏河或许还要不如。然而转念一想,一条河的历史意义,难道由宽窄而决定吗?于是释然了,转而心生敬佩了。

河滩,有一位唱着民谣的流浪歌手。而他的词却与原作者有所不同。

比如赵雷的《成都》,是这样唱的“你会挽着我的衣袖,我会把手揣进裤兜”,而他是这样唱的“你会挽着他的衣袖,我会把手揣进裤兜”。

最是情字最伤人。

我们竟回到闲云小院撸串喝酒,若是房东知道了,怕是要气的七窍生烟,这几个不懂风雅的俗人!

酒未竟,心已醉。放声高歌,而四人都不在调子上,戏称“跑调合唱团”。

热闹之后,在院子里喂鱼。向后走几步,便看见月亮从屋檐上跑了出来。

扬州是赏月的好地方。


天下文枢

夫子庙是游客来南京必去的景点。南京本地的同学都说,此处商业化气息过重,十分坑人。

在一处古色古香的街道看见美特斯邦威的灯箱确实有些煞风景。(没有看不起美特斯邦威的意思,我很喜欢买他家的衣服)

然而只需花九元买一个讲解服务,忘掉那些购物,便能欣赏到夫子庙的另一面。

走进夫子庙,便了解了孔子的一生。游历诸国,讲学天下……你会发现他其实和你想的不太一样。并不是一个冥顽的老学究,他相当幽默。并不是一个文弱的书生,他身高九尺六寸(换算成今天就是2米2),孔武有力。

后人不仅神化了孔子,还把孔子的学说作为统治人民乃至奴役人民的工具。于是孔子成为封建文化的代言人,这是相当可悲的。

秦淮

夜游秦淮,秦淮两岸的灯光是精心布置的,称得上流光溢彩。水拍打着船,不知不觉心静下来了。听秦淮八艳的故事,感叹古时女子命运的悲戚。

顾横波、董小宛、卞玉京、李香君、寇白门、马湘兰、柳如是,陈圆圆。

色艺超群,德才双馨。侠肝义胆,忧国忧民。有的曾是明末将军的千金,有的做了青灯古佛的尼姑。秦淮八绝都是风尘女子,然而其民族气节比之位高权重的名门望族又如何呢?

只是不见了两岸的才子佳人,听不到了商女《后庭花》。才知道过往种种已不可寻。

人生当如鸿鹄鸟

我最爱的是站在高楼俯瞰大地。

以居高临下的角度,能用一种不同于平时的视野看这世界。《死亡诗社》中Caption就让他的学生站在讲台上看这教室,于是能有不同的感受。

我在太仓拍过夜景,蹲在群星花园二十四楼的最高层,守候着日落。也去过苏大凌云楼最高处,发现古城的夜色朦胧和金鸡湖的流光溢彩。南京的紫峰大厦,是我去过的最高处。那电梯不是以楼层,而是以高度亮灯。

288.6米,是观光层的高度。

于是玄武湖、紫金山尽收眼底。在陆地上要走很久的路,变得近如咫尺;飞驰的汽车,如同蚂蚁爬行;层叠的楼房,像是土地上生长出的钢铁植物;云雾缭绕间,隐约看到远方的长江大桥……

人生当如鸿鹄鸟,不临九天不丈夫。



田野也消失了

又是一年,回到太高,思绪已逐渐遥远。

我们也有了一些变化、正如太高也有了一些变化。可对我来说,最大的改变竟不是在太高,而是太高东面的田野上——建起了一栋栋整齐的商品房。

原本位于南郊,被戏称为乡下学校,百草丰茂,是虫豸的乐园。清晨走出宿舍时,能看见操场上款款行走的白鸟。晚上晚自习,能在一节课拍死二十只蚊子,又好事者把它们排成一列,粘在纸上,曝尸示众。倒也不觉得残忍,人向来冷酷。因为此般丰富的物种,再加上那一条流淌而过的臭水沟,又把学校呼作“生态沟”。

高一刚入学时,最喜欢趴在东面的走廊上吹风。凝望着远方,那是一个少年对于未来的全部渴望。常记得冬天的清晨六点,薄薄的淡雾,在地上只是一层,弥漫在树林和田野里。雾中,依稀见到初升的太阳,然后橙黄色的阳光渐渐晕染了水汽,那幅景象静谧而玄奇。那时我也十六岁,隐约觉得那就是“希望”。

校外的东南角有一栋孤独的老房子。不大的院墙里生长着一棵雄壮的银杏树,每至秋天,叶子落满了院落的地面,曾隔门相望,里面像是一个神秘的世界。那棵银杏树,在学校的走廊里也是能看见的。我最爱银杏的叶子。

高二高三时,田野变成了建筑工地,工程机械整日不停地轰鸣,午睡时常常不堪其扰。直到今日再回校,才发现楼盘已经紧凑地布列在那里了——那原来是田野、树林和老院落的地方。

今天的同学们,若是再像我当时那样,喜欢趴在栏杆上吹风,喜欢眺望远方,想必已经是看不到那时的风景了。

时隔一年,如历半生,恍惚间仿佛还看见自己曾经的身影。然而过去种种苦乐酸甜,已随着时间酿成了清冽的甜酒,当是能够释怀了。只有那些如囚笼般的钢铁森林,让我尤为不喜。

[codeforces 1372C] Omkar and Baseball

题目: 1372C
题意:给定一个从1~n的顺序不定的数组,定义一种排序操作:区间[L,R],操作后里面的所有数都不在原来的位置上。求几次操作可以把数组变成1,2,3,..n的顺序。
思路:
没有经过严格的论证,但是造了几个数据发现如下规律:

1.排序操作最多进行两次。
把所有在正确位置的数记为1,不正确位置的数记为0;
比如52341 (01110)
如果对于区间[1,5]排序,所有对1的操作都必须把1变成0;所有对0的操作一定可以把0变成1;
无论是怎么样的乱序,都可以通过一次操作变成全部0;
所以52341 -> 43512 (00000) (答案不唯一)
然后00000全部翻成11111,也就是12345答案。

2.位于首、尾的1可以忽略。比如12435(11001),那么12和5的位置我们就不要动了,直接对[3,4]进行操作。

我们可以在输入数据的时候就把位置正确的记为1,不正确的记为0.
然后,直接对数组进行unique去重。将得到以下几种情况。
全部为1的情况下(len == 1 && a[0] == 1),需要进行0次操作。
000001111或者111000或者1110001111,我们可以忽略首尾的1,将他们视作0000,这种情况下需要1次操作。
len>=2的情况下,进行2次操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5;
int a[MAXN];
int b[MAXN];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
if(a[i] == i+1)
{
b[i] = 1;
}else
b[i] = 0;
}
int len = unique(b,b+n) - b;
if(len == 1&&b[0]==1)
cout << 0 << endl;
else if(len == 2||(len==1&&b[0]==0))
cout << 1 << endl;
else if(len == 3)
{
if(b[0]==0)
cout << 2 << endl;
else
cout << 1 << endl;
}else
cout << 2 << endl;
}
return 0;
}

代码写的有点乱。
这大概是第一次做出DIV2的C题,虽然分数只有1500.
结果没有计算rating,失去了一个上分机会……

[苏州大学C++]2020春第三次考试,及考前三个小练习

说明:CSDN不允许上传附件,所以我不会把题目放上来。写这个博客的主要目的是为了让同校的学弟学妹们复习的时候有一个参考。当然,都是我自己写的,并不保证答案完全正确对本次考试,会简单的做一个解析。其他三次小练习,仅附上代码。有需要交流讨论、想要题目信息的同学,可以私信我。

附上我的代码。

你可能出现的问题有:
0.没有考虑钳工等级的合理区间,我也扣了4分。在代码中已经做了修改。这也是绝大部分96分同学的扣分点。
1.对于继承和派生的构造函数不知道怎么写。
2.不知道该怎么删除不合理的数据。(从后往前删的办法应该从第一次考试就考了,还不会的同学有点不应该了。)
3.不知道如何查找字符串。(你当然可以用很方便的函数来完成转化大小写和查找的效果,也可以自己写。转化大小写我是手写的,查找我用了一个函数,因为自己写会比较麻烦。但是绝对不难。)
4.排序问题。有人会写成两个cmp函数,更麻烦一点。实际上一个cmp就可以了。
5.输出的时候,不会调用父类的“<<”。子类如何调用父类的友元函数?应该使用强制类型转换。这个问题在考前小练习1中也有所涉及。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

class CWorker
{
private:
int m_ID; //工号
string m_Name; //姓名
int m_Sex; //性别 0代表女性 1代表男性
int m_Age; //年龄

public:
CWorker(int ID, string Name, int Sex, int Age)
{
if (Sex<0 || Sex>1)
{
cout<<"性别初始值"<<Sex<<"不符合要求!"<<endl;
exit(0);
}
if (Age<=0 )
{
cout<<"年龄初始值"<<Age<<"不符合要求!"<<endl;
exit(0);
}

m_ID=ID;
m_Name=Name;
m_Sex=Sex;
m_Age=Age;
}

string GetName()const
{
return m_Name;
}

int GetSex()const
{
return m_Sex;
}

int GetAge()const
{
return m_Age;
}

friend ostream& operator<<(ostream& Out, const CWorker& Obj)
{
Out<<right<<setw(5)<<Obj.m_ID;
Out<<right<<setw(10)<<Obj.m_Name;
Out<<right<<setw(5)<<Obj.m_Sex;
Out<<right<<setw(6)<<Obj.m_Age;

return Out;
}
};

class CBenchWorker: public CWorker
{
private:
int m_Grade;//钳工级别 1-5 最大为5级
public:
CBenchWorker(int ID = 0, string Name = "No Name", int Sex = 1, int Age = 18, int Grade = 1):CWorker(ID, Name, Sex, Age){
if(Grade < 1 || Grade > 5){
cout << "钳工级别不符合要求!" << endl;
exit(1);
}
m_Grade = Grade;//构造函数
}
int GetGrade()//获取钳工级别
{
return m_Grade;
}
CBenchWorker &operator++()//前自增
{
m_Grade += 1;//级别加一
if(Grade < 1 || Grade > 5){
cout << "钳工级别不符合要求!" << endl;
m_Grade -= 1;
exit(1);
}
return *this;
}
friend ostream& operator<< (ostream& Out, const CBenchWorker& Obj);//输出流运算符
};

ostream& operator<< (ostream& Out, const CBenchWorker& Obj)
{
Out << (CWorker)Obj << setw(5) << right << Obj.m_Grade;
return Out;
}

int ReadData(string rfn, vector<CBenchWorker> &myVect)//读取文件
{
ifstream infile(rfn, ios::in);
if(!infile)//判断打开文件是否成功
{
cout << "打开文件失败" << endl;
return 0;
}
int ID, Sex, Age, Grade;
string Name;
while(infile >> ID >> Name >> Sex >> Age >> Grade){
CBenchWorker temp(ID, Name, Sex, Age, Grade);//初始化工人信息
myVect.push_back(temp);//添加至vector
}
infile.close();//关闭文件
return 1;
}

void DisplayData(vector<CBenchWorker> myVect){//展示信息
for(int i = 0; i < myVect.size(); i++)//输出每条信息
cout << myVect[i] << endl;
}

void InecData(vector<CBenchWorker> &myVect){//自增函数
for(int i = 0; i < myVect.size(); i++){//每个工人执行前自增操作
++myVect[i];
}
}

int DelData(vector<CBenchWorker> &myVect, int X, int Y){//删除函数
int cnt = 0;//计数变量
for(int i = myVect.size()-1; i >= 0; i--){
if(myVect[i].GetAge() >= X && myVect[i].GetGrade() <= Y){//判断工人工龄大于X,级别小于Y
cnt++;
myVect.erase(myVect.begin() + i);//从后往前删除
}
}
return cnt;//返回删除个数
}

int DelData(vector<CBenchWorker> &myVect, string X){//删除函数2
int cnt = 0;//技术变量
for(int i = 0; i < X.size(); i++){
if(X[i] >= 'A' && X[i] <= 'Z')
X[i] += 32;//全部转化为小写
}
for(int i = myVect.size()-1; i >= 0; i--){
string Y = myVect[i].GetName();
for(int j = 0; j < Y.size(); j++){
if(Y[j] >= 'A' && Y[j] <= 'Z')
Y[j] += 32;//全部转化为小写,由于新定义了string,不会改变原来vector内的name
}
if(Y.find(X) != Y.npos){
myVect.erase(myVect.begin() + i);//从后往前删除并且计数
cnt++;
}
}
return cnt;//返回删除个数
}

bool cmp(CBenchWorker A, CBenchWorker B)
{
if(A.GetSex() == B.GetSex()){//判断性别是否相等
if(A.GetSex() == 0)//都是女性的情况下
return A.GetGrade() > B.GetGrade();//级别降序
else
return A.GetGrade() < B.GetGrade();//级别升序
}
return A.GetSex() < B.GetSex();//女士优先
}

void SortData(vector<CBenchWorker> &myVect){//排序函数
sort(myVect.begin(),myVect.end(),cmp);
}

int WriteData(string wfn, vector<CBenchWorker> myVect){//写入文件
ofstream outfile(wfn,ios::out);
if(!outfile)//判断打开文件是否成功
{
cout << "打开文件失败" << endl;
return 0;
}
for(int i = 0; i < myVect.size(); i++){//写入数据
outfile << myVect[i] << endl;
}
outfile.close();//关闭文件
return 1;
}

int main()
{
vector<CBenchWorker> a;
int c;

if (ReadData("d:\\workers.txt", a)==0)
return -1;

cout<<"文件读取后一共有 "<<a.size()<<" 条钳工数据:"<<endl;
DisplayData(a);

InecData(a);

c=DelData(a,55,2); //第2个参数为年龄,第3个参数为等级
cout<<endl<<"第1次删除了"<<c<<"个钳工数据"<<endl;

c=DelData(a,"Tom");
cout<<endl<<"第2次删除了"<<c<<"个钳工数据"<<endl;

SortData(a);

cout<<endl<<"上述流程结束后一共有 "<<a.size()<<" 条钳工数据:"<<endl;
DisplayData(a);

if (WriteData("d:\\res.txt",a)==0)
return -1;
cout<<endl<<"文件保存成功"<<endl<<endl;
}

考前小练习1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#include<iostream>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cmath>
#include<algorithm>
using namespace std;

class CPU{
private:
double m_MainFreq; //主频,单位GHz
int m_CoreNum; //核心数
double m_Power; //功率,单位:W

public:
CPU(double MainFreq, int CoreNum, double Power);
double GetMainFreq(void)const; //获取主频
CPU& operator++(); //前自增,主频加0.1,核心数加2,功率加1.0
CPU operator++(int); //后自增,规则同上
friend ostream& operator<<(ostream& Out, const CPU& Obj); //输出CPU的参数,
//主频占6列,小数部分保留2位,左对齐
//核心数占3列,左对齐
//功率占6列,小数部分保留1位,左对齐
};

//CPU类的构造函数
CPU::CPU(double MainFreq, int CoreNum, double Power){
m_MainFreq=MainFreq;
m_CoreNum=CoreNum;
m_Power=Power;
}
//CPU类的GetMainFreq ()成员函数
double CPU::GetMainFreq(void)const{
return m_MainFreq;
}
//CPU类的前++运算符重载成员函数
CPU& CPU::operator++(){
m_MainFreq+=0.1;
m_CoreNum+=2;
m_Power+=1.0;
return *this;
}
//CPU类的后++运算符重载成员函数
CPU CPU::operator++(int){
CPU temp(*this);
++(*this);
return temp;
}
//CPU类的输出运算符重载函数
ostream& operator<<(ostream& Out, const CPU& Obj){
Out<<left<<setw(6)<<fixed<<setprecision(2)<<Obj.m_MainFreq<<
left<<setw(3)<<Obj.m_CoreNum<<
left<<setw(6)<<fixed<<setprecision(1)<<Obj.m_Power;
return Out;
}


class Computer{
private:
CPU m_CPU;
int m_Memory; //内存容量,单位:G
int m_HD; //硬盘容量,单位:G

public:
Computer(double CPU_MainFreq, int CPU_CoreNum, double CPU_Power, int Memory, int HD);
CPU GetCPU(void)const; //获取CPU数据
double GetMemory(void)const; //获取内存容量
Computer& operator++(); //前自增,CPU部分自增规则同CPU类,内存扩大4G,硬盘扩大128G
Computer operator++(int); //后自增,规则同上
friend ostream& operator<<(ostream& Out, const Computer& Obj);
//CPU部分数据的输出规则与CPU类中定义相同
//内存容量占6列,左对齐
//硬盘容量占8列,左对齐
};

//Computer类的构造函数
Computer::Computer(double CPU_MainFreq, int CPU_CoreNum, double CPU_Power, int Memory, int HD):m_CPU(CPU_MainFreq,CPU_CoreNum,CPU_Power){
m_Memory=Memory;
m_HD=HD;
}
//Computer类的GetCPU()成员函数
CPU Computer::GetCPU(void)const{
return m_CPU;
}
//Computer类的GetMemory()成员函数
double Computer::GetMemory(void)const{
return m_Memory;
}
//Computer类的前++运算符重载成员函数
Computer& Computer::operator++(){
++m_CPU;
m_Memory+=4;
m_HD+=128;
return *this;
}
//Computer类的后++运算符重载成员函数
Computer Computer::operator++(int){
Computer temp(*this);
++(*this);
return temp;
}
//Computer类输出运算符重载函数
ostream& operator<<(ostream& Out, const Computer& Obj){
Out<<Obj.m_CPU<<
left<<setw(6)<<Obj.m_Memory<<
left<<setw(8)<<Obj.m_HD;
return Out;
}


class IPC:public Computer{
private:
int m_ProtectGrade; //防护等级
static int m_Counts; //工控机数量

public:
IPC(double CPU_MainFreq=3.7, int CPU_CoreNum=6, double CPU_Power=95.0, int Memory=16, int HD=512, int ProtectGrade=65);
IPC(const IPC& Obj);
double GetProtectGrade(void)const; //获取防护等级
static int GetCounts(void); //获取当前工控机数量
IPC& operator++(); //前自增,Computer数据自增规则同上,防护等级加1
IPC operator++(int); //后自增,规则同上
friend ostream& operator<<(ostream& Out, const IPC& Obj);
//Computer部分数据的输出规则与Computer类中定义相同
//防护等级占5列,左对齐
~IPC();
};
//IPC类的有参构造函数
IPC::IPC(double CPU_MainFreq, int CPU_CoreNum, double CPU_Power, int Memory, int HD, int ProtectGrade):Computer(CPU_MainFreq,CPU_CoreNum,CPU_Power,Memory,HD){
m_ProtectGrade=ProtectGrade;
m_Counts++;
}

//IPC类的复制构造函数
IPC::IPC(const IPC& Obj):Computer(Obj){
m_ProtectGrade=Obj.m_ProtectGrade;
m_Counts++;
}
//IPC类的GetProtectGrade()成员函数
double IPC::GetProtectGrade(void)const{
return m_ProtectGrade;
}
//IPC类的GetCounts()成员函数
int IPC::GetCounts(void){
return m_Counts;
}
//IPC类的前++运算符重载成员函数
IPC& IPC::operator++(){
Computer::operator++();
m_ProtectGrade++;
return *this;
}
//IPC类的后++运算符重载成员函数
IPC IPC::operator++(int){
IPC temp(*this);
// m_Counts--;
++(*this);
return temp;
}

IPC::~IPC(){
m_Counts--;
}
//IPC类的输出运算符重载函数
ostream& operator<<(ostream& Out, const IPC& Obj){
// cout << 1 << endl;
Out << static_cast<Computer>(Obj)<<left<<setw(6)<<Obj.m_ProtectGrade;
// cout << 1 << endl;
return Out;
}
//初始化
int IPC::m_Counts=0;

//函数ReadIPCFile,从D盘根目录下的文本文件source.txt中读取数量未知个工控机数据,构成一个IPC类型的向量A
void ReadIPCFile(string filename, vector<IPC>& A){
ifstream data("d:\\source.txt",ios::in);
if(!data){
cout<<"ERROR!"<<endl;//打开失败就退出
return;
}
double main,power;
int core,memory,hd,protect;
while(data>>main>>core>>power>>memory>>hd>>protect){
IPC temp(main,core,power,memory,hd,protect);
A.push_back(temp);
}
data.close();
return;
}

//函数SortIPC,对上述A向量进行增序排序,排序条件定义如下:
//a) CPU主频
//b) 防护等级
//注意:上述排序条件是有顺序的,必须按照"a条件-b条件"的顺序来进行处理
bool judge(IPC a,IPC b){
if((a.GetCPU()).GetMainFreq()<(b.GetCPU()).GetMainFreq())return true;
else if(a.GetProtectGrade()<b.GetProtectGrade())return true;
else return false;
}
void SortIPC(vector<IPC>& A){
sort(A.begin(),A.end(),judge);
}

//函数IncreaseIPC,对上述经过排序处理后的A向量中内存容量小于等于4G的工控机数据进行前自增处理,
//自增处理后的工控机数据必须要仍然保存在A向量中原数据位置处
void IncreaseIPC(vector<IPC>& A){
for(vector<IPC>::iterator it=A.begin();it!=A.end();it++){
if((*it).GetMemory()<=4){
++(*it);
}
}
}

//将经过上述处理后的A向量中所有工控机数据保存在D盘根目录下的文本文件res.txt中
void OutputIPCFile(vector<IPC>&A,string filename){
ofstream file(filename, ios::out);
for(vector<IPC>::iterator it = A.begin(); it != A.end(); it++) {
file <<*it << endl;
}
file.close();
}

int main()
{
vector<IPC> A;

ReadIPCFile("d:\\source.txt", A);
cout<<"当前工控机台数: "<<IPC::GetCounts()<<endl;
SortIPC(A);
IncreaseIPC(A);
cout<<"当前工控机台数: "<<IPC::GetCounts()<<endl;
OutputIPCFile(A,"d:\\res.txt");

IPC t1;

cout<<t1<<endl;
cout<<t1++<<endl;
cout<<t1<<endl;
cout<<"当前工控机台数"<<IPC::GetCounts()<<endl;

IPC t2(t1);

cout<<t2<<endl;
cout<<"当前工控机台数"<<IPC::GetCounts()<<endl;
}

考前小练习2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include<bits/stdc++.h>
using namespace std;

class CGoods
{
private:
int m_num; //商品编号
string m_name; //商品名称
float m_price; //商品价格

public:
CGoods (int, const string&, float);
friend ostream& operator<<(ostream&, const CGoods&);
//商品名称、商品编号和商品价格的显示格式都要求为占10列、右对齐
};

CGoods::CGoods(int num, const string& name, float price)
{
m_num = num;
m_name = name;
m_price = price;
}

ostream& operator<<(ostream& out, const CGoods& t){
out << setw(10) << right << t.m_num << setw(10) << t.m_name << setw(10) << t.m_price;
return out;
}


class CRouter : public CGoods
{
private:
float m_rate;
int m_portNum;
public:
CRouter(int num = 1, const string& name = "M8", float price = 100.0, float rate = 2.4,int portNum = 8):CGoods(num,name,price){
m_rate = rate;
m_portNum = portNum;
}
int GetChannels()
{
return this->m_portNum;
}
float GetFrequency()
{
return this->m_rate;
}
CRouter &operator ++()
{
m_portNum++;
return *this;
}
CRouter operator++(int)
{
CRouter temp(*this);
m_portNum++;
return temp;
}
friend ostream &operator<<(ostream &out, const CRouter& t);
};

ostream &operator<<(ostream &out, const CRouter& t){
out << (CGoods)t << setw(10) << t.m_rate << setw(10) << t.m_portNum;
return out;
}

void ReadData(vector<CRouter> &s,string rfn)
{
ifstream infile(rfn,ios::in);
if(!infile){
cout << "error" << endl;
exit(1);
}
int num,portNum;
string name;
float price,rate;
while(infile>>num>>name>>price>>rate>>portNum){
CRouter temp(num,name,price,rate,portNum);
s.push_back(temp);
}
return;
}

void DisplayData(vector<CRouter> s){
for(int i = 0; i < s.size(); i++){
cout << s[i] << endl;
}
}

CRouter FindMax(vector<CRouter> s){
int MaxNum = 0;
float MAX = 0;
for(int i = 0; i < s.size(); i++)
{
if(s[i].GetChannels() * s[i].GetFrequency() >= MAX){
MaxNum = i;
MAX = s[i].GetChannels() * s[i].GetFrequency();
}
}
return s[MaxNum];
}

int main()
{
vector<CRouter> s;

ReadData(s,"D:\\Data.txt");
cout<<"读取完成后的向量为"<<endl;
DisplayData(s);

CRouter t;
cout<<endl<<"路由器对象的初始值为"<<endl<<t<<endl;

t=FindMax(s);
cout<<endl<<"乘积最大的向量元素为"<<endl<<t<<endl;

cout<<endl<<"乘积最大的向量元素进行自增运算结果分别如下:"<<endl;
cout<<t++<<endl;
cout<<t<<endl;

cout<<++t<<endl;
cout<<t<<endl;
}

考前小练习3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include<bits/stdc++.h>
using namespace std;

class Time
{
protected:
int m_hour, m_minute, m_second; //m_hour值可正可负,详见说明。
public:
Time(int hour = 0, int minute = 0, int second = 0){
m_hour = hour;
if(minute <= 59 && minute >= 0)
m_minute = minute;
else
m_minute = 0;
if(second <= 59 && second >= 0)
m_second = second;
else
m_second = 0;
} //构造函数
void set(int hour = 0, int minute = 0, int second = 0){
m_hour = hour;
if(minute <= 59 && minute >= 0)
m_minute = minute;
else
m_minute = 0;
if(second <= 59 && second >= 0)
m_second = second;
else
m_second = 0;
} //设置时间
Time operator - (const Time & tm){
int sum1 = m_hour * 3600 + m_minute * 60 + m_second;
int sum2 = tm.m_hour * 3600 + tm.m_minute * 60 + tm.m_second;
int ans = max(sum1,sum2) - min(sum1,sum2);
int SECOND = ans % 60;
int MINUTE = (ans % 3600) / 60;
int HOUR = ans / 3600;
if(sum1 < sum2) HOUR *= -1;
Time NEW(HOUR, MINUTE, SECOND);
return NEW;
} //计算时间差,可正可负
friend ostream & operator << (ostream & os, const Time & tm ); //流输出运算符
};

ostream & operator << (ostream & os, const Time & tm ){
string t = to_string(tm.m_hour), m = to_string(tm.m_minute), s = to_string(tm.m_second);
if(t.size() == 1 )
t = "0" + t;
if(t[0] == '-' && t.size() == 2)
t = "-0" + to_string(t[1] - '0');
if(m.size() == 1)
m = "0" + m;
if(s.size() == 1)
s = "0" + s;
os << t << ":" << m << ":" << s;
return os;
}

class WorldTime:public Time{
private:
int m_timezone;
public:
WorldTime(int timezone, int hour, int minute, int second):Time(hour, minute, second){
if(timezone <= 12 && timezone >= -12)
m_timezone = timezone;
else
m_timezone = 0;
}
WorldTime(const WorldTime &wt){
this->m_timezone = wt.m_timezone;
this->m_hour = wt.m_hour;
this->m_minute = wt.m_minute;
this->m_second = 0;
}
Time operator - (const WorldTime & tm){
int sum1 = (m_hour - m_timezone) * 3600 + m_minute * 60 + m_second;
int sum2 = (tm.m_hour - tm.m_timezone) * 3600 + tm.m_minute * 60 + tm.m_second;
int ans = max(sum1,sum2) - min(sum1,sum2);
int SECOND = ans % 60;
int MINUTE = (ans % 3600) / 60;
int HOUR = ans / 3600;
if(sum1 < sum2) HOUR *= -1;
Time NEW(HOUR, MINUTE, SECOND);
return NEW;
}
WorldTime operator++(int){
WorldTime temp(*this);
this->m_timezone++;
if(m_timezone > 12)
m_timezone = -12;
return temp;
}
void convert(int timezone){
if(timezone > 12 || timezone < -12)
timezone = 0;
m_hour -= this->m_timezone - timezone;
if(m_hour < 0)
m_hour += 24;
if(m_hour > 24)
m_hour -= 24;
m_timezone = timezone;
}
friend ostream &operator <<(ostream &os, const WorldTime &tm);
};

ostream &operator <<(ostream &os, const WorldTime &tm){
string str;
if(tm.m_timezone >= 0)
if(to_string(tm.m_timezone).size() == 1)
str = "+0" + to_string(tm.m_timezone);
else
str = "+" + to_string(tm.m_timezone);
else{
if(to_string(tm.m_timezone).size() == 2)
str = "-0" + to_string(to_string(tm.m_timezone)[1] - '0');
else
str = to_string(tm.m_timezone);
}
os << "[" << str << "] " << static_cast<Time>(tm);
return os;
}

int main()
{
cout << "----------Section 1----------" << endl;
Time tm1(8,12,153), tm2;
cout << tm1 << endl;
cout << tm2 << endl;
cout << tm2 - tm1 << endl;
cout << "----------Section 2----------" << endl;
WorldTime wtm1(12, 7, 14, 29), wtm2(-10, 23, 10, 9), wtm3(wtm2);
cout << wtm1 << endl;
cout << wtm2 << endl;
cout << wtm3 << endl;
cout << wtm2 - wtm1 << endl;
cout << "----------Section 3----------" << endl;
wtm1++;
cout << wtm1 << endl;
wtm2.convert( 20 );
wtm3.convert( 8 );
cout << wtm2 << endl;
cout << wtm3 << endl;
cout << "----------Finish-------------" << endl;
return 0;
}

麦田的儿子和海的故事

他把灵魂压在锄头底下

丰收和饥饿、都埋葬在麦地里

他站在破晓之前的田垄上

守望着东方

等待着白天的生长

有一天

羽毛落到了他的窗前

第一次

他看到了鼓动的船帆

听到了海上、孤勇的波浪

他把海螺扣在耳朵上

那不是大海在歌唱

是他的鲜血在热烈地流动

沙子闪烁着群星

海面翻涌着月光

大海的一切完美无缺

却没有一处能让他敲下锄头

他把麦穗洒向大海

风停下了,羽毛飘走了

所有的潮水都退去了

山石依然屹立

他死在了海里

你走了之后

麦田里、下了大雪

月亮不再落下

云朵,还保持在那一刻的模样

[codeforces 559B] Equivalent Strings

题目:559B
题意:给定两个字符串,判断是不是一个神奇的字符串。
他们满足如下两个条件的其中之一:
1、 A与B相等。
2、 如果我们把字符串A分成两个长度相等的字符串A1,A2,并将字符串B分成两个长度相等的字符串B1,B2 然后他们满足以下的其中一项条件:
(1) A1与B1是一对神奇的字符串,并且A2与B2是一对神奇的字符串。
(2) A2与B1是一对神奇的字符串,并且A1与B2是一对神奇的字符串。
思路:
很显然用递归的思想,但是单纯的递归会TLE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include<string>
using namespace std;
bool judge(string a,string b,int len)
{
if(a==b) return true;
if(len&1) return false;
int n = len>>1;
if(judge(a.substr(0,n),b.substr(n,n),n)&&judge(a.substr(n,n),b.substr(0,n),n))///如果把这个和下面那个调换一下位置,就会TLE。很搞笑
return true;
if(judge(a.substr(0,n),b.substr(0,n),n)&&judge(a.substr(n,n),b.substr(n,n),n))
return true;
return false;
}

int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string a,b;
cin>>a>>b;
if(judge(a,b,a.size())) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}

不过,这样就能过了……
……
……
正经思路是:
一个字符串可以拆成很多的小部分,这些小部分是可以任意排序的。(这个小部分的最小单位是2)(可以任意排序是因为条件2有两项。里面有很多种可能性的组合。)
按照字典顺序递归处理一下,再进行拼接。(具体是a>b还是b>a其实并不重要)
如果拼接之后的两个字符串相等,就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<bits/stdc++.h>
using namespace std;
string handle(string s){
if(s.size()%2 == 1) return s;
string s1 = handle(s.substr(0,s.size()/2));
string s2 = handle(s.substr(s.size()/2,s.size()));
if(s1 > s2) return s1 + s2;
else return s2 + s1;
}
int main()
{
string a,b;
cin>>a>>b;
a = handle(a);
b = handle(b);
if(a==b) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}

[codeforces 621C] Wet Shark and Flowers

题目:621C
题意:
n个人围坐一圈,每个人有从l到r范围内的一个数,如果他和旁边的那个人手里的数字的乘积是质数p的倍数,两个人都获得1000元。求所有人得到的钱的数学期望。
思路:
很多人都做出来的一道题目。比赛的时候因为先开了A题,写的心态炸裂,剩下半个小时就没做这道题。

首先我们要知道的是,求1n中有几个数能被k整除,只要求n/k取整就可以了。
所以,一个人手里的数的范围l
r中,能被p整除的数的个数是:r/p-(l-1)/p 有的人可能会想化简成(r-l+1)/p 这是不对的 因为那个除号是整除运算
为什么不是l-r?区间长度。就像1~n不是(n-1)/k而是(n-1+1)/k=n/k一样

拿个数除以区间长度,我们就可以得到:
一个人手里的数字是p的倍数的概率 = (r/p-(l-1)/p)/(r-l+1)
设这个概率为P1,他相邻的人手里的数字是p的倍数的概率也这么求,设为P2
他俩手里数字的乘积也是p的倍数,也就等价于:
P3 = 1-(1-P1)(1-P2)

那么如果这个人的坐标是i,他相邻的人,我们可以认为是(i+1)%n。围成一圈,利用取余操作,如果他是最后一个人,那么取了余数之后就知道他相邻的人是第一个人。

求和,乘以2000,得到最终答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<bits/stdc++.h>
using namespace std;
double pp[100005];
int main()
{
int n,p;
cin >> n >> p;
for (int i = 0; i < n; i++){
int l,r;
cin >> l >> r;
pp[i] = (double)(r/p-(l-1)/p)/(r-l+1);
// cout << pp[i] << endl;
}
double ans = 0;
for (int i = 0; i < n; i++){
ans += 1.0 - (1.0 - pp[i]) * (1.0 - pp[(i+1)%n]);
// cout << ans << endl;
}
printf("%.10f\n",ans * 2000);
return 0;
}

[苏州大学C++] 2020春第二次考试

题目描述:
*
请各位考生从课程教学群文件中下载数据文件 account.txt,然后将数据文件
手动保存在 D 盘根文件夹下。按要求编写一个 deposit 类,用于存储文件
account.txt 中的数据。该文件中每行记录一个账户的信息,包含 4 项数据,以 tab
字符分隔,各个字段的信息如下:
第 1 列表示账户名称 name;
第 2 列表示账户存款余额 balance;
第 3 列表示账户贷款余额 loan;
第 4 列表示每次还贷金额 charge;
根据 account.txt 文件中的数据,现设计 deposit 类的结构如下,其中包含 4
个私有数据成员变量:

1
2
3
4
5
6
7
8
class deposit
{
private:
string name;
double balance, loan, charge;
public:
……
}

按以下要求编写程序

  1. deposit类包含构造函数,name默认值为“NoName”,其余参数默认值为0.0。
  2. deposit 类包含成员函数 setName,用于设置账户名称。
  3. deposit 类包含成员函数 pay,用于执行还贷操作。正常还贷操作的过程是:
    balance 减去 charge,loan 减去 charge。如果 loan 大于 charge,则还贷金额
    为 charge,否则还贷金额为 loan。如果余额 balance 大于还贷金额 charge,
    则正常还贷,并返回 true,否则不执行还贷操作,并设置账户名称为原名称
    后面加“(*)”,并返回 false。
  4. 重载后自增运算符++,用于将当前对象的每次还贷金额 charge 增加 100。
  5. 重载流输出运算符,用于显示一个对象的信息。其中,name 占 10 列并左对
    齐,balance、loan、charge 各占 15 列并精确到小数点后 2 位。
  6. 编写函数 inputData,完成数据的读入,结果存放在向量 v_acc 中。
  7. 编写函数 incData,将 v_acc 中所有账户的还贷金额增加 100。
  8. 编写函数 decData,将 v_acc 中所有账户执行一次还贷操作,返回无法完成
    还贷的账户数;
  9. 编写函数 outPut,用于把向量 v_acc 中的数据显示输出。显示格式在重载流
    输出运算符中已有表述。
    程序的 main 函数(注意:不得修改 main 函数!对 main 函数每修改
    一处扣 2 分,最多扣 10 分。)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
vector<deposit> v_acc;
string path = "d:\\account.txt";
inputData(path, v_acc);
outPut(v_acc);
cout << "-------------------------------" << endl;
incData(v_acc);
outPut(v_acc);
cout << "-------------------------------" << endl;
cout << "can not pay = " << decData(v_acc) << endl;
outPut(v_acc);
return 0;
}

*

解析:
实在是没有什么好说的,非常简单的一次考试。班级里没有低于90分的。
大概是为了防止出现大面积满分,居然因为函数说明没写够扣分了,真是有够好笑的呢。
半个小时不到就写完了。
直接附上代码供参考吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include<bits/stdc++.h>
using namespace std;
class deposit
{
private:
string name;
double balance, loan, charge;
public:
deposit(string m_name = "NoName",double m_balance = 0.0,double m_loan = 0.0,double m_charge = 0.0){
name = m_name;//构造函数
balance = m_balance;
loan = m_loan;
charge = m_charge;
}
void setName(string NAME){//设置账户名称
name = NAME;
}
bool pay(){//还贷操作
int temp = charge;
if(loan <= charge) temp = loan;
if(balance > charge) {
balance -= temp;
loan -= temp;
return true;
}else{
string NewName = name + "(*)";
this->setName(NewName);
return false;
}
}
deposit operator++(int){//后自增
deposit temp(*this);
charge += 100;
return temp;
}
string getName(){//访问私有对象
return name;
}
double getBalance(){
return balance;
}
double getLoan()
{
return loan;
}
double getCharge()
{
return charge;
}
friend ostream &operator<<(ostream &out,deposit t);//使用友元函数 重载>>
};

ostream &operator<<(ostream &out,deposit t){//输出格式
out << setw(10) << left << t.getName();
out << setw(15) << fixed << right << setprecision(2) << t.getBalance();
out << setw(15) << fixed << right << setprecision(2) << t.getLoan();
out << setw(15) << fixed << right << setprecision(2) << t.getCharge();
return out;
}

void inputData(string rfn, vector<deposit> &vec){
ifstream infile(rfn,ios::in);
if(!infile){//判断打开文件
cout << "open file error!" << endl;
return ;
}
string name;
double balance,loan,charge;
while(infile >> name >> balance >> loan >> charge){//读取
deposit temp(name,balance,loan,charge);
vec.push_back(temp);
}
infile.close();//关闭
}

void incData(vector<deposit> &vec){//还贷金额+100
for(int i = 0; i < vec.size(); i++){
vec[i]++;
}
}

void outPut(vector<deposit> vec){
for(int i = 0; i < vec.size(); i++){
cout << vec[i] << endl;
}
}

int decData(vector<deposit> &vec){//返回无法还贷数目
int cnt = 0;
for(int i = 0; i < vec.size(); i++){
if(!vec[i].pay())//如果无法还贷 统计数量
cnt++;
}
return cnt;
}

int main()
{
vector<deposit> v_acc;
string path = "d:\\account.txt";
inputData(path, v_acc);
outPut(v_acc);
cout << "-------------------------------" << endl;
incData(v_acc);
outPut(v_acc);
cout << "-------------------------------" << endl;
cout << "can not pay = " << decData(v_acc) << endl;
outPut(v_acc);
return 0;
}
  • Copyrights © 2020-2024 Rye
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信