浙江大华笔试题

1、请写出下面程序的输出结果:

int count = 3;  

int main(void)  

{  

    int i, sum, count = 2;  

    for(i=0,sum=0; i

    {  

        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;  

答案: 4  20

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;  

}  

答案:C 11 D 4 A 4 B 9 E 10 F 9

3、请写出下面程序的输出结果:

#include ;  

int func(std::vector;vec)  

{  

    static int k = 2;  

    std::vector;::reverse_iterator it;  

    for(it = vec.rbegin(); it!=vec.rend(); ++it)  

    {  

        k += *it%2==0? ++*it: (*it)++;  

    }  

    return k;  

}  

int main(void)  

{  

    std::vector;vec;  

    for(int i = 0; i<4; i++)  

    {  

        vec.push_back(i);  

        printf("%d ",func(vec));  

    }  

    return 0;  

}  

答案: 3  5  10  18

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;  

}  

答案: A 2 A 4 C 4 D 4 B 4

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;  

}

答案:  -3 11 -2 2 

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;  

答案:0  0  5  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;  

}  

答案:0  1  2  0  9

1、函数checkstr判断一字符串是不是对称的。其中msg为输入的字符串,对称返回0,不对称返回-1,实现该函数。

答案:int checkstr(const char *msg);

int checkstr(const char *msg)  

{  

    int len = strlen(msg);  

    int i, j;  

    for(i = 0,j = len-1; i <= j; i++,j--)  

    {  

        if(msg[i] != msg[j])  

            break;  

    }  

    if(i>;j)  

        return 0;  

    else  

        return -1;  

}  

2、给出一个单向链表的头指针,输出该链表中倒数第K个节点的指针,链表的倒数第0个节点为链表的尾节点(尾节点的next成员为NULL

答案:

typedef struct Node

{

         struct Node *next;

}NODE;

NODE* findnode(NODE *head,unsigned int k);

思路:在遍历时维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步之前,第二个指针p保持不动;

在第k-1步开始,第二个指针p也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个(走在前面的)指针pcur到达链表的尾结点时,第二个指针指针p正好是倒数第k个结点。

这种思路只需要遍历链表一次。对于很长的链表,只需要把每个结点从硬盘导入到内存一次。因此这一方法的时间效率比较高。

typedef struct Node  

{  

    struct Node *next;  

}NODE;  

  

NODE* findnode(NODE *head, unsigned int k)  

{  

    if(head==NULL)  

        return NULL;  

    NODE *p, *pcur;  

    pcur = head;  

    for(unsigned int i = 0; i < k; i++)  

    {  

        if(pcur->;next != NULL)     //在第k-1步之前,第二个指针p保持不动  

            pcur = pcur->;next;  

        else  

            return NULL;      //k比链表中节点的数目要大,找不到倒数第k个节点,直接返回空  

    }  

    p = head;  

    while(pcur->;next)  

    {  

        pcur = pcur->;next;  

        p = p->;next;  

    }  

    return p;  

}  

1、简述动态链接库DLL和静态链接库lib的差别。

答案:差别:静态lib将各个调用函数都封装在生成的可执行文件中(.exe),而动态DLL则在需要时才动态地装载和所载DLL文件,动态DLL还可以利用到操作系统中既存的库文件。

2、请简述MFC中的窗口收到WM_PAINT消息是如何处理的,什么情况下会产生WM_PAINT消息。

答案:处理:BeginPaint开始画,就是用白刷去掉原窗口,GetClientPaint获得窗口显示区域和尺寸等信息并绘制,EndPaint释放绘图句柄。

3、请简述Critical Section MutexSemaphore的功能和差别

答案:功能:都是用来解决共享变量或区域的访问问题,防止读写冲突。区别:Critical Section是在用户方式下实现同步,其他两个是系统内核对象。Mutex是只有获得锁的进程才能释放,而semaphore可由其他进程释放,一般mutex用于保护关键代码区域,而semaphore用于保护变量。

4、简述多线程程序对比单线程程序的优点和缺点。

答案:优点:多线程程序可以分时处理,用户因此可以同时高效地执行多个任务,用户体验好;缺点:线程切换有额外的代价,所以花费的总时间要长于单线程程序。

 

 由“ 名企笔试题库”收集整理 

你可能感兴趣的:(名企笔试题)