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

C++程序设计教案

文章目录:

一:软件安装环境

第一种:vc2012

第二种:Dev-C++

第三种:小熊猫C++

二:语法基础

1.相关

1.1 注释

1.2 换行符

1.3 规范

1.4 关键字

1.5 ASCll码表

1.6 转义字符

2.基本框架

2.1 第一种(万能头文件) 

2.2 第二种(自己写头文件)

3.数据类型

3.1 分类 

3.2 基本数据类型(整型 浮点型 字符型 字符串型 布尔型)

3.3 非基本数据类型

3.3.1 数组array

3.3.1.1 一维数组

3.3.1.2 二维数组

3.3.1.3 字符数组char

3.3.2 指针*

3.3.2.1 指针定义 

3.3.2.2 指针数组 

3.3.3 结构体struct

3.3.3.1 结构体定义

3.3.3.2 结构体数组

3.3.3.3 结构体函数

3.3.3.4 结构体指针 

4.输入输出

4.1 语句 输入cin输出cout

4.2 格式化 输入scanf输出printf函数 

4.2.1 scanf格式字符串

4.2.2 printf格式化输出

4.3 单个字符 输入getchar输出putchar函数 

4.4 标准输入fgets输出puts函数

5.常量和变量 

5.1 命名规则

5.2 变量

5.3 常量

5.3.1 #define 宏常量

5.3.2 const 修饰的变量

6.运算符

6.1 算术运算符

6.2 赋值运算符

6.3 比较运算符/关系运算符

6.4 逻辑运算符

6.5 位运算符        

6.6 运算符优先级

7.程序流程结构

7.1 选择结构

7.1.1 if语句

7.1.2 三目/元运算符

7.1.3 switch语句

7.2 循环结构

7.2.1 while循环语句

7.2.2 do...while循环语句

7.2.3 for循环语句

7.2.4 嵌套语句

7.3 跳转语句

7.3.1 break语句

7.3.2 continue语句

7.3.3 goto语句

8.函数

8.1 函数的定义

8.2 函数的声明

8.3 函数的调用

8.4 形参和实参

8.5 函数的常见形式

8.6 分文件编写

8.7 Lambda函数

8.8 函数递归

8.9 内置函数

三:语法进阶

1.文件

1.1 文本文件第一种 方法

1.1.1 写ofstream

1.1.2 读ifstream

1.1.3 判断打开文件is_open

1.2 文本文件第二种方法

1.2.1 写ofstream 

1.2.2 读ifstream

1.3 二进制文件

1.3.1 写ofstream write

1.3.2 读ifstream read


一:软件安装环境

第一种:vc2012

官网:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器

第二种:Dev-C++

提取码:1f9a 

文件——>新建——>源文件菜单栏、工具栏、代码编辑区、编译结果展示修改语言:工具——>环境选项——>基本——>语言——>简体中文

第三种:小熊猫C++

提取码:kq1m

文件——>新建——>新建c/c++文件

二:语法基础

1.相关

1.1 注释

单行注释://多行注释:/**/快捷键:ctrl + /

1.2 换行符

endl:换行符

1.3 规范

加上分号";"的声明int x;using namespace std;执行函数或方法cout << "Hello, World!";         表达式x = 5;  类class MyClass {};结构体struct MyStruct {}; 不加上分号";"的在定义函数或方法时,参数列表后不需要分号void myFunction() {}控制语句if (x > 0) {}  

1.4 关键字

什么是标识符?关键字是C++中预先保留的单词(标识符)注意事项在给变量/常量命名的时候,不要用C++的关键字,否则会产生歧义int int = 10;
asmdoifreturntypedef
autodoubleinlineshorttypeid
booldynamic_castintsignedtypename
breakelselongsizeofunion
caseenummutablestaticunsigned
catchexplicitnamespacestatic_castusing
charexportnewstructvirtual
classexternoperatorswitchvoid
constfalseprivatetemplatevolatile
const_castfloatprotextedthiswchr_t
continueforpublicthrowwhile
dedfaultfriendregistertrue
deletegotoreinterpret_casttry

1.5 ASCll码表

ASCll码大致可以由以下两部分组成:ASCll非空打印控制字符:ASCll表上的数字0-31分配给了控制字符,用于控制像打印机等一些外围设备ASCll打印字符:数字32-126分配给了能在键盘上找到的字符,当查看或打印文档时就会出现A~B:65~90a~b:97~1220~9:48~57'':32标准的ASCll:0~12726个英文字母,大写和小写之间相差32

#include <bits/stdc++.h> 			//万能头文件:包含了目前c++所包含的所有头文件
using namespace std;			    //标准命名空间 
int main(){						    //程序入口 char a;cout<<"请输入:";cin>>a;	大写——>小写 a=a-'A'+'a';      //第一种 a=a-65+'a';		  //第二种 a=a-65+97;		  //第三种 a=a+32;		      //第四种 cout<<a;//小写——>大写 a=a-'a'+'A';      //第一种 a=a-97+'A';		  //第二种 a=a-97+65;		  //第三种a=a-32;			  //第四种 cout<<a;int a='a';			//97//char a='a';		//acout<<a;//字母变ASCII码char num1 = 'A';//int num_1 = static_cast<int>(num1);int num_1 = (int)(num1);cout <<num_1 <<endl;            //66char c="A";cout<<c+1<<endl;                //66//字母递增char c="A";c=c+1;cout<<c+1<<endl;                //Bchar c="A";cout<<char(c+1)<<endl;          //B//ASCII码变字母int num2 = 65;//char num2_2 = static_cast<char>(num2);char num2_2 = (char)(num2);cout <<num2_2<<endl;    //A	return 0;					    //程序正常结束	
}  

1.6 转义字符

作用:用于表示一些不能显示出来的ASCll字符
转义字符意义ASCll码值(十进制)
\a响铃(BEL)007
\b退格(BS),后退一格008
\f换页(FF),将当前位置移到下页开头012
\n换行(LF),将当前位置移到下一行开头010
\r回车(CR),将当前位置移到本行开头013
\t水平制表(HT),跳到下一个TAB位置009
\v垂直制表(VT)011
\\代表一个反斜线字符 “\”092
\'代表一个单引号(撇号)字符039
\''代表一个双引号字符034
\?代表一个问号063
\0空字符(NULL)000
\ooo1到3未八进制数所代表的任意字符三位八进制
\xhh1到2未十六进制数所代表的任意字符二位十六进制

2.基本框架

2.1 第一种(万能头文件) 

#include <bits/stdc++.h> 			//万能头文件:包含了目前c++所包含的所有头文件
using namespace std;			    //标准命名空间 
int main(){						    //程序入口主函数 return 0;					    //程序正常结束	
}  

解释

#:表示声明语言开始#include <bits/stdc++.h>:包含了C++标准库中的所有头文件bit/: 这是一个非标准的目录,用于存放这个特殊的头文件。stdc++.h: 这是文件的名称,它暗示了这个头文件包含了C++标准库的大部分(或全部)内容using namespace std;:想使用std命名空间中的所有名称,这样我们就可以直接使用如cout、cin、vector等名称,而无需每次都加上std::前缀声明,它告诉编译器你想使用std命名空间中的所有名称而不需要在每次引用它们时都加上std::前缀	std(standard)是C++标准库的命名空间。C++标准库中的大部分函数、对象和类型(如cout, cin, vector, map等)都位于这个命名空间中	如果你没有使用using namespace std;,那么你需要这样写代码:std::cout << "Hello, World!" << std::endl;cout << "Hello, World!" << endl;std::vector<int> numbers;		vector<int> numbers;	int main(){ ... }:每个C++程序都必须有一个main函数,当程序开始执行时,它从这里开始return 0;:表示main函数的结束,并返回一个值0。main函数返回0通常表示程序成功执行,而非零值表示出现了某种错误

2.2 第二种(自己写头文件)

#include <iostream>		 //包含头文件iostream
using namespace std;	 //使用c++的命名空间stdint main(){//在程序执行结束后暂停控制台窗口,以便用户能够看到程序的输出,而不是立即关闭窗口system("pause");return 0;
} 

3.数据类型

3.1 分类 

分类 

基本数据类型包括:整型(short int long  long long)布尔值类型(bool)浮点数类型(float double long double)字符类型(char)字符串类型(string)void类型非基本数据类型包括:数组类型(type[])指针类型(type*)数据结构(struct)引用类型(double&)类(class)枚举类型(enum)

 sizeof

为什么要指明数据类型呢:c++规定在创建一个变量或者常量时,必须要指明相应的数据类型,否则无法给变量分配内存sizeof关键字作用:利用sizeof关键字可以统计数据类型所占内存大小语法:sizeof (数据类型/变量)char a = 10;short b = 10;int c = 10;long d = 10;long long e = 10;cout <<"a:" <<sizeof(a)<<endl;cout <<"a:" <<sizeof(char)<<endl;cout <<"b:" <<b <<endl;cout <<"c:" <<c <<endl;cout <<"d:" <<d <<endl;cout <<"e:" <<sizeof(e) <<endl;cout <<"e:" <<sizeof(long long) <<endl;

3.2 基本数据类型(整型 浮点型 字符型 字符串型 布尔型)

数据类型占用空间取值范围其他
                                                                                                 整型
short                短整型2字节-2^15 ~ 2^15-1
int                    整型4字节-2^31 ~ 2^31-1%d
long                 长整型

windows为4字节

linux为4字节(32位)、8字节(64位)

-2^31 ~ 2^31-1
long long         长长整型8字节-2^63 ~ 2^63-1%lld
                                                                                                 浮点型
float                单精度4字节

7位有效数字

-3.4 x 10^38 ~  3.4 x 10^38

%f        
double             双精度8字节15~16位有效数字%lf

默认
long double16字节

-3.4 x 10^4932  ~

3.4 x 10^4932

%Lf
                                                                                                 字符型
char            1字节0~255%c
                                                                                                 字符串型
string          
                                                                                                 布尔型
bool            1字节

true

false

1==2

//---------------------------------------------------------------------------//整型 short b = 10;int c = 10;long d = 10;long long e = 10;cout <<"b:" <<b <<endl;cout <<"c:" <<c <<endl;cout <<"d:" <<d <<endl;cout <<"e:" <<e <<endl;
//---------------------------------------------------------------------------//浮点型float b=0.00001;        float b=1.0E-5;   float b=1.0e-5;double a=8000000000;    double a=8E+9;    double a=8E9;    double a=8e9;    double a=8e+9;
//---------------------------------------------------------------------------//字符型
char ch = 'a';作用:字符型变量用于显示单个字符
本质:并不是把字符本身放在内存中存储,而是将对应的ASCll编码收入到存储单元中注意事项在显示字符型变量时:用单引号将字符括起来,不要用双引号单引号之内只能有一个字符:不可以是字符串
//---------------------------------------------------------------------------//字符串类型
c++风格字符串string 变量名 = "字符串值";            // #include <string>
C语言风格字符串char 变量名[] = "字符串值";作用:用于表示一串字符    
------------------------------------------------------C++标准库中的std::string类型
------------------------------------------------------
#include <string>string s;
cout << "请输入一行文本: ";
getline(cin, s);
cout << "你输入的是: " << s << std::endl;string s1;
cin>>s1;
int n=s1.size()                                       //得到字符串的长度
int n = s1.length();                                  //获取字符串长度for(int i=0;i<s1.size();i++){                         //字符串的遍历cout << s1[i];
}char firstChar = s1[0];                              //访问字符串中的字符
//在s1中查找s2出现的位置,如果查不到返回无符号整数的最大值(转换成int以后等于-1)
s1.find(s2)               
s1.replace(0, 1, "H");                               //替换第一个字符
s1[0] = 'h';                                         //修改字符串中的字符
s1.insert(pos,s2);                                   //在pos的前面插入s2
s1.append(" again!");                                //在字符串末尾添加文本
s1.substr(pos,n);                                    //返回从pos开始的长度为n的一段
s1.erase(pos,n)  ;                                   //删除从pos开始的长度为n的一段s=s1+s2;                                             //将s2拼接到s1,然后赋值给sreverse(s,begin(),s.end());                          //翻转整个字符串int k=stol(s);                                       //将字符串转换为数字
string s=to_string(k);                               //将数字转换成字符串                 ------------------字符串函数
swap(a,b):交换a,b字符串
s.insert(id,str) :s字符串的第id个下标后面插入str字符串
size(),length() 找字符串长度
erase() : 删除字符
clear() : 删除全部字符
replace() : 替换字符
empty() : 判断字符串是否为空
begin() end() : sort(s.begin(),s.end())
find : 查找(a.find(b))如果可以找到返回下标,否则返回-1
rfind : 从后查找
c_str: strcpy(a,s.c_str()) 把字符串复制到字符数组
------------------------------------------------------
C语言风格字符串(C风格字符串)
------------------------------------------------------
// C风格字符串示例
char s1[] = "Hello, World!";// 注意:上面的声明创建了一个字符数组,其中包含13个字符(包括结尾的'\0')// 访问字符串中的字符
char firstChar = s1[0];  // 'H'
char lastChar = s1[12];  // '!'// 修改字符串中的字符
s1[0] = 'h';  // 现在字符串以'h'开头
//---------------------------------------------------------------------------//布尔型
bool d = true;作用:布尔数据类型代表真或假的值返回值    true:...真(本质是1)false:...假(本质是0)
//---------------------------------------------------------------------------//

