《第四章習題》由會員分享,可在線閱讀,更多相關《第四章習題(9頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、精選優(yōu)質文檔-----傾情為你奉上
習 題
1. C語言有哪些特點?
答:C語言具有以下特點:
1) 語言簡潔、緊湊,使用方便、靈活
2) 運算符豐富
3) 數(shù)據(jù)結構豐富,具有現(xiàn)代化語言的各種數(shù)據(jù)結構
4) 可進行結構化程序設計
5) 可以直接對計算機硬件進行操作
6) 生成的目標代碼質量高,程序執(zhí)行效率高
7) 可移植性好
2. 有哪些數(shù)據(jù)類型是MCS-51單片機直接支持的?
答:MCS-51單片機直接支持的數(shù)據(jù)類型標準分為基本數(shù)據(jù)類型和組合數(shù)據(jù)類型,基本數(shù)據(jù)類型有字符型char、短整型short、整型int、長整型long、浮點型float、雙精度型doubl
2、e、特殊功能寄存器型和位類型,其中char型與short型相同,float型與double型相同。組合數(shù)據(jù)類型有數(shù)組類型、結構體類型、共同體類型和枚舉類型,另外還有指針類型和空類型。
3. C51特有的數(shù)據(jù)類型有哪些?
答:C51特有的數(shù)據(jù)類型有特殊功能寄存器型和位類型。
4. C51中的存儲器類型有幾種,它們分別表示的存儲器區(qū)域是什么?
答:C51中的存儲器類型有6種,分別如下:
data:直接尋址的片內RAM低128B,訪問速度快
bdata:片內RAM的可位尋址區(qū)(20H~2FH),允許字節(jié)和位混合訪問
idata:間接尋址訪問的片內RAM,允許訪問全部片內RAM
pda
3、ta:用Ri間接訪問的片外RAM低256B
xdata:用DPTR間接訪問的片外RAM,允許訪問全部64KB片外RAM
code:程序存儲器ROM?64KB空間
5. 在C51中,bit位與sbit位有什么區(qū)別?
答:bit位類型符用于定義一般的位變量。存儲器類型只能是bdata、data、idata,只能是片內RAM的可位尋址區(qū),嚴格來說只能是bdata。
sbit位類型符用于定義在可位尋址字節(jié)或特殊功能寄存器中的位,定義時需指明其位地址,可以是位直接地址,可以是可位尋址變量帶位號,也可以是特殊功能寄存器名帶位號。
6. 在C51中,通過絕對地址來訪問的存儲器有幾種?
答:通過
4、絕對地址來訪問存儲器有三種方法:1. 使用C51運行庫中預定義宏。2. 通過指針訪問。3. 使用C51擴展關鍵字_at_
7. 在C51中,中斷函數(shù)與一般函數(shù)有什么不同?
答:中斷函數(shù)在定義時后面帶interrupt m修飾符,m的取值為0~31,對應的中斷情況如下:0——外部中斷0,1——定時/計數(shù)器T0,2——外部中斷1,3——定時/計數(shù)器T1,4——串行口中斷,5——定時/計數(shù)器T2,其他值預留。
編寫MCS-51中斷函數(shù)需要注意如下幾點。
(1) 中斷函數(shù)不能進行參數(shù)傳遞,如果中斷函數(shù)中包含任何參數(shù)聲明都將導致編譯出錯。
(2) 中斷函數(shù)沒有返回值。
(3) 在任何情況
5、下都不能直接調用中斷函數(shù)
(4) 如果在中斷函數(shù)中調用了其他函數(shù),則被調用函數(shù)所使用的寄存器必須與中斷函數(shù)相同,否則會產生不正確的結果。
(5) C51編譯器對中斷函數(shù)編譯時會自動在程序開始和結束處加上相應的內容。
(6) C51編譯器從絕對地址8m+3處產生一個中斷向量,其中m為中斷號,也即interrupt后面的數(shù)字。該向量包含一個到中斷函數(shù)入口地址的絕對跳轉。
(7) 中斷函數(shù)最好寫在文件的尾部,并且禁止使用extern存儲類型說明。防止其他程序調用。
8. 按給定的存儲類型和數(shù)據(jù)類型,寫出下列變量的說明形式。
(1) 在data區(qū)定義字符變量val1。
char dat
6、a val1;
(2) 在idata區(qū)定義整型變量val2。
int idata val2;
(3) 在xdata區(qū)定義無符號字符型數(shù)組val3[4]。
unsigned char xdata val3[4];
(4) 在xdata區(qū)定義一個指向char類型的指針px。
char xdata *px;
(5) 定義可尋址位變量flag。
bit flag;
(6) 定義特殊功能寄存器變量P3。
sfr P3=0xa0;
(7) 定義特殊功能寄存器變量SCON。
sfr SCON=0x98;
(8) 定義16位的特殊功能寄存器T0。
sfr16 T0=
7、0x8a;
9. 寫出下列關系表達式或邏輯表達式的結果,設a=3,b=4,c=5。
(1) a+b>c&&b= =c 結果:假
(2) a||b+c&&b-c 結果:真
(3) !(a>b)&&!c||1 結果:真
(4) !(a+b)+c-1&&b+c/2 結果:假
10. 寫出下列C51程序的執(zhí)行結果。
(1)
#include
extern serial_initial();
main()
{
int x,y,z;
serial_initial();
x=y=8;z=++x
8、;
printf("\n %d %d %d",y,z,x);
x=y=8;z=x++;
printf("\n %d %d %d",y,z,x);
x=y=8;z=--x;
printf("\n %d %d %d",y,z,x);
x=y=8;z=x--;
printf("\n %d %d %d",y,z,x);
printf("\n");
while(1);
}
結果: 8 9 9
8 8 9
8 7 7
8 8 7
(2)
#include
extern serial_initial();main()
9、
{
int x,y,z;
serial_initial();
printf("input data x,y?\n");
scanf("%d %d",&x,&y);
printf("\n x y xy x>=y x!=y x==y");
printf("\n");
printf("\n%3d%3d",x,y);
z=xy; printf("%5d",z);
z=x>=y; printf("%5d",z);
10、z=x!=y; printf("%5d",z);
z=x==y; printf("%5d",z);
while(1);
}
執(zhí)行結果:
input data x,y?
1 2
x y xy x>=y x!=y x==y
1 2 1 1 0 0 1 0
(3)
#include
extern serial_initial();
main()
{
int x,y,z;
serial_initial();
printf("input data x, y ?\n");
s
11、canf("%d %d",&x,&y);
printf("\n x y !x x||y x&&y");
printf("\n%3d%3d",x,y);
z=!y; printf("%5d",z);
z=x||y; printf("%5d",z);
z=x&&y; printf("%5d",z);
printf("\n");printf("\n");
printf("That is all\n");
while(1);
}
執(zhí)行結果:
input data x, y ?
x y !x x||y x&&y
1
12、 2 0 1 1
That is all(4)
#include
extern serial_initial();
main()
{
int a,b;
unsigned int x,y;
serial_initial();
a=b=0xaa55;x=y=0xaa55;
printf("\n a=%4x b=%4x x=%4x y=%4x",a,b,x,y);
a=a<<1;b=b>>1;
x=x<<1;y=y>>1;
printf("\n a=%4x b=%4x x=%4x y=%4x",a,b,x,y);
pri
13、ntf("\n");
printf("\n");
printf("That is all.\n");
while(1);
}
執(zhí)行結果:
a=aa55 b=aa55 x=aa55 y=aa55
a=54aa b=d52a x=54aa y=552a
That is all.
11. break和continue語句的區(qū)別是什么?
答:break語句可以跳出switch結構,使程序繼續(xù)執(zhí)行switch結構后面的一個語句。break語句還可以從循環(huán)體中跳出循環(huán),提前結束循環(huán)而接著執(zhí)行循環(huán)結構下面的語句。
continue語句用在循環(huán)結構中,用于結束本次循環(huán),跳過循環(huán)體
14、中continue下面尚未執(zhí)行的語句,直接進行下一次是否執(zhí)行循環(huán)的判定。
continue語句和break語句的區(qū)別在于:continue語句只是結束本次循環(huán)而不是終止整個循環(huán);break語句則是結束循環(huán),不再進行條件判斷。
12. 用分支結構編程實現(xiàn):輸入“1”顯示“A”,輸入“2”顯示“B”,輸入“3”顯示“C”,輸入“4”顯示“D”,輸入“5”結束。
參考程序:
#include
#include
void main(void)
{
unsigned char x;
SCON=0x52
15、; //串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
while(1)
{
printf("input x:\n"); //輸出提示信息
scanf("%c",&x);
switch(x)
{
case '1':printf(" A\n");break;
case '2':printf(" B\n");break;
case '3':printf(" C\n");break;
case '4':printf(" D\n");break;
case '5':printf(" QUIT\n");
16、break;
default: printf(" RETRY\n");;
}
if (x=='5') break;
}
while(1);
}
13. 輸入3個無符號的字符數(shù)據(jù),要求按由大到小的順序輸出。
參考程序:
#include
#include
void main(void)
{
unsigned char x,y,z,m;
SCON=0x52; //串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
printf("inpu
17、t x,y,z:"); //輸出提示信息
scanf("%c,%c,%c",&x,&y,&z);
printf("\n");
if (x //包含特殊功能寄存器庫
18、#include //包含I/O函數(shù)庫
void main(void) //主函數(shù)
{
int i,s=0; //定義整型變量
i=1;
SCON=0x52; //串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
while (i<=10) //累加1到10的平方之和在s中
{
s=s+i*i;
i++;
}
printf("1到10的平方之和=%d\n",s);
while(1);
}
(2)do while循環(huán)
#include //包含特
19、殊功能寄存器庫
#include //包含I/O函數(shù)庫
void main(void) //主函數(shù)
{
int i,s=0; //定義整型變量
i=1;
SCON=0x52; //串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
do //累加1到10的平方之和在s中
{
s=s+i*i;
i++;
}
while (i<=10);
printf("1到10的平方之和=%d\n",s);
while(1);
}
(3)for循環(huán)
#include <
20、reg52.h> //包含特殊功能寄存器庫
#include //包含I/O函數(shù)庫
void main(void) //主函數(shù)
{
int i,s=0; //定義整型變量
SCON=0x52; //串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
for (i=1;i<=10;i++) s=s+i*i; //累加1到10的平方之和在s中
printf("1到10的平方之和=%d\n",s);
while(1);
}
15. 對一個由5個元素組成的無符號字符數(shù)組按由
21、小到大的順序進行排序。
參考程序:
#include //包含特殊功能寄存器庫
#include //包含I/O函數(shù)庫
main()
{
unsigned char f[5],m,i,j;
SCON=0x52; //串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
printf("輸入任意5個字符:");
scanf("%c,%c,%c,%c,%c",&f[0],&f[1],&f[2],&f[3],&f[4]);
printf("\n");
for (i=0;i<5;i+
22、+)
for (j=0;j<5-i;j++)
if (f[j]>f[j+1])
{m=f[j];f[j]=f[j+1];f[j+1]=m;}
printf("由小到大的順序為:%c,%c,%c,%c,%c ",f[0],f[1],f[2],f[3],f[4]);
printf("\n");
while(1);
}
16. 用指針實現(xiàn),輸入3個無符號字符數(shù)據(jù),按由大到小的順序輸出。
參考程序:
#include //包含特殊功能寄存器庫
#include //包含I/O函數(shù)庫
main()
{
unsig
23、ned char x,y,z;
unsigned char *p,*p1,*p2,*p3;
SCON=0x52; //串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
printf("input x,y and z:\n");
scanf("%c,%c,%c",&x,&y,&z);
printf("\n");
p1=&x;p2=&y; p3=&z;
if (*p1<*p2) {p=p1;p1=p2;p2=p;}
if (*p2<*p3) {p=p2;p2=p3;p3=p;}
if (*p1<*p2) {p=p1;p1=p2;p2=
24、p;}
printf("max to min is:%c,%c,%c\n",*p1,*p2,*p3);
while(1);
}
17. 有3個學生,每個學生都包括學號、姓名和成績,要求找出成績最高的學生的姓名和成績。
參考程序:
#include //包含特殊功能寄存器庫
#include //包含I/O函數(shù)庫
struct student
{
unsigned char number[10];
unsigned char name[10];
unsigned int grade;
}p1[3];
25、
main()
{
unsigned char i,j=0;
SCON=0x52; //串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
printf("input 3 studend number,name and grade:\n");
for (i=0;i<3;i++)
{
printf("input number:\n");
scanf("%s",p1[i]. number);
printf("input name:\n");
scanf("%s",p1[i].name);
printf("input grade:\n");
scanf("%d",&p1[i].grade);
}
for (i=1;i<3;i++)
{
if (p1[i].grade>p1[j].grade) j=i;
}
printf("成績最高的學生是:%s,成績是:%d",p1[j].name,p1[j].grade);
printf("\n");
}
while(1);
}
專心---專注---專業(yè)