C/C++面试题

 

1.介绍一下STL,详细说明STL如何实现vector.

    Answer:

    STL (标准模版库,Standard Template Library.它由容器算法迭代器组成。

    STL有以下的一些优点:可以方便容易地实现搜索数据或对数据排序等一系列的算法;调试程序时更加安全 和方便;即使是人们用STL在UNIX平台下写的代码你也可以很容易地理解(因为STL是跨平台的)。

    vector实质上就是一个动态数组,会根据数据的增加,动态的增加数组空间。

2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。

    Answer:

    在学习VC++ 的过程中,遇到的LNK2001错误的错误消息主要为:unresolved external symbol “symbol”(不确定的外部“符号”)。

    如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。

    一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。

    编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误。

3.继承和委派有什么分别,在决定使用继承或者委派的时候需要考虑什么。

    在OOD,OOP中,组合优于继承。

    当然多态的基础是继承,没有继承多态无从谈起。

    当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。

    当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类。

4.指针和引用有什么分别;如果传引用比传指针安全 ,为什么?如果我使用常量指针难道不行吗?

    (1) 引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值。

    (2) 不存在NULL引用,引用必须与合法的存储 单元关联;而指针则可以是NULL.(3) 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象。给引用赋值并不是改变它和原始对象的绑定关系。

    (4) 引用的创建和销毁并不会调用类的拷贝构造函数(5) 语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换。

    不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,显得很安全。

    const 指针仍然存在空指针,并且有可能产生野指针。

    总的来说:引用既具有指针的效率,又具有变量使用的方便性和直观性。

5.参数传递有几种方式;实现多态参数传递采用什么方式,如果没有使用某种方式原因是什么;传值,传指针或者引用

6.结合一个项目说明你怎样应用设计模式的理念。

    设计模式更多考虑是扩展和重用,而这两方面很多情况下,往往会被忽略。

    不过,我不建议滥用设计模式,以为它有可能使得简单问题复杂化。

7.介绍一下你对设计模式的理解。(这个过程中有很多很细节的问题随机问的)

    设计模式概念是由建筑设计师Christopher Alexander提出:"每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。"上述定义是对设计模式的广义定义。将其应用到面向对象软件的领域内,就形成了对设计模式的狭义定义。

    可以简单的认为:设计模式就是解决某个特定的面向对象软件问题的特定方法, 并且已经上升到理论程度。

    框架与设计模式的区别:1,设计模式和框架针对的问题域不同。设计模式针对面向对象的问题域;框架针对特定业务的问题域2,设计模式比框架更为抽象。设计模式在碰到具体问题后,才能产生代码;框架已经可以用代码表示3,设计模式是比框架更小的体系结构元素。框架中可以包括多个设计模式设计模式就像武术中基本的招式。将这些招式合理地纵组合起来,就形成套路(框架),框架是一种半成品。

8.C++ 和C定义结构的分别是什么。

    C language 的结构仅仅是数据的结合C plus plus的struct 和 class 其实具备几乎一样的功能,只是默认的访问属性不一样而已。

9.构造函数可否是虚汗数,为什么?析构函数呢,可否是纯虚的呢?

    构造函数不能为虚函数,要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。

    析构函数可以为纯虚函数。

10,拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等。

    深拷贝意味着拷贝了资源和指针,而浅拷贝只是拷贝了指针,没有拷贝资源这样使得两个指针指向同一份资源,造成对同一份析构两次,程序崩溃。

    临时对象的开销比局部对象小些。

11.结合1个你认为比较能体现OOP思想的项目,用UML来描述。(最好这个项目继承,多态,虚函数都有体现)这个问题大概会占面试时间的一半,并且会问很多问题,一不小心可能会被问住)。

    ……

12.基类的有1个虚函数,子类还需要申明为virtual吗?为什么。

    不申明没有关系的。

    不过,我总是喜欢显式申明,使得代码更加清晰。

13.C也可以通过精心封装某些函数功能实现重用,那C++的类有什么优点吗,难道仅仅是为实现重用。

    并不仅仅是这样的。

    OOD,OOP从根本上改变了程序设计模式和设计思想,具备重大和深远的意义。

    类的三大最基本的特征:封装,继承,多态。

14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系。

    多态的基础是继承,需要虚函数的支持,简单的多态是很简单的。

    子类继承父类大部分的资源,不能继承的有构造函数,析构函数,拷贝构造函数,operator=函数,友元函数等等