3.3 非基本数据类型

3.3.1 数组array
什么是数组:数组就是一个集合,里面存放了相同类型的数据元素特点数组中的每个数据元素都是相同的数据类型数组是由连续的内存位置组成的数组中下标是从0开始索引的
3.3.1.1 一维数组
定义方式:如果在初始化时候,没有全部填写完,会用0来填补剩下的数据数据类型 数组名[数组长度];int a[100];const int N=100;int a[N];数组名[index]=值;int a[0]=1;int a[1]=4;int a[2]=2;数据类型 数组名[数组长度]={值1,值2...};int a[100]={1,4,2};数据类型 数组名[]={值1,值2...};int a[]={1,4,2};数组名的用途可以通过数组名统计整个数组占用的内存大小int arr[10]={1,2,3,4,5,6,7,8,9,10};cout<<"整个数组占用内存空间为:"<<sizeof(arr)<<endl;cout<<"每个元素占用内存空间为:"<<sizeof(arr[o])<<endl;cout<<"数组中元素个数为:"<<sizeof(arr)/sizeof(arr[o]<<endl;可以通过数组名查看数组首地址cout<<"数组首地址为:"<<arr<<endl;cout<<"数组第一个元素地址为:"<<&arr[0]<<endl;cout<<"数组第二个元素地址为:"<<&arr[1]<<endl;注意数组名是常量,不可以进行赋值操作数组名代表的是数组首元素的地址,是一个地址常量,不可改变通过数组名可以修改数组中的元素,但是数组名本身不可改变,即数组名指向的地址不可改变输入n个元素的数组for(int i;i<=n;i++){cin>>a[i];}数组的遍历(输出)int arr[5] = {300,350,200,400,250};for (int i = 0; i < 5; i++){cout << arr[i] << endl;}int arr[5] = {300,350,200,400,250};for (int i = 1; i <= 5; i++){cout << arr[i-1] << endl;}int arr[5] = {300,350,200,400,250};for (int i = 4; i >=0; i--){cout << arr[i] << endl;}

举例

数组元素逆置

#include <bits/stdc++.h>		
using namespace std;	int main(){int arr[5] = {1,2,3,4,5};cout << "原数数组逆置前的结果:" << endl;for (int i = 0; i < 5; i++){cout << arr[i] << endl;}int start = 0;//起始下标int end = sizeof(arr)/sizeof(arr[0]) - 1;//结束下表while (start < end){//实现元素交换int temp = arr[start];arr[start] = arr[end];arr[end] =  temp;//下表更新start++;end--;}//打印输出逆置后的结果cout << "原数数组逆置后的结果:" << endl;for (int i = 0; i < 5; i++){cout << arr[i] << endl;}return 0;
}

冒泡排序

//比较相邻的元素:如果第一个比第二个大,就交换他们两个
//对每一对相邻元素做同样的工作:执行完毕后,找到第一个最大值
//重复以上操作:每次比较次数-1,直到不需要比较#include <bits/stdc++.h>		
using namespace std;	//冒泡排序
int main(){int arr[9] = {4,2,8,0,5,7,1,3,9};cout << "排序前的结果:";for (int i = 0; i < 9; i++){cout << arr[i] << " ";}cout << endl;//排序总轮数 = 元素个数 - 1//每轮比较次数 = 元素个数 - 排序轮数 - 1for (int i = 0; i < 9 - 1; i++){for (int j = 0; j < 9 - i - 1; j++){if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;//swap(arr[j],arr[j + 1]);}}}cout << "排序后的结果:";for (int i = 0; i < 9; i++){cout << arr[i] << " ";}cout << endl;return 0;
}
3.3.1.2 二维数组
 二维数组的定义方式数据类型 数组名[行数][列数];数组名[index][index]=值;数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}};数据类型 数组名[行数][列数]={数据1,数据2,数据3,数据4};数据类型 数组名[][列数]={数据1,数据2,数据3,数据4};二维数组的数组名称cout<<"整个二维数组大小:"<<sizeof(arr)<<endl;cout<<"二维数组每一行的大小:"<<sizeof(arr[0])<<endl;cout<<"二维数组每个元素的大小:"<<sizeof(arr[0][0])<<endl;cout<<"二维数组的行数:"<<sizeof(arr)/sizeof(arr[0])<<endl;cout<<"二维数组的列数:"<<sizeof(arr[0])/sizeof(arr[0][0])<<endl;cout<<"二维数组首地址为:"<<arr<<endl;cout<<"二维数组第一行地址为:"<<arr[0]<<endl;cout<<"二维数组第一个元素为:"<<&arr[0][0]<<endl;二维字符数组char strs[2][5] = {"abcd", "1234"};for (int i = 0; i < 2; ++i) {cout << strs[i] << endl;}输入一个n行m列,以(1,1)开始的变量名为a的二维数组for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}}输出一个n行m列,以(1,1)开始的变量名为a的二维数组for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<a[i][j]<<"";}cout<<endl;    //每输出完一行,就换行}
