【代码笔记】

这是一本包含c++云课堂所有知识点的手册,算法和问题用例题展示。

新手必看!新手必看!新手必看!(重要的事情说三遍)

目录

1级

第一课——cout

第二课——变量与cin

第三课——计算

第四课——if语句和bool

第五课——if语句嵌套

第六课——复合语句

第七课——for语句初识

第八课——累加器和累乘器

第九课——求最值

第十课——循环嵌套

第十一课——while语句

第十二课——数据分离

2级

第一课——一维数组

第二课——一维数组的最值

第三课——数组元素的插入、删除和移动

第四课——选择排序

第五课——sort排序

第六课——格式化输入输出和实型变量

第七课——模拟算法

第八课——周期问题

第九课——递推算法

第十课——简单的枚举

第十一课——下标计数

第十二课——求连续相同的一段数

3级

第一课——回文

第二课——约瑟夫问题

第三课——数组双指针移动和有序数组的合并

第四课——前缀和入门

第五课——前缀和应用

第六课——字符与字符数组

第八课——字符串函数1

4级

第四课——结构体

5级

6级

7级

第一至五课——组合数学(待更)

第六课——STL之动态数组

第七课——STL之映射

第九课——STL之栈

第十课——STL之队列


1级

第一课——cout

/*
C01.L01.程序的基本结构、cout语句
杨彦彬
2024.9.23日作业
(2024.9.23做)
*/
//调用头文件
#include<bits/stdc++.h>
//使用标准名字空间
using namespace std;
//代码主体
int main(){
    //输出数字
    cout<<25;cout<<endl;
    //输出算式
    cout<<45+23;cout<<endl;
    //输出字符或字符串
    cout<<'S';cout<<endl;
    cout<<"zifuchuan";cout<<endl;
    //输出换行
    cout<<endl;
    //输出连续输出项
    cout<<32<<"1a2b3c"<<' '<<12+21;
    //分号标示了一个语句的结束,C++的每一个语句都必须以分号结尾。
    
    //返回值
    return 0;
}

第二课——变量与cin

/*
C01.L02.整型变量、赋值语句、cin 语句
杨彦彬
2024.9.24日作业
(1014.9.23做)
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
    //定义变量
    int n; //声明一个变量,名字叫做n,n是一个整型变量
    //直接赋值
    n=10;
    /* 可以在声明得时候赋值:int n=10*/
    //间接赋值
    int m;
    m=n;
    //自我赋值
    n=n*1;
    n=n-1;
    n=n*10;
    //++、--
    int x=10,y=10;
    x++;//x++ = x=x+1;
    y--;//y++ = y=y+1;
    //cin输入
    int a,b;
    cin>>a>>b;
    
    cout<<n<<endl;
    cout<<m<<endl;
    cout<<x<<endl;
    cout<<y<<endl;
    cout<<a<<endl;
    cout<<b<<endl;
    
    return 0;
}

第三课——计算

/*
C01.L03.整除及求余、数字的提取、顺序结构程序
杨彦彬
2024.9.25日作业
(2024.9.23做)
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
    //整除
    cout<<10/2<<" ";
    cout<<10/3<<endl;
    //取模(a除以b的余数)
    cout<<10%2<<" ";
    cout<<10%3<<endl<<"———"<<endl;
    //提取数字
    //例:提取1243的百位数和91754的千位数
    cout<<1243/100%10<<" ";
    cout<<91754/1000%10<<endl;
    /*
    按照解决问题的顺序写出相应的语句,
    执行时按自上而下的顺序依次执行,
    这就是顺序结构,
    是最常用的一种程序结构。
    */
    return 0;
}
 

第四课——if语句和bool

/*
C01.L04.if语句、布尔类型、关系表达式
杨彦彬
2024.9.26日作业
(2024.9.23做)
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
    //定义布尔类型变量
    bool f;//布尔类型变量的值有且仅有两种可能:true/false
    /*
    关系表达式:
    10>6   值为真
    7%3==1 值为假
    逻辑表达式:
    1==3&&2>1 值为假
    1==3||2>1 值为真  
    1!=2      值为真
    */
    //if语句
    if(1==3||2>1)
    {
        cout<<"1==3||2>1值为真"<<endl;
    }//单分支
    
    if(1==3&&2>1)
    {
        cout<<"1==3&&2>1值为真"<<endl;
    }
    else
    {
        cout<<"1==3&&2>1值为假"<<endl;
    }//双分支
    return 0;
}
 

第五课——if语句嵌套

/*
C01.L05.if语句及其嵌套
杨彦彬
2024.9.27日作业
(2024.9.23做)
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
    /*
    if 语句的嵌套是指在 if ... else ... 分支中还存在 if ... else ... 语句,
    一般用来解决三种及以上的分支情况。
    */
    int a;
    cin>>a;
    if(a>=60)
    {
        if(a>=70)
        {
            if(a>=80)
            {
                if(a>=90)
                {
                    cout<<"A+";
                }
                else
                {
                    cout<<"A";
                }
            }
            else
            {
                cout<<"A-";
            }
        }
        else
        {
            cout<<"B+";
        }
    }
    else
    {
        cout<<"B";
    }
    return 0;
}

第六课——复合语句

/*
C01.L06.复合语句、数值交换、三个数的最值与排序
杨彦彬
2024.9.__日作业
(2024.9.23做)
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,a=0,b=0,c=0;
	cin>>n;
	if(n<0) 
		a=a+2;
		b=b+2;
		c=c+2;
	cout<<a<<" "<<b<<" "<<c<<endl;
	
	a=0,b=0,c=0;
	if(n<0) 
	{
		a=a+2;
		b=b+2;
	    c=c+2;
	}
	cout<<a<<" "<<b<<" "<<c<<endl;
	/*
	以上两个部分的结果是不一样的,
	因为一个加了花括号({}),
	代表当条件表达式通过时,
	花括号内的程序同时执行。
	当 if 和 else 后面有多个要操作的语句时,
	要用花括号 {} 括起来,
	将几个语句括起来的语句组合称为复合语句。
	*/
	//数值交换
	a=4,b=6;
	int t=a;a=b,b=t;
	cout<<a<<" "<<b<<endl;
	//错误示范:a=b,b=a;
	//输出三个数中的最大值
	a=6,b=4,c=7;
	cout<<"a,b,c中的最大值是:";
	if(a>b)
	{
	    if(a>c) cout<<a<<" ";
	    else cout<<c<<" ";
	}
	else
	{
	    if(b>c) cout<<b<<" ";
	    else cout<<c<<" ";
	}
    return 0;
}

