AcWing语法基础课学习笔记
第一讲 变量、输入输出、表达式与顺序语句
0 AcWing算法系列课
4个Level:
- 语法基础课:C++在算法竞赛、算法考试中常见语法(非工程)
- 算法基础课:各种常用算法、代码模板【找工作就没问题了… 🌛 】
- 算法提高课:应用技巧
- 算法进阶课:特别难的题【NOI… 🌊 】
【AC Saber 介绍】
好好好🗡
语法基础课内容:
开始吧!
虽然很多东西都会了, 但是毕竟花钱买了,别浪费了
1 第一章 C++入门及简单的顺序结构
编程是一种控制计算机的方式,和我们平时双击打开文件、关机、重启没有任何区别。·
1.1 软件环境
-
编译软件的安装与使用
全部在云端,不用自己搭了
酷
新建源文件
#include<iostream> using namespace std; int main(){ cout << "Hello world!" << endl; return 0; }
保存
-
编译运行
F10
C++ 源文件结构:【暂时】
-
头文件
<cstido>
:printf、scanfiostream
:cout、cin
-
使用命名空间
using namespace std;
-
程序执行入口
int main(){ return 0; }
1.2 语法基础
【1】变量的定义
变量必须先定义才可以使用,不能重名
常用变量类型及范围:
int
: − 2 31 -2^{31} −231 ~ 2 31 − 1 2^{31} - 1 231−1,4bytebool
:false 0 和 true 1,1 byte(8 bit)char
:字符,1bytefloat
:单精度浮点数,6-7位有效数字,4bytedouble
:双精度浮点数,15-16位有效数字,8bytelong long
:更长的整数型, − 2 63 -2^{63} −263 ~ 2 63 − 1 2^{63} - 1 263−1,8bytelong double
:更长的double,18-19位有效数字,16 byte
定义格式:
整数:
int a , b = 2, c = b;
// 等价于
int a;
int b = 2;
int c = b;
【2】输入输出
AcWing 1. A + B
#include<iostream>
using namespace std;
int main(){
int a,b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}
- AC:通过
- WA:答案错误
- TLE:超时
- MLE:超内存
- SF:数组越界
- CE:编译错误
printf
和 scanf
输入输出:
int a, b;
scanf("%d%d",&a,&b);
printf("%d %d\n",a + b, a * b);
- 这个在格式化输入输出时很方便
- 但是会判断类型
cout
和cin
不会判断类型- 【记得】所有能用cin 和 cout 的地方,一定可以用printf、scanf 替换,但是反过来不一定可以【效率问题,printf、scanf 要快一点】
单精度浮点数保留位数:
float a, b;
scanf("%f%f", &a, &b);
printf("a + b = %.1f\na * b = %.2f\n",a + b, a * b);
字符:
scanf("%c%c", &a, &b); // 这种方式会读入空格,但是cin 不会
printf("%c %c\n",a, b);
双精度浮点数输入输出:
double a,b;
scanf("%lf%lf", &a, &b);
printf("%lf %lf", a, b);
long long
类型:
long long a,b;
scanf("%lld%lld", &a, &b);
printf("%lld %lld", a, b);
【3】表达式
整数的加减乘除四则运算:
整型变量的自增和自减
a++
、a--
:先用再加减++a
、--a
:先加减再用
还有那种:
a = a + 1;
→a += 1;
a = a - 1;
→a -= 1;
- …
变量的类型转换:
变量之间可以相互赋值
- 整数到浮点:相当于直接变过去
- 浮点到整数:下取整
- int 和 char 之间:ASCII码表
int a = 5;
float b = (float)a;
printf("%f",b); //5.000000
float a = 5.23;
int b = (int)a;
printf("%d",b); // 5
int a = 97;
char b = (char)a;
printf("%c",b); // a
...
当然这都是显式转换。
还有一些隐式的转换关系:【往精度高的转】
int
和float/double
→float/double
char
和int
→int
int
和long
→long
float
和double
→double
【4】顺序语句
就一直往下走… 每一句代码按编写顺序执行。
AcWing 608. 差
#include <iostream>
using namespace std;
int main(){
int A, B, C, D;
cin >> A >> B >> C >> D;
cout << "DIFERENCA = " << A * B - C * D << endl;
return 0;
}
AcWing 604. 圆的面积
百分之99的评测器,会自动过滤掉最后一个回车和每一行结尾的空格
#include <cstdio>
using namespace std;
int main(){
double R,pi = 3.14159,area;
scanf("%lf", &R);
area = pi * R * R;
printf("A=%.4lf",area);
return 0;
}
99% 的情况下,浮点数用double
AcWing 606. 平均数1
#include <cstdio>
using namespace std;
int main(){
double A, B;
scanf("%lf%lf", &A, &B);
printf("MEDIA = %.5lf", (A * 3.5 + B * 7.5) / 11);
return 0;
}
满权是11
AcWing 609. 工资
#include <cstdio>
int main(){
int number, hour;
double money;
scanf("%d%d%lf", &number, &hour, &money);
printf("NUMBER = %d\nSALARY = U$ %.2f",number, hour * money);
return 0;
}
AcWing 615. 油耗
#include <cstdio>
int main(){
double x, y;
scanf("%lf%lf", &x, &y);
printf("%.3lf km/l",x / y);
return 0;
}
AcWing 616. 两点间的距离
#include <cstdio>
#include <cmath>
int main(){
double x1, x2, y1, y2;
scanf("%lf%lf%lf%lf",&x1, &y1, &x2, &y2);
printf("%.4lf", sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
return 0;
}
注意读入数据顺序
AcWing 653. 钞票
#include <cstdio>
int main(){
int n;
scanf("%d", &n);
printf("%d\n", n);
printf("%d nota(s) de R$ 100,00\n", n / 100);
n %= 100;
printf("%d nota(s) de R$ 50,00\n", n / 50);
n %= 50;
printf("%d nota(s) de R$ 20,00\n", n / 20);
n %= 20;
printf("%d nota(s) de R$ 10,00\n", n / 10);
n %= 10;
printf("%d nota(s) de R$ 5,00\n", n / 5);
n %= 5;
printf("%d nota(s) de R$ 2,00\n", n / 2);
n %= 2;
printf("%d nota(s) de R$ 1,00\n", n / 1);
n %= 1;
return 0;
}
AcWing 654. 时间转换
#include <cstdio>
int main(){
int n;
scanf("%d", &n);
printf("%d:%d:%d", n / 3600, n % 3600 / 60, n % 60);
return 0;
}
AcWing 605. 简单乘积
#include <cstdio>
int main(){
int a, b;
scanf("%d%d",&a, &b);
printf("PROD = %d", a * b);
return 0;
}
AcWing 611. 简单计算
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
double n1, s1, p1;
double n2 ,s2, p2;
cin >> n1 >> s1 >> p1;
cin >> n2 >> s2 >> p2;
printf("VALOR A PAGAR: R$ %.2lf", s1 * p1 + s2 * p2);
return 0;
}
两种输入输出可以混用
AcWing 612. 球的体积
#include <cstdio>
int main(){
double r;
scanf("%lf", &r);
printf("VOLUME = %.3lf", (4 / 3.0) * 3.14159 * r * r * r);
return 0;
}
如果写成4 / 3 就不对了,两个整数算出来还是整数,结果精度会有问题
AcWing 613. 面积
#include <cstdio>
int main(){
double a, b, c;
scanf("%lf%lf%lf", &a, &b, &c);
printf("TRIANGULO: %.3lf\n", a * c / 2);
printf("CIRCULO: %.3lf\n", 3.14159 * c * c);
printf("TRAPEZIO: %.3lf\n", (a + b) * c / 2);
printf("QUADRADO: %.3lf\n", b * b);
printf("RETANGULO: %.3lf\n", a * b);
return 0;
}
AcWing 607. 平均数2
#include <cstdio>
int main(){
double a,b,c;
scanf("%lf%lf%lf", &a, &b, &c);
printf("MEDIA = %.1lf", (a * 2 + b * 3 + c * 5) / 10);
return 0;
}
AcWing 610. 工资和奖金
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
int main(){
string name;
cin >> name;
double x, y;
cin >> x >> y;
printf("TOTAL = R$ %.2lf", x + y * 0.15);
return 0;
}
string 其实在 iostream 也有
AcWing 614. 最大值
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int a, b, c;
cin >> a >> b >> c;
int tmp = (a + b + abs(a - b)) / 2;
int res = (tmp + c + abs(tmp - c)) / 2;
printf("%d eh o maior", res);
return 0;
}
当然math 库也在iostream 中有
这样也能AC
AcWing 617. 距离
#include <cstdio>
int main(){
int l;
scanf("%d", &l);
printf("%d minutos", 2 * l);
return 0;
}
先把公式求出来,
2l
的关系。60 分钟 30 公里,2 分钟1 公里,所以
l
公里,2l
分钟
AcWing 618. 燃料消耗
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
double t,s;
cin >> t >> s;
printf("%.3lf", t * s / 12);
return 0;
}
AcWing 656. 钞票和硬币
#include <cstdio>
int main(){
double m;
scanf("%lf", &m);
int n = m * 100;
printf("NOTAS:\n");
printf("%d nota(s) de R$ 100.00\n", n / 10000);
n = n % 10000;
printf("%d nota(s) de R$ 50.00\n", n / 5000);
n = n % 5000;
printf("%d nota(s) de R$ 20.00\n", n / 2000);
n = n % 2000;
printf("%d nota(s) de R$ 10.00\n", n / 1000);
n = n % 1000;
printf("%d nota(s) de R$ 5.00\n", n / 500);
n = n % 500;
printf("%d nota(s) de R$ 2.00\n", n / 200);
n = n % 200;
printf("MOEDAS:\n");
printf("%d moeda(s) de R$ 1.00\n", n / 100);
n = n % 100;
printf("%d moeda(s) de R$ 0.50\n", n / 50);
n = n % 50;
printf("%d moeda(s) de R$ 0.25\n", n / 25);
n = n % 25;
printf("%d moeda(s) de R$ 0.10\n", n / 10);
n = n % 10;
printf("%d moeda(s) de R$ 0.05\n", n / 5);
n = n % 5;
printf("%d moeda(s) de R$ 0.01\n", n / 1);
n = n % 1;
return 0;
}
需要注意的就是浮点数不能进行整除和取模,转成整数做
AcWing 655. 天数转换
#include <cstdio>
int main(){
int n;
scanf("%d", &n);
printf("%d ano(s)\n%d mes(es)\n%d dia(s)", n / 365, n % 365 / 30, n % 365 % 30);
return 0;
}
OK。