文章目录
前言
在经历了初步的编程概念洗礼后,你已经掌握了变量、数据类型、基本的算术运算符等核心知识点。本篇内容旨在巩固之前所学,并通过实例深入,带你领略C++语言的魅力,为NOI之路打下坚实基础。
我们将围绕以下几个关键点进行深化学习和实践:
-
常量的使用:理解常量与变量的区别,掌握字面常量与符号常量的定义及应用,特别是在处理固定数值如圆周率时,如何提升代码的可读性和维护性。
-
标识符的规范:学习如何正确命名标识符,遵循C++的命名规则,确保代码的清晰度和专业性,同时避免与关键字冲突。
-
整型变量的深入:除了基础的int类型,还将探索short、long、long long等整数类型,了解它们在内存占用、数值范围上的差异,以及如何根据实际需求选择最合适的类型。
-
实战演练:通过解决具体问题,如“扩建花圃”和“小明的游泳时间”,我们将理论知识转化为实践,强化整数运算能力,体会C++在解决实际问题中的灵活性和效率。
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
学习路线:C++从入门到NOI学习路线
学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲
一、大杂烩
1.导入
在上一节中各位学的怎么样?是否把变量、数据类型、int整型、算术运算符等知识点弄清楚?
上一节的知识点确实很多,对于初学者来说还是比较有难度的,因此我们今天不讲新知识。
咳咳~,简单对前面的知识进行补充。
2.常量
常量和变量一听名字就知道两个差不多,不同的是常量在程序执行期间其值不会发生改变,也就是不能重新赋值。
常量可以分为字面常量和符号常量两种类型。
C++中的字面常量不需要定义。字面常量是指在程序中直接使用的常量值,例如整型常量、字符型常量、字符串常量等。这些常量的值在程序编译时就已经确定了,因此不需要进行定义。例如:
int num = 10; // 定义一个整型变量num并初始化为10
int result = num + 20; // 使用字面常量20进行计算
在上面的代码中,20就是一个整型字面常量,它直接出现在程序中进行计算,而不需要进行定义。
而如果要在程序中多次使用同一个常量值,并且这个值写起来比较繁琐,比如计算圆的面积、周长、体积,我们需要多次用到圆周率3.14159265358979323846,这个时候就需要符号常量。
圆周率是一个确定的值(有限范围内),把圆周率定义为符号常量,这样可以提高程序的可读性和可维护性。例如:
#include <iostream>
using namespace std;
const double PI = 3.14159265358979323846; // 定义圆周率常量
int main() {
double r, c, s, v;
cout << "请输入圆的半径:";
cin >> r;
c = 2 * PI * r; // 计算圆的周长
s = PI * r * r; // 计算圆的面积
v = 4.0 / 3.0 * PI * r * r * r; // 计算圆的体积
cout << "圆的周长为:" << c << endl;
cout << "圆的面积为:" << s << endl;
cout << "圆的体积为:" << v << endl;
return 0;
}
C++中定义符号常量的方法:使用const关键字。使用const关键字定义符号常量的语法格式如下:
const 数据类型 常量名 = 常量值;
只是在变量的定义基础上加了const关键字,需要注意的是常量名全部大写,养成良好的代码习惯。
3.标识符
其实标识符就是我们前面讲到的变量名。准确的说变量名则是标识符的一种。
数据类型 变量名 = 值;
标识符是用来标识变量、函数、类、结构体等各种程序实体的名称。
标识符必须以字母、下划线或者汉字开头,后面可以跟字母、下划线、数字或者汉字。C++标识符是区分大小写的,长度没有限制。以下是一些C++标识符的命名规则:
- 标识符不能是C++关键字,例如if、else、while等。
- 标识符不能包含空格。
- 标识符不能以数字开头。
- 标识符不能包含特殊字符,例如@、#、$等。
- 标识符应该具有描述性,能够清晰地表达其含义。
4.关键字
C++关键字是指在C++编程语言中具有特殊含义的保留字,这些关键字不能作为标识符使用。
C++中的关键字包括:auto、bool、break、case、catch、char、class、const、constexpr、continue、decltype、default、delete、do、double、dynamic_cast、else、enum、explicit、export、extern、false、float、for、friend、goto、if、inline、int、long、mutable、namespace、new、nullptr、operator、private、protected、public、register、reinterpret_cast、return、short、signed、sizeof、static、static_assert、static_cast、struct、switch、template、this、thread_local、throw、true、try、typedef、typeid、typename、union、unsigned、using、virtual、void、volatile、wchar_t、while等。
并不需要将关键字全部记住,在Dev C++中关键字都会被不同的颜色和字体粗细区别出来。
5.整型补充
C++中的整型变量是一种用来存储整数值的数据类型。整数就是没有小数部分的数字。
以下是一些除 int 以外常见的C++整数变量类型:
5.1 short:短整型
占用2个字节,范围为-32768到32767。
声明一个short类型的变量a,并将其初始化为-123:
short a = -123;
5.2 long:长整型
其大小可以与int相同(即4个字节),但在很多现代系统尤其是64位系统上,通常占用8个字节(64位),范围扩大到-9223372036854775808到9223372036854775807。
#include <iostream>
using namespace std;
int main() {
long a = 2147483647;
a++;
cout << "a = " << a << endl; // 输出:a = 2147483648
return 0;
}
5.3 long long:长长整型
long long是一种整数类型,它可以存储更大的整数值。long long类型的变量至少占用8个字节(64位),可以存储的最大值为9223372036854775807,最小值为-9223372036854775808。
#include <iostream>
using namespace std;
int main() {
long long b = 9223372036854775807;
b++;
cout << "b = " << b << endl; // 输出:b = -9223372036854775808
return 0;
}
short、int、long和long long在运行速度上没有明显的区别,它们的区别在于占用的空间大小和能够表示的整数范围。
二、例题讲解
问题:1597. 买文具
类型:基本运算、整数运算
题目描述:
花花去文具店买了 1 支笔和 1块橡皮,已知笔 x 元/ 支,橡皮 y元 / 块,花花付给了老板 n 元,请问老板应该找给花花多少钱?
输入:
三个整数x、y、n ,分别代表了笔的单价、橡皮的单价和花花付给老板的钱(已知花花付给老板的钱 n≥x+y )。
输出:
一个整数,代表老板应该找给花花的钱。
样例:
输入:
2 1 10
输出:
7
1.分析问题
- 已知:笔的单价x、橡皮的单价y和花花付给老板的钱n。
- 未知:请问老板应该找给花花多少钱s?
- 关系:s=n-x-y。
2.定义变量
// 二、数据定义
int x, y, n, s; // 定义变量x存储笔单价,y存储橡皮单价,n存储支付总金额,s存储找零金额
3.输入数据
// 三、数据输入
cin>>x>>y>>n; // 输入笔单价、橡皮单价及顾客支付的总金额
4.数据计算
// 四、数据计算
s = n - (x + y); // 计算出老板应该找回给花花的金额
5.输出结果
// 五、输出结果
cout<<s; // 输出应找回的金额
return 0; // 程序正常结束,返回值为0
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
// 主函数入口
int main(){
// 一、分析问题
// 已知:笔的单价(x)、橡皮的单价(y)和顾客花花付给老板的总金额(n)
// 未知:老板应该找给花花多少钱(s)
// 关系:s = n - (x + y),即总金额减去商品总价等于找零
// 二、数据定义
int x, y, n, s; // 定义变量x存储笔单价,y存储橡皮单价,n存储支付总金额,s存储找零金额
// 三、数据输入
cin>>x>>y>>n; // 输入笔单价、橡皮单价及顾客支付的总金额
// 四、数据计算
s = n - (x + y); // 计算出老板应该找回给花花的金额
// 五、输出结果
cout<<s; // 输出应找回的金额
return 0; // 程序正常结束,返回值为0
}
问题:1596. 火柴棒三角形问题
类型:基本运算、整数运算
题目描述:
如下图所示,摆 1 个火柴棒三角形需要 3 根火柴,那么摆 2 个火柴棒三角形就需要 6 根火柴,请问摆 n 个火柴棒三角形需要多少根火柴?
输入:
一个整数 n ,代表想要摆放的火柴棒三角形的数量。
输出:
一个整数,代表了需要多少根火柴的数量。
样例:
输入:
3
输出:
9
1.分析问题
- 已知:想要摆放的火柴棒三角形的数量n。
- 未知:需要多少根火柴的数量s。
- 关系:s=n * 3。
2.定义变量
// 二、数据定义
int n, s; // 定义变量n存储三角形数量,s存储所需火柴棒总数
3.输入数据
// 三、数据输入
cin>>n; // 从标准输入读取需要摆放的等边三角形火柴棒图形的数量
4.数据计算
// 四、数据计算
s = n * 3; // 根据每个等边三角形需要3根火柴棒来计算所需的火柴棒总数
5.输出结果
// 五、输出结果
cout<<s; // 输出摆放n个等边三角形所需要的火柴棒总数量
return 0; // 程序正常结束,返回值为0
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
// 主函数入口
int main(){
// 一、分析问题
// 已知:想要摆放的等边三角形火柴棒图形的数量(n)。
// 未知:需要的火柴棒总数量(s)。
// 关系:每个等边三角形需要3根火柴棒,所以所需火柴棒总数s = n * 3。
// 二、数据定义
int n, s; // 定义变量n存储三角形数量,s存储所需火柴棒总数
// 三、数据输入
cin>>n; // 从标准输入读取需要摆放的等边三角形火柴棒图形的数量
// 四、数据计算
s = n * 3; // 根据每个等边三角形需要3根火柴棒来计算所需的火柴棒总数
// 五、输出结果
cout<<s; // 输出摆放n个等边三角形所需要的火柴棒总数量
return 0; // 程序正常结束,返回值为0
}
问题:1417. 买文具
类型:基本运算、整数运算
题目描述:
文具店的水笔的单价是一个整数,小明从文具店买了 x 支水笔花了 y 元。请问如果你要从该文具店购买 5 支水笔需要付多少钱?
输入:
两个整数 x 和 y ,用空格隔开,分别代表小明买的水笔的支数和他付给老板的金额。
输出:
一个整数,代表如果你买 5 支水笔,应该付给老板的金额。
样例:
输入:
10 20
输出:
10
1.分析问题
- 已知:小明买的水笔的支数x和他付给老板的金额y。
- 未知:买 5 支水笔,应该付给老板的金额m。
- 关系:m=y / x * 5。
2.定义变量
// 二、数据定义
int x, y, m; // 定义变量x存储已购水笔数量,y存储已付金额,m存储5支笔的应付金额
3.输入数据
// 三、数据输入
cin>>x>>y; // 从标准输入读取小明已购买的水笔数量和已付金额
4.数据计算
// 四、数据计算
m = y / x * 5; // 根据单价(y/x)计算出购买5支笔的应付金额
5.输出结果
// 五、输出结果
cout<<m; // 输出小明购买5支笔应付的金额
return 0; // 程序正常结束,返回值为0
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
// 主函数入口
int main(){
// 一、分析问题
// 已知:小明买的水笔的支数(x)和他付给老板的金额(y)。
// 未知:买 5 支水笔,应该付给老板的金额(m)。
// 关系:m = y / x * 5 (即单价乘以5支笔的数量)
// 二、数据定义
int x, y, m; // 定义变量x存储已购水笔数量,y存储已付金额,m存储5支笔的应付金额
// 三、数据输入
cin>>x>>y; // 从标准输入读取小明已购买的水笔数量和已付金额
// 四、数据计算
m = y / x * 5; // 根据单价(y/x)计算出购买5支笔的应付金额
// 五、输出结果
cout<<m; // 输出小明购买5支笔应付的金额
return 0; // 程序正常结束,返回值为0
}
问题:1320. 时钟旋转
类型:基本运算、整数运算
题目描述:
时钟上面的时针从 m 时走到 n 时旋转了多少度?(m≤n,且 m 和 n 都是1∼12之间的整数)。
输入:
2 个整数 m 和 n。
输出:
1 个整数代表时针旋转的度数。
样例:
输入:
1 4
输出:
90
1.分析问题
- 已知:2 个整数 m 和 n。
- 未知:时针从m时走到n时旋转了多少度?
- 关系:圆是360度,钟表被分成12份,因此每份30度 。
2.定义变量
- m:起始时刻(单位:小时,假设为整点)。
- n:结束时刻(单位:小时,假设为整点)。
- result:时针从 m 时到 n 时旋转的角度(单位:度),待计算。
//二、数据定义
int m,n,result;
3.输入数据
- 从标准输入接收用户输入的起始时刻 m 和结束时刻 n 的值。
//三、数据输入
cin>>m>>n;
4.数据计算
- 计算时针从 m 时到 n 时旋转的角度,即 (n - m) 小时对应的旋转角度。
- 每小时时针旋转 30 度,因此总旋转角度为 30 度 * (n - m)。
//四、数据计算
result=360/12*(n-m);
5.输出结果
- 将计算得到的时针旋转角度 result 输出到标准输出。
//五、输出结果
cout<<result;
return 0;
完整代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
// 一、分析问题
// 已知:2 个整数 m 和 n,分别代表起始和结束时刻(假设为整点)。
// 未知:时针从 m 时走到 n 时旋转了多少度?
// 关系:圆是360度,钟表被分成12份(对应12小时),因此每小时对应的旋转角度为 360 度 / 12 = 30 度
// 二、数据定义
// 定义整型变量:
// m:起始时刻(单位:小时,假设为整点)
// n:结束时刻(单位:小时,假设为整点)
// result:时针从 m 时到 n 时旋转的角度(单位:度),待计算
int m, n, result;
// 三、数据输入
// 从标准输入接收用户输入的起始时刻 m 和结束时刻 n 的值
cin >> m >> n;
// 四、数据计算
// 计算时针从 m 时到 n 时旋转的角度,即 (n - m) 小时对应的旋转角度
// 每小时时针旋转 30 度,因此总旋转角度为 30 度 * (n - m)
result = 360 / 12 * (n - m);
// 五、输出结果
// 将计算得到的时针旋转角度 result 输出到标准输出
cout << result;
// 程序执行完毕,返回 0 表示正常结束
return 0;
}
问题:1323. 扩建花圃问题
类型:整数运算、整数运算
题目描述:
梅山小学有一块长方形花圃(花圃的长宽都是整数),长 m 米,宽未知。
在修建校园时,花圃的长增加了 n 米,此时发现增加出来的面积有 s 平方米。
请编程计算出原来花圃的面积是多少平方米?(4.2.19)
输入:
3个整数,分别是 m、n、s。
输出:
一个整数,原来花圃的面积数。
样例:
输入:
8 3 18
输出:
48
1.分析问题
- 已知:花圃长 m 米,花圃的长增加了n米,此时发现增加出来的面积有s平方米。
- 未知:原来花圃的面积数a。
- 关系:根据增加面积,算出花圃宽度w=s/n;然后算出现在的花圃面积数 。
2.定义变量
- 声明并定义了五个整型变量,分别表示花坛长度(m)、长度增加量(n)、新增面积(s)、原花坛宽度(w)和原花坛面积(a)。
//二、数据定义
int m,n,s,w,a;
3.输入数据
- 通过cin从标准输入读取花坛长度(m)、长度增加量(n)和新增面积(s)的值。
//三、数据输入
cin>>m>>n>>s;
4.数据计算
- 根据给定的新增面积(s)和长度增加量(n),计算出原花坛的宽度(w),公式为 w = s / n。
- 之后,利用原花坛宽度(w)和长度(m)计算原花坛的面积(a),公式为 a = w * m。
//四、数据计算
w=s/n;
a=w*m;
5.输出结果
- 使用cout将计算得到的原花坛面积(a)输出到标准输出。
//五、输出结果
cout<<a;
return 0;
完整代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
// 一、分析问题
// 已知:花圃长 m 米,花圃的长增加了 n 米,此时发现增加出来的面积有 s 平方米。
// 未知:原来花圃的面积数 a
// 关系:根据增加面积,算出花圃宽度 w = s / n;然后算出现在的花圃面积数
// 二、数据定义
// 定义整型变量:
// m:花坛原长度(单位:米)
// n:花坛长度增加量(单位:米)
// s:因长度增加而新增的面积(单位:平方米)
// w:花坛原宽度(单位:米),待计算
// a:原花坛面积(单位:平方米),待计算
int m, n, s, w, a;
// 三、数据输入
// 从标准输入接收用户输入的花坛原长度 m、长度增加量 n 和新增面积 s 的值
cin >> m >> n >> s;
// 四、数据计算
// 计算原花坛宽度 w,根据题意,新增面积等于原宽度乘以长度增加量,即 s = w * n,
// 变换公式得 w = s / n
w = s / n;
// 计算原花坛面积 a,根据题意,面积等于原长度乘以原宽度,即 a = m * w
a = w * m;
// 五、输出结果
// 将计算得到的原花坛面积 a 输出到标准输出
cout << a;
// 程序执行完毕,返回 0 表示正常结束
return 0;
}
问题:1462. 小明的游泳时间
类型:整数运算
题目描述:
伦敦奥运会要到了,小明在拼命练习游泳准备参加游泳比赛。
这一天,小明给自己的游泳时间做了精确的计时(本题中的计时都按 24 小时制计算),它发现自己从 a 时 b 分一直游泳到当天的 c 时 d 分。
请你帮小明计算一下,它这天一共游了多少时间呢?小明游的好辛苦呀,你可不要算错了哦。
输入:
一行内输入 4 个整数,分别表示a,b,c,d 。
输出:
一行内输出 2 个整数 e 和 f ,用空格间隔,依次表示小明这天一共游了多少小时多少分钟。其中表示分钟的整数 f应该小于 60 。
样例:
输入:
12 50 19 10
输出:
6 20
1.分析问题
- 已知:从 a 时 b 分一直游泳到当天的 c 时 d 分。
- 未知:一共游了多少时间呢?
- 关系:先将时间转换成分,计算后再换算成时分输出 。
2.定义变量
- 定义变量:a(开始时)、b(开始分)、c(结束时)、d(结束分)、e(游泳总时数)、f(游泳总分数),均为整型。
//二、数据定义
int a,b,c,d,e,f;
3.输入数据
- 从标准输入(如键盘)接收用户输入的开始时间和结束时间(时分)。
//三、数据输入
cin>>a>>b>>c>>d;
4.数据计算
//四、数据计算
int total_minutes = (c * 60 + d) - (a * 60 + b); // 计算游泳总分钟数
e = total_minutes / 60; // 计算游泳总时数 e(整除)
f = total_minutes % 60; // 计算游泳总分数 f(余数)
5.输出结果
- 输出游泳总时数 e 和总分数 f。
//五、输出结果
cout<<e<<" "<<f;
return 0;
完整代码如下:
#include <bits/stdc++.h> // 包含标准输入输出库以及其他常用头文件
using namespace std; // 使用 std 命名空间,简化代码
int main() { // 主函数开始
// 一、分析问题
// 已知:从 a 时 b 分一直游泳到当天的 c 时 d 分
// 未知:一共游了多少时间呢?
// 关系:先将时间转换成分,进行计算,再将结果换算成时分输出
// 二、数据定义
int a, b, c, d, e, f; // 定义变量:a(开始时)、b(开始分)、c(结束时)、d(结束分)、e(游泳总时数)、f(游泳总分数),均为整型
// 三、数据输入
cin >> a >> b >> c >> d; // 从标准输入(如键盘)接收用户输入的开始时间和结束时间(时分)
// 四、数据计算
int total_minutes = (c * 60 + d) - (a * 60 + b); // 计算游泳总分钟数
e = total_minutes / 60; // 计算游泳总时数 e(整除)
f = total_minutes % 60; // 计算游泳总分数 f(余数)
// 五、输出结果
cout << e << " " << f; // 输出游泳总时数 e 和总分数 f
return 0; // 主函数结束,返回值为 0 表示程序执行成功
}
三、总结
通过本次学习,你不仅巩固了C++语言的基础,还进一步拓展了对常量、标识符、整型变量的理解,更重要的是,通过解决实际问题,提升了程序设计思维和编码技能。记住,编程不仅是技术的堆砌,更是逻辑思维与问题解决的艺术。每一道题目的解决,都是向NOI奖台迈进的坚实一步。保持好奇心,勤于实践,相信不久的将来,你将在信息学的舞台上绽放光彩。继续加油,未来的编程之星!
四、感谢
如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。
每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》