问答题请编制程序,其功能是:内存中连续存放的20个八位无符号数是一个自动抄表示抄录的20个用户某月的用水量(立方米),为了控制用水量,水费计算公式如下(X表示用水量;Y表示水费,单位为分): a) Y=X*70 X<=10 b) Y=10*70+(X-10)*120 X>10 例如: 用水量(X):04H,0FH,18H… 水费(Y): 0118H,0514H,094CH… 试计算出这20个用户应缴纳的水费,结果用字(word)表示。 部分程序已给出原始数据由过程LOAD从文件INPUT.DAT中读入SOURCE开始的内存单元中,结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT.DAT中。 请填空BEGIN和END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGIN和END之间原有的代码并自行编写程序片段来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 【试题程序】 EXTRN LOAD:FAR,SAVE:FARN EQU 20RATE1 EQU 70RATE2 EQU 120DELTA EQU 10STAC SEGMENT STACK DB 128 DUP(?)STAC ENDSDATA SEGMENTSOURCE DB N DUP(?)RESULT DW N DUP(0)NAME0 DB 'INPUT.DAT',0NAME1 DB 'OUTPUT.DAT',0DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACSTART PROC FAR PUSH DS XOR AX,AX PUSH AX NOV AX, DATA MOV DS,AX LEA DX,SOURCE ; 数据区起始地址 LEA SI,NAME0 ; 原始数据文件名起始地址 NOV CX,N ; 字节数 CALL LOAD ; 从'INPUT.DAT'中读取数据; ******** BEGIN ******** LEA SI, SOURCE LEA DI, RESULT CLD MOV CX,N MOV BL,RATE1 MOV BH,RATE2NEXT:{{U}} {{/U}} CMP AL,DELTA J{{U}} {{/U}} GREAT MUL BL JMP STOREGREAT:{{U}} {{/U}} MUL BH{{U}} {{/U}}STORE:{{U}}{{/U}}{{U}} {{/U}} INC SI LOOP NEXT; ******** END ******** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名起始地址 MOV CX,N*2 ; 字节数 CALL SAVE ; 保存结果到'OUTPUT.DAT'文件 RETSTART ENDPCODE ENDS END START
问答题已知文件IN21.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型 10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中;金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品名称从大到小进行排列,若产品名称相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件 OUT21.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 试题程序: #include <stdio.h> #include <mem.h> #include <string.h> #include <conio.h> #include <stdlib.h> #define MAX 100 typedef struct char dm[5]; /*产品代码*/ char mc[ll]; /*产品名称*/ int dj; /*单价*/ int sl; /*数量*/ long je; /*金额*/ PRO; PRO sell[MAX]; void ReadDat ( ); void WriteDat (); void SortDat () main ( ) memset(sell, 0, sizeof(sell)); ReadDat ( ); SortDat ( ); WriteDat ( ); void ReadDat ( ) FILE *fp; char str[80] , chilli; int i; fp = fopen("IN21.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].s1; fclose (fp); void WriteDat() FILE *fp; int i; fp = fopen("OUT21.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);
问答题请编制程序PROG1.ASM,其功能是:内存中从SOURCE开始连续存放着20个字(WORD),试统计每个字中二进制位为1的个数。结果以字节存放。例如:内存中有139CH,518CH,1489H,…,结果为07H,08H,05H,…. 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与IO.OBJ连接生成PROG1.EXE执行文件,最终运行程序产生结果 (无结果或结果不正确者均不得分)。 注意:源程序非填空部分可能存在个别非法指令,考生阅读源程序或调试该程序时若发现这些非法指令,请加以修改! EXTRN LOAD:FAR,SAVE:FAR N EQU 20 STAC SEGMENT STACK DB 128 DUP(?) STAC ENDS DATA SEGMENT SOURCE DW N DUP(?) RESULT DB NDUP(0) NAMEO 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 S1,NAMEO ;原始数据文件名 MOV CX,N * 2 ;字节数 CALL LOAD ;从INPUT1.DAT中读取数据 ; * * * * BEGIN * * * * LEA SI,SOURCE LEA DI,RESULT CLD MOV DX,N LOOP0: LODS _____ _______ MOV CX,16 LOOP1: ROL AX,1 J_____ NEXT INC BX NEXT: LOOP _____ MOV [DI],BL ______ DEC DX JNZ LOOP0 ; * * * * END * * * * LEA DX,RESUIT ;结果数据区首址 LEA SI,NAME1 ;结果文件名 MOV CX,N ;结果字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START
问答题请编写函数countValue(),它的功能是:求n以内(不包括n)同时能被3与7整除的所有自然数之和的平方根s,并作为函数值返回,最后将结果s输出到文件OUT87.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()和输入输出函数progReadWrite()的内容。 试题程序: #include <stdlib.h> #include <math.h> #include <stdio.h> void progReadWrite(); double countValue(int n) void main() system("CLS"); printf("自然数之和的平方根=% f/n",countValue(1000)); progReadWrite(); void progReadWrite() FILE * wf; double s; wf=fopen("OUT87.DAT","w"); s=countValue(1000); fprintf(wf,"% f/n",s); fclose(wf);
问答题请编制程序,其功能为:内存中连续存放着20个无符号字节数,求它们的和。和值按字的形式存放,此前先按序存放参加运算的20个字节。 例如; 内存中有:01H,02H,03H …… 结果为:01H,02H,03H …… (参加运算的字节),后跟一个字(为前面各字节的和) 部分程序已经给出,其中原始数据由LOAD过程从文件INPUT1.DAT中读入从SOURCE开始的内存单元,运算结果要求从RESULT开始存放,由SAVE过程保存到OUTPUT1.DAT文件中。请在BEGIN和END之间补充使其完整,完成要求的功能。或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终产生运行结果。 部分程序如下: ;PROG1.ASM EXTRN LOAD:FAR,SAVE:FAR N EQU 20 DSEG SEGMENT SOURCE DW N DUP (?) RESULT DW N DUP (0) NAME0 DB 'INPUT1.DAT',0 NAME1 DB 'OUTPUT1.DAT',0 DSEG ENDS SSEG SEGMENT STACK DB 256 DUP (?) SSEG 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 *** LEA SI,SOURCE LEA DI,RESULT MOV CX,N MOV BX,0 NEXT: MOV AL,[SI] ____________ ____________ MOV [DI],______ ____________ ____________ LOOP NEXT MOV [DI],______ ; *** END *** LEA DX,RESULT LEA SI,NAME1 MOV CX,N+2 CALL SAVE RET START ENDP CSEG ENDS END START
问答题请编制程序,其功能是:求I×J矩阵的转置矩阵(矩阵中元素为字节型),并计算转置矩阵的每一行元素之和,然后存放在每一行最后一个字单元中。 例如: 内存中有:04H,05H,06H,(第一行)01H,02H,03H(第二行) 结果为: 04H,01H,05H,00H,05H,02H,07H,00H,06H,03H,09H,00H 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 请填空BEGIN和END之间已经给出的一段源程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 [试题程序] EXTRN LOAD:FAR,SAVE:FAR N EQU 30 I EQU 3 J EQU 10 DSEG SEGMENT SOURCE DB N DUP(?) SRC DW SOURCE RESULT DB (N+2*J)DUP(0) NAME0 DB 'INPUT1.DAT',0 NAME1 DB 'OUTPUT1.DAT',0 DSEG ENDS SSEG SEGMENT STACK DB 256 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,SS:SSEG,DS:DSEG START PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DSEG MOV DS,AX MOV ES,AX LEA DX,SOURCE LEA SI,NAME0 MOV CX,N CALL LOAD ******** BEGIN ******** LEA SI,SOURCE LEA DI,RESULT MOV BX,1 ; 第一列 LPJ: MOV CX,0 ; 累加和 MOV DX,1 ; 第一行 LPI: MOV AL,[SI] ADD CL,AL (1) STOSB ADD SI,10 INC DX (2) JBE LPI MOV [DI],CX (3) INC SRC ; 下一列 MOV SI,SRC (4) CMP BX,J JBE (5) ******** END ******** LEA DX,RESULT LEA SI,NAME1 MOV CX,(N+2*J) CALL SAVE RET START ENDP CSEG ENDS END START
问答题试题要求如下: 请编制程序,其功能是:从20个有符号字节数据中取出负数并计算其绝对值之和(字型),然后存放在指定的内存区中,多余的空间填0。 例如: 内存中有:80H,02H,00H,7CH,7BH,81H…… 结果为: 80H,FEH,FDH,05H,00H,00H…… 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算的结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。补充BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序进行汇编,并与IO.OBJ链接产生执行文件,最终运行程序产生结果。调试中发现整个程序中存在错误之处,请加以修改。 试题程序: EXTRN LOAD: FAR, SAVE: FAR N EQU 20 STAC SEGMENT STACK DB 256 DUP (?) STAC ENDS DATA SEGMENT SOURCE DB N DUP(?) RESULT DB 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 MOV ES, AX LEA DX, SOURCE ; 数据区起始地址 LEA SI, NAME0 ; 原始数据文件名 MOV CX, N ; 字节数 CALL LOAD ; 从'INPUT1.DAW'中读取数据 **** BEGIN **** LEA SI, SOURCE LEA DI, RESULT MOV DX, 0 MOV CX, N CLD CON: LODSB (1) JGE (2) MOV [DI], AL INC DI (3) INC DI ADD DL, AL (4) NEXT: LOOP CON MOV [DI], DX ADD DI, 2 MOV CX, 40 SUB CX, DI MOV AL, (5) (6) ; **** END **** LEA DX, RESULT ; 结果数据区首址 LEA SI, NAME1 ; 结果文件名 MOV CX, N ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
问答题请编制程序,其功能是:内存中连续存放着10个无符号8位格雷码表示的数,现将此10个数转换成10个8位二进制数,结果存入内存,其转换方法为二进制数的最高位D[7]与格雷码的最高位G[7]相同,二进制数的其余七位D[k](k=6,…,0)分别为格雷码的位G[k](k=6,…,0)与二进制数的位D[k+1](k=6,…,0)异或的结果。 例如: 内存中有:00H,03H,2BH,67H,0CH,15H,54H,02H,D8H,C7H 结果为:00H,02H,32H,45H,081-I,19H,67H,03H,90H,85H 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件 OUTPUT1.DAT中。 填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处,请加以修改。 试题程序; EXTRN LOAD:FAR,SAVE:FAR N EQU 10 STAC SEGMENT STACK DB 128 DUP(?) STAC ENDS DATA SEGMENT SOURCE DB N DUP(?) ; 顺序存放10个字节数 RESULT DB 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,NAME0 ; 原始数据 MOV CX,N ; 字节数 CALL LOAD ; 从INPUT1.DAT中读取数据 ;* ***BEGIN**** LEA SI,SOURCE LEA DI,RESULT MOV CX, 10 AGN0: MOV AL,[SI] (1) MOV CX,8 MOV BX,0 AGN1: MOV AH,0 SHL BL,1 (2) AL,1 RCL AH, 1 CMP AH, (3) (4) JMP NEXT SET ONE: OR BL,01H NEXT: MOV (5) ,BL (6) LOOP AGN1 (7) MOV [DI],BL INC SI INC DI LOOP AGN0 ; ****END**** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
问答题已知在文件IN54.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金je(长整型)几部分组成。其中,金额=单价×数量可计算得出。函数ReadDat()的功能是读取这100个销售记录并存入数组sell中。请编制函数SortDat(),其功能要求:按金额从大到小进行排列,若金额相同,则按产品名称从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件 OUT54.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 试题程序: #include<stdio.h> #include<mem.h> #include<string.h> #include<conio.h> #include<stdlib.h> #define MAX 100 typedef struct char dm[5]; char mc[11]; int dj; int sl; long je; PRO; PRO sell[MAX]; void ReadDat(); void WriteDat(); void SortDat() void main() memset(sell,0,sizeof(sell)); ReadDat(); SortDat(); WriteDat(); void ReadDat() FILE *fp; char str[80],ch[11]; int i; fP=fopen("IN54.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() FILE *fp; int i; fP=fopen("OUT54.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);
问答题试题要求如下: 请编制程序,其功能是:内存中连续放着20个ASCII字符,如果是小写字母A~Z之间的字符,请把它们转换成相应的小写字母:若为其他字符,均转换成ASCII字符'NUL' (00H)。 例如: 内存中有:41H ('A'),42H ('B'),5EH,64H,48H…… 结果为: 61H ('a'),62H ('b'),00H('NUL'),00H('NUL'),00H('NUL')…… 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算的结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。在BEGIN和AND之间编程完成要求的功能。 对程序进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果。 试题程序: EXTRN LOAD: FAR, SAVE: FAR N EQU 20 STAC SEGMENT STACK DB 128 DUP (? ) STAC ENDS DATA SEGMENT SOURCE DB N DUP(?) RESULT DB N DUP(0FH) 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, NAME0 ; 原始数据文件名 MOV CX, N ; 字节数 CALL LOAD ; 从'INPUT1.DAT'中读取数据 LEA SI, SOURCE LEA DI, RESULT ; **** BEGIN **** ; **** END **** LEA DX, RESULT ; 结果数据区首址 LEA SI, NAME1 ; 结果文件名 MOV CX, L+I ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
问答题已知在文件IN2.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价山(整型)、数量s1(整型)、金额je(长整型)五部分组成。其中:金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品名称从大到小进行排列,若产品名称相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT2.DAT中。 注意:部分源程序已给出。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 [试题程序] #include #include #include #include #include #define MAX 100 typedef struct char dm[5]; /*产品代码* / char mc[11]; /*产品名称*/ int dj; /*单价*/ int si; /*数量*/ long je; /*金额*/ PRO; PRO sell[MAX]; void ReadDat(); void WriteDat(); void SortDat() void main() memset(sell,0,sizeof(sell)); ReadDat(); SortDat(); WriteDat(); void ReadDat() FILE * fp; char str[80],ch[11]; int i; fp=fopen("IN2.DAT","r"); for(i=0;i<100;i++) fgets(str,80,fp); memcpy(sell[i].dm,str,4); memepy(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].si=atoi(ch); sell[i].je=(long)sell[i].dj*sell[i].s1; fclose(fp); void WriteDat(void) FILE * fp; int i; fp=fopen("OUT2.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].s1,sell[i].je); fclose(fp);
问答题下列程序的功能是:选出5000以下符合条件的自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的10倍。计算并输出这些4位自然数的个数cnt及这些数的和sum。请编写函数countValue0实现程序的要求,最后调用函数writeDAT()把结果cnt和sum输出到文件OUT67.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()和写函数writeDAT()的内容。 试题程序: #include<stdio. h> int cnt, sum; void countValue ( ) void main ( ) cnt=sum=0; countValue ( ); printf ( "满足条件的自然数的个数=%d/n", cnt ); printf ( "满足条件的自然的值的和=%d/n", sum); writeDAT ( ); writeDAT ( ) FILE *fp; fp=fopen ( "OUT67. DAT", "w" ); fprintf (fp, "%d/n%d/n", cnt, sum); fclose (fp);
问答题已知数据文件IN78.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsVal(),其功能是:如果一个4位数的千位数字上的值大于等于百位数字上的值,百位数字上的值大于等于十位数字上的值,以及十位数字上的值大于等于个位数字上的值,并且此4位数是奇数,则统计出满足此条件的数的个数cnt并把这些4位数按从小到大的顺序存入数组b中,最后调用写函数writeDat()把结果cnt及数组b中符合条件的4位数输出到OUT78.DAT文件中。 注意:部分源程序已给出。 程序中已定义数组:a[200],b[200],已定义变量:cnt。 请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。 试题程序: #include<stdio.h> #define MAX 200 int a[MAX],b[MAX],cnt=0; void jsva1( ) void readDat( ) int i; FILE *fp; fp=fopen("IN78.DAT","r"); for(i=0;i<MAX;i++) fscanf(fp,"%d", fclose(fp); main() int i; readDat(); jsVa1(); printf("满足条件的数=%d/n",cnt); for(i=0;i<cnt;i++) printf("%d",b[i]); printf("/n"); writeDat(); writeDat() FILE *fp; int i; fp=fopen("OUT78.DAT","w"); fprintf(fp,"%d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp, "%d/n",b[i]); fclose(fp);
问答题请编制程序,其功能是:内存中有一个由16个十六位二进制数组成的数组(SOURCE)和一个字变量L。试将L作为逻辑尺对数组SOURCE进行下列处理:如L的第i位为0,则数组的第i个数不变:如L的第i位为1,则数纽的第i个数按位取反。字L的位序从低到高依次为0至15,数组下标依次从0到15。 例如:L=0009H 数组为:139CH,89C6H,5437H,8819H,… 变换为:EC63H,89C6H,5437H,77E6H,… 部分程序已给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入(L在前,SOURCE在后)。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT.DAT中。 请填空BEGIN和END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGIN和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 [试题程序] EXTRN LOAD:FAR,SAVE:FAR N EQU 16 STAC SEGMENT STACK DB 128 DUP (?) STAC ENDS DATA SEGMENT L DW ? SOURCE DW N DUP(?) RESULT DW N DUP(0) NAME0 DB 'INPUT.DAT',0 NAME1 DB 'OUTPUT.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,L ;数据区起始地址 LEA SI,NANE0 ;原女合数据文件名 MOV CX,2*(N+1) ;字节数 CALL LOAD ;从'INPUT.DAT'中读取数据 ; ******** BEGIN ************ LEA SI, SOURCE (1) MOV CX,N MOV DX, (2) L0: MOV AX, [SI] (3) L,DX (4) STORE NOT AX STORE:MOV [DI],AX ADD DI,2 ADD SI,2 (5) LOOP L0 ; ******** END ******** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ;结果文件名 MOV CX,2*N ;结果字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START
问答题请编制程序,其功能是:从第0行第0列开始,依次取出N阶矩阵中对角线上的元素(字节型)并计算累加和(字型),然后将其存放在指定的内存区中。 例如: 内存中有:01H,01H,01H,02H,02H,02H,03ff,03H,03H 结果为: 01H,02H,03H,06H,00H 部分程序已给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入SOURCE开始的内存单元中,转换结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT.DAT中。 请填空BEGIN和END之间已经给出的一段源程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 【试题程序】 EXTRN LOAD:FAR, SAVE:FAR N EQU 10 DSEG SEGMENT SOURCE DB N*10 DUP(?) RESULT DB (N+2) DUP(0) NAME0 DB 'INPUT.DAT',0 NAME1 DB 'OUTPUT.DAT',0 DSEG ENDS SSEG SEGMENT STACK DB 256 DUP (?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG, SS:SSEG, DS:DSEG START PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DSEG MOV DS,AX MOV ES,AX LEA DX, SOURCE LEA SI,NAME0 MOV CX,N*10 CALL LOAD ******** BEGIN ******** LEA DI,RESULT MOV CX,0 MOV DH,0 ;行 MOV DL,0 ;行 NEXT: MOV AL,N MUL (1) MOV BX,AX MOV AL,DL (2) MOV SI, AX ;列号送SI MOV AL, (3) [BX+SI] MOV [DI],AL ADD CL,AL (4) INC DI INC DH INC DL CMP DL, (5) JNE NEXT MOV [DI],CX ; ******** END ******** LEA DX,RESULT LEA SI,NAME1 MOV CX,N+2 CALL SAVE RET START ENDP CSEG ENDS END START
问答题函数ReadDat()的功能是实现从文件IN39.DAT中读取一篇英文文章存入到字符串数组xx中。请编制函数ChA(),该函数的功能是:以行为单位把字符串的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个新的字符,第二个字符的ASCII值加第三个字符的ASCII值,得到第二个新的字符,以此类推一直处理到倒数第二个字符,最后一个字符的ASCII值加第一个字符的ASCII值,得到最后一个新的字符,得到的新字符分别存放在原字符串对应的位置上。最后把已处理的字符串逆转后仍按行重新存入字符串数组xx中,井调用函数WriteDat()把结果肛输出到文件OUT39.DAT中。 注意:部分源程序已给出。 原始文件存放的格式是:每行的宽度小于80个字符,含标点符号和空格。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 试题程序: #include<stdio.h> #include<string.h> #include<conio.h> char xx[50][80]; int maxline=0; int ReadDat(); void WriteDat(); void ChA(void) void main() clrscr(); if (ReadDat()) printf("数据文件 IN39.DAT 不能打开!/n/007" ); return; ChA( ); WriteDat(); int ReadDat(void) FILE *fp; int i=0; char *p; if((fp=fopen("IN39.DAT","r"))==NULL) return 1; while(fgets(xx[i],80,fp)!=NULL) p=strchr(xx[i],'/n'); if(p) *p=0; i++; maxline=i; fclose(fp); return 0; void WriteDat() FILE *fp; int i; clrscr(); fp=fopen("OUT39.DAT","w"); for(i=0;i<maxline;i++) printf("%s/n",xx[i]); fprintf(fp,"%s/n",xx[i]); fclose(fp);
问答题已知数据文件IN69.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsVal(),其功能是:把一个4位数的千位数上的值减百位数上的值再减十位数上的值最后减个位数上的值,如果得出的值大于等于零且此4位数是奇数,则统计出满足此条件的数的个数cnt并把这些4位数存入数组b中,然后对数组b的4位数按从小到大的顺序进行排序,最后调用函数writeDat()把结果cnt及数组b中的符合条件的4位数输出到out69.dat文件中。 注意:部分源程序已给出。 程序中已定义数组:a[200],b[200],己定义变量:cnt。 请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。 试题程序: # inc lude<stdio, h> #define MAX 200 int a [MAX], b [MAX], cnt=0; void jsVal() void readDat ( ) int i; FILE *fp; fp= fopen ( "IN69. DAT", "r" ); for (i=0; i<MAX; i++) fscanf (fp, "%d" , fclose (fp); void main ( ) int i; readDat ( ); jsVal ( ); printf ("满足条件的数=%d/n", cnt ); for (i=0; i<cnt; i++) printf("%d",b[i]); printf ( "/n" ); writeDat (); writeDat ( ) FILE *fp; int i; fp=fopen ( "out69. dat", "w" ); fprintf (fp, "%din", cnt); for (i=0; i<cnt; i++) fprint f ( fp, "%din", b [i] ); fclose(fp);
问答题请编制函数ReadDat()实现从文件in.dat中读取1000个十进制整数到数组xx中;请编制函数Compute()分别计算出xx中奇数的个数odd,奇数的平均值avel,偶数的平均值ave2以及所有奇数的方差totfc的值,最后调用函数WriteDat()把结果输出到out.dat文件中。计算方差的公式如下:设N为奇数的个数,xx[i]为奇数,ave1为奇数的平均值。原是数据文件存放的格式是:每行存放10个数,并用逗号格开(每个数均大于0且小于等于2000)。注意:部分源程序给出如下:请勿改动主函数main()和输出数据函数WriteDat()的内容。[试题源程序]#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAX1000intxx[MAX],odd=0,even=0;doubleave1=0.0,ave2=0.0,totfc=0.0;voidwriteDat(void);intReadDat(void)FILE*fp;if((fp=fopen("iN.DAT","r"))==NULL)return1;fclose(fp);return0;voidCompute(void)voidmain()inti;for(i=0;i<MAX;i++)xx[i]=0;if(ReadDat())printf("数据文件IN.DAT不能打开!/007/n");return:Compute();printf("ODD=%d/nAVEl=%f/nAVE2=%f/nTOTFc=%f/n",odd,ave1,ave2,totfc);WriteDat();voidWriteDat(void)FLLE*fp;inti:fp=fopen("OUT.DAT","w");fprintf(fp,"%d/n%f/n%f/n%f/n",odd,ave1,ave2,totfc);fclose(fp):
问答题请编制程序ex7.ASM,其功能是:从第0行第0列开始,依次取出N阶矩阵中对角线上的元素(字节型)并计算累加和(字型),然后将其存放在指定的内存区中。 例如: 内存中有:01H,01H,01H,02H,02H,02H,03H,03H,03H 结果为:01H,02H,03H,06H,OOH 部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。填空BEGIN和END之间已给出的源程序使其完整,空白处已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ连接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序存在错误之处,请加以修改。 [试题程序] EXTRN LOAD:FAR,SAVE:FAR N EQU 4 DSEG SEGMENT SOURCE DB N*10 DUP(?) RESULT DB (N+2)DUP(0) NAME0 DB 'INPUT.DAT',0 NAME1 DB 'OUTPUT.DAT',0 DSEG ENDS SSEG SEGMENT STACK DB 256 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,SS:SSEG,DS:DSEG START PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DSEG MOV DS,AX MOV ES,AX LEA DX,SOURCE LEA SI,NAME0 MOV CX,N*4 CALL LOAD ; ******** BEGIN ******** LEA DI,RESULT MOV CX,0 MOV DH,0 ;行 MOV DL,0 ;行 NEXT: MOV AL,N MUL (1) MOV BX,AX MOV AL,DL (2) MOV SI,AX ;列号送SI MOV AL,(3)[BX+SI] MOV [DI],AL ADD CL,AL (4) INC DI INC DH INC DL CMP DL, (5) JNE NEXT MOV [DT],CX ; ******** END ******** LEA DX,RESULT LEA SI,NAME1 MOV CX,N+2 CALL SAVE RET START ENDP CSEG ENDS END START
问答题在文件IN30.DAT中有200组数据,每组有3个数,每个数均是3位数。函数readDat()是读取这200组数据存放到结构数组aa中。请编制函数jsSort(),其函数的功能是:要求在200组数据中找出条件为每组数据中的第二个数大于第一个数加第三个数之和,其中满足条件的个数作为函数jsSort()的返回值,同时把满足条件的数据存入结构数组bb中,再对结构数组bb中的数据按照每组数据的第二个数加第三个数之和的大小进行降序排列,排序后的结果仍重新存入结构数组bb中,最后调用函数writeDat()把结果bb输出到文件OUT30.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。 试题程序: #include〈stdio.h> #include〈string.h> #include〈conio.h> typedef struct int x1, x2, x3; Data; Data aa[200], bb[200]; int jsSort () main ( ) int count; readDat ( ); count = jsSort(); /*返回满足条件的个数*/ writeDat (count); readDat ( ) FILE *in; int i; in = fopen("IN30.DAT", "r"); for(i=0; i〈200; i++) fscanf(in, "%d %d %d", fclose (in); writeDat(int count) FILE *out; int i; out= fopen("OUT30.DAT", "w"); clrscr ( ); for(i=0; i〈count; i++) printf("%d, %d, %d 第二个数+第三个数=%d/n", bb[i].x1, bb[i].x2, bb[i].x3, bb[i] .x2+bb[i] . x3); fprintf(out, "%d, %5d, %d/n", bb[i].x1, bb[i].x2, bb[i].x3); fclose (out);