Cherish's Notebook
切换到深色模式
菜单
Wiki--浏览次数--访问次数--跳出率--平均停留

c++

1.基础入门

1.1注释

//或者/* */

1.2命名

  1. 字母数字下划线
  2. 开头必须是字母或_
  3. 不能使用关键词

1.3数据类型

1.3.1整形

short 短整形 2

int 整形 4

long 长整形 win4 linux32位4 linux64位8

long long 长长整形 8

利用sizeof可以求数据类型占用的内存空间大小

CODE
sizeof(int)
sizeof(num)

1.3.2浮点型

float 单精度 4节 7位有效数字

double 双精度 8节 15-16有效数字

默认情况下,输出一个小数,会显示6位有效数字

注意点:

CODE
float f1=3.14f; //要写上f,编辑器默认是双精度,鼠标放上去也是双精度,用float的变量去接受这个数字时会多做一步从双精度到单精度的转换,写上f就直接是单精度
float f2=3e2; //科学记数法

1.3.3字符型

CODE
char ch='a'

注意点:

  1. 在显示字符型变量时,只能单引号,双引号x
  2. 单引号内只能一个字符,不能字符串
  3. c和c++字符型变量只占用一个字符
  4. 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元

ASCII码大致由以下两部分组成:

  1. ASCII非打印控制字符:ASCII表上的数字0-31分配给了控制字符,用于控制像打印机等一些外围设备
  2. ASCII打印字符:数字32-126分配给了能在键盘上找到的字符,当查看或打印文档时就会出现(65A;97a)

ASCII码表格:

