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