3.3.1.3 字符数组char
字符常量      'a'    1    'a'
字符串窗帘    "a"    2    'a' '\0'声明和初始化字符数组:以空字符('\0')结尾char str1[] = "Hello";                            //大小是6,包括5个字符和一个空字符 char str2[6] = {'H', 'e', 'l', 'l', 'o', '\0'};    字符数组输入:cin.get(s,30)、cin.getline(s,30)、getcharcin.get()成员函数用于从输入流中读取一个字符char s[30];cin.get(s, 30);cout<<s;cin.getline()成员函数用于从输入流中读取一行,直到遇到换行符char s[30];cin.getline(s, 30);cout<<s;char s[256]={0};int len=0;cin.getline(s,256);len=strlen(s);for(int i=0;i<len;i++){cout<<s[i];}getchar()是一个C标准库函数,也可以用于从标准输入读取一个字符它不属于cin对象,而是属于C标准I/O库char s[30];int i = 0;while ((s[i] = getchar()) != '\n' && i < 29) {++i;}s[i] = '\0';输入打印字符数组cout << "请输入一个字符串: ";cin.getline(str, sizeof(str)); cout << "你输入的字符串是: " << str << endl;访问字符数组中的元素char letter = str1[0];                             // letter 现在是 'H'修改字符数组中的元素str1[0] = 'h';                                      // 将 'Hello' 改为 'hello'长度#include <cstring>                                  // 包含 strlen 函数的头文件//size_t 是一个无符号整数类型,通常用于表示对象的大小或计数size_t length = strlen(str1);                       // 计算 str1 的长度,不包括空字符'\0'cout<<lemgth;char s[100];cin>>s;int n=strlen(s);cout<<n;char s[10]="ab d";cout<<strlen*(s);字符数组与字符串常量const char *const str3 = "World";                     // 指向常量字符串的常量指针第一个 const(在 char 前面):这表示 str3 所指向的字符数组(即字符串)是不可修改的第二个 const(在 * 后面):这表示 str3 本身是一个指针常量,它的值(即它所指向的地址)在初始化之后不能被改变字符数组的遍历// 声明并初始化一个字符数组(字符串)char s[] = "Hello, World!";-------------------------------------for(int i=0;i<strlen(s);i++){cout << s[i];}// 获取字符串的长度(不包括结尾的空字符)int length = sizeof(s) / sizeof(s[0]) - 1;// 使用for循环遍历字符数组for (int i = 0; i < length; ++i) {// 打印每个字符cout << s[i];}-----------------------------------------------------------------------字符串数组函数
将s2的内容拷贝到s1strcpy(s1,s2)  
将s2的内容添加到s1  strcat(s1,s2)    
用于比较两个字符串 s1 和 s2strcmp(s1,s2)   strcasecmp(s1,s2)  如果s1的字典序 > s2的字典序则返回整数如果s1的字典序 = s2的字典序则返回0如果s1的字典序 < s2的字典序则返回负数
strstr:在串中查找指定字符串的第一次出现char *position = strstr("Hello, world!", "world");
strrchr:这个函数在一个字符串中从后往前查找第一次出现指定字符的位置char *position = strrchr("Hello, world!", 'o');
strtod:将字符串转换为double型值char str[] = "123.456";double num;char *endptr;num = strtod(str, &endptr);
strtol:将串转换为长整数char str[] = "1234567890";long num;char *endptr;num = strtol(str, &endptr, 10);
strupr:将串中的小写字母转换为大写字母char str[] = "Hello, world!";strupr(str); 
strlwr:该函数用于将字符串中的所有大写字母转换为小写字母char str[] = "HELLO, WORLD!";strlwr(str);
strnset:将一个串中的所有字符都设为指定字符char str[] = "Hello, world!";//如果字符串的长度小于n,则整个字符串将被设置为该字符strnset(str, '*', 5);
3.3.2 指针*
3.3.2.1 指针定义 
什么是指针?指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明---------------------------------------------------------    int a[10]={1,2,3,4,5,6,7,8,9,10};int *p = &a[3];cout<<p<<endl;        //0x70fdeccout<<*p<<endl;       //4指针即地址,所以输出p得到是地址*是间接寻址运算符,作用是得到内存地址里存放的值*P:得到的是这个地址内存放的值---------------------------------------------------------  当指针指向的是字符串数组时,cout<<p 不再输出一个地址值,而是p为首地址的整个字符串char ar[20]={"All-Dream"};char *p=ar+4;cout<<p<<endl;        //Dreamcout<<*p<<endl;       //D//如果需要输出字符数组的地址 printf("%p",p);		  //00000000006ffe04cout<<(void *)p;	  //0x6ffe04---------------------------------------------------------  指针的作用:可以通过指针间接访问内存内存编号是从0开始记录的,一般用十六进制数字表示可以利用指针变量保存地址指针的声明:类型说明符号 *变量名int *p;
指针的赋值int num=5;p=&num;
指针的访问cout<<*p;        //5指针变量的定义:数据类型 *指针变量int *p=&num;int *p=&a;int a=10;        //变量int *p;          //指针p=&a;            //指针变量cout<<*p;间接寻址运算符*:通过指针访问内存地址里的值int num=5;int *p;p=&num;cout<<*p<<end;    //5int num=5;int *p=&num;*p=6;            //把6赋值给指针p指向的变量cout<<*p<<endl;  //6cout<<num<<endl; //6指针所占内存空间sizeof(int *)sizeof(float *)sizeof(double *)sizeof(char *)------------------------------------------char ch='A';int i=99;double x=66.6;int ar[3]={0};cout<<sizeof(ch)<<endl;        //1cout<<sizeof(i)<<endl;         //4cout<<sizeof(x)<<endl;         //8cout<<sizeof(ar)<<endl;        //12------------------------------------------指针变量的大小只和操作系统有关在 32 位系统中,一个指针变量在内存中占据 4 个字节的空间在 64 位系统中,一个指针变量在内存中占据 8 个字节的空间char ch='A';int i=99;double x=66.6;int ar[3]={0};char *pch=&ch;int *pi=&i;double *px=&x;int *par=&ar;cout<<sizeof(pch)<<endl;        //8cout<<sizeof(pi)<<endl;         //8cout<<sizeof(px)<<endl;         //8cout<<sizeof(par)<<endl;        //8空指针:指针变量指向内存中编号为0的空间/定义在标准库中的值为零的常量int *p=NULL;用途:初始化指针变量注意:空指针指向的内存是不可以访问的
野指针:指针变量指向非法的内存空间常见原因:未初始化的指针、释放后的指针、越界访问、内存泄漏、函数返回局部变量的地址int* ptr1 = new int;  // 分配内存,ptr1指向一个有效的内存地址int* ptr2 = ptr1;     // ptr2也指向同一块内存delete ptr1;          // 释放内存,ptr1不再有效ptr1 = nullptr;       // 将ptr1置为空指针,避免野指针// 此时ptr2成为一个野指针,因为它仍然指向已释放的内存cout << *ptr2;        // 这将导致未定义行为,可能崩溃const修饰指针:看const右侧紧跟的是指针还是常量(是指针就是常量指针    是常量就是指针常量)int a =10;    int b = 10;const修饰指针(常量指针 ):const修饰的是指针,指针指向可以改,指针指向的值不可以更改 const  int *p1=&a;p1 = &b;*p1 = 100;   //报错  const修饰常量(指针常量):const修饰的常量,指针指向不可以改,指针指向的值可以更改int *const p2 = &a;*p2 = 100;p2 = &b;    //报错const即修饰指针又修饰常量const int *const p3 = &a;p3 = &b;    //报错p3 = 100;   //报错指针作为函数参数void inc(int *px){*px += 2;}int x=3;inc(&x);cout<<x;        //5    
3.3.2.2 指针数组 
指针数组int main(){int arr[] = {1,2,3,4,5,6,7,8,9,10};int *p = arr;    //指向数组的指针cout<<"第一个元素的地址:"<<&arr[0]<<endl;				//0x6ffdd0cout<<"第一个元素的地址:"<<arr<<endl;					//0x6ffdd0cout<<"第一个元素:"<<arr[0]<<endl;						//1cout<<"指针访问第一个元素(首地址):"<<*p<<endl;		//1for(int i=0;i<10;i++){//利用指针遍历数组cout<<*p<<endl;										//1 2 3 4 5 6 7 8 9 10p++;}return 0;}int ar[10]={2,4,7,9,0,1,6,47,33,6};数组指针一般是指向数组(首地址)int *p=ar;        //数组名即代表数组地址int *p=&ar[0];指向数组的某个元素int *p=ar+3;int *p=&ar[3];用指针访问数组元素int ar[10]={1,2,3,4,5,6,7,8,9,10};int *p=ar;下表法:用数组名[下标]、指针[下标]的形式访问数组元素数组名[下标]:cout<<ar[2];指针[下标]:cout<<p[2];指针法:用*(ar+i)、*(p+i)的形式访问数组元素*(ar+i):cout<<*(ar+2);*(p+i):cout<<*(p+2);指针的运算可以:+    -    ++    --不可以:*    /int ar[10]={1,2,3,4,5,6,7,8,9,10};int *p=&ar[0];p=p+1;            //P++        指针指向下一个数组元素int *p=&ar[3];p=p-1;            //p--        指针指向上一个数组元素cout<<*p<<endl;用指针遍历数组方法一:数组下标作为循环变量int ar[10]={1,2,3,4,5,6,7,8,9,10};int *p=ar;//指针不动,下标增加for(int i=0;i<10;i++){cout<<*(P+i)<<endl;cout<<p[i]<<endl;}方法二:指针作为循环变量int ar[10]={1,2,3,4,5,6,7,8,9,10};int *p=NULL;//每循环一次,指针+1(移动)    for(p=ar;p<(ar+10);P++){cout<<*p<<endl;}方法三:循环控制变量i作为循环次数的控制用,不作为数组下标用int ar[10]={1,2,3,4,5,6,7,8,9,10};int *p;p=ar;for(int i=0;i<10;i++){cout<<*p<<endl;p++;}除开for循环之外,还可以用:while    do..while
3.3.3 结构体struct
3.3.3.1 结构体定义
结构体的人基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型结构体定义struct 结构体名{数据类型 成员名1;数据类型 成员名2;数据类型 成员名3;};    访问结构体成员的方式结构体变量名.成员名Student stu1;stu1.num=32;结构体数组[下标].成员名Student ar[3];ar[2].num=98;结构体指针——>成员名Student *p=&stu1;p->num=100;结构体变量的声明和初始化struct Student{string name;int age;float score;}st1={'张三',18,100},st2={'李四',18,100},stu3;stu3.name="王五"stu3.age=18;stu3.score=80;struct student stu4;stu4.name="张三";stu4.age=18;stu4.score=100;Student st5={'张三',18,100};------------------------struct Student{string name;int age;float score;};    ------------------------struct{string name;int age;float score;}st1,st2;------------------------结构体嵌套结构体:在结构体中可以定义另一个结构体作为成员,来解决实际问题struct student{string name;int age;int score;};struct teacher{int id;string name;int age;struct student stu;};struct teacher t1;t1.id=1;t1.name="老王";t1.age=40;t1.stu.name="张三";t1.stu.age=18;t1.stu.score=100;定义别名typedef 原名 别名;typedef int size;size i=2;
3.3.3.2 结构体数组
结构体数组:将自定义的结构体放入到数组中方便维护struct 结构体名 数组名[元素个数] = {{},{}...{}}struct Student {string name;int age;float score;};// 创建一个包含3个Student结构体的数组Student students[3];// 初始化结构体数组Students group1[3]={{"Alice",20,85.5},{"Bob",21,92.0},{"Charlie",19,78.5}};students[0].name = "Alice";students[0].age = 20;students[0].score = 85.5;students[1].name = "Bob";students[1].age = 21;students[1].score = 92.0;students[2].name = "Charlie";students[2].age = 19;students[2].score = 78.5;// 遍历结构体数组并输出内容for (int i = 0; i < 3; ++i) {cout << "Name: " << students[i].name<< ", Age: " << students[i].age<< ", Score: " << students[i].score << endl;}
3.3.3.3 结构体函数
结构体作为参数向函数中传递   struct student{string name;int age;int score;};值传递void printStudent(student stu){stu.age=28;cout<<stu.age<<endl;}student stu = {"张三",18,100};printStudent(stu);地址传递void printStudent(student *stu){stu->age=28;cout<<stu->age<<endl;}student stu = {"张三",18,100};printStudent(&stu);    数组传值void printStudent(student stu){for(int i=0;i<n;i++){cout<<stu[i].age<<endl;}}student stu[2] = {{"张三",18,100},{"李四",18,100}};printStudent(stu);  
3.3.3.4 结构体指针 
结构体指针:通过指针访问结构体中的成员利用->可以通过结构体指针访问结构体属性struct student{string name;int age;int score;};struct student stu = {"张三",18,100};struct student *p = &stu;p->score = 80;

4.输入输出

4.1 语句 输入cin输出cout

输入 cin :c++输入流对象,绑定的是键盘【>>】int a = 0;    //要先定义cin >> a;    输出 cout:c++的输出流对象,绑定标准输出设备显示器【<<】cout <<"整型变量a=" <<a <<endl;

举例 

手动赋值输出 

#include <bits/stdc++.h> 			//万能头文件
using namespace std;				//标准命名空间 
int main(){							//程序入口 int a = 0;cout <<"请给整型变量a赋值:" <<endl;cin >> a;cout <<"整型变量a=" <<a <<endl;float b = 3.14f;cout <<"请给浮点型变量b赋值:" <<endl;cin >> b;cout <<"浮点型型变量b=" <<b <<endl;return 0;					//程序正常结束	
}  

精确保留位数 

int x;
cin>>x;
cout<<x;
cout<<fixed<<setprecision(k)<<x;    //保留k位小数
cout<<setw(k)<<x;                   //如果小于k位,则占k个字符位置,否则就按实际的长度占位置int n=99;
cout<<fixed<<setprecision(2)<<sqrt(n)<<x;    来源于头文件:#include <iomanip>

4.2 格式化 输入scanf输出printf函数 

4.2.1 scanf格式字符串
scanf格式字符串一般形式为: %[*][输入数据宽度][长度]类型         其中有方括号[]的项为任选项%:表示一个格式指定符的开始[*]:这是一个可选的星号,用于表示跳过该输入项,不将其存储在变量中这通常与 * 修饰符一起使用,如 %*d,表示读取一个整数但不保存它[输入数据宽度]:这是一个可选的整数值,用于指定输入数据的最小宽度。如果输入的数据宽度小于这个值,scanf 会继续读取直到达到指定的宽度或遇到空白字符[长度]:这是一个可选的长度修饰符,用于指定输入数据的大小。常见的长度修饰符有:h:短整型(short)或单字符(char)l:长整型(long)ll:长长整型(long long)L:用于 scanf 中不常见,但在 printf 中用于 long double 类型j:intmax_t 类型(C99 中定义)z:size_t 类型(C99 中定义)t:ptrdiff_t 类型(C99 中定义)类型:指定输入数据的类型。常见的类型指定符有:d:有符号十进制整数u:无符号十进制整数o:无符号八进制整数x 或 X:无符号十六进制整数(x 为小写,X 为大写)c:单个字符s:字符串,直到遇到空白字符或达到指定的宽度为止f:浮点数e、E、g、G:浮点数的科学计数法表示p:指针地址%:读取一个 % 符号

例子

#include <stdio.h>int main() {int a;float b;char c;printf("请输入一个整数、一个浮点数和一个字符,用空格分隔:\n");// 读取一个整数、一个浮点数和一个字符scanf("%d %f %c", &a, &b, &c);                             printf("您输入的整数是:%d,浮点数是:%f,字符是:%c\n", a, b, c);return 0;
}
4.2.2 printf格式化输出
printf格式字符串一般形式为: %[标志][输出最小宽度][.精度][长度]类型        其中方括号[]中的项为可选项%[flags][Width][.Precision][Length]Type%:格式字符串的开头,表示一个格式指定符的开始[Flags]:标志,用于控制输出的格式。常见的标志有:-:左对齐输出+:输出正数时显示符号空格:输出正数时前面加空格(默认情况下,正数不加任何符号)#:对于 o(八进制)、x 或 X(十六进制)转换,输出前导零;对于 e、E、f、g 或 G 转换,输出小数点;对于 g 或 G 转换,输出尾随零0:用零填充空白处(与宽度指定符一起使用)[Width]:输出最小宽度。如果输出的数据小于这个宽度,则输出会左对齐或右对齐(取决于是否使用了 - 标志)并用适当的字符(通常是空格或 0,取决于是否使用了 0 标志)填充至指定宽度[.Precision]:精度。对于某些转换类型,它指定了输出的最大字符数或小数点后的数字个数对于 d、i、o、u、x、X 转换,它指定了输出的最小字符数对于 e、E、f 转换,它指定了小数点后的数字个数对于 g、G 转换,它指定了最大的有效数字个数对于 s 和 c 转换,它指定了最大字符数[Length:长度修饰符,用于指定输出数据的大小。常见的长度修饰符有:h:短整型(short)或单字符(char)l:长整型(long)ll:长长整型(long long)L:长双精度(long double),用于 e、E、f、g 或 G 转换j:intmax_t 类型(C99 中定义)z:size_t 类型(C99 中定义)t:ptrdiff_t 类型(C99 中定义)[Type]:类型指定符,用于指定如何格式化输出数据。常见的类型指定符有:d 或 i:有符号十进制整数o:无符号八进制整数u:无符号十进制整数x:无符号十六进制整数(小写字母)X:无符号十六进制整数(大写字母)f:十进制浮点数e:科学计数法表示的浮点数(小写 e)E:科学计数法表示的浮点数(大写 E)g:根据数值大小自动选择 %f 或 %e 格式,但不输出尾随零G:与 g 类似,但使用大写字母 Ec:字符s:字符串p:指针地址n:不输出任何内容,只将已写入的字符数存入相应的参数中%:输出一个 % 字符

