当前位置: 首页 > article >正文

蓝桥备赛(一)- C++入门(上)

一、工具安装

Dev-C++安装:https://www.bilibili.com/video/BV1kC411G7CS

一般比赛会用到Dev-C++, 但是Dev-C++还是有自身的局限性 , 后续的博客学习中 , 必要的时候 , 会使用VS2022 , 下面是VS2022的安装和使用教程。

VS2022安装:https://www.bilibili.com/video/BV11R4y1s7jz 

二、第一个C++程序

2.1 基础程序

#include <iostream>
using namespace std;

int main() 
{
	cout << "hello world" << endl;
	return 0;
}

2.2 main 函数

main 函数是程序的入口 , C++程序不管有多少行代码 , 都是从main 函数开始执行的 , main 函数也被叫做主函数 。 main 函数前面的 int 表示 main 函数执行结束的时候返回一个整型类型的值 , 而在 main 函数的最后写 return 0 ; 正好前后呼应

  • main 函数是程序的入口
  • main 函数 有且仅有一个
  • 一个项目中可以有多个 . cpp 文件 , 但是只能有一个main 函数(因为程序的入口只能有一个。

对于函数的详细讲解,将在此系列的第七篇讲解。

2.3 字符串

在C语言中 。 使用单引号括起来一个字符 , 表示字符字面值 , 比如 : '1' , ' a ' , 使用双引号括起来多个字符表示一个字符串 , 比如 "abcdefg" , " hello world" , 字符串中可以有一个或者多个字符 , 也可以没有任何字符 , " " 表示空字符串。

C++的STL 中引入了 string 来表示字符串 , 功能更加强大 , C语言不支持 , 后期篇章会详细介绍 。 

2.4 头文件

 #include <iostream> ---> 包含头文件 ,头文件的名字叫: iostream ,
使用 #include <> 的形式进行包含。
C++ 程序中要完成输入和输出的操作会涉及到 iostream 文 件中的多个定义,所以就要包含这个头文件的。比如:代码中的 cout 是输出流对象,就是用来完成数据输出的,就需要包含头文件。

 除了iostream 这个头文件之外 , C++ 的编译器自带了很多头文件 , 每个头文件都支持一组特定的工具 。 

C++库函数相关头文件:https://zh.cppreference.com/w/cpp/header

注:
1. 在C语言中头文件的扩展名是 .h ,但是C++中的用法发生了⼀些变化,对老式C的头文件保留了扩展名 .h ,但是C++自己的文件没有扩展名了。C语言头文件:
https://zh.cppreference.com/w/c/header
2. 有些C的头文件被转换成C++头文件,这些文件名被重命名,去掉了.h扩展名,并在文件名的前面加上了前缀c(表示来自C语言);例如:C语言中有关数学的头文件名字是 math.h ,在C++中就是 cmath 当然还得注意,有时头文件的C语言版本和C++版本相同,而有时候,新版本做了⼀些修改。

例如:

2.5 cin 和 cout 初识

cout << "hello world " <<endl ; 

1 . 这句代码在上面的程序中是最重要的代码 , 其他所有的代码都是为了编写这句代码。

2 . 代码中 cout 是标准输出流对象(针对控制台 , 也就是屏幕) , 其实还有标准输入流对象(针对的是键盘) cin ;

3 . cout 是告诉程序把后面双引号中的内容打印到标准输出设备(屏幕) 上 , 双引号的内容可以替换的。

#include <iostream>
using namespace std;

int main()
{
	int num;
	cin >> num ;
	cout << num << endl;
	return 0;
}
  1.  cin 和 cout 是全局的流对象 , cin 负责输入数据 , cout 负责输出数据。
  2. endl 是C++中一个特殊的操作符 , 效果是换行和刷新缓冲区 , 使用时必须包含在iostream 头文件中 。
  3. << 是流插入运算符 , 和 cout 配合使用 , >> 是流提取运算符 , 和cin 搭配使用 , 两者容易混淆 , 需要区分 。
  4. 使用C++输入输出更方便 。 不需要像printf / scanf 输入输出时那样 , 需要手动控制格式 。 C++输入输出可以自动识别变量类型 

2.6 名字空间

using namespace std;
这句代码的意思是:使用名字空间 std (名字空间也叫命名空间)

1 . 在C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称如果都存在于全局作用域中,可能会导致很多冲突。使用名字空间的 目的是对标识符的名称进行隔离,以避免命名冲突或名字污染, namespace 关键字的出现就是针对这种问题的。
2 . std 是C++标准库的名字空间名,C++将标准库的定义实现都放到这个命名空间中,当我们需要使用标准库中的内容时,就需要加上: using namespace std ;当有了这句代码的时候,表示名字空间 std 中信息都是可见和可用的,⽐如: cin cout endl 等。

名字空间也是根据需要⾃⼰可以定义的,这⾥就不加详细介绍,可以自行拓展学习。 C++ 的第一个程序_c++第一个程序-CSDN博客

2.7 注释

C++ 里主要有两种形式 : // 单行注释 和 /* */多行注释

1 . 注释本来是对代码进行解释的文字 , 要放在代码中 , 但是又无需编译 。 

2 . 注释是给程序员自己看的 , 编译器会忽略注释 , 基于注释是编译器忽略的这个特点 , 在代码中有些代码不再需要的时候夜壶使用注释的方式屏蔽。

单行注释(//):指的是当前行不参与编译和运行

#include <iostream>
using namespace std;

int main()
{
	int num;
	cin >> num;
	// cout << num << endl;
	return 0;
}

  多行注释(/* */) : 指的是被包含在内的多行不参与编译和运行

/*
#include <iostream>
using namespace std;

int main()
{
	int num;
	cin >> num;
	cout << num << endl;
	return 0;
}
*/

小贴士:

1. 在VS环境中注释和取消注释的快捷键 : Ctrl + K + C  , Ctrl + K + U

2. 在DevC++ 中注释和取消的快捷键 : Ctrl + / 

2.8 练习 

练习一:Hello,World!

B2002 Hello,World! - 洛谷

#include <iostream>
using namespace std;
int main()
{
    cout << "Hello,World!" << endl;
    return 0;
}
1. 要仔细读题、审题
2. 注意语法细节: main函数写法、大括号匹配、中英文标点符号的使用、包含头文件。

练习二:打印飞机

小飞机_牛客题霸_牛客网

#include <iostream>
using namespace std;

int main()
{
    cout <<"     **" << endl;
    cout <<"     **" << endl;
    cout <<"************"<<endl;
    cout <<"************"<<endl;
    cout <<"    *  *"<<endl;
    cout <<"    *  *"<<endl;
    return 0;
}
OJ(Online Judge --> 在线判题)   题目输出的结果有严格的检查,代码输出的结果必须和题目要求的统⼀才是可以的。

练习三:第二个整数

B2003 输出第二个整数 - 洛谷

#include <iostream>
using namespace std;

int main()
{
    int n1,n2,n3;
    cin >> n1 >> n2 >>n3;
    cout << n2 << endl;
    return 0;
}
注意 : 
1. 这里的 n1 和 n2 两个整数,可以分两次读入,也可以⼀次读入,只有获取到第⼆个输入值才能输出结果。
2 . cin 是支持连续读入几个数值的
3 . cout 也是支持连续输出几个数值的

练习四:字符三角形

B2005 字符三角形 - 洛谷

#include <iostream>
using namespace std;

int main()
{
    char c;
    cin >> c;
    cout << "  " << c << "  " << endl;
    cout << " " << c << c << c << endl;
    cout << c << c << c << c << c << endl; 
    return 0;
}

三、数据类型

C++中提供了丰富的数据类型来描述生活中的各种数据。 比如 :可以使用整型类型来描述整数 , 使用字符类型来描述字符 , 使用浮点数类型来描述小数 。

所谓 " 类型 " , 就是相似的数据所拥有的共同特征 , 编译器只有知道了数据的类型 , 才能知道如何操作数据 。 

3.1 字符型

char                         // character 缩写

键盘上可以敲出各种字符 , 如 : a , q , # , @ 等 ,这些符号都被成为字符 , 字符是用单引号括起来的 , 如 : 'a ' , ' b' , '1' , '#' 。 为了能说明这些字符 , 给他们抽象出一种类型 , 就是字符型

ASCII编码
我们知道在计算机中所有的数据都是以二进制的形式存储的,那这些字符在内存中分别以什么样的⼆进制存储的呢?如果我们每个人自己给这些字符中的每个字符编⼀个二进制序列,这个叫做编码,为了方便大家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个标准 ASCII 编码,C语言中的字符就遵循了 ASCII 编码的方式。

 

我们不需要记住所有的ASCII码表中的数字,使用时查看就可以,不过我们最好能掌握几组特殊的数据:
  •  字符A~Z :65 ~ 90
  • 字符 a ~ z :97 ~ 122
  • 对应的大小写字符(a和A)的ASCII 码值的差值是 32
  • 数字字符0 ~ 9 的ASCII 码值从 48 ~ 57 
  • 换行 \n 的ASCII码值 : 10
  • ASCII 码值 从 0~31 这32 个字符是不可打印字符 , 无法打印在屏幕上观察
#include <iostream>
using namespace std;

int main()
{
	char c1 = 'Q' ;
	cout << c1 << endl;
	char c2 = 81;
	cout << c2 << endl; 
	// 这里的81是字符Q的ASCII码值 , 也是可以正常打印的 
	return 0;
}

 

3.2 整型

整型类型就是对所有整型的抽象 , 为了能对整数形成统一的类型标识 , 就有整型 ;

C++ 和 C 中整型被分为四大类 : 

short [int]          短整型

int                     整型

long [int]           长整型

long long [int]   更长的整型

3.3 浮点型

浮点型式对所有实数(小数) 的抽象 , 为了能对实数进行统一的类型标识 , 就有了浮点型。

浮点型有三种 : 

float                      单精度浮点型

double                  双精度浮点型

long double          更长的双精度浮点型

#include <iostream>
using namespace std;

int main()
{
	char c = 'C';
	
	short s = -10;
	short int s = -10;
	int s = -10;
	long l = -10;
	long int = -10;
	long long int = -10;
	long long = -10;
	
	float f = 3.14f;
	double d = 3.14;
	long double ld = 3.14;
	
	return 0; 
} 

 在 C/C++中小数的书写形式 :

3.14;               编译器会默认识别为double 类型

3.14f;                编译器会识别为float 类型

1e5;                  科学计数法 , ---> 1.0 * 10^5

1e5 + 10 ;         1.0 * 10^5 + 10 == 100010

1.23e5 + 10 ;    1.23 * 10^5 + 10 == 123010      

3.4 布尔类型

C++有一种类型叫 bool(布尔类型) , 布尔类型的变量的值可以是true 或 false , 这种类型的变量专门用来表示真或假 。 当然在C 和 C++ 中 , 0表示假 , 非0表示真 , 有时候不使用bool 类型也能表示相同的逻辑 。 

#include <iostream>
using namespace std;

int main()
{
	bool flag = true;
	if(flag)
		printf("I like C++!");
	return 0;
}

#include <iostream>
using namespace std;

int main()
{
	int flag = 0;
	cin >> flag; //输入非0 , flag为true
	if(flag)
		printf("I like C++!"); 
	return 0;
}

 

 

3.5 signed 与 unsigned

signed 和 unsigned 关键字修饰字符型和整型类型的。

1.signed 关键字 , 表示一个类型带有正负号 , 包含负值;比如:温度、银行存款。

2.unsigned 关键字 , 表示该类型不带有正负号 , 只能表示0和正整数 , 比如:年龄。

//字符型
char
signed char //有符号的字符类型    // 范围为 -128 到 127
unsigned char //⽆符号的字符类型  // 范围为 0 到 255

//短整型
short [int]
[signed] short [int] //有符号的短整型
unsigned short [int] //⽆符号的短整型

//整型
int
[signed] int //有符号的整型
unsigned [int] //⽆符号的整型

//⻓整型
long [int] 
[signed] long [int] //有符号的⻓整型
unsigned long [int] //⽆符号的⻓整型

//更⻓的整型
long long [int]
[signed] long long [int] //有符号的
unsigned long long [int] //⽆符号的
  1.  对于int 类型 , 默认是带有正负号的 , 也就是说 int  == signed int ;
  2. 变量声明unsigned 的好处是 , 同样长度的内存能表示的最大整数值 , 增大了一倍
比如,16位的 signed short int 的取值范围是: -32768~32767 ,最大是 32767
但unsigned short int 的取值范围是: 0~65535 ,最大值增大到了 65535 。

注意:

 char 类型到底是 signed char 还是 unsigned char 由编译器决定。大部分的编译器上 char 就是 signed char
这就是说, char 不等同于 signed char ;它有可能是 signed char ,也有可能是 unsigned char 。与 int 不同, int 就是等同于 signed int

3.6 数据类型长度

每⼀种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的变量,变量长度的不同,存储的数据范围就有所差异。

sizeof 操作符

sizeof 是一个关键字,也是操作符,专门是用来计算特定数据类型的长度的,单位是字节。
sizeof 操作符的操作数可以是类型,也可是变量名或者表达式, sizeof 的操作数如果不是类
型,是表达式的时候,可以省略掉后边的括号的。
sizeof ( 类型 )
sizeof 表达式

#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	cout << sizeof(a) << endl;
	cout << sizeof a << endl; //a是变量的名字,可以省略掉sizeof后边的(),但不建议去掉
	cout << sizeof(int)  << endl;
	return 0;
}

 

各数据类型长度

#include <iostream>
using namespace std;

int main()
{
	cout << sizeof(char) << endl;
	cout << sizeof(bool) << endl;
	cout << sizeof(short) << endl;
	cout << sizeof(int) << endl;
	cout << sizeof(long) << endl;
	cout << sizeof(long long) << endl;
	cout << sizeof(float) << endl;
	cout << sizeof(double) << endl;
	cout << sizeof(long double) << endl;
	return 0;
}

如何理解这些数据类型的长度呢? 

 

3.7 各类型取值范围

不同的数据类型所创建的变量的长度是有差异的,  这个长度差异又决定了,这种变量中能存储的值的大小。
下面是不同数据类型的取值范围:

 对这些数据类型的取值范围  还需要知道取值范围的数量级 , 像 int 类型取值大概是 : -2.1 *10^9  ~ 2.1 * 10^9 , 这里大概是10 ^9 这样的数量级。

3.8 typedef

在C++中有⼀个关键字是和类型有关的,是用来给类型重命名的。 当有⼀个类型比较复杂的时候,可以简化类型。 typedef 在竞赛中经常使用,可以提升编码速度。
typedef使用的基本语法形式:
                        typedef 旧类型名 新类型名;                               

3.9 练习

练习一 :整数

牛牛学说话之-整数_牛客题霸_牛客网

#include <iostream>
using namespace std;

int main()
{
    int a;
    cin >> a;
    cout << a;
     return 0;
}

练习二:打印字符

B2018 打印字符 - 洛谷

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    char ch = n ;
    cout << ch << endl;
    return 0;
}