15.为什么要引入抽象基类和纯虚函数?

    主要目的是为了实现一种接口的效果。

16.介绍一下模板和容器。如何实现?(也许会让你当场举例实现)

    模板可以说比较古老了,但是当前的泛型编程实质上就是模板编程。

    它体现了一种通用和泛化的思想。

    STL有7种主要容器:vector,list,deque,map,multimap,set,multiset.

17.你如何理解MVC.简单举例来说明其应用。

    MVC模式是observer 模式的一个特例,典型的有MFC里面的文档视图架构。

18,多重继承如何消除向上继承的二义性。

    使用虚拟继承即可。

 

1. 以下三条输出语句分别输出什么? [C ]

char str1[]       = "abc";

char str2[]       = "abc";

const char str3[] = "abc";

const char str4[] = "abc";

const char* str5  = "abc";

const char* str6  = "abc";

cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?

Cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?

Cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?

 

13. C++ 内建型别 A B ,在哪几种情况下 B 能隐式转化为 A [C++ 中等 ]

答:

a. class B : public A { …… } // B 公有继承自 A ,可以是间接继承的

b. class B { operator A( ); } // B 实现了隐式转化为 A 的转化

c. class A { A( const B& ); } // A 实现了 non-explicit 的参数为 B (可以有其他带默认值的参数)构造函数

d. A& operator= ( const A& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个

 

12. 以下代码中的两个 sizeof 用法有问题吗? [C ]

void UpperCase( char str[] ) // str 中的小写字母转换成大写字母

{

    for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++I )

        if( 'a'<=str[i] && str[i]<='z' )

            str[i] -= ('a'-'A' );

}

char str[] = "aBcDe";

cout << "str 字符长度为 : " << sizeof(str)/sizeof(str[0]) << endl;

UpperCase( str );

cout << str << endl;

 

7. 以下代码有什么问题? [C ]

void char2Hex( char c ) // 将字符以 16 进制表示

{

    char ch = c/0x10 + '0'; if( ch > '9' ) ch += ('A'-'9'-1);

    char cl = c%0x10 + '0'; if( cl > '9' ) cl += ('A'-'9'-1);

    cout << ch << cl << ' ';

}

char str[] = "I love 中国 ";

for( size_t i=0; i<strlen(str); ++I )

    char2Hex( str[i] );

cout << endl;

 

4. 以下代码有什么问题? [C++ ]

struct Test

{

    Test( int ) {}

    Test() {}

    void fun() {}

};

void main( void )

{

    Test a(1);

    a.fun();

    Test b();

    b.fun();

}

 

5. 以下代码有什么问题? [C++ ]

cout << (true?1:"1") << endl;

 

8. 以下代码能够编译通过吗,为什么? [C++ ]

unsigned int const size1 = 2;

char str1[ size1 ];

unsigned int temp = 0;

cin >> temp;

unsigned int const size2 = temp;

char str2[ size2 ];

 

9. 以下代码中的输出语句输出 0 吗,为什么? [C++ ]

struct CLS

{

    int m_i;

    CLS( int I ) : m_i(i) {}

    CLS()

    {

        CLS(0);

    }

};

CLS obj;

cout << obj.m_i << endl;

 

10. C++ 中的空类,默认产生哪些类成员函数? [C++ ]

答:

class Empty

{

public:

    Empty();                          // 缺省构造函数

    Empty( const Empty& );            // 拷贝构造函数

    ~Empty();                         // 析构函数

    Empty& operator=( const Empty& ); // 赋值运算符

    Empty* operator&();               // 取址运算符

    const Empty* operator&() const;   // 取址运算符 const

};

 

3. 以下两条输出语句分别输出什么? [C++ ]

float a = 1.0f;

cout << (int)a << endl;

cout << (int&)a << endl;

cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?

Float b = 0.0f;

cout << (int)b << endl;

cout << (int&)b << endl;

cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?

 

2. 以下反向遍历 array 数组的方法有什么错误? [STL ]

vector array;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 3 );

 

for( vector::size_type i=array.size()-1; i>=0; --I ) // 反向遍历 array 数组

{

    cout << array[i] << endl;

}

 

6. 以下代码有什么问题? [STL ]

typedef vector IntArray;

IntArray array;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 2 );

array.push_back( 3 );