第七课——for语句初识

/*
C01.L07.for语句初识
杨彦彬
2024.9.25做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int main(){
  	//for语句 
    for(int i=1;i<=10;i++)
    {
    	cout<<"1";
	}
	cout<<endl;
	//递减型
	for(int i=10;i>=1;i--)
	{
		cout<<"2";
	} 
	cout<<endl;
	//初始值与终值非int类型的for语句
	for(double i=0.5;i<=5.0;i+=0.5) 
	{
		cout<<"3";
	}
    return 0;
}

第八课——累加器和累乘器

/*
C01.L08.累加器、累乘器
杨彦彬
2024.9.25做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int s=0;//定义累加器s
int c=1;//定义累乘器c
int main(){
    //通过累加器求a+(a+1)+···+(b-1)+b的和
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=b;i++)
    {
        s+=i;//累加
    }
    cout<<s<<endl;
    //通过累乘器求x*(x+1)*···*(y-1)*y;
    int x,y;
    cin>>x>>y;
    for(int i=x;i<=y;i++)
    {
        c*=i;
    }
    cout<<c<<endl;
    return 0;
}

第九课——求最值

/*
C01.L09.求最值
通过循环求最值
杨彦彬
2024.9.25做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int maxn=0;
int minn=10001;
int main(){
    //求10个1~10000之间的数中的最大值
    for(int i=1;i<=10;i++)
    {
        int t;
        cin>>t;
        if(t>maxn) maxn=t;
    }
    cout<<"这10个数中的最大值是:"<<maxn<<endl;
    //求10个1~10000之间的数中的最小值
    for(int i=1;i<=10;i++)
    {
        
        int t;
        cin>>t;
        if(t<minn) minn=t;
    }
    cout<<"这10个数中的最小值是:"<<minn<<endl;
    return 0;
}

第十课——循环嵌套

/*
C01.L10.双重循环、多重循环程序设计
杨彦彬
2024.9.25做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int main(){
    //双重循环
    for(int i=1;i<=5;i++)
    {
        for(int j=1;j<=10;j++)
        {
            cout<<"# ";
        }
        cout<<endl<<endl;
    }
    //三重循环
    for(int i=1;i<=4;i++)
    {
        for(int j=1;j<=3;j++)
        {
            for(int k=1;k<=2;k++)
            {
                cout<<i<<" "<<j<<" "<<k<<"\n";
            }
        }
    }
    return 0;
}

第十一课——while语句

/*
C01.L11.while循环
杨彦彬
2024.9.25做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int main(){
    //while循环
    int a;
    cin>>a;
    while(a!=0)//当a不等于0时继续执行
    {
        cout<<a%10<<" ";
        a=a/2;
    }
    cout<<endl;
    //do-while语句
    do
    {
        cout<<a;
    }while(a!=0);
    //之所以会输出一个0,是因为do_while语句实现执行后判断。
    //所以会先执行一遍输出a,再判断a!=0是否为真。
    /*
    while和for的区别:
    1.while的循环次数是不定的;for的循环次数是一定的。
    2.while可以搭配do来写;for不可以。
    */
    return 0;
}

第十二课——数据分离

/*
C01.L12.数据分离
杨彦彬
2024.9.25做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int main(){
    //输出n的每一位数字
    int n;
    cin>>n;
    while(n!=0)
    {
        cout<<n%10<<" ";
        n=n/10;
    }//输出是倒序的
    cout<<endl;
    //反转数字
    cin>>n;
    int k=0;
    while(n!=0)
    {
        k=k*10+n%10;
        n=n/10;
    }
    cout<<k;
    return 0;
}

2级

第一课——一维数组

/*
C02.L01.一维数组初步认识
杨彦彬
2024.9.25做 
*/ 
#include<bits/stdc++.h>
using namespace std;
//定义一维数组
int a[10];//定义有10个元素的一维数组a
int main(){
    //输入
    cin>>a[0];
    for(int i=1;i<=5;i++)
    {
        cin>>a[i];
    }
    cout<<endl;
    //输出
    cout<<a[0]<<" ";
    for(int i=1;i<=5;i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<endl;
    //赋值
    a[0]=10;
    for(int i=1;i<=5;i++)
    {
        a[i]=6-i;
    }
    cout<<a[0]<<" ";
    for(int i=1;i<=5;i++)cout<<a[i]<<" ";
    cout<<endl;
    /*
    注意:数组下标从0开始,
    所以一个由10个元素组成的数组,
    对应的下标是0~9。
    */
    return 0;
}

第二课——一维数组的最值


/*
C02.L02.一维数组最值问题
杨彦彬
2024.9.27做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
    for(int i=1;i<=5;i++)
    {
        cin>>a[i];
    }
    //输出最大值
    int maxx=-1;
    for(int i=1;i<=5;i++)
    {
        if(a[i]>maxx) maxx=a[i];
    }
    cout<<"a数组的最大值是:"<<maxx<<endl;
    //输出最大值的位置
    int maxn=-1,pos=0;
    for(int i=1;i<=5;i++)
    {
        if(a[i]>maxn) maxn=a[i],pos=i;
    }
    cout<<"a数组的最大值在第 "<<pos<<" 个"<<endl;
    return 0;
}

第三课——数组元素的插入、删除和移动


/*
C02.L03.数组元素的移动、插入、删除
杨彦彬
2024.9.27做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
    int n=5;
    for(int i=1;i<=n;i++) cin>>a[i];
    //将a[k]移到末尾
    int k;
    cin>>k;
    int t=a[k];
    for(int i=k;i<n;i++)
    {
        a[i]=a[i+1];
    }
    a[n]=t;
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
    //在a[k]到a[k-1]之间插入x;
    int x;
    cin>>k>>x;
    n++;
    for(int i=n;i>=k+1;i--)
    {
        a[i]=a[i-1];
    }
    a[k]=x;
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
    //删除a[k];
    cin>>k;
    for(int i=k;i<n;i++)
    {
        a[i]=a[i+1];
    }
    n--;
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
    return 0;
}

第四课——选择排序


/*
C02.L04.选择排序
杨彦彬
2024.9.27做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
    int n=5;
    for(int i=1;i<=n;i++) cin>>a[i];
    //选择排序(从小到大)
    for(int i=1;i<n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(a[i]>a[j]) swap(a[i],a[j]);
        }
    }
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
    return 0;
}

第五课——sort排序

 
/*
C02.L05.sort函数
杨彦彬
2024.9.30做 
*/ 
bool cmp(int x,int y)
{
    return x>y;
}
#include<bits/stdc++.h>
using namespace std;
int a[11];
int main(){
    for(int i=1;i<=10;i++)cin>>a[i];
    //sort:sort(start,end,排序方法);
    //此时是从小到大排序,不需要最后一项
    sort(a+1,a+11);
    for(int i=1;i<=10;i++)cout<<a[i]<<" ";
    cout<<endl;
    //从大到小排序
    sort(a+1,a+11,cmp);
    for(int i=1;i<=10;i++)cout<<a[i]<<" ";
    /*
    排序方法(从大到小排):
    bool cmp(int x,int y)
    {
        return x>y;
    }
    */
    return 0;
}

第六课——格式化输入输出和实型变量

 
/*
 C02.L06.实型变量与格式化输入输出
杨彦彬
2024.9.30做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int a;
int main(){
    //格式化输入:scanf(格式控制符,地址列表);
    scanf("%d",&a);
    //格式化输出:printf(格式控制符,输出列表);
    printf("%d\n",a);
    /*
    “%d”叫做格式控制符,
    格式控制符代表了输入或输出的“格式说明”,%d表示输入的数据是整数。
    scanf和printf的使用方法是一样的,
    只不过前者比后者在变量前多了个“&”号,这些变量跟前面的格式控制符是一一顺序对应的。
    一些常用格式控制符说明见下表:
    格式控制符	说明
    %d	        整型(-2147483648 ~2147483647)
    %lld	    长整型(-9223372036854775808 ~ 9223372036854775807)
    %f	        单精度浮点数
    %lf	        双精度浮点数
    %c	        单字符
    
    在格式控制符后+“\n”:换行
    在格式控制符后+“ ”:空格
    */
    //定义实型变量
    double d;
    float f;
    //输入实型变量
    cin>>d>>f;
    //输出
    cout<<d<<" "<<f;
    return 0;
}

