杂谈
表达式
首先来明确一些概念
值(value)
即为一个静态的数据。值可以是整数,浮点数,字符,字符串等
变量(variable)
可以形象地理解为,存储值得容器。
变量有诸多类型,一般而言,变量只能存储对应类型的值。
int a=0;
“ 我向系统声明:我需要一小块内存,来存储一个整数变量,变量的值为 \(0\) ”
变量的值可变,通过赋值操作实现
变量名不是变量的值
char TJU='?';
cout<<YJU<<endl;
//运行结果:?
a=b;//把b的值赋给a,b的值不会改变
int a=1,b=2;
a=b;
cout<<a<<" "<<b<<endl;
//运行结果:2 2
表达式(不知道英语是啥)
表达式的结果是值
1234*4321+1145/14
这种表达式的结果就是算数的结果
(a==b&&(c!=d||e>f))
这种表达式的值就是逻辑运算的结果,true or false
一般来说,非零的值都被认为是true
逻辑运算
逻辑与,逻辑或,逻辑非
&& || !
逻辑与&&
,两侧都为 true
,结果才是 true
逻辑或||
,两侧都为 false
,结果才是 false
逻辑非!
,真变假,假变真
运算优先级(选):非>算数>与>或
当然,小括号是最优先的,如果你拿不准,多加点小括号总没有错
if(表达式){
;
}
while(表达式){
;
}
// 当表达式的值为 true 时,循环才能持续进行,分支中的语句才会执行
if(a>b){
if(b>c){
do sth;
}
}
//equal to
if(a>b&&b>c){
do sth
}
三目运算符(选)
a>b?a:b;
条件?满足时的值:不满足时的值
科普,不会也没事
i++ 与 ++i
有时间再说
嵌套
例题:对于不定组的 a 和 b,计算两数之和,并统计 998244353
在结果中出现了多少次
int cnt=0;//记得初始化,否则值由系统随机分配
while(cin>>a>>b){
int sum=a+b;
if(sum==998244353)
cnt++;
cout<<sum<<endl;//这是与局部有关的结果
}
cout<<sum<<endl;//这是与全局有关的结果
例题:课后题 4
int cnt=0;
while(cin>>a>>b>>c){
cnt=0;//每次要初始化,不能让上次的结果影响到了下次
for(int i=a;i<=b;i++)
if(c%i==0)
cnt++;//局部的计算过程
cout<<cnt<<endl;//这是对于一组abc的结果
}
bonus: break & continue
有时间再说
SUBMIT 后发生的事
当你提交你的代码后,评测姬会对你的代码进行评测
一般来说,Online Judge 实现的功能,就是对你的代码进行评测,看看它能否完成题目要求的功能
//a+b problem
//Sample input:
//1 3
//Sample output:
//4
int a,b;
cin>>a>>b;
cout<<1+3<<endl;
显然,这份代码输出结果满足样例,但它不能满足题目要求:求给定两个数的和
Online Judge 所作的事,就是让你的代码去计算更多,更加一般的数据
1234 4321
5555
诸如此类
后台的评测数据有很多组,一般不会让错误代码蒙混过关
在线与离线
在线(选)
在线操作,就是当你每进行一次输入,就对当此输入进行运算,随即输出结果
离线(选)
离线操作,就是存下输入的内容,再统一计算、统一输出
关于读入不定行数的数据
while(cin>>x){
calc(x);
cout<<ans<<endl;
}
//another possible version:
// while(~scanf("%d",&x)){
while(scanf("%d",&x)!=EOF){
;
}
这样,一般被称为在线操作
有的人可能会疑惑:题目中输入的数据是一口气给你的,输出难道不应该在所有输入之后进行吗?评测姬会判我错吗?
这样当然容易实现:把每组数据的答案用数组保存下来,在统一输出即可,不过没必要的,也不会被判错。
原理:评测时,输入数据结尾有个 EOF(End Of File) 作为标记,代表文件的结尾。当 cin
读入到 EOF 时,其返回值为 \(0\) ,循环条件不满足,循环自动终止。