// 删除 array 数组中所有的 2

for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )

{

    if( 2 == *itor ) array.erase( itor );

}

 

11. 写一个函数,完成内存之间的拷贝。 [ 考虑问题是否全面 ]

答:

  程序代码

void* mymemcpy( void *dest, const void *src, size_t count )

{

    char* pdest = static_cast<char*>( dest );

    const char* psrc = static_cast<const char*>( src );

    if( pdest>psrc && pdest<psrc+cout ) 能考虑到这种情况就行了

    {

        for( size_t i=count-1; i!=-1; --I )

                pdest[i] = psrc[i];

    }

    else

    {

        for( size_t i=0; i<count; ++I )

            pdest[i] = psrc[i];

    }

    return dest;

}

int main( void )

{

    char str[] = "0123456789";

    mymemcpy( str+1, str+0, 9 );

    cout << str << endl;

 

    system( "Pause" );

    return 0;

}

 

29. 编写一个函数,函数接收一个字符串 , 是由十六进制数组成的一组字符串 , 函数的功能是把接到的这组字符串转换成十进制数字 . 并将十进制数字返回 .

30. 编写一个函数将一条字符串分成两部分,将前半部分按 ASCII 码升序排序,后半部分不变,(如果字符串是奇数则中间的字符不变,)最后再将前后两部分交换,然后将该字符串输出,

测试字符串“ ADZDDJKJFIEJHGI

31. 找错

Void test1()

{

    char string[10];

    char* str1="0123456789";

strcpy(string, str1);

}

 

 

Void test2()

{

    char string[10], str1[10];

for(I=0; I<10;I++)

{

        str1[i] ='a';

}

strcpy(string, str1);

}

 

Void test3(char* str1)

{

    char string[10];

    if(strlen(str1)<=10)

{

    strcpy(string, str1);

}

}

 

32.    找错

#define MAX_SRM 256

 

DSN get_SRM_no()

{

        static int SRM_no;

        int I;

        for(I=0;I{

SRM_no %= MAX_SRM;

if(MY_SRM.state==IDLE)

{

    break;

}

}

if(I>=MAX_SRM)

return (NULL_SRM);

else

return SRM_no;

}

33.    写出程序运行结果

 

int sum(int a)

{

        auto int c=0;

        static int b=3;

c+=1;

b+=2;

return(a+b+C);

}

   

void main()

{

        int I;

int a=2;

for(I=0;I<5;I++)

{

    printf("%d,", sum(a));

}

}

34.   

 

int func(int a)

{

    int b;

    switch(a)

    {

        case 1: 30;

        case 2: 20;

        case 3: 16;

        default: 0

}

return b;

}

func(1)=?

35:

int a[3];

a[0]=0; a[1]=1; a[2]=2;

int *p, *q;

p=a;

q=&a[2];

a[q-p]=?

 

36.

定义 int **a[3][4], 则变量占有的内存空间为: _____

37.

编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入 2004 12 31 23 59 59 秒,则输出 2005 1 1 0 0 0 秒。

38. 写一个函数,判断一个 int 型的整数是否是 2 的幂,即是否可以表示成 2^X 的形式(不可以用循环)

我只知道是用递推,大概写了一下,如下:

int IsTwoPow(int s)

{

  if(s==1)return FALSE;

  s=s>>1;

  if(s>1)IsTwoPow(s);

  return (s==1)?TRUE:FALSE;// 大概是这个意思,但是这一句似乎不该这么返回!

}

 

39 A B 从一堆玻璃球(共 100 个)里向外拿球,规则如下:

  (1)A 先拿,然后一人一次交替着拿;

2 )每次只能拿 1 个或 2 个或 4 个;

3 )谁拿最后一个球,谁就是最后的失败者;

  A B 谁将是失败者?写出你的判断步骤。

40. 已知:无序数组,折半查找,各元素值唯一。

函数原型是: Binary_Seach(int array[], int iValue, int iCount)

array 是数组,在里面用折半查找的方法找等于 iValue 的值,找到返回 1 否则 0 iCount 是元素个数

41. 统计一个字符串中字符出现的次数

42.100 位以上的超大整数的加法(主要考虑数据结构和加法的实现)。

43. 对如下电文: "CASTCASTSATATATASA" 给出 Huffman 编码。

44.int (* (*f)(int, int))(int) 表示什么含义?

