2013-7-22[面试题]

1.   编程:计算班级学生平均成绩和不及格人数。

#include <stdio.h>

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

{

    int stu[10]={99,98,55,96,95,94,93,92,91,90};

    int sum=0;

    int count=0;

    float avr=0;

    for (int i=0; i<10; i++) {

        sum+=stu[i];

        if (60>stu[i]) {

            count++;

        }

    }

    avr = (float)sum / 10;

    printf("学生平均成绩是:%f,不及格人数是:%d",avr,count);

    return0;

}

2.   编程,用条件表达式实现三个整数从大到小排序。

#include <stdio.h>

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

{

 

    int a=10,b=20,c=30;

    int max,mid,min;

    max=a>b?(a>c?a:c):(b>c?b:c);

    mid=a>b?(a<c?a:c>b?c:b):(b<c?b:c);

    min=a<b?(a<c?a:c):(b<c?b:c);

    printf("max=%d,mid=%d,min=%d",max,mid,min);

    return0;

}

 

3.   请说明三种循环语句的异同点。

     三种循环分别是while;do while 和 for

     相同点都是实现了一段逻辑循环操作,都具有以下三条内容:

     (1)循环体的设计

     (2)循环条件的设计

     (3)循环入口的初始化工作

     不同点:while是先进行判断,然后执行循环体;do while是先进行循环体然后再进行判断;for也是先进行判断然后进入循环体,结束后,进行++操作

     for循环一般用在循环次数固定的情况下

 

4.   请举例说明 break、continue 语句的区别。

      break//终止当前循环       contine//跳过此次循环

     #include <stdio.h>

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

{

 

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

        for (int j=0; j<4; j++) {

            if (i==1) {

                continue;

            }

            if (j==2) {

                break;

            }

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

        }

    }

    return0;

}

结果:

0   0

0   1

2   0

2   1

3   0

3   1

5.   用三种循环语句编写程序实现:计算 100 以内的整数之和 。

     

for循环:

#include <stdio.h>

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

{

 

    int sum=0;

    for (int i=0; i<=100; i++) {

        sum+=i;

    }

    printf("100以内的整数的和:%d",sum);

    return0;

}

while循环:

#include <stdio.h>

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

{

 

    int sum=0;

    int i=0;

    while (i<=100) {

        sum+=i;

        i++;

    }

    printf("100以内的整数的和:%d",sum);

    return0;

}

do while循环:

#include <stdio.h>

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

{

 

    int sum=0;

    int i=0;

    do {

        sum+=i;

        i++;

    }while (i<=100);

    printf("100以内的整数的和:%d",sum);

    return0;

}

一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)

提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为:

    if ( n == 0 )

    if ( n != 0 )

以此类推。

 

请写出 BOOL  flag 与“零值”比较的 if 语句:

 if(FALSE == flag)[错误]

 

 if(flag)或者if(!flag)

请写出 float  x 与“零值”比较的 if 语句:

 

 const double EPSILON = 1.00e-07;

 

if (x<abs(EPSILON))

{

 

}

 

请写出 char  *p 与“零值”比较的 if 语句:

 

 if(NULL == p)或者if(NULL != p)

 

二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分)

 

       char  str[] = “Hello” ;

       char   *p = str ;

int     n = 10;

请计算

sizeof (str ) = 5[错]     6[对]          char str[8] = "Hello"   sizeof(str) =8

        

sizeof ( p ) =  8    

         

sizeof ( n ) = 4

void Func ( char str[100])

{

请计算

 sizeof( str ) = 8  //相当于指针

}

 

void *p = malloc( 100 );

请计算

sizeof ( p ) =8  

 

 

三、简答题(25分)

 

1、头文件中的 ifndef/define/endif 干什么用?

 

 防止引用该头文件的时候重复定义

 

2、#include  <filename.h>   和  #include  “filename.h” 有什么区别?

 

 第一种是指从系统文件中去找filename.h文件;第二种是从当前文件中去找filename.h的文件

 

3、const 有什么用途?(请至少说明两种)

 1.const修饰常量,该变量不可修改,例如const double PI=3.14

 

 2.常指针,const放在不同的地方有不同的效果,例如:

const int *p 和 int const *p 效果是一样的,指针所指向的内容是不可以变的,指针指向可以变

const int *p 和 int const *p指针指向不可变,但指针指向的内容可以变

int const * const p  指针指向和内容都不可以变

 

4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?

 

 首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

被extern "C"修饰的变量和函数是按照C语言方式编译和连接的

 

 

5、请简述以下两个for循环的优缺点

 

// 第一个

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

