• 编程码风汇总


    本文章摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/bian-cheng-ma-feng-hui-zong

    此文章方便您了解 shaoziqi这个蒟蒻和 OIer的码风


    目录:

    1. 前言

    2. 码风说明

    2-1. 注释代码

    2-2. 代码人身攻击

    2-3. 打空格

    2-4. 自定义函数

    2-5. 万能头

    2-6. 大括号

    2-7. 快读

    2-8. STL

    3. 后记


    1. 前言

    众所周知,每个人都有自己的码风,无论AFOer现役OIer,各自的码风也是千奇百怪。

    在这里引用一个我所看到的最奇怪的代码

    airport.inputln<<("%d%d%d",n,m,s).split();
    System.out.airport.writeln>>("%d\n",&k)>>endl;

    我看不懂,但是我大受震撼

    我也不知道这里面包含了几种编程语言

    Upd: 后来才知道是OIer用的三种语言大杂烩

    所以,我必须要做一期编程码风的汇总。

    2. 码风说明

    2-1. 注释代码

    一般的大犇都喜欢给代码上注释(当然指有意义的注释),以方便自己在打代码时可以了解自己之前的解题思路

    这里举一个例子:

    if(j>=a[i]){
    d[j]-max(d[j-1],d[j-a[i]]); //这里用来完成一维数组的 dp
    } //如果是10^6的数据规模应该会有80分

    但是如果你没有注释,很难让自己或者他人理解你代码的思路

    比如说:

    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
    qaq(i);
    kkk();
    }
    orz();

    尤其是这种使用一大堆自定义函数的程序,解题思路就很难懂。

    Upd: 这是我代码

    2-2. 代码人身攻击

    在此提醒各位:辱骂有风险,整活需谨慎

    鉴于 €€£ 的一系列 save money 的行为,因此万千 OIer 在考场上有辱骂 CCF 的行为。

    甚至以至于禁三年

    举个例子:

    return 0; //CCFrnm退钱

    鲜活的禁三人

    ccf[i][j]=dp(i-1,min(j-ccf[i-1][j],114514));

    Upd以上代码均有出处,为避免人身攻击不将其公布

    2-3. 打空格

    有一些大佬,喜欢在代码拥挤时打空格以方便找错和调试

    还有一些人为了节省码代码的时间,不打空格。

    总之,这个习惯因人而异,而不是 OIer 强求的习惯

    还是举个例子

    for (int i = 1;i <= n;i ++) {
    int k = a [i];
    if (k <= a[i - 1]) ans ++;
    }

    以及另一个例子

    for(int i=1;i<=n;i++) {
    int k=a[i];
    if(k<=a[i-1]) ans++;
    }

    upd: 我似乎不怎么打空格??

    2-4. 自定义函数

    自定义函数可以让主程序更简洁,有时候也可以让代码思路更清晰(当然有时候可能会增加复杂度)。

    在代码中一些自定义函数是很有用的,比如 dfs,bfs,dp,cmp 等,还有一些函数如果不在根本上改变性质毫无用处的,比如 max,min,sqrt 等。

    大部分时候,自定义函数是能帮助到您解决很多实际性问题的

    一个大佬的主程序:

    #include
    #define ......
    ......
    using namespace std;
    ......
    void imp(int k,int t)
    {
    ......
    }
    void ......
    ......
    int main()
    {
    int n,m;
    ios::sync_with_stdio(false);
    cin>>n>>m;
    imp(n,m,1);
    cos(a[1],d[1][1]);
    dfs(n,1);
    outans(d[1][1]);
    return 0;
    }

    这个代码长约 200 行我就不放了 %%%Orz 大佬

    另一部分人的主程序:

    #include
    using namespace std;
    int main()
    {
    ......
    return 0;
    }

    同样 150 多行的代码很明显就烦琐了。

    Upd: 感觉身边 dalao 真多啊。

    2-5. 万能头

    根据可靠消息得:万能头会占用 2MB 的空间

    #include

    这个万能头包含了 C++ 所有的头文件,解决了无数人苦记头文件的痛苦

    Upd: 想当初我在小六时为了记头文件差点 JC ......

    但是,真正的巨佬是不会用头文件的!他们宁可记头文件也不要多余的内存消耗

    为伟大的 OIer 们致敬!!!

    至于 C++ 有多少头文件,懂的都懂。

    Upd: 我没有考虑 P 党的想法十分抱歉

    2-6. 大括号

    一些人喜欢在代码循环和判断语句外打大括号。

    这其实是很好的习惯,这可以让更多人看出代码的运行方便调试

    代码比对如下:

    for(int i=1;i<=n;i++){
    int k=a[i];
    for(int j=1;j<=n;j++)
    if(k<=a[j])
    k=a[j];
    cout<
    }

    还有一份:

    for(int i=1;i<=n;i++){
    int k=a[i];
    for(int j=1;j<=n;j++){
    if(k<=a[j]){
    k=a[j];
    }
    }
    cout<
    }

    通过比对,很明显看出来代码二更有条理性,虽然它们的运行都是一样的

    2-7. 快读

    一般来说,快读可以减少运行时间

    常见的快读有以下几种:

    (1) 函数

    ios::sync_with_stdio(false);

    (2) 模板

    inline int read()
    {
    char ch=getchar();
    long long f=1,res=0;
    while(ch<'0'||ch>'9')
    {
    if(ch=='-') f=-1;
    ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
    res=(res<<1)+(res<<3)+ch-48,ch=getchar();
    }
    return res*f;
    }

    类似的还有快写模板:

    inline void write(long long x)
    {
    char buf[100];
    int len=-1;
    if(x>=0) while(x) buf[++len]=x%10+48,x/=10;
    else
    {
    putchar('-');
    while(x) buf[++len]=-(x%10)+48,x/=10;
    }
    while(len>=0){
    putchar(buf[len--]);
    }
    }

    如果考场上模板不会,那就用函数吧!

    2-8. STL

    C++ 有个好东西,叫 STL,经常能帮助大佬们完成一大半的操作

    (1)栈

    vector<int> v;

    vector 是个好东西,可以自动模拟实现栈

    (2)快排

    sort(a+1,a+n+1);

    这么一个快排函数,完成了手动模拟几十行的程序。

    (3)映射

    mapint> mp;

    这个函数,不用 dfs 用一重循环完成了两重循环完成的事。

    (4)其他函数

    对于函数而言,使用者是操作者本人,这个习惯也是因人而异。但是谨记一点:STL 好用,但是不能滥用

    3. 后记

    无数人,无数码风,为的是心中不变的信仰!

    谨以此文致敬所有 OIer!!!

  • 相关阅读:
    负环与差分约束
    一些 dp 题
    视频怎么制作动图?分享简单的视频制作gif方法
    Java对象传递和返回的细节问题
    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (2)
    CDISC SDTM IG 3.3 版本相比于 3.2版本的变化 (下)
    手撸mybatis03: xml配置的解析与注册
    单片机-如何让数码管动态显示
    R语言ggplot2可视化:使用get_dim函数获取第一个图像的维度信息、使用set_dim函数设置第二个图像的维度、使得两个图像对齐
    数据结构 - 逻辑结构和物理结构
  • 原文地址:https://www.cnblogs.com/shaoziqi/p/16838960.html