例子 

#include <stdio.h>int main() {int num = 12345;printf("整数:%d\n", num);             // %d 用于输出十进制整数printf("%-10d\n", num);                // 输出整数,宽度为 10,左对齐,右边用空格补齐printf("%10d\n", num);                 // 输出整数,宽度为 10,右对齐(默认),左边用空格补齐printf("%010d\n", num);                // 输出整数,宽度为 10,左边用0补齐float f = 3.14159;printf("单精度浮点数:%f\n", f);       // %f 用于输出浮点数(单精度)printf("双精度浮点数:%lf\n", f);      // %lf 用于输出浮点数(双精度),l 表示 longprintf("%.2f\n", f);		           // 保留小数点后面2位printf("%10.2f\n", f);                 // 输出浮点数,保留两位小数,宽度为 10,右对齐printf("%06.2f\n", 3.14159265) ;       // 保留小数点后面2位同时让结果占6个空格,左边用空格补齐char str[] = "Hello, World!";printf("字符串:%s\n", str);           // %s 用于输出字符串printf("%10s\n", str);                 // 输出字符串,宽度为 10,右对齐(默认),如果字符串长度小于宽度,则左侧填充空格printf("-%10s\n", str);                // 输出字符串,宽度为 10,左对齐,如果字符串长度小于宽度,则右侧填充空格int num1,num2;scanf("%d%d",&num1,&num2);printf("%d+%d=%d/n",num1,num2,num1+num2);    return 0;
}

4.3 单个字符 输入getchar输出putchar函数 

#include <stdio.h>int main() {char c;// 使用 getchar() 从用户那里读取一个字符c = getchar();// 使用 putchar() 将该字符输出到控制台putchar(c);return 0;
}

4.4 标准输入fgets输出puts函数

#include <cstdio>int main() {char str[100]; // 定义一个足够大的字符数组来存储输入的字符串// 使用 fgets 从标准输入读取字符串// 注意:fgets 会读取换行符,并将其存储在字符串中fgets(str, sizeof(str), stdin);// 使用 puts 将字符串输出到标准输出// puts 会自动在字符串后添加换行符puts(str);return 0;
}

5.常量和变量 

5.1 命名规则

1.标识符不能是关键字2.标识符只能由字母(A~Z a~z)、数字(0~9)、下划(_)线组成3.第一个字符必须是字母或下划线4.标识符中字母区分大小写5.变量名的长度一般不超过8个字符建议:给标识符命名时,争取做到见名知其意的效果,方便自己和他人阅读

5.2 变量

作用:方便我们管理内存空间数据类型 变量名称 = 变量初始值;
int a = 10;
名称                在何处声明/定义                                作用域
全局变量

在函数外部 进行定义
 

一般在源代码文件的顶部

从变量定义的位置起,直至本源文件结束为止
局部变量在函数内部 进行定义

只能在当前定义它们的函数中使用

函数调用结束后该变量就无效

形参也是局部变量当全局变量与局部变量同名时,遵循局部优先的规则
也就是说,在局部变量的作用域内,局部变量有效,全局变量被屏蔽不同函数内部的变量,即使同名,由于作用域不同,所以互不影响

5.3 常量

作用:用于记录程序中不可更改的数据定义常量的两种方式#define 宏常量:#define 常量名 常量值通常在文件的上方定义,表示一个常量const修饰的变量:const 数据类型 常量名=常量值通常在变量定义前加关键字const,修饰该变量为常量,不可修改
5.3.1 #define 宏常量

通常定义在文件的上方 

#include <bits/stdc++.h>	
using namespace std;	#define day 7int main(){//day = 10; 错误:day是常量,一修改就会报错cout <<"一周总共有多少天:" <<day <<"天" <<endl;return 0;
}
5.3.2 const 修饰的变量
#include <bits/stdc++.h>	
using namespace std;	int main(){const int month = 12; //month = 24; 错误:const修饰的变量也称为常量cout <<"一年有多少个月份:" <<month <<"个" <<endl;return 0;
}

6.运算符

6.1 算术运算符

用于处理四则运算

运算符术语实例结果
+正号+33
-负号-3-3
+10+515
-10-55
*10*550
/10/52
%取余(取模)10%31
++前置递增

a=2;

b=++a;

a=3;

b=3;

++后置递增

a=2;

b=a++;

a=3;

b=2;

--前置低贱

a=2;

b=--a;

a=1;

b=1;

--后置递减

a=2;

b=a--;

a=1;

b=2;

余数的正负:由被除数决定浮点数没有取余运算如果a和b都是整数,则a/b会得到a除以b的商

6.2 赋值运算符

用于将表达式的值赋给变量

运算符术语实例结果
=赋值

a=2;

b=3;

a=2;

b=3;

+=加等于

a=0;

a+=2;

a=2;
-=减等于

a=5;

a-=3;

a=2;
*=乘等于

a=2;

a*=2;

a=4;
/=除等于

a=4;

a/=2;

a=2;
%=模等于

a=3;

a%2;

a=1;

6.3 比较运算符/关系运算符

用于表达式的比较,并返回一个真值或假值

运算符术语实例结果
==相等于4==30
!=不等于4!=31
<小于4<30
>大于4>31
<=小于等于4<=30
>=大于等于4>=11

6.4 逻辑运算符

用于根据表达式的值返回真值或假值

运算符术语实例结果
!!a

如果a为假,则!a为真

如果a为真,则!a为假

&&a&&b如果a和b都为真,则结果为真,否则为假
||a||b

如果a和b有一个为真,则结果为真

二者都为假时,结果为假

6.5 位运算符        

进制转换【最全进制转换汇总】(整数_小数_正数_负数)任意进制之间的相互转换

加法口诀:先把数位对齐,从低位到高位,依次进行加法,进位规则“逢二进一”1 1 0 1+     1 1 0___________1 0 0 1 1减法口诀:先把数位对齐,同一数位不够减时,从高一位借位,借位规则是“借一0当二”1 1 0 1 0 1-     1 1 1 1 0_______________1 0 1 1 1乘法口诀:先把数位对齐,从低位到高位,依次进行乘法,运算规则“一一得一,其他都得零”1 1 0 1x       1 1 0_______________1 0 1 10 0 0 0 + 1 0 1 1_______________1 1 0 1 1 1除数和被除数的高位对齐,做减法,够减时商为 1,不够减时商为010010____________________1001/    101000101001____________________10011001____________________0
位运算符作用 运算规则(整型 字符型)       实例
&按位与两位同时为1,结果为1A&B
|按位或两位只要有一个1,结果为1A|B
~按位非/取反取反:0变1,1变0~A
^按位异或两位不同时,结果为1A^B
<<向左位移向左移动,右侧补0        A<<2
>>向右位移向右移动,左侧补符号位A>>2

6.6 运算符优先级

类型运算符
括号运算()
逻辑非(!)的优        >        按位取反(~)
算术运算+、-、*、\、%
位运算符<<、>>
关系运算>、>=、<、<=、==、!=
位运算符位与&       >         位或|        >        位异或^
逻辑运算逻辑与&&         >        逻辑或||
赋值运算= 、+= 、-= 、*= 、/= 、%=

7.程序流程结构

C/C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构顺序结构:程序按顺序执行,不发生跳转选择结构:依据条件是否满足,有选择的执行相应功能循环结构:依据条件是否满足,循环多次执行某段代码

7.1 选择结构

7.1.1 if语句
单分支语句if(条件){条件满足执行的语句块;}双分支语句if(条件){条件满足执行的语句块;}else{条件不满足执行的语句块;}多分支语句if(条件1){条件1满足执行的语句块;}else if(条件2){条件1满足执行的语句块;}...else{都不满足执行的语句块;}

举例

分数和最重的猪 

#include <bits/stdc++.h> 			//万能头文件:包含了目前c++所包含的所有头文件
using namespace std;			    //标准命名空间 
int main(){						    //程序入口 //------------------------------------------------------------------------------------------//int score1 = 0;cout << "请输入分数:" << score1 <<endl;cin >> score1;if (score1 >=600){cout <<"你输入的分数为:"  << score1 << "分" <<endl << "恭喜你考试重本" <<endl;}else{cout <<"你输入的分数为:" << score1 << "分" <<endl << "很抱歉,别灰心加油!" <<endl;}//------------------------------------------------------------------------------------------//int score2 = 0;cout << "请输入分数:" << score2 <<endl;cin >> score2; cout <<"你输入的分数为:"  << score2 << "分" <<endl;if (score2 >=600){cout << "恭喜你考试一本" <<endl;if (score2 >700){cout << "恭喜你考上清华大学" <<endl;}else if (score2 > 650){cout << "恭喜你考上北大" <<endl;}else{cout << "恭喜你考上人大" <<endl;}}else if(score2 >=500){cout << "恭喜你考试二本" <<endl;}else if (score2 >=400){cout << "恭喜你考试三本" <<endl;}else{cout << "很抱歉你没有考上本科" <<endl;}//------------------------------------------------------------------------------------------//int a = 0;int b = 0;int c = 0;cout << "请输入小猪a的体重" << endl;cin >> a;cout << "请输入小猪a的体重:" << a  << "斤"<<endl;cout << "请输入小猪b的体重" << endl;cin >> b;cout << "请输入小猪b的体重:" << b  << "斤"<<endl;cout << "请输入小猪c的体重" << endl;cin >> c;cout << "请输入小猪c的体重:" << c  << "斤"<<endl;if (a>b){if (a>c){cout <<"小猪a最重" <<endl;}else{cout <<"小猪c最重" <<endl;}}else{if (b>c){cout <<"小猪b最重" <<endl;}else{cout <<"小猪c最重" <<endl;}}//------------------------------------------------------------------------------------------//return 0;					    //程序正常结束	
}  

绝对值

第一种if(x<0){x=x*-1}第二种x=abs(x)

 奇偶判断

//偶数
if(n%2==0){}//奇数
if(n%2!=0){}

字符类型判断

if(ch>='a'&&ch<='z'){}if(ch>='A'&&ch<='Z'){}if(ch>='0'&&ch<='9'){}

闰年判断

if(year%4==0 && year%100!=0 || year%400==0){}

虫吃草问题

	int x,y,n,d;cin>>n>>x>>y;d=y/x;if(y%x==0)	cout<<n-d;else cout<<n-d-1; 
7.1.2 三目/元运算符
单目运算:+=    --    !双目运算:=    -    *    \    %>    >=    <    <=    ==    !=&&    ||

 三目运算

语法表达式1?表达式2:表达式3;如果表达式1的值为真,执行表达式2,并返回表达式2的结果如果表达式1的值为假,执行表达式1,并返回表达式1的结果在c++中三目运算返回的是变量,可以继续赋值(a<b?a:b)=100cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;
7.1.3 switch语句

