网新恒天笔试题目
#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就要对应一个。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区:就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是由free来结束自己的生命的。
int main(void)
{
int i=3,*j,z=5;
j=&i;
cout<<\"i的地址\"<<j<<endl;
cout<<\"指针的地址\"<<&j<<endl;
cout<<sizeof(j)<<endl;
j=&z;
cout<<\"z的地址\"<<j<<endl;
cout<<\"指针的地址\"<<&j<<endl;
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<<k<<endl;
// 将s这个结构体指针指向的十六进制地址,转化为int类型的变量
cout<<p<<endl;
//s转换为int类型的指针后,p跟s的值还是一样的,只不过p不能通过->来操作data、next了
cout<<s<<endl;
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++)!=\\\0\);
return temp;
}
int strlen(char *src)
{
if(src==NULL)
return 0;
char *p=src;
int
length=0;
while(*p++)
length++;
return length;
}【网新恒天笔试题目】相关文章:
1.海信网申笔试题目
2.笔试题目
3.金立笔试题目
4.KPMG笔试题目
5.笔试题目4
6.笔试题目1
7.笔试题目5
8.Sony笔试题目