2019年秋招某公司C++开发真题

1.判断字符变量x是小写字母符的C语言表达式是

if(x>'a' && x< 'z')
return TRUE;

2.设有定义“char buffer[x];”,要将字符串“www.baidu.com”赋值给buffer的安全语句是

strcpy_s(buffer, "www.baidu.com");

3.以下为Linux下的32位C程序,请计算sizeof的值:

char str[] = "hello";// 6 加上一个‘\n’
char* p =str; //4 指针固定4个字节
int n = strlen(p); //4  int类型 4个字节

4.h头文件中的ifndef/define/endif的作用?

防止头文件被重复定义

5.#include<file.h>与#include"file.h"的区别?

搜索顺序不同

用#include“file.h”时,先搜索当前工作目录->搜索库->资源库;
用#include<file.h>时,编译器先从标准库路径->资源库目录->当前工作目录。

6.若x=15,y=29,z=13,则表达式(p=(x<y?x:y)>z?p:z)的值 

p

 7.已知一个数组table,用一个宏定义,求出数据的元素个数

#define TNTBL(table) (sizeof(table)/sizeof(table[0]))

8.有定义:int a[][3]={1,2,3,4,5,6,7,8,9,10},则*(*(a+1)+2)的值为

6

9. IP地址的编码分为哪两个部分?

网络号和主机号

 10.简要说明动态库和静态库的区别

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库;

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。

11.以下while循环执行多少次

char i = 88;
while(i++<100000);

 越界死循环,无限次

12. 列举C/C++源代码文件转化为可执行文件过程的步骤,并简要说明各步骤。

.c文件

1).预处理,产生.i文件

2).编译,产生汇编文件(.s文件)

3).汇编,产生目标文件(.o或.obj文件)

4).链接,产生可执行文件(.out或.exe文件)

记忆:ISO镜像文件 

13.进程和线程的区别

进程是资源分配的最小单位,线程是程序执行的最小单位。

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵;而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

14.求下面函数的返回值,写出计算思路

int func(x)
{
    int count = 0;
    while(x)
    {
        count++;
        x =x&(x-1);
    }
    return count;
}

 假定x = 9999,count的值为

8

求解x的二进制数中1的个数

9999=11 1110 0111

 15.一个int全局变量i=0,5个线程并发执行1000次i++,请问最终结果是多少?

最小值为1000,最大值为5000;

原因:五个线程在i=0进行,得到1000;

一个线程计算到1000之后,再下一个进程,...,最后一个线程从4000开始,最后输出5000.

ps:有点类似串行跟并行。并行得到1000,串行得到5000

16. 

17.各类指针的定义

18.UNIX时间戳(英文为Unix time,POSIX time或Unix timestamp)是从UNIX纪元(Epoch)(1970年1月1日00:00:00UTC开始所经过的秒数。)

现请你完成一个简单的程序,这个程序读取一个1970年1月1日后的合法日期,然后计算该日期是距离1970年1月1日起的第几天(1970年1月1日算第0天)?

(注:普通年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);

世纪年:能被400整除的为世纪闰年。(如2000年是闰年,1900年不是闰年)

样例输入

1970 02 01

样例输出

31

#include<iostream>
using namespace std;

bool isleapyear(int y)
{
	return ((y % 4 == 0 && y %100 != 0) || y % 400 == 0);
}

int sum(int y, int m, int d)
{
	int md[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	int cnt = y * 365;
	//判断闰年有几个
	cnt += (y - 1) / 4 + 1;
	cnt -= (y - 1) / 100 + 1;
	cnt += (y - 1) / 400 + 1;
	
	for (int i = 1; i < m; i++)//加上月份
	{
		cnt += md[i];
	}
	cnt += d;	//加上日
	if (m > 2 && isleapyear)//判断该年是否为闰年
		cnt += 1;
	return cnt;

}
int count(int y1, int m1, int d1, int y2, int m2, int d2)
{
	return (sum(y2, m2, d2) - sum(y1, m1, d1));
}

int main()
{
	int y1=1970, m1=01, d1=01, y2, m2, d2;
	cin >> y2 >> m2 >> d2;
	cout << count(y1, m1, d1, y2, m2, d2);
	   	 
	system("pause");
	return 0;
}

19.在一个很大很大的国际象棋棋盘上有一枚妻子国王(King),一开始它坐落于(x1,y1)点,请问到达(x2,y2)点最少要走几步?国王的走法规则是:横、直、斜都可以走,但每次限走一步)轻便鞋程序解决这个问题。程序输入的第一行是两个整数x1和y1,第二行两个整数x2和y2(0<=x1,y1,x2,y2<=1000000000);请输入一个整数表示最少的步数,

