C/C++工程师综合练习卷

来源:互联网 发布:visio 数据流程图 编辑:程序博客网 时间:2024/04/28 21:29
1下面描述正确的是
int *p1 = new int[10]; int *p2 = new int[10](); 
p1和p2申请的空间里面的值都是随机值
p1和p2申请的空间里的值都已经初始化
p1申请的空间里的值是随机值,p2申请的空间里的值已经初始化
p1申请的空间里的值已经初始化,p2申请的空间里的值是随机值


2下面的程序可以从1....n中随机等概率的输出m个不重复的数。
knuth(int n, int m){     srand((unsigned int)time(0));     for (int i = 0; i < n; i++) {         if ( ) {             cout << i << endl;             ( );         }      } }
rand()%(n-i)<=m m--
rand()%(n-i)<m m--
rand()%(n-i)>=m m++
rand()%(n-i)>m m++

3 以下prim函数的功能是分解质因数。括号内的内容应该为?
void prim(int m, int n) {     if (m > n)     {         while (        ) n++;         (     );         prim(m, n);         cout << n << endl;     } }
m/n m/=n
m/n m%=n
m%n m%=n
m%n m/=n


4
enum string{        x1,        x2,        x3=10,        x4,        x5,    } x;
问x等于什么?
5
12
0
随机值
//在c语言中,这样写法一般是全局变量,程序初始化时会清零.

5
unsigned char *p1; unsigned long *p2; p1=(unsigned char *)0x801000; p2=(unsigned long *)0x810000;
请问p1+5= 什么?
p2+5= 什么?
801005 810005
801010 810014
801005 810014
801010 810015

6 在32位机器中,如下代码:
void example(char acWelcome[]){    printf("%d",sizeof(acWelcome));    return;}void main(){    char acWelcome[]="Welcome to Huawei Test";    example(acWelcome);    return;}
的输出是?
0
4
23
24

7 下面关于虚函数和函数重载的叙述不正确的是
虚函数不是类的成员函数
虚函数实现了C++的多态性
函数重载允许非成员函数,而虚函数则不行
函数重载的调用根据参数的个数、序列来确定,而虚函数依据对象确定

