轉自:http://www.cnblogs.com/jerry19880126/archive/2012/08/05/2623982.html
請寫出下面程序的輸出結果:
1、
- int count = 3;
- int main(void)
- {
- int i, sum, count = 2;
- for(i=0,sum=0; i<count; i+=2,count++)
- {
- static int count = 4;
- count++;
- if(i%2 == 0)
- {
- extern int count;
- count++;
- sum += count;
- }
- sum += count;
- }
- printf("%d %d\n",count, sum);
- return 0;
- }
2、
- void func(char str[50])
- {
- printf("A %d B %d ",sizeof(str), strlen(str));
- }
- int main(void)
- {
- char stra[] = "HelloWorld";
- char *strb = stra;
- printf("C %d D %d ",sizeof(stra), sizeof(strb++));
- func(++strb);
- printf("E %d F %d\n",strlen(stra), strlen(strb++));
- return 0;
- }
3、
- #include <vector>
- int func(std::vector<int>vec)
- {
- static int k = 2;
- std::vector<int>::reverse_iterator it;
- for(it = vec.rbegin(); it!=vec.rend(); ++it)
- {
- k += *it%2==0? ++*it: (*it)++;
- }
- return k;
- }
- int main(void)
- {
- std::vector<int>vec;
- for(int i = 0; i<4; i++)
- {
- vec.push_back(i);
- printf("%d ",func(vec));
- }
- return 0;
- }
4、
- class Base
- {
- public:
- int m_a;
- Base(int a=2):m_a(a)
- {
- printf("A %d ",m_a);
- }
- virtual ~Base()
- {
- printf("B %d ",m_a);
- }
- };
- class Derived:public Base
- {
- public:
- Derived(int a=4):Base(a)
- {
- printf("C %d ",m_a);
- }
- ~Derived()
- {
- printf("D %d ",m_a);
- }
- };
- int main(void)
- {
- Base *aa,bb;
- aa = new Derived;
- delete aa;
- return 0;
- }
5、
- class Base
- {
- public:
- int m_a,m_b;
- Base(int a = 2,int b = 5):m_a(a),m_b(b) { }
- int func_a()
- {
- return m_a - m_b;
- }
- virtual int func_b()
- {
- return m_a + m_b;
- }
- };
- class Derived:public Base
- {
- public:
- Derived(int a = 4, int b = 7):Base(a, b) { }
- virtual int func_a()
- {
- return m_b + m_a;
- }
- int func_b()
- {
- return m_b - m_a;
- }
- };
- int main(void)
- {
- Base *aa, *bb;
- aa = new Base(4, 7);
- bb = new Derived(3, 5);
- printf("%d %d %d %d\n",aa->func_a(), aa->func_b(), bb->func_a(), bb->func_b());
- delete aa;
- delete bb;
- return 0;
- }
6、
- struct SC
- {
- int a;
- int b;
- int c;
- };
- struct SD
- {
- int a;
- int b;
- int c;
- int d;
- };
- int main(void)
- {
- struct SC c1[] = {{3},{4},{5},{6}};
- struct SD *c2 = (struct SD*)c1 + 1;
- printf("%d %d %d %d\n",c2->a,c2->b,c2->c,c2->d);
- return 0;
- }
7、
- int func(int n)
- {
- int k = 1;
- if(n > 0)
- {
- k += func(--n);
- printf("%d ", n);
- k += func(--n);
- }
- return k;
- }
- int main(void)
- {
- int a = 3;
- printf("%d\n",func(a));
- return 0;
- }
編程題:
1、函數checkstr判斷一字符串是不是對稱的。其中msg爲輸入的字符串,對稱返回0,不對稱返回-1,實現該函數。
int checkstr(const char *msg);
2、給出一個單向鏈表的頭指針,輸出該鏈表中倒數第K個節點的指針,鏈表的倒數第0個節點爲鏈表的尾節點(尾節點的next成員爲NULL)
typedef struct Node
{
struct Node *next;
}NODE;
NODE* findnode(NODE *head,unsigned int k);
簡答題:
1、簡述動態鏈接庫DLL和靜態鏈接庫lib的差別。
2、請簡述MFC中的窗口收到WM_PAINT消息是如何處理的,什麼情況下會產生WM_PAINT消息。
3、請簡述Critical Section 、Mutex、Semaphore的功能和差別
4、簡述多線程程序對比單線程程序的優點和缺點。
參考答案(歡迎討論)轉載請註明來源http://www.cnblogs.com/jerry19880126/
- 4 20 主要考查各個count的作用範圍,for循環判斷條件的count是main下第一行的count,for循環裏面的count是static的count,if語句裏面的count是main外部的count,sum+=count中的count是static的count。
- C 11 D 4 A 4 B 9 E 10 F9 注意函數形參裏的數組形式,其實本質上都是指針,另外sizeof是在編譯階段就處理的運算符,所以會忽略裏面的各種算術運算。
- 3 5 10 18 考查運算符的優先級,帶等號的運算符=、+=等等,優先級都是很低的,所以先做的是那個三目運算符,還要注意形參的變化不影響實參。
- A 2 A 4 C 4 D 4 B 4 B 2 構造時,先構造基類再構造派生類,釋放時先釋放派生類再釋放基類。
- -3 11 -2 2 構成多態的條件是基類的virtual(注意是基類一定要有,派生類自動也會是virtual,但派生類的virtual不會傳給基類),派生類對基類的覆蓋(函數名、形參和返回值類型必須完全一樣),基類指向派生類對象或引用。
- 0 0 5 0 注意地址轉換後的+1,並不是地址值只偏移一個,而是偏移了一整個struct SD的空間,所以c1內容300400500600會一下子偏移掉4個int,指向了4後面的0。
- 遞歸,花些耐心推就行了。
編程題
1. 如下(引用自http://blog.csdn.net/Hackbuteer1):
2. 如下:
簡答題
- 差別:靜態lib將各個調用函數都封裝在生成的可執行文件中(.exe),而動態DLL則在需要時才動態地裝載和所載DLL文件,動態DLL還可以利用到操作系統中既存的庫文件。
- 處理:BeginPaint開始畫,就是用白刷去掉原窗口,GetClientPaint獲得窗口顯示區域和尺寸等信息並繪製,EndPaint釋放繪圖句柄。
- 功能:都是用來解決共享變量或區域的訪問問題,防止讀寫衝突。區別:Critical Section是在用戶方式下實現同步,其他兩個是系統內核對象。Mutex是隻有獲得鎖的進程才能釋放,而semaphore可由其他進程釋放,一般mutex用於保護關鍵代碼區域,而semaphore用於保護變量。
- 優點:多線程程序可以分時處理,用戶因此可以同時高效地執行多個任務,用戶體驗好;缺點:線程切換有額外的代價,所以花費的總時間要長於單線程程序。
{
if(head==NULL||k<0)
return NULL;
Node* q=head;
Node* p=head;
for(int i=0;i<k&&q!=NULL;i++)
q=q->next;
if(q==NULL)
return NULL;
while(q->next!=NULL)
{
p=p->next;
q=q->next;
}
return p;
}