第七课——模拟算法

 
/*
C02.L07.模拟算法
杨彦彬
2024.9.30做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
所谓模拟法,就是用计算机模拟某个过程,通过改变数学模型的各种参数,
进而观察变更这些参数所引起的过程状态的变化,然后从中得出解答。

模拟题的算法一般都不太复杂,关键是所有条件都不能遗漏并要把条件分析清楚。

解答模拟题通常的步骤是:
(1)认真仔细的读懂题目。模拟题的描述通常都比较详细,篇幅一般都比较长,
 应该边阅读边将有关的条件一条条地记录下来,阅读完成后要反复核对,绝对不能有错漏。
(2)建立各个条件之间的关系,最好用一些简明的表格列出。
(3)认真分析这些关系,并建立这些关系的数学模型。
(4)规划各个模块的结构,用相应的语言、逐步求精的方法描述具体的算法。
(5)编写程序,调试并运行。
(6)检查题目给出的样例能否通过。
竞赛题目中一般都会给出输入输出样例,以便检查程序的输入输出格式是否正确,但这些样例往往会比竞赛时评判所用的测试数据简单,所以你不能满足于通过这些样例,还要尽量自拟一些更复杂、更全面的测试数据来检查程序的正确性。经过反复的调试、检查,才算完成该题。
 */  
    /*例题:
    零花钱
    题目描述
    小明每天都可以从妈妈那里领到零花钱,第 1 天可以领到 1 块钱,第2天可以领到 2 块钱......,第 i 天可以领到 i 块钱,如果小明领到零花钱后,手上的零花钱是 3 的倍数时,小明就会将他手上所有零花钱的三分之一存在妈妈那里(假设小明的零花钱从来不花!)。
    第 K 天的时候小明手上有多少零花钱呢?
    输入格式
    一个整数 K ,K <= 100
    输出格式
    一个整数,小明手上的零花钱。
    */
    int k=0,s=0;
    cin>>k;
	for(int i=1;i<=k;i++)
	{
		s=s+i;  //第 i 天的零花钱为i元
		if(s%3==0) s=s/3*2;  //如果手上的零花钱s为3的倍数,存三分之一在妈妈那,自己留三分之二。
	}
	cout<<s;
    return 0;
}

第八课——周期问题

 
/*
C02.L08.周期问题
杨彦彬
2024.9.30做 
*/ 
#include<bits/stdc++.h>
using namespace std;
int main(){
    /*
    题目描述
    有一列数,按 5、6、2、4、5、6、2、4、... 排列,第 n 个是几?前 n 个数的和是多少 ?( n <= 10000 )
    
    输入格式
    一个整数 n ,表示要找的数的位置。( n <= 10000 )
    
    输出格式
    2个数
    第一个数表示第 n 个数的值
    第二个数表示前 n 个数的和
    */
    int x[4] = {4,5,6,2};
    int s[4] = {0,5,11,13};
    int n;
    cin>>n;
    int a = n/4;  //计算有多少个完整的周期
    int b = n%4;  //最后不够一个完整周期的数字有多少个
	cout<< x[b] <<endl;
	cout<<a*17 + s[b];
    return 0;
}

第九课——递推算法

 
/*
C02.L09.简单递推
杨彦彬
2024.9.30做 
*/ 
int a[50],k;
#include<bits/stdc++.h>
using namespace std;
int main(){
    /*
    “递推”是计算机解题的一种常用法。
    利用“递推法”解题首先要分析归纳出“递推关系”。
    如经典的斐波那契数列问题,用 f(i) 表示第 i 项的值,
    则 f(1) = 0 ,f(2) = 1,在 n>2 时,存在递推关系:f(n) = f(n-1) + f(n-2) 。
    在递推问题模型中,每个数据项都与它前面的若干个数据项(或后⾯的若⼲个数据项)存在⼀定的关联,
    这种关联一般是通过一个“递推关系式”来描述的。
    求解问题时,需要从初始的⼀个或若⼲数据项出发,通过递推关系式逐步推进,从而推导计算出最终结果。这种求解问题的⽅法叫“递推法”。其中,初始的若⼲数据项称为“递推边界”。
    1.1 解决递推问题有三个重点:
     1.建立正确的递推关系式;
     2.分析递推关系式的性质;
     3.根据递推关系式编程求解。
    1.2 顺推和倒推递推法分为 “顺推” 和 “倒推” 两类模型:
     1.顺推,就是从问题的边界条件(初始状态)出发,通过递推关系式依次从前往后递推出问题的解;
     2.倒推,就是在不知道问题的边界条件(初始状态)下,从问题的最终解(目标状态或某个中间状态)出发,反过来推导问题的初始状态。
    */
    //例题:斐波那契数列
    /*
    题目描述
    斐波那契数列是指这样的数列:第一个数和第二个数都是 1 ,接下来每个数都等于前面 2 个数的和。
    输入一个正整数 k ,输出斐波那契数列第 k 个数。
    
    输入格式
    一个整数 k ( 1 <= k <= 46 )
    
    输出格式
    一个整数,表示斐波那契数列第 k 个数的大小。
    */
    //int a[50],k;
    cin>>k;
    a[1]=1,a[2]=1;
    for(int i=3;i<=k;i++)
    {
        a[i]=a[i-1]+a[i-2];
    }
    cout<<a[k];
    return 0;
}