执行多条件分支语句  

case的大小不一定按照顺序、同组的case顺序可以调换 :但是建议按照顺序写

switch(表达式)
{case 结果1:执行语句;break;case 结果2:执行语句;break;case 结果3:执行语句;break;...default:执行语句;break;    
}

举例

int score;
cin>>score;
switch(score)
{case 10:case 9:cout<<"经典"<<endl;break;case 8:cout<<"非常好"<<endl;break;case 7:case 6:cout<<"一般"<<endl;break;default:cout<<"烂片"<<endl;break;    
}

7.2 循环结构

7.2.1 while循环语句

满足循环条件,执行循环语句;只要循环条件为真就执行循环语句;写循环一定要避免死循环的出现 

while(循环条件)
{循环语句
}

举例 

遍历m到n之间的所有数(包括m和n) 

int t=m
while(t<=n){t++;
}

拆书模板

while(t){//对当前各位进行操作int ge=t%10;t/=10;
}

 反转数模板

int res=0;
while(t){int ge=t%10;res=res*10+ge;        //res是翻转以后的结果t/=10;
}
7.2.2 do...while循环语句

满足循环条件,执行循环语句;与while的区别在于do...while会先执行一次循环语句 再判断循环条件 

do
{循环语句
}while(循环条件);

举例

水仙花数 

#include <bits/stdc++.h> 			//万能头文件:包含了目前c++所包含的所有头文件
using namespace std;			    //标准命名空间 
int main(){						    //程序入口 //水仙花数 :一个3位数,每个位置上的数的3次幂之和等 于本身int num = 100;do{int a = 0;int b = 0;int c = 0;a = num%10;b = num/10%10;c = num/100; if (a*a*a+b*b*b+c*c*c == num){cout << num <<endl;}num++;}while(num <1000);return 0;					    //程序正常结束	
}  
7.2.3 for循环语句

满足循环条件,执行循环语句 

for(起始化;条件判断;更新)
{循环语句;
}

举例

组成的n层的等腰三角形

#include <iostream>
using namespace std;
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n-i;j++){cout<<" ";}for(int j=1;j<=2*i-1;j++){cout<<"*";}cout<<"\n";}return 0;
}

 敲桌子 

#include <bits/stdc++.h>		
using namespace std;	//敲桌子:从1~100,如果数字个位、十位含有7、或者数字是7的倍数。我们打印敲桌子,其他数直接打印输出int main(){int b = 0;for (int i = 1; i < 101; i++){if (i%10 ==7|| i/10%10==7 ||i%7 ==0){cout << "敲桌子" <<endl;}else{cout << i <<endl;}}return 0;
}

求和模板

int s=0;
for(int i=1;i<=n;n++){int x;cin>>x;s+=i;
}

 最大值模板

//maxv初始化
int maxv=-1
for(int i=1;i<=n;i++){int x;cin>>x;if(x>maxv){maxv=x;}
}//maxv不初始化
int maxv=
for(int i=1;i<=n;i++){int x;cin>>x;if(i=1 || x>maxv){maxv=x;}
}

统计出现的次数

int cnt=0;
int m;
cin>>m;    //需要统计的值
for(int i=1;i<=n;i++){int x;cin>>x;if(x==m){cnt++;}
}

a^b

int s=1;
for(int i-1;i<=b;i++){s=s*a;
}

质数判断

bool st=true;
int n;
cin>>n;
if(n<2){st=false;
}for(int i=2;i<=n/i;i++){if(n%i==0){st=false;}
}if(st==true){//满足质数需要执行的内容
}else{//不满足质数需要执行的内容
}

百钱百鸡:公鸡每只5文钱,母鸡每只3文钱,小鸡3只共1文钱

for(int i=0;i<20;i++){for(int j=0;i=j<33;j++){for(int k=0;k<100;k++){if(i+j+k==100 && 5*i+3*j+k/3==100){cout<<i<<""<<j<<""<<k<<endl;}}}
}
7.2.4 嵌套语句

在循环体中再嵌套一层循环,解决一些实际问题 

10*10正方形 

#include <bits/stdc++.h>		
using namespace std;	int main(){for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){cout << "* ";}cout << endl;}return 0;
}

九九乘法表

#include <bits/stdc++.h>		
using namespace std;	int main(){for (int i = 1; i < 9; i++){for (int j = 1; j <= i; j++){cout << "i*j=" <<i*j << " ";}cout << endl;}return 0;
}

7.3 跳转语句

7.3.1 break语句
作用:用于跳出选择结构 或者 循环结构break使用的时机:出现在switch条件语句中:作用是终止case并跳出switch出现在循环语句中:作用是跳出当前的循环语句出现在嵌套循环中:跳出最近的内层循环语句for(int i=1;1<=5;i++){cout<<i<<endl;    //1 2 3 4 5
}for(int i=1;1<=5;i++){if(i==3)break;cout<<i<<endl;    //1 2
}
7.3.2 continue语句
作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环可以筛选条件,执行到此就不在向下执行,执行下一次循环for(int i=1;1<=5;i++){cout<<i<<endl;    //1 2 3 4 5
}for(int i=1;1<=5;i++){if(i%==0)continue;cout<<i<<endl;    //1 3 5
}
7.3.3 goto语句
作用:可以无条件跳转语句语法:goto 标记;
解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置

举例

int main(){#输出 1 5 cout<<"1"<<endl;goto a;cout<<"2"<<endl;cout<<"3"<<endl;cout<<"4"<<endl;a:cout<<"5"<<endl;
}

8.函数

作用:将一段经常使用的代码封装起来,减少重复代码一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能基本顺序:先声明、再调用、再定义

8.1 函数的定义

函数定义一般主要有5个步骤:返回值类型:void    bool    int    double    string    char    float返回值是void时,函数体无需return语句函数名:需要满足c++标识符命名规则(最好见名知意)形式参数:若没有参数,则参数列表为空,直接写()参数类型 参数名多个参数之间用逗号","间隔开来函数体语句:花括号内的代码,函数内需要执行的语句return表达式:和返回值类型挂钩,函数执行完后,返回相应的数据返回值类型 函数名(形式参数列表)        //函数头{                                     //函数体函数体语句;return 表达式;}int sum(int a,int b){int sum =  a +  b;return sum;}

8.2 函数的声明

函数的声明:声明可以多次,但是定义只能有一次返回值类型 函数名(参数列表);int sum(int a,int b);

8.3 函数的调用

调用:函数名(实际参数列表)        值传递调用:传递值——不会改变实参适合那些不需要在函数内部修改的数据,或者对于小型数据类型来说,复制开销可以接受int sum(int a,int b){int sum =  a +  b;return sum;}int a = 1;int b = 2;int c = sum(a,b);指针调用:转递地址——会改变实参适合需要修改原始数据或者传递大型数据结构的情况,但需要更多的编程技巧和对指针的深刻理解int sum(int *a,int *b){int sum =  *a +  *b;return sum;}int a = 1;int b = 2;int c = sum(&a,&b);引用调用:传递引用——会改变实参 传递的是对实参的引用(即实参的别名)在大多数情况下是首选,因为它结合了指针和值传递的优点,语法更加直观,并且减少了出错的可能性int sum(int &a,int &b){int sum =  a +  b;return sum;}int a = 1;int b = 2;int c = sum(a,b);

8.4 形参和实参

实参和形参// 函数定义,这里的x和y是形参void addNumbers(int x, int y) {int sum = x + y;cout << "The sum is: " << sum << endl;}int main() {int a = 5;int b = 10;// 函数调用,这里的5和10是实参addNumbers(a, b);// 再次函数调用,这次直接使用字面量作为实参addNumbers(7, 3);return 0;}

8.5 函数的常见形式

函数的常见样式无参无返void test01(){cout<<"666"<<endl;}有参无返void tets02(int a){cout<<a<<endl;}无参有返int tets03(){int sum=1+2;return sum;}有参有返int test04(int a,int b){int sum=a+b;return sum;}

8.6 分文件编写

函数的分文件编写创建后缀名为.h的头文件:在头文件中写函数的声明swap,h#include<bits/stdc++.h>using namespace std;void swap(int a, int b);创建后缀名为.cpp的源文件:在源文件中写函数的定义swap.cpp#include "swap.h"void swap(int a,int b){int temp = a;a = b;b = temp; cout << "a=" << a <<endl;cout << "b=" << b <<endl;}

8.7 Lambda函数

Lambda函数(也叫 Lambda 表达式)Lambda 表达式把函数看作对象:可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值Lambda 表达式本质上与函数声明非常类似:[capture](parameters)->return_type{body}[capture] 是捕获子句,用于指定Lambda函数体内可以访问的外部变量[]:默认不捕获任何变量[=]:默认以值捕获所有变量[&]:默认以引用捕获所有变量[x]:仅以值捕获x,其它变量不捕获[&x]:仅以引用捕获x,其它变量不捕获[=, &x]:默认以值捕获所有变量,但是x是例外,通过引用捕获[&, x]:默认以引用捕获所有变量,但是x是例外,通过值捕获[this]:通过引用捕获当前对象(其实是复制指针)[*this]:通过传值方式捕获当前对象(parameters) 是参数列表,用于指定 Lambda 函数的参数-> return_type 是返回类型,用于指定 Lambda 函数的返回类型如果省略此部分,编译器将自动推导返回类型{body} 是 Lambda 函数的主体,包含要执行的代码第一个例子:有参数// 定义一个Lambda函数,接受两个整数参数并返回它们的和auto add = [](int a, int b) -> int {    //使用auto关键字让编译器自动推断其类型return a + b;};// 使用Lambda函数int sum = add(5, 3);第二个例子:无参数int counter = 0;auto increment = [&counter]() {++counter;};// 调用Lambda函数几次increment();

8.8 函数递归

什么是递归算法?通过函数调用自身,将问题转化为本质相同但规模较小的子问题,是“分而治之”策略的具体体现将问题划分成若干个子问题以同样的方式分别去处理各个子问题把各个子问题的处理结果综合起来,形参最终的处理结果递归算法的两个必要条件:递归表达式(找规律——“分而治之”)递归出口(找出口——使递归“有去无回”)分析递归问题的步骤明确函数的功能(利用这个函数来求什么)根据递归的基本思想(把规模大的问题转化为规模小的相似的子问题来解决)来找
出等价关系式寻址递归结束条件(找边界、临界)函数直接或间接地调用自己,称为递归调用直接递归:直接调用自己间接递归:A调用B,B又调用A的递归递归函数一般符合以下格式:数据类型 递归函数名(形式参数){if(递归结束的条件){递归出口代码return 返回值;}else{调用递归函数名(实参列表)进行处理return 返回值;}}基本逻辑——>从外到内调用<——从内到外输出

举例

阶乘 

/*
阶乘(factorial)的定义: 一个正整数的阶乘是所有小于及等于该数的正整数的积n!  = n * (n-1)  *  (n-2) *... * 2 * 1
输入一个正整数n,输出n!的结果
*/
#include<iostream>
using namespace std;int fac(int n){if(n==1)return 1;return n*fac(n-1);	
}int main(){int num;cin>>num;cout<<fac(num);return 0;
}

汉诺塔问题