45.x=x+1 x+=1 x++ ,为这三个语句的效率排序。并说明为什么。

46. 中缀表达式 A-(B+C/D)*E 的后缀形式是什么?

47.struct S1

{

char c;

int i;

};

sizeof(S1) = ?

class X{

public:

X();

virtual ~X();

void myMemberFunc();

static void myStaticFunc();

virtual void myVirtualFunc();

private:

int i;

char * pstr;

char a;

}

sizeof(X) = ?

48. 找出两个字符串中最大子字符串 , "abractyeyt","dgdsaeactyey" 的最大子串为 "actyet"

49. 有一百个整数 , 其中有负数 , 找出连续三个数之和最大的部分 .

50. 写一程序实现快速排序 . 假设数据输入为一文件

快速算法描述如下

Algorithm Partition

Input: sequence a0, ..., an-1 with n elements

Output: permutation of the sequence such that all elements a0, ..., aj are less than or equal to all

elements ai, ..., an-1 (i > j)

Method:

choose the element in the middle of the sequence as comparison element x

let i = 0 and j = n-1

while ij

 

    search the first element ai which is greater than or equal to x

    search the last element aj which is less than or equal to x

    if ij

 

    exchange ai and aj

    let i = i+1 and j = j-1

After partitioning the sequence, Quicksort treats the two parts recursively by the same procedure.

The recursion ends whenever a part consists of one element only.

51. 写一算法检测单向链表中是否存在环 (whether there is a loop in a link list),

