关于c++的一些语法以及技巧


目录

  1. 文件操作
  2. 随机数
  3. 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函数的时间单位是毫秒