zoukankan      html  css  js  c++  java
  • 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 ",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++)!='');

        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 = '';

            }

            //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等新建出来的变量是存在堆上的

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

    感谢来访,共同学习!
  • 相关阅读:
    Debugger and device times have drifted by more than 60s. Please correct this by running adb shell "date `date +%m%d%H%M%Y.%S`" on your debugger machine.
    react native 动画组件Animated
    react-navigation 报错解决方法
    Java并发编程:线程池的使用
    如何设置eclipse下查看java源码
    接口和抽象类
    java接口可以继承多个接口
    抽象类和抽象方法的区别
    final
    static
  • 原文地址:https://www.cnblogs.com/dingxiaowei/p/3207434.html
Copyright © 2011-2022 走看看