范文一:嵌入式C笔试题
考查一个初级嵌入式系统开发人员的C基本功,附有答案题目由资深嵌入式系统专家拟定,
目的是考查入门级的嵌入式软件开发人员 Gavin Shaw提供详细解答
编者按:非常基本关于C语言的问题,一个信息类(计算机,资讯工程,电子工程, 通信工程)专业
的本科毕业生应该达到的水平。题目不难,全部都能快速地答完,当然也需要一定的知识储
备。
对于大多数人,我们预期你可能答错 3) 4) 15)题,所以答错3道以内的,我们认为你很
棒
答错5道题以内,我们认为你还不错(你还可能答错第9题)
如果你有6道以上的题目不能答对,基本上我们都不好说什么了....
约定:
1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了
2)数据类型
char 一个字节 1 byte
int 两个字节 2 byte (16位系统,认为整型是2个字节)
long int 四个字节 4 byte
float 四个字节4 byet
double 八个字节 8 byte
long double 十个字节 10 byte
pointer 两个字节 2 byte(注意,16位系统,地址总线只有16位)
第1题: 考查对volatile关键字的认识
#includestatic jmp_buf buf;main() { volatile int b; b =3;
if(setjmp(buf)!=0) { printf(
问,这段程序的输出是
(a) 3
(b) 5
(c) 0
(d) 以上均不是
第1题: (b)
volatile字面意思是易于挥发的。这个关键字来描述一个变量时,意味着 给该变量赋值(写
入)之后,马上再读取,写入的值与读取的值可能不一样,所以说它
这是因为这个变量可能一个寄存器,直接与外部设备相连,你写入之后,该寄存器也有可能
被外部设备的写操作所改变;或者,该变量被一个中断程序,或另一个进程
改变了.
volatile 不会被编译器优化影响,在longjump 后,它的值 是后面假定的变量值,b最后的值是
5,所以5被打印出来.
setjmp : 设置非局部跳转 /* setjmp.h*/
Stores context information such as register values so that the lomgjmp function can return control
to the statement following the one calling setjmp.Returns 0 when it is initially called.
Lonjjmp: 执行一个非局部跳转 /* setjmp.h*/
第2题:考查类型转换
main(){ struct node { int a; int b; int c; }; struct node s= { 3,
5,6 }; struct node *pt = &s; printf(
(a) 3
(b) 5
(c) 6
(d) 7
第2题: (a)
结构题的成员在内存中的地址是按照他们定义的位置顺序依次增长的。如果一个结构体的指
针被看成 它的第一个成员的指针,那么该指针的确指向第一个成员
第3题:考查递归调用
int foo ( int x , int n) { int val; val =1; if (n>0) { if (n%2 == 1) val = val
*x; val = val * foo(x*x , n/2); } return val;} 这段代码对x和n完成什么样的功能
(操作)?
(a) x^n (x的n次幂)
(b) x*n(x与n的乘积)
(c) n^x(n的x次幂)
(d) 以上均不是
第3题: (a)
此题目较难.
这个程序的非递归版本
int what ( int x , int n){ int val; int product; product =1; val =x; while(n>0) { if
(n%2 == 1) product = product*val; /*如果是奇数次幂, x(val) 要先乘上一次,; 偶数次幂,最后
返回时才会到这里 乘以1*/
val = val* val; n = n/2; } return product;}/* 用二元复乘策略
*/
算法描述
第4题:考查指针,这道题只适合于那些特别细心且对指针和数组有深入理解的人
main() { int a[5] = {1,2,3,4,5}; int *ptr = (int*)(&a+1); printf(
*(ptr-1) );} 这段程序的输出是:
(a) 2 2
(b) 2 1
(c) 2 5
(d) 以上均不是
第4题: (c)
a的类型是一个整型数组,它有5个成员
&a的类型是一个整型数组的指针
所以&a + 1指向的地方等同于 a[6]
所以*(a+1) 等同于a[1]
ptr等同 a[6], ptr-1就等同与a[5]
第5题:考查多维数组与指针
void foo(int [][3] ); main(){ int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}}; foo(a);
printf(
(a) 8
(b) 9
(c) 7
(d)以上均不对
第5题: (b)
题目自身就给了足够的提示
b[0][0] = 4
b[1][0] = 7
第6题目:考查逗号表达式
main(){ int a, b,c, d; a=3; b=5; c=a,b; d=(a,b); printf(
这段程序的输出是:
(a) c=3 d=3
(b) c=5 d=3
(c) c=3 d=5
(d) c=5 d=5
第6题: (c)
考查逗号表达式,逗号表达式的优先级是很低的,比 赋值(=)的优先级 低. 逗号表达式的值
就是最后一个元素的值
逗号表达式的还有一个作用就是分割函数的参数列表..
E1, E2, ..., En
上面这个表示式的左右是,E1, E2,... En的值被分别计算出来,En计算出来的结构赋给整个逗
号表达式
c=a,b; / *yields c=a* /d=(a,b); /* d =b */
第7题:考查指针数组
main(){ int a[][3] = { 1,2,3 ,4,5,6}; int (*ptr)[3] =a; printf(
++ptr; printf(
(a) 2 3 5 6
(b) 2 3 4 5
(c) 4 5 0 0
(d) 以上均不对
第8题:考查函数指针
int *f1(void){ int x =10; return(&x);}int *f2(void){ int*ptr; *ptr =10; return ptr;}int
*f3(void){ int *ptr; ptr=(int*) malloc(sizeof(int)); return ptr;}上面这3个函数哪一个最可
能引起指针方面的问题
(a) 只有 f3
(b) 只有f1 and f3
(c) 只有f1 and f2
(d) f1 , f2 ,f3
第8题: (c)
f1显然有问题,它返回一个局部变量的指针,局部变量是保存在stack中的,退出函数后,局
部变量就销毁了,保留其指针没有意义,因为其指向的stack空间可能被其他变量覆盖了
f2也有问题, ptr是局部变量,未初始化,它的值是未知的,*ptr不知道指向哪里了,直接给
*ptr赋值可能会覆盖重要的系统变量,这就是通常说的野指针的一种
第9题:考查自加操作(++)
main(){ int i=3; int j; j = sizeof(++i+ ++i); printf(
(a) i=4 j=2
(b) i=3 j=2
(c) i=3 j=4
(d) i=3 j=6
第9题: (b)
sizeof 操作符给出其操作数需要占用的空间大小,它是在编译时就可确定的,所以其操作
数即使是一个表达式,也不需要在运行时进行计算.( ++i + ++ i )是不会执行的,所以
i 的值还是3
第10题:考查形式参数,实际参数,指针和数组
void f1(int *, int); void f2(int *, int); void(*p[2]) ( int *, int);main(){ int a; int b; p[0] = f1;
p[1] = f2; a=3; b=5; p[0](&a , b); printf(
printf(
f2( int* p , int q){ int tmp; tmp =*p; *p = q; q= tmp;} 这段程序的输出是:
(a) 5 5 5 5
(b) 3 5 3 5
(c) 5 3 5 3
(d) 3 3 3 3
第10题: (a)
很显然选a.
f1交换*p 和 q的值,f1执行完后, *p 和 q的值的确交换了, 但 q的改变不会影响到 b
的改变, *p 实际上就是 a
所以执行f1后, a=b=5
这道题考查的知识范围很广,包括typedef自定义类型,函数指针,指针数组
void(*p[ 2 ]) ( int *, int);
定义了一个函数指针的数组p,p有两个指针元素. 元素是函数的指针,函数指针指向的函数
是一个带2个参数,返回void的函数,所带的两个参数是 指向整型的指针,和整型
p[ 0 ] = f1; p[ 1 ] = f2 contain address of function .function name without parenthesis represent
address of function Value and address of variable is passed to function only argument that is
effected is a (address is passed). Because of call by value f1, f2 can not effect b
第11题:考查自减操作(--)
void e(int ); main(){ int a; a=3; e(a);}void e(int n){ if(n>0) { e(--n);
printf(
(a) 0 1 2 0
(b) 0 1 2 1
(c) 1 2 0 1
(d) 0 2 1 1
第11题: (a)
考查--操作和递归调用,仔细分析一下就可以了
第12题:考查typedef类型定义,函数指针
typedef int (*test) ( float * , float*)test tmp; tmp 的类型是
(a) 函数的指针,该函数以 两个指向浮点数(float)的指针(pointer)作为参数(arguments)
Pointer to function of having two arguments that is pointer to float
(b) 整型
(c) 函数的指针,该函数以 两个指向浮点数(float)的指针(pointer)作为参数(arguments),并且
函数的返回值类型是整型
Pointer to function having two argument that is pointer to float and return int
(d) 以上都不是
第12题: (c)
分析函数声明,建议不会的看看《C专家编程》
这里介绍一个简单规则:从左往有,遇到括号停下来,将第一个括号里的东西看成一个整体
第13题:数组与指针的区别与联系
main(){ char p; char buf[10] ={ 1,2,3,4,5,6,9,8}; p = (buf+1)[5]; printf(
序的输出是:
(a) 5
(b) 6
(c) 9
(d) 以上都不对
第13题: (c)
考查什么时候数组就是指针.对某些类型T而言,如果一个表达式是 T[] (T的数组), 这个
表达式的值实际上就是指向该数组的第一个元素的指针.所以(buf+1)[5]实际上就是*(buf +6)
或者buf[6]
第14题: 考查指针数组的指针
Void f(char**);main(){ char * argv[] = {
f( char **p ){ char* t; t= (p+= sizeof(int))[-1]; printf(
(b) cd
(c) ef
(d) gh
第14题: (b)
sizeof(int)的值是2,所以p+=sizeof(int) 指向 argv[2],这点估计大家都没有什么疑问
(p+=sizeof(int))[-1] 指向 argv[1],能理解吗,因为(p+=sizeof(int))[-1] 就相当于 (p+=2)[-1] ,
也就是(p+2-1)
第15题:此题考查的是C的变长参数,就像标准函数库里printf()那样,这个话题一般国内大学
课堂是不会讲到的,不会也情有可原呵呵,
#includeint ripple ( int , ...);main(){ int num; num = ripple ( 3, 5,7); printf(
num);}int ripple (int n, ...){ int i , j; int k; va_list p; k= 0; j = 1; va_start( p , n);
for (; j
return k;}这段程序的输出是:
(a) 7
(b) 6
(c) 5
(d) 3
第15题: (c)
在C编译器通常提供了一系列处理可变参数的宏,以屏蔽不同的硬件平台造成的差异,增
加程序的可移植性。这些宏包括va_start、 va_arg和va_end等。
采用ANSI标准形式时,参数个数可变的函数的原型声明是:
type funcname(type para1, type para2, ...)
这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分。
type是函数返回值和形式参数的类型。
不同的编译器,对这个可变长参数的实现不一样 ,gcc4.x中是内置函数.
关于可变长参数,可参阅
第16题:考查静态变量的知识
int counter (int i){ static int count =0; count = count +i; return (count );}main(){ int i , j;
for (i=0; i
(a) 10
(b) 15
(d) 7
详细参考答案
Transfers control to the statement where the call to setjmp (which initialized buf) was made.
Execution continues at this point as if longjmp cannot return the value 0.A nonvolatile automatic
variable might be changed by a call to longjmp.When you use setjmp and longjmp, the only
automatic variables guaranteed to remain valid are those declared volatile.
Note: Test program without volatile qualifier (result may very)
更详细介绍,请参阅 C语言的setjmp和longjmp
(while n>0) { if next most significant binary digit of n( power) is one then multiply
accumulated product by current val , reduce n(power) sequence by a factor of two using
integer division . get next val by multiply current value of itself }
第7题: (a)
ptr是一个数组的指针,该数组有3个int成员
http://www.upsdn.net/html/2004-11/26.html
http://www.upsdn.net/html/2004-11/24.html
程序分析
va_list p; /*定义一个变量 ,保存 函数参数列表 的指针*/va_start( p , n); /*用va_start
宏 初始化 变量p, va_start宏的第2个参数n , 是一个固定的参数, 必须是我们自己定义的变长函数的最后一
个入栈的参数 也就是调用的时候参数列表里的第1个参数
*/for (; j
/*va_arg取出当前的参数, 并认为取出的参数是
一个整数(int) */ for (; i; i &=i-1 ) /*判断取出的i是否为0*/ ++k; /* 如果i不为0, k自加, i与i-1进行与逻辑运
算, 直到i 为0 这是一个技巧,下面会谈到它的功能
*/}当我们调用ripple函数时,传递给ripple函数的 参数列表的第一个参数n的值是3 .
va_start 初始化 p士气指向第一个未命名的参数(n是有名字的参数) ,也就是 is 5 (第一个).
每次对 va_arg的调用,都将返回一个参数,并且把 p 指向下一个参数.
va_arg 用一个类型名来决定返回的参数是何种类型,以及在 var_arg的内部实现中决定移动
多大的距离才到达下一个 参数
(; i; i&=i-1) k++ /* 计算i有多少bit被置1 */
5用二进制表示是 (101) 2
7用二进制表示 (111) 3
所以 k 返回 5(2+3),也即本题应该选c
举个例子,就很好理解了
令 i= 9 = 1001 i-1 = 1000 (i-1) +1 = i 1000 +1 1 001因为i与i-1的最右边的那位(最低位) 肯定是不同,如果i1,i-1肯定
是0,反之亦然. i & i-1 这个运算,在二相补的数字系统中,将会 消除最右边的1位
第16题: (b)
答案是 (b)
相传高斯小学一年级的时候就会做这类等比数列的题目了.这道题考查的是静态变量的知识,
当每次调用完函数之后,静态变量的值不会丢失,这与栈中的临时局部变量明显不同的地方.
所以,第一次调用counter(0)之后,count =0
第二次调用 counter(1)后 count = 0+1;
第三次调用 counter(2) count = 1+2; /* count = count +i */
第四次调用 counter(3) count = 3+3;
第五次调用 counter(4) count = 6+4;
第六次调用 counter(5) count = 10+5;
命题人信息 Ashok K. Pathak a member ( Research Staff ) at Bharat Electronics Limited (CRL) , Ghaziabad. He has been developing embedded application for the past five years .Ashok holds a M.E in computer science and engineering . Ashok recently completed a book about'
转载请注明出自应届生求职招聘论坛 http://bbs.yingjiesheng.com/,本贴地址:http://bbs.yingjiesheng.com/thread-37799-1-1.html
范文二:嵌入式笔试题
1, TCP/IP网络模型
Linux中应用层,传输层,网际层,网络接口
Osi中应用层,表示层,会话层,传输层,网络层数据链路层,物理层, 2, 简述计算机操作系统原理或编译原理课程内容
第二部分 操作系统用户界面(2学时)
第三部分 进程管理(20学时)
第四部分 处理机调度(6学时)
第五部分 存贮管理(12学时)
第六部分 文件管理(10学时)
第七部分 设备管理(6学时)
第八部分 网络与分布式处理(4学时)
3什么是实时嵌入式系统,目前比较流行的有哪几种,
时系统能够在指定或者确定的时间内完成系统功能和外部或内部、同步或异步时间做出实
响应的系统。
Vxworks psos palm os windows CE linux UC/OS-2
4常见的排序算法有哪些
插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序 5微处理器的结构有哪两种 区别在哪
流水线结构,非流水线结构是指一个指令周期完成以后再接受下一条处理数据的指令;而流水线结构,每个时钟脉冲都接受下一条处理数据的指令,只是不同的部件做不同的事情,就象生产线流水操作一样,并不是等一个或一批产品做完,再接受下一批生产命令,而是每个工序完成以后,立即接受下一批生产任务。这样提高了系统处理数据的速度。
6数据结构课程的内容 并详述一种常见数据结构及其操作
7介绍嵌入式系统中常见的串行总线
I2C,SPI,USB,RS_232,CAN,LIN
8面向对象和面向过程的区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
9描述C语言指针的各种用法
指针表示法,指针运算,指针和数组,指针和函数,指针和字符串。指针和结构 10介绍一种你熟悉的嵌入式处理器
X86、Am186/88、ARM、MIPS、PowerPC68K
是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特
范文三:嵌入式笔试
1.via的考题一道
这个程序设计的思想是这样的:
为了测试32位机上的浮点数的运算精度,作如下考虑:
当1.5 == 1时(二进制1.1==1)精度为1个小数位
当1.25 == 1时(二进制1.01==1)精度为2个小数位
继续判断测试,直到两者相等,从而得到精度。
所以程序代码如下:
int main()
{ int nCount;
float number1,number2;
nCount = 0;
number1 = 1.0;
number2 = 1.0
while( number1 + number2 != number1 ){
nCount++;
number2 /= 2.0;
}
printf( "%d bits accruacy.\n", nCount );
}
问题是,结果为多少?
经测试得64或者53或者24(稍加改动)。。。
得53和24已基本得出答案,主要是ieee 754标准中规定单双精度数字的底数 指数 符号位所置。。。64的目前还没有得出结论。。。
2.改错题
void mymul(double *p)
{
*p *= 2.0;
}
int main(int argc, char *argv[])
{
float f = 6.0;
mymul((double *) &f);
printf("now f = %f\n", f);
return 0;
}
直接运行,结果为6.00000
这个题目很简单,可以有很多种改法,如:a.把float f=6.0;改为double f=6.0;睛面的mymul句不要强制类型转化 b.把所有的数都当成float型来处理 等等 但往细的方面想,float型默认4字节,double型默认8字节,虽然在vc6下能勉强运行(运行时报出调试窗口),但单步跟踪发现在mymul()中并没有得到正确执行,而是:Access Violation,这个错误常常在计算机用户运行的程序试图存取未被指定使用的存储区时遇到中,可见mymyl()这个函数并没有得到正确的执行。。。同样,用gcc来直接编译上述程序,虽然没有报错,但结果仍然为
6.00000,可能gcc也是在执行mymul()时没有正确执行(不过我没拿gdb来跟踪看)
以下内容是补充,主要是一些基础的知识
3.二维数组空间的动态申请
a.简单的,已经有一维,如
char (*c)[5];
c=new char[n][5];//n为已定义的行数
b.二维的
int **p;
p=new int*[m_row];//创建行指针
for(int i=0;i
p[i]=new int[m_cols];
写到某一个函数中:
void getmemory(int ** &p,int m_row,int m_cols)
{
p=new int*[m_row];//创建行指针
for(int i=0;i
p[i]=new int[m_cols];
}
释放空间:
void deletememory(int **&p,int m_row)
{
//释放每一行所分配的空间
for(int i=0;i<>
delete [] x[i];
//释放行指针
delete [] x;
x=0;
via嵌入式笔试两题
-|yingwang294 发表于 2006-10-31 10:40:00
以下是威盛嵌入式笔试的最后两道小题
题一:
原题如下:改程序,并确定运行结果
#i nclude #i nclude char *getstring(void) { char p[]="hello everyone"; return p; } char *getmemory(void) { return (char *)malloc(10); } int main(int argc, char* argv[]) { char *p=getmemory(); strcpy(p,"helloworld"); printf("%s",p); printf("%s",getstring()); return 0; } 这个主要是char p[]前少一个static... 题二: 读程序,写出运行结果 #i nclude #i nclude #i nclude typedef struct { int value; char type; }head_t; typedef struct { head_t head; int para; }message_t; void main(void) { message_t *message=NULL; head_t *head=NULL; message=(message_t *)malloc(sizeof(message_t)); assert(message); memset(message,0,sizeof(message_t)); message->para=100; message->head.type='a'; head=(head_t *)message; head->value++; head->type++; printf("message->head.value="/%d, message->head.type=%c,message->para=%d\n",me ssage->head.value,message->head.type,message->para); " free(message); return; } 凹凸笔试题目(嵌入式软件开发) 2006-11-15 11:38 Embedded Software Design Engineer 1 读程序段,回答问题 int main(int argc,char *argv[]) { int c=9,d=0; c=c++%5; d=c; printf("d=%d\n",d); return 0; } a) 写出程序输出 b) 在一个可移植的系统中这种表达式是否存在风险?why? #include "stdio.h" int a=0; int b; static char c; int main(int argc,char *argv[]) { char d=4; static short e; a++; b=100; c=(char)++a; e=(++d)++; printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e); return 0; } a) 写出程序输出 b) 编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg. stack,heap,data section,bss section),最好用图形方式描述。 2 中断是嵌入式系统中重要的组成部分,这导致了许多编译开发商提供一种扩展:让标准C支持中断,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论以下这段代码。 __interrupt double compute_area(double radius) { double area = PI * radius *radius; printf("nArea = %f", area); return area; } 3 C/C++基础知识问题 a) 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述)。 b) C语言中static关键字的具体作用有哪些 ? c) 请问下面三种变量声明有何区别?请给出具体含义 int const *p; int* const p; int const* const p; 4 嵌入式系统相关问题 a) 对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。 b) 在ARM系统中,函数调用的时候,参数是通过哪种方式传递的? c) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别? 5 设周期性任务P1,P2,P3的周期为T1,T2,T3分别为100,150,400;执行时间分别为20,40,100。请设计一种调度算法进行任务调度,满足任务执行周期及任务周期。 6 优先级反转问题在嵌入式系统中是一中严重的问题,必须给与足够重视。 a) 首先请解释优先级反转问题 b) 很多RTOS提供优先级继承策略(Priority inheritance)和优先级天花板策略(Priority ceilings)用来解决优先级反转问题,请讨论这两种策略。 时间:2005-06-25 地点:深圳南山区 方式:闭卷,写程序 1、将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少bit被置1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数转换为字符串 A卷 1.“栈 stack”和“堆 heap”有什么区别,写两个函数分别在栈上和堆上分配内存,在堆上分配内存应注意哪些问题? 2. 信号量是什么?有什么区别?使用信号量进行任务间通信有何优缺点? 3.TCP/IP通信建立的过程怎样,端口有什么作用? 4.进程间的通信方法,比较其优缺点 5.什么是MTU,如何检测整个通信链路上的MTU值? 6.请指出下面程序的错误 unsigned char i = 10; char b = 100; char* p; void f(void) { While(--i>=0) { *(p++) = b; } } 7.在socket编程过程中,对端A向应用程序B(应用程序B负责多个模块)发送数据,如果对端A shutdown,而应用程序B要忽略此信号,为什么? 8.(附加题,可选做)编程实现: 快速创建一个1G的文件,逆序读取文件。 B卷:1.什么事随机存储中的大小端模式?写一段用来判别编译器内存存储方式是大端模式还是小端模式的代码 2.找出下面一段ISR问题 __interrupt double compute_area (double radius) { double area = PI * radius * radius; printf("\nArea = %f", area); return area; } 3.关键字const是什么含义?指出下列声明的意义。 1)const int* p; 2) int const* p; 3) int*const p; 4) const int*const p; 4.请写出OSI网络模型。常见网络连接设备:集线器,交换机,路由器,网关分别对应哪一层。并简单介绍交换机、集线器和路由器的区别? 5.请描述进程,线程,轻量级进程的概念。Linux中线程是何如实现的? 6.写出socket通信的基本过程。 7.编写一个函数,实现任意两段内存之间的快速拷贝 函数接口 :int my_memcpy(void* dst,void* src,int size) 要求: 实现任意两端内存之间的正确拷贝; 注重效率,拷贝速度越快越好;(使用对齐4字节拷贝代替单字节拷贝)。 8.(附加题,可选做)快速创建一个1G的文件,对其进行写入,关闭文件读取,若为乱序读取(每次随机读取一定字节,共读完1G),计算所需的时间。 1 、将一个字符串逆序 2链链链链 、将一个表逆序 3链链链链链链链链、算一个字里,byte,里面有多少bit被置1 4链链链链链、搜索定的字(byte) 5链链链链链链 、在一个字符串中找到可能的最的子字符串 6链链链链链 、字符串整数 7链链链链链链、整数字符串 /* * 链目:将一个字符串逆序 * 链链链完成:2006.9.30链链链深圳极网吧 * 链链链链版刘志所有强 * 链链链链链链链链链链链链链链链链链链链链链链链链链链链链链链链描述:写本程序的目的是希望一下手,希望下午去面能成功,不希望国之后再去找工作拉: */ #include using namespace std;//#define NULL ((void *)0)char * mystrrev(char * const dest,const char * const src) { if (dest==NULL && src==NULL) return NULL; char *addr = dest; int val_len = strlen(src);dest[val_len] = '\0';int i; for (i=0; i *(dest+i) = *(src+val_len-i-1); } return addr; } main() { char *str="asdfa"; char *str1=NULL; str1 = (char *)malloc(20);if (str1 == NULL) cout<<"malloc><"malloc><> str1=NULL;//链链链链杜野指 } p=head; q=p->next; while(q!=NULL) { temp=q->next; q->next=p; p=q; q=temp; } 链链链链链链链链链链链增加个助的指就行。 ok 链链链链链链链 通的代: #include #include #include struct List *next; }List; List *list_create(void) { struct List *head,*tail,*p; int e; head=(List *)malloc(sizeof(List)); tail=head; printf("\nList Create,input numbers(end of 0):"); scanf("%d",&e); while(e){ p=(List *)malloc(sizeof(List)); p->data=e; tail->next=p; tail=p; scanf("%d",&e);} tail->next=NULL; return head; } List *list_reverse(List *head) { List *p,*q,*r; p=head; q=p->next; while(q!=NULL) { r=q->next; q->next=p; p=q; q=r; } head->next=NULL; head=p; return head; } void main(void) { struct List *head,*p; int d; head=list_create(); printf("\n"); for(p=head->next;p;p=p->next) printf("--%d--",p->data); head=list_reverse(head); printf("\n"); for(p=head;p->next;p=p->next) printf("--%d--",p->data); } 链写函数数N个BYTE的数据中有多少位是1。解:此按解:先定位到某一个链链链链链链链链链链链BYTE链链链链链链链链步数据,再算其中有多少个1。叠加得解。 #incluede #define N 10 //链定BYTE链链链型名 #ifndef BYTE typedef unsigned char BYTE;#endif int comb(BYTE b[],int n){ int count=0; int bi,bj; BYTE cc=1,tt; //链遍到第bi个BYTE数据 for(bi=0;bi<> //链链算BYTE的8个bit中有多少个1 tt=b[bi]; for(bj=0;bj<> //与1相与或模2链果是否是1链链链链,当前bit链是否1 //if(tt%2==1) if((tt&cc)==1){ count++; } //右移一位或除以2,效果相同//tt=tt>>1; tt=tt/2; } } return count; } //链链 int main() { BYTE b[10]={3,3,3,11,1,1,1,1,1,1}; cout<> } 1链链链链 。写一个C 链链链链链链链链链链链链链链链链链链链链链链链函数,函数在一个字符串中找到可能的最的子字符串, 且字符串是由同一字符成的。链链链链链链链链链链链链链链 char * search(char *cpSource, char ch) { char *cpTemp=NULL, *cpDest=NULL; int iTemp, iCount=0;while(*cpSource) { if(*cpSource == ch){ iTemp = 0; cpTemp = cpSource;while(*cpSource == ch) ++iTemp, ++cpSource;if(iTemp > iCount) iCount = iTemp, cpDest = cpTemp; if(!*cpSource) break; } ++cpSource; } return cpDest; } #include // 链链链自定函数MyAtoI // 链链链链链链链链链整数字符串出 // 链链链链链链链链链程序不字符串的正确性,链链链链链链链链用在用前// int MyAtoI(char str[]){ int i; int weight = 1; // 链重 int rtn = 0; // 用作返回 for(i = strlen(str) - 1; i >= 0; i--) { rtn += (str[i] - '0')* weight; // weight *= 10; // 增重 } return rtn; } void main() { char str[32]; printf("Input a string :");gets(str); printf("%d\n", MyAtoI(str));} #include #include void reverse(char s[]) { //链 字符串反 int c, i=0, j; for(j=strlen(s)-1;i { c=s[i]; s[i]=s[j]; s[j]=c; i++; } } void IntegerToString(char s[],int n) { int i=0,sign; if((sign=n)<0) 链链链链链链链链="">0)> n=-n; do //链链链链链链从个位始成字符,直到最高位,链链链链 最后反 { s[i++]=n%10+'0'; }while((n=n/10)>0); //链链链链链链链 如果是数,上号 if(sign<0)>0)> s[i++]='-'; s[i]='\0';//链链 字符串束 reverse(s); } void main() { int m; char c[100]; printf("链链入整数m: "); scanf("%d",&m); IntegerToString(c,m); printf("integer = %d string = %s\n", m, c); }范文四:嵌入式笔试题
范文五:嵌入式笔试题