/*
【课堂编程】汉诺塔问题:输入汉诺塔层数n,输出移动步骤。汉诺塔的算法思路:
如果只有一个圆盘,则把该圆盘从A柱到C柱,结束。
如果有n个圆盘,则把前n-1个圆盘移动到B,然后把自己移动到C,最后再把前n-1个移动到C。
【输入】一个整数n,表示A柱上有n个圆盘(0<n<=10)
【输出】若干行,一行是一次移动步骤
*/
#include<iostream>
using namespace std;void hanoi(int,char,char,char);/* 主函数 */
int main(){int n;printf("输入汉诺塔的层数:");scanf("%d",&n);hanoi(n,'A','B','C');return 0;
}/*
汉诺塔递归函数 
n-层数,A-起始柱,B-辅助柱,C-目标柱 
*/ 
void hanoi(int n,char A,char B,char C){// 递归出口if(n==1){// 圆盘从A移动到Cprintf("%c To %c\n",A,C);}else{// 上面n-1层汉诺塔(从A移到B)// 此时,A为起始柱, B为目标柱,C为辅助柱 hanoi(n-1,A,C,B); 							//A——>B // 将A上遗留的最后一个圆盘移动到C上printf("%c To %c\n",A,C);					//A——>C // B上n-1层汉诺塔移回C // 此时,B为起始柱, C为目标柱,A为辅助柱 hanoi(n-1,B,A,C);							//B——>C }
}

斐波那契数列

/*
【课堂编程】斐波那契数列:斐波那契数列(Fibonacci)是指这样的数列:1,1,2,3,5,8,13……
这个数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
【编程挑战 】输入正整数n,输出斐波那契数列第n项
【输入】一个正整数n,表示第n项
【输出】第n项是多少
【输入样例】4                   
【输出样例】3
*/
#include<iostream>
using namespace std;int fibo(int n){if(n<=2)return 1;elsereturn fibo(n-1)+fibo(n-2);
}int main(){int x;cin>>x;cout<<fibo(x);return 0;
}

打印直角三角形

/*
输入三角形的行数n,输出*组成的三角形图案。要求用递归函数实现整个三角形图案的输出。
【输入】输入一个整数n
【输出】*组成的三角形
【输入样例】7
【输出样例】
*
**
***
****
*****
******
*******
*/
#include<iostream>
using namespace std;// 输出n行的*三角形 
void draw(int n){if(n==1){// 递归出口 cout<<"*"<<endl;}else{// 递归 draw(n-1); // n-1的三角形 for(int i=1;i<=n;i++)// 一行n个* cout<<"*";cout<<endl;}
}int main(){int x;cin>>x;draw(x);return 0;
}//  如果输入3
//  从外到内进行调用:draw(3)    draw(2)    draw(1)    
//  从内到外进行输出:draw(1)    draw(2)    draw(3) 

爬楼梯

/*
【编程挑战 】有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶或2阶。输入楼梯的级数,求有小孩有多少种不同的走楼梯方式。
【输入】一个整数n代表楼梯总级数(1≤n≤30)
【输出】不同的楼梯走法数
【输入样例1】5
【输出样例1】8
【输入样例2】10                                  
【输出样例2】89       
*/
#include<iostream>
using namespace std;// n阶楼梯的走法数
int F(int n) {if (n == 1)return 1;else if (n == 2)return 2;else // 递归关系 return F(n - 1)  + F(n - 2) ;
}int main(){int x;cin>>x;cout<<F(x);return 0;
}
/*
【编程挑战 】某个上班族正在上楼梯,楼梯有n阶台阶,他一次可以上1阶、2阶、3阶。输入楼梯的级数,求有多少种不同的上楼方式。
【输入】一个整数n代表楼梯总级数(1≤n≤30)
【输出】不同的楼梯走法数
【输入样例1】5
【输出样例1】13
【输入样例2】10                                  
【输出样例2】274     
*/ 
#include<iostream>
using namespace std;// n阶楼梯的走法数
int F(int n) {if (n == 0 || n == 1)return 1;else if (n == 2)return 2;else // 递归关系 return F(n - 1)  + F(n - 2) + F(n - 3);
}int main(){int x;cin>>x;cout<<F(x);return 0;
}

约瑟夫问题:画出来看

/*
【编程挑战 】n个人围成一圈,编号依次为 1,2,3,…,n。从第一个人开始报数,
数到 m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈。
以此类推,直到所有的人都出列。请输出最后一个出列人的编号。
【输入】两个整数 n,m(1≤n,m≤100)。
【输出】一个整数,表示最后一个人的编号。
【输入样例1】10 3
【输出样例1】4 
【输入样例2】41 3
【输出样例2】31
*/
#include<iostream>
using namespace std;/*
ysf(n,m) 表示 n 个人进行报数时,每报到 m 时淘汰那个人,最终胜利者的编号;
ysf(n-1,m) 表示,n-1 个人报数,每报到 m 时淘汰那个人,最终胜利者的编号;
所有编号都从1开始; 
*/ 
int ysf(int n,int m){if(n==1)return 1;elsereturn (ysf(n-1,m) -1 + m)%n + 1;
}int main(){int n,m;cin>>n>>m;cout<<ysf(n,m);return 0;
}
/*
约瑟夫环(编号从0开始)
【编程挑战 】n个人围成一圈,编号依次为 0,1,2,3,…,n-1。
从第一个人开始报数,数到 m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈。
以此类推,直到所有的人都出列。请输出最后一个出列人的编号。
【输入】两个整数 n,m(1≤n,m≤100)。
【输出】一个整数,表示最后一个人的编号。
【输入样例1】10 3
【输出样例1】3 
【输入样例2】41 3
【输出样例2】30
*/
// 用前面的递归公式(针对编号从1开始的情况),需要把函数最终返回值-1
#include<iostream>
using namespace std;/*
ysf(n,m) 表示 n 个人进行报数时,每报到 m 时淘汰那个人,最终胜利者的编号;
ysf(n-1,m) 表示,n-1 个人报数,每报到 m 时淘汰那个人,最终胜利者的编号;
所有编号都从1开始; 
*/ 
int ysf(int n,int m){if(n==1)return 1;elsereturn (ysf(n-1,m) + m -1)%n + 1;
}int main(){int n,m;cin>>n>>m;// 函数返回的编号从1开始,最终输出的编号要从0开始 // 只要把返回值-1即可 cout<<ysf(n,m)-1; return 0;
}
/*
约瑟夫环(编号从0开始)
【编程挑战 】n个人围成一圈,编号依次为 0,1,2,3,…,n-1。
从第一个人开始报数,数到 m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈。
以此类推,直到所有的人都出列。请输出最后一个出列人的编号。
【输入】两个整数 n,m(1≤n,m≤100)。
【输出】一个整数,表示最后一个人的编号。
【输入样例1】10 3
【输出样例1】3 
【输入样例2】41 3
【输出样例2】30
*/
// 用新的递归公式(针对编号从0开始的情况)
#include<iostream>
using namespace std;/*
ysf(n,m) 表示 n 个人进行报数时,每报到 m 时淘汰那个人,最终胜利者的编号;
ysf(n-1,m) 表示,n-1 个人报数,每报到 m 时淘汰那个人,最终胜利者的编号;
所有编号都从0开始; 
函数返回的编号也从0开始; 
*/ 
int ysf(int n,int m){if(n==1)return 0;elsereturn (ysf(n-1,m) + m)%n ;
}int main(){int n,m;cin>>n>>m;cout<<ysf(n,m); return 0;
}

机器人行走路径

/*
【编程挑战 】有一个网格横向x格,纵向y格,一个机器人一次只能一格,而且只能向右或向下走。
机器人总是从最左上角的格子出发,要走到最右下角的格子。
请问机器人有多少种不同的走法?
给定两个正整数x、y,返回机器人的走法数目。
【输入】两个正整数x,y(1≤x,y≤10)
【输出】机器人的走法数目
【输入样例】3 4                      
【输出样例】10到达它左边格子的路径数量加上到达它上边格子的路径数量
到达右下角的不同路径数量是机器人:之和选择向右走到达 倒数第二列的所有路径数量选择向下走到达 倒数第一行的所有路径数量
*/
#include<iostream>
using namespace std;int f(int x, int y) {if (x == 1 || y == 1) return 1;return f(x - 1, y) + f(x, y - 1);//       左               上       
}int main(){int x,y;cin>>x>>y;cout<<(f(x,y));return 0;
}

8.9 内置函数

取整向下取整    floor(x)    double类型向上取整    ceil(x)     double类型四舍五入    round(x)    double类型#include<cmath>
int i = ceil(3.1);        //对3.1进行向上取整

随机数 

#include <iostream>		
using namespace std;	
//time系统时间头文件包含
#include <ctime>//系统生成随机数;玩家进行猜测;判断玩家的猜测;猜对 结束游戏;猜错 提示猜测的结果过大或者过小,重新返回第二步int main(){//添加随机种子:作用利用当前系统时间生成随机数,防止每次随机数都一样srand((unsigned int)time(NULL));int a = rand()%100+1;//生成一个0~99+1的随机数cout << "系统生成一个随机数为:" << a <<endl;return 0;
}

三:语法进阶

1.文件

文件类型分为两种: 文本文件:文件以文本的**ASCII码**形式存储在计算机中二进制文件:文件以文本的**二进制**形式存储在计算机中,用户一般不能直接读懂它们操作文件的三大类:fstream :读写操作ofstream:写操作ifstream:读操作ofs.open("文件路径",打开方式);| 打开方式    | 解释                       || ----------- | -------------------------- || ios::in     | 为读文件而打开文件         || ios::out    | 为写文件而打开文件         || ios::ate    | 初始位置:文件尾           || ios::app    | 追加方式写文件             || ios::trunc  | 如果文件存在先删除,再创建 || ios::binary | 二进制方式                 |注意:文件打开方式可以配合使用,利用|操作符例如:用二进制方式写文件 `ios::binary |  ios:: out`

1.1 文本文件第一种 方法

1.1.1 写ofstream
输出文件流:ofstream(output file stream)可以把数据从程序中写入(输出到)文件
写入数据到文件:程序——>文件基本操作流程:1.包含C++文件流头文件2.用ofstream打开文件3.向文件写入内容4.关闭文件#include <iostream>#include <fstream>    //包含文件流头文件using namespace std;int main(){//创建ofstream对象 打开文件ofstream myFile("E:\小猫故事.txt");//使用<<流出操作符向文件写入内容myFile<<"在一个阳光明媚的下午"<<endl;myFile<<"有一只可爱的小猫在花园里玩耍"<<endl;myFile<<"它跑的非常快,就像一阵风"<<endl;//关闭文件myFile.close();//向文件E输出了hello18    ofstream fout("E:\out.txt");fout<<"hello";  fout<<2*3+12<<endl;fout.close();return 0;}
1.1.2 读ifstream
输入文件流:ifstream(input file stream)可以帮助程序从文件读取如数据
读取文件中的数据:程序<——文件基本操作流程:1.包含C++文件流头文件2.用ifstream打开文件3.读取文件内容4.关闭文件#include <iostream>#include <ifstream>    //包含文件流头文件using namespace std;int main(){//创建ifstream对象 打开文件ifstream myFile("E:\小猫故事.txt");//使用>>流入操作符向文件读入内容int age=0;char name[40]={0};char s[200];myfile>>name>>age;        //从文件读取    myfile.getline(s,200);cout<<name<<age<<endl;    //输出到屏幕//关闭文件myFile.close();return 0;}
1.1.3 判断打开文件is_open
文件流对象名.is_open#include <fstream>ofstream myFile("E:\x.txt");ifstream myFile("E:\x.txt");if(文件流对象名.is_open()){//读写文件//关闭文件myFile.close();}else{//错误提示(输出到屏幕)cout<<"无法打开文件"<<endl;}

举例

