社区讨论

NOIp C++在NOI Linux下编译时的注意事项

灌水区参与者 24已保存回复 39

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
39 条
当前快照
1 份
快照标识符
@mi7crvhh
此快照首次捕获于
2025/11/20 19:33
4 个月前
此快照最后确认于
2025/11/20 23:43
4 个月前
查看原帖
RT,给自己一个提醒RT,\text{给自己一个提醒}


1、在windows中可以对结构体初始化,但是在NOI Linux下测试是错误的。
1)
CPP
struct Tpoint
{
int a[20];
int num=13;
}a[100];
结构体中是不能直接初始化的。一般要用构造函数才正确。在liunx下测试0分。 如果一定要初始化又不太会写构造函数,可以用 for 循环赋值。
---------------------\texttt{---------------------}
2、文件名不要搞错,在windows下面邹ht同学为了与a.out对齐,在a.in 后面加了一个空格,在windows下面编译通过,但是在NOI Linux下面编译错误;
1) 原来200分,在linux下0分。
错误是:
CPP
ifstream fin ("a.in ");
ofstream fout ("a.out");
ifstream fin ("b.in ");
ofstream fout ("b.out");
能看出来吗?我找了很久:(
---------------------\texttt{---------------------}
3、在 windows 下面判断一行字符串是否结束:while(c!=’\n’),在 Linux 下面不 能这样判断,因为 Linux 下面字符串结尾是两个字符#13#10,而 windows 下面 则只有一个#10;现在我们来分析一下,如果是在 Linux 下面如何去读入字符串, 例:
CPP
10 3
adsdfa dasjfasd asdfasdf
asewrer adrepw joo
aSDjf asdf
(1) 全部都只用 cin 读入,则对第一行数据,两个 cin 后光标停留在 3 后面,对于第二行数据 cin 制度如第一个字符串 adsdfa,然后再读入第二个字符串 dasjfasd
(2) 全部都只用 getline 读入,则读入第一行数据后(同时也读入了 Linux 下 才出现的最后两个特殊字符),并要将数字 10 3 转化成数字,具体语句 如下:
CPP
while (s[s.size()-1]<32)
	s.erase(s.size()-1,1);
(3) 如果用 cin 和 getline(cin,s)混合使用,用 cin 读完 10 3 后,后面的两个 特殊字符要用 getline(cin,s)将其读入,这个时候光标就会停留在第 2 行的 第 1 个位置;
---------------------\texttt{---------------------}
4、linux 下不能用 int64,要用 long long,scanf("%lld",&a),printf("%d",a); 64 位(long long )输入输出:因为 windows 和 linux 两种系统下输出格式符不一致, 建议用流。但数据在 10^5 以上时,可能有点慢。linux 可用:
CPP
scanf("%lld");
---------------------\texttt{---------------------}
5、对于字符串,cin>>s; 对于大数据量的字符或者 int,float 我们建议用 scanf("%f%d%c",&a,&b,&ch); 注意用 scanf 的时候要用 freopen("a.in","r",stdin),另用 freopen 要用到库 <stdio.h>或者<cstdio>
---------------------\texttt{---------------------}
6、注意:要用你熟悉的语句去做,不要装 13; fin >> f[i] >> g[i++] ; 在linux下竟然是错误的!!
===========================
windows下也有类似问题:
如有函数 cal(i)
CPP
cout << cal (3) << cal (5) <<endl;
其实是先调用 cal(5)。
---------------------\texttt{---------------------}
7、常用函数的库,尽量把库都写进去
CPP
#include <stdio.h>
#include <cstdio>
#include <cmath>
#include <iostream>
#include <fstream>
#include <algorithm>	//abs\sort\max\min
#include <string>
#include <cstring>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <iomanip>	//这个用来输出小数点
cout<<fixed<<setprecision(2)<<a<<endl;
---------------------\texttt{---------------------}
8、小数输入输出:
 自己编函数输出
 用 printf()输出:
 fprintf(out, “%.6lf\n”,res); (输出六位小数)
 用流格式化输出:
CPP
cout.setf(ios::fixed);
cout.precsion(2); 
或样例: C++
CPP
#include <iomanip>
fout<<fixed<<setprecision(6)<<data<<endl;
#include <stdio.h>
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
fscanf(fin,"%d",&tmp);
fprintf(fout,"%0.3lf",data);
---------------------\texttt{---------------------}
9、常用函数与库
函数名功能包含库
sortalgorithm
maxalgorithm
minalgorithm
memsetstring.h
absalgorithm
ceilmath.h
floormath.h
fabsmath.h
labsmath.h
sinmath.h
asinmath.h
log
log10
sqrt
pow
exp
---------------------\texttt{---------------------}
10、写 cmp 的时候,不要写<=,>=;
---------------------\texttt{---------------------}
11、全局变量不要用find,power,max之类单词, 甚至不能用y0,y1变量。
---------------------\texttt{---------------------}
12、位操作时,要注意范围,比如:
CPP
int i =1;
cout << (i>>32) <<endl;
可能会出错,即位移x>=32次以上可能会是只位移了 x%32
不明白的是 cout<< (1>32)<< endl;是正确的!
位操作多加括号
嗯.

回复

39 条回复,欢迎继续交流。

正在加载回复...