练习三:倒序

登录—专业IT笔试面试备考平台_牛客网

#include <iostream>
using namespace std;

int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    cout << c << " " << b << " " << a << endl;
    return 0;
}

练习四:整型数据类型存储空间大小 

 信息学奥赛一本通(C++版)在线评测系统

#include <iostream>
using namespace std;

int main()
{
   int a = 0;
   short b = 0;
   cin >> a >> b;
   cout << sizeof(a) << " " << sizeof(b) << endl;
   return 0;
}

四、变量和常量

4.1 变量的创建

类型是用来创建变量的。
1. 变量   ---->    把经常变化的值称为变量,不变的值  <------常量。
2. 变量创建的语法形式是这样的:
data_type             name;
     |                           |
     |                           |
数据类型             变量名
int age;                      // 整型变量
char ch;                    // 字符变量
double weight;        // 浮点型变量
变量的命名规则遵循以下原则:
• 变量名只能由字母、数字和下划线组成 ,且必须以字母或下划线开头
• 变量名 不能以纯数字开头 ,也不能包含特殊字符,如空格、连字符等。
• 变量名不能使用语言的关键字,如 int、char、if等
• 变量名应具有意义,有助于理解变量的含义和⽤途。
• 变量名应简短明了,避免使用过长的名称。
• 变量名应区分大小写,例如 myVariable 和 myvariable 被视为两个不同的变量