第十课——简单的枚举

 
/*
C02.L10.简单的枚举
杨彦彬
2024.9.30做 
*/ 
int a[50],k;
#include<bits/stdc++.h>
using namespace std;
int main(){
    /*
    枚举是一种简单得算法,其实就是试一个数。
    例题:
    题目描述
    鸡兔同笼问题:一个笼子里面有鸡若干只,兔若干只。共有头 n 个,共有腿 m 条。求鸡兔各多少只?
    */
    int n,m,f=0;
    cin>>n>>m;
    for(int i=0;i<=n;i++)//枚举鸡的只数
    {
        if(i*2+(n-i)*4==m)
        {
            cout<<"鸡有"<<i<<"只,";
            cout<<"兔有"<<n-i<<"只\n";
            f=1;
        }
    }
    if(f==0) cout<<"无解";
    return 0;
}

第十一课——下标计数

 
/*
C02.L11.简单的下标计数
杨彦彬
2024.10.10做 
*/ 
int a[10005];
#include<bits/stdc++.h>
using namespace std;
int main(){
    /*
    下标计数是一种用于计量多种数据各有多少个的算法。
    例题:
    选票
    奥林匹克运动是人类社会的一个罕见的杰作,它将体育运动的多种功能发挥得淋漓尽致,影响力远远超出了体育的范畴,在当代世界的政治、经济、哲学、文化、艺术和新闻媒介等诸多方面产生了一系列不容忽视的影响。奥林匹克运动有一句著名的格言:“更快、更高、更强(Citius, Altius, Fortius)”。迄今为止已经奥运会(夏季)已经举办了32届了,在以往的这些盛会中,出现了众多耀眼的体育明星,有人说喜欢菲尔普斯、有人说喜欢博尔特,也有人说喜欢苏炳添...
    现在给每个运动员都编上号,然后大家给自己最喜欢的运动员投票,最后通过将得票最多的推选为最受欢迎的奥运之星。因为全球人数太多了,候选人也非常多,通过人力来统计非常麻烦,请你编写程序帮助将奥运之星统计出来,你能做到吗?
    奥运之星选举中,参加投票人数 N ,N <= 100000,参与选举的运动员人数 10000 。
    输入格式
    第一行只有一个数:N,参加投票的人数。
    第二行有 N 个正整数,相邻数用空格隔开,表示这 N 个人的投票情况。
    输出格式
    得票最多的那个数字,如果有相同得票的,则输出数值较小的那个数。
    */
    int n,maxn=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int t;
        cin>>t;
        if(t>=maxn) maxn=t;
        a[t]++;
    }
    int maxx=-1,ans=0;
    for(int i=0;i<=maxn;i++)
    {
        if(a[i]>maxx) maxx=a[i],ans=i;
    }
    cout<<ans;
    return 0;
}

第十二课——求连续相同的一段数

 
/*
C02.L12.求连续相同的一段数
杨彦彬
2024.10.10做 
*/ 
int a[10005];
#include<bits/stdc++.h>
using namespace std;
int main(){
    /*
    求连续相同的一段数,要用到一个计数器变量cnt
    例题:
    题目描述
    FJ 的农场举行了异一场 USA 奶牛奥林匹克竞赛。N ( 1 <= N <= 100,000 ; N 是一个奇数 ) 只奶牛都已经获得了一个整数分数 S ( 0 <= S <= 10,000 )。
    FJ 必须统计这些分数以便指导他们。帮帮他吧~~给出一个列表,计算最小值、最大值、中间数、众数。中间值是一个值 M ,至少一半的数 <= M ,至少一半的数 >= M 。众数是指出现次数最多的一个数。FJ 知道分数里面只有一个众数。
    输入格式
    第 1 行:一个整数 N 。
    第 2 ~ N+1 行:每一行有一个整数,是一只奶牛的分数。
    输出格式
    四个用空格隔开的整数:最小值、最大值、中间数、众数。
    */
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    int maxx=-1,minn=1000001,cnt=1,cm=0,ans=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]>=maxx) maxx=a[i];
        if(a[i]<=minn) minn=a[i];
        if(i>1) 
        {
            if(a[i]==a[i-1])
            {
                cnt++;
            }
            else
            {
                if(cnt>=cm) cm=cnt,ans=a[i];
                cnt=1;
            }
        }
    }
    cout<<minn<<" "<<maxx<<" ";
    if(n%2==1) cout<<a[n/2+1]<<" ";
    else cout<<(a[n/2]+a[n/2+1])/2<<" ";
    cout<<ans<<" ";
    return 0;
}

3级

第一课——回文

/*
C03.L01.回文
杨彦彬
2014.10.15做
*/
#include<bits/stdc++.h>
using namespace std;
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void hws()
{
    t("判断回文数");
    int n;
    cin>>n;
    int k=0,a=n;
    while(a)
    {
        k=k*10+a%10;
        a=a/10;
    }
    cout<<n;
    if(k!=n) cout<<"不";
    cout<<"是回文数。\n";
}
void hwc()
{
    t("判断回文字符串");
    string s,sames;
    cin>>s;
    for(int l=0,r=s.size()-1;l<=r;l++,r--)
    {
        sames[r]=s[l],sames[l]=s[r];
    }
    bool flag=1;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]!=sames[i]) flag=0;
    }
    cout<<s;
    if(flag==0) cout<<"不";
    cout<<"是回文字符串\n";
}
void hwl()
{
    t("判断回文数列");
    int n;
    cin>>n;
    int a[n+1];
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    bool flag=1;
    for(int l=1,r=n;l<=r;l++,r--)
    {
        if(a[l]!=a[r]) flag=0;
    }
    for(int i=1;i<=n;i++)
    {
        cout<<a[i]<<" ";
    }
    if(flag==0) cout<<"不";
    cout<<"是回文数列";
}
int main(){
    hws();
    hwc();
    hwl();
    return 0;
}