要求算法复杂度 (Algorithm's complexity O(n)) 并只使用常数空间 (space is O(c)).

注意,你只知道一个指向单向链表头的指针。链表的长度是不定的,而且环出现的地方也是不定的,环有可能在头,有可能在中间。而且要求是检测 , 不能破坏环的结构 .

52. 设下列函数已经通过了调试

bool Sort_Array(ArrayType * Pinputarray, ArrayType * Poutarray);

该函数在内存中排序,能把字节数最大为 100M 字节的 ArrayType 类型的数组排序。其中 ArrayType 是一个

预定义的数组类型(细节无关紧要), Pinputarray Poutarray 分别为排序前的指针和排序后的指针。

请用 c 语言的伪码风格设计一个算法,他调用上面给出的函数完成下列从输入到输出的任务:

输入:排序前的大文件,名称为 char * pinoutfilename ,其内容为用分号分隔的 ArrayType 类型的数组元素,可装满 4 100M 字节的数组。

输出:排序后的大文件 char * poutoutfilename

53. 用最有效率的方法算出 2 乘以 8 等於几?

54.

1. 错误的转义字符是 ( )

A.'/091' B.'//'

C.'/0' D.'/''

2. 若数组名作实参而指针变量作形参,函数调用实参传给形参的是 ( )

A. 数组的长度 B. 数组第一个元素的值

C. 数组所有元素的值 D. 数组第一个元素的地址

3. 变量的指针含意是指变量的 ( )

A. B. 地址

C. 存储 D. 名字

5. 某文件中定义的静态全局变量 ( 或称静态外部变量 ) 其作用域是 ( )

A. 只限某个函数 B. 本文件

C. 跨文件 D. 不限制作用域

55.

1. 解二次方程 :a*x*x+b*x+c

int Quadratic( double a,double b,double c,double& x1,double& x2);

返回值:解的个数

2. 最大公约数

DWORD Divisor( DWORD dwFirst, DWORD dwSecond );

返回值:最大公约数

3. 根据蒙特卡洛算法计算圆周率

double PI( DOWRD dwCount/* 测试次数 */ )

返回值: PI

4. 无符号整数乘法,乘数为 32bit ,结果为 64bit

提示: 32bit 整数分解为 16bit 相乘

void Multiply( DWORD dwFirst, DWORD dwSecond, DWORD& dwHigh, DWORD& dwLower );

5. 链表排序 ( 从小到大 )

节点定义为:

struct Node{

  int nValue;

  struct Node* pNext;

};

最后一个节点的 pNext = NULL.

Node* SortChain( Node* pHead );

返回值:链表头

 

24.Assignment 2: Picture Processing

Use C++, Java, or similar languages or/and any middleware such as EJB and J2EE to process a  picture with a high resolution (3 Mega Pixels for example). Use some methodologies to degrade  the resolution of the picture to make it quicker for browsing. Then divide the degraded  picture into 9 sectors equally. Click any of the 9 sectors will result a detailed picture for  this sector with the same resolution as that of the original picture. This assignment is  designed for you to demonstrate your ability to handle pictures.

25. <<,>>,|,& 实现一个 WORD(2 个字节 ) 的高低位交换 !!

26. 要开辟 P1,P2,P3,P4 内存来做缓冲 , 大小自定 , 但这四个缓冲的大小要一样 , 并且是连续的 !

27. 有一浮点型数组 A, C 语言写一函数实现对浮点数组 A 进行降序排序 , 并输出结果 , 要求要以数组 A 作为函数的入口 .( 建议用冒泡排序法 )

28. 找错:

#include <string.h>

#include <stdio.h>

class Base

{

private:

char * name;

public:

Base(char * className)

{

name = new char[strlen(className)];

strcpy(name, className);

}

~Base()

{

delete name;

}

char * copyName()

{

char newname [256];

strcpy(newname, name);

return newname;

}

char * getName()

{

return name;

}

static void print(Base base)

{

printf("name: %s/n" , base.name);

}

};

class Subclass : public Base

{

public:

Subclass(char * className) : Base(className)

{

}

};

int main()

{

Base * pBase = new Subclass("test");

Base::print(*pBase);

printf("name: %s/n", pBase->getName());

printf("new name: %s/n", pBase->copyName());

return 0;

}

21. 有双向循环链表结点:

typedef struct node

{

  int date;

  struct node *front,*next;

}_Node;

有两个双向循环链表 A B ,知道其头指针为: pHeadA,pHeadB ,请写一函数将两上链表中 date 值相同的结点删除

 

22.

char * GetStr()

{

char *tmp;

tmp = "123"

return tmp;

}

void main()

{

printf("%s", GetStr());

}

会输出 123 吗? 123 创建在堆上还是栈上呢? 123 的空间是什么时候释放的?

23.

字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?

ClassB ClassA 派生,那么 ClassA *a = new ClassB( ); 试问该表达是否合法?为什么?

如果 ClassA 中定义并实现虚函数 int func(void) ClassB 中也实现该函数,那么上述变量 a->func() 将调用哪个类里面的函数?如果 int func(void) 不是虚函数,情况又如何?为什么?

char **p, a[16][8];  问: p=a 是否会导致程序在以后出现问题?为什么?

如下所述的 if else switch 语句哪个的效率高?为什么?

在同一个进程中,一个模块是否可以通过指针操作破坏其它模块的内存,为什么?

应用程序在运行时的内存包括代码区和数据区,其中数据区又包括哪些部分?

NetFetch [2006-07-06 09:20 AM]

c/c++ 面试题集锦 2006-7-6 更新

18.Consider the following code:

 

#include <stdio.h>

#include <string.h>

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

int i = 1;

char buf[4];

strcpy(buf, "AAAA");

printf("%d/n", i);

return 0;

}

a) When compiled and executed on x86, why does this program usually not

output what the programmer intended?

 

b) Name several ways in which the security problem that causes this

program not to output what the programmer intended can be prevented

WITHOUT changing the code.

 

19.int w=1,x=2,y=3,z=4;

m=(w<x)?w:x;

m=(m<y)?m:y;

m=(m<2)?m:z;

printf("m=%d",m);        说出结果

20. 说出结果

#include <stdio.h>

main()

{

    FILE *fp;

    int i,a[4]={1,2,3,4},b;

    fp=fopen("data.dat","wb");// 这里帮忙解释一下

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

    fwrite(&a[i],sizeof(int),1,fp);// 这里也帮忙看一下

    fclose(fp);

    fp=fopen("data.dat","rb");

    fseek(fp,-2L*sizeof(int),SEEK_END);// 还有这里

    fread(&b,sizeof(int),1,fp);// 这里还有也看一下

    fclose(fp);

    printf("b=%d/n",b);

}

12. 请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。

   a) 请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请

     给出该题的至少一个不同解法。

   b) 请编写一个 C 函数,该函数将给定的一个字符串转换成整数。

   c) 请编写一个 C 函数,该函数将给定的一个整数转换成字符串。

   d) 请编写一个 C 函数,该函数将一个字符串逆序。

   e) 请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回

     该字符所在位置索引值。

   f) 请编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,

     该字符串是由同一字符组成的。

 

