【编程强化48】1st

1、以下for循环的执行次数是()

for(int x = 0, y = 0; (y = 123) && (x < 4); x++);

A. 是无限循环         B. 循环次数不定         C. 4次         D. 3次

解析:

• for循环:

for(初始化部分;条件判断部分;调整部分)

{

        //循环语句;

}

• 逻辑与&&:

符号两侧的条件语句结果全为真(或非0)则判断结果为真。

若左侧的条件语句结果为假(或0),则右侧语句不再判断(或不执行)。

本题for循环的条件判断部分:

&&左侧,“y = 123”是一个赋值语句,它的值为123(非0,为真);

&&右侧,“x < 4"是一个比较语句,当变量x的值小于4时结果为真。

故本题的循环执行到x的值等于4结束,共执行4次,选C

2、以下程序的运行结果是()

#include <stdio.h>
int main(void) {
    printf("%s , %5.3s\n", "computer", "computer");
    return 0;
}

A. computer , puter         B. computer ,   com

C. computer ,   computer         D. computer , compu.ter 

解析:

• 常量字符串结尾默认附带‘\0’:

如本题中"computer"在内存中实际为"computer\0"。

• %s打印:

%s打印字符串,遇到‘\0’时停止打印。

• %m.ns打印:

m:输出字符串的宽度;

n:从左起截取目标字符串n个字符,并右对齐打印,左边补齐空格。

当字符串长度 > n > m,实际打印的效果只与n有关,与m无关;

当n > 字符串长度,实际打印效果与%s一致。

本题选B

3、在以下代码中,

int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};

p[1][2]的值是()

A. 1         B. 0         C. 6         D. 2

解析:

• 二维数组的定义和初始化:

第一个“[]”代表行,第二个“[]”代表列;

初始化时,每一个“{}”表示一行;

未初始化的部分会默认设为0。

本题中的int数组p一共有4列,行被省去,没有被完全初始化,它的真实情况为:

1 0 0 0

3 2 0 0

4 5 6 0

0 0 0 0

故p[1][2]的值是0,本题选B。

4、选择表达式 11|10 的结果(本题数值均为十进制)()

A. 11         B. 10         C. 8         D. 2 

解析:

• 二进制数的转化:

用8个byte位来表示,11为“0000 1011”,10为“0000 1010”。

• 按位或 |:

两个参与运算的数值对应的二进制位上,两者有1则为1,两者全为0才为0。

如本题,0000 1011 | 0000 1010 = 0000 1011,转化为十进制数结果为11,故选A

5、

int fun(int a){
    a^=(1<<5)-1;
    return a;
}

fun(21)运行结果是()

A. 10         B. 5         C. 3         D. 8

解析:

• 左移<<:

m<<n:左侧的数值m的二进制位整体向左移动n位。

• 异或^:

m^n:对于m和n的二进制数的对应位置的值,当m的对应位置的值为0,且n为1时,结果对应位置的结果为1,其余情况都为0。

本题中,1的二进制数用8个byte位表示为0000 0001,1<<5的结果为0001 0000,转化为十进制数为32;

“a ^= (1 << 5) - 1”相当于“a = a ^ ((1 << 5) - 1)”,化简为“a = a ^ (32 - 1)”、a = a ^ 31”,意为将a原本的值与32异或后赋给a;

形参a接收实参后值为21,所以表达式最终为a = 21 ^ 31;

21的二进制数为:0001 1111,31的二进制数为:0001 1111,0001 1111 ^ 0001 1111 = 0000 1010,转化为十进制数为10,故选A。

6、若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()

A. *p+=1;         B. (*p)++;         C. ++(*p)         D. *p++

解析:

• 表达式的优先级:

括号()内  >  解引用*  =  “++”  >  “+=”。

其中,解引用*和“++”的优先级相同,按从右到左的顺序执行。

• 前置++和后置++:

++是增1运算符,可以使被操作数自增1。前置++使被操作数先自增1,再调用;后置++使被操作数先调用,再自增1。

本题选D。

D项中,先执行后置++,再执行解引用*。后置++执行后,先对指针p解引用得到year变量,再对p本身的值(year变量的地址)进行自增1,并没有将year变量中的值从1009自增至1010。

7、组队竞赛

Q:怎么分组?怎么找最大的每组次大值之和?

#include <iostream>
using namespace std;
#include<algorithm>
#include<vector>

int main() 
{
    int n;
	while(cin>>n)
	{
		vector<int> a;
    	a.resize(3*n);
		for(int i=0;i<3*n;i++)
    	{
        cin>>a[i];
    	}
    	sort(a.begin(),a.end());
    	long long sum=0;
    	for(int i=0;i<n;i++)
    	{
   		    sum=sum+a[a.size()-2*(i+1)];
    	}
    	cout<<sum<<endl; 
	 } 	        
}

8、删除公共字符 

Q:怎么在第一个字符串中找到第二个字符串中的每一个字符? 

 

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str1,str2;
	getline(cin,str1);
	getline(cin,str2);
	int hash[256]={0};
	for(int i=0;i<str2.size();i++)
	{
		hash[str2[i]]++;
	}
	string ret="";
	for(int i=0;i<str1.size();i++)
	{
		if(hash[str1[i]]==0)
		{
			ret+=str1[i];
		}
	}
	cout<<ret;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值