第二课——约瑟夫问题

/*
C03.L08.字符串函数(一)
杨彦彬
2014.10.29做
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
    /*
    背景故事
    据说著名犹太历史学家 Josephus 有过以下的故事:
    在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞中,
    39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式:
    41 个人排成一个圆圈,由第 1 个人开始报数,每报数到第3人该人就必须自杀,
    然后再由下一个重新报数,直到所有人都自杀身亡为止。
    然而 Josephus 和他的朋友并不想遵从。
    首先从一个人开始,越过k-2个人(因为第一个人已经被越过),
    并杀掉第 k 个人。接着,再越过 k-1 个人,并杀掉第 k 个人。
    这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,
    这个人就可以继续活着。
    问题是,给定了和,一开始要站在什么地方才能避免被处决。
    Josephus要他的朋友先假装遵从,他将朋友与自己安排在第 16 个与第 31 个位置,
    于是逃过了这场死亡游戏。
    17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:
    15 个教徒和 15 个非教徒在深海上遇险,
    必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:
    30 个人围成一圆圈,从第一个人开始依次报数,
    每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
    问怎样排法,才能使每次投入大海的都是非教徒。
    
    问题分析与算法设计
    约瑟夫问题并不难,求解的方法很多;题目的变化形式也很多。这里给出一种实现方法。
    题目中 30 个人围成一圈,因而启发我们用一个循环的链来表示,可以使用结构数组来构成一个循环链。结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为0表示还在船上。从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为1,表示该人已被扔下海了。这样循环计数直到有15个人被扔下海为止。
    约瑟夫问题是个有名的问题:N 个人围成一圈,从第一个开始报数,第 M 个将被杀掉,最后剩下一个,其余人都将被杀掉。例如 N=6,M=5,被杀掉的顺序是:5,4,6,2,3。

    分析
    由于对于每个人只有死和活两种状态,因此可以用布尔型数组标记每个人的状态,可用true(或者1)表示死,false(或者0)表示活。
    开始时每个人都是活的,所以数组初值全部赋为false。
    模拟杀人过程,直到所有人都被杀死为止。
    */
    //参考代码:
    bool a[101]={0};
    int n,m,i,f=0,t=0,s=0;
    cin>>n>>m;
    do  // do ... while 这种循环至少执行一次循环体,如果while后面的判断失败则退出循环 
	{
        t++;//逐个枚举圈中的所有位置
        if(t>n) t=1;//数组模拟环状,最后一个与第一个相连
        if(!a[t]) s++;//第t个位置上有人则报数
        if(s==m)//当前报的数是m
        {
            s=0;//计数器清零
            cout<<t<<' ';//输出被杀人编号
            a[t]=1;//此处人已死,设置为空
            f++;//死亡人数+1
        }

    }while(f!=n);//直到所有人都被杀死为止
    //上述代码仅仅适合于 n 和 m 都比较小的情况,属于入门级的模拟算法。
    return 0;
}

第三课——数组双指针移动和有序数组的合并

​
/*
C03.L03.数组双指针移动和有序数组的合并
杨彦彬
2024.12.25做
^_^浅浅的庆祝一下圣诞节^_^
*/
#include <bits/stdc++.h>
using namespace std;
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void h()
{
    cout<<"\n";
}
void a()
{
    t("数组双指针移动");
    cout<<"请输入数组元素个数和每个元素:\n";
    int n,a[105];
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1,j=n;i<=j;i++,j--)
    {
        swap(a[i],a[j]);
    }
    cout<<"翻转后的数组:";
    for(int i=1;i<=n;i++)
    {
        cout<<a[i]<<" ";
    }
    h();
}
void b()
{
    t("有序数组的合并");
    int n,m,a[105]={},b[105]={},c[205]={};
    int i,j,k,l;
    cout<<"请输入两个数组的元素个数和各个元素:\n";
    scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d",&b[i]);
    }
	k=1;
	for(i=1,j=1;i<=n&&j<=m;k++) 
	{ 
		if(a[i]<=b[j])
		{
			c[k]=a[i++];
		}
		else
		{
			c[k]=b[j++];
		}
	}
	if(n>m)
	{
		for(l=i;l<=n;l++,k++)
			c[k] = a[l];
	}
	else
	{
		for(l=j;l<=m;l++,k++)
			c[k] = b[l];
	}

	for(i=1;i<k;i++)
	{
		printf("%d ",c[i]); 
    }
}
int main()
{
    a();
    b();
    return 0;
}

​

第四课——前缀和入门

/*
C03.L04.前缀和入门
杨彦彬
2024.12.25做
^_^浅浅的庆祝一下圣诞节^_^
*/
#include <bits/stdc++.h>
using namespace std;
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void a()
{
    t("前缀和模版题");
    /*
    题目描述
    输入一个长度为n的整数序列。
    接下来再输入 m 个询问,每个询问输入一对 l , r 。
    对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。
    输入格式
    第 1 行包含两个整数 n 和 m 。
    第 2 行包含 n 个整数,表示整数数列。
    接下来 m 行,每行包含两个整数 l 和 r ,表示一个询问的区间范围。
    数据范围
    1 ≤ l ≤ r ≤ n
    1 ≤ n , m ≤ 100000
    −1000 ≤ 数列中元素的值 ≤ 1000
    输出格式
    共 m 行,每行输出一个询问的结果。
    样例
    输入数据 1
    5 3
    2 1 3 6 4
    1 2
    1 3
    2 4
    输出数据 1
    3
    6
    10
    */
    int n,m,x,l,r,s[100005],i=0;
    cin>>n>>m;
    while(n--)
    {
        cin>>x;
        i++;
        s[i]=s[i-1]+x;
    }
    while(m--)
    {
        cin>>l>>r;
        cout<<s[r]-s[l-1]<<endl;
    }
}
int main()
{
    a();
    return 0;
}

第五课——前缀和应用

/*
C03.L05.前缀和的应用
杨彦彬
2024.12.25做
^_^浅浅的庆祝一下圣诞节^_^
*/
#include <bits/stdc++.h>
using namespace std;
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void a()
{
    t("前缀和应用题");
    /*
    题目描述
    给出一个长度为 n ( n <= 10^4) 的序列,求连续子段的最大值。
    比如说 2 3 -4 5 的最大子段和是 6 。
    而 2 3 -6 7 的最大子段和为 7 。
    输入格式
    第 1 行一个数 n,范围 [1,1000];
    第 2 行 n 整数,范围 [-10000,10000];
    输出格式
    一个整数,最大和。
    样例
    输入数据 1
    7
    5 4 3 -15 -12 11 2
    输出数据 1
    13
    */
    int n,x,s[10005],i=0,maxx=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        s[i]=s[i-1]+x;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j++)
        {
            maxx=max(maxx,s[j]-s[i-1]);
        }
    }
    cout<<maxx;
}
int main()
{
    a();
    return 0;
}

