c语言程序设计例题

c语言程序设计例题,第1张

题目1

#include "stdio.h"

void main(void)

{

int n=5,m=10,i=1

long sum=1

for(i<=ni++)

{

sum*=i

}

printf("\n5!=%d",sum)

for(i=1i<=10i++)

{

sum*=i

}

printf("\n10!=%d",sum)

}

题目2

#include "stdio.h"

#include "string.h"

struct Student

{

char s_Name[25]

long n_Code

int n_English

int n_Math

int n_Computer

}student_1,student_2

void main(void)

{

printf("\nStudent1:\nName:")

scanf("%s",&student_1.s_Name)

printf("StudentNum:")

scanf("%d",&student_1.n_Code)

printf("English Score:")

scanf("%d",&student_1.n_English)

printf("Math Score:")

scanf("%d",&student_1.n_Math)

printf("Computer Score:")

scanf("%d",&student_1.n_Computer)

printf("\nStudent2:\nName:")

scanf("%s",&student_2.s_Name)

printf("StudentNum:")

scanf("%d",&student_2.n_Code)

printf("English Score:")

scanf("%d",&student_2.n_English)

printf("Math Score:")

scanf("%d",&student_2.n_Math)

printf("Computer Score:")

scanf("%d",&student_2.n_Computer)

printf("\nStudent1:\nName:%s\nStudent Number:%d\nEnglish Score:%d\nMath Score:%d\nComputer Score:%d\n",student_1.s_Name,student_1.n_Code,student_1.n_English,student_1.n_Math,student_1.n_Computer)

printf("\nStudent2:\nName:%s\nStudent Number:%d\nEnglish Score:%d\nMath Score:%d\nComputer Score:%d\n",student_2.s_Name,student_2.n_Code,student_2.n_English,student_2.n_Math,student_2.n_Computer)

}

2012年〈汇编语言程序设计〉半期试题(堂下开卷)

一.名词解释(本大题共5小题,每小题3分,共15分)试解释下列名词的含义。

1. 逻辑地址:在CPU内部的存储单元地址表示形式,分为段基值和偏移量两个组成部分,

它们都是16位的,在指令或源程序中只能使用逻辑地址来表达存储单元。

2. 物理地址:CPU访问存储单元时向地址总线传送的地址表示形式,是20位的地址,由

逻辑地址中段基值乘以16再加上偏移量得到,逻辑地址到物理地址的转换由CPU在执行访问存储单元的指令时自动完成。

3. 标志寄存器:在CPU中由状态标志位与控制标志位组成的寄存器称为标志寄存器,其

中状态标志位用于标识运算指令执行后运算结果的特征,控制标志位用于控制CPU的工作模式或改变CPU对某些事件的响应方式。

4. 存储器寻址方式:即获得存储单元地址的方式,在8086/8088CPU中包括直接寻址、寄

存器间接寻址、基址寻址、变址寻址、基址变址寻址这五种寻址方式。

5. 补码:CPU内部用于表示带符号数的一种编码,正数的补码为真值本身,负数的补码为

真值变反加1的结果。

二.计算题(本大题共5小题,每小题4分,共20分)试按照各小题的要求给出计算结果。

1. 将十进制数100分别转换为二进制、十六进制数,它们的表示形式分别为多少? 答:100的十六进制表示为64H,二进制表示为01100100B。 2. 假设(DS)=0B00H,(BX)=0210H,对于指令MOV DS:120H[BX],AL,其目的

*** 作数的物理地址为多少?

答:EA=(BX)+120H = 0210H+0120H = 0330H,物理地址 = (DS)*16+EA = 0B000H+0330H=0B330H。 3. 假设(BX)=0210H,(DI)=0060H,对于指令ADD DL,[BX][DI],其源 *** 作数的偏

移量为多少?

答:源 *** 作数EA = (BX)+(DI)= 0210H+0060H =0270H。 4. 假设当前(SP)=0060H,连续执行5条PUSH指令后,(SP)=? 答:(SP)=0060H – 5*2 = 0060H – 000AH = 0056H

5. 对于一个十进制数 – 65,其二进制补码表示形式为多少?

答:先将数值转换为二进制表示: - 65 = - 41H = - 01000001B ,由于是负数,变反加1得到补码形式:10111110B +00000001B = 10111111B

三.排错题(本大题共4小题,每小题5分,共20分)每小题列出了一条指令,判断该指

令有无语法错误,如果存在语法错误,请指出具体的错误原因,判断正确给2分,分析正确给3分,判断错误不给分。

1. PUSH 5588H

