We must accept finite disappointment, but we must never lose infinite hope

c++笔试题汇总【1】(转载)

上一篇 / 下一篇  2008-05-17 10:19:27

1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?

m+F8l[!g:W0

virtual修饰符会被隐形继承的。private 也被集成,只事派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual ,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。

&Hp&]WtF(Q'X{o P0

--------------------------------------------------------------------------LUPA开源社区 \"e7LZkG6T,O@

2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)LUPA开源社区$f,r2Vep z#G

#include <iostream>

kR6X \^!k}9T/WX1|0

using namespace std;LUPA开源社区UB1N{^s3x{&H

void main()LUPA开源社区iP`;k[0a

{LUPA开源社区Q+QpDv[;RL

char a[50];memset(a,0,sizeof(a));LUPA开源社区*j8E$R [Hq.?,x

int i=0,j;

D7bryhI0

char t;

c!g @2k^0

cin.getline(a,50,'\n');

fu'p:jI0

for(i=0,j=strlen(a)-1;i<strlen(a)/2;i++,j--)LUPA开源社区K^w5vPy8lU@

{

J Sb;a)i qS{L0

   t=a[i];LUPA开源社区Us ~8A R HX+s)U

      a[i]=a[j];LUPA开源社区'Q G} {%Jj

   a[j]=t;LUPA开源社区4st^+` Iv"u

}LUPA开源社区zH&y6p S T2l[j&j

cout<<a<<endl;

@_G9Nw0

}LUPA开源社区^3[Y0y$KbLb7c

//第二种

'\rC[(Jw$l0

string str;

[:v#~zw/m`h0

cin>>str;LUPA开源社区e2Gt so?l,y

str.replace;LUPA开源社区I:c8|$G"dIXw

cout<<str;

d;{ |f5@O0

--------------------------------------------------------------------------LUPA开源社区1H%l? R:|.CJb/u _5Q

3.请简单描述Windows内存管理的方法。LUPA开源社区xr v4k3];eI6C@7Q!QH

内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~LUPA开源社区:@'o9ZDm O4TgY

我先说个大概,希望能够抛砖引玉吧LUPA开源社区'D}k S lo?2W

当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。

%l8E6[NMLJy'~0

内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理LUPA开源社区W\O[ a1h

块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。LUPA开源社区cjZ;PQ We(`

页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。LUPA开源社区Y$P3qC*z

段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。

b/o^:a,^Gr.m0

段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。LUPA开源社区Ki d6N0l G!JW*t

各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。

Hmy{!\ sw$_0

这只是一个大概而已,不足以说明内存管理的皮毛。无论哪一本操作系统书上都有详细的讲解LUPA开源社区(OoC8wf5k

--------------------------------------------------------------------------

4j"^L|NB6R}+\%xZT^0

4.

eq`4?"P;a'p*F0

#include "stdafx.h"

4M+HWz#~9Tg-g9{0

#define SQR(X) X*X

D le B FZ0

int main(int argc, char* argv[])

vjf U1M0

{

g/|0J [Z5o'@h we0

int a = 10;

3eLQ"@k p&mr0

int k = 2;LUPA开源社区W:W+v.FgS u*b

int m = 1;LUPA开源社区}8p+aBe7A

a /= SQR(k+m)/SQR(k+m); LUPA开源社区K^ G hl-}:t

printf("%d\n",a); LUPA开源社区N)i4Y*].s@ OX

return 0;

g2oR9k;XQ0

}LUPA开源社区2D$m5Y] kX

这道题目的结果是什么啊?

4X`"G-c3\UPb0

define 只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的

4?n3ym:V:z0

a /= (k+m)*(k+m)/(k+m)*(k+m);

SP.Gn'["o |0

=>a /= (k+m)*1*(k+m);

.?W6a4S| KE0

=>a = a/9;

|J\v3pf6?{SF0

=>a = 1;

o2NC1I \Z[$z0

--------------------------------------------------------------------------LUPA开源社区jkzs K%OY

5.

E8J._zh0

const 符号常量;LUPA开源社区7yJWsT.uk

(1)const char *pLUPA开源社区p[#n bu,X9Pbc4BK0v

(2)char const *p

&d1W/k`-K?E.y0

(3)char * const p

6V/Z[cQ,i0

说明上面三种描述的区别;LUPA开源社区kvH nbcI9E

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;LUPA开源社区3\9|,P*V4s6\.N

如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。LUPA开源社区#F \Y"uS3G

(1)const char *pLUPA开源社区*Z N-FE0xF vnx

一个指向char类型的const对象指针,p不是常量,我们可以修改p的值,使其指向不同的char,但是不能改变它指向非char对象,如:

,\-Zi ~L|0

const char *p;

;x*qa6L5g-l H8bNz0

char c1='a';

] `-z6w!e0

char c2='b';

a(oBW+u)e`5]{"w0

p=&c1;//okLUPA开源社区/Y#@x"Dk*B+{0i

p=&c2;//okLUPA开源社区3}g!c*@;`.kA-_Q

*p=c1;//error

R9I$a7L GI3}I__*w)w0

(2)char const *pLUPA开源社区 o:_9O.]J

(3)char * const pLUPA开源社区K6E9a?Q? Cq6L"|T

这两个好象是一样的,此时*p可以修改,而p不能修改。LUPA开源社区5w,\7\9B9@`R1Dy

(4)const char * const p

)Es7f ZiC4X0

这种是地址及指向对象都不能修改。

bC?a_t$R2u'|%ii0

--------------------------------------------------------------------------

0kq6N.?rL2Rw@0

6.下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么?LUPA开源社区y-Td b ]k Ye

int n;LUPA开源社区D1eK)R7w-Z1wm

if (n == 10) // 第一种判断方式

T jM w9rjG5LP0

if (10 == n) // 第二种判断方式LUPA开源社区5_8T?:` lZi)G