ASCII控制字符ASCII字符ASCII字符ASCII字符
0NUT32(space)64@96
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92/124|
29GS61=93]125}
30RS62>94^126`
31US63?95_127DEL

ASCII 码大致由以下两部分组成:

  • ASCII 非打印控制字符: ASCII 表上的数字 0-31 分配给了控制字符,用于控制像打印机等一些外围设备。
  • ASCII 打印字符:数字 32-126 分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。

1.3.4转义字符

CODE
//换行符
cout <<"hello world/n"; //就等同于如下:
cout <<"hello world"<<endl;
//反斜杠
cout <<"//"<<endl;
//水平制表符
cout <<"aaaa\thelloworld"<<endl; //输出窗口时有对齐效果

1.3.5字符串型

char 变量名="字符串值"

CODE
//c风格字符串
//注意事项:
//1.char字符串名[]
//2.等号后面要用双引号,包含起来字符串
char str[]="hello world";
cout <<str<<endl;
//c++风格字符串
//需要先引用一个头文件 #include<string>
string str2="hello world";
cout <<str2<<endl;

1.3.6布尔类型bool

CODE
bool flag=true;
cout<<sizeof(flag)<<endl; //查看布尔占内存空间

1.4键盘输入cin

CODE
int a=0;
cout<<"请给整型变量a赋值"<<a<<endl;
cin >> a;
cout << "整型变量a=" <<a<<endl;

1.5运算符

1.5.1算术运算符

注意:

  1. 两个整数相除,结果依然是整数,小数部分被去除掉了
  2. 两个小数不可以做取模运算
  3. 前置递增++a;后置递增a++,两者区别:前置递增先让变量+1,再进行表达式计算;后置递增是先让表达式运算,再让变量+1

1.5.2赋值运算符

1.5.3比较运算符

1.5.4逻辑运算符

1.6程序流程结构

1.6.1选择结构

  1. if语句 单行、多行、多条件if语句
CODE
//单行格式if语句:if (条件){条件满足执行的语句}
if(score>600)
{
    cout<<'这是单行if语句'<<endl;
}
//多行格式if语句:if (条件){条件满足执行的语句}else{条件不满足执行的语句}
cin >> score
if(score<=600)
{
    cout>>"小于等于600"<<endl;
}
else
{
    cout>>"大于600">>endl;
}
//多条件格式if语句:if (条件){条件1满足执行的语句}else if{条件2满足执行的语句}····else{条件不满足执行的语句}
if (0<num<100)
{
    cout<<"小于100"<<endl;
}
else if (nmu>=100&&num<200)
{
    cout<<"不小于100且小于200"<<endl; //可以无限else if,python中是elif:
}
else
{
    cout<<"不小于200"<<endl;
}
// 嵌套if语句(if套if,注意条件即可)
  1. 三目运算符
CODE
//创建三个变量a,b,c
//将a和b做比较,将变量大的值赋值给变量c
int a=20,b=10,c=0;
c=(a>b?a:b)
cout<<"c="<<c<<endl;
//在c++中三目运算符返回的是变量,可以继续赋值
(a>b?a:b)=100;
cout<<a<<endl; //100  a是大于b的,将100赋值给了a
cout<<b<<endl; //10   a>b,b还是原值
  1. switch语句 执行多条件分支语句 注意:python没有switch语句 switch(表达式) { case 结果1:执行语句;break; case 结果2:执行语句;break; case 结果3:执行语句;break; ··· default:执行语句;break; } 不写break就会一直往下执行
CODE
//案例-电影打分
#include<iostream>
using namespace std;
int main()
{
    int score=0;
    cout<<"电影打分:"<<endl;
    cin>>score;
    switch(score)
    {
        case 10:cout<<"经典"<<endl;break;
        case 9:cout<<"经典"<<endl;break;
        case 8:cout<<"非常好"<<endl;break;
        case 7:cout<<"非常好"<<endl;break;
        case 6:cout<<"一般"<<endl;break;
        case 5:cout<<"一般"<<endl;break;
        default:cout<<"烂片"<<endl;break;
    }
}

if和switch区别:

  • switch缺点:判断时候只能是整行或者字符型,不可以是一个区间
  • switch优点:结构清晰,执行效率高

1.6.2循环结构

  1. while循环结构 满足循环条件,执行循环语句 语法:while(循环条件){循环语句}
CODE
//打印0-9数字
int main()
{
    int num=0;
    while(num<10)
    {
       std::cout<<num<<std::endl;
        num++;
    }
    system("pause")
}

注意:写好循环条件,避免死循环情况

CODE
//循环结构-猜数字
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
    //添加随机数种子,利用当前系统时间生成随机数,防止每次随机数相同
    srand((unsigned int)time(NULL));

    //1.系统生成随机数
    //rand()%100 //生成0-99的随机数
    int num=rand()%100+1; //这是个伪随机数,每次都不同,要想每次不同就添加随机数种子
    //cout<<"系统生成了一个1-100之间的随机数,请你来猜:"<<endl;
    //2.玩家猜测
    int val=0;
    while (1)
    {
        cin>>val;
        //3.判断玩家猜测
        if(val<num) 
        {
            cout<<"猜小了!"<<endl;
        }
        else if (val>num)
        {
            cout<<"猜大了!"<<endl;
        }
        else
        {
            cout<<"猜对了!"<<endl;
            break;
        }
        //猜对 退出游戏
        //猜错 提示猜的结果 过大或者过小 重新返回第二步
    }
}
  1. do...while循环结构 语法: do{循环语句}while(循环条件); 与while的区别在于do...while会先执行一次循环语句,在判断循环语句
CODE
//在屏幕中输出0-9这10个数字
int main()
{
    int num=0;
    do 
    {
        std::cout<<num<<std::endl;
        num++
    }
    while(num<10);
    system("pause");
}

案例-水仙花数

描述:水仙花数是指一个3位数,它的每个位上的数字的3次幂之和等于它本身

例如:1^3+5^3+3^3=153

请用do...while语句,求出所有3位数的水仙花数

CODE
#include <iostream>
using namespace std;
int main()
{
    //1.先打印所有三位数字
    int num=100;
    do 
    {
        //2.从所有三位数字中找到水仙花数
        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);
}
  1. for循环语句 语法:for(起始表达式;条件表达式;末尾循环体){循环语句;}
CODE
//从数字0-9打印
for(int i=0;i<10;i++)
{
    cout<<i<<endl;
}
//上式可以进行拆分
int i=0
for(;;;)
{
    if(i>=10)
    {
        break;
    }
    cout<<i<<endl;
    i++;
}

小练习

CODE
#include<iostream>
using namespace std;
int main()
{
    //敲桌子案例
    //1.先输出1-100的数字
    for(int i=1; i<=100; i++)
    {
        //2.从100个数字中找到特殊数字,打印敲桌子
        //如果是7的倍数、个为有7、或者十位有7,打印敲桌子
        if(i%7==0 || i%10==7 || i/10==7)
        {
            cout<<"敲桌子"<<endl;
        }
        else
        {
            cout<<i<<endl;
        }
    }
}

嵌套实现星图

CODE
#include<iostream>
using namespace std;
int main()
{
    for (int i=0;i<10;i++)
    {
        for (int j=0;j<10;j++)
        {
            cout<<"*";
        }
        cout<<endl;
    }
}

乘法口诀表

CODE
#include <iostream>
using namespace std;
int main()
{
    for(int i=1;i<10;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cout<<j<<"*"<<i<<"="<<i*j<<'\t';
        }
        cout<<endl;
    }
}

1.6.3跳出语句

  1. break语句 作用:用于跳出选择结构或者循环结构

break使用时机:

  • 出现在switch条件语句中,作用是终止case并跳出switch
  • 出现在循环结构中,作用是跳出当前的循环结构
  • 出现在嵌套循环中,跳出最近的内层循环语句
  1. continue语句 作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
  2. goto语句 语法:goto 标记;

解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置(类似于html中的a标签)

CODE
int main()
{
    cout<<"1"<<endl;
    goto FLAG;
    cout<<"2"<<endl;
    cout<<"3"<<endl;
    cout<<"4"<<endl;
    FLAG:
    cout<<"5"<<endl;//跳过了2,3,4,直接到5
}

1.7数组

1.7.1一维数组

  1. 一维数组定义方式
方式注意事项
数据类型 数组名数组长度;这种方式是先定义再arri赋值
数据类型 数组名数组长度={值1,值2....};如果在初始化数据时,没有全部填写完,会用0来填补剩余数据
数据类型 数组名={值1,值2....};int arr;这是不正确的,按照这样的方式定义必须有初始长度
  1. 一维数组数组名 用途:
  • 1.可以统计整个数组在内存中的长度:
CODE
sizeof(arr);
sizeof(arr[0]);
  • 2.可以获取数组在内存中的首地址:
CODE
//查看16进制的首地址
cout<<arr<<endl;
//看10进制数
cout<<(int)&arr[0]<<endl;

数组名是常量,不可以进行赋值操作 3. 小案例

  • 1️⃣五只小猪称体重
CODE
#include<iostream>
using namespace std;
int main()
{
    int arr[5]={300,350,200,400,250};
    int tmp=0;
    for (int i=0;i<5;i++)
    {
        if(tmp<arr[i])
        {
            tmp=arr[i];
        }
    }
    cout<<tmp<<endl;
    return 0;
}
  • 2️⃣数组元素逆置
CODE
//元素逆置
#include<iostream>
using namespace std;
int main()
{
   int arr[5]={1,2,3,4,5};
   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--;
   }
   //输出逆置后的数组
   for (int i=0;i<5;i++)
   {
    cout<<arr[i]<<" ";
   }
   system("pause");
   return 0;
}
  • 3️⃣冒泡排序 对数组元素进行排序,做法: 比较相邻的元素,如果第一个比第二个大,就交换他们;对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值;重复以上的步骤,每次比较次数-1,直到不需要比较
CODE
//冒泡排序,升序
#include<iostream>
using namespace std;
int main()
{
    int arr[9] = {4,2,8,0,5,7,1,3,9};
    cout<<"排序前:"<<endl;
    for (int i=0;i<9;i++)
    {
        cout<<arr[i]<<" ";
    }
    //开始冒泡排序
    //总共排序轮数为 元素个数-1
    for (int i=0;i<9-1;i++)
    {
        //内层循环对比 次数=元素个数-1-当前轮数
        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;
            }
        }
    }
    cout<<"排序后:"<<endl;
    for (int i=0;i<9;i++)
    {
        cout<<arr[i]<<" ";
    }
    return 0;
}

1.7.2二维数组

  1. 二维数组的四种定义方式
序号方式
1数据类型 数组名[行数]列数;
2数据类型 数组名[行数]列数={ {数据1,数据2},{数据3,数据4}... }
3数据类型 数组名[行数]列数={数据1,数据2,数据3...}
4数据类型 数组名[]列数={数据1,数据2,数据3...}
注意:不能只省略列数
  1. 二维数组数组名
  • 1.查看二维数组所占内存空间
  • 2.获取二维数组首地址

已知二维数组,求二维数组的行数与列数

CODE
int main()
{
    int arr[2][3]=
    {
        {1,2,3},
        {4,5,6}
    };
    cout<<"二维数组的行数"<<sizeof(arr)/sizeof(arr[0])<<endl;
    cout<<"二维数组的列数"<<sizeof(arr[0])/sizeof(arr[0][0])<<endl;
}

查看二维数组首地址

CODE
cout<<"二维数组首地址:"<<arr<<endl;
cout<<"二维数组第一行的首地址:"<<(int)arr[0]<<endl;
cout<<"二维数组第二行的首地址:"<<(int)arr[1]<<endl;
cout<<"二维数组第一个元素的首地址:"<<(int)&arr[0][0]<<endl;//对于数,要加取址符