C++常见常用的一些代码(初学者,随缘更新)

本文旨在记录一些常见的代码,来源广泛,如有雷同,纯属巧合。

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),成员函数有:

  1. 构造函数:初始化head.
  2. createList(int *value, int n): 用value中的n个数据创建单链表.
  3. printList(): 以head为表头依次输出每个节点的数据值。
  4. insertNode(int pos, int value): 在单链表第pos个节点位置后插入新节点,数据为value。如插入不成功输出error。
  5. removeNode(int pos): 删除第pos个节点,若删除不成功输出error。
  6. 析构函数:释放链表每个节点的堆内存。

输入
第一行:测试次数
每次测试格式为:
数据个数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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值