在提高组的考试中要求使用noi linux,因此了解一下如何在linux环境下编程是很有必要的。

linux环境下的基础操作

命令行操作

  1,使用Ctrl + Alt + T召唤出终端。

  2,基础指令:

    1,cd

      使用方法:cd + 文件目录

      效果:使终端所在的目录切换到指定文件目录,但是每次cd只能不断深入某个文件夹,如果要退出这个文件夹则直接使用cd,后面不加任何东西

      如果文件名太长懒得打的话,可以打一半然后按Tab键,如果这时你给出的部分文件名已经可以使电脑确定出唯一的一个文件的话,那么将会自动补全这个文件名,否则会给你列出可能的文件名。

    2,l

      列出当前目录下的文件和文件夹,一般和cd配合使用。

    3,./ 程序名

      用来运行一个程序

    4,> 和 <

      有时候你并没有在程序中打文件输入和输出,然后你需要使用文件输入输出,但是又懒得打文件输入输入+重新编译。

      这个时候使用这个指令就很方便。

      ./work < in.in > out.out表示运行work文件,从in.in中读入,输出到out.out中。

编辑器

  1,gedit的使用

    gedit是我常用的编辑器,基础功能都有,界面比较简洁,因为noi linux下默认打开.cpp文件的软件是emacs,所以如果要使用gedit的话,建议先新建一个.cpp文件,然后右键选择打开.cpp的软件,选文本编辑器(gedit),然后就会默认使用gedit打开.cpp文件了。

  一般来说,打开gedit后第一反应应该是进行一些基础的设置。

  这里推荐的设置是:

    

    选择编辑,打开首选项:

    1,勾选显示行号.

    2,勾选右边对齐线显示的位置.(这个一般用于提示自己每行的代码不要过长,会使得代码美观一点)

    3,勾选突出显示当前行.(方便定位当前光标所在的位置)

    4,勾选突出显示匹配的括号.

    5,勾选启用自动缩进.

    6,勾选在保存前创建备份文件(每次都选了,但是从来没用到过,以防万一吧)。

    7,配色方案我喜欢用暗色的,感觉光线柔和一点,这个根据个人喜好选择即可.

    

    设置完后关闭首选项。点击F9,然后切换到文件浏览器模式(我用的ubuntu16.04,叫法可能不同,但差别不会很大)。这个模式有什么好处呢?

      1,你可以直接右键在当前目录下进行新建文件等一系列关于文件的操作(但是好像不能复制粘贴文件),而不需要再打开文件夹进行一系列操作。

      2,你可以直接右键在当前目录下调出命令行,从而避免繁琐的cd操作,尤其是在有中文目录的情况下这个会很实用。

      3,可以快速切换到当前目录,还可以快速打开当前目录下的文件夹。

    

    1,如果要快速上下翻动可以关闭数字锁定,然后利用小键盘快速翻动,1,7分别对应翻到底部和翻到顶部。2, 8则是小幅度的翻动,3和9是较大幅度的翻动。

    2,gedit自带替换的功能(Ctrl + H),这个功能一般用于你之前使用了某个变量名,而你现在又想使用这个变量名,这时你可以用这个功能快速替换之前的同名变量,避免名字冲突。

    3,gedit的搜索功能(Ctrl + F),搜索了之后会高亮匹配项。为了防止误选建议勾选区分大小写和匹配整个单词。

    4,快速跳转到某一行(Ctrl + I).

    以上快捷键根据版本不同,可能略有区别,如果不能使用就在上面的搜索选项中查看对应快捷键即可。

    5,你也可以在终端中使用gedit + 文件名来快速创建一个文件,并在gedit中打开。

程序编译

  最基础的编译命令:g++ 1.cpp

  编译出来的文件叫做a.out

  使用./a.out可以运行这个程序。

  当然还有一些额外的常用指令,使用的时候直接加在后面即可。

  1,-o

  可以让你命名编译出来的文件,比如g++ 1.cpp -o work可以使得编译出来的文件叫做work

  2,-Wall -Wextra

   这两个指令的作用差不多,可以给你一些额外的警告和提示,用于避免一些NC错误。

   比如当你在if的判断条件中把x == y写成了x = y时它就会警告你。但这两个指令带来的警告不会使编译失败。

  3,-O2

   顾名思义,开启O2选项,O2是一种更高级别的优化,平时默认是O1,如果在没有开O2的情况下,大多数STL会跑得很慢(sort之类的除外)。

  4,-g

   开启gdb

  以下是一个示例:(编译1.cpp为work,并运行此程序 同时开启O2优化)

