请编制程序,其功能是:求I×J矩阵的转置矩阵(矩阵中元素为字节型),并计算转置矩阵的每一行元素之和,然后存放在每一行最后一个字单元中。 例如: 内存中有04H,05H,06H,(第一行)01H,02H,03H(第二行) 结果为 04H,01H,05H,00H,05H,02H,07H,00H,06H,03H,09H,00H 部分程序已给出,其中原始数据由过程LOAD从文件1NPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 请填空BEGIN和END之间已经给出的一段源程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 试题程序:

(A)ADCCH,0
(B)CMPDX,I
(C)ADDDI,B
(D)INC BX
(E)LPJ[解析]
此程序要实现的功能是:先求I×J矩阵的转置矩阵(矩阵中元素为字节型),再计算转置矩阵的每一行元素之和,然后存放在每一行最后一个字单元中。
先给N赋值为30,I赋值为3,J赋值为10。
程序的数据段中定义了四个字节型变量:原始数据区SOURCE、结果数据区RESULT、原始数据文件名NAME0、结果数据文件名NAME1;一个字型变量:SRC。数据段下面是堆栈段。堆栈段定义了一个256个字节的堆栈区。最后是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、 DS、SS。
将原始数据的偏移地址装入到SI中,结果数据存放的偏移地址装入到DI中。BX赋值为1,表示第一列。
LPJ段,先给累加和CX赋初值为0,DX赋值为1,表示第一行。
LPI段是要完成矩阵的转置,并且求和的功能。先将SI中内容即原始数据送AL中。再将CL与AL相加,加法结果可能产生进位,即CF=1,将进位放在DH中。所以第(1)空填写"ADCCH,0"。接着用STOS指令将第一行第一列的元素AL存入到DI中。SI地址加10,准备取第二行的元素。同时DX加1,将DX与I做比较,若DX小于等于I,则说明还有若干行的元素没处理完,转向LPI段;否则DX大于I时,说明I行所有的元素都已经处理完毕了。所以第(3)空填写"CMP DX,I"。接着将DI地址加2。因为除了将第一列的所有元素存放到DI中外,还存放了这些元素之和,并且和是占一个字的,即两个字节。所以第(3)空填写"ADD DI,2"。然后将表示列的BX加1,再将BX与J做比较,若BX小于等于J,说明还有若干列的元素没处理完,转向LPJ段;否则,BX大于J时,说明J列所有的元素都已经处理完毕了。所以,第(4)空填写"INCBX",空第(5)空填写"LPJ"。这样就完成了矩阵的转置和每一行元素的求和的功能。

请编制程序,其功能是:内存中连续存放着10个十六位二进制数。分别对每个数的高位字节和低位字节进行逻辑与运算及逻辑或运算。运算结果以字的形式按序连续存放(低位字节存入逻辑与运算的结果,高位字节存入逻辑或运算的结果)。
例如:
内存中有:AA55H,55AAH,FFAAH
结果为: PP00H,FF00H,FFAAH
部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放, 由过程SAVE保存到文件OUTPUT1.DAT中。
请填空BEGIN和END之间已经给出的源程序使其完整,空白处已经用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。
对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
[试题程序]
EXTRN LOAD://FAR,SAVE://FAR
N EQU 3
STAC SEGMENT STACK
DB 128 DUP ( )
STAC ENDS
DATA SEGMENT
SOURCE DW N DUP( )
RESULT DW N DUP(0)
NAME0 DB ’INPUT1.DAT’,0
NAME1 DB ’OUTPUT1.DAT’,0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STAC
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
LEA DX,SOURCE ;数据区起始地址
LEA SI,NANE0 ;原始数据文件名
MOV CX,N*2 ;字节数
CALL LOAD ;从’INPUT1.DAT’中读取数据
; ********* BEGIN **********
MOV DI,OFFSET RESULT
MOV CX,N
MOV BX,00
PRO: MOV AX, (1)
MOV DX,AX
AND (2) ,DH
(3) AH,AL
MOV (4) ,DL
ADD BX,2
(5)
ADD DI,2
(6)
JNZ PRO
; ******** END ********
LEA DX,RESULT ;结果数据区首址
LEA SI,NAME1 ;结果文件名
NOV CX,N*2 ;结果字节数
CALL SAVE ;保存结果到文件
RET
START ENDP
CODE ENDS
END START

(1)SOURCE[BX] (2)DL (3)OR
(4)AL (5)MOV [DI],AX (6)DECCX