第六课——字符与字符数组

/*
C03.L06.字符类型定义、读入、输出、应用
杨彦彬
2014.10.8做
*/
#include<bits/stdc++.h>
using namespace std;
//定义
const char c1='x';//定义字符常量c1 *常量不可改变
char  c2,c3;//定义字符变量c2、c3
char  c[105];//定义有105个变量的字符数组c
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void shuru()
{
    t("输入");
    cin>>c2;
    c3=getchar();//若在输入c2后立刻按回车,那么c3将会是换行。
    cin.getline(c,10);
}
void shuchu()
{
    t("输出");
    cout<<"c1="<<c1<<endl;
    cout<<"c2="<<c2<<endl;
    cout<<"c3="<<c3<<endl;
    cout<<"c="<<c<<endl;
}
void fuzhi()
{
    t("赋值");
    char a='d',b='a'+3,c=100;
    cout<<"a="<<a<<","<<"b="<<b<<","<<"c="<<c<<endl;
    /*
    char letter[5]={'a','e','i','o','u'}; //用字符常量逐个初始化
    letter[0]='x'; //用赋值语句逐个元素赋值:
    scanf("%s",letter); //用 scanf 读入整个数组
    scanf("%c",&letter[0]); //用 scanf 逐个元素读入:
    cin >> letter; //用 cin 输入整个数组
    cin >> letter[0]; //用 cin 逐个元素输入:
    gets(letter); //用 gets 读入整个数组
    letter[0]=getchar(); //用 getchar 逐个读入
    
    cout << letter; //用 cout 输出整个数组:
    cout << letter[0]; //用 cout 逐个元素输出:
    printf("%s",letter);//用 printf 输出整个数组
    printf("%c",letter[0]); //用 printf 逐个元素输出
    puts(letter); //用 puts 输出整个数组
    putchar(letter[0]);//用 putchar 逐个元素输出
    */
}
void shuchuchangdu()
{
    char tt[10];
    cin>>tt;
    cout<<strlen(tt);
}
int main(){
    t("先定义");
    shuru();
    shuchu();
    fuzhi();
    shuchuchangdu();
    return 0;
}

第七课——字符串入门

/*
C03.L07.字符串入门
杨彦彬
2014.12.27做
^_^今天是学校五周年校庆^_^
*/
#include<bits/stdc++.h>
using namespace std;
string s,b;
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void input()
{
    t("输入");
    cin>>s;//用cin输入
    getchar();
    getline(cin,b);//用getline函数读取整行(包括空格)
}
void output()
{
    t("输出");
    cout<<s<<endl;//直接输出
    cout<<s[1];
    printf("\n%c\n",s[2]);//scanf只可以输出单个数组元素
}
int main(){
    input();
    output();
    return 0;
}

第八课——字符串函数1

/*
C03.L08.字符串函数(一)
杨彦彬
2014.10.29做
*/
#include<bits/stdc++.h>
using namespace std;
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void g()
{
    cout<<"————————————————————"<<endl;
}
void zj()
{
    t("增加或连接");
    string s1,s2,s3="";
    s1="abcd";  //s2 后面增加 s1
    s2+=s1;
    cout<<s2<<endl;
    s1+=s2;
    cout<<s1<<endl;
    g();
    s1="abcd";
    s2="xyz";
    s3=s2+"1234";  //连接后给 s1
    cout<<s3<<endl;
    cout<<s1+"*"+s2<<endl;
}
void cz()
{
    t("查找子串");
    string a,b;
    int k;
    cin>>a>>b;
    cout<<"从"<<a<<"中查找子串"<<b<<endl;
    if(a.find(b)==-1) cout<<"没有找到\n";
    cout<<"开始下标是:"<<a.find(b)<<endl;
    g();
    cin>>a>>b>>k;
    cout<<"从"<<a<<"的第"<<k<<"个开始查找子串"<<b<<endl;
    if(a.find(b,k)==-1) cout<<"没有找到\n";
    else cout<<"开始下标是:"<<a.find(b,k)<<endl;
}
void qzc()
{
    t("取子串");
    string s;
    int i,l;
    cin>>s>>i>>l;
    cout<<"在字符串"<<s<<"中取从下标为"<<i<<"的位置开始,长度为"<<l<<"的子串\n";
    cout<<s.substr(i,l)<<endl;
}
int main(){
    zj();
    cz();
    qzc();
    return 0;
}

第九课——getline、erase、insert函数

/*
C03.L09.getline、erase、insert()函数
杨彦彬
2014.12.27做
^_^今天是学校五周年校庆^_^
*/
#include<bits/stdc++.h>
using namespace std;
string s,b;
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void a1()
{
    t("getline函数");
    string str;
	getline(cin,str);
	cout<<str<<endl;
	cout<<"请指定结束符:";
	char a;
	cin>>a;
	getline(cin,str,a);
	cout<<str<<endl;
}
void a2()
{
    t("erase函数");
    string str;
    int a,b;
    cin>>str;
    cout<<"请输入开始位置和删除长度:";
    cin>>a>>b;
	str.erase(a,b);//删除从a开始的b个字符(包括位置a)
	cout<<str<<endl;
}
void a3()
{
    t("insert函数");
    string str;
    cin>>str;
    int a;
    string b;
    cout<<"请输入插入位置和要插入的字符串:";
    cin>>a>>b;
	str.insert(a,b);//在字符串的第a个位置插入b,原字符串的第i位置开始往后挪腾出位置给b。
	cout<<str<<endl;
}
int main(){
    a1();
    a2();
    a3();
    return 0;
}

4级

第四课——结构体

