1.简要复习c++输入输出,选择与循环的可能学的时候没讲的小点。
2.复习递归,结构体,字符。




1.从hello,world开始。

  1. #include<iostream>
  2. #include<cstdlib>
  3. using namespace std;
  4. int main(){
  5. cout<<"hello world!"<<endl;
  6. system("pause");
  7. return 0;
  8. }

2.什么是命名空间?

#include<iostream>
using namespace std;

namespace A{
  int  i=10;
}

namespace B{
    int  i=20;
    namespace C{//命名空间的定义可以嵌套
       int i=30;
    }
    int n=i+C::i;
}

int main(){
    cout<<A::i<<endl;   //或者using namespace A;
    cout<<B::i<<endl;
    cout<<B::n<<endl;
    return 0;
}

3.我们看看指针。

#include<iostream>
#include<cstdlib>
using namespace std;

int main()
{
    int a=10,*p;
    int &b=a;
    p=&a;
    string s="C++";
    string *ps=&s;
    cout<<p<<endl;  //输出结果是指针p的值,a变量的地址
    cout<<b<<endl;  //输出结果是b的值10
    cout<<*p<<endl; //输出结果是指针p指向的变量的值,即a的值10
    cout<<ps<<endl; //输出结果是指针ps的的值,s变量的地址
    cout<<*ps<<endl; //输出结果是指针ps指向的变量的值,即s的值”C++”

    cout<<"输入俩字节变量"<<endl;
    char c1,c2;
    cin>>c1>>c2;
    cout<<c1<<" "<<c2;
    cout<<"如果直接输出数字10的话cout会认成: ";
    cout<<10<<endl;
    cout<<"如果直接输出字符a的话cout会认成: ";
    cout<<'a'<<endl;
    system("pause");
    return 0;//返回0 
 }

我们不妨这样想像:不同的地址也就是我们学校不同的校区int a=10也就是定义了一个校区大门,校区门口三个大字:a校区(长清校区),里面有十栋楼,为了方便国家管理,我给这个小区门口所处的地址原来对应的经纬度记录下来,也就是一行十六进制的数字0x某某某某(长清区大学路多少多少号),也就是说现在,我需要进门看看有几栋楼,并且记住。看看这个故事能不能帮助理解。 我打开导航地图可以这样搜索:1.某某某大学长清校区(&a),它会弹出统一的地址长清区大学路多少多少号(0x某某某某),我可以导航去这。现在我到了,我手上有刷卡的门禁卡片(p),但我钥匙太多了,一样的门禁卡片紧挨着一大堆,为了防止我进门刷错卡片,我在卡片上贴了张纸,上面写的长清大学路多少多少号(0x某某某某)为了好记我还又附了个小字,就用这个学校的首字母缩写吧(指针变量p),我找到了对应的门禁卡,我现在要知道这个校区里面几栋楼,我刷卡进去查了查,10栋。我在门禁卡上画了个星号,表示这个校区我去过了,里面有10栋楼,也就是说以后我看到全地址长清大学路多少多少号或者首字母缩写(也就是变量a的地址&a和指针变量p都是0x某某某某)我就知道这里面是这个校区,别人问我这校区几栋楼时,我看到我画的标记就能想起这个校区有10栋楼(也就是a和*p对应的值都是10)。 这就是指针和指针变量,变量和地址的关系。 图片.png

图片.png
4.浮点数中常用的函数

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;

int main(){
    double d=sqrt(2.0);
    cout<<"精度设置:"<<endl;
    for(int i=0;i<5;i++){
        cout<<fixed;//设置fixed后的精度是指小数点后的位数 
        cout<<setprecision(i)<<d<<endl;//设置不同的精度
    }
    cout<<"当前精度为:"<<cout.precision()<<endl;
    cout<<"当前域宽:" <<cout.width()<<endl;
    cout<<left;
    cout<<setw(16)<<d<<setw(10)<<d<<setw(10)<<d<<endl; //默认是右对齐
    cout<<"当前填充字符:"<<endl;
    cout<<setfill('*')<<setw(10)<<d<<endl; //setfill()函数可以直接插入流中
    return 0;
}

5.if-else-switch(略)

6.for,while,do……while(略)

7.函数,主要说下传参函数和引参函数,也就是一个不改变实参值,一个改变实参值。
二者比较而言,由于传参函数存在入栈和清理的过程,所以效率略低于引参函数。但引参函数会改变实参的值,如果想不改变实参值的话,可以用const修饰,这个后面再说。

#include<iostream>
using namespace std;