请编制程序,其功能是:内存中连续存放着20个ASCII字符,如果是小写字母a~z之间的字符,请把它们转换成相应的大写字符;若为其他字符,不作转换。 例如: 内存中有61H(’a’),62H(’b’),31H(’1’),41H(’A’),42H(’B’)… 结果为 41H(’A’),42H(’B’),31H,41H(’A’),42H(’B’)… 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 请填空BEGIN和END之间已给出的源程序使其完整(空白己用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 试题程序:

(A)UPPERB
(B)’Z’
(C)A
(D)AL,0DFH
(E)AL
(F)SI
(G)DI
(H)LOOP

编制一个程序,实现如下功能:将内存中连续存放的10个八位二进制无符号数按照从大到小的顺序排列。
例如:
内存中有:3EH,0FEH,5DH……(假设后面的7个数都小于3EH)
结果为: 0FEH,5DH,3EH……(后面跟7个字,按照从大到小的顺序排列)。
部分程序已经给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入以SOURCE开始的内存单元中。运算结果要求从RESULT开始的内存单元存放,由过程SAVE保存到文件OUTPUT.DAT中。
请填空BEGIN和END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令也行,考生也可以删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
【试题程序】
EXTRN LOAD:FAR,SAVE:FAR
N EQU 10
SSEG SEGMENT STACK
DB 256 DUP ( )
SSEG ENDS
DSEG SEGMENT
SOURCE DB N DUP ( )
RESULT DB N DUP (0)
NAME0 DB ’INPUT.DAT’,0
NAME1 DB ’OUTPUT.DAT’,0
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DSEG
MOV DS,AX
LEA DX, SOURCE
LEA SI,NAME0
MOV CX,N
CALL LOAD
;******** BEGIN ********
MOV SI,OFFSET SOURCE
MOV DI,OFFSET RESULT
MOV CX,N
AGAIN0: MOV AX, [SI]
MOV [DI],AX
ADD SI, (1)
(2)
LOOP AGAIN0
CLD
MOV BX,N-1
AGAIN1: MOV SI,OFFSET RESULT
MOV CX,BX
AGAIN2: LODSB
CMP [SI],AX
(3)
XCHG [SI],AX
(4)
NEXT: LOOP AGAIN2
(5)
JNZ AGAIN1
;******** END ********
LEA DX,RESULT
LEA SI,NAME1
MOV CX,N
CALL SAVE
RET
START ENDP
CSEG ENDS
END START

(1)1 (2)ADD DI,1 (3)JBE NEXT
(4)MOV[SI-1],AX (5)DEC BX

已知在文件IN.dat中存有若干个(少于200个)四位数字的正整数,函数ReadDat( )读取这若干个正整数并存入数组number中。请编写函数CalValue( ),其功能要求是:①求出文件中共有的正整数个数totNum;②求这些数右移1位后,产生的新数是奇数的数的个数totCnt以及满足此条件的这些数(右移前的值)的算术平均值totAve。最后调用函数writeDat( )把所求的结果输出到OUT.dat文件中。
注意:部分源程序已经给出。请勿改动主函数main( )、读函数ReadDat( )和写函数writeDat( )的内容。
#include <stdio.h>
#include <conio. h>
#define MAXNUM 200
int number [MAXNUM];
int totNum = 0; /* 文件IN.dst 中共有的正整数个数*/
int totCnt = 0; /* 符合条件的正整数的个数*/
double totAve = 0.0; /* 平均值 */
int ReadDat (void);
void writeDat(void);
void CalValue(void)void main ( )
int i;
for (i=0; i<MAXNUM; i++)
number [i] = 0;
if (ReadDat( ))
printf (" 数据文件 IN.dst 不能打开! /007/n");
return;

CalValue ( );
printf(" 文件 IN.dst 中共有的正整数个数=%d个/n", totNum);
printf (" 符合条件的正整数的个数 =%d个/n", totCnt);
printf("平均值=%.2f/n", totAve);
writeDat ( ); int ReadDat (void)
FILE *fp;
int i = 0;
if ((fp = fopen("IN.dat", "r")) == NULL)
return 1;
while (!feof(fp))
fscanf(fp, "%d,", &number [i++]);
fclose (fp);
return 0;void writeDat (void)
FILE *fp;
fp = fopen("OUT.dat", "w");
fprintf(fp, "%d/n%d/n%6.2f/n", totNum, totCnt, totAve);
fclose (fp);

void CalValue(void)
{ int i, data;
for (i=0; i<MAXNUM; i++)
{ if (!number[i])
break;
if (number[i] > 0)
totNum++;
data = number[i]>>A;
if (data%B)
{ totCnt++;
totAve += number[i];
}
}
totAve /= totCnt;
}

已知在文件IN6.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位);产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)五部分组成。其中:金额=单价×数量。函数ReadDat( )的功能是读取这 100个销售记录并存入结构数组sell中。请编制函数SortDat( ),其功能要求:按产品代码从小到大进行排列,若产品代码相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WilteDat( )把结果输出到文件OUT6.DAT中。
注意:部分源程序已给出。请勿改动主函数main( )、读数据函数ReadDat( )和输出数据函数WriteDat( )的内容。
【试题程序】
#include <stdio.h>
#include <memory.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 100
typedef struct
char dm[5]; /*产品代码*/
char mc[ll]; /*产品名称*/
int dj; /*单价*/
int si; /*数量*/
long je; /*金额*/
PRO;
PRO sell[MAX]
void ReadDat( );
void WriteDat( );
void SortDat( )