样例输入:

2 5

1 3

样例输出:

2

#include<iostream>
#include<math.h>
using namespace std;

int step(int x, int y)
{
	int res = 0;
	while (x != 0 && y != 0)//如果存在不在x轴或y轴的,就走对角
	{
		x = x - 1;
		y = y - 1;
		res++;
	}
	return res + x + y;
}

int main()
{
	int x1,x2,y1,y2;
	int x, y;
	cin >> x1 >> y1;
	cin >> x2 >> y2;
	x = abs(x1 - x2);
	y = abs(y1 - y2);
	cout << step(x,y);
	   	 
	system("pause");
	return 0;
}

20. 有一个从1到N编号的32位无符号整数序列A,请问里面有多少个<i,j>下标对(1<=i<=j<N)满足Ai*2=Aj,请写出程序。

程序输入的第一行是N(2<n=<=100000),接下去一行是N个由空格隔开的数字,表示序列A。

样例输入:

5

2 4 5 4 8

样例输出:

4

样例输出解释(<1,2>,<1,4><2,5>和<4,5>这四个下标对)

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;

int step(int x, int y)
{
	int res = 0;
	while (x != 0 && y != 0)
	{
		x = x - 1;
		y = y - 1;
		res++;
	}
	return res + x + y;
}

int main()
{
	int n;
	int temp;
	int res = 0;
	vector<int> vec;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> temp;
		vec.push_back(temp);
	}
	for(int i=0;i<n;i++)
		for (int j = 1; j < n; j++)
		{
			if (vec[i]*2 == vec[j])
				res++;
		}
	cout << res;	   	 
	system("pause");
	return 0;
}

 21.从坐标原点出发,路径如下,每次走一步,求走到给出的任意坐标值的路径。

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;

int fun1(int x,int y)//x正半轴
{	

	if (x == 1)
		return 1;//+y
	else
		return fun1(x - 1, 0) + 8 * x - 7;
}

int fun2(int x, int y)//y负半轴  
{
	y = abs(y);
	if (y == 1)
		return 7;//+x
	else
		return fun2(0, y-1) + 8 * y - 1;
}

int fun3(int x, int y)//y正半轴
{
	if (y == 1)
		return 3;//-x
	else
		return fun3(0, y - 1) + 8 * y -5;
}
int fun4(int x, int y)//x负半轴
{
	x = abs(x);
	if (x == 1)
		return 5;//-y
	else
		return fun4(x-1,0) + 8 * x -3;
}


int main()
{
	int x, y;
	int res=0;

	while(1)
	{
		cin >> x >> y;
//		cout << fun3(x, y);
		if (x >= 0 && y >= 0)//一象限
		{
			if (abs(x) > abs(y))
			{
				res = fun1(x, y)+y;
			}
			else
			{
				res = fun3(x, y)-x;
			}
		}
		if (x < 0 && y > 0)//二象限
		{
			if (abs(x) > abs(y))
			{
				res = fun4(x, y)-y;
			}
			else
			{
				res = fun3(x, y)-x;
			}
		}
		if (x <= 0 && y <= 0)//三象限
		{
			if (abs(x) > abs(y))
			{
				res = fun4(x, y)-y;
			}
			else
			{
				res = fun2(x, y)+x;
			}
		}
		if (x > 0 && y < 0)//三象限
		{
			if (abs(x) > abs(y))
			{
				res = fun1(x, y)+y;
			}
			else
			{
				res = fun2(x, y)+x;
			}
		}
		cout << res;

	}
   	 
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xiyangsu2617/article/details/83180068