如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=

vb@;OF,As0

--------------------------------------------------------------------------LUPA开源社区 bv r v/KFS

7.下面的代码有什么问题?LUPA开源社区gM0kn U#\ m4E

void DoSomeThing(...)LUPA开源社区 G QH#S%f"b

{LUPA开源社区qa,n/IRj

char* p;

Y? },s,@u"~)x0

...LUPA开源社区ZN,D:B.y1a8eE5} pb

p = malloc(1024); // 分配1K的空间LUPA开源社区5N7obL7BX{4B/mg

if (NULL == p)LUPA开源社区&[pkB&HJ |t v

return;LUPA开源社区2O&[e/dC(Mu

...LUPA开源社区Xv1Eyw

p = realloc(p, 2048); // 空间不够,重新分配到2KLUPA开源社区W8r ?'B7kSQ8s

if (NULL == p)LUPA开源社区d@3EA#Jq

return;LUPA开源社区e2@7e&_1U`5^Z2z C

...

HO0OhKj*V;T4@Z0

}

n+L!l;wD;e0

A:

"V?? _U&X0

p = malloc(1024);     应该写成: p = (char *) malloc(1024); LUPA开源社区Q/hh3Z^\

        没有释放p的空间,造成内存泄漏。LUPA开源社区+u fUL~#EF.v

--------------------------------------------------------------------------

o[0t Zj\(H#L0

8.下面的代码有什么问题?并请给出正确的写法。

e6x _ bkh f5L0

void DoSomeThing(char* p)

Q B ci~Sr&G0

{

2K4@lDA0iZ0

char str[16];LUPA开源社区-J,A4vd[L-Q

int n;

k[;q:N T8uHm3_0

assert(NULL != p);

|ja i]"lg,iX0

sscanf(p, "%s%d", str, n);

V Qy$Szh8P0

if (0 == strcmp(str, "something"))LUPA开源社区&b|~$W%O:HM s"g$b

{LUPA开源社区@l*V Y*ZD l

...LUPA开源社区k+y([bt R

}LUPA开源社区 x4z;C4|9]L3djU

}LUPA开源社区j)?Tt?wV%oI

A:LUPA开源社区V0j9J7W;dN Ef a:R(I

sscanf(p, "%s%d", str, n);   这句该写成: sscanf(p, "%s%d", str, &n);

G'a HdWH kQ]w#]0

--------------------------------------------------------------------------

`q)y4pO&^ mX9x0

9.下面代码有什么错误?

7PZ'P C(e1t;A0

Void test1()

*Q5Bdq$~0

{ LUPA开源社区z&C1?.M#d w h,KV

char string[10]; LUPA开源社区,`Io0L(~0Y},F0k

char *str1="0123456789";LUPA开源社区0Pt~Wo ?3L

strcpy(string, str1);

+~4aB*k1mV%KQ0

}

L$S9NkT tS0

数组越界

@X"x,g2rh(e \&e0

--------------------------------------------------------------------------LUPA开源社区7eP-J'J ^#Li

10.下面代码有什么问题?LUPA开源社区,GCL0Y0?W;YK&N

Void test2()

NRRk$f'vM0

{

(fz+q ~2G!j0

char string[10], str1[10]; LUPA开源社区'B~mC~gQ

for(i=0; i<10;i++) LUPA开源社区f&o9oue z$bb

{ LUPA开源社区:t/x Vq,B?~/u

     str1[i] ='a';

R,t(F8lr `L0

} LUPA开源社区z!m0Q}ufX

strcpy(string, str1); LUPA开源社区^'c$Z@Q2L

}

