关于c++的一些语法以及技巧
目录
- 文件操作
- 随机数
- Sleep等待函数
1.文件操作
关于文件操作,在\(csp,noip\)等竞赛中经常用到,想必大家都很熟悉了。
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
这两句话是完成文件操作的代码,它实现了对输入输出进行重定向的功能。a.in和a.out是文件名,r表示只读,w表示只写,stdin和stdout是系统标准输入输出,即平时的键盘输入与系统控制台的输出。
然而,在我们做小程序时,可能会思考:freopen能否关闭呢?有两个常用函数:
fclose(stdin);
fclose(stdout);
测试了一下,发现这两个函数并不能关闭freopen,重定向到键盘输入与系统控制台输出。
我们来看看真正能关闭freopen的代码
#include
using namespace std;
int main() {
int a, b;
cin >> a >> b;
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
cout << a << " " << b << endl;
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
cin >> a >> b;
cout << a << " " << b << endl;
return 0;
}
其中\(CON\)指控制台。
2.随机数
用普通的随机数rand()函数生成的随机数是伪随机数,是通过一个随机种子经过一个公式计算得出的。
下面这个程序我们反复运行,发现随机数是一样的。
#include
using namespace std;
int main() {
for(int i = 1; i <= 5; i++) {
cout << rand() << endl;
}
return 0;
}
那么我们就要用srand()函数来改变随机种子,最方便的方法就是拿时间当随机种子了,这样可以确保数据足够随机。
#include
#include //time使用的头文件
using namespace std;
int n = 10000;
int main() {
srand(unsigned(time(0)));//随机种子
for(int i = 1; i <= n; i++) {
cout << rand() << endl;
}
return 0;
}
但是我们发现随机数的数据相差太大,我们能不能指定一个随机数的产生范围呢?聪明的你一定想到了,对随机数取模!
#include
#include
using namespace std;
int n = 10000, s = 10;//生成n个0~s之间的随机数
int main() {
srand(unsigned(time(0)));
for(int i = 1; i <= n; i++) {
cout << rand() % s << endl;//对随机数取模
}
return 0;
}
为了确保我们的想法足够正确,我们可以把每个数出现的概率输出。

这是代码
#include
#include
using namespace std;
int a[11], n = 100000000, s = 11;
int main() {
srand(unsigned(time(0)));
for(int i = 1; i <= n; i++) {
int x = rand() % s;
a[x]++;
}
for(int i = 1; i <= s; i++) {
double k = double(a[i]) / double(n);
printf("%d出现的概率为%.2lf%%\n", i, k * 100);
}
return 0;
}
3.Sleep等待函数
Sleep等待函数可以让系统控制台等待一段时间
具体用法见代码
#include
#include
using namespace std;
int main() {
cout<<1;
Sleep(1000);
system("cls");
cout<<2;
return 0;
}
这样可以使控制台先输出1等待1秒,再清屏再输出2。
Tip注意Sleep的\(S\)要大写头,文件用windows.h,Sleep函数的时间单位是毫秒