4.2 变量的初始化

变量在创建的时候就给一个初始值,就叫初始化;

4.3 变量的分类

1 . 全局变量:在大括号外部定义的变量就是全局变量 , 全局变量的使用范围更广,整个⼯程中想使用,都是有办法使用的
2 .  局部变量:在大括号内部定义的变量就是局部变量 ,局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的
#include <iostream>
using namespace std;

int global = 2025;  //全局变量 

int main()
{
	int local = 2024; //局部变量
	cout << local << endl;
	cout << global << endl; 
	return 0;
}

如果局部和全局变量,名字相同: 

如果想使用全局变量:

未初始化的局部变量: 

#include <iostream>
using namespace std;

//未初始化的局部变量
int main()
{
	int a;
	char c;
	float f;
	double d;
 
	cout << "int:" << a << endl;
	cout << "char:" << c << endl;
	cout << "float:" << f << endl;
	cout << "double:" << d << endl;
	return 0;
}

局部变量通常不会自动初始化 。它们需要在使用之前明确地赋值或初始化。如果没有初
始化,它们的值将是未定义的,使用未初始化的局部变量可能会导致不可预测的行为或运行时错误,因此局部变量建议初始化。

 未初始化的全部变量: 

#include <iostream>
using namespace std;
	int a;
	char c;
	float f;
	double d;
 
