2023/9/27 讲课用
杂谈
表达式
首先来明确一些概念
值(value)
即为一个静态的量。值可以是整数,浮点数,字符,字符串等
变量(variable)
可以形象地理解为,存储值的容器。
变量有诸多类型,一般而言,变量只能存储对应类型的值。
int a=0;
“ 我向系统声明:我需要一小块内存,来存储一个整数变量,变量的值为 ”
变量的值可变,通过赋值操作实现。
变量名不是变量的值。
char TJU='?';
cout<<TJU<<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(表达式){
;
}
for(循环变量;表达式;操作){
;
}
// 当表达式的值为 true 时,循环才能持续进行,分支中的语句才会执行
// 换句话说,当圆括号里的表达式为真,也就是条件满足时,才会进行大括号里的内容
if(a>b){
if(b>c){
do sth;
}
}
//equal to
if(a>b&&b>c){
do sth
}
三目运算符(选)
/*
int c;
if(a>b) c=a;
else c=b;
*/
int c=(a>b?a:b);
条件?满足时的值:不满足时的值
科普,不会也没事
i++ 与 ++i
int i=0,j=0;
int a,b;
a=i++;
b=++j;
//val a=0 val b=1
//val i=1 val j=1;
对 i
这个变量而 ++i
与 i++
是等效的,二者进行后,i
的值都比原来增加了
然而,i++
整体的值为自增前的 i
,++i
整体的值为自增后的 i
也就是说,在上述赋值操作中,i++
是先赋值再对 i
进行自增,++i
是先对 i
自增再进行赋值
如果有些地方用到了 ++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的结果
}
循环可以随便嵌套,只要你能理解每一层循环分别在干什么就行
如果有必要的话,你可以这么写:
虽然没什么实际意义就是了
int a[10][10][10][10][10][10];
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
for(int k=0;k<10;k++)
for(int l=0;l<10;l++)
for(int m=0;m<10;m++)
for(int n=0;n<10;n++)
scanf("%d",&a[i][j][k][l][m][n]);
bonus: break & continue
for(int i=1;i<=10;i++){
if(i==4) continue;
cout<<i<<" ";
}
/*
output:
1 2 3 5 6 7 8 9 10
*/
for(int i=1;i<=10;i++){
if(i==4) break;
cout<<i<<endl;
}
/*
output:
1 2 3
*/
for(int i=1;i<=3;i++){
cout<<"Line "<<i<<": "<<endl;
for(int j=1;j<=7;j++){
if(j==4) continue;
cout<<j<<" ";
}
cout<<endl;
}
/*
output:
Line 1: 1 2 3 5 6 7
Line 2: 1 2 3 5 6 7
Line 3: 1 2 3 5 6 7
*/
for(int i=1;i<=3;i++){
cout<<"Line "<<i<<": "<<endl;
for(int j=1;j<=7;j++){
if(j==4) break;
cout<<j<<" ";
}
cout<<endl;
}
/*
output:
Line 1: 1 2 3
Line 2: 1 2 3
Line 3: 1 2 3
*/
for(int i=1;i<=3;i++){
if(i==2) continue;
cout<<"Line "<<i<<": "<<endl;
for(int j=1;j<=7;j++){
cout<<j<<" ";
}
cout<<endl;
}
/*
output:
Line 1: 1 2 3 4 5 6 7
Line 3: 1 2 3 4 5 6 7
*/
有时间再说
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
诸如此类
这些数据一般是由标程 std.cpp
运行的结果作为参照的
后台的评测数据有很多组,一般不会让错误代码蒙混过关 (大概)
常见错误
- RunTimeError:运行时错误,常见原因有数组的越界访问,递归爆系统桟
在线与离线
在线(选)
在线操作,就是当你每进行一次输入,就对当此输入进行运算,随即输出结果
离线(选)
离线操作,就是存下输入的内容,再统一计算、统一输出
关于读入不定行数的数据
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 时,其返回值为 ,循环条件不满足,循环自动终止。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理