嵌入式C语言面试3(附有自己做的答案)

更新时间:2023-09-14 16:05:01 阅读量: 初中教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

39 A,B从一堆玻璃球(共100个)里向外拿球,规则如下: (1)A先拿,然后一人一次交替着拿; (2)每次只能拿1个或2个或4个;

(3)谁拿最后一个球,谁就是最后的失败者; 问A,B谁将是失败者?写出你的判断步骤。 我们倒着分析,当此时轮到你拿球: 剩下1个时,你输了

剩下2个时,你拿掉1个,我输了 剩下3个时,你拿掉2个,我输了

剩下4个时,此时你可拿1、2个,不论你拿几个,我都能使剩下的为1个

剩下7个时,此时你可拿1、2、4个,不论你拿几个,我都能使剩下的为4或1个 剩下10个时,此时你可以拿1、2、4个,不论你拿几个,我都能使剩下的为7或4个 ……

依次类推,总结发现:谁能使拿完后剩下的球是3*n+1个,谁就赢

剩下100个,不论你拿几个,我都能使剩下的为3*n+1个,即97或94个 所以,根据本题,也就是谁先拿谁输,也就是A输 (仅供参考by zjh 2011-11-9)

40.已知:无序数组,折半查找,各元素值唯一。

函数原型是:Binary_Seach(int array[], int iValue, int iCount)

array是数组,在里面用折半查找的方法找等于iValue的值,找到返回1否则0,iCount是元素个数

41.统计一个字符串中字符出现的次数 C方法://自己写的方法见test24.cpp

int findStr(char *str, char *substr) /*这边的两个形参有没有给指针赋值?*/ {

int n;

char *p, *r; n = 0;

while (*str) /*“当*str值为真的时候?如果是,什么情况下为真呢”*/ {

p = str; r = substr; while (*r)

if (*r == *p) {

r++; p++; } else {

break; }

if (*r == '\\0') n++;

str++; }

return n; }

Java方法:

public static int GetCount(String strA, String strB)//此方法计算出现的次数 {

int i, counter = 0;

i = strA.IndexOf(strB);//strB在strA中首次出现的位置

while (i >= 0) {

counter++;

i = strA.IndexOf(strB,i+1); }

return counter; }

42.100位以上的超大整数的加法(主要考虑数据结构和加法的实现)。 43.对如下电文:\给出Huffman编码。 44.int (* (*f)(int, int))(int)表示什么含义? 它首先申明f为一个函数指针

它所指向的函数接受两个参数(int,int)

它所指向的函数返回一个函数的指针,类型为:int (*) (int)

45.x=x+1,x+=1,x++,为这三个语句的效率排序。并说明为什么。 x=x+1最低,因为它的执行过程如下: 1. 读取右x的地址;

2. x+1;

3. 读取左x的地址;

4. 将右值传给左边的x(编译器并不认为左右x的地址相同). x=+1其次,它的执行过程如下: 1. 读取右x的地址;

2. x+1;

3. 将得到的值传给x(因为x的地址已经读出). x++最高,它的执行如下: 1. 读取右x的地址;

2. x自增1.

46.中缀表达式 A-(B+C/D)*E的后缀形式是什么? 47.struct S1 {

char c; int i;

};

sizeof(S1) = ? 4+4=8

