zoukankan      html  css  js  c++  java
  • 面试题1

    一、单项选择题(共15题,每题2分,共30分)

    1.下面关于i节点描述错误的是 [2分]

    A. i节点和文件是一一对应的(每个文件都有唯一一个索引结点号与之对应,而对于一个索引结点号,却可以有多个文件名与之对应)

    B. i节点能描述文件占用的块数

    C. i节点描述了文件大小和指向数据块的指针

    D. 通过i节点实现文件的逻辑结构和物理结构的转换

    参考答案:A

    2.假设目录中存在若干文件file_num.txt(num表示文件编号,1~10),使用以下哪个通配符可以只挑选出其中的编号为1、3、5的文件?[2分]

    A. file_*.txt

    B. flie_?.txt

    C. file_[135].txt

    D. file_[^135].txt

    参考答案:C

    3.Linux文件权限一共10位长度,分成四段,第三段表示的内容是[2分]

    A. 文件类型

    B. 文件所有者的权限

    C. 文件所有者所在组的权限

    D. 其他用户的权限

    参考答案:C

          -rwxrw-rw-  

    4.如果有定义:char **a[3][4], sizeof(a)的结果是:[2分]  

    这是定义一个指向char*类型的指针二维数组
    32位下应该是4*3*4=48字节

    A. 4

    B. 12

    C. 48

    D. 64

    参考答案:C

    5.有程序如下:
     int main(void)
     {
          unsignedchar a = 0xa5;
          unsignedchar b = ~a>> 4+1;
               printf("%d ",b);
          return0;
     }其执行结果是[2分]

    A. 245

    B. 246

    C. 2

    D. 250

    参考答案:D

    因为~的优先级别高于>>,所以是先对a取反,即1010 0101----> 0101 1010

    因为+的优先级别大于>>,所以是右移5位,得到:0000 0010 结果是2;

    但是这确实错误的答案,在vs2008上运行的时候结果却是 250;原来这是16为寄存器,

    0xA5是:0000 0000 1010 0101;取反之后变成:1111 1111 0101 1010

    右移5位后得到的是:0000 0111 1111 1010;由于unsigned char型只能表示低八位,这样既得到: 250;

    6.有程序如下:
     int main(void) {
          char *a[] = {"hello", "the", "world"};
          char **pa = a;     pa++;     printf("%s ",*pa);
          return0;
     }其执行结果是[2分]

    A. theworld

    B. the

    C. ello

    D. elloworld

    参考答案:B

    7.在带有头结点的单链表HL中,要向表头插入一个由指针p指向的结点,则执行(   )[2分]

    A. HL->next=P; P->=H->next;

    B. p->next=HL; HL=p;

    C. p->next=HL->next;HL->next=P

    D. p->next=HL->next; p=HL;

    参考答案:C

    8.在32平台下,结构体data定义如下:
    struct data
    {
        char a;
        int b;
        short c;
    };
    则其大小为[2分]

    A. 8

    B. 10

    C. 12

    D. 16

    参考答案:C

    9.阅读如下程序:
    int a=5;
    void show_val(void)
    {
        int b=3; 
        static int c=2; 
        a += 5;
        b += 5;
        c += 5; 
        printf("%d,%d,%d ",a,b,c); 
        c = b; 
    }
    int main(void) 
    {
        int b=0; 
        static int c; 
        a += 3; 
        show_val();  // show  values
       
        b += 3; 
        show_val ();  // show  values  again
        return 0; 
    }
    则其执行结果是   [2分]

    A. 13,0,13

    B. 18,8,13

    C. 13,8,13

    D. 18,8,0

    参考答案:B

    10.以下程序输出的结果是   ?????
    int main(void){
          int b = 3;
          int arr[] = {6, 7, 8, 9, 10};
          int *ptr = arr;
           *(ptr++)+= 123;
          printf("%d%d ", *ptr, *(++ptr));
           return0;
     }[2分]

    A. 8 8

    B. 130 8

    C. 7 7

    D. 7 8

    参考答案:A


    然后int* ptr=arr;这一句使得ptr指针指向arr数组的第一个数,也就是6;
    *(ptr++)+=123;这个不是先执行括号里面的,因为里面的是ptr++,这是先取值,再自加,这一句相当于*ptr+=123;ptr++;两句。实际就是使得*ptr指针的内容加上123。也就是数组第一个6加上123变成129。做完之后ptr自加。这时候ptr指针指向数组的第二个数7;
    最后一个printf语句,先执行的是后面的*(++ptr)而不是*(ptr),所以ptr先自增,使得指针指向8,然后输出。这样就输出的都是8了。你可以把*(++ptr)和*(ptr)的位置对调一下,那么先执行*(ptr),再执行*(++ptr)。那么输出的就是8,7了。
    不知道这么说你明白了没

    11.二叉树中前序遍历的非递归算法是利用以下哪种数据结构[2分]

    A. 顺序表

    B. 队列

    C. 栈

    D. 树

    参考答案:C

    12.有以下代码:
    void sub(int x, int y, int *z)
    {
        *z = y–x;
    }
    int main(void)
    {
        int a, b, c;
        sub(10, 5, &a);
        sub(7, a, &b);
        sub(a, b, &c);
        printf(“%4d,%4d,%4d ”,a,b,c);
    }
    则其执行结果是[2分]

    A. 5,2,3

    B. -5,-12,-7

    C. -5,-12,-17

    D. 5,-2,-7

    参考答案:B

    13.有一棵二叉树如下:
      
    用中序遍历法遍历之,则遍历的次序是[2分]

    A. ABCDEFG

    B. CBEGDFA

    C. CBAEDGF

    D. CEGDFBA

    参考答案:B

    14.设栈最大长度为3,入栈序列为1,2,3,4,5,6,,则不可能得出栈序列的是[2分]

    A. 1,2,3,4,5,6

    B. 2,1,3,4,5,6

    C. 3,4,2,1,5,6

    D. 4,3,2,1,5,6

    参考答案:D

    分析:A:可以1进栈然后1出栈,2进栈2出栈3,4,5,6,同理。

     B:1进栈2进栈,然后2出栈,1出栈后面和A相同。

    C:1,2,3进栈,然后3出栈4进栈,4出栈,2出栈,1出栈,5进栈5出栈,6进栈6出栈。

    D:1,2,3,4都进,然后4 出栈 3出栈2出栈1出栈 但是进栈的时候已经超过最大长度了。

    15.假设执行语句S的时间为O(1),则执行下列程序段的时间为
    for(i=1;i<=n;i++)
       for(j=i; j<=n; j++)
           S;[2分]

    A. O(n)

    B. O(n2)

    C. O(n*i)

    D. O(n+1)

    参考答案:B

    二、填空及简答题(共10题,共34分)

    1.分析sizeof的结果(在32位平台下)                    
    int a[10] = {0};
    sizeof(int)    =  4  
    sizeof(char*)  =  4  
    sizeof(char**) =  4  
    sizeof(a)      =  40  
    sizeof(a[0])   =  4  [每空1分]

    2.一个线性表为B=(12,23,45,57,20,03,78,31,15,36),设散列表为HT[0..12],散列函数为H(key)= key % 13并用线性探查法解决冲突,请画出散列表(空单元用‘#’代表)[3分]

    参考答案:

    78

    15

    03

    57

    45

    20

    31

    23

    36

    12

    3.请举出const关键字在C语言中的三种用途。[3分]


    const int Max=100; int Array[Max];

    void f(const int i)
    可以节省空间,避免不必要的内存分配。例如: 
    #define PI 3.14159 //常量宏 
    const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ...... 
    double i=Pi; //此时为Pi分配内存,以后不再分配! 
    double I=PI; //编译期间进行宏替换,分配内存 
    double j=Pi; //没有内存分配 
    double J=PI; //再进行宏替换,又一次分配内存! 

    4..写出在双向循环链表中,在指针p指向的节点之前插入一个q节点的算法。[3分]

    参考答案:

     q->prior=p->prior;  
    (p->prior)->next=q; 
    q->next=p;
    p->prior=q;

    5.Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:  
    #define dPS struct s *  
    typedef struct s * tPS;  
    以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?[3分]

    dPS p1,p2;

    tPS p3,p4;

    第一个扩展为

    struct s * p1, p2;

    上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。

    参考答案

    6.全局变量可不可以定义在可被多个.c文件文件包含的头文件中?为什么?[4分]

    参考答案:肯定可以了,只要头文件不要被重复定义

    7.static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?[3分]

    文件内使用static全局变量,整个程序中可以用

    Static局部变量作用域在函数内,但模块结束值不变,局部变量模块结束值释放

    函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。

    参考答案:

    8.队列和栈有什么区别?[3分]

    参考答案:

    栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本操作的特殊性,栈必须按"后进先出"的规则进行操作,而队列必须按"先进先出"的规则进行操作。和线性表相比,它们的插入和删除操作受更多的约束和限定,故又称为限定性的线性表结构。

    9.请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句[4分]

    参考答案:#define  MAX  (a>b):a?b

    10.如何输出源文件的文件名和目前执行行的行数?[3分]

    参考答案:

    printf("the file name: %s ",__FILE__); 
    printf("the file name: %d ",__LINE__);

    三、请指出以下程序片段的不妥之处。(共4题,共16分)

    1.程序片段一:
    void GetMemory(char *p, int nNum)
     {
        p = (char *)malloc(sizeof(char) * nNum);
     }
     void Test(void)
     {
        char *str = NULL;
        GetMemory(str, 100);
        strcpy(str, "hello");   //rodata数据区不能改变值
     }[4分]

    参考答案:

    值传递不能改变str的值,,所以实参str的值仍然为NULL,不能进行引用

    2.下面的代码会在哪一行崩溃,为什么?  
    struct s
     {
          inti;
          int*p;
     };
     int main(void)
     {
          structS s;
          int*p = &s.i;
          p[0]= 4;
          p[1]= 3;
          s.p= p;
          s.p[1]= 1; 
          s.p[0]= 2; 
          return0;
     }[4分]

    参考答案:

    s.p 和s.p[1]指向同一个地方,s.p[1] = 1就让s.p指向内存地址为1的位置,s.p[0]=2相当于*((int*) 1)=2;

    3.下面的代码片段的输出是什么,为什么?  
    char *ptr;  
    if ((ptr = (char *)malloc(0)) == NULL)
       puts("Got a null pointer");
    else
      puts("Got a valid pointer");[4分]

    参考答案:

    Got a valid pointer,malloc申请失败时,返回NULL,否则返回申请到的起始地址。

    4.int main(void)
    {
     int a[5]={1,2,3,4,5};
     int *ptr =(int *)(&a +1);
     pinrtf(“%d,%d”,*(a+1),*(ptr-1));
    }输出是什么,请简要说明原因[4分]

    参考答案:*(a+1) = 2,*(ptr-1)= 5;

    &a+1是在a指针的地址+1得到的是即a[4]后面的一个地址

    四、编程题(共3题,共20分)

    1.将一句话中的单词倒置,标点符号不用倒换,例如”I come from Tianjin!”倒换之后变成“Tianjin ! from come I”[7分]

    参考答案:

    #include<stdio.h>  

    #include<string.h>  

      

    void change(char *s);  

    reverse(char *s,int start,int end);  

      

    void main()  

    {  

        char s[50];  

        printf("请输入字符串 ");  

        gets(s);  

        change(s);  

        printf("到之后的字符串为%s ",s);  

    }  

      

    void change(char *s)  

    {  

        int len,start,end,i;  

        len = strlen(s);  

        start = 0;  

        end = len-1;  

        reverse(s,start,end);  

        end = 0;  

        for(i = 0;i < len;)  

        {  

            if(s[i] != ' ')  

            {  

                start = i;  

                while(s[i] != ' ' && s[i] != '')  

                    i++;  

                 

                end = i-1; 

                reverse(s,start,end);;  

            }  

            i++;  

        }  

      

    }  

      

    reverse(char *s,int start,int end)  

    {  

        char temp;  

        while(start < end)  

        {  

            temp = s[start];  

            s[start] = s[end];  

            s[end] = temp;  

            start++;  

            end--;  

        }  

    }  

    2.编写程序把字符串转换成整型数如:int atoi( const char * str)[6分]


    int StrToInt(const char* str)
    {
           g_nStatus = kInvalid;
          long long num = 0;
          if(str != NULL)//至少保证字符串不为空
           {
                const char* digit = str;//用了一下中间变量,保存原始字符串,防止被破坏
                // the first char in the string maybe '+' or '-'
                bool minus = false;
                if(*digit == '+')//通过第一个字符判断是正是负
                       digit ++;
                else if(*digit == '-')
                 {
                       digit ++;
                       minus = true;
                 }
                // the remaining chars in the string
                while(*digit != '')//字符串结束标志
                 {
                      if(*digit >= '0' && *digit <= '9')
                       {
                             num = num * 10 + (*digit - '0');
                            // overflow  
                            if(num > std::numeric_limits::max())//整数溢出的情况
                             {
                                   num = 0;
                                   break;
                             }
                             digit ++;
                       }
                      // if the char is not a digit, invalid input
                      else
                       {
                             num = 0;
                            break;
                       }
                 }
                if(*digit == '')
                 {
                       g_nStatus = kValid;
                      if(minus)
                             num = 0 - num;//转化为负数的方式
                 }
           }
           return static_cast(num);
    }

    3.编写一个函数bubble_sort(),用冒泡法将数组int a[] = {49, 38, 65, 97, 76, 13, 27} 按升序排序。[7分]

    参考答案:

    #define SIZE 7


    void show(int num[])
    {
         int i; 
         printf(" ");
         for(i=SIZE; i>0; --i)
         {
             printf("%4d", num[SIZE-i]);
          } printf(" ");
           return;
    }
    void bubble_sort(int num[])
    {
        int i, j; 
        for(i=SIZE; i>0; --i)
        {
            int flag = 0;
            for(j=0; j<i-1; j++)
            {
                 int tmp;
                 if(num[j] > num[j+1])
                 {
                      tmp = num[j];
                      num[j] = num[j+1];
                      num[j+1] = tmp;
                      flag = 1;
                  }
              }
         show(num);
         if(flag == 0) //nerver been changed
             break; 
        }
         return;
    }
    int main(void)
    {
        /* original data */ 
         int array[SIZE] = {49, 38, 65, 97, 76, 13, 27};
         printf("the original numbers are: ");
         show(array); /* bubble sorting */ 
         printf("steps of bubble sorting: ");
         bubble_sort(array);
         return 0;
    }


    ≡ 本试卷共计32题,此处为结束标志。

  • 相关阅读:
    Androidの多线程之多线程用法大集合(未整理)
    Androidの多线程之更新ui(Thread+Handler+Message)
    构建之法阅读笔记1
    文件与流
    公文流转系统一
    JAVA web课堂测试1
    10.21动手动脑
    Android学习02
    Android学习01
    Android学习03
  • 原文地址:https://www.cnblogs.com/feige1314/p/7056322.html
Copyright © 2011-2022 走看看