1.简要复习c++输入输出,选择与循环的可能学的时候没讲的小点。
2.复习递归,结构体,字符。
1.从hello,world开始。
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
cout<<"hello world!"<<endl;
system("pause");
return 0;
}
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)。 这就是指针和指针变量,变量和地址的关系。
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.蛇形填数,可参考洛谷