嵌入式C高级编程伍健.docx
《嵌入式C高级编程伍健.docx》由会员分享,可在线阅读,更多相关《嵌入式C高级编程伍健.docx(19页珍藏版)》请在冰豆网上搜索。
嵌入式C高级编程伍健
上嵌《嵌入式C高级编程》考试试卷A
1
2
3
4
5
6
7
8
9
10
B
B
B
C
C
D
C
D
C
D
11
12
13
14
15
16
17
18
19
20
A
D
C
D
A
C
B
B
A
D
一、选择题(1.5*20)
(1)下列数据结构中,按先进后出原则组织数据的是( )
A)线性链表B)栈
C)循环链表D)顺序表
(2)下列表达式中,结果为5的是( )
A)6*5%6
B)5*-2+15
C)5+75%10
D)6+-2/3
(3)关于C语言的主函数描述正确的是( )
A)C程序可以有多个main函数
B)C程序必有一个而且只能有一个main函数
C)C程序可以没有main函数
D)C程序的执行不一定在main函数开始执行
(4)已知x,y,z均为整型变量,且值均为1,则执行语句++x||++y&&++z;后,表达式x+y的值为( )
A)1
B)2
C)3
D)4
(5)若inti,j;,则for(i=j=0;i<10&&j<8;i++,j+=3)控制的循环体执行的次数是( )
A)9
B)8
C)3
D)2
(6)下列关于栈的描述正确的是( )
A)在栈中只能插入元素而不能删除元素
B)在栈中只能删除元素而不能插入元素
C)栈是特殊的线性表,只能在一端插入或删除元素
D)栈是特殊的线性表,只能在一端插入元素,而在另一端删除元素
(7)阅读下列程序,则执行结果是( )
#include"stdio.h"
main()
{
inta=0,b=0,c=0,i;
for(i=0;i<4;i++)
switch(i)
{
case0:
a=i++;
case1:
b=i++;
case2:
c=i++;
case3:
i++;
}
printf("%d,%d,%d,%d\n",a,b,c,i);
}
A)0,1,3,4
B)1,2,3,4
C)0,1,2,5
D)0,2,3,4
(8)以下描述错误的是( )
A)C程序中,函数可以直接或间接的调用自己
B)函数调用时,函数名必须与所调用的函数名字完全一致
C)函数说明语句中的类型必须与函数返回值的类型一致
D)实参数可以与形参个数不一致
(9)阅读下面程序,则执行后的结果为( )
#include"stdio.h"
intfun1()
{
intk=20;
returnk;
}
intfun2()
{
inta=15;
returna;
}
fun3(inta,intb)
{
intk;
k=(a-b)*(a+b);
printf("%d\n",k);
}
main()
{
fun3(fun1(),fun2());
}
A)0
B)184
C)175
D)编译不通过
(10)以下对一维数组c进行正确的定义初始化的语句是( )
A)intc[10]=0;
B)intc[10]={0}*10;
C)intc[1]={0,0,0,0,0,0,0};
D)intc[10]={0};
(11)阅读下列程序,则执行后输出的结果是( )
#include"stdio.h"
intk=1;
fun(intk)
{
k++;
k=k*6;
}
main()
{
fun(k);
printf("%d\n",k);
}
A)1
B)2
C)6
D)12
(12)现有如下程序段
#include"stdio.h"
voidfun(int*a,int*b,int*c)
{
*c=*a+*b;
}
main()
{
inta[2]={12,23},c;
fun(a,a+1,&c);
printf("%d\n",c);
}
则程序的输出结果为( )
A)23
B)12
C)0
D)35
(13)若有以下语句,则正确的描述是( )
chara[]="toyou";
charb[]={′t′,′o′,′y′,′o′,′u′};
A)a数组和b数组的长度相同
B)a数组长度小于b数组长度
C)a数组长度大于b数组长度
D)a数组等价于b数组
(14)已知:
chara[15],b[15]={"Ilovechina"};则在程序中能将字符串Ilovechina赋给数组a的正确语句是( )
A)a="Ilovechina";
B)strcpy(b,a);
C)a=b;
D)strcpy(a,b);
(15)阅读下面程序,则执行后的结果为( )
#include"stdio.h"
main()
{
char*str="abcdefghijklmnopq";
while(*str++!
=′e′);
printf("%c\n",*str);
}
A)f
B)a
C)e
D)q
(16)现有如下程序段
#include"stdio.h"
intfun(intk,int*m);
{
if(k%3)
*m=k*k;
else
*m=k/3;
}
main()
{
int(*p)(int,int*),m;
p=fun;
(*p)(78,&m);
printf("%d\n",m);
}
则程序段的输出结果为( )
A)24
B)25
C)26
D)27
(17)阅读下列程序,则执行后的输出结果为( )
#include"stdio.h"
fun(intx)
{
if(x/2>0)fun(x/2);
printf("%d",x%2);
}
main()
{
fun(20);
putchar(’\n′);
}
A)11100
B)10100
C)10101
D)10110
(18)阅读如下程序段,则执行后程序的输出结果是( )
#include
main()
{
structa
{
intx;
inty;
}num[2]={{20,5},{6,7}};
printf("%d\n",num[0].x/num[0].y*num[1].y);
}
A)0
B)28
C)20
D)5
(19)阅读下列程序段
#include"stdio.h"
typedefstructaa
{
inta;
structaa*next;
}M;
voidset(M*k,inti,int*b)
{
intj,d=0;
for(j=1;j
{
k[j-1].next=&k[j];
k[j-1].a=b[d++];
}
k[j-1].a=b[d];
}
main()
{
Mk[5],*p;
intd[5]={23,34,45,56,67};
set(k,5,d);
p=k+1;
printf("%d\n",table);
}
则下面的表达式在table处,能使程序执行后,打印输出数据45的是( )
A)p->next->a
B)++p->a
C)(*p).a++
D)p++->a
(20)阅读下面程序,程序实现的功能是(a123.txt在当前盘符下已经存在)( )
#include"stdio.h"
voidmain()
{
FILE*fp;
inta[10],*p=a;
fp=fopen("a123.txt","w");
while(strlen(gets(p))>0)
{
fputs(a,fp);
fputs("\n",fp);
}
fclose(fp);
}
A)从键盘输入若干行字符,按行号倒序写入文本文件a123.txt中
B)从键盘输入若干行字符,取前2行写入文本文件a123.txt中
C)从键盘输入若干行字符,第一行写入文本文件a123.txt中
D)从键盘输入若干行字符,依次写入文本文件a123.txt中
二、填空题(2×12分)
(1)阅读下面程序,则在执行时候的输出为________1,2_____。
#include"stdio.h"
main()
{
intx=1,y=2,z=0;
if(x=2)
z=x,x=y,y=z;
printf("%d,%d\n",x,y);
}
(2)语句printf("%d\n",′H′-′0′+64);的执行结果为______88_____。
(3)阅读下面程序,则程序的执行结果为_______10_____。
#include"stdio.h"
fun(intx)
{
x=50;
}
main()
{
inta=10;
fun(a);
printf("%d\n",a);
}
(4)以下程序的输出结果是___12,1_________。
intfun(intx,inty,int*p,int*q)
{
*p=x*y;
*q=x/y;
}
main()
{
inta,b,c,d;
a=4;
b=3;
fun(a,b,&c,&d);
printf("%d,%d\n",c,d);
}
(5)下面程序是求出数组arr的两条对角线上元素之和,请填空。
#include"stdio.h"
main()
{
intarr[3][3]={2,3,4,8,3,2,7,9,8},a=0,b=0,i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(__i==j_________________)
a=a+arr[i][j];
for(i=0;i<3;i++)
for(____j=2_______________;j>=0;j--)
if(_____i+j==2______________)
b=b+arr[i][j];
printf("%d,%d\n",a,b);
}
(6)下面程序的功能是:
对字符串从小到大进行排序并输出,请填空。
#include"string.h"
#include"stdio.h"
sort(char*a[],intn)
{
inti,j;
char*p;
for(j=1;j<=n-1;j++)
for(i=0;_____jif(______strcmp(&a[i],&a[i+1])____________>0)
{
p=a[i];
a[i]=a[i+1];
a[i+1]=p;
}
}
main()
{
inti;
char*book[]={"itisme","itisyou","howareyou","fine","goodnight","goodbye"};
sort(_____book,__6____________);
for(i=0;i<6;i++)
printf("%s\n",book[i]);
}
(7)下面的函数是完成1~n的累加,完成函数。
a(intk)
{
intsum=0;
if(k<=0)
printf("error\n");
if(k==1)
___printf(“sumis1\n”);________________;
else
{
for(;k>0;k--)
{
sum+=k;
}_
printf(“sumis%s\n”,sum);
}_________________;
}
三、请填写BOOL,float,指针变量与“零值”比较的if语句。
(6分)
提示:
这里“零值”可以是0,0.0,FALSE或者“空指针”。
例如int变量n与“零值”比较的if语句为:
if(n==0)
if(n!
=0)
以此类推。
请写出BOOLflag与“零值”比较的if语句:
if(flag==FALSE)
if(flag!
=FALSE)
请写出char*p与“零值”比较的if语句:
if(p==NULL)
if(p!
=NULL)
四、以下为WindowsNT下的32位C++程序,请计算sizeof的值(6分)
charstr[]=“Hello”;
char*p=str;
intn=10;
请计算
sizeof(str)=6
sizeof(p)=4
sizeof(n)=4
voidFunc(charstr[100])
{
请计算
sizeof(str)=100
}
void*p=malloc(100);
请计算
sizeof(p)=4
五、简答题(9分)
1、头文件中的ifndef/define/endif干什么用?
答:
防止头文件被重复定义
2、#include和#include“filename.h”有什么区别?
答:
对于前一个,程序预处理时,从系统函数库开始找,后一个是从程序工程中开始找
3、const有什么用途?
(请至少说明两种)
答:
1.让变量成为常量。
2.只能在初始化时赋值。
所以被其它文件调用时,不能在赋值。
六、有关内存的思考题(6分)
voidGetMemory(char*p)
{
p=(char*)malloc(100);
}
voidTest(void)
{
char*str=NULL;
GetMemory(str);
strcpy(str,"helloworld");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
程序可能会崩溃。
str是个野指针。
voidGetMemory(char**p,intnum)
{
*p=(char*)malloc(num);
}
voidTest(void)
{
char*str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
hello
《嵌入式C高级编程》机试试卷
一、编写strcpy函数,并验证;求字符串长度
已知strcpy函数的原型是
char*strcpy(char*strDest,constchar*strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数strcpy,至少用三种方式实现。
(2)计算strDest字符串的长度
charstrcpy(char*strDest,constchar*strSrc)
{
intlen=0;
while(*strSrc)
{
*strDest=*strSrc;
strDest++;
strSrc++;
}
while(*strDest++)
len++;
returnlen;
}
二、编写一个程序,删除每个输入行末尾的空格,并删除完全是空格的行。
voiddelete_space(char*str)
{
char*p;
p=str;
while(*str)
{
str++;
}
str--;
while(*str==32&&str!
=p)
{
*str=0;
str--;
}
str=p;
}
三、编写一个递归版本的reverse(s)函数,以将字符串S倒置。
voidreverse(char*S)
{
if(*s!
=NULL)
reverse(++s);
printf(“%c”,*S);
}
四、三色球问题
若一个口袋中放有12个球,其中有3个红的,3个白的和6个黒的,问从中任取8个共有多少种不同的颜色搭配?
五、猴子吃桃问题
猴子吃桃问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下
的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘了多少。
void_monkey_peach()
{
intnum=0;
intdays=10;
if(days==1)
{
num=2;
}
else
{
monkey_peach(num,--days);
num=num+1+num*2;
}
}
六、爱因斯坦的数学题
爱因斯坦出了一道这样的数学题:
有一条长阶梯,若每步跨2阶,则最最后剩一阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。
只有每次跨7阶,最后才正好一阶不剩。
请问这条阶梯共有多少阶?
voidstep()
{
inti,j;
for(i=0;;i++)
{
if(i%2==1)
if(i%3==2)
if(i%4==3)
if(i%5==4)
if(i%6==5)
if(i%7==0)
{
printf(“Thisstepnumis%d\n”,i);
break;
};
}
}
七、编写一个程序,比较两个文件并打印它们第一个不相同的行。
voidfilecmp(char*fname1,char*fname2)
{
FILE*fp1;
FILE*fp2;
intline1=0;
intline2=0;
char*stream1;
char*stream2;
fp1=open(fname1,”r”);
fp2=open(fname2,”r”);
while(fread(stream1,1,sizof(char),fp1)&&fread(stream2,1,sizof(char),fp2))
{
if(stream1!
=stream2)
{
while(stream1--&&stream1==‘\n’)
while(++tream1!
=‘\n’)
printf(“%s”,stream1);
printf(“\n”);
while(stream2--&&stream2==‘\n’);
while(++tream2!
=‘\n’)
printf(“%s”,stream2);
}
}
}
八、实现功能:
1、从键盘输入一行字符串,调用函数建立反序的链表,然后输出整个链表。
2、求出链表的最大值。
3、设计一个用链表表示的直接插入排序算法。
4、已知两个链表head1和head2各自有序,请把它们合并成一个链表依然有序。
(保留所有结点,即便大小相同)
已知
structnode
{
chardata;
structnode*next;
}*head;
#include
#include
#include
structnode
{
chardata;
structnode*next;
}*head;
headcreate_linklist()
{
char*str;
headhead,p;
head=(head)malloc(sizeof(structnode));
head->next=NULL;
p=head->next;
scanf(“%s”,str);
while(str)
{
p=(head)malloc(sizeof(structnode));
p->next=NULL;
p-data=*str;
p=p->next;
}
p=head;
while(p->next)
printf(“%c”,p->data);
}