本文旨在记录一些常见的代码,来源广泛,如有雷同,纯属巧合。
1 cout各种格式的输出
1.1 输出指定位数的数字,位数不足在前面补0
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{
int a = 1;
cout << setw(2) << setfill('0') << a << endl;//输出数字位数为2,不足在前面补0
//输出结果:01
return 0;
}
1.2 输出小数点后指定位数,不足在后面补0,会自动四舍五入
注:写一个 << fixed << setprecision(x) ,之后所有的数据都会保留小数点后到x位;写一个 << setprecision(x) ,之后所有的数据都会保留到x位;
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{
cout << fixed << setprecision(2) << 12.3 << endl;
//输出结果12.30;如果去掉fixed,输出结果是12
cout << 13.666 << endl;
//输出结果13.67;如果去掉fixed,输出结果是14
return 0;
}
2 各种形式的输入
2.1 输入一堆字符串,以逗号分隔
采用getline函数。
getline()的原型是istream& getline ( istream &is , string &str , char delim );
其中 istream &is 表示一个输入流,譬如cin;string&str表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’,也就是回车换行符(遇到回车停止读入)。
举个例子,输入以逗号分隔的一堆字符。
class CBook
{
private:
string bookname;
string author;
double price;
string press;
public:
friend istream &operator>>(istream &in, CBook &b);
};
istream &operator>>(istream &in, CBook &b)
{
getline(in, b.bookname, ',');
getline(in, b.author, ',');
cin >> b.price;
getchar();
getline(in, b.press);
return in;
}
/*
上述的重载就可以输入下列的形式的内容:
python从入门到精通,艾里克.马瑟斯,62.00,人民邮电出版社
Java并发编程实战,盖茨,54.5,机械工业出版社
Effective Java中文版,约书亚.布洛克,94,机械工业出版社
重构 改善既有代码的设计,马丁.福勒,122.6,人民邮电出版社
活用数据:驱动业务的数据分析实战,陈哲,61.4,电子工业出版社
*/
3 一些常用代码
3.1 动态二维数组申请与释放
cin >> m >> n; // m,n分别为行数和列数
//申请
int ** p;
p = new int*[m]; //以一个指针的指针指向一个指针数组
for (int i = 0; i < m; i++)
p[i] = new int[n]; //给指针数组里的每个指针申请一维空间
//释放
for (int i = 0; i < m; i++)
delete[]p[i];
delete[]p;
3.2 计算两个日期间隔的天数
我此处的代码的前提条件是:
1.保证日期格式合法(改进:可以加一个判断函数)
2.一定是小的日期传进大的日期(改进:可以在函数里面加一个判断)
#include <iostream>
using namespace std;
class CDate
{
public:
int y, m, d;
CDate(int yy, int mm, int dd) : y(yy), m(mm), d(dd){};
CDate(CDate &c) : y(c.y), m(c.m), d(c.d){};
//闰年判断
int IsLeap(int y) { return (y % 4 == 0 || y % 400 == 0) && (y % 100 != 0); }
//得到月份的最大天数
int GetMDs(CDate date)
{
int num;
switch (date.m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
num = 31;
break;
case 2:
num = 28 + IsLeap(date.y);
break;
default:
num = 30;
}
return num;
}
//date1比date2小返回值为1,否则为0
int Compare(CDate date1, CDate date2)
{
if (date1.y < date2.y)
return 1;
if (date1.y <= date2.y && date1.m < date2.m)
return 1;
if (date1.y <= date2.y && date1.m <= date2.m && date1.d < date2.d)
return 1;
return 0;
}
//date+1天
void AddDay(CDate *date)
{
date->d++;
if (date->d > GetMDs(*date))
{
date->d = 1;
date->m++;
if (date->m > 12)
{
date->m = 1;
date->y++;
}
}
}
/* void addOneDay()
{
int monthdays[] = {0, 31, isLeap() + 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
day++;
if (day > monthdays[month])
{
month++;
day = 1;
}
if (month > 12)
{
year++;
month = 1;
}
}*/
//+1天函数的另一个写法,用数组的方式取每月天数
//计算两个日期的间隔天数,默认传入的日期要早于本日期
int DateDiff(CDate date)
{
int delta = 0;
while (Compare(date, *this))
{
AddDay(&date);
delta++;
}
return delta;
}
};
int main()
{
int y1, m1, d1, y2, m2, d2;
cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
CDate date1(y1, m1, d1), date2(y2, m2, d2);
cout << "date1 与 date2 之间间隔的天数为:" << date1.DateDiff(date2) << "天。" << endl;
return 0;
}
/*
输入:
2001 12 1
2001 11 20
输出:
date1 与 date2 之间间隔的天数为:11天。
*/
3.3 单链表(类)
题目描述
单链表节点的存储结构为:
struct SNode
{
int data;
SNode *next;
};
定义单链表类CList,数据成员有表头指针(SNode *head),成员函数有:
- 构造函数:初始化head.
- createList(int *value, int n): 用value中的n个数据创建单链表.
- printList(): 以head为表头依次输出每个节点的数据值。
- insertNode(int pos, int value): 在单链表第pos个节点位置后插入新节点,数据为value。如插入不成功输出error。
- removeNode(int pos): 删除第pos个节点,若删除不成功输出error。
- 析构函数:释放链表每个节点的堆内存。
输入
第一行:测试次数
每次测试格式为:
数据个数n 数据1 数据2 … 数据n
插入次数m
插入位置1 数据1
…
插入位置m 数据m
删除次数k
删除位置1
…
删除位置k
输出
每次测试产生的输出格式为:
输出创建链表后全部节点的数据
对每组插入测试数据:
输出插入操作后链表全部节点的数据
对每组删除测试数据:
输出删除操作后链表全部节点的数据
样例输入
2
5 2 3 5 7 3
2
1 40
7 60
2
7
3
6 1 2 10 0 1 5
2
1 40
7 60
2
1
3
样例输出
2 3 5 7 3
2 40 3 5 7 3
error
error
2 40 5 7 3
1 2 10 0 1 5
1 40 2 10 0 1 5
1 40 2 10 0 1 5 60
40 2 10 0 1 5 60
40 2 0 1 5 60
#include <iostream>
using namespace std;
struct SNode
{
int data;
SNode *next;
};
class CList
{
private:
SNode *head;
public:
CList();
void createList(int *value, int n);
void printList();
bool insertNode(int pos, int value);
bool removeNode(int pos);
~CList();
};
CList::CList()
{
head = new SNode;
head->next = NULL;
}
void CList::createList(int *value, int n) //头插法
{
SNode *temp;
while (--n >= 0)
{
temp = new SNode;
temp->data = value[n];
temp->next = head->next;
head->next = temp; //不断让自身成为head的指向
}
}
// void CList::createList(int *value, int n) //尾插法
// {
// SNode *temp, *p = head; //p始终指向尾结点
// while (--n >= 0)
// {
// temp = new SNode;
// temp->data = value[n];
// p->next = temp; //
// p = temp; //将p指向尾结点
// }
// p->next = NULL;
// }
void CList::printList()
{
SNode *p = head;
while (p->next != NULL)
{
cout << p->next->data;
p = p->next;
if (p != NULL)
cout << ' ';
}
cout << endl;
}
bool CList::insertNode(int pos, int value)
{
SNode *p = head;
while (p)
{
pos--;
if (pos == -1)
{
SNode *q = new SNode, *t;
t = p->next;
p->next = q;
q->data = value;
q->next = t;
return true;
}
p = p->next;
}
return false;
}
bool CList::removeNode(int pos)
{
SNode *p = head;
while (p != NULL)
{
pos--;
if (pos == 0) //p停在需要删除的结点前一个结点
{
if (p->next == NULL) //下一处如果为空,证明没有需要删除的结点
return false;
SNode *t; //创建临时指针
t = p->next; //让临时指针指向需要删除的那个结点
p->next = t->next; //再让p的next指针指向需要删除结点的下一个结点
delete t; //删除临时指针所指结点
return true;
}
p = p->next;
}
return false;
}
CList::~CList()
{
SNode *p;
do
{
p = head;
head = p->next;
delete p;
} while (head != NULL);
}
int main()
{
int t;
cin >> t;
while (t--)
{
CList cl;
int n, *d = new int[n];
cin >> n;
for (int i = 0; i < n; i++)
cin >> d[i];
cl.createList(d, n);
cl.printList();
delete[] d;
int m, pos, val;
cin >> m;
while (m--)
{
cin >> pos >> val;
if (cl.insertNode(pos, val))
cl.printList();
else
cout << "error" << endl;
}
cin >> m;
while (m--)
{
cin >> pos;
if (cl.removeNode(pos))
cl.printList();
else
cout << "error" << endl;
}
}
return 0;
}
3.4 月份查询(指针数组)
#include <iostream>
using namespace std;
const char *MONTH[]={"January","February","March","April","May","June","July","August","September","October","November","December"};//不加const会报warning
void FindMonth(int m)
{
if(m<1||m>12)
cout<<"error"<<endl;
else
cout<< *(MONTH+m-1)<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int m;
cin>>m;
FindMonth(m);
}
return 0;
}