g++ 1.cpp -g -Wall -Wextra -o work -O2
./work

  5,文件调用。

   这个应该都会吧,一般都是使用freopen来实现文件调用。

int main()
{
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
pre();
build();
work();
fclose(stdin);
fclose(stdout);
return 0;
}

程序调试

gdb的使用

  gdb是一个功能很强大的调试软件,一般来讲是用于动态调试,跟devc++的单步跟踪差不多,但功能更多,更稳定。因为使用gdb时往往需要一步步的查看程序运行的情况,所以可能调试起来会比较慢,但可以通过一些小技巧来加快调试速度,这个可以自己体会&总结。

  首先是一些基础操作;

  还有一些不常见操作;

对拍

  有时候你打出了一道题的正解,但你可能并不放心你的正解是否是正确的,这时一个很常见的验证方法是对拍。

  首先你需要以下程序:

  1,正解(或者是一些针对部分数据的高级暴力也是可以的)

  2,暴力

  3,造数据的程序

  4,对拍程序

  正解和暴力怎么写就看你自己了,这里简单讲一下如何造数据和写对拍

造数据程序:

#include<bits/stdc++.h>
using namespace std;
#define R register int
int main()
{
freopen("in.in", "w", stdout);
srand(time(0));
int n = rand() % 1000 + 1, m = rand() % 1000 + 1;
n = 1000, m = 1000;
printf("%d %d\n", n, m);
for(R i = 1; i <= n; i ++) printf("%d ", rand() % 50000 + 1);
printf("\n");
for(R i = 1; i <= m; i ++)
printf("%d\n", rand() % n + 1);
fclose(stdout);
return 0;
}

  这是一份造数据的程序,首先一般会写一个文件输出,表示造出的数据放入要某个文件里。

  srand();是给rand()指令重新指定一个种子,否则你将会每次都造出一样的数据,因为rand实际上是通过一个式子不断的计算得到随机值(不是真随机),所以如果种子一样,那么随机出来的东西也将是一样的。

  然后中间的就根据题目的输入格式自己写了。

  一般在开始会在题目给点范围内随机一个数据大小,但是有时候为了特殊目的(想测极限数据,要用小的错误数据调试等),可能会在下面强制指定一个数据大小。如上面程序中的n = 1000, m = 1000;

对拍程序:

#include<bits/stdc++.h>
using namespace std;
#define R register int int main()
{
for(R i = 1; i <= 1000; i ++)
{
system("./make");
system("./work > out.out");
system("./work1 > out1.out");
if(system("diff -bB out.out out1.out"))
{
printf("error in %d\n", i);
return 0;
}
else
{
printf("passed... %d\n", i);
system("sleep 1");
}
}
return 0;
}

  对拍一般都是一样的,所以不会的话背下代码即可,当然理解一下就更好记了。

  system();中的指令会起到跟你在终端中输入这串指令一样的效果。

  diff -bB out.out out1.out是在忽略行末空格和换行的情况下对比两个文件,如果不同的话会给你返回一个非0的值,因此如果不同的话就输出错误并终止程序,这样的话你就可以保留使你错误的那个数据点。

  否则的话输出passed... 当前数据点。提示你过了这个点。

  因为一般都是写的srand(time(0));所以如果时间是一样的话,种子也会是一样的,随机出来的东西也会是一样的,所以这个时候多次对同一组数据进行测试就没有意义了。所以一般会使用sleep命令来延迟一秒的时间以满足每次测试的时候种子都不同。

快速编译程序:

  这个可能比较冷门,有时候会比较方便。

#include<bits/stdc++.h>
using namespace std;
string name, tmp, s;
int main()
{
cin >> tmp >> name;
s = "g++ " + tmp + ".cpp -g -Wall -Wextra -o " + name;
system(s.c_str());
return 0;
}

运行这个程序,然后输入你要编译的文件名+你要编译为的程序名,就可以快速将这个文件编译为指定程序名。从而避免每次都要打一长串编译命令

