2023/9/27 讲课用

杂谈

表达式

首先来明确一些概念

值(value)

即为一个静态的量。值可以是整数,浮点数,字符,字符串等

变量(variable)

可以形象地理解为,存储值的容器。

变量有诸多类型,一般而言,变量只能存储对应类型的值。

int a=0;

“ 我向系统声明:我需要一小块内存,来存储一个整数变量,变量的值为 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 这个变量而 ++ii++ 是等效的,二者进行后,i 的值都比原来增加了 1

然而,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的结果
}

循环可以随便嵌套,只要你能理解每一层循环分别在干什么就行

如果有必要的话,你可以这么写:截图 2023-09-27 10-10-39.png

虽然没什么实际意义就是了

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 时,其返回值为 0 ,循环条件不满足,循环自动终止。

posted @   actypedef  阅读(109)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示