class X{ public: X();

virtual ~X(); //4

void myMemberFunc(); static void myStaticFunc();

virtual void myVirtualFunc(); //4 private: int i; //4

char * pstr; char a; //4 }

sizeof(X) = ? 16

48.找出两个字符串中最大子字符串,如\的最大子串为\

string MaxSameStr(string str1,string str2) 10 {

11 string result; 12 int max=0,first;

13 int len=0;//相同字符串的长度

14 int k,q; 15

16 //穷举 17 18 19 20 21 22

for(unsigned int i=0;i

for(unsigned int j=0;j

unsigned int k=i; unsigned int q=j;

if (str1[k]==str2[q])//发现相同的字母

23 {

24 first=k; //标记起始位置

25

while(str1[k]==str2[q]&&q

26 27 28 29 30

{

k++;q++; }

len=k-first;

if(len>max)//是否为目前最长字符串

31 {

32 33 34 35 36 37 38 39 max=len;

string temp(str1,first,len); result=temp; } } }

return result; }

49.有一百个整数,其中有负数,找出连续三个数之和最大的部分. 50.写一程序实现快速排序. 假设数据输入为一文件 快速算法描述如下

Algorithm Partition

Input: sequence a0, ..., an-1 with n elements

Output: permutation of the sequence such that all elements a0, ..., aj are less than or equal to all

elements ai, ..., an-1 (i > j) Method:

choose the element in the middle of the sequence as comparison element x let i = 0 and j = n-1 while ij

search the first element ai which is greater than or equal to x search the last element aj which is less than or equal to x if ij

exchange ai and aj let i = i+1 and j = j-1

After partitioning the sequence, Quicksort treats the two parts recursively by the same procedure.

The recursion ends whenever a part consists of one element only.

51.写一算法检测单向链表中是否存在环(whether there is a loop in a link list),

要求算法复杂度(Algorithm's complexity是O(n)) 并只使用常数空间(space is O(c)). 注意,你只知道一个指向单向链表头的指针。链表的长度是不定的,而且环出现的地方也是不定的,环有可能在头,有可能在中间。而且要求是检测, 不能破坏环的结构. 52.设下列函数已经通过了调试

bool Sort_Array(ArrayType * Pinputarray, ArrayType * Poutarray);

该函数在内存中排序,能把字节数最大为100M字节的ArrayType类型的数组排序。其中ArrayType是一个

预定义的数组类型(细节无关紧要),Pinputarray,Poutarray分别为排序前的指针和排序后的指针。

请用c语言的伪码风格设计一个算法,他调用上面给出的函数完成下列从输入到输出的任务:

输入:排序前的大文件,名称为char * pinoutfilename ,其内容为用分号分隔的ArrayType类型的数组元素,可装满4个100M字节的数组。 输出:排序后的大文件char * poutoutfilename。 53.用最有效率的方法算出2乘以8等於几? 54.

1.错误的转义字符是 (c )

A.'\\091' B.'\\\\' C.'\\0' D.'\\''

2.若数组名作实参而指针变量作形参,函数调用实参传给形参的是 (d ) A.数组的长度 B.数组第一个元素的值

C.数组所有元素的值 D.数组第一个元素的地址

3.变量的指针含意是指变量的 (b ) A.值 B.地址 C.存储 D.名字

5.某文件中定义的静态全局变量(或称静态外部变量)其作用域是 (d )应该是b吧 A.只限某个函数 B.本文件 C.跨文件 D.不限制作用域 55.

1. 解二次方程:a*x*x+b*x+c

int Quadratic( double a,double b,double c,double& x1,double& x2); 返回值:解的个数

2. 最大公约数

DWORD Divisor( DWORD dwFirst, DWORD dwSecond ); 返回值:最大公约数

3. 根据蒙特卡洛算法计算圆周率

double PI( DOWRD dwCount/*测试次数*/ ); 返回值:PI

4. 无符号整数乘法,乘数为32bit,结果为64bit 提示:32bit整数分解为16bit相乘

void Multiply( DWORD dwFirst, DWORD dwSecond, DWORD& dwHigh, DWORD& dwLower );

5. 链表排序(从小到大) 节点定义为:

struct Node{ int nValue;

struct Node* pNext; };

最后一个节点的pNext = NULL. Node* SortChain( Node* pHead ); 返回值:链表头

c/c++面试题集锦 2006-7-7更新

24.Assignment 2: Picture Processing

Use C++, Java, or similar languages or/and any middleware such as EJB and J2EE to process a picture with a high resolution (3 Mega Pixels for example). Use some methodologies to degrade the resolution of the picture to make it quicker for browsing. Then divide the degraded picture into 9 sectors equally. Click any of the 9 sectors will result a detailed picture for this sector with the same resolution as that of the original picture. This assignment is designed for you to demonstrate your ability to handle pictures. 25.用<<,>>,|,&实现一个WORD(2个字节)的高低位交换!!

26.要开辟P1,P2,P3,P4内存来做缓冲,大小自定,但这四个缓冲的大小要一样,并且是连续的!

27.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法) 28.找错:

#include #include class Base {

private:

char * name; public:

Base(char * className) {

name = new char[strlen(className)]; strcpy(name, className); }

~Base() {

delete name; }

char * copyName() {

char newname [256]; strcpy(newname, name); return newname; }

char * getName() {

return name; }

static void print(Base base) {

printf(\ } };

class Subclass : public Base {

public:

Subclass(char * className) : Base(className) { } };

int main() {

Base * pBase = new Subclass(\ Base::print(*pBase);

printf(\

printf(\ return 0; }

NetFetch [2006-07-07 09:22 AM] c/c++面试题集锦 2006-7-7更新

21.有双向循环链表结点:

typedef struct node {

int date;

struct node *front,*next; }_Node;

有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两上链表中date值相同的结点删除

22.

char * GetStr() {

char *tmp; tmp = \ return tmp; }

void main() {

printf(\ }

会输出123吗?123创建在堆上还是栈上呢?123的空间是什么时候释放的?

输出123,存在代码段(code segment/text segment)中,是静态存储区,程序执行完后释放;它既不属于堆,也不属于栈;它会编入.exe中,随可执行文件加载

23.

字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么? 类ClassB从ClassA派生,那么ClassA *a = new ClassB(…); 试问该表达是否合法?为什么?

如果ClassA中定义并实现虚函数int func(void),ClassB中也实现该函数,那么上述变量a->func()将调用哪个类里面的函数?如果int func(void)不是虚函数,情况又如何?为什么?

char **p, a[16][8]; 问:p=a是否会导致程序在以后出现问题?为什么? 如下所述的if else和switch语句哪个的效率高?为什么?

在同一个进程中,一个模块是否可以通过指针操作破坏其它模块的内存,为什么? 应用程序在运行时的内存包括代码区和数据区,其中数据区又包括哪些部分? NetFetch [2006-07-06 09:20 AM] c/c++面试题集锦 2006-7-6更新

18.Consider the following code:

#include #include

int main(int argc, char *argv[]) { int i = 1; char buf[4];

strcpy(buf, \ printf(\ return 0; }

a) When compiled and executed on x86, why does this program usually not output what the programmer intended? i=0

根据栈的特点:i先入栈,占4个字节,然后存buf,先入高地址,后如低地址

当执行完strcpy后,实际是从buf[0]的地址开始连续拷贝了5个字节的内容,因为用字符串给字符数组赋值时,后面会默认添加一个’\\0’,也就是0,当执行完strcpy后,此时i实际指向的内容是0。按由高到低的存放顺序,其内容如下示意: (高)i buf (低地址,栈顶) 没执行strcpy前:0 0 0 1 0 0 0 0 执行完strcpy后:0 0 0 0 D C B A

b) Name several ways in which the security problem that causes this

program not to output what the programmer intended can be prevented WITHOUT changing the code. 不改变代码的几种解决办法:(实际还是产生了溢出) 方法1:把这两个变量中的一个或者两个申明为全局变量,或者静态变量 方法2:把这两个变量的定义换一下顺序

19.int w=1,x=2,y=3,z=4; m=(w

printf(\说出结果 1

20.说出结果

#include main() {

FILE *fp;

int i,a[4]={1,2,3,4},b;

fp=fopen(\这里帮忙解释一下 for(i=0;i<4;i++)

fwrite(&a[i],sizeof(int),1,fp);//这里也帮忙看一下 fclose(fp);

fp=fopen(\

fseek(fp,-2L*sizeof(int),SEEK_END);//还有这里 fread(&b,sizeof(int),1,fp);//这里还有也看一下 fclose(fp);

printf(\ //3 }

NetFetch [2006-07-06 09:19 AM] c/c++面试题集锦 2006-7-6更新

12.请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。

a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请 给出该题的至少一个不同解法。

b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。 c)请编写一个 C 函数,该函数将给定的一个整数转换成字符串。 d)请编写一个 C 函数,该函数将一个字符串逆序。

e)请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回 该字符所在位置索引值。

f)请编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串, 该字符串是由同一字符组成的。

给出演示上述函数功能的一个简单程序,并请编写对应的 Makefile 文件

13.我们需要编写一个图形相关的应用程序,需要处理大量图形(Shape)信息, 图形有矩形(Rectangle),正方形(Square),圆形 (Circle)等种类,应用 需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准 输出上打印信息的方式做为示意)。

a)请用面向对象的方法对以上应用进行设计,编写可能需要的类 b)请给出实现以上应用功能的示例性代码,从某处获取图形信息, 并且进行计算和绘制

c)如果你的Square继承自Rectangle,请给出理由,如果不是, 请给出理由,并且请比较两种方式的优劣

d)请问你所编写的类,在如下代码中会有何表现,请解释

void test_rectangle_area(Rectangle& r) {

r.set_width(10); r.set_height(15);

assert(r.area() == 150); }

14.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编程实现删除此节点

15.写一个程序,把一个100以内的自然数分解因数。(自然数分解因数就是将一个自然数分解为几个素数的乘积,提示,由于该数不是很大,所以可以将质数保存在数组中,以加快计算速度)

16.编写一个Identify的分配、释放的函数,为1-10000之间的自然数。

17.分别实现itoa和atoi.

NetFetch [2006-07-06 09:18 AM] c/c++面试题集锦 2006-7-6更新

1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的? 虚函数表示是在编译时建立的,运行时动态绑定虚函数。

2.将一个 1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个 字符存到新文件的第一个字符,以此类推。

3.main主函数执行完毕后,是否可能会再执行一段代码?

crt会执行另一些代码,进行处理工作。

如果你需要加入一段在main退出后执行的代码,可以使用atexit()函数,注册一个函数。

#include

#include

void fn1( void ), fn2( void ), fn3( void ), fn4( void ); // atexit()以栈的方式注册函数,先注册的函数会后执行。 void main( void ) {

atexit( fn1 ); atexit( fn2 ); atexit( fn3 ); atexit( fn4 );

printf( \

return; }

void fn1() {

printf( \}

void fn2() {

printf( \}

void fn3() {

printf( \}

void fn4() {

printf( \}

4.一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? 在子类的空间里,有没有父类的这个函数,或者父类的私有变量?

只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态的实现。如果子类使用了virtual关键字,则可通过重载实现对父类虚函数的隐藏。 容易与隐藏混淆:

隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

1) 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

5.给一个字符串、例如 “ababc”要求返回“ab”. 因为“ab”连续重复出现且最长。 用C/C++语言写一函数完成该算法,给出复杂度

6.对序列1、1、2、3、5、8、13。。。。 是Fab..数列

2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质 给出k,返回第k小的Fab..质数

7.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。 方法1:

把硬币分成50,50,1。

称50与50,如果平衡,则这两堆为真币,剩下的1为假币。再用这个假币和真币称一下得结论。

若不平衡,则1为真币,接着判断假币在哪个堆里面。

取轻的1堆,分成25,25,称重。若平衡则假币在另一堆里面,假币重。 若不平衡,则假币在这一堆中,假币轻。

方法2:

把硬币分成33,33,34。

称33与33,如果平衡,则这两堆为真币,假币在第三堆中。从66中取出34与第三堆进行称,第三堆所在的天平的那一端的轻重就是假币的轻重情况。

若不平衡,则假币在这两堆中。取下轻的一堆,从34里面取出33替换,称量。如果平衡,代表取下的那一堆中有假币,假币是轻的。如果不平衡,代表取下的那一堆是真币,假币是重的。

8.完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数,请问这些函数有什么区别,你喜欢使用哪个,为什么?

9.变量的声明和定义有什么区别?

一般来说我们把分配变量地址和存储空间的称为定义,不分配地址的称为声明。 声明只是告诉编译器,有这个变量,具体在哪里让它自己去找。 定义则是把具体的存储位置也告诉了编译器。 extern表示外部的变量,是声明而不是定义。

10.请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质: #include #include

int main(void) {

char a[30];

char *b = (char *)malloc(20 * sizeof(char)); printf(\ //30 printf(\ //4 printf(\//1 printf(\//4 printf(\// 1 return 0 ; }

添加:问:int **a[3][4],分配多少空间?

首先它是一个3*4大小的数组,数组中存放的是int**型数据,其实该题就是在问int **的大小,int*、int**、float*、float**、char*、char**都是占4个字节,所以结果为: 3*4*4=48

NetFetch [2006-06-20 11:18 AM] 4.

#i nclude \

#define SQR(X) X*X

int main(int argc, char* argv[]) {

int a = 10; int k = 2; int m = 1;

a /= SQR(k+m)/SQR(k+m); printf(\

return 0; }

这道题目的结果是什么啊?

define 只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的 a /= (k+m)*(k+m)/(k+m)*(k+m); =>a /= (k+m)*1*(k+m); =>a = a/9; =>a = 1;

NetFetch [2006-06-20 11:17 AM]

3.请简单描述Windows内存管理的方法。

内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~ 我先说个大概,希望能够抛砖引玉吧

当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运

行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。

内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理

块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。

页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。

段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。

段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。

各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似

本文来源:https://www.bwwdw.com/article/mgfh.html

Top