1. 程式人生 > >2019年秋招某公司C++開發真題

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 (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;
}