网新恒天笔试题目

原文地址:网新恒天笔试题目 作者:hackbuteer
#include "stdio.h"
#include "stdlib.h"
void quiz(int m)
{
       if(m>1)
       {
           quiz(m/2);
           quiz(m/2);
       }
       printf("*");
}
int main(void)
{
      quiz(5);
      system("pause");
      return 0;
}
请问:输出几个*???(多次递归,******* 7个
 
 
 
面试题目:
一、费波纳茨数列的非递归表示:(类似于求最大公约数的辗转相除法)
int f(int n)   //求第n个费波纳茨数
{
      int a=1,b=1,c,i;
      for(i=3;i<=n;i++)
      {
            c=a+b;
            a=b;
            b=c;
      }
      return c;
}
int gcd(int m,int n)    //求最大公约数
{
      int r;
      while(r=m%n)
     {
          m=n;
          n=r;
     }
     return n;
}
 
二、变量的存储位置
int m;
int main(void)
{
      int k;
      static int p;
      char *s=(char *)malloc(2);
      return 0;
}
上述4个变量的存放位置在哪里?其默认输出值是多少??
答案:全局变量m与静态变量p存放的位置是一样的,共同占用同一块内存区,都在全局/静态存储区。
    注意:全局变量和静态变量如果没有手工初始化,则有编译器初始化为0,局部变量的值不可知,是随机的。(m、p的默认输出值为0)
    局部变量k是在需要的时候申请的,存放位置在栈上,由于局部变量没有初始化,其默认输出值是一个随机值。
    char *s=(char *)malloc(2);
    这条短短的语句包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针s呢?   它分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针s。在程序运行中,会首先确定在堆中分配内存的大小,然后调用operator new 分配内存,然会返回这块地址的首地址,放入栈中。
 
 
    在C++中,内存分成了5个区,它们分别是全局/静态存储区、堆、栈、自由存储区和常量存储区。
    全局/静态存储区被分配到了同一块内存区中。
    栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区,里面的变量通常是局部变量、函数参数等。
    堆:就是那些由new分配的内存块,他们的释放编译器不去管的,由我们的应用程序来手工控制释放的,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
   自由存储区:就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是由free来结束自己的生命的。

int main(void)
{
      int i=3,*j,z=5;
      j=&i;
      cout<<"i的地址"<
      cout<<"指针的地址"<<&j<
      cout<
      j=&z;
      cout<<"z的地址"<
      cout<<"指针的地址"<<&j<
      system("pause");
      return 0;
}
输出的第二个与第四个值完全是一样的,就是j这个指针首先指向i这个变量,然后又改变为指向z这个变量,但是指针的地址还是没有变的,只是指向发生了变化。

struct node
{
      int data;
      struct node *next;
}*s;
int main(void)
{
      int *p,k;
      s=(node *)malloc(sizeof(node));
      k=int(s);   // s是一个结构体指针,是一个十六进制的数,强制类型转换为十进制的int类型变量k
      p=(int*)(s);  // s是一个结构体指针,若要给int类型的指针进行赋值,需要进行强制类型转换,否则无法通过编译的。
      cout<
      cout<来操作data、next了
      cout<
      system("pause");
      return 0;
}
 
三、请问怎样用两个栈实现一个队列?
   照着这个思路做:
   假设两个栈 A 和B,且都为空。
   可以认为栈 A 为提供入队列的功能,栈 B 提供出队列的功能。
   入队列: 入栈 A
   出队列:
   1、如果栈 B 不为空,直接弹出栈 B 的数据。
   2、如果栈 B 为空,则依次弹出栈 A 的数据,放入栈 B 中,再弹出栈 B 的数据。
四、要对外存储器上的4G文件进行排序,内存只有2G大,如何实现?
五、对于一个频繁使用的短小函数,在C语言中应该使用什么来实现,在C++中应该使用什么来实现?
答案:C用宏定义,C++用inline函数。
    内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接镶嵌到目标代码中。
  内联函数要做参数类型检查,这是内联函数跟宏相比的优势。
  inline是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对于短小的代码来说,inline可以带来一定的效率提升,而且和C时代的宏函数相比,inline更安全可靠。可是这个是以增加空间消耗为代价的。
    宏是在代码处不加任何验证的简单替代,而内联函数是将代码直接插入调用处,而减少了普通函数调用时的资源消耗。
  宏不是函数,只是在编译前(编译预处理阶段)将程序中有关字符串替换成宏体。
  inline函数是函数,但在编译中不单独产生代码,而是将有关代码嵌入到调用处。
    内联函数与宏定义区别
  (1)内联函数在编译时展开,宏在预编译是展开;
  (2)内敛函数直接嵌入到目标代码中,宏是简单的做文本替换;
  (3)内敛函数有类型检测、语法判断等功能,而宏没有;
  (4)inline函数是函数,宏不是;
  (5)宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义;
 
六、自己编程实现strcpy、strlen字符串操作函数
char *strcpy(char *dest,char *src)
{
       if(dest==NULL || src==NULL)
             return NULL;
       if(dest==src)
             return dest;
       char *temp=dest;
       while((*dest++=*src++)!='');
             return temp;
}
int strlen(char *src)
{
       if(src==NULL)
             return 0;
       char *p=src;
       int length=0;
       while(*p++)
             length++;
       return length;
}

你可能感兴趣的:(教育)