void main( )

memset(sell,O,sizeof(sell));
ReadDat( );
SortDat( );
WriteDat( );

void ReadDat( )

FILE *fp;
char str[80],ch[11];
int i;
fp=fbpen("IN6.DAT","r");
for(i=0;i<100;i++)

fgets(str,80,fp);
memcpy(sell[i].dm,str,4);
memcpy(sell[i].mc,str+4,10);
memcpy(ch,str+14,4);ch[4]=0;
sell[i].dj=atoi(ch);
memcpy(ch,str+18,5);ch[5]=0;
sell[i].sl=atoi(ch);
sell[i].je=(long)sell[i].dj*sell[i].sl;

fclose(fp);

void WriteDat(void)

FILE *fp;
int i;
fp=fopen("OUT6.DAT","w");
for(i=0;i<100;i++)
fprintf(fp,"%s %s %4d %5d %101d/n", sell[i].dm, sell[i].mc,sell[i].dj,sell[i].sl, sell[i].je);
fclose(fp);

void SortDat()
{
int i,j;
PRO xy;
for(i=0;i<MAX-A;i++)
for(j=i+l;j<MAX;j++)
{
if(strcmp(sell[i].dm,sell[j].dm)>0) /*按代码从小到大进行排列*/
{ xy=sell[i];sell[i]=sell[j];sell[j]=xy;
else if(strcmp(sell[i].dm,sell[j].dm)==O) /*若金额相同*/
if(sell[i].je>sell[j].je) /*则按代码从大到小进行排列*/
{ xy=sell[i];sell[i]=sell[j];sell[j]=xy;
}
}

已知数据文件IN1.DAT中存有200个4位数,并已调用读函数readDat( )把这些数存入数组a中,请编制一函数jsVal( ),其功能是:如果4位数各位上的数字均是奇数,则统计出满足此条件的个数cnt,并把这些4位数按从大到小的顺序存入数组b中。最后调用函数writeDat( )把结果cnt及数组b中符合条件的4位数输出到OUT1.DAT文件。
注意:部分源程序已给出。
程序中已定义数组:a[200],b[200],已定义变量:cnt。
请勿改动主函数main( )、读函数readDat( )和写函数writeDat( )的内容。
试题程序:
#include<stdio.h>
#define MAX 200
int a[MAX],b[MAX],cnt=0;
void writeDat( );
void jsVal( )


void readDat( )

int i;
FILE *fp;
fp=fopen("IN1.DAT","r");
for(i=0;i<MAX;i++)
fscanf(fp,"%d",&a[i]);
fclose(fp);

void main( )

int i;
readDat( );
jsVal( );
prinff("满足条件的数=%d/n",cnt);
for(i=0;i<cnt;i++)
printf("%d/n",b[i]);
prinff("/n");
writeDat( );

void writeDat( )

FILE *fp;
int i;
fp=fopen("out1.dat","w");
fprinff(fp,"%d/n",cnt);
for(i=0;i<cnt;i++)
fprinff(fp,"%d/n",b[i]);
fclose(fp);

函数ReadDat( )的功能是实现从文件IN5.DAT中读取一篇英文文章存入到字符串数组xx中。请编制函数ConvertCharA( ),该函数的功能是:以行为单位把字符串中的所有小写字母改写成该字母的下一个字母,如果是字母z,则改写成字母a。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数WriteDat( )把结果xx输出到文件OUT5.DAT中。
例如,原文:Adb.Bcdza
abck.LLhj
结果:Aec.Bdeab
bcdl.LLik
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
注意:部分源程序已给出。
请勿改动主函数main( )、读函数ReadDat( )和写函数WriteDat( )的内容。
试题程序:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char xx[50][80];
int maxline=0;/*文章的总行数*/
int ReadDat(void);
void WriteDat(void);
void ConvertCharA(void)


void main( )
system("CLS");
if(ReadDat( ))

printf("数据文件IN5.DAT不能打开!/n/007");
return;

ConvertCharA( );
WriteDat( );
int ReadDat(void)

FILE *fp;
int i=0;
char *p;
if((fp=fopen("IN5.DAT","r"))==NULL)return 1;
while(fgets(xx[i],80,fp)!NULL)

P=strehr(xx[i],’/n’);
if(P) *P=0;
i++;

maxline=i;
fclose(fp);
return 0;

void WriteDat(void)

FILE *fp;
int i;
system("CLS");
fp=fopen("OUT5.DAT","w");
for(i=0;i<maxline;i++)

prinff("%s/n",xx[i]);
fprinff(fp,"%s/n",xx[i]);

fclose(fp);

void ConvertCharA(void)
{
int i,j; /*定义循环控制变量*/
int str; /*存储字符串的长度*/
for(i=0;i<maxline;i++) /*以行为单位获取字符*/
{
str=strlen(xx[i]); /*求得当前行的字符串的长度*/
for(j=0;j<str;j++) /*逐个取得当前行的每一个字符*/
if(xx[i][j]>=’a’&&xx[i][j]<=’z’) /*如果是小写字母*/
if(xx[i][j]==’z’)
xx[i][j]=’a’; /*如果是小写字母z,则改写成字母a*/
else
xx[i][j]+=A; /*其他的小写字母则改写为该字母的下一个字母*/
}
}

函数Rdata( )实现从文件IN.dat中读取一篇英文文章存入字符串数组string中,请编写函数SortCharA( ),其功能是:以行为单位对字符按从小到大的顺序进行排序,排序后的结果仍按行重新存入字爷串数组string中。最后调用函数Wdata( ),把结果string输出到OUT.dat文件中。
例如,原文:dAe, BfC.
CcbbAA
结果:,. ABCdef
AACbbc
原始数据文件存放的格式是:每行的宽度均小于80个字符(含标点符号和空格)。
注意:部分源程序已经给出。请勿改动主函数main( )、读数据函数Rdata( )和输出数据函数Wdata( )的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
char string [50] [80];
int maxline = 0; /* 文章的总行数 */
int Rdata (void);
void Wdata (void);
void SortCharA(void)void main ( )
if (Rdata ( ))
printf("数据文件 IN. dat 不能打开! /n/007");
return;

SortCharA ( );
Wdata ( );int Rdata (void)
FILE *fp;
int i = 0;
char *p;
if ((fp = fopen("IN. dat", "r")) == NULL)
return 1;
while (fgets(string[i], 80, fp) != NULL)
p = strchr(string[i], ’/n’);
if (p)
*p = 0;
i++;

maxline = i;
fclose (fp);
return 0;void Wdata (void)
FILE *fp;
int i;
fp = fopen("OUT. dat", "w");
for (i=0; i<maxline; i++)
printf("%s/n", string[i]);
fprintf(fp, "%s/n", string[i]);

fclose (fp);

函数ReadDat( )实现从文件IN.dat中读取1000个十进制整数到数组xx中;请编写函数 Compute( )分别计算出数组xx中奇数的个数odd、偶数的个数even,以及所有数的平均值aver和方差totfc的值。最后调用函数WriteDat( ),把结果输出到OUT. dat文件中。 计算方差的公式如下: 原始数据文件存放的格式是:每行存放10个数(每个数均大于0且小于等于2000),并用逗号隔开。 注意:部分源程序已经给出。请勿改动主函数main( )、读函数ReadDat( )和输出数据函数 WriteDat( )的内容。 #include <stdio. h> #include <stdlib. h> #include <string. h> #define MAX 1000 int xx[MAX], odd = 0, even = 0; double aver = 0.0, totfc = 0.0; void WriteDat(void); int ReadDat(void) FILE *fp; int i, j; if ((fp = fopen("IN. dat", "r")) == NULL) return 1; for (i=0; i<100; i++) for (j=0; j<10; j++) fscanf(fp, "%d,", &xx[i*10+j]); fscanf(fp, "/n"); if (feof(fp)) break; fclose(fp); return 0;void Compute(void) void main ( ) int i; for (i=0; i<MAX; i++) xx[i] = 0; if (ReadDat( )) printf (" 数据文件 IN. dar 不能打开! /007/n"); return; Compute ( ); printf("odd=%d/neven=%d/naver=%f/ntotfc=%f/n", odd, even, aver, totfc); WriteDat ( );void WriteDat(void) FILE *fp; fp = fopen("OUT.dat", "w"); fprintf(fp, "%d/n%d/n%f/n%f/n", odd, even, aver, totfc); fclose (fp);

void Compute (void)
{ int i;
for (i=0; i<1000; i++)
{ if (xx [i] %2)
odd++;
else
even++;
aver = aver+ xx[i];
}
aver /= MAX;
for (i=0; i<1000; i++)
totfc += (xx[i]-aver)*(xx[i]-aver)/MAX;
}

微信扫码获取答案解析
下载APP查看答案解析