//未初始化的全部变量
int main()
{

	cout << "int:" << a << endl;
	cout << "char:" << c << endl;
	cout << "float:" << f << endl;
	cout << "double:" << d << endl;
	return 0;
}

全局变量:全局变量通常在定义时就被初始化, 如果没有明确指定初始值,它们通常会被初始化为 0。

注意:

 如果⼀个题目既可以使用全局变量,又可以使用局部变量,那怎么选择呢?

如果是在竞赛中: 能使用全局变量,⼀般会直接是全局变量,这样的好处是:
1. 变量不需要初始化,因为默认会初始化为0,这样写会比较快
2. 很多时候,会避免传参,因为全局变量到处都可以使用。(后面会讲)
所以在在竞赛中其实哪种方便就使用哪种,全局变量的使用很常见。
但是在企业里软件开发的工程实践中一般建议:能使用局部变量的,尽量少使用全局变量。
因为企业级的开发,代码量比较大,全局变量在任意地方都可以使用,这样就变得不可控
了。

4.4 常量

常量就是不能被改变的值 , 通常我们会使用三种常量 :

字面常量: 

#define 常量

#define 常量名  内容 

注意:后面无分号

#include <iostream>
using namespace std;

#define M 100
#define CH 'x'
#define PI 3.14159

int main()
{
	cout << M << endl;
	cout << CH << endl;
	cout << PI << endl;
	return 0;
}