/*
【编程挑战 】编程求100以内所有整数(1,2,3......99,100)的平方根,并将结果保存在文本文件sqrt.txt中。
使用数学库函数sqrt(n)求平方根。要求平方根结果精确到小数点后2位。
【输入】无
【输出】sqrt.txt文件
*/
#include <iostream> 
#include <fstream>  
#include <cmath>  // 使用 sqrt(n)需要这个头文件 
#include <iomanip> // 使用 setprecision(n)需要这个头文件 
using namespace std;int main() {// 创建ofstream对象,准备写入文件ofstream fout("E:\sqrt.txt");// 检查确认文件已经成功打开 if(fout.is_open()) {for(int n=1; n<=100; n++){// 使用<<操作符向文件写入内容fout<<n<<"的平方根:"; fout<<fixed<<setprecision(2)<<sqrt(n)<<endl; } // 关闭文件fout.close();cout << "已经写入文件啦!" << endl;}else{cout << "无法打开文件" << endl;} return 0;
}
/*
【编程挑战 】编写一个程序,统计 characters2.txt 文件中数字字符的个数。
【输入】从characters2.txt读取输入。不确定characters2.txt有多少行内容。
(每行长度不超过100,行内没有空格) 
【输出】数字字符个数:32
*/
/*逐个读取字符,直到读完*/
#include <iostream>
#include <fstream>  // 使用文件流需要这个头文件
#include <cstring>  // 使用 strlen()需要这个头文件 
using namespace std;int main() {char c;   int total=0;// 创建一个输入流,用于从文件读取ifstream fin("E:\characters2.txt");// 检查确认文件已经成功打开 if(fin.is_open()) {while(fin >> c){// 逐个读取字符,直到读完// 检查并统计if( c >= '0' && c <= '9') {total++;}} // 输出统计结果 cout<<"数字字符个数:"<<total; // 关闭文件fin.close();}else{cout << "无法打开文件" << endl;} return 0;
}

1.2 文本文件第二种方法

1.2.1 写ofstream 
写文件1.头文件   #include <fstream>2.创建流对象  ofstream ofs;3.打开文件ofs.open("文件路径",打开方式);| 打开方式    | 解释                       || ----------- | -------------------------- || ios::in     | 为读文件而打开文件         || ios::out    | 为写文件而打开文件         || ios::ate    | 初始位置:文件尾           || ios::app    | 追加方式写文件             || ios::trunc  | 如果文件存在先删除,再创建 || ios::binary | 二进制方式                 |注意:文件打开方式可以配合使用,利用|操作符例如:用二进制方式写文件 `ios::binary |  ios:: out`4.写数据 ofs << "写入的数据";5.关闭文件ofs.close();-----------------------------------------------------------------------举例#include <fstream>void test01(){ofstream ofs;ofs.open("test.txt", ios::out);ofs << "姓名:张三" << endl;ofs << "性别:男" << endl;ofs << "年龄:18" << endl;ofs.close();}int main() {test01();system("pause");return 0;}
1.2.2 读ifstream
读文件步骤如下:1.包含头文件   #include <fstream>2.创建流对象  ifstream ifs;3.打开文件并判断文件是否打开成功ifs.open("文件路径",打开方式);4.读数据四种方式读取5.关闭文件    ifs.close();-----------------------------------------------------------------------举例#include <fstream>#include <string>void test01(){ifstream ifs;ifs.open("test.txt", ios::in);if (!ifs.is_open()){cout << "文件打开失败" << endl;return;}//第一种方式:使用 ifstream 的输入运算符 >> 来读取文件//这种方式会按照空白字符(如空格、制表符或换行符)来分割字符串char buf[1024] = { 0 };while (ifs >> buf){cout << buf << endl;}//第二种方式:使用 ifstream 的 getline 成员函数来读取文件//getline 函数会读取直到遇到换行符或达到指定的最大字符数(这里是1024)为止的字符串//这种方式会保留每行的换行符,并将其打印到控制台char buf[1024] = { 0 };while (ifs.getline(buf,sizeof(buf)))    //a.getline(输出的对象,大小){cout << buf << endl;}//第三种方式:使用标准库函数 getline,该函数接受一个 ifstream 对象和一个 string 对象作为参数//这种方式与第二种方式类似,但它使用 string 来存储读取的每一行,而不是字符数组//这种方式不会保留每行的换行符string buf;while (getline(ifs, buf))               //getline(输入流对象,输出的对象){cout << buf << endl;}//第四种方式:使用 ifstream 的 get 成员函数来逐个字符地读取文件//这种方式会一直读取文件直到达到文件末尾(EOF)//与第二种和第三种方式相比,这种方式不会按行分割内容,而是直接打印出文件的每一个字符,包括换行符char c;while ((c = ifs.get()) != EOF)         //EOF end of file{cout << c;}ifs.close();}int main() {test01();system("pause");return 0;}

1.3 二进制文件

1.3.1 写ofstream write
#include <fstream>
#include <string>class Person
{
public:char m_Name[64];int m_Age;
};//二进制文件  写文件
void test01()
{//1、包含头文件//2、创建输出流对象打开文件ofstream ofs("person.txt", ios::out | ios::binary);//ofs.open("person.txt", ios::out | ios::binary);//3、写文件Person p = {"张三"  , 18};ofs.write((const char *)&p, sizeof(p));//4、关闭文件ofs.close();
}int main() {test01();system("pause");return 0;
}
1.3.2 读ifstream read
#include <fstream>
#include <string>class Person
{
public:char m_Name[64];int m_Age;
};void test01()
{//1、包含头文件//2、创建输入流对象打开文件ifstream ifs("person.txt", ios::in | ios::binary);if (!ifs.is_open()){cout << "文件打开失败" << endl;}//3、读文件Person p;ifs.read((char *)&p, sizeof(p));cout << "姓名: " << p.m_Name << " 年龄: " << p.m_Age << endl;//4、关闭文件ofs.close();
}int main() {test01();system("pause");return 0;
}

相关文章:

C++程序设计教案

文章目录&#xff1a; 一&#xff1a;软件安装环境 第一种&#xff1a;vc2012 第二种&#xff1a;Dev-C 第三种&#xff1a;小熊猫C 二&#xff1a;语法基础 1.相关 1.1 注释 1.2 换行符 1.3 规范 1.4 关键字 1.5 ASCll码表 1.6 转义字符 2.基本框架 2.1 第一种&…...

修改Ubuntu远程登录欢迎提示信息

无论何时登录公司的某些生产系统&#xff0c;你都会看到一些登录消息、警告或关于你已登录服务器的信息&#xff0c;如下所示。 修改方式 1.打开ubuntu终端,进入到/etc/update-motd.d目录下面 可以发现目录中的文件都是shell脚本, 用户登录时服务器会自动加载这个目录中的文件…...

暗区突围pc端下载教程 暗区突围pc端怎么下载

暗区突围pc端下载教程 暗区突围pc端怎么下载 《暗区突围》是一款刺激的第一人称射击游戏。目前pc版本要上线了&#xff0c;即将在5月正式上线。在这款游戏里&#xff0c;我们会在随机的时间、地点&#xff0c;拿着不一定的装备&#xff0c;跟其他玩家拼个高低&#xff0c;还需…...

大数据技术原理与技术简答

1、HDFS中名称节点的启动过程 名称节点在启动时&#xff0c;会将FsImage 的内容加载到内存当中&#xff0c;此时fsimage是上上次关机时的状态。然后执行 EditLog 文件中的各项操作&#xff0c;使内存中的元数据保持最新。接着创建一个新的FsImage 文件和一个空的 Editlog 文件…...

Mybatis的简介和下载安装

什么是 MyBatis &#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和 Java 的…...

大历史下的 tcp:一个松弛的传输协议

如果 tcp 是一个相对松弛的协议&#xff0c;会发生什么。 所谓松弛感&#xff0c;意思是它允许 “漏洞”&#xff0c;允许可靠传输的不封闭&#xff0c;大致就是&#xff1a;“不求 100% 可靠&#xff0c;只要 90%(或多或少) 可靠&#xff0c;另外 10% 的错误可检测到” or “…...

加州大学欧文分校英语中级语法专项课程03:Tricky English Grammar 学习笔记

Tricky English Grammar Course Certificate Course Intro 本文是学习 https://www.coursera.org/learn/tricky-english-grammar?specializationintermediate-grammar 这门课的学习笔记 文章目录 Tricky English GrammarWeek 01: Nouns, Articles, and QuantifiersLearning …...

AI项目二十一:视频动态手势识别

若该文为原创文章&#xff0c;转载请注明原文出处。 一、简介 人工智能的发展日新月异&#xff0c;也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式&#xff0c;在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是&#xff0c;当操作者做出…...

浅拷贝与深拷贝面试问题及回答

1. 浅拷贝和深拷贝的区别是什么&#xff1f; 答&#xff1a; 浅拷贝&#xff08;Shallow Copy&#xff09;仅复制对象的引用而不复制引用的对象本身&#xff0c;因此原始对象和拷贝对象会引用同一个对象。而深拷贝&#xff08;Deep Copy&#xff09;则是对对象内部的所有元素进…...

推荐算法顶会论文合集

SIGIR SIGIR 2022 | 推荐系统相关论文分类整理&#xff1a;8.74 https://mp.weixin.qq.com/s/vH0qJ-jGHL7s5wSn7Oy_Nw SIGIR2021推荐系统论文集锦 https://mp.weixin.qq.com/s/N7V_9iqLmVI9_W65IQpOtg SIGIR2020推荐系统论文聚焦&#xff1a; https://mp.weixin.qq.com/s…...

组合模式(Composite)——结构型模式

组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如一个场景…...

利用大模型提升个性化推荐的异构知识融合方法

在推荐系统中&#xff0c;分析和挖掘用户行为是至关重要的&#xff0c;尤其是在美团外卖这样的平台上&#xff0c;用户行为表现出多样性&#xff0c;包括不同的行为主体&#xff08;如商家和产品&#xff09;、内容&#xff08;如曝光、点击和订单&#xff09;和场景&#xff0…...

Dockerfile 里 ENTRYPOINT 和 CMD 的区别

ENTRYPOINT 和 CMD 的区别&#xff1a; 在 Dockerfile 中同时设计 CMD 和 ENTRYPOINT 是为了提供更灵活的容器启动方式。ENTRYPOINT 定义了容器启动时要执行的命令&#xff0c;而 CMD 则提供了默认参数。通过结合使用这两个指令&#xff0c;可以在启动容器时灵活地指定额外的参…...

腾讯的EdgeONE是什么?

腾讯的EdgeONE是一项边缘计算解决方案&#xff0c;具有一系列优势&#xff1a; 边缘计算能力强大&#xff1a;EdgeONE利用腾讯云在全球范围内的分布式基础设施&#xff0c;提供强大的边缘计算能力&#xff0c;可以实现低延迟和高可用性的服务。 智能化和自动化&#xff1a;Edg…...

SVM直观理解

https://tangshusen.me/2018/10/27/SVM/ https://www.bilibili.com/video/BV16T4y1y7qj/?spm_id_from333.337.search-card.all.click&vd_source8272bd48fee17396a4a1746c256ab0ae SVM是什么? 先来看看维基百科上对SVM的定义: 支持向量机&#xff08;英语&#xff1a;su…...

Nessus 部署实验

一、下载安装https://www.tenable.com/downloads/nessus 安装好之后&#xff0c;Nessus会自动打开浏览器&#xff0c;进入到初始化选择安装界面&#xff0c;这里我们要选择 Managed Scanner 点击继续&#xff0c;下一步选择Tenable.sc 点击继续&#xff0c;设置用户名和密码 等…...

基于Springboot的水产养殖系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的水产养殖系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…...

Java性能优化(五)-多线程调优-Lock同步锁的优化

作者主页&#xff1a; &#x1f517;进朱者赤的博客 精选专栏&#xff1a;&#x1f517;经典算法 作者简介&#xff1a;阿里非典型程序员一枚 &#xff0c;记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; ❤️觉得文章还…...

WPF (Windows Presentation Foundation) 中 Attribute(属性)和 Property(属性)

在 WPF (Windows Presentation Foundation) 中&#xff0c;Attribute&#xff08;属性&#xff09;和 Property&#xff08;属性&#xff09;是两个相关但不同的概念。 Attribute&#xff08;属性&#xff09;是一种元数据&#xff0c;用于给类型、成员或其他代码元素添加附加…...