{

if (condition)

    DoSomething();

else

    DoOtherthing();

}

// 第二个

if (condition)

{

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

    DoSomething();

}

else

{

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

    DoOtherthing();

}

优点:

 如果N比较小,第一种方法代码量少

 

缺点:

 

 耗时间

 

优点:

 节省时间

 

缺点:

 受客观条件的制约,有可能condition在DoSomething()中被修改

 

 

四、有关内存的思考题(20分)

 

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str); 

strcpy(str, "hello world");

printf(str);

}

 

请问运行Test函数会有什么样的结果?

答:程序有错误!

修改:

方法一:

void GetMemory(char **p)

{

     p=(char *)malloc(100);

}

void Test(void)

{

     char *str = NULL;

     GetMemory(&str);

     strcpy(str,"hello world");

     printf(str);

}

方法二:

char * GetMemory(char *p)

{

     p=(char *)malloc(100);

     return p;

}

void Test(void)

{

     char *str = NULL;

     str = GetMemory(str);

     strcpy(str,"hello world");

     printf(str);

}

 

 

 

char *GetMemory(void)

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();  

printf(str);

}

 

请问运行Test函数会有什么样的结果?

答:有错误

虽然地址传过来了,但是“hello world”值没有传过来           为什么? 地址和strlen大小都一样

 

Void GetMemory2(char **p, int num)

{

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

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello"); 

printf(str);  

}

请问运行Test函数会有什么样的结果?

答:

 能够输出hello

 

 

 

void Test(void)

{

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

    strcpy(str, “hello”);

    free(str);    

    if(str != NULL)

    {

      strcpy(str, “world”);

printf(str);

}

}

请问运行Test函数会有什么样的结果?

答:

 free了空间以后,str不知道指向哪儿了,可能为空,也可能不为空,所以这样写不稳定

五、编写strcpy函数(10分)

已知strcpy函数的原型是

       char *strcpy(char *strDest, const char *strSrc);

       其中strDest是目的字符串,strSrc是源字符串。

 

(1)不调用C++/C的字符串库函数,请编写函数 strcpy

 

char *strcpy(char *strDest,constchar *strSrc)

{

    

    if ((strDest == NULL)||(strSrc==NULL)) {

        returnNULL;

    }

    char *strDestCopy = strDest;

    while ((*strDest++=*strSrc++)!='\0');

    return strDestCopy;

}

 

(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?

 

 返回赋值完成后的字符串,以便在外部函数进行赋值或者打印出来

 

 

六、编写类String的构造函数、析构函数和赋值函数(25分)

已知类String的原型为:

    class String

    {

      public:

        String(const char *str = NULL);    // 普通构造函数

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

        ~ String(void);                        // 析构函数

        String & operate =(const String &other);    // 赋值函数

      private:

        char      *m_data;                // 用于保存字符串

    };

       请编写String的上述4个函数。

 

#include <iostream>

usingnamespacestd;

#include <string.h>

 

class String1

{

public:

    String1(constchar *str = NULL) //普通构造函数

    {

        if (str==NULL) {

            m_data = newchar[1];

            m_data = '\0';

        }

        //delete []m_data;

        else

        {

            m_data = newchar[strlen(str)+1];

            strcpy(m_data, str);

        }

    }

    String1(constString1 &other) //拷贝构造函数

    {

   /*

        if (&other == this) {

            cout<<"不能为复制本身";

        }*/不需要写这个  因为不可能自己作为参数传递给自己,应为自己还没创建好

        if (this->m_data == other.m_data) {

            cout<<"不要赋值相等的值";

        }

        else

        {

            if (m_data) {

                delete []m_data;

            }

            m_data = newchar [strlen(other.m_data)+1];

            strcpy(m_data, other.m_data);

        }

    }

    ~String1(void)

    {

        if (m_data) {

            delete []m_data;

        }

    }

    String1 &operate = (const String1 &other)

    {

        if(this == &other)

        {

            return *this;

        }

        delete []m_data;

        m_data = newchar[strlen(other.m_data)+1];

        strcpy(m_data,other.m_data);

    };

private:

    char * m_data;//用于保存字符串

};

 

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

{

 

    String1 s="ding";

    String1 ss= s;

    cout<<ss;

    return0;

}

 

栈和堆的区别:

栈是自动释放,堆是手动释放

局部变量都是存放在栈上面的,new,malloc等新建出来的变量是存在堆上的

栈容量比较小,堆容量比较大

posted @ 2013-07-22 21:36  蓬莱仙羽  阅读(199)  评论(0编辑  收藏  举报