正则表达式
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
int main()
{
string s;
regex r("([-+]*[0-9]*x\\^2)*([-+]*[0-9]*x)*([-+]*[0-9]*)");
smatch m;
while(cin >> s)
{
regex_match(s, m, r);
_for(i, 1, 3)
{
if(m[i] == "") cout << 0;
else
{
string now = m[i];
int len = now.size(), r;
if(now[0] == '+') now.erase(now.begin());
if(i == 3) cout << now;
else
{
now.erase(now.begin() + now.find('x'), now.end());
if(now == "") cout << 1;
else if(now == "-") cout << -1;
else cout << now;
}
}
if(i == 3) puts("");
else putchar(' ');
}
}
return 0;
}
string
#include<bits/stdc++.h>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
int main()
{
string s = "12345";
string t(s, 1, 2); //字串构造(s, p, len) t为s从p开始长度为len的字串
cout << t << endl; //len不填的话 就一直到结尾
cout << string(s, 1, 1) << endl;
cout << string(s, 2) << endl;
cout << string(s.begin() + 1, s.begin() + 3) << endl; //范围构造,主要要用迭代器,左闭右开
string str = "455"; //字符转数字 主要是int double 其他比如long long也行
cout << stoi(str) / 2 << endl; //stoi 字符串转int
cout << stof(str) / 2 << endl; //转float
cout << stod(str) / 2 << endl; //转double
int a = 123; //数字转string
double b = 12.12;
cout << to_string(a) + to_string(b) << endl;
string now = "12121212";
int pos = now.find('1'); //查找 rfind find_first_of find_last_of find_first_not_of 类似
cout << pos << endl;
pos = now.find('1', 3); //find的第二个参数表示查找的起始位置
cout << pos << endl;
if(now.find('3') == string::npos) puts("error"); //查找是否存在
else puts("find");
now.push_back('3'); //插入一个字符
if(now.find('3') == string::npos) puts("error"); //查找是否存在
else puts("find");
cout << now << endl;
now.erase(1, 4); // p len 从第p个位置后的len都删掉 len不写就后面全部删掉
cout << now << endl;
now.erase(now.begin()); //迭代器写法,这样写只删这一个
cout << now << endl;
now.erase(now.begin() + 1, now.begin() + 3); // 删除一个范围
cout << now << endl;
now = "12121212";
now.replace(1, 3, "666"); //replace p len string len是string的长度
cout << now << endl;
now.replace(now.begin() + 1, now.begin() + 3, "99999"); //也可以用迭代器
cout << now << endl;
return 0;
}
#include<bits/stdc++.h>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
int main()
{
int T; cin >> T; getchar();
while(T--)
{
string s, t;
getline(cin, s);
stringstream ss; //类似sprintf sscanf 骚操作
ss.str(s); //初始化
int ans = 0;
while(ss >> t) ans++; //读入
cout << ans << endl;
}
return 0;
}
list(双向循环链表)
#include<bits/stdc++.h>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
list<int> l;
void print()
{
for_each(l.begin(), l.end(), [](int x) { printf("%d ", x); });
puts("");
}
int main()
{
_for(i, 5, 10) l.push_back(i); //尾插法
print(); // 5 6 7 8 9 10
l.pop_back(); //尾删法
print(); // 5 6 7 8 9
for(int i = 4; i >= 1; i--) l.push_front(i); //头插法
print(); // 1 2 3 4 5 6 7 8 9
l.pop_front(); //头删法
print(); // 2 3 4 5 6 7 8 9
int p = 5, val = -1;
auto x = l.begin();
_for(i, 1, p - 1) x++;
l.insert(x, val); //在第5个位置插入-1 erase同样
print(); // 2 3 4 5 -1 6 7 8 9
l.push_front(-1);
print(); // -1 2 3 4 5 -1 6 7 8 9
l.remove(-1);
print(); // 2 3 4 5 6 7 8 9 -1全部删掉
l.remove_if([](int x) { return x % 2 == 1; });
print(); //删掉所有奇数
l.sort(greater<int>()); //排序这样用
print();
for_each(l.begin(), l.end(), [](int& x) { x *= 10; }); //巧用for_each语句修改值
print();
return 0;
}
#include<bits/stdc++.h>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
int main()
{
int n, k, T;
cin >> T;
while(T--)
{
vector<int> ans;
list<int> l;
cin >> n >> k;
_for(i, 1, n) l.push_back(i);
auto it = l.begin();
while(l.size())
{
_for(i, 1, k - 1)
{
it++;
if(it == l.end()) it = l.begin();
}
ans.push_back(*it);
it = l.erase(it); //这一步是关键,要写it = l.erase(it) 1 2 3 4 变成1 2 4 it原来指3现在指4
if(it == l.end()) it++;
}
REP(i, 0, ans.size())
{
printf("%d", ans[i]);
if(i != ans.size() - 1) printf(" ");
else puts("");
}
}
return 0;
}
bitset
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
int main()
{
int x;
cin >> x;
bitset<4> b(x); //以x=4为例
cout << b << endl; // 0011 最低位在右
rep(i, 0, 4) cout << b[i]; cout << endl; // 1100
cout << b.count() << endl; //输出1的个数
string x;
cin >> x;
bitset<4> b(x); //这里可以直接string转换
cout << b << endl;
b.reset(); //全部设位0
cout << b << endl;
b.set(); //全部设为1
cout << b << endl;
int y; cin >> y;
bitset<4> c(y);
cout << (b & c) << endl; //还可直接进行& | 操作等
return 0;
}
大作业
貌似有各种各样的问题……
交互性等等……
// 学生成绩管理系统
// 时间:2021.6.14
// 由学校的绩点成绩单产生灵感,开发了一个成绩管理系统
// 可实现成绩的写入并计算专业排名,修改学生某一科的成绩 插入新学生的成绩 删除学生的成绩
// 该系统符合实际情况,尽可能还原学校的成绩管理系统
#include <bits/stdc++.h>
using namespace std;
class course
{
string number, name; // 课程号 课程名
int credit, grade; //课程的学分,绩点分数
double grade2; //绩点
string level; //课的等级
public:
//构造函数,同时根据成绩确定等级。
course(string number = "", string name = "", int credit = 0, int grade = 0) : number(number), name(name), credit(credit), grade(grade)
{
if(grade >= 93) level = "A+", grade2 = 4.5;
else if(grade >= 85) level = "A", grade2 = 4.0;
else if(grade >= 80) level = "B+", grade2 = 3.5;
else if(grade >= 75) level = "B", grade2 = 3.0;
else if(grade >= 70) level = "C+", grade2 = 2.5;
else if(grade >= 65) level = "C", grade2 = 2.0;
else if(grade >= 60) level = "D", grade2 = 1.0;
else level = "F", grade2 = 0.0;
}
friend class student;
};
class student
{
string name, ID, major; //姓名 学号 专业
vector<course> C; //用STL容器vector储存课程
double grade; //总绩点
int rank; //专业排名
public:
student() {}
void cal_grade() //计算总绩点
{
double sum = 0, sum_credit;
for(auto x: C)
{
sum += x.credit * x.grade2;
sum_credit += x.credit;
}
grade = sum / sum_credit;
}
student(string name, string ID, string major, vector<course> C) : name(name), ID(ID), major(major), C(C) { cal_grade(); }
void modify(string number, int grade) //修改学生某一科的成绩
{
for(auto& x: C)
if(x.number == number)
{
x = course(x.number, x.name, x.credit, grade);
break;
}
cal_grade(); //修改后更新总绩点
}
void print() //输出学生的基本信息
{
cout << "学号:" << ID << " 姓名: " << name << " 专业:" << major << endl;
cout << "课程号 课程名 学分 等级 绩点\n";
for(course cur: C)
{
cout << cur.number << " ";
cout << right << setw(15) << cur.name;
if(cur.name.size() == 8) putchar(' ');
if(cur.name.size() != 12) putchar(' ');
cout << " " << cur.credit << " ";
if(cur.level == "A+") cout << "A+"; else cout << cur.level << " ";
printf(" %.1f\n", cur.grade2);
}
printf("平均学分绩点: %.2f 专业排名: %d\n\n\n", grade, rank);
}
friend void get_rank();
};
map<string, vector<student>> mp; //用map和vector结合储存不同专业的学生 用于计算专业排名
map<string, student> st; //用map,由学号对应学生
int n, q; //学生总数 查询次数
void get_rank() //计算专业排名
{
mp.clear();
for(auto x: st)
{
student cur = x.second;
mp[cur.major].push_back(cur);
}
for(auto i = mp.begin(); i != mp.end(); i++)
{
vector<student> x = i->second;
sort(x.begin(), x.end(), [](student a, student b) { return a.grade > b.grade; }); //处理出专业排名排序时用lamda表达式
for(int i = 0; i < x.size(); i++) st[x[i].ID].rank = i + 1;
}
}
void add() //添加一个学生的成绩
{
string name, ID, major;
int m;
cin >> name >> ID >> major >> m;
vector<course> C;
while(m--)
{
string number, Name;
int credit, grade;
cin >> number >> Name >> credit >> grade;
C.push_back(course(number, Name, credit, grade));
}
student cur(name, ID, major, C);
st[ID] = cur;
}
int main()
{
freopen("sample.in", "r", stdin); //文件读写
freopen("sample.out", "w", stdout);
puts("请输入学生信息");
cin >> n;
for(int i = 1; i <= n; i++) add();
get_rank();
puts("\n\n");
puts("1 查询成绩"); //四种操作
puts("2 修改成绩");
puts("3 添加一名学生");
puts("4 删除一名学生\n\n");
string op;
while(cin >> op)
{
regex g("[1-4]"); //判断输入是否符合要求用正则表达式
if(!regex_match(op, g))
{
puts("输入错误");
continue;
}
if(op == "1") //op为1代表查询成绩
{
puts("请输入学号");
string ID; //输入学号
cin >> ID;
if(st.find(ID) == st.end()) //使用find函数判断是否存在该学号
{
puts("请输入正确的学号\n\n");
continue;
}
st[ID].print();
}
else if(op == "2") //op为2代表修改成绩
{
puts("请输入学号 课程号 修改后的成绩");
string ID, number; int grade;
cin >> ID >> number >> grade;
if(st.find(ID) == st.end()) //不存在该学号
{
puts("请输入正确的学号\n\n");
continue;
}
st[ID].modify(number, grade);
get_rank(); //重新计算排名
puts("成绩修改成功");
st[ID].print();
}
else if(op == "3") //op为3代表添加一位学生
{
puts("请输入学生信息");
add();
get_rank();
puts("添加成功\n\n");
}
else if(op == "4") //op为4代表删除一位学生
{
puts("请输入删除学生的学号");
string ID; cin >> ID;
if(st.find(ID) == st.end()) //不存在该学号
{
puts("请输入正确的学号\n\n");
continue;
}
st.erase(ID); //利用map的erase函数实现删除
get_rank();
puts("删除成功\n");
}
}
return 0;
}