环形链表理解||QJ141.环形链表

在链表中&#xff0c;不光只有普通的单链表。之前写过的的一个约瑟夫环形链表是尾直接连向头的。这里的环形链表是从尾节点的next指针连向这链表的任意位置。 那么给定一个链表&#xff0c;判断这个链表是否带环。qj题141.环形链表就是一个这样的题目。 这里的思路是用快慢指…...

java本地锁与分布式锁-个人笔记 @by_TWJ

目录 1. 本地锁1.1. 悲观锁与乐观锁1.2. 公平锁与非公平锁1.3. CAS1.4. synchronized1.5. volatile 可见性1.6. ReentrantLock 可重入锁1.7. AQS1.8. ReentrantReadWriteLock 可重入读写锁 2. 分布式锁3. 额外的3.1. synchronized 的锁升级原理3.2. synchronized锁原理 1. 本地…...

【每日刷题】Day33

【每日刷题】Day33 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 2. 445. 两数相加 II - 力扣&#xff08;…...

vivado刷题笔记46

题目&#xff1a; Design a 1-12 counter with the following inputs and outputs: Reset Synchronous active-high reset that forces the counter to 1 Enable Set high for the counter to run Clk Positive edge-triggered clock input Q[3:0] The output of the counter c…...

网络基础——校验

网络基础——校验 网络通信的层次化模型&#xff08;如OSI七层模型或TCP/IP四层模型&#xff09;中&#xff0c;每一层都有其特定的校验机制来确保数据传输的正确性和完整性。 物理层 校验方式 不直接涉及校验和&#xff0c;但会采用信号编码技术&#xff08;如曼彻斯特编码…...

SparkSQL与Hive整合 、SparkSQL函数操作

SparkSQL与Hive整合 SparkSQL和Hive的整合&#xff0c;是一种比较常见的关联处理方式&#xff0c;SparkSQL加载Hive中的数据进行业务处理&#xff0c;同时将计算结果落地回Hive中。 整合需要注意的地方 1)需要引入hive的hive-site.xml&#xff0c;添加classpath目录下面即可…...

K8s: Helm搭建mysql集群(2)

搭建 mysql 集群 应用中心&#xff0c;mysql 文档参考https://artifacthub.io/packages/helm/bitnami/mysql 1 &#xff09;helm 搭建 mysql A. 无存储&#xff0c;重启数据丢失 添加源 $ helm repo add mysql-repo https://charts.bitnami.com/bitnami安装 $ helm install…...

matlab期末知识

1.期末考什么&#xff1f; 1.1 matlab操作界面 &#xff08;1&#xff09;matlab主界面 &#xff08;2&#xff09;命令行窗口 &#xff08;3&#xff09;当前文件夹窗口 &#xff08;4&#xff09;工作区窗口 &#xff08;5&#xff09;命令历史记录窗口 1.2 matlab搜索…...

多台服务器共享python虚拟环境和Linux安装python虚拟环境

文章目录 一、新增服务器环境搭建1. python3 环境搭建2.必要软件安装3. 目录挂载1 ./toolchain 挂载&#xff1a;2. /virtualenvs挂载&#xff1a; 4. 安装驱动和sdk 二、多台服务器共享python虚拟环境 一、新增服务器环境搭建 1. python3 环境搭建 16.04 系统默认 python3.5&…...

在Python中安装和使用pandas库

在Python中安装和使用pandas库是一个相对简单的过程。以下是具体的步骤&#xff1a; 安装pandas库 你可以使用Python的包管理器pip来安装pandas。打开你的命令行工具&#xff08;在Windows上可能是CMD或PowerShell&#xff0c;在macOS或Linux上可能是Terminal&#xff09;&am…...

零基础学习数据库SQL语句之查询表中数据的DQL语句

是用来查询数据库表的记录的语句 在SQL语句中占有90%以上 也是最为复杂的操作 最为繁琐的操作 DQL语句很重要很重要 初始化数据库和表 USE dduo;create table tb_emp(id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment…...

C++语法|bind1st和bind2nd的用法

文章目录 What什么是&#xff1f;How什么时候用&#xff1f;如何用&#xff1f;bind1st和bind2nd的底层实现原理my_find_if分析myBind1st分析 What什么是&#xff1f; bind1st 和bind2nd分别是一个用来绑定函数对象的第一个参数或第二个参数的适配器。它在 C98 和 C03 标准中很…...

Zabbix+Grafana-常见报错及异常处理方式记录

文章目录 Zabbix安装篇Zabbix Web页面连接数据库失败 Zabbix使用篇中文显示不全 Zabbix报警篇新建的用户&#xff0c;配置报警后&#xff0c;无法收到报警 Grafana安装篇Windows系统安装时&#xff0c;添加zabbix报错&#xff1a;An error occurred within the plugin Zabbix安…...

一键转换,MP4视频变为MP3音频,只需这一行代码!

想要将珍藏的视频配乐提取出来&#xff1f;想把喜欢的电影原声变成音频&#xff1f;现在&#xff0c;只需一行代码&#xff0c;就能轻松将MP4视频转换为MP3音频&#xff01; 这篇文章将带你一步步完成转换&#xff0c;并详细解释每一步的操作&#xff0c;即使你是新手也能轻松…...

Oracle12之后json解析包怎么调用

在 Oracle 12g 及之后的版本中&#xff0c;Oracle 提供了对 JSON 的原生支持&#xff0c;使得在数据库中存储、查询和解析 JSON 数据变得更为简单。你可以使用 Oracle 提供的 SQL 函数和操作符来处理 JSON 数据。 以下是一些常用的 Oracle SQL 函数和操作符&#xff0c;用于解…...

wordpress子比主题美化-为图文列表封面添加动态缩略图特效 多种效果演示

wordpress子比主题-为图文列表文章封面添加动态缩略图特效 给自己子比主题加一个列表文章封面添加动态缩略图 直接复制以下代码&#xff0c;添加到主题自定义CSS代码中即可&#xff0c;下图为效果演示 wordpress子比主题-为图文列表文章封面添加动态缩略图特效 给自己子比主题…...

spring boot3多模块项目工程搭建-上(团队开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 多模块结构优缺点 模块介绍 Common 模块&#xff1a; API 模块&#xff1a; Web 模块&#xff1a; Service 模块&#xff1a; DAO 模块&#xff1a; 搭建步骤 1.创建 父…...

人脸美型SDK解决方案,适用于各类应用场景

视频内容已经成为企业宣传、产品展示、互动直播等多个领域的核心载体。而在这些场景中&#xff0c;高质量的人脸美型效果不仅能够提升用户体验&#xff0c;更能为品牌加分。美摄科技凭借深厚的技术积累和行业洞察&#xff0c;推出了全新的人脸美型SDK解决方案&#xff0c;为企业…...

RS2103XH 功能和参数介绍及规格书

RS2103XH 是一款单刀双掷&#xff08;SPDT&#xff09;模拟开关芯片&#xff0c;主要用于各种模拟信号的切换和控制。下面是一些其主要的功能和参数介绍&#xff1a; 主要功能特点&#xff1a; 模拟信号切换&#xff1a;能够连接和断开模拟信号路径&#xff0c;提供灵活的信号路…...

nn.TransformerEncoderLayer详细解释,使用方法!!

nn.TransformerEncoderLayer nn.TransformerEncoderLayer 是 PyTorch 的 torch.nn 模块中提供的一个类&#xff0c;用于实现 Transformer 编码器的一个单独的层。Transformer 编码器层通常包括一个自注意力机制和一个前馈神经网络&#xff0c;中间可能还包含层归一化&#xff…...

巨控GRM561/562/563/564Q杀菌信息远程监控

摘要 通过程序编写、手机APP画面制作等运行系统&#xff0c;实现电脑及手机APP显示的历史曲线画面和数据图形化的实时性。 不仅流程效率提升90%以上&#xff0c;同时为杀菌生产提供有利的质量保障&#xff0c;还有效规避因触屏及内存卡的突发异常导致历史数据的丢失&#xff0…...

RT-DETR-20240507周更说明|更新Inner-IoU、Focal-IoU、Focaler-IoU等数十种IoU计算方式

RT-DETR改进专栏|包含主干、模块、注意力、损失函数等改进 专栏介绍 本专栏包含模块、卷积、检测头、损失等深度学习前沿改进,目前已有改进点70&#xff01;每周更新。 20240507更新说明&#xff1a; ⭐⭐ 更新CIoU、DIoU、MDPIoU、GIoU、EIoU、SIoU、ShapeIou、PowerfulIoU、…...

Web3:下一代互联网的科技进化

随着科技的不断演进&#xff0c;互联网已经成为了我们生活中不可或缺的一部分。而在Web3时代&#xff0c;我们将会见证互联网进化的下一个阶段。本文将探讨Web3作为下一代互联网的科技进化&#xff0c;以及它所带来的重要变革和影响。 传统互联网的局限性 传统互联网存在诸多…...

SQL注入-基础知识

目录 前言 一&#xff0c;SQL注入是什么 二&#xff0c;SQL注入产生的条件 三&#xff0c;学习环境介绍 四、SQL注入原理 五&#xff0c;SQL中常用的函数 六&#xff0c;关于Mysql数据库 前言 在网络安全领域中&#xff0c;sql注入是一个无法被忽视的关键点&#xff0c…...

npx 有什么作用跟意义?为什么要有 npx?什么场景使用?

npx 是 npm 从 v5.2.0 开始新增了 npx 命令&#xff0c;> 该版本会自动安装 npx&#xff0c;如果不能使用就手动安装一下&#xff1a; $ npm install -g npxnpx 的作用 npm 只能管理包的依赖&#xff0c;npx 则可以快捷的运用包中的命令行工具和其他可执行文件&#xff0c…...

Docker搭建LNMP+Wordpress

目录 一.项目模拟 1.项目环境 2.服务器环境 3.任务需求 &#xff08;1&#xff09;使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台 &#xff08;2&#xff09;限制 Nginx 容器最多使用 500MB 的内存和 1G 的 Swap &#xff08;3&#xff09;限制 Mysql 容器写 /d…...

PCIE相关总结

1、概述 "PCIE 槽位" 指的是主板上的 Peripheral Component Interconnect Express &#xff08;外围设备互联扩展&#xff09;槽位。它是用于连接扩展卡&#xff08;如显卡、网卡、声卡等&#xff09;到主板的接口。PCI Express 是一种高速串行扩展总线标准&#xff…...

OpenCV 入门(五) —— 人脸识别模型训练与 Windows 下的人脸识别

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…...

C++基础-编程练习题2

文章目录 前言一、查找“支撑数”二、数组元素的查找三、爬楼梯四、数字交换五、找高于平均分的人 前言 C基础-编程练习题和答案 一、查找“支撑数” 【试题描述】 在已知一组整数中&#xff0c; 有这样一种数非常怪&#xff0c; 它们不在第一个&#xff0c; 也不在最后一个&…...

Linux下GraspNet复现流程

Linux&#xff0c;Ubuntu中GraspNet复现流程 文章目录 Linux&#xff0c;Ubuntu中GraspNet复现流程1.安装cuda和cudnn2.安装pytorch3.编译graspnetAPIReference &#x1f680;非常重要的环境配置&#x1f680; ubuntu 20.04cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0…...

Linux——MySQL5.7编译安装、RPM安装、yum安装

文章目录 Linux——MySQL5.7编译安装、RPM安装、yum安装一、编译安装二、RPM安装三、yum安装 Linux——MySQL5.7编译安装、RPM安装、yum安装 卸载mysql # 查看是否安装了mysql [rootcsq ~]# rpm -qa |grep mysql mysql-community-server-5.7.36-1.el7.x86_64 mysql-community-c…...