1.  这里定义的M 、 CH 、PI 都是常量 , 可以直接使用 , 但是不能被修改

2. 使用 #define 定义常量的时候是不关注类型的 , 只关注常量的名字叫啥 , 常量的值是啥 , 编译在处理这种常量的时候就是直接替换 , 在出现常量名字的地方 , 通通替换成常量的内容 。

上述代码被编译器替换后就是:

#include <iostream>
using namespace std;

int main()
{
	cout << 100 << endl;
	cout << x << endl;
	cout << 3.14159 << endl;
	return 0;
}

const 定义常量

会有具体类型 , 比 #define 定义常量更加严谨 , 语法形式如下:

const 类型 常量名字 = 常量值 ;

  1. 习惯上 , const常量的名字一般会使用大写 ,而普通常量的名字不会全部大写
  2. const 常量 增加了程序的可维护性 , 如果改变常量的值 , 只需要在定义的部分修改 , 使用的地方也就随之改变 , 做到了"一改全改"的效果。
  3. const 常量 增加了程序的可读性 , PI 比 3..1415926 更加容易书写 、 使用
  4. 常量不可修改 
#include <iostream>
using namespace std;

const double PI = 3.14159926;

int main()
{
	int r = 0;
	cin >> r;
	cout << "周长:" << 2 * PI * r << endl;
	cout << "面积:" << PI * r * r << endl;
	
	//PI = 3.14; 
	//这种写法会报错 , 因为常量不可以被修改 
	return 0;
 } 

 

 4.5 练习

