【NOI】C++程序设计入门三


前言

在经历了初步的编程概念洗礼后,你已经掌握了变量、数据类型、基本的算术运算符等核心知识点。本篇内容旨在巩固之前所学,并通过实例深入,带你领略C++语言的魅力,为NOI之路打下坚实基础。

我们将围绕以下几个关键点进行深化学习和实践:

  1. 常量的使用:理解常量与变量的区别,掌握字面常量与符号常量的定义及应用,特别是在处理固定数值如圆周率时,如何提升代码的可读性和维护性。

  2. 标识符的规范:学习如何正确命名标识符,遵循C++的命名规则,确保代码的清晰度和专业性,同时避免与关键字冲突。

  3. 整型变量的深入:除了基础的int类型,还将探索short、long、long long等整数类型,了解它们在内存占用、数值范围上的差异,以及如何根据实际需求选择最合适的类型。

  4. 实战演练:通过解决具体问题,如“扩建花圃”和“小明的游泳时间”,我们将理论知识转化为实践,强化整数运算能力,体会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++标识符的命名规则:

  1. 标识符不能是C++关键字,例如if、else、while等。
  2. 标识符不能包含空格。
  3. 标识符不能以数字开头。
  4. 标识符不能包含特殊字符,例如@、#、$等。
  5. 标识符应该具有描述性,能够清晰地表达其含义。

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.分析问题

  1. 已知:笔的单价x、橡皮的单价y和花花付给老板的钱n。
  2. 未知:请问老板应该找给花花多少钱s?
  3. 关系: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.分析问题

  1. 已知:想要摆放的火柴棒三角形的数量n。
  2. 未知:需要多少根火柴的数量s。
  3. 关系: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.分析问题

  1. 已知:小明买的水笔的支数x和他付给老板的金额y。
  2. 未知:买 5 支水笔,应该付给老板的金额m。
  3. 关系: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.分析问题

  1. 已知:2 个整数 m 和 n。
  2. 未知:时针从m时走到n时旋转了多少度?
  3. 关系:圆是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.分析问题

  1. 已知:花圃长 m 米,花圃的长增加了n米,此时发现增加出来的面积有s平方米。
  2. 未知:原来花圃的面积数a。
  3. 关系:根据增加面积,算出花圃宽度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.分析问题

  1. 已知:从 a 时 b 分一直游泳到当天的 c 时 d 分。
  2. 未知:一共游了多少时间呢?
  3. 关系:先将时间转换成分,计算后再换算成时分输出 。

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)》

在这里插入图片描述

  • 87
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月别枝惊鹊丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值