Noi Linux的使用

2018-02-23 11:56:43


一、Linux 的基本操作(命令行)

  1. 打开命令行

    在Noi Linux中可以使用快捷键CTRL + ALT + T打开命令行终端

  2. Linux的目录

    Linux是没有Windows下硬盘分区的概念的所有设备均会被挂载到一个统一的文件系统,Linux下的目录有两种:

    • 绝对目录:

      相对于文件系统的根目录(/)来定位文件,如: /etc/apt/source.list, /var/www/

    • 相对目录:

      相对于当前工作目录而言,比如工作目录位于/etc/etc/apt/source.list也可以表示为apt/source.list./apt/source.list

    Linux下一个核心的思想就是一切皆文件,是没有扩展名这一个概念的,有时文件名被写作xxx.xxx也只是为了方便标识或分隔,并不被程序或者操作系统分别处理

    同时还有一些特殊的路径表示,比如可以用./表示当前目录../表示父目录

  3. 文件操作的相关命令

    • ls

      显示当前目录的所有文件与目录

      $ ls

      显示指定目录的所有文件与目录

      $ ls [DIR]
      $ ls /etc
      $ ls /var/www
    • cd

      进入指定目录

      $ cd [DIR]
      $ cd /etc
      $ cd app/src
      $ cd ..
    • mkdir

      创建子目录(新建文件夹)

      可以使用参数 -p 确保目录名称存在,不存在的就建一个

      $ mkdir src
      $ mkdir -p /home/darkflames/test
    • mv & cp

      mv 是将一个目录或文件移动到另一个目录

      cp 是将一个目录或文件复制到另一个目录

      $ mv app/src /etc/app/src
      $ cp app/src /etc/app/src
    • rm

      删除文件或目录,参数

      • -i 删除前逐一询问确认。
      • -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
      • -r 将目录及以下之档案亦逐一删除。

      删除文件可以直接无参数执行,删除目录则需要使用-r

      通常我们可以直接使用-rf参数直接删除指定的目录或文件

      $ rm -rf app/src
      $ rm -rf /home/darkflames/app
    • pwd

      显示当前工作目录的绝对路径

二、如何写代码

  1. 使用Noi Linux自带的guide
  2. 使用emacs/vim/gedit 命令行编译,同时可以使用gdb

命令行下编辑,编译,运行程序

  1. 编辑

    $ vim [FILE]
    $ gedit [FILE]
  2. 编译

    $ g++ code.cpp   #输出文件默认为a.out
    $ g++ code.cpp -o code #输出文件为code
    $ g++ code.cpp -o code -O2 # 开启O2优化
    $ g++ code.cpp -o code -Wall #显示所有警告建议开启

  3. 运行程序

    $ ./code
    $ ./a.out
  4. 其他辅助工具

    $ time ./code #统计运行时间
    $ diff -b test.out test.ans # 比较文件差异,-b参数忽略行末空格

对拍

CPP

#include<bits/stdc++.h>

using namespace std;

#define _DO_CMDS(cmds) for(int _index = 0; _index < sizeof(cmds) / 4; _index++){ system((cmds[_index])); }

char* build[] = {
    "g++ test.cpp -o test",
    "g++ gen.cpp -o gen -O2",
    "g++ std.cpp -o std -O2"
};

char* genData[] = {
    "./gen > data.in",
    "./std < data.in > data.ans"
};

int main() {
    _DO_CMDS(build);

    for(int i = 0; i < 100 ; i++) {
        _DO_CMDS(genData);

        printf("CASE: %d", i);
    if(system("./test < data.in > data.out") != 0) {
        printf("RE\n");
        break;
    }
    else if(system("diff -b data.out data.ans")) {
        printf("WA\n");
        break;
    }
    else printf("AC\n");
        printf("#####################################");
    }
    return 0;
}

Shell

#!/bin/bash

g++ test.cpp -o test
g++ std.cpp -o std -O2
g++ gen.cpp -o gen

i=1
tot=100

while [  $i -le $ tot ]; do
    ./gen > data.in
    ./std < data.in > data.ans
    ./test < data.in > data.out

    if [ $? -ne 0 ]; then
        echo -e "CASE $i: RE"
        break
    elif diff -b data.ans data.out ; then
                echo -e "CASE $i: AC"
        else
        echo -e "CASE $i: WA"
        break
    fi
    let i++
done