字符数组

char s[100] //声明一个字符类型的字符数组(字符数组需要\0结束,所以只能存放99的字符)
cin>> s;//读取不包含空白字符的字符数组,从s[0]开始储存
cin>> s+1;//读取不包含空白字符的字符数组,从s[1]开始储存
cin.getline(s,N) ;//读取可以包含空白字符的字符数组,从s[0]开始储存

int n=strlen(s);//计算从s[0]开始的有效字符的长度

字符数组的遍历
for(int i=0;i<strlen(s);i++)
{
    //对s[i]进行操作
}

strcpy(s1,s2) //将s2的内容拷贝到s1
strcat(s1,s2) //将s2的内容添加到s1
strcmp(s1,s2)
如果s1的字典序>s2的字典序则返回整数
如果s1的字典序=s2的字典序则返回0
如果s1的字典序<s2的字典序则返回负数

cout<<s;//输出字符数组s的所有有效字符

常见的ascii规则
1.数字比字母小。 如'7'<'F'
2.数字0小于数字9,且按照0到9一次递增。如'0'<'2'且'0'+2==2
3.字母A(a)比字母Z(z)小,且按照顺序递增
4.大写字母的ascii码小i与小写字母的ascii码。'A'<'a'
常见的ascii: 'A'为65;'a'为97;'0'是48,空格是32
标准的ascii为0~127

字符串

可以看成字符数组的集合
string s;//声明一个字符串
cin>>s;//获取不包含空白字符的字符串
getline(cin,s) ;//获取可以包含空白字符的字符串
string s=string(3,'c'); //s是一个包含3个'c'的字符串

int n=s.size() //得到字符串s的长度
字符串中每个字符的遍历
for(int i=0;i<s.size();i++)
{
    //对每个字符串中的每个字符进行操作
}
s1.find(s2)//在s1中查找s2出现的位置,如果找不到返回无符号整数的最大值(转成int以后等于-1)
s1.insert(pos,s2) //在pos的前面插入s2
s1.substr(pos,n) //返回从pos开始的长度为n的一段
s1.erase(pos,n) //删除从pos开始的长度为n的一段


s=s1+s2;//将s2拼接到s1,然后赋值给s
sort(s.being(),s.end()) //将字符串中的每个字符按照字典序从小到大排序
reverse(s.begin(),s.end()) //翻转整个字符串
int k=stoi(s); //将一个字符串转成数字存到k之中

函数

基础格式
返回值 函数名(参数列表)
{
	函数体
}

返回值类型 一般为 void(空),bool,int,double,string

声明
int add(int a,int b,int c)
{
	int s=a+b+c;
	return s;
}

可以使用 add(x,y,z) 调用add函数,最后返回x+y+z的和

一般的函数调用是不会影响主函数的值的

当需要通过调用函数改变调用函数的多个值时,可以使用传递引用的方式

void chang(int  &x,int &y)
{
	int t=x;
	x=y;
	y=t;
}

//递归一般格式
int f(int x)
{
	if(x)//满足终止条件
	{
		//返回结果
	}
	(x..) //更改条件继续往下执行
}

排序

插入排序(找到第一个小于等于它的元素插入到后面)
for(int i=2;i<=n;i++) 
{
	int j=i-1; //比较元素的位置 
	int t=a[i]; //当前元素 
	while(j>=1&&a[j]>t) //继续往前移动 
	{
		a[j+1]=a[j];
		j--;	
	}	
	a[j+1]=t; //找到了合适的位置 
} 

选择排序(每次选择一个最小的元素放在当前位置)
for(int i=1;i<=n;i++)
{
	int t=i;
	for(int j=i+1;j<=n;j++) //枚举i以后的所有位置 
	{
		if(a[j]<a[t])
		{
			t=j;
		}
	}	
	swap(a[t],a[i]);
} 

计数排序(依次统计每个数出现的次数,然后依次放到新数组之中)
for(int i=1;i<=n;i++)
{
	int x;
	cin>>x;
	cnt[x]++;//统计x出现的次数 
} 
int i=1;
for(int j=0;j<M;j++) //枚举整个范围 
{
	while(cnt[j]>0) //出现过就放到a数组之中 
	{
		a[i++]=j; //依次存放 
		cnt[j]--; //j个数少1 
	}
} 

//快速排序

 
sort(a,a+n) //a[0]到a[n-1]从小到大排序
reverse(a,a+n) //a[0]到a[n-1] 翻转

sort(a,a+n,greater<int>()) //a[0]到a[n-1]从大到小排序

sort(a+1,a+n+1) //a[1]到a[n]从小到大排序

struct Stu{
	string name;
	int sc;
}; 
//定义了一个包含名字和分数的Stu类型的数据类型

Stu a;//声明了一个Stu类型的变量a
Stu b[100];  //声明了一个Stu类型的数组b


bool cmp(Stu a,Stu b) 
{
	if(a.sc>b.sc) return 1;//按照成绩从大到小排序
	if(a.sc==b.sc&&a.name<b.name); //成绩相同,按照名字的字典序排序
	return 0;   //不符合规则 
}
sort(b+1,b+1,cmp);//b[1]到b[n]按照cmp定义的规则排序


struct Stu{
	string name;
	int sc;
	bool operator<(const Stu& w)const
	{
		if(sc>w.sc) return 1;
		if(sc==w.sc&&name<w.name) return 1;
		return 0;
	}
}; 
//定义了一个包含名字和分数的Stu类型的数据类型,且确定了排序规则 
//可以直接使用(b+1,b+n+1) 进行排序

位运算

a=10(1010) b=9(1001) 
a&b a和b转成二进制以后,对应位都是1才是1 
1010
1001
1000   a&b=8
a|b a和b转成二进制以后,对应位只要有一位是1就是1 
1010
1001
1011   a|b=11
a^b a和b转成二进制以后,对应位只要不相同即是1 
1010
1001
0011   a^b=3

for(int i=30;i>=0;i--)  //对int类型的非符号位从高位到低位进行枚举 
{
	if(x>>i&1) //x的二进制的第i位是1 
	{
		//
	}
}

//枚举n个人的不同选择
for(int i=0;i<1<<n;i++) //枚举每种选择 
{
	for(int j=n-1;j>=0;j--) //第i种选择的第j个人的状态 
	{
		if(i>>j&1) //第i种选择第j个人选了 
		{
			//
		}
		else        //第i种选择第j个人没有选 
		{
			//
		}
	}	
}

0 comments

No comments so far...