指向同一个数组的不同元素的两个指针可以相减,其差便是两个指针之间相隔的元素个数。
例如在一个字符串中,让一个指向该串的首元素,让另一个指向字符串的结束符,两个指针相减,其差便是字符串的长度
2.怎样判断两个指针指向的是数组的同一个元素?
:指针可以互相比较。如指向同一个数组元素的两个指针可以比较,当两个指针相等时,说明指向数组的同一个元素。
3.怎样对二进制进行取位?
:and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。
4.怎样对二进制特定位赋值?
:按位或(or |):or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
5.可以使用%提取整数中的数字,用/将提取出的数字从整数中去掉。
6.判断一个字符是大写字母,小写字母,数字或者数字+大小写字母,用<cctype>头文件的字符检测函数,如下
C++提供了若干字符检测函数,这些函数都在头文件<cctype>.这些函数检测单个字符,返回true或者false(实际返回的是0和1)
Isdigit(c)//检测是否是为数字 如isdigit(‘7’)
Isalpha(c)//检测是否为字母 如isapha(‘a’)
Isalnum(c)//数字或者字母时候为真
Islower(c)//检测小写字母
Isupper(c)//
Isspace()//
7.怎样进行单个字符大小写转换?
tolower(c)//转换小写字母。否则返回本身
toupper(c)//转换为大写字母
注意:转换后的返回值并不是相应的大小写字母,而是大小写字母对应的ASCII码,所以,要转换为大小写字母,还需要进行类型转换,如
Char ch = ‘a’;
Cout<<static_cast<char>(toupper(ch));//显示A
如果为:cout<<toupper(ch)//则显示大写字母的ASCII码65
8.判断一年的第一天是星期几(用来打印日历)
int firstday = ((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7; //判断某年的第一天是星期几(计算从1970到现在的天数,模7取余就是今天的星期)
daysofmonths是这个月的天数(123456789,10,11,12)
下个月第一天是星期几就是firstday = (firstday+daysOfMonths)%7;
9.找出符合条件的100个数(n个数):
将这些数放在一个数组中,先声明这个数组如:int num[100],n = 0;//n用于数组的计数作用
再筛选,可以自己设置一个开关,作为跳出循环的条件和执行符合情况的条件。
while(n<100)
{
生成数,
if(符合条件)
{ num[n]= 这个数//将这个数插入到数组中
n++;
}
}
9.遇见多个一次出现数字,就要联想到数组,把这些数放在数组中,能一一访问。
有的情况下,输入的数,是临时的,可能会被立刻抛弃,这时候,就不用引入数组,直接用循环生成一下这个数。即只有要保存的数,要访问的数,有用的数才放在数组中
如int n = 0;
while(n<10)
{
a = rand()%10;
if(满足条件才)
{才留下a}
}
10.输出10个不同的数,
算法:就是每次新输入的数,都与原来的所有数比较(因为要保存原来的数,所以必须把原来的数放在数组中,才能访问到这个数),如果没有相同的,则加入进去,否则丢弃。
(即只有要保存的数,要访问的数,有用的数才放在数组中)
11.遇见多个一次出现数字,就要联想到数组,把这些数放在数组中,能一一访问。
有的情况下,输入的数,是临时的,可能会被立刻抛弃,这时候,就不用引入数组,直接用循环生成一下这个数。即只有要保存的数,要访问的数,有用的数才放在数组中
如int n = 0;
while(n<10)
{
a = rand()%10;
if(满足条件才)
{才留下a}
}
10设置”开关“的作用:若一个数符合条件,那么执行外面的动作,若不符合,则不执行外面的动作。原理就是当遇到不符合条件的数的时候,改变开关值。
和有条件跳出双重循环一样(不符合,跳出两层循环(内层用break退出,外层用continue,),符合,执行外层循环动作)
可表示为
int sw = 0//开关
for{
if(不符合条件)
{int sw = 1;break; }
}
if(!sw){动作}
典型范例:输出10个不同的数
void main()
{
int num[10],n = 0;//将10个有用的数放在数组中,声明n作为数组访问下标变量。
srand(time(0));
num[0] = rand()%10;//因为后面的数要和前面的数相比,所以第一个必须是提前特殊声明好了得
n++;
int sw = 0;//引入的开关变量
while (n<10)
{
int a = rand()%10,i;
sw = 0;//注意,记住这里,一定要每次都将开关变量初始化为零,让其每次都发挥作用
for (i = 0;i<n;i++)
{
if (num[i] ==a)
{
sw = 1;
break;
}//判断新数是否与以前数组中的数相同,如果相同,则退出
}
if(!sw)//这里修改为这样
{
num[n] = a;
n++;
}
}
for (int j = 0;j<10;j++)
{
cout<<num[j]<<endl;
}//打印数组
}
下面这个程序是利用,退出两次循环的原理
void main()
{
int num[10],n = 0;
srand(time(0));
num[0] = rand()%10;
n++;
while (n<10)
{
int a = rand()%10,i;
for (i = 0;i<n-1;i++)
{
if (num[i] ==a)
{
break;
}
}
if (num[i] == a)
{
continue;
}
else
{
num[n] = a;
n++;
}
}
for (int j = 0;j<10;j++)
{
cout<<setw(5)<<num[j]<<endl;
}
}
10.如何跳出双重循环?
:
11.如果不符合条件,跳出两次循环,如果满足条件,跳出内层循环,执行外层循环的动作。与引入开关变量一样(如果条件符合,则退出笨循环且执行外部动作,如果不符合,则不执行外部动作)