C++习题3

求余运算符% 位运算(<< >>  &  |  ! ^ 左右移位,与,或,非 ,异或)

这些符号的运算对象都是整型

unsigned short x=0xffff 

cout<<x; 

cout输出的是整数,所以要将16进制数转化为整数

正常运算就行,结果是65535

如果将short改成unsigned short 那么结果变成-1

0xffff在内存中表示为16个1 

16进制转2进制方法: 

只需把每一位,变成二进制的四位数,然后拼在一起。

看个例子就懂了,ff bf 是二进制的几?答:1111 1111 1011 1111

如何十六进制转换二进制? - 知乎 (zhihu.com)

16个1,最高位为1,表示负数,在二进制中是补码,要将其转化为原码

先末位-1,得到1111 1111 1111 1110 符号位不变,其余取反,得到1000 0000 0000 0001 ,此为二进制的-1

 选D,e的x次方只能用exp(x)表示

double exp(double x); //返回e的x次方

转义字符 \xff 表示 转义字符能表示的最大16进制数

\177是转义字符能表示的最大8进制数

\178则要分为2部分 \17 和8

此外,想表示各种符号 \" \! \? 这样表示,都算一个字符

C++中,字符会尽可能多地结合

strlen()会统计第一个\0之前的字符个数

abcd00\0ahhf\0 用strlen求得结果是6

而sizeof()结果是13

 

 无论自己加不加\0,放在数组中其会自动加上一个\0(数组大小为空时)

11.设有int i=010,j=10; 

则 printf(“%d..%d\n”,++i,j--);的输出是。

(A) 11,10 (B) 9,10 (C) 010,9 (D)10,9.

010表示8进制,将其转化为10进制为8

答案为A

char *a="hello" 意思是将字符串的首地址赋给a

int *p ,*q; int k;

k=*p*(*q)这样计算是错误的

乘法*的优先级高于解引用*的优先级

正确运算是(*p)*(*q)

答案是 B C D

如果将*p改为p,结果是 BCD CD D 

cout<<"abcd"的意思是输出以a的地址开始,到\0结束的所有字符

对于字符串都是这样

理解原理即可

如果定义变量:unsigned short a = 0x0f0f;与表达式~a等价的表达式是:()

(A)!a
(B)a&0xffff
(C)a ^ 0xffff
(D)al0x0000

选C

~是按位取反运算符

取反就是0变成1,1变成0

而^是异或运算符

运算方法是真真为假 假假为假 真假为真

A = 0011 1100

B = 0000 1101

A^B = 0011 0001

~A  = 1100 0011

~a=0xf0f0

而a^0xffff=0xf0f0

所以选C

有如下定义,合法合理的数组元素访问是()。
int s[3][4] = { {1,4,7,10},{2,5,8,11},{3,6,9,12} };
    int* pArr[3] = { s[0],s[1],s[2] };
    int(*p)[4]; p = s;
    int** q = pArr;
    cout << *(s[3] + 2)<<endl;
    cout << *(*(pArr + 2) + 4)<<endl;
    cout << (*(p + 2))[3]<<endl;
    cout << q[3][4]<<endl;

 这题很简单 选C

s[3]是想表示第3行的首地址,但是s只有三行,所以最大为s[2]

*(pArr + 2) + 4和 q[3][4]是想表示第三行第四个元素,但第四个元素列下标为3

所以应该是*(pArr + 2) + 3和q[2][3]

char str[] = "HFUT\40Xuancheng\40campuses\x2e\n";
cout << sizeof(str);结果为?

26

\40 \x2e \n都算一个

\40是8进制的转义字符  \x2e是16进制的转义字符

转义字符

void fun(int* p, int& s1, int s2, int n);
int main()
{
    int a[10] = { 10, 8, 6, 4, 2, 1, 3, 5, 7, 9 };
    int c = 0, d = 0;
    fun(a, d, c, 10); 
    cout << c << "," << d;
    return 0;
}
void fun(int* p, int& s1, int s2, int n)
{
    s1 = 0;
    s2 = 0;
    for (int i = 0; i < n; ++i)
    {
        if (i % 2)
        {
            s1 += p[i];
        }
        else
        {
            s2 += p[i];
        }
    } 

结果是0,27

 注意s2是形参,不会影响实参值

s1是引用,会影响 

而且要注意输出的位置:d 和 c是相反的

s1=8+4+1+5+9  i%2是取奇数下标的 

题目:通过函数fun将无符号数字字符串按照给定计数系统的基转换为
对应十进制数并返回。
函数fun传递的参数是:s是数字字符串的首地址,b为计数系统的基(b大于等于2,小于等于10)。返回转换结果,如果数字字符串有不满足要求的字符返回-1。
如s指向的字符串是"12124",b是5。表示将"12124"作为5进制字符串转换为对应的10进制整数,返回结果为914。
再如:如s指向的字符串是"12123”,b是3。由于3超过3进制
的最大数2,所以错误,返回-1。
如果字符串中包含非数字字符,如-123返回-1,12.3返回-1(包含)+1223返回-1(包含+)等。

int fun(char *s,int b)
{
	int sum = 0;
	int k = 0;
	while (*s)
	{
		k = *s - '0';
		sum = sum * b + k;
		if (*s < '0' || *s > '9')
		{
			return -1;
		}
		if (k >= b)//比如5进制,不能包含5,小于号不要忽略
		{
			return -1;
		}
		s++;
	}
	return sum;
}

 题目:函数fun的参数是:p为数组的首地址,p指向的数据类型是双精度,n为元素个数。
函数的功能是:双精度数组的整数部分是5位,不足5位当5位处理。
要求:以双精度绝对值的整数部分的中间三位的值为大小依据按降序排序。
如:-27888.52 22177.83中的788比217大
-867.17,10262.27比较的对象是86和26

主函数中测试数组a的排序结果(实际为1行显示):排序结果:29506.73  -18942.80  -18027.43 -27888.52  12496.14  32440.25  22177.83  91876.24  867.17 10262.27
说明:可使用fabs函数和强制类型转换运算或函数

void fun(double* p, int n)
{
	int i, j;
	double t;
	for (i = 0; i < n - 1; ++i)
	{
		for (j = i + 1; j < n; ++j)
		{
			int k1 = (int)(fabs(p[i])) / 10 % 1000;
			int k2 = (int)(fabs(p[j])) / 10 % 1000;
			if (k1 < k2)
			{
				t = p[i];
				p[i] = p[j];
				p[j] = t;
			}
		}
	}
}

 先将浮点型转化为整型(只有整型能用%运算符)

先除以10,再取余1000就得到了某个数的中间三位

如23456 除10=2345 取余1000=345

645要的是64 

645/10=64 取余1000还是64 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值