void swap(int x,int y){//传值参数 
    int temp;
    temp=x;
    x=y;
    y=temp;
    cout<<"交换中"<<x<<"\t"<<y<<endl;
}

int main(){
    int a,b;
    cin>>a>>b;
    cout<<endl; 
    cout<<"交换前"<<a<<"\t"<<b<<endl;
    swap(a,b);
    cout<<"交换后"<<a<<"\t"<<b<<endl;
    return 0;
}
#include<iostream>
using namespace std;

void swap(int &x,int &y){//引用参数
    int temp;
    temp=x;
    x=y;
    y=temp;
    cout<<"交换中"<<x<<"\t"<<y<<endl;
}

int main(){
    int a,b;
    cin>>a>>b;
    cout<<endl; 
    cout<<"交换前"<<a<<"\t"<<b<<endl;
    swap(a,b);
    cout<<"交换后"<<a<<"\t"<<b<<endl;
    return 0;
}

这里涉及到了部分栈的知识,后面说,现在先知道&a,&b会改变实参即可。

8.递归
递归调用就是函数内部调用自身的过程,递归必须要有结束条件,否则会进入无限递归状态,永远无法结束。我们先看一个例子来体会下什么是递归,输入n个整数,倒序输出所有整数。

#include<iostream>
using namespace std;
int a[100];

void print(int i){
    cout<<a[i]<<endl;
    if(i>0)
        print(i-1);    
    //cout<<a[i]<<endl;
}

int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    print(n-1);
    return 0;
}

递归原理:
递归包括递推和回归,递推就是把原问题不断分化成子问题,直至结束,返回最近子问题的解,之后逆向逐一回归,最终到达递推开始时的原问题,返回原问题的解。
我们不妨用典型的阶乘来图解下:

#include<iostream>
using namespace std;

long long fac(int n){
    if(n==0||n==1)
        return 1;
    else
        return n*fac(n-1);
}

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

递归过程中,每次递推都需要一个栈空间来保存调用记录。所谓“栈”,是一种数据结构,在计算机内部,它类似一个容器,每次放进去一个,这样叠起来,同理,想取出的时候也只能从顶向下一个个取出,不允许从中间插入或抽取,因此被称为“后进先出”(也就是LIFO,全名last in first out)。
5次阶乘画图表示下(看视频)
显然,递归就是一步步把子问题压入栈,直至得到返回值,在一步步出栈,在运算过程中用了n个栈空间作为辅助空间。

9.结构体
注意typedef的用法,其他略。

10.数组
主要是new和delete的用法。其他略。

11.字符串,这里展示下常用的函数。

#include<iostream>
#include<cstring>//c-风格字符串 头文件 
#include<string>//c++风格字符串 头文件 
/*C-风格:    
strlen():长度 
strcpy():复制 
strcat():拼接 
strcmp():比较 
strchr():查找字符 
strrchr():右侧查找字符
strstr():查找字符串
strlwr():转换小写 
strupr():转换大写 
*/ 
//string类: .size, . length,=,+,==,!=,>=,<=,find 
using namespace std;

int main(){
    char s1[100];
    char s2[20]="Hello!";
    string str1,str2;
    cin>>s1;
    cout<<strlen(s1)<<endl;//求长度 
    strcat(s1,s2);//拼接
    strcat(s1,"abc");//拼接
    cout<<s1<<endl;
    cout<<strcmp(s1,s2)<<endl;//比较
    cout<<strstr(s1,s2)<<endl;//查找字符串,返回指针
    strcpy(s1,s2);//复制 
    cout<<s1<<endl;
    cout<<strchr(s1,'l')<<endl;//查找字符,返回指针
    cout<<strrchr(s1,'l')<<endl;//从右侧查找字符,返回指针
    cout<<strlwr(s1)<<endl;//转小写 
    cout<<strupr(s1)<<endl;//转大写

    cin>>str1>>str2;
    cout<<str1+str2<<endl;//拼接 
    cout<<str1.find(str2)<<endl;//查找,返回索引
    return 0;
}

12.以洛谷的高精度为例,简要介绍洛谷用法。
链接
13.作业及洛谷练习。
作业:
1.蛇形填数,可参考洛谷

P5731 【深基5.习6】蛇形方阵

2.洛谷题单一:

P5704 【深基2.例6】字母转换

P5706 【深基2.例8】再分肥宅水

P1421 小玉买文具

P5709 【深基2.习6】Apples Prologue / 苹果和虫子

P5707 【深基2.例12】上学迟到