答:错误,单 *** 作数指令不能使用立即数寻址方式。 2. MOV DS, 1720H

答:错误,MOV指令不能将立即数直接传送至段寄存器,需要通用寄存器作为中转。 3. ADD AX, CL

答:错误,两个 *** 作数的类型不匹配,AX为16位,CL为8位。 4. AND AX,[DX]

答:错误,DX寄存器不能用作存储器寻址方式中的基址或变址分量。

四.程序分析题(本大题共6小题,每小题5分,共30分)每小题列出了一段小的程序片

段和相关存储单元的初始值,请按题目的要求分析各程序片段的运行结果。(寄存器中的内容请使用十六进制形式给出)

1. 阅读如下程序片段

MOV AL,4CH MOV BL,0B5H ADD AL,BL

执行上述程序片段后,(AL)= 01H (1分),(BL)= 0B5H (1分), CF= 1 (1分),OF= 0 (1分),PF= 0 (1分)

2. 阅读如下程序片段

MOV AL,0F3H MOV DL,0C4H ADD AL,DL AND AL,0FH

执行上述程序片段后,(AL)= 07H (1分),(AF)=不确定 (1分), CF= 0 (1分),OF= 0 (1分),PF= 0 (1分)

3. 阅读如下程序片段

MOV AL,7EH MOV CL,04H ROL AL,CL

执行上述程序片段后,(AL)=0E7H(2分),(CL)=04H (1分), CF= 1 (1分),OF=不确定 (1分)

4. 阅读如下程序片段

MOV AX,0632H MOV BX,0C202H SUB AX,BX INC AX

执行上述程序片段后,(AX)= 4431H(2分),(CF)= 1 (2分), OF= 0 (1分)

5. 阅读如下程序片段,假设(DS)=0100H,字节单元(01024H)=56H,字节单元(01025H)

=28H

MOV BX,0024H LEA BX,[BX] ORBX,0 ADC BX,[BX]

执行上述程序片段后,(BX)= 287AH(3分),(CF)=0 (2分), OF= 0 (1分)

6. 阅读如下程序片段,假设(SP)=0064H

MOV AX,0001H MOV BX,0002H PUSH AX PUSH BX POPCX POPBX

执行上述程序片段后,(AX)=0001H (2分),(BX)= 0001H(2分), (SP)= 0064H(1分)

五.程序设计题(本大题共2小题,第一小题7分,第二小题8分,共15分)

1. 试编写一程序片段,实现BL高4位与低4位相互交换(7分) 答:

mov cl, 4 rol bl, cl

2. 试编写一程序片段,不使用乘除法指令,实现((AX)*5+14)/ 2的功能(AX中的数

据理解为补码)(8分) 答:

mov bx, ax mov cl, 2 sal ax, cl add ax, bx add ax, 14 sar ax, 1

#include<stdio.h>

#include<string.h>

#include<malloc.h>

typedef struct stu //一个学生的档案

{

char num[20]//学号

char name[20]//姓名

float score[5]//成绩,前三门是单科成绩,第四个是总分,最后一个是平均分

}student

student s[10]//所有学生的信息

void main()

{

void init()//初始化函数申明

void sort()//排序函数申明

void print()//输出函数申明

init()

sort()

print()

}

void init()//初始化所有学生的档案

{

int i,j

for(i=0i<10i++) //逐个键入学生的信息

{

printf("请输入一学生的学号:")

scanf("%s",s[i].num)

printf("请输入该学生的姓名:")

scanf("%s",s[i].name)

printf("请输入该学生的三门成绩:")

s[i].score[3]=0

for(j=0j<3j++)

{

scanf("%f",&s[i].score[j])

s[i].score[3]+=s[i].score[j]//求总分

}

s[i].score[4]=s[i].score[3]/3//求平均分

}

printf("学生档案建立成功!\n")

}

void sort()

{

int i,j,k

char str[20]

float temp

for(i=0i<9i++) //主循环,进行排名

for(j=i+1j<10j++)

if(s[j].score[3]>s[i].score[3])

{

strcpy(str,s[i].num)//交换学号

strcpy(s[i].num,s[j].num)

strcpy(s[j].num,str)

strcpy(str,s[i].name)//交换姓名

strcpy(s[i].name,s[j].name)

strcpy(s[j].name,str)

for(k=0k<5k++) //交换成绩

{

temp=s[i].score[k]

s[i].score[k]=s[j].score[k]

s[j].score[k]=temp

}

}

}

void print()

{

int i

for(i=0i<10i++)

printf("%s %s %.1f %.1f %.1f %.1f %.1f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],s[i].score[3],s[i].score[4]


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12077001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存