8 处理a.html文件时,以下哪行伪代码可能导致内存越界或者抛出异常()
  int totalBlank = 0;         int blankNum = 0;         int taglen = page.taglst.size();A       for(int i = 1; i < taglen-1; ++i)        {                 //check blankB             while(page.taglst[i] == "<br>" && i < taglen)               {C                       ++totalBlank;D                       ++i;               }E             if(totalBlank > 10)F                      blankNum += totalBlank;G             totalBlank = 0;        }
注意:以下代码中taglen是html文件中存在元素的个数,a.html中taglen的值是15,page.taglst[i]取的是a.html中的元素,例如page.taglst[1]的值是<html>
a.html的文件如下:
<html><title>test</title><body><div>aaaaaaa</div></body></html><br><br><br><br><br>

A
B
C
D
E
F
G


9
void Func(char str_arg[100]){       printf("%d\n",sizeof(str_arg));}int main(void){     char str[]="Hello";     printf("%d\n",sizeof(str));    printf("%d\n",strlen(str));    char*p=str;    printf("%d\n",sizeof(p));    Func(str);}
32位系统下下面程序的输出结果为多少?
5 5 4 4
6 5 4 4
6 5 6 4
5 5 5 100
//对字符串进行sizeof操作的时候,会把字符串的结束符"\0"计算进去的,进行strlen操作求字符串的长度的时候,不计算\0的。
数组作为函数参数传递的时候,已经退化为指针了,Func函数的参数str_arg只是表示一个指针,那个100不起任何作用的。

10
下面程序运行后的结果为:
char str[] = "glad to test something";char *p = str;p++;int *p1 = static_cast(p);p1++;p = static_cast(p1);printf("result is %s\n", p);

glad to test something
ad to test something
test something
to test something
//
p的类型为char *,p++后p指向str数组的第2个元素即字母“l”的位置。
p1的类型为int *,p1++后p1指向的位置增加4个字节,指向str数组中的第6个元素即字母“t”的位置。
因此最后p的内容为“to test something”。


11
设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为?
C c;void main(){    A*pa=new A();    B b;    static D d;    delete pa;}
A B C D
A B D C
A C D B
A C B D


12 若char是一字节,int是4字节,指针类型是4字节,代码如下:
class CTest{    public:        CTest():m_chData(‘\0’),m_nData(0)        {        }        virtual void mem_fun(){}    private:        char m_chData;        int m_nData;        static char s_chData;};char CTest::s_chData=’\0’;
问:
(1)若按4字节对齐sizeof(CTest)的值是多少?
(2)若按1字节对齐sizeof(CTest)的值是多少?
请选择正确的答案。

16 4
16 10
12 9
10 10
//,结果是12= 4(虚表指针)+1(char )+3(对齐补位)+4(int)

13 在Java中,以下关于方法重载和方法重写描述正确的是?

方法重载和方法的重写实现的功能相同
方法重载出现在父子关系中,方法重写是在同一类中
方法重载的返回值类型必须一致,参数项必须不同
方法重写的返回值类型必须相同。(或是其子类)


14 下列给定程序中,函数fun的功能是:求ss所指字符串数组中长度最短的字符串所在的行下标,作为函数值返回,并把其串长放在形参n所指的变量中。ss所指字符串数数组中共有M个字符串,且串长小于N。 
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 
试题程序。
#define M 5 #define N 20 int fun(char(* ss)[N], int *n) {     int i, k = 0, len = N;     for (i = 0; i < ______; i++)     {         len = strlen(ss[i]);         if (i == 0)             *n = len;         if (len ____ * n);         {             *n = len;             k = i;         }     }     return ( _____ ); } main( ) {     char ss[M][N] = {"shanghai", "guangzhou", "beijing", "tianjing", "chongqing"};     int n, k, i;     printf("\nThe originalb stringsare:\n");     for (i = 0; i < M; i++)         puts(ss[i]);     k = fun(ss, &n);     printf("\nThe length of shortest string is: % d\n", n);     printf("\nThe shortest string is: % s\n", ss[k]); }
N < k
N > k
M < k
M > k


15 写出下面程序的输出结果
class A{public: void FuncA() {     printf( "FuncA called\n" ); } virtual void FuncB() {     printf( "FuncB called\n" ); }};class B : public A{public: void FuncA() {     A::FuncA();     printf( "FuncAB called\n" ); } virtual void FuncB() {     printf( "FuncBB called\n" ); }};void main( void ){ B  b; A  *pa; pa = &b; A *pa2 = new A; pa->FuncA(); ( 3)  pa->FuncB(); ( 4) pa2->FuncA(); ( 5) pa2->FuncB(); delete pa2;}

FuncA called FuncB called FuncA called FuncB called
FuncA called FuncBB called FuncA called FuncB called
FuncA called FuncBB called FuncAB called FuncBB called
FuncAB called FuncBB called FuncA called FuncB called


16
In the main() function, after ModifyString(text) is called, what’s the value of ‘text’?

int FindSubString( char* pch ){    int   count  = 0;    char  * p1   = pch;    while ( *p1 != '\0' )    {            if ( *p1 == p1[1] - 1 )        {            p1++;            count++;        }else  {            break;        }    }    int count2 = count;    while ( *p1 != '\0' )    {        if ( *p1 == p1[1] + 1 )        {            p1++;            count2--;        }else  {            break;        }    }    if ( count2 == 0 )        return(count);    return(0);}void ModifyString( char* pText ){    char  * p1   = pText;    char  * p2   = p1;    while ( *p1 != '\0' )    {        int count = FindSubString( p1 );        if ( count > 0 )        {            *p2++ = *p1;            sprintf( p2, "%i", count );            while ( *p2 != '\0' )            {                p2++;            }            p1 += count + count + 1;        }else  {            *p2++ = *p1++;        }    }}void main( void ){    char text[32] = "XYBCDCBABABA";    ModifyString( text );    printf( text );}  

XYBCDCBABABA
XYBCBCDAIBAA
XYBCDCBAIBAA
XYBCDDBAIBAB


17 下面程序的功能是输出数组的全排列。请填空。
void perm(int list[], int k, int m){    if (    )    {        copy(list,list+m,ostream_iterator<int>(cout," "));        cout<<endl;        return;    }    for (int i=k; i<=m; i++)    {        swap(&list[k],&list[i]);        (    );        swap(&list[k],&list[i]);    }}

k!=m 和 perm(list,k+1,m)
k==m 和 perm(list,k+1,m)
k!=m 和 perm(list,k,m)
k==m 和 perm(list,k,m)


18
写出下列程序的运行结果。
#include "stdio.h"int sum(int a){    auto int c = 0;    static int b = 3;    c += 1;    b += 2;    return (a + b + c);}int main(){    int i;    int a = 2;    for (i = 0; i < 5; i++)     {         printf("%d,", sum(a));     } } 
6,8,10,12,14,
8,10,12,14,16,
10,12,14,16,18
12,14,16,18,20


19
#include<iostream>using namespace std;class MyClass{public:    MyClass(int i = 0)    {        cout << i;    }    MyClass(const MyClass &x)    {        cout << 2;    }    MyClass &operator=(const MyClass &x)    {        cout << 3;        return *this;    }    ~MyClass()    {        cout << 4;    }};int main(){    MyClass obj1(1), obj2(2);    MyClass obj3 = obj1;    return 0;}
运行时的输出结果是()
11214444
11314444
122444
123444


20
如下代码输出结果是什么?
#include<stdio.h>char *myString(){    char buffer[6] = {0};    char *s = "Hello World!";    for (int i = 0; i < sizeof(buffer) - 1; i++)    {        buffer[i] = *(s + i);    }    return buffer;}int main(int argc, char **argv){    printf("%s\n", myString());    return 0;}
Hello
Hello World!
Well

以上全部不正确

//

函数char *myString()中没有使用new或者malloc分配内存,所有buffer数组的内存区域在栈区
随着char *myString()的结束,栈区内存释放,字符数组也就不存在了,所以会产生野指针,输出结果未知 


0 0
原创粉丝点击