练习一:买票

牛牛买电影票_牛客题霸_牛客网

#include <iostream>
using namespace std;

int main()
{
    int x;
    cin >> x;
    cout << 100 * x << endl;
    return 0;
}

练习二:A + B 问题

B2007 A + B 问题 - 洛谷

#include <iostream>
using namespace std;

int main()
{
    int a,b;
    cin >> a >> b;
    int sum = a + b;
    cout << sum << endl;
    return 0;
}

练习三 :鸡兔同笼

B2614 【深基1.习6】鸡兔共笼 - 洛谷

#include <iostream>
using namespace std;

int main()
{
    int j = 0;
    int t = 0;
    int h = 35;
    int f = 94;
    j = (4*h - f )/2;
    t = h - j;
    cout << t << " " << j << endl;
    return 0;
}

http://www.kler.cn/a/558275.html

相关文章:

  • Unity贴图与模型相关知识
  • PostgreSQL‘会用‘到‘精通‘,学习感悟
  • 《论云上自动化运维及其应用》审题技巧 - 系统架构设计师
  • [原创](Modern C++)现代C++的关键性概念: std::span, 低内存开销的方式来操作大数据.
  • C语言--正序、逆序输出为奇数的位。
  • Spring Boot:开启快速开发新时代
  • 23种设计模式之《组合模式(Composite)》在c#中的应用及理解
  • ETL工具: Kettle入门(示例从oracle到oracle的数据导入)
  • 51单片机学习——动态数码管显示
  • ROS2 应用:按键控制 MoveIt2 中 Panda 机械臂关节位置
  • SAP 代码扫描工具
  • 鹰角基于 Flink + Paimon + Trino 构建湖仓一体化平台实践项目
  • Linux离线环境安装miniconda并导入依赖包
  • Spring 依赖注入实战指南:XML、注解、Java 配置全面对比
  • 备忘录模式:快速恢复原始数据
  • 图数据库Neo4j面试内容整理-关系类型
  • Linux 性能更好的ftp客户端 lftp 使用详解
  • PHP Libxml:深入解析XML解析库及其在PHP中的应用
  • 【WebGL】attribute方式实例化绘制
  • 深入理解 SQL 事务隔离级别:脏读、不可重复读和幻读