ubuntu简易教程(如何使用noi linux)的更多相关文章

  1. Docker之Ubuntu上使用Docker的简易教程

    Ubuntu上使用Docker的简易教程 原始文档:https://www.yuque.com/lart/linux/fp6cla 说在开头 在天池的比赛中涉及到了docker的使用.经过多番探究,大 ...

  2. BIND简易教程(0):在Ubuntu下源码安装BIND(其实跟前面的教程没太大关系)

    之前介绍过BIND的基本使用啦.关于BIND的入门级使用方法见:http://www.cnblogs.com/anpengapple/p/5877661.html简易教程系列,本篇只讲BIND安装. ...

  3. 文件上传利器SWFUpload入门简易教程

    凡做过网站开发的都应该知道表单file的确鸡肋. Ajax解决了不刷新页面提交表单,但是却没有解决文件上传不刷新页面,当然也有其它技术让不刷新页面而提交文件,该技术主要是利用隐藏的iFrame, 较A ...

  4. Intellj IDEA 简易教程

    Intellj IDEA 简易教程 目录 JDK 安装测试 IDEA 安装测试 调试 单元测试 重构 Git Android 其他 参考资料 Java开发IDE(Integrated Developm ...

  5. Flow简易教程——安装篇

    .mydoc_h1{ margin: 0 0 1em; } .mydoc_h1_a{ color: #2c3e50; text-decoration: none; font-size: 2em; } ...

  6. Dart 语言简易教程系列

    google Fuchsia系统 及 dart语言简介 在 InteIIiJ IDEA 中搭建 Dart 的开发环境 Dart Linux 开发环境搭建 Dart 语言简易教程(一) Dart 语言简 ...

  7. NOI Linux的安装说明以及使用指南

    安装 本人的安装环境为Win10. 1. 首先从官网上下载一个CCF官方提供的Noi linux虚拟机以及安装文档 传送门 2. 然后,安装一个VMware Workstation 14 Pro,这里 ...

  8. Ubuntu安装教程(双系统)

    经常要重装还不如写个安装教程省的每次都要查 Ubuntu安装教程: win7下安装Linux实现双系统全攻略:https://jingyan.baidu.com/article/c275f6bacc3 ...

  9. BIND简易教程(1):安装及基本配置

    首先,为什么说是简易教程呢?因为BIND的功能实在太多,全写出来的话要连载好久,我觉得我没有那么多精力去写:而我了解的仅仅是有限的一点点,不敢造次.百度上的文章也是一抓一大把呐!所以,教点基本使用方法 ...

随机推荐

  1. SDUT 1400 马的走法(回溯法)

    题目链接: 传送门 马的走法 Time Limit: 1000MS     Memory Limit: 65536K 题目描述 在一个4*5的棋盘上,马的初始位置坐标(纵 横)位置由键盘输入,求马能返 ...

  2. 重置SQL Server连接池

    EXEC sp_configure 'show advanced options', 1 GO -- To update the currently configured value for adva ...

  3. SVG 使用

    SVG即Scalable Vector Graphics可缩放矢量图形,使用XML格式定义图形, 主要优势在于可缩放的同时不会影响图片的质量. SVG 在html 中常用的方法 1.使用<img ...

  4. 安装ArchLinux的参考分区方案

    其实就是从Archwiki上搬运过来的 = =. 分区方案 虽然有一些关于分区方案的通用建议,但没有严格的准则.有许多影响分区方案的因素,例如对灵活性的期望,访问速度,安全性以及可用磁盘空间的硬性限制 ...

  5. Android logcat lines missing原因分析

    当出现类似如下错误日志时: 2019-04-14 17:51:14.506 10189-10189/com.ss.android.ex.parent D/GGK: no WonderfulVideo ...

  6. django-form字段form 和插件widgets

    26)django-form字段和插件widgets 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML 一:常用字段 1.Django中Fo ...

  7. SQL语句练习题【主供自己学习、记忆】

    1.这是我在面试中遇到的一道sql题,没有答出来,o(╥﹏╥)o 这是我刚才在网上查找函数之后写的SQL语句,能得到这个结果.[谁有不同的方法,欢迎底下评论留言哈] select (DATENAME( ...

  8. springBoot启动的时候动态选择装载某些bean

    最近有这样一个场景,我们使用了elasticjob lite框架,希望某些job在指定服务器不启动.让spring动态的来装载所需要的job及相关bean 这个时候可以使用@Conditional家族 ...

  9. promise知识点小结

    断断续续学习es6也有一段时间了,趁着开学空闲对知识点做一些小结. 为什么使用promise 谈到Promise,我们知道,这是社区较理想的异步编程解决方案.想要掌握promise,我们首先要知道其提 ...

  10. python 列表list操作

    1. 切片:(左闭右开) 用-1倒置 2. 拆包 3. list的append 与 insert 4. 两个列表合并,直接 + : 5. 加入列表 extend: 6. pop()删除(通过序号,或最 ...