给出演示上述函数功能的一个简单程序,并请编写对应的 Makefile 文件

 

13. 我们需要编写一个图形相关的应用程序,需要处理大量图形 (Shape) 信息,

图形有矩形 (Rectangle) ,正方形 (Square) ,圆形 (Circle) 等种类,应用

需要计算这些图形的面积,并且可能需要在某个设备上进行显示 ( 使用在标准

输出上打印信息的方式做为示意 )

 

    a) 请用面向对象的方法对以上应用进行设计,编写可能需要的类

    b) 请给出实现以上应用功能的示例性代码,从某处获取图形信息,

      并且进行计算和绘制

    c) 如果你的 Square 继承自 Rectangle ,请给出理由,如果不是,

      请给出理由,并且请比较两种方式的优劣

    d) 请问你所编写的类,在如下代码中会有何表现,请解释

    void test_rectangle_area(Rectangle& r)

    {

        r.set_width(10);

        r.set_height(15);

        assert(r.area() == 150);

    }

14. 假设现有一个单向的链表,但是只知道只有一个指向该节点的指针 p ,并且假设这个节点不是尾节点,试编程实现删除此节点

15. 写一个程序,把一个 100 以内的自然数分解因数。(自然数分解因数就是将一个自然数分解为几个素数的乘积,提示 , 由于该数不是很大 , 所以可以将质数保存在数组中 , 以加快计算速度 )

16. 编写一个 Identify 的分配、释放的函数,为 1 10000 之间的自然数。

17. 分别实现 itoa atoi.

 

NetFetch [2006-07-06 09:18 AM]

c/c++ 面试题集锦 2006-7-6 更新

 

1. 多态类中的虚函数表是 Compile-Time ,还是 Run-Time 时建立的 ?

2. 将一个 1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个

字符存到新文件的第一个字符,以此类推。

3.main 主函数执行完毕后,是否可能会再执行一段代码 ?

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

在子类的空间里,有没有父类的这个函数,或者父类的私有变量 ?

5. 给一个字符串、例如 ababc ”要求返回“ ab . 因为“ ab ”连续重复出现且最长。

  C/C ++语言写一函数完成该算法,给出复杂度

6. 对序列 1 1 2 3 5 8 13 。。。。   Fab.. 数列

  2 3 5 13... Fab.. 质数数列,因为他们与自己前面的 Fab... 数列都互质

给出 k ,返回第 k 小的 Fab.. 质数

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

8. 完成字符串拷贝可以使用 sprintf strcpy memcpy 函数,请问这些函数有什么区别,你喜欢使用哪个,为什么?

9. 变量的声明和定义有什么区别?

10. 请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质:

#include <stdio.h>

#include <stdlib.h>

 

int main(void)

{

        char a[30];

        char *b = (char *)malloc(20 * sizeof(char));

         printf("%d/n", sizeof(a));

        printf("%d/n", sizeof(b));

        printf("%d/n", sizeof(a[3]));

        printf("%d/n", sizeof(b+3));

        printf("%d/n", sizeof(*(b+4)));

        return 0 ;

}

 

NetFetch [2006-06-20 11:18 AM]

4.

i nclude "stdafx.h"

#define SQR(X) X*X

 

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

{

int a = 10;

int k = 2;

int m = 1;

 

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

printf("%d/n",a);

 

return 0;

}

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

 

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

 

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

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

=>a = a/9;

=>a = 1;

NetFetch [2006-06-20 11:17 AM]

3. 请简单描述 Windows 内存管理的方法。

 

内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~

我先说个大概,希望能够抛砖引玉吧

 

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

内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理

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

页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。

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

段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。

 

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

 

 

static Global variable: 文件作用域:只在声明的文件中有效,其他源文件中不可见;同时有了static 的生命周期
Global variable: 文件作用域:可以加上extern 声明为外部变量,跨文件作用域

static (Global) Function:  有文件作用域,只在本文件中使用
Global Function: 无文件作用域

static Member (in Function) variable: 函数调用完成后,变量保存状态,再次调用函数,不会重新分配空间
Member(in Funcition) variable: 函数内的生命周期

static Member(in Class) variable:  属于类范围,
Member(in Class) variable
: 属于类派生的特定对象,生命周期和对象一致

 

(源自http://blog.csdn.net/duckur/archive/2005/11/05/523545.aspx

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值