文斯测试技术研究中心

---------测试无间、追求无限

vince zhangID:vincetest
137717次访问,排名568好友6人,关注者18
具备多年软件开发、软件测试和项目管理工作经验。曾任职于华为技术有限公司,主要参与大型复杂软件产品的开发、测试及管理工作,积累了深厚的开发、测试和管理工作经验;同时还从事软件测试工具的研究和开发工作,对产品测试方法和管理流程有深刻的理论认识和实践经历。
vincetest的文章
原创 44 篇
翻译 0 篇
转载 30 篇
评论 59 篇
vince的公告
vincetest欢迎光临文斯测试技术研究中心!敬请关注如下内容:
★★★★★中心简介★★★★★ 推荐文章(点击文章可直接进入):
1.测试之颠,必先利其器 2.测试用例设计白皮书 3.软件可测试性设计 4.单元测试大揭密

最佳C/C++调测平台(VcSmith)

最近评论
小罗密欧:很全面啊,对于初学者来说很棒很有用啊,谢谢~
小罗密欧:很全面啊,对于初学者来说很棒很有用啊,谢谢~
云:分析的还是比较透彻的,支持一下
majuthink:真是不明白条件项是如何确定的?
全部学校完了!:全部学校完了!
谢谢了哦!
对我说很适用!
文章分类
收藏
    相册
    测试工具
    http://www.eztester.com
    测试技术交流
    01 51testing
    02 测试时代
    03 希赛
    03 开发与测试资源免费下载网
    强人博客
    wayne的博客
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 面试经典试题收藏

    新一篇: 企业如何推动测试 | 旧一篇: 软件项目测试管理经验谈

    面试经典试题

    Author: Vince      来源:http://blog.csdn.net/vincetest

    ————即使你是个编程高手,你在面试前也应该要看看这套题,她也许会给你带来好运,否则你有可能后悔当初为什么没有看而跳楼自杀,这样我会很内疚的。这套题看似简单,但你未必能得高分,即使你看不懂也要把她背下来! 

    1       编程基础

    1.1    基本概念

    1.         const的理解:const char*, char const*, char*const的区别问题几乎是C++面试中每次    都会有的题目。 事实上这个概念谁都有只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。

    char  * const cp; ( * 读成 pointer to )

    cp is a const pointer to char

    const char * p;

    p is a pointer to const char;

    char const * p;

    同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。

    2.         c指针

    int *p[n];-----指针数组,每个元素均为指向整型数据的指针。

    int (*)p[n];------p为指向一维数组的指针,这个一维数组有n个整型数据。

    int *p();----------函数带回指针,指针指向返回的值。

    int (*)p();------p为指向函数的指针。

    3.         数组越界问题

    下面这个程序执行后会有什么错误或者效果:

     #define MAX 255

    int main()

    {

        unsigned char A[MAX],i;

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

            A[i]=i;

    }

    解答:MAX=255,数组A的下标范围为:0..MAX-1,这是其一,其二 i循环到255,循环内执行: A[255]=255;这句本身没有问题,但是返回for (i=0;i<=MAX;i++)语句时,由于unsigned char的取值范围在(0..255),i++以后i又为0..无限循环下去.

    注:char类型为一个字节,取值范围是[-128127]unsigned char [0 ,255]

    4.         C++:memset ,memcpy strcpy 的根本区别?  

    #include "memory.h"

    memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ '‘\0';例:char a[100];memset(a, '\0', sizeof(a));

    memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。

    strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0'之前)是否超过50位,如超过,则会造成b的内存地址溢出。

    strcpy

    原型:extern char *strcpy(char *dest,char *src);

    用法:#include

    功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

    说明:srcdest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

    返回指向dest的指针。

    memcpy

    原型:extern void *memcpy(void *dest, void *src, unsigned int count);

    用法:#include

    功能:由src所指内存区域复制count个字节到dest所指内存区域。

    说明:srcdest所指内存区域不能重叠,函数返回指向dest的指针。

    Memset

    原型:extern void *memset(void *buffer, char c, int count);

    用法:#include

    功能:把buffer所指内存区域的前count个字节设置成字符c

    说明:返回指向buffer的指针。

    5.         ASSERT()是干什么用的

    ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:

    ......

    ASSERT( n != 0);

    k = 10/ n;

    ......

    ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。

    assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。

    6.         system"pause");系统的暂停程序,按任意键继续,屏幕会打印,"按任意键继续。。。。。" 省去了使用getchar();

    7.         请问C++的类和C里面的struct有什么区别?

    c++中的类具有成员保护功能,并且具有继承,多态这类oo特点,而c里的struct没有

    8.         请讲一讲析构函数和虚函数的用法和作用?

    析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载。知识在类对象生命期结束的时候,由系统自动调用释放在构造函数中分配的资源。这种在运行时,能依据其类型确认调用那个函数的能力称为多态性,或称迟后联编。另:析构函数一般在对象撤消前做收尾工作,比如回收内存等工作,虚拟函数的功能是使子类可以用同名的函数对父类函数进行重载,并且在调用时自动调用子类重载函数,如果是纯虚函数,则纯粹是为了在子类重载时有个统一的命名而已。

    9.         全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?

    全局变量的生命周期是整个程序运行的时间,而局部变量的生命周期则是局部函数或过程调用的时间段。其实现是由编译器在编译时采用不同内存分配方法。全局变量在main函数调用后,就开始分配,如果是静态变量则是在main函数前就已经初始化了。而局部变量则是在用户栈中动态分配的(还是建议看编译原理中的活动记录这一块)

    10.     8086是多少尉的系统?在数据总线上是怎么实现的?

    8086系统是16位系统,其数据总线是20位。

    1.2    程序设计

    1.         编写用C语言实现的求n阶阶乘问题的递归算法:

    long int fact(int n)
    {

        int x;

        long int y;

        if(n<0)  

        {

           printf("error!");

        }

        if(n==0)

           return 1;

        x=n-1;

        y=fact(x);

        return (n*y);

    }

    2.         二分查找算法:

    1)        递归方法实现:

    int BSearch(elemtype a[],elemtype x,int low,int high)

    /*在下届为low,上界为high的数组a中折半查找数据元素x*/

    {

      int mid;

      if(low>high) return -1;

      mid=(low+high)/2;

      if(x==a[mid]) return mid;

      if(x<a[mid]) return(BSearch(a,x,low,mid-1));

      else return(BSearch(a,x,mid+1,high));

    }

    2)        非递归方法实现:

    int BSearch(elemtype a[],keytype key,int n)

    {

      int low,high,mid;

      low=0;high=n-1;

      while(low<=high) 

       {

          mid=(low+high)/2;

          if(a[mid].key==key) return mid;

          else if(a[mid].key<key) low=mid+1;

          else high=mid-1;

       }

      return -1;

    }

    3.         递归计算如下递归函数的值(斐波拉契):

    f(1)=1

    f(2)=1

    f(n)=f(n-1)+f(n-2) n>2

    解:

    int f(int n)

    {

            int i,s,s1,s2;

            s1=1;/*s1用于保存f(n-1)的值*/

            s2=1;/*s2用于保存f(n-2)的值*/

            s=1;

            for(i=3;i<=n;i++)

    {

           s=s1+s2;

           s2=s1;

           s1=s;

        }

    return(s);

    }

    4.         交换两个数,不用第三块儿内存:

    int a = ……;

    int b = ……;

    a = a + b;

    b = a - b;

    a = a - b;

    5.         冒泡排序:

    void BubbleSort(elemtype x[],int n)

    {

            int i,j;

            elemtype temp;

            for(i=1;i<n;i++) 

            for(j=0;j<n-i;j++)

    {

                    if(x[j].key>x[j+1].key) 

                    {

                        temp=x[j];

                        x[j]=x[j+1];

                        x[j+1]=temp;

                    }

    }

    }

    6.         c语言 文件读写

    #include "stdio.h"

    main()

    {

            FILE *fp;

            char ch,filename[10];

            scanf("%s",filename);

            if((fp=fopen(filename,"w")==NULL)

            {

    printf("cann't open file\n");

    exit(0);

      }

      ch=getchar();

      while(ch!='#')

      {

           fputc(ch,fp);

           putchar(ch);

           ch=getchar();

      }

      fclose(fp);

    }

    7.         winsocket编程

    #include <Winsock2.h>

    #include <stdio.h>

    void main()

    {

           WORDwVersionRequested;

            WSADATA wsaData;

            int err;

            wVersionRequested = MAKEWORD(1,1);

            err = WSAStartup(wVersionRequested,&wsaData);

            if( err != 0)

    {

                return; 

            }

            if(LOBYTE( wsaData.wVersion ) != 1||

               HIBYTE( wsaData.wVersion) != 1)

    {

                WSACleanup();

                return;

            }

            SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

            SOCKADDR_IN addrSrv;

           addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

            addrSrv.sin_family=AF_INET;

            addrSrv.sin_port=htons(6000);

           bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

           listen(sockSrv,5);

            SOCKADDR_IN addrClient;

            int len=sizeof(SOCKADDR);

            while(1)

            {

                SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

                char sendBuf[100];

                sprint(sendBuf,"Welcome %s to http://www.sunxin.org",

               inet_ntoa(addrClient.sin_addr));

                send(sockConn,sendBuf,strlen(sendBuf)+1,0);

                char recvBuf[100];

               recv(sockConn,recvBuf);

                printf("%s\n",recvBuf);

                closesocket(sockConn);

                WSACleanup();

           

    }

    注:这是Server端;File->New->Win32 Console Application,工程名:TcpSrv;然后,File->New->C++ Source File,文件名:TcpSrv;在该工程的SettingLinkObject/library modules项要加入ws2_32.lib

    #include <Winsock2.h>

    #include <stdio.h>

    void main()

    {

            WORDwVersionRequested;

            WSADATA wsaData;

            int err;

            wVersionRequested = MAKEWORD(1,1);

            err = WSAStartup(wVersionRequested,&wsaData);

            if( err != 0)

    {

                return; 

            }

            if(LOBYTE( wsaData.wVersion ) != 1||

                HIBYTE( wsaData.wVersion) != 1)

    {