9[0cf n_C/D0

数组越界LUPA开源社区MV'^*V(t's1F!m N

--------------------------------------------------------------------------LUPA开源社区3fGCn7O d

11.下面代码有什么问题?

,{Bxk%] u0P/n0

Void test3(char* str1)

v1e,S7@$iL-q/{8a0

{ LUPA开源社区*i^'l U6m2Ff

char string[10]; LUPA开源社区6p7[rf'aD'^k

if(strlen(str1)<=10) LUPA开源社区1i5U s9mw#a mK

{ LUPA开源社区Vo+W:@*F9h-z*HK

    strcpy(string, str1); LUPA开源社区(F+R8tRtFj;Z

}

m|p#? o$A6Wr0[0

} LUPA开源社区p3|q1l'za0MZ%Pz

==数组越界LUPA开源社区Q(w/k]3J[/Hg

==strcpy拷贝的结束标志是查找字符串中的\0 因此如果字符串中没有遇到\0的话 会一直复制,直到遇到\0,上面的123都因此产生越界的情况LUPA开源社区$a} ? M"c R-l

建议使用 strncpy 和 memcpy

Bc1PA+uqV'@0

--------------------------------------------------------------------------

.~v9zHku0

12.下面代码有什么问题?

5a$k\ymE0

#define MAX_SRM 256

+T{yz8hrgh0

DSN get_SRM_no() LUPA开源社区BY] d|g `jm#?

{ LUPA开源社区{:A |"l~ueU/b

static int SRM_no; //是不是这里没赋初值?LUPA开源社区"lu6| p!j

int I; LUPA开源社区b3x%`6R'HzYb9x

for(I=0;I<MAX_SRM;I++,SRM_no++)

W#g g1U q-z6Z.A0

{ LUPA开源社区6h}KWv\ t$YL

    SRM_no %= MAX_SRM;

.x-_X(tm6c0

    if(MY_SRM.state==IDLE) LUPA开源社区"uWM(Nlx|)S5d

    { LUPA开源社区wE9LV:~7vV'~

      break;

/GFod)Gp0

    }

E0yPv6M5u8A0

}

_1l&mS&S~0

if(I>=MAX_SRM) LUPA开源社区`Q A%^aI)V_e)j/I

    return (NULL_SRM);

%E3ly:R?)Bb0

else LUPA开源社区 x@1^m*dg,C

    return SRM_no;

9cg:Gq'\s0x0

}

4vL(rCl"y3Tb4B)F0

系统会初始化static int变量为0,但该值会一直保存,所谓的不可重入...

,U8z-r-YCP0

--------------------------------------------------------------------------LUPA开源社区`L t htrZgw ]z;~

13.写出运行结果:LUPA开源社区'iGa&y)R%i F,L

{// test1

WA |Wl2H5QU0

    char str[] = "world"; cout << sizeof(str) << ": ";LUPA开源社区(R!S]3l`K G

    char *p    = str;     cout << sizeof(p) << ": ";LUPA开源社区eDQ3?@0m&t\v!e

    char i     = 10;      cout << sizeof(i) << ": ";

x N CG Jb*`TiC0

    void *pp   = malloc(10); cout << sizeof(p) << endl;LUPA开源社区bBm3qR }q

}LUPA开源社区4E c-Y$iFPD

6:4:1:4LUPA开源社区qh"PA%I5][B

--------------------------------------------------------------------------

7[0HSXL0

14.写出运行结果:

G M;P[*E;W0

{// test2LUPA开源社区4PV.dA [

    union V {

u(HdXQQs/DS6L9{0

struct X {LUPA开源社区K-D;|2?Wj!kp

   unsigned char s1:2;

&B` B*}s1c6|0

   unsigned char s2:3;

-}H.O0zy+U(u-yc6_0

   unsigned char s3:3;

cU3x{O"b2b,o0

} x;

|J*d$Na$?md0

unsigned char c;

:t`1O^:X | PJ0

    } v;LUPA开源社区7]1m5\5m3Z/F x$^ {+N|&N

    v.c = 100;

-[mEi$h T0

    printf("%d", v.x.s3); LUPA开源社区4F'ZcH;]

}LUPA开源社区7~j2aavL

3

?6d e e!l,UO0

--------------------------------------------------------------------------

&B{#yq5qN2M`0

15.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数LUPA开源社区 w9EJ,G3[6QS

A1:

%{d`sc0

16位的系统下,LUPA开源社区i-~ P?dw2y xY i

int i = 65536;

*\T"~"vJcp0

cout << i; // 输出0;LUPA开源社区#E'u3e/fp;[)a Je

int i = 65535;LUPA开源社区D ?.u;fu!Zq:Op

cout << i; // 输出-1;

@Y[Cs2u U0

32位的系统下,

"l/K8c"T/A`(DG M0

int i = 65536;LUPA开源社区zdfP;\F3g"Gl

cout << i; // 输出65536;

M'j:Ml8e1e0

int i = 65535;

'u h u:Q_9F ~m)bo0

cout << i; // 输出65535;

$k9`dn[ stE)J0

A2:

_:W:i*{i[ u _0

int a = ~0;LUPA开源社区:e#K.p VZ+D

if( a>65536 ) LUPA开源社区r@nF~

{

A,[&B3Ce V0

    cout<<"32 bit"<<endl;

"^4d |_4H w [c2^k!w0

}LUPA开源社区4]?_#E"i P

else

U.M OsY/Id/C0

{

HPF8l4CM0

    cout<<"16 bit"<<endl;

oHN$p3N_;v O3NI0

}LUPA开源社区3u,I*m)l2S5sP~5zG

--------------------------------------------------------------------------

#O4c-xm|Zo$Kg4I0

16.C和C++有什么不同?

fUo%vr.X F H {Y0

从机制上:c是面向过程的(但c也可以编写面向对象的程序);c++是面向对象的,提供了类。但是,

z9b,HR#\$OH&h4C!GR0

c++编写面向对象的程序比c容易

CUd6|YZ0

从适用的方向:c适合要求代码体积小的,效率高的场合,如嵌入式;c++适合更上层的,复杂的; llinux核心大部分是c写的,因为它是系统软件,效率要求极高。LUPA开源社区5Jj7hUx i,KU

从名称上也可以看出,c++比c多了+,说明c++是c的超集;那为什么不叫c+而叫c++呢,是因为c++比

$F2E8?u&V0

c来说扩充的东西太多了,所以就在c后面放上两个+;于是就成了c++

5`4b;F!nWLz)V9a3d0

C语言是结构化编程语言,C++是面向对象编程语言。LUPA开源社区t8QMt[p

C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。LUPA开源社区l~w5Q4mqU2?Q"A

--------------------------------------------------------------------------LUPA开源社区&qfz b)_ Pb

17.在不用第三方参数的情况下,交换两个参数的值LUPA开源社区#K `Q0kf|

#include <stdio.h>LUPA开源社区4OB2`NN&T\,w]u

void main()LUPA开源社区K-}3`v^e V

{LUPA开源社区,{8ij:M wT2C

        int i=60;

c)V.k h GY5j tAv0

        int j=50;LUPA开源社区|*Lb+jgO-z

        i=i+j;LUPA开源社区5]+]5b7kk/c9Be/y

        j=i-j;LUPA开源社区&T+d,h["JbN

        i=i-j;LUPA开源社区!}:|;?]:K$v

        printf("i=%d\n",i);LUPA开源社区;}#T5s#X!i6r

        printf("j=%d\n",j);

3cz9b w"n/s,Y]*Y0

}LUPA开源社区E"cJ(m8l)I,q6z:o

方法二:LUPA开源社区2m yD.Gu

i^=j;LUPA开源社区!w]|H8evT6aM

j^=i;

!]!CBGj&UH:t0

i^=j;

/pO\ ^1g.y8}0

方法三:LUPA开源社区 F4k,^ vo H I}

// 用加减实现,而且不会溢出

PqA:?J&A:rCm0

a = a+b-(b=a)

d3\rg'}6[7ry0

--------------------------------------------------------------------------LUPA开源社区jq]9Jc2y)rs

18.有关位域的面试题(为什么输出的是一个奇怪的字符)

3X&Vg5J,W:H {uC)e5?0

a.t = 'b';效果相当于 a.t= 'b' & 0xf;

p z\q%R Qry0

'b' --> 01100010

P ])A+h_&jO N])jr0

'b' & 0xf -->>00000010LUPA开源社区 TqoO9k,Z

所以输出Ascii码为2的特殊字符LUPA开源社区.S.r \ Do"O9p i

char t:4;就是4bit的字符变量,同样LUPA开源社区+}R3}!}R(V

unsigned short i:8;就是8bit的无符号短整形变量

Ei{ o[*ZI`0

--------------------------------------------------------------------------LUPA开源社区Rp%X;FptgWo

19.int i=10, j=10, k=3; k*=i+j; k最后的值是?

o'm1g+{L%e0

60

p+@MH"Vf kf0

--------------------------------------------------------------------------

#aV$trjJ0

20.进程间通信的方式有?

`I-\Q g MY0

进程间通信的方式有 共享内存, 管道 ,Socket ,消息队列 , DDE等

)Wt7~2yf+Qb c0

--------------------------------------------------------------------------LUPA开源社区5MAv Yiy8O

21.LUPA开源社区}-p"^]v+{D

struct A LUPA开源社区g5RuK'N)E(`

{

CY$E8M+u(L$Ne*P y0

char t:4; LUPA开源社区M u%A3IJhT X

char k:4; LUPA开源社区:Q'X:p pS Fs

unsigned short i:8; LUPA开源社区S u2]n p

unsigned long m; LUPA开源社区 tv;N*PraUf

} LUPA开源社区0keN8RSQ.U

sizeof(A)=?(不考虑边界对齐)LUPA开源社区Mgvl8h%e$q0k8E

7

\ye(k MT M6j0

struct CELL             // Declare CELL bit field

QG{;[7Q"a ]yn0

{

&^:W?#C"z a ~u0

   unsigned character : 8; // 00000000 ????????

^^*D Q)s+L3I.J0

   unsigned foreground : 3; // 00000??? 00000000

F6q1R aJw0

   unsigned intensity : 1; // 0000?000 00000000LUPA开源社区 s3eS$Z*K2dG!oj)m

   unsigned background : 3; // 0???0000 00000000

N M#{+^4c+X0

   unsigned blink      : 1; // ?0000000 00000000

h!z+M,c'G4KB:f0

} screen[25][80];       // Array of bit fieldsLUPA开源社区\0qBU7c6_}{Ev

二、位结构 LUPA开源社区f9v,X7n{'g Y Mlo

    位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构 LUPA开源社区oK5y P$^%l0m:V

比按位运算符更加方便。 LUPA开源社区#ba/R:a+mV I(P.e

    位结构定义的一般形式为:

3nWP6Ai:| I7z0

     struct位结构名{ LUPA开源社区QQ1l!Z*N5M*vT

          数据类型 变量名: 整型常数;

b W9CNu&oiO6Hm0

          数据类型 变量名: 整型常数; LUPA开源社区r%|.uz z(F f"_

     } 位结构变量; LUPA开源社区(h)Ga;q(^ r%|*c6W

    其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整

3B\-K#CeQ0

数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。

`:p8MC)U/n8dSi0

    变量名是选择项, 可以不命名, 这样规定是为了排列需要。 LUPA开源社区g$tsKV%AA'L M

    例如: 下面定义了一个位结构。

/KW eB`n~7liJ0

     struct{

#t|#iQ%t:US1L*Cz\0

          unsigned incon: 8; /*incon占用低字节的0~7共8位*/

:]IP{'o oP[%p3Gx-N0

          unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/

({c#f:{Xy$H(iGd0

          unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/ LUPA开源社区kw XR4{!oE

          unsigned blink: 1; /*blink占用高字节的第7位*/ LUPA开源社区;od8f^_lt W

     }ch; LUPA开源社区 b(k8pZY%Z]0WX

    位结构成员的访问与结构成员的访问相同。 LUPA开源社区0`kq2] f O"}/u5d"w

    例如: 访问上例位结构中的bgcolor成员可写成: LUPA开源社区6F'~rm.f*f0L__

      ch.bgcolor LUPA开源社区v _"_;O._uN

    注意:

pYH5@:W{U0

    1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长 LUPA开源社区 v]%U6qM#vD

度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。

t.t5TtkG9|*t0

    2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,

1N-d&D3~I$uEMg$`h0

如果是指针, 其成员访问方式同结构指针。

+h)y)Yw"Y q-@0

    3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字 LUPA开源社区{Ix-pG6?

节。

*D i`.T]4j(T0

    4. 位结构成员可以与其它结构成员一起使用。 LUPA开源社区%I2Q3[| f rTon

    例如: LUPA开源社区}3R LS%_4I i+@{

     struct info{

o4\1X:J?ze0

          char name[8]; LUPA开源社区Wu&T{2EjY

          int age;

y5C \ R ~|0

          struct addr address; LUPA开源社区8db{kAO|wl

          float pay;

!?&jkb.lx,Q0

          unsigned state: 1;

$I{-O5QQh-p0

          unsigned pay: 1; LUPA开源社区C,z@.`4S(l4g@

          }workers;LUPA开源社区0~I$q xr$D

    上例的结构定义了关于一个工人的信息。其中有两个位结构成员, 每个位结 LUPA开源社区2XF2hd`]7S

构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工 LUPA开源社区 N.j)I(@.VI

人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。LUPA开源社区 w)Z6E\&l5O:~E~

--------------------------------------------------------------------------

,x3gJLrmW%`xq+Y0

22.下面的函数实现在一个固定的数上加上一个数,有什么错误,改正 LUPA开源社区r [S:vs[vF#k

int add_n(int n) LUPA开源社区1Qg rW:H*gWEj

{ LUPA开源社区Dx8\%YE&T`

static int i=100;

+X#[:vLA-B;W0

i+=n; LUPA开源社区7cP6d6\ M[ rN

return i;

~$S;@/d:V@u0

} LUPA开源社区+Om4SL+Hrd

答:LUPA开源社区q5`gL2k{

因为static使得i的值会保留上次的值。

E |&g\T0

去掉static就可了

'NLq0MIY0

--------------------------------------------------------------------------LUPA开源社区0}H6z x6t8el

23.下面的代码有什么问题?LUPA开源社区g2]sO4\o

class A

2e'Qit}`["m0

{

9vel#R6i d0

public: LUPA开源社区]3hL4l5B1]$I

A() { p=this; } LUPA开源社区$[.G/f ]yY"e%T

~A() { if(p!=NULL) { delete p; p=NULL; } }

g1e+y2E;R0

A* p;

ksEx@0

};LUPA开源社区D.?6[EN%z

答:LUPA开源社区 w4~$Z2}X

会引起无限递归LUPA开源社区f#S0~n/y\.M2l

--------------------------------------------------------------------------

*s m ct7G0

24.

jyIV4xinv'aQ*w/q0

union a {LUPA开源社区D _&jSe.k

int a_int1;

rP4i(~D A0

double a_double;

m|4d:C,pFu;|0

int a_int2;

%M'p?'s4^1B0

};

#{&^"Z7`kE]P0

typedef structLUPA开源社区.O2|,e1D%\+J z

{

A'cp!`t$^_)|H0

a a1;

%@bjt_0

char y;

V~!\HIR"W@:u AQ0

} b;

-W Z/}3y[u1[-?0

class cLUPA开源社区;H#y+wd Y&~7X FCwqO

{LUPA开源社区"CSR0v;MVb

double c_double;

im9hT1^k0

b b1;

H+s}4fWRL(Ix0

a a2;

.un5j6BG0

};LUPA开源社区dZ:peT ]#`GhN*]

输出cout<<sizeof(c)<<endl;的结果?

z3Y0{VGFhG&X S,l0

答:LUPA开源社区6EK9\ ~7IoR

VC6环境下得出的结果是32

b"X~? w1g\X'U0

另:LUPA开源社区 XXt3t/qv

我(sun)在VC6.0+win2k下做过试验:LUPA开源社区y&~9N6vAM/~c

short - 2

e `i'J~n R0

int-4

u@'Sa/D6O9HH0

float-4

^ xMtw0

double-8

n7`Aw S&w'}o0

指针-4

s P)?0_"i2W3T.C)U$?j y0

sizeof(union),以结构里面size最大的为union的sizeLUPA开源社区/D8?XA0?/enu|m YL

----------------------------------------------------------------------------------

`G!AWFei0

25.i最后等于多少?

`"l4u'}/H\|5x0

int i = 1;

h2O r_ Hs4`0

int j = i++;LUPA开源社区vD!P,Zmz

if((i>j++) && (i++ == j)) i+=j;

#a TG$l/ILRR0

答:LUPA开源社区RC!c:q!E hZI

i = 5

r@Y*DCL8S;Bn,N_0

--------------------------------------------------------------------------LUPA开源社区 tL^0D{)FJ:H,N|

26.

-aD0v'r-Fc;cqH0

unsigned short array[]={1,2,3,4,5,6,7};LUPA开源社区U`J`i

int i = 3;

L2j j7J-n_ Y1N0

*(array + i) = ?

7x9X*t&~o$cH c G%s0

答:

VCd8S Z$^0

4LUPA开源社区LrMY{j,q P

--------------------------------------------------------------------------

NPL/N6u1kR0

27.

1c$Yb5mB` X }0

class A

zoA!m,kin0

{LUPA开源社区^4B3|4l,m@ z

virtual void func1();

%c2m^$_4H r'X0

void func2();LUPA开源社区;p/Q LSZ7jV:f2Y

}LUPA开源社区kf Kl{xk ~ Ng

Class B: class A

owhN/f0

{LUPA开源社区$]8p:t.{ J

void func1(){cout << "fun1 in class B" << endl;}LUPA开源社区p1L(Y/aO"Y(|/G

virtual void func2(){cout << "fun2 in class B" << endl;}

_OV$yt0

} LUPA开源社区7mi-Y.b]x:B*X n@

A, A中的func1和B中的func2都是虚函数.

i$aK nx;I!R7A[0

B, A中的func1和B中的func2都不是虚函数.

N3E^A"zX.Q0

C, A中的func2是虚函数.,B中的func1不是虚函数.

V5o}zL.Q6d&A0

D, A中的func2不是虚函数,B中的func1是虚函数.

'Svv!~(zSD _1C4fl0

答:

iGc G(?j7g#L!m JM@0

ALUPA开源社区S?1B({7nx

--------------------------------------------------------------------------

mvZ7E?^-kY0

28.LUPA开源社区 wt-Co^+i*~V

数据库:抽出部门,平均工资,要求按部门的字符串顺序排序,不能含有"human resource"部门,

a&_``e6?z+Q0

employee结构如下:employee_id, employee_name, depart_id,depart_name,wageLUPA开源社区:G3vJRS yY-t1ii"^

答:

_3o0}[VHJw0

select depart_name, avg(wage)

+P u1B:CK-BFU0

from employee

R ux6{j0

where depart_name <> 'human resource'LUPA开源社区2| NU s;}m

group by depart_name

qt#?n h{'t b9K0

order by depart_name

-]n\3~c Y0\:X0

--------------------------------------------------------------------------LUPA开源社区&d+}.P| Q#ii3`Ky

29.

+d3s;d`%og-HD'k0

给定如下SQL数据库:Test(num INT(4)) 请用一条SQL语句返回num的最小值,但不许使用统计功能,如MIN,MAX等LUPA开源社区0e~%W ^$V\9q,^

答:LUPA开源社区F+Qx![HC W,Ba

select top 1 num

.U)Pu~B-t0

from Test

r)`5cG-Q0

order by num descLUPA开源社区V dP2]2|V*ue

--------------------------------------------------------------------------

4OHS(sM]-z5|3z0

30.LUPA开源社区p mr-e3o ^$Z

输出下面程序结果。

'{R)E3CR"H+n(U0

#include <iostream.h>LUPA开源社区3`~T)k[#l K)M

class A

-RS;d'X L)]E0

{ LUPA开源社区OLumVf

public:

kQW k| SC0

virtual void print(void)

DNk3f7l6B%Z0Z0

{ LUPA开源社区q3m'P OLp}

    cout<<"A::print()"<<endl; LUPA开源社区&~%Zd v#o_

}

*_eX yLcRf0

};LUPA开源社区2`1lb(Fj}?:d7G

class B:public A LUPA开源社区[g _(f3z

{ LUPA开源社区bnvBA*a&r:K

public:LUPA开源社区 v;F-{&E$F^Y6j2Z

virtual void print(void) LUPA开源社区6_~+Mhp,{:} RG

{ LUPA开源社区.n?cmGp&o

   cout<<"B::print()"<<endl;LUPA开源社区$IRh!PE

};

E @E['k%C0

}; LUPA开源社区,L0GB3o1zY

class C:public B

B-J4N5O'P B:]0

{LUPA开源社区LWHsh1^$n

public:LUPA开源社区,vqI"dknnB G

virtual void print(void)LUPA开源社区T6}W]5{0U8_

{LUPA开源社区:g4?"r%{$^

   cout<<"C::print()"<<endl;

%n,Xa%U k@9e)ff0

}

P@F2o9rG%IKr0

};

RD'}O*A,Yp.~)R l |*W0

void print(A a) LUPA开源社区:i)M^yo8t

{ LUPA开源社区!D ujeO!Y&v{"t

   a.print();

2\#Bnh p0

}

4lU"PacCV7AG0

void main(void)

2md"U7|"\,R5EUic0

{

_mY/nJZ0

   A a, *pa,*pb,*pc; LUPA开源社区Z ED2c5g`[9XVYOD^

   B b; LUPA开源社区'_1g\;K.S`

   C c; LUPA开源社区3]"z]nUn-i yh @

   LUPA开源社区%~V~.W-C EU1XV c4\

   pa=&a; LUPA开源社区A[!_I.iN3w[`

   pb=&b; LUPA开源社区1NbTb+E I!fnj_

   pc=&c;

%| Nl&s"KE/FS0

   LUPA开源社区 s:b.uFLj;H] k#[

   a.print();

$F`U6cJu3L N0

   b.print(); LUPA开源社区@O J&Ag;\4P&e

   c.print(); LUPA开源社区u(}6_@h)G-\

  

pKEB(u@0

   pa->print(); LUPA开源社区5k/y2EZehN n,S

   pb->print();

-O-s3@_.\'M [0

   pc->print(); LUPA开源社区 ty-m&o7c;XPo I/|6y

   LUPA开源社区0`lG$B!ul0S,? uu

   print(a);

6T+^f_ HN0

   print(b);

Xn"_9K3m3M9E5sp:P0

   print(c);

bX@7^wB!L\ h8z0

}

{*Mt3yG-j+a)n0

A:

m0c~]a.\WI H0

A::print()LUPA开源社区_7q1[ G\]#M b

B::print()

5i7J2@vk0

C::print()LUPA开源社区(j3Qg(qX8q U"[ B

A::print()LUPA开源社区*}t!sr[K7k-P

B::print()LUPA开源社区*S d7wz+X)kGY

C::print()LUPA开源社区$W iW"B&M*GBTA

A::print()LUPA开源社区8Y1|mx1u"K$Nb

A::print()

/X,WX Ut3}2Z0

A::print()LUPA开源社区p.Aw/kY#[%N+d

--------------------------------------------------------------------------LUPA开源社区G9u-O(d7K6w

31.LUPA开源社区6B.GS8n/N7nd%K1L

试编写函数判断计算机的字节存储顺序是开序(little endian)还是降序(bigendian)LUPA开源社区 }Z#gc!Q4v!Zq8cf

答:LUPA开源社区qxb \-nu-g M k

bool IsBigendian()

)g L4[Q ?*n"Nb0

{

s ?8G4} q"N2cz0

unsigned short usData = 0x1122;

F*^1D;Dg9A0

unsigned char *pucData = (unsigned char*)&usData;

+e7]/XO*hy!G%@1v3^+L W0V0

return (*pucData == 0x22);LUPA开源社区s/n*b U/Y2Z9?m

}LUPA开源社区#{(J1ZU)VsTP

--------------------------------------------------------------------------

`[T1Gd mP0

32.简述Critical Section和Mutex的不同点LUPA开源社区 M{e!~#Vd6w;e2Gs{JQ

答:

)V+uQ1n\!K2v$Q0

对几种同步对象的总结

X&t|Gwq2E0

1.Critical SectionLUPA开源社区V D7z&[ H \E

A.速度快LUPA开源社区:MbQA^R"@

B.不能用于不同进程

8KSK[C ?)rXy0

C.不能进行资源统计(每次只可以有一个线程对共享资源进行存取)LUPA开源社区gf%k&{ @@$q%pq5h'O

2.Mutex

$w8bR@S"X N$UiT0

A.速度慢LUPA开源社区L$Qc fl&b)[

B.可用于不同进程LUPA开源社区aj H4\;N?Q

C.不能进行资源统计LUPA开源社区QV/`}q8Pc

3.Semaphore

2p1k$z(F)j5B0

A.速度慢

){p)p }h*@wq0

B.可用于不同进程

5tN oZwn KU0

C.可进行资源统计(可以让一个或超过一个线程对共享资源进行存取)LUPA开源社区3o1{,^zeu

4.Event

n.d Yl n"Q7q-X0

A.速度慢LUPA开源社区5a"\b.XMlVh

B.可用于不同进程LUPA开源社区nK8z{en

C.可进行资源统计LUPA开源社区NpS~Ny [\e

--------------------------------------------------------------------------

G%r-p7e4T;{`0

33.一个数据库中有两个表:LUPA开源社区'p*W!C%Sw Q

一张表为Customer,含字段ID,Name;LUPA开源社区!Op|DmD W

一张表为Order,含字段ID,CustomerID(连向Customer中ID的外键),Revenue;LUPA开源社区;pPQ(X'CE5a

写出求每个Customer的Revenue总和的SQL语句。LUPA开源社区 rtyG3Vx$j,^5[

建表

)u4~ P-Z&`8n0

create table customerLUPA开源社区&O*GVoh3W#{E.j*g:z

(

Q5j;{{ W0

ID int primary key,Name char(10)LUPA开源社区|.?XjM)x6O9[Ce.i

)

,nO-q? R?$A`s;t0

goLUPA开源社区n0eu9qoRw/Pd cF

create table [order]LUPA开源社区x#|$R+DSQZ A@k

(

!?to/K)q:p0

ID int primary key,CustomerID int foreign key references customer(id) , Revenue floatLUPA开源社区?B(O |e/|I?

)LUPA开源社区NH3l9\]#hP!N"p C

go

1mZ9U'?;BO;j SDct,B0

--查询

m4@] z.LAP ai0

select Customer.ID, sum( isnull([Order].Revenue,0) )

q@8E4cZ1ba%S0

from customer full join [order] LUPA开源社区h}c*c(F%Qv0}z2b

on( [order].customerid=customer.id )

)[v0y;s"n0

group by customer.id

.H3X*m!xk'{8H T9C.g0

--------------------------------------------------------------------------LUPA开源社区V3U1b y.Y7n{mR

34.请指出下列程序中的错误并且修改

{Tm(CR2KQP0

void GetMemory(char *p){

Y6PP.\Ef)t;[L0

p=(char *)malloc(100);

0o{&s3s;L'J2fs*Ii]0

}LUPA开源社区Y RLp;s

void Test(void){

F H!jot-o5e:X0

char *str=NULL;LUPA开源社区^*yU ][1J za]

GetMemory=(str);LUPA开源社区5m-o~smLp0^ K.g

strcpy(str,"hello world");LUPA开源社区cn*d%M|j@"H {l

printf(str);

V#T``-W9I0

}LUPA开源社区"tku |dtjz4T

A:错误--参数的值改变后,不会传回LUPA开源社区W1OYII-H|i

GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。

*Y8V(~#h&g;~0

strcpy(str, "hello world");将使程序崩溃。

^-m)sCr1q0

修改如下:

~%Zp&Ss_$~'K)zW'R7tR0

char *GetMemory(){

?;yy+n(?Tb0

char *p=(char *)malloc(100);

M8Fwxw0

return p;LUPA开源社区3y/x.e%kWg:J3JM

}

7`0\-x!b h0

void Test(void){

juw:f*TjR1U0p M*U0

char *str=NULL;

(Dyoad!S7Y2l0

str=GetMemory(){LUPA开源社区+h4]'evaS

strcpy(str,"hello world");

"xyh!~4L/_\d Va)I0

printf(str);LUPA开源社区D S5i#|N8e8zDQ0H

}

-T2NO6@LH$DP0

方法二:void GetMemory2(char **p)变为二级指针.

P'a$yE_d#u Z$i0

void GetMemory2(char **p, int num)

u8~!c.P1qF0

{

HS;_A;wnBW0u,n0

*p = (char *)malloc(sizeof(char) * num);

k6w0Cm.W.V,Zn0

}

`-RD {;VL0

--------------------------------------------------------------------------LUPA开源社区 Ty+uKL'Bp

35.程序改错

,^:^gS~0

class mml

_5f:@`7ZX2m/t {0

{LUPA开源社区lzy f y'Ty7N

private:

:U$V[W|T2f.w,Ea'\0ZC?0

    static unsigned int x;LUPA开源社区 NtPo`j;v1yHR

public:LUPA开源社区&M:|!i'L!ja

    mml(){ x++; }

alXu"| RQ;a;zCR'e0

    mml(static unsigned int &) {x++;}

s$a{8d6g+Y&s1V&yn'^R'P0

    ~mml{x--;}LUPA开源社区"w;~ Dva+m(b

pulic:

F$@\"q'mvTa0

    virtual mon() {} = 0;

yq5R@Pd0

    static unsigned int mmc(){return x;}

-w6a4O-y/f:H0

    ......                      LUPA开源社区'}/?M0HH.p)} B;EM

};

7w%Q&v[9n0_/n,]0

class nnl:public mmlLUPA开源社区M&uN"bG(h

{

e FAG8uNg'Qio"_&Q Y0

private:LUPA开源社区 jT4`0q5R7Q:XS

    static unsigned int y;

'|G$kf+m?F M.{"K0

public:LUPA开源社区o@7p#g(oE{!C

    nnl(){ x++; }

:NTtOGGZK;O^0

    nnl(static unsigned int &) {x++;}

)?$O,w;r$]4|6f0

    ~nnl{x--;}

ddQ"e.lRf0wz4X0

public:LUPA开源社区g-cP8w&NGW%q1Kk'e{

    virtual mon() {};

3mO0z.Z u(s0

     static unsigned int nnc(){return y;}LUPA开源社区-wT['z.X+S

    ......                  

9v(E|xi:S/PO0

};LUPA开源社区cRb |z$v \K

代码片断:LUPA开源社区w/n M8LyBr f

mml* pp = new nnl;

-_$lc K0a&uBnL X1}0

..........

"}Co ?0e8u0

delete pp;

(D5r[k[WE h0

A:

h m.La'nW%M0

基类的析构函数应该为虚函数

6l8{~c4^?*w0

virtual ~mml{x--;}LUPA开源社区arLkI};_"I~

--------------------------------------------------------------------------LUPA开源社区&zWY [g7n|

36.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。

~7m2[!h8HwuLY0

答:

8E5i9\ T#R ^0

101个先取出2堆,LUPA开源社区 [-BZ6[e,C*AZ!c'b F

33,33LUPA开源社区@w6g;o7A3k

第一次称,如果不相等,说明有一堆重或轻

L8H!~Poyl t+\0

那么把重的那堆拿下来,再放另外35个中的33

+aR6Q}5o oS8fD;p0

如果相等,说明假的重,如果不相等,新放上去的还是重的话,说明假的轻(不可能新放上去的轻)

t/Z+}XqV0

第一次称,如果相等的话,这66个肯定都是真的,从这66个中取出35个来,与剩下的没称过的35个比LUPA开源社区Pifn$Xb {

下面就不用说了

t\I)F/URBn0

方法二:

B oE2XW'J f6P0

第3题也可以拿A(50),B(50)比一下,一样的话拿剩下的一个和真的比一下。

/W,f {:e%o6l'v0

如果不一样,就拿其中的一堆。比如A(50)再分成两堆25比一下,一样的话就在LUPA开源社区)?$|-Mo J-z

B(50)中,不一样就在A(50)中,结合第一次的结果就知道了。LUPA开源社区2r;Q(n*m)y v E0p

--------------------------------------------------------------------------

ZHk9L(p SY&|4`.L0

37.static变量和static 函数各有什么特点?

i RT8?uy0fe0

答:LUPA开源社区fd.q\{%M

static变量:在程序运行期内一直有效,如果定义在函数外,则在编译单元内可见,如果在函数内,在在定义的block内可见;LUPA开源社区g4I*g#G.\1B4Q

static函数:在编译单元内可见;

JBN ^x(r&M!d|*g%M0

--------------------------------------------------------------------------LUPA开源社区;I9cs#m*r%{Qau S

38.用C 写一个输入的整数,倒着输出整数的函数,要求用递归方法 ;

Yii*U0?7{-s q6o0

答:

5b0eu)z{/Z!w1x0

void fun( int a )

Ds y ~p*sc|_0

{

)q(pfqHj0

printf( "%d", a%10 );LUPA开源社区u.n i9~Rcu

a /= 10;

I:fcbp\ D0

if( a <=0 )return;

9i,Zl#MH"fP0

fun( a );LUPA开源社区-dx7L CVwY`3R'S

}

+g0c&{P(h7F0

--------------------------------------------------------------------------

3jr4f"yGo^+l0

39.写出程序结果:

5F*y6S\bqB5}0

void Func(char str[100])

'f a(}C\1j+s m8Q0

{LUPA开源社区$~zU1u~z0[H*m E

printf("%d\n", sizeof(str));

so9]_H)R0

}LUPA开源社区#Tn$PE`tZo&IN%N

答:LUPA开源社区F6H)OHty

4LUPA开源社区.F&ggG)]zn/g{f

分析:LUPA开源社区C%^gg!I^

指针长度LUPA开源社区upKm:d d;T

--------------------------------------------------------------------------

Tv,m/XR/d0

40.int id[sizeof(unsigned long)];LUPA开源社区 {|.p:z/V${ r y A

    这个对吗?为什么??LUPA开源社区0ANj.ku{

答:LUPA开源社区/NQk)N$H

S |N[ zt;g2qt0

这个 sizeof是编译时运算符,编译时就确定了

cY _L;]*? |0

可以看成和机器有关的常量。LUPA开源社区r"I;R}h


TAG:

引用 删除 312005972   /   2008-07-04 03:11:27
不错.
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-09-05  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 1750
  • 日志数: 49
  • 图片数: 1
  • 建立时间: 2008-02-28
  • 更新时间: 2008-08-30

RSS订阅

Open Toolbar