/*
C04.L10.结构体
杨彦彬
2024.10.10做
*/
//结构体
//2024.9.19 杨彦彬
#include<bits/stdc++.h>
using namespace std;
//定义结构体
struct stu //struct 结构体名
{
    int a;
    char b;
    string s;
    //成员1类型 成员名1;
    //······
}str,st[4]; //结构体变量
//注意分号
/*
struct 结构体名{
	成员表
	成员函数
};
结构体名  结构体变量表;  注:同样可以同时定义多个结构体变量
*/
bool cmp(stu x,stu y)
{
    return x.a>y.a;
}
int main(){
    /* 结构体 */
    //赋值
    str.a=10,st[0].a=30,st[1].a=10,st[2].a=19,st[3].a=15;
    str.b='s',st[0].b='f',st[1].b='d',st[2].b='c',st[3].b='a';
    str.s="Hello!",st[0].s="max&min",st[1].s="1423",st[2].s="1a2b3c",st[3].s="abc123";
    //输出(调用)
    cout<<"str.a的值是"<<str.a<<"\nstr.b的值是"<<str.b<<"\nstr.s的值是"<<str.s<<endl;
    //结构体排序——选择排序(按a从小到大排序)
    int n=3;
    cout<<"————————————————"<<endl;
    for(int i=0;i<=n;i++)
    {
        cout<<st[i].a<<" "<<st[i].b<<" "<<st[i].s<<endl;
    }
    cout<<endl;
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(st[i].a>st[j].a) swap(st[i],st[j]);
        }
    }
    for(int i=0;i<=n;i++)
    {
        cout<<st[i].a<<" "<<st[i].b<<" "<<st[i].s<<endl;
    }
    cout<<"————————————————"<<endl;
    //结构体排序——sort排序(按a从大到小排序)
    for(int i=0;i<=n;i++)
    {
        cout<<st[i].a<<" "<<st[i].b<<" "<<st[i].s<<endl;
    }
    cout<<endl;
    sort(st,st+n+1,cmp);
    /*
    cmp函数:
    bool cmp(stu x,stu y)
    {
        return x.a>y.a;//前者与后者须保持的条件
        //如果符合条件,不用交换;否则,需要交换。
    }
    */
    for(int i=0;i<=n;i++)
    {
        cout<<st[i].a<<" "<<st[i].b<<" "<<st[i].s<<endl;
    }
    cout<<"————————————————"<<endl;
    return 0;
}

5级

6级

7级

第一至五课——组合数学(待更)

/*
C07.L01~C07.L05;
杨彦彬
2024.10.14做
*/
#include <bits/stdc++.h>
using namespace std;
void t(string ss)
{
    cout<<"——"<<ss<<"——"<<endl;
}
void a1()
{
    t("C07.L01.组合数学之鸽巢原理");
    int ans;
    cout<<"例题1、证明从 { 0,1,2,3...9,10 } 中任意取 7 个元素,则其中必有 2 个元素和等于 10。\n\n";
    cout<<"    这题要利用鸽巢原理。\n"<<"    首先,我们要先知道能组成10的有以下5组数:\n"<<"0,10 / 1,9 / 2,8 / 3,7 / 4,6\n";
    cout<<"    11个数中选7个数,则要拿走4个数,那么这4个数必然是四组两个数的组合中的其中一个数。\n";
    cout<<"    那么取走后,有四组会被拆散,5-4=1(组),最后还剩一组可以组成10。\n\n";
    return;
}
void a2()
{
    t("C07.L02.组合数学之加法与乘法原理");
    cout<<"    1 加法原理\n若具有性质 A 的事件有 m 个,具有性质 B 的事件有 n 个,则具有性质 A 或性质 B 的事件有 m + n 个。\n";
    cout<<"例子:例子:从广州到上海可以做飞机,也可以做高铁。广州到上海的航班一共有 10 个,高铁有 7 趟列车。则坐飞机或者高铁从广州到上海有 10 + 7 个可供选择的方案。\n";
    cout<<"    2 乘法原理\n若具有性质 A 的事件有 m 个,具有性质 B 的事件有 n 个,则具有性质A及性质B的事件有 m * n 个。\n";
    cout<<"例子:从广州到北京有 20 个交通方案,从北京到纽约有 3 个交通方案,则从广州先到北京再到纽约的方案一共有 20 * 3 = 60 个。\n";
    cout<<"    3 减法原理\n若具有性质 A 的事件有 m 个,且具有性质A的数必须具有性质 B 和性质 C \n,";
    cout<<"那么若具有性质 C 的事件有 n 个,则符合性质 B 的事件有 m-n 个。\n";
    cout<<"例子: 从广州到上海要么是做飞机,要么是坐火车,只有这两种方法可以选择。则从广州坐火车到上海的方案 = 从广州到上海的交通方案 排除 从广州坐飞机到上海的方案。\n";
    cout<<"    4 除法原理\n(作者不会)\n";
}
int main()
{
    a1();
    a2();
    return 0;
}

第六课——STL之动态数组

/*
C07.L06.STL之动态数组
杨彦彬
2024.10.14做
*/
#include <bits/stdc++.h>
#include <vector>
using namespace std;
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void dy()
{
    t("定义");
    vector<int> v;
    cout<<"vector<数据类型> 向量名;\n";
}
void srsc()
{
    t("输入&输出");
    vector<int> v;
    int x,y,z;
    cin>>x>>y>>z;
    v.push_back(x);
    v.push_back(y);
    v.push_back(z);
    cout<<"v[1]="<<v[1]<<" \n";
}
void cd()
{
    t("输出长度&清空&判空");
    vector<int> v;
    v.push_back(4);v.push_back(3);
    v.push_back(8);v.push_back(5);v.push_back(7);
    cout<<"v的长度是:"<<v.size()<<endl;
    cout<<"v现在是否为空:"<<v.empty()<<endl;
    v.clear();
    cout<<"v现在是否为空:"<<v.empty()<<endl;
}
void sc()
{
    t("删除");
    vector<int> v;
    v.push_back(5);
    cout<<"v现在是否为空:"<<v.empty()<<endl;
    v.pop_back();
    cout<<"v现在是否为空:"<<v.empty()<<endl;
}
/*
a.insert(t1,2)//在数组下标为t1的位置插入一个元素2,其他元素向后移一位
a.erase(t1)//删除第t1个位置的元素,其他元素向前移动一位
a.erase(t1,t2+1)//删除t1~t2区间内的元素,其余元素向前移动
reverse(t1,t2+1)//反转t1~t2区间内的元素
sort(t1,t2+1)//对数组元素从小到大排序
*/
void fw()
{
    t("访问整个数组");
    vector<int> v;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int t;
        cin>>t;
        v.push_back(t);
    }
    vector<int>::iterator it;
    cout<<"v数组:";
    for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
    cout<<"\n";
}
void jh()
{
    t("交换两个数组");
    vector<int> a,b;
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int t;
        cin>>t;
        a.push_back(t);
    }
    for(int i=1;i<=m;i++)
    {
        int t;
        cin>>t;
        b.push_back(t);
    }
    vector<int>::iterator it1,it2;
    cout<<"a数组:";
    for(it1=a.begin();it1!=a.end();it1++) cout<<*it1<<" ";
    cout<<"\n";
    cout<<"b数组:";
    for(it2=b.begin();it2!=b.end();it2++) cout<<*it2<<" ";
    cout<<"\n";
    a.swap(b);
    cout<<"调转后a数组:";
    for(it1=a.begin();it1!=a.end();it1++) cout<<*it1<<" ";
    cout<<"\n";
    cout<<"调转后b数组:";
    for(it2=b.begin();it2!=b.end();it2++) cout<<*it2<<" ";
    cout<<"\n";
}
void cz()
{
    t("插入&删除&排序");
    vector<int> v;
    for(int i=1;i<=5;i++) v.push_back(i);
    cout<<"插入前数组:";
    vector<int>::iterator it;
    for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
    cout<<"\n";
    cout<<"输入n,k:";
    int n,k;
    cin>>n>>k;
    vector<int>::iterator t=v.begin()+n-1;//要将n以迭代器的方式储存
    v.insert(t,k);
    cout<<"在下标为n的位置插入k后的数组:";
    for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
    cout<<"\n";
    cout<<"删除前数组:";
    for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
    cout<<"\n";
    int p;
    cout<<"输入p:";
    cin>>p;
    vector<int>::iterator t1=v.begin()+p-1;//要将p以迭代器的方式储存
    v.erase(t1);
    cout<<"删除第p个位置的元素后的数组:";
    for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
    cout<<"\n";
}
void fz()
{
    t("翻转&排序");
    vector<int> v;
    for(int i=1;i<=5;i++) {int t;cin>>t;v.push_back(t);}
    int n,m;
    cin>>n>>m;
    vector<int>::iterator a=v.begin()+n-1,b=v.begin()+m-1;
    cout<<"翻转前数组:";
    vector<int>::iterator it;
    for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
    cout<<"\n";
    reverse(a,b+1);
    cout<<"将数组第n个到第k个翻转后的数组:";
    for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
    cout<<"\n";
    sort(v.begin(),v.end()-1);
    cout<<"排序后的数组:";
    for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
    cout<<"\n";
}
int main()
{
    dy();
    srsc();
    cd();
    sc();
    fw();
    jh();
    cz();
    fz();
    return 0;
}

第七课——STL之映射

/*
C07.L07.STL之映射
杨彦彬
2024.10.10做
*/

//映射map
#include <bits/stdc++.h>
using namespace std;
map<string,int> mp;
//定义映射:map<键值类型,映射值类型> 映射名;
int main()
{
    //赋值
    mp["abc"]=2;
    mp["asd"]=3,mp["152"]=23;mp["1s2"]=34;
    //输出
    cout<<mp["abc"];
    //迭代器遍历
    map<string,int>::iterator it;//声明 迭代器
    for(it=mp.begin();it!=mp.end();it++)//输出整个map
    {
        //->first : 键值 
        //->second : 映射值
        cout<<it->first<<" "<<it->second<<endl;
    }
    //输出元素个数
    cout<<"mp的元素个数:"<<mp.size()<<endl;
    //清空map
    mp.clear();
    //判空
    if(mp.empty()) cout<<"mp是空的"<<endl;
    else cout<<"mp不是空的"<<endl;
    return 0;
}

第九课——STL之栈

/*
C07.L09.STL之栈
杨彦彬
2014.10.10做
*/
#include<bits/stdc++.h>
using namespace std;
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void dy()
{
    t("定义");
    stack<int> st;
    cout<<"格式: stack < 数据类型 > 栈名"<<endl;
}
void crz()
{
    t("入栈&出栈");
    stack<int> s;
    int a,b,c;
    cin>>a>>b>>c;
    s.push(a);
    s.push(b);
    s.push(c);
    cout<<"将栈顶元素"<<s.top()<<"出栈"<<endl;
    s.pop();
    cout<<"出栈后栈顶元素:"<<s.top()<<endl;
}
void pk()
{
    t("判空");
    stack<int> s;
    s.push(3);
    cout<<"是否为空:"<<s.empty()<<endl;
    s.pop();
    cout<<"是否为空:"<<s.empty()<<endl;
}
void lenth()
{
    t("输出长度");
    stack<int> s;
    for(int i=1;i<=5;i++)
    {
        s.push(i);
    }
    cout<<"s此时的元素个数:"<<s.size()<<endl;
}
void bl()
{
    t("遍历");
    stack <int>s;
    for(int i=1;i<=5;i++)
    {
        int t;
        cin>>t;
        s.push(t);
    }
    while(!s.empty())
    {
        cout<<s.top()<<" ";
        s.pop();
    }
}
int main(){
    dy();
    crz();//需要输入3个元素
    pk();
    lenth();
    bl();//需要输入5个元素
    return 0;
}

第十课——STL之队列

/*
C07.L10.STL之队列
2014.10.10做
*/
#include<bits/stdc++.h>
using namespace std;
void t(string ss)
{
    cout<<"——————————"<<ss<<"——————————"<<endl;
}
void dy()
{
    t("定义");
    queue<int> q;
    cout<<"格式: queue < 数据类型 > 队列名"<<endl;
}
void crz()
{
    t("入队&出队");
    queue<int> q;
    int a,b,c;
    cin>>a>>b>>c;
    q.push(a);
    q.push(b);
    q.push(c);
    cout<<"将队头元素 "<<q.front()<<" 出队"<<endl;
    q.pop();
    cout<<"出队后队尾元素:"<<q.front()<<endl;
}
void pk()
{
    t("判空");
    queue<int> q;
    q.push(3);
    cout<<"是否为空:"<<q.empty()<<endl;
    q.pop();
    cout<<"是否为空:"<<q.empty()<<endl;
}
void lenth()
{
    t("输出长度");
    queue<int> q;
    for(int i=1;i<=5;i++)
    {
        q.push(i);
    }
    cout<<"q此时的元素个数:"<<q.size()<<endl;
}
void bl()
{
    t("遍历");
    queue<int> q;
    for(int i=1;i<=5;i++)
    {
        int t;
        cin>>t;
        q.push(t);
    }
    while(!q.empty())
    {
        cout<<q.front()<<" ";
        q.pop();
    }
}
int main(){
    cout<<"*";cout<<"以下的是单向队列";cout<<"*\n";
    dy();
    crz();//需要输入3个元素
    pk();
    lenth();
    bl();//需要输入5个元素
    cout<<endl;
    cout<<"*以下的是双向队列*";
    //未写完
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值