一、单项选择题在每小题列出的四个备选项中只有一个选项是符合题目要求的。
5. 执行下面程序段后,正确的结果是
intx=0,y=0;
while(x<15)y++,x+ =++y;
A B C D
C
[解析] 见下表
循环次数 |
0 |
1 |
2 |
3 |
y= |
2 |
4 |
6 |
8 |
x= |
2 |
6 |
12 |
20 |
二、填空题1. inta,b,c;则表达式a=(b=4)+(c=2)的值是______。
2. 若a=1,b=4,c=3,则表达式!(a<b)||!c&&1的值是______。
3. 以下程序的功能是计算字符串的长度。请填空。
#include<stdio.h>
main()
{char str[100],*sp=str;
int nlen=0;
scanf("%s",str);
for(;*sp!='\0';sp++)______;
printf("%d",nlen);
}
nlen++
[解析] 利用字符串结束标志'\0',nlen是计数器。
4. 以下程序的功能是对10个整数从小到大排序。请填空。
#include<stdio.h>
sort(int arr[],int n);
main()
{int a[10],*p,i;
printf("input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\nthe original array is:");
for(p=a;P<a+10;p++)
printf("%d",*p);
sort(a,10);
printf("\nthe present array is:");
for(P=a;P<a+10;P++)
printf("%d",*p);
}
sort(int arr[],int n)
{int*p1,*p2,temp;
for(p1=arr;p1<arr+(n-1);p1++)
for(p2=p1+1;p2<arr+n;p2++)
if(______)
{temp=*p1;*p1=*p2;*p2=temp;}
}
三、改错题每小题只有一处错误或不妥。请指出。并将其改正。
1. #include<stdio.h>
#include<conio.h>
main()
{
int i,j;
char ch;
while(ch=getchar()!='\r')
{
i++:
printf("%c",ch);
}
printf("you type%d characters\n",i);
}
错误:______
改正:______
错误:while(eh=getehar()!m='\r')
改正:将其修改为while(ch=getch()!='\r')
[解析] getehar()函数需要回车,geteh()不需要回车。
2. main()
{
float a[10]={0.0};
int i
for(i=0;i<3;i++)scanf("%d",&a[1]);
for(i=0;i<10;i++)a[0]=a[0]+a[i];
printf("%d\n",a[0]);
}
错误:______
改正:______
错误:scanf("%d",&a[1]);
改正:将其修改为scanf("%f",&a[1]);
[解析] scanf函数格式类型要对应。
3. 下面程序的功能是将大写字母改成小字母,小字母改成大写字母。
main()
{char ch;
scanf("%c",&ch);
if(ch>='A'||ch<='Z')ch=ch+32;
elseif(ch>='a'&&ch<='z')ch=ch-32;
printf("%c",ch);
}
错误:______
改正:______
错误:ch>='A'||ch<='Z'
改正:将其修改为ch>='A'&&ch<='Z'
[解析] 表达式逻辑错误。
4. main()
{char s[]="9876",*p;
*p=s:
printf("%s",p);
}
错误:______
改正:______
错误:*p=s;
改正:将其修改为p=s;
[解析] 指针变量赋值错误。
四、程序阅读题请阅读下列程序,写出程序运行结果。
1. #include<stdio.h>
#define N 6
void main()
{int a[N]={4,5,8,3,6,1};
int j,i,t;
for(i=0;i<N-1;i++)
for(j=0;j<N-1-i;j++)
if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}
for(j=0;j<N;j++)printf("%5d",a[j]);
程序运行结果是:______
1 3 4 5 6 8
[解析] 双循环语句是排序过程。
2. #include<stdio.h>
main()
{int x,sum;
scanf("%d",&x);
sum=0;
while(x>0)
{if(x%2==0)sum+=x;
scanf("%d",&x);}
printf("%d\n",sum);
}
程序运行时输入1 9 3 4 0<回车>,则程序运行结果是:______
4
[解析] 1 9 3 4 0每个数据之间都有空格,在条件语句中只有偶数相加。所以只有4。
3. #include"stdio.h"
main()
{int i;
for(i=1;i<=5;i++)
{if(i%2)printf("*");
else continue;
printf("#");}
printf("#");}
程序运行结果是:______
*#*#*##
[解析] 当i=1,3,5时各输出*#,最后输出#。
4. #include<stdio.h>
main()
{int n,sum=0;
scanf("%d",&n);
do{sum=sum+(n%10)*(n%10);
n=n/10;}while(n);
printf("sum=%d",sum);
}
程序运行时,从键盘输入2345<回车>,运行结果是:______
54
[解析] n=2345,n%10=5,sum=25
n=n/10,n%10=4,sum=25+16
n=n/10,n%10=3,sum=25+16+9
n=n/10,n%10=2,sum=25+16+9+4=54
n=2时结束循环。
五、程序设计题1. 每个苹果0.8元,第一天买两个苹果,第二天开始,每天买前一天的两倍,直到买的苹果个数达到不超过100的最大值。编写程序,求每天平均花多少钱?
#inelude<stdio.h>
main()
{intday=0,buy=2;
float sum=0.0,ave;
do{sum+=0.8*buy;
day++;buy*=2;
}while(buy<=100);
ave=sum/day;
printf("%f",ave);
}
六、填空题-单片机原理与接口技术1. 8255A属于可编程的______I/0接口芯片,8255A的A通道有______种工作方式。
2. MCS-51的存储器空间配置从功能上可分为四种类型:______、内部数据存储器、______、外部程序存储器。
3. 执行下面一段程序后,(A)=______,(B)=______。
MOV SP,#60H
MOV A,#10H
MOV B,#01H
PUSH A
PUSH B
POP A
POP B
4. 8051单片机内有______个16位的定时/计数器,______有四种工作方式。
5. MUL AB的执行结果是存储高8位在______中,低8位在______中。
6. 8031单片机内部数据RAM中的位寻址区的地址范围是______。
7. 如要选择第2组的工作寄存器交换数据,可先执行指令______。
PSW(地址为DOH)的格为
8. 某8031单片机时钟频率为12MHz,现将T0设置为定时方式1,定时时间为1毫秒,其计数器中的时间常数初值应为______。(写成四位十六进制数)
0FC18H
[解析] 因为机器周期=12/12MHz=1μs,初值为1ms/1μs=1000,所以N=216-1000=65536-1000=64536=0FC18H。因为方式1,所有216。
七、改错题-单片机原理与接口技术每小题只有一处错误或不妥。请指出。并将其改正。
1. 下面程序段是将片外RAM20H~25H单元清零。
MOV R0,#20H
MOV R7,#06H
CLR A
LOOP: MOV @R0,A
INC R0
DJNZ,#3000H
错误:______
改正:______
错误:MOV @R0,A
改正:MOVX@R0,A
[解析] 要使用片外数据传送指令
2. 下面程序段是将ROM 3000H单元内容送R7。
MOV DPTR,#3000H
CLR A
MOVC A,@R7+DPTR
MOV R7,A
错误:______
改正:______
错误:MOVC A,@R7+DPTR
改正:MOVC A,@A+DPTR
[解析] R7不能作变址寻址
八、程序阅读题-单片机原理与接口技术请阅读下列程序,写出程序运行结果。
1. 以下是8051单片机定时/计数器的初始化程序(设单片机晶振频率是6MHz):T0作为定时,定时时间为______,T1作为计数,记满______溢出。
ORG 0000H
LJMP 0050H
ORG 0050H
MOV TMOD,#20H
MOV TH0,#63H
MOV TL0,#18H
MOV TH1,#9CH
MOV TL,#9CH
SETB EA
SETB TR0
SETB TR1
SJMP $
10ms100
[解析] TOMD=20H,说明设置,T0为定时,方式0,T1为计数,方式2。所以:T1计数初值9CH=10011100B=156,256-156=100即满100溢出。T0的初值为6318H=0110001111000B=3192,213=8192,8192-3192=5000,机器周期为12/6MHz=2μs,2μs×5000=10000μs=10ms。
2. 下面程序是将片内RAM______开始的单元内10个二进制数,找出其中最大值并存于单元中。
START: MOV R0,#40H
MOV R7,#09H
MOV A,@R0
LOOP: INC R0
MOV 30H,@R0
CJNE A,30H,NEXT
NEXT: JNC BIE1
MOV A,30H
BIE1: DJNZ R7,LOOP
MOV 50H,A
RET
40H 50H
[解析]
START:MOV R0,#40H ;设置片内开始单元
MOV R7,#09H ;十个存储数据
MOV A,@R0 ;第一个数据传送至A
LOOP: INC R0 ;R0指向下一个数据
MOV 30H,@R0 ;假定该数据为最大
CJNE A,30H,NEXT ;A和该数据比较
NEXT: JNC BIE1 ;如果A大转移到LOOP
MOV A,30H ;如果A小,将该数据送入A
BIE1: DJNZ R7,LOOP ;数据个数减1,不为0转移到LOOP
MOV 50H,A ;A中为最大数据,送入50H单元
RET
九、程序设计题-单片机原理与接口技术1. RAM中60H单元内存有一个十六进制数,把这个数转换为BCD码的十进制数,BCD码的十位和个位放在累加器A中,百位放在R6中。
ORG 2200H
MOV A,60H
MOV B,#64H
DIV AB
MOV R6,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
SJMP $
END