这个教程,也许理想状况下将会以较轻松幽默的语言较全面地指导NOIP(?)比赛中的知识、注意事项。
进入教程吧。
如果在阅读过程中,发现某处有错或难以理解,欢迎反馈,这会帮助更多的人.
在获得帮助前,自己尝试解决也许能学到更多.
对于非教程内的问题,不保证回答.但是呢...
开个玩笑
目标
阅读完这一篇文章,你将会掌握
- 缩小一点神秘的计算机黑盒
- 粗面了解你要面对的东西
- 会配开发环境
- 在指导下运行起来已经被无数人写过无数遍的第一个程序。哦,如果你已经有了一点编程基础,当我没说。
- 提高自学能力
起步
概览
你可能需要以下东西
- 脑子和大量的时间
- 嘤语
- (越多越好的)数学基础:推算公式的能力,数论,图论,运筹学等。不过你不需要现在就掌握它们,也不需要了解太深.
- 学会至少2门编程语言:比如C++和Python
- 了解Linux和Windows
- 擅于利用系统命令行
- 自学和解决麻烦的能力
脑子,时间,嘤语,数学基础不在讨论范围内,请自行准备。只会在必要时补充一小部分。
那么,接下来
确定一门语言
只要你阅读到这,我就默认你不管是因为什么原因,反正是想参加NOIP了。为了参加NOIP,你需要确定自己的学习方向。
说是方向,最多也就是选择个语言。
编程语言如同人的自然语言一样,分为多种。它们各有各的特点和优势,分别用于不同的领域。在中国,你得说汉语;在联合国,你最好说嘤语。在NOIP中,程序集中于表现算法和数据结构,强调效率,因此,官方限定的语言有:
- C++
- C
- Pascal(它即将被去掉)
为什么Pascal要被去掉了?
如果你已经读过一些较老的教程,那么你可能更熟悉Pascal。然而,计算机与其他学科不一样,它发展实在太快了。
Pascal实际上是利于表达算法的语言,但是由于历史因素,它的种种特性如几乎没有的包管理,(在目前看来)奇怪的语法,限制了它在现代下的使用范围。可能是出于这种考虑,Pascal将于不久后从NOI系列比赛中被移除。
虽然C系列的语言相比Pascal更难以学习,但是学了对你没坏处。学不会就再学,如果确定不会的话,现在停下是可以的。
听说还能用其他的语言
有些比赛可以用更多其它类型的语言.不过,参加OI还是老老实实从上面选一个.并且学好C系语言后,快速掌握其他语言语法并不困难.
我将使用C++作为导学语言,原因有下:
- 难学
- 特性多的令人抓狂
- 居高临下地学习其他语言
- 加上STL瞬间增加学习内容
- 我只会C++
确定一门辅助脚本语言
什么是脚本语言?
为了解释这个问题,需要引入2个概念:解释型语言和编译型语言.脚本语言属于解释型语言,指运行时由解释器直接解释运行,无需编译.(可以理解为同声翻译)编译型语言如C++,需要经过编译生成相应平台的运行程序后才能运行.(可以理解为事先翻译)
为什么非得再学一个语言不可?
脚本语言自有它的优点,小巧方便,适用于NOIP中编写暴力算法,写对拍,写生成器......当你了解了脚本语言和编译语言的差异时,你会选择再学的.
啥是暴力,啥是对拍,啥又是生成...
打住,之后会有解释.
建议选择:
- Python
- Ruby
- bash或bat
你选择了Python,因为你了解到任何Linux发行版上都自带它.而且你又了解到一个事实:不管你选哪个,选项3中的2个玩意你都会被迫学习一点.
了解Linux
在windows之外,还有一个系统叫做linux.
其实还有个系统叫OSX.
其实还有很多系统.
在开发程序时,这两个都比用windows好.
根据规定,原则上竞赛使用的操作系统为linux,评测机一定是linux.
相对于windows,linux对编程极其友好,体现在环境的配置以及各平台的支持上.你有必要在电脑上安装linux系统.如果你不想折腾,建议安装深度
.这是一个国产的linux发行版,非常适合过渡到linux同时保留图形界面的使用习惯,尽量不造成麻烦.
请悉知:深度系统似乎有停滞的危险,请搜索关于深度的新闻了解详情。
想快速提高能力的话,请选择arch发行版进行自虐.在安装和配置arch的过程中,你可以了解如何看wiki,了解引导,初步了解linux的命令行,了解linux的文件系统和软件组织形式以及配置方法,了解bash脚本的写法。
你甚至可以了解怎么快速删除这个系统然后重装其他简单的发行版.
"用户体验是狗屁,用户中心是王道."
--arch大法好
当然,现在有巨硬家的加成,最新的windows 10系统还可以选择安装subsystem
,它将提供给你近完备的linux环境.这也是个非常好的选择,能给你省点事.可以用作临时方案.
提供给你的发行版候选
- elementary
- ubuntu
- fedora
- openSUSE
- 等等
了解windows
自己想办法.可参考初高中的计算机教材,如果你还能找到的话.
与命令行做伴
不要畏惧命令行,总有些时候不得不用它.
为了快速的使用图形界面,需要记住各种快捷键;使用命令行,需要...
不管用什么,你都得付出代价.而它们给你带来的收获却不一样大.图形界面早就熟悉了,命令行能教给你新的东西.
配置开发环境
c++
推荐配置是:掌握dev c++用法后使用code blocks或者vscode.同时一定学会使用gdb.(它会在之后提到)
对windows系统的步骤
- 安装你选择的IDE和编辑器(推荐:code blocks + sublime text)
- 建议你再自行安装编译器(必须:MinGW)
- 了解环境路径的作用,并配置好编译器的环境变量.
- 按
win
+R
,输入cmd
并回车.在新窗口中输入g++
或clang++
,观察输出.你不应该看到类似于没有找到相应可执行文件
的错误,否则请检查上述过程是否出错.
对linux系统的步骤
- 了解系统发行版的包管理程序
- arch为pacman
- ubuntu为apt
- opensuse为yast
- 等等
- 使用包管理安装
gcc
- 打开终端,输入
g++
,观察输出. - 恭喜,你不需要自己配置什么环境变量,并且今后的升级和卸载均能够全自动完成.
对OS X的步骤
- 如果事先没有安装,安装
homebrew
- 了解
homebrew
的用法 - 安装
clang++
与gcc
最后windows和OS X可以选择再安装下vs,体验世界第一IDE的快感.
以下是对可能会用的一些软件的小说明
(如果你的考场没用NOI Linux的话)
Dev C++
这是目前考场标配的一个IDE,你可以选择安装它,它将自动安装好编译器.那么剩下的这些你都可以略过.
但注意,它的调试能力几乎为0.用这玩意调试程序会让你痛不欲生.
code blocks
有的考场会提供这个.
这是个不错的轻量级IDE,调试功能完备.你需要提前安装编译器,如何安装编译器在下方.
Sublime Text
很多考场会提供这个.
这是个编辑器,但是它是极其优秀的选择之一.为了使用它你需要更加充分的了解命令行并且安装编译器.
Visual Studio
几乎没有考场提供这个.
自带全套开发工具.宇宙第一IDE,如果你的考场真的有这个,一定要用!调试能力无人能比.但是平时只建议了解,不要依赖,会上瘾.
Visual Studio Code
应该不会有考场提供这个
你可以在sublime和这个之间选一个安装.
Atom
应该不会有考场提供这个
你可以在visual studio, sublime 和这个中选一个.
vim
是否提供不好说
...如果你能学会的话,不反对使用
编译器
- 对于linux,
GCC
或者clang++
,你只有这2个选择. - 对于windows,
MinGW
,不想作死就装这个.clang对windows支持很差,而微软的编译器附带在IDE内. - 对于osx,
clang++
,苹果亲儿子.GCC
也行
建议在日常使用中尝试下clang.clang的错误提示信息比gcc更加友好.
不过比不上rust的编译器,分分钟教你做人.
为什么不使用微软的编译器
微软的编译器中有自己夹杂的私货.的确,有的很方便,但是不属于C++标准,没有被其他编译器支持,你在考场上遇到GCC的编译器时可能就很难受.
几种概念间的关系
可能有人会奇怪编译器,编辑器,IDE之间的区别.
这要从编写的代码的格式说起.其实,你编写的一段代码,也不过是一段文本,并以文本的形式保存在电脑上,仅仅是后缀名被改为了
.cpp
.这个文本经过编译器的编译后能够生成程序.编辑器其实就是一个附带方便编程的各种工具的"记事本".编辑器和编译器毫无关系,任意组合.
而IDE稍微有点复杂了,IDE如同胶水一样,将代码编写的过程中所需的工具(如编辑器,编译器,调试器)全部集成在了一起.
知道这些概念有什么用处?随着学习的深入,概念将变得越发重要.你至少得搞清楚自己在学什么.
"我的编译器是 Dev C++哦!"--千万别再这么说了,若是有别人这样讲,大可笑笑.
Python
如果你是linux或OSX,那可以跳过了.
如果你是windows,请安装linux.
- 上百度或者google搜索
Python
. - 打开python官网,找到类似于download的按钮.
- 选择适合自己系统的版本下载,注意,请选择python3.
- 如果你没法确定
x86
和x86_64
的意思,请再百度或google.
万能解决方案
如果你不想看上面的东西.........................................
那就安装个NOI Linux吧,一步到胃位.
实际上是Ubuntu的定制版,极其难用,慎重安装.
第一个程序
有这么一个传统,不管是什么语言诞生,它的第一个程序都是:输出hello, world
.现在,来写第一个程序.
使用你的vs code或者sublime新建文件,输入
#include
using namespace std;
int main() {
cout << "hello, world" << endl;
return 0;
}
不要直接复制,请亲自动手.你要注意的有以下几点:
- 用英文输入
- 注意除引号内的单词外的所有拼写.还有引号是tm英文状态下的!
- 注意分号
- 不要试图从语言层面上理解这些单词的意思,这一般不管用
- 不要太纠结它们都是什么意思,纠结现在也不告诉你,自己搜
现在,保存为
,然后打开cmd或者终端,切换至文件所在目录,输入
- 如果你是gcc:
g++
.cpp -o - 如果你是clang++:
clang++
.cpp -o
如何切换目录
- windows:在盘符间切换请直接输入
<盘符>:\
然后回车;在目录切换请使用cd
.- linux:直接
cd
.
现在,在目录下生成了执行文件,继续输入./
来运行相应程序.你将会看到输出hello, world
.
相对目录和绝对目录
./
:当前目录../
:上一级目录/
:根目录
现在,假设有这种目录结构
|project
| |a
| | |debug
| | | debug.cpp
| | release.cpp
| |b
| | b.cpp
目前在a
目录下,那么,你可以这样表示其他目录下的文件
- debug.cpp:
debug/debug.cpp
- b.cpp:
../b/b.cpp
这被称为相对目录,即以当前目录为准,通过移动进入其他目录.
而绝对目录就是一个文件的全目录,如
- debug.cpp:
/project/a/debug/debug.cpp
使用相对目录能够给带来一些便捷,谁都不想动不动输入这么长的目录,不是吗?
结
至此,结束.
希望它还有下一章.
没办法,我就是不知道怎么打开cmd?
按住
徽标键
后敲击R
,在出现的窗口里输入cmd
,回车.如果你不会开bash,上网搜,搜了还不知道,请暂时远离linux.
上哪找环境变量啊?
- win:右键
这台电脑
,选择属性,高级属性,一个tab一个tab的翻,反正它就在那,总会看到的.- linux:请培养使用wiki和搜索的能力.
我想学C,我也不想学Python
至少在NOI的比赛里,你会比学CPP丢掉很多好处(你可以事先了解一下STL).不想学Python,用C++也勉强可以代替,就是很麻烦是了.