问答题请编制程序PROG1.ASM,其功能是:内存中有一个ASCII字符串(从S0URCE开始存放),试将其中所有连续的回车与换行符(0DH,0AH)置换成单个回车符(0DH)。字符串以00H结尾,长度(包括00H)不超过100个字节。 例如:字符串41H,42H,0DH,0AH,43H,00H 转换为41H,42H,0DH,43H,00H 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。请编写BEGIN到END之间的代码。对程序必须进行汇编,并与IO.OBJ连接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。 部分源程序如下: EXTRN LOAD:FAR,SAVE:FAR N EQU 100 STAC SEGMENT STACK DB 128 DUP (?) STAC ENDS DATA SEGMENT SOURCE DB N DUP (0) 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 **** ***** END ***** LEA DX, RFSULT ; 结果数据区首址 LEA SI, NAME1 ; 结果文件名 MOV CX,N ; 结果字节数 CALL SAVE RET START ENDP CODE ENDS END START 相关知识:(略) 编程思路: 第一步:分析程序要求的功能。 本程序需要完成以下功能。 (1)据文件INPUT1.DAT中读取100个ASCII码存放在SOURCE开始的内存单元中。 (2)将SOURCE开始的100个字单元中的ASCII码,将0DH后的0AH删除,并将结果存放在RFSULT开始的内存单元中。 (3)将结果存放在OUTPUT1.DAT中。 第二步:用相应的汇编程序来实现其功能。 (1) 数据的读取和存入文件部分的实现,题目中已经给出。 (2) 如果是将数据在原地进行处理,那么每删除一个数据就要将其后面的所有数据向前移动一个位置,如果直接将扫描处理完毕的数据复制到结果地址中,将会节省移动数据的开销; 因为要删除0DH后面的0AH,所以,在扫描数组的过程中除了要了解当前数据元素的内容还要了解前一个数据的内容。解决方法可使用标志单元记录前一个数据是否为 0DH,然后当前数据元素根据标志单元的内容决定当前元素是否复制到结果中;也可在扫描数组的过程中,如果碰到一个0DH,则进入不同的程序段,这个程序段决定是否将当前数据元素复制到结果中。我们的参考答案采用了后一种方法。
问答题下列程序的功能是:将一正整数序列K1,K2,…,K9重新排成一个新的序列。新序列中,比K1小的数都在K1的左面(后续的再向左存放),比K1大的数都在K1的右面(后续的再向右存放),从K1向右扫描。要求编写函数jsValue()实现此功能,最后调用函数writeDat()把新序列输出到文件out72.dat中。 说明:在程序中已给出了10个序列,每个序列中有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。 注意:部分源程序已给出。 请勿改动主函数main()和写函数writeDat()的内容。 试题程序: #include <stdio.h> void writeDat(); void jsValue(int a[10][9]) void main() int a[10][9] = 6,8,9,1,2,5,4,7,3, 3,5,8,9,1,2,6,4,7, 8,2,1,9,3,5,4,6,7, 3,5,1,2,9,8,6,7,4, 4,7,8,9,1,2,5,3,6, 4,7,3,5,1,2,6,8,9, 9,1,3,5,8,6,2,4,7, 2,6,1,9,8,3,5,7,4, 5,3,7,9,1,8,2,6,4, 7,1,3,2,5,8,9,4,6, ; int i,j; jsValue(a); for(i=0;i<10;i + +) for(j=0;j<9;j + +) printf("% d",a[i][j]); if(j<=7)printf(","); printf("/n"); writeDat(a); void writeDat(int a[10][9]) FILE * fp; int i,j; fp=fopen("out72.dat","w"); for(i=0;i<10;i + +) for(j=0;j<9;j + +) fprintf(fp,"% d",a[i][j]); if(j<=7) fprintf(fp,","); fprintf(fp,"/n"); fclose(fp);
问答题试题要求如图10.2所示。#include<stdio.h>#include<string.h>#include<ctype.h>unsignedcharxx[50][80];intmaxline=0;/*文章的总行数*/intReadDat(void);voidWriteDat(void);voidencryptChar()voidmain()if(ReadDat())printf("数据文件IN.DAT不能打开/n/007");return;encryptChar();WriteDat();intReadDat(void)FILE*fp;inti=0;unsignedchar*p;if((fp=fopen("K://k06//35010002//in.dat","r"))==NULL)return1;while(fgets(xx[i],80,fp)!=NULL)p=strchr(xx[i],'/n');if(p)*p=0;i++;maxline=i;fclose(fp);return0;voidWriteDat(void)FILE*fp;inti;fp=fopen("K://k06//35010002//out.dat","w");for(i=0;i<maxline;i++)printf("%s/n",xx[i]);fprintf(fp,"%s/n",xx[i]);fclose(fp);
问答题fclose(wf);
问答题试题要求如下: 请编制程序,其功能是:计算10×2矩阵中每一行元素(八位二进制数)之和,将其放在指定的内存区中。 例如: 内存中有:0,0(第1行),1,1(第2行),……,9,9(第10行) 结果为: 0000H,0002H,0004H,……,0012H 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算的结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。补充BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序进行汇编,并与IO.OBJ链接产生执行文件,最终运行程序产生结果。调试中发现整个程序中存在错误之处,请加以修改。 试题程序: EXTRN LOAD: FAR, SAVE: FAR N EQU 20 DATA SEGMENT SOURCE DB N DUP(?) RESULT DB N/3 DUP(0) I EQU 10 J EQU 2 NAME0 DB 'INPUT1.DAT', 0 NAME1 DB 'OUTPUT1.DAT', 0 DATA ENDS SSEG SEGMENT STACK DB 256DUP (? ) SSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, SS: SSEG, DS: DATA 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.DAW'中读取数据 ; **** BEGIN **** LEA SI, SOURCE LEA DI, RESULT MOV BX, 1 LOP1 MOV DX, 0 MOV CX, I LOP2 MOV AL, [SI] (1) ADD DX, AX INC (2) INC CX CMP CX, (3) JBE LOP2 MOV [DI], DX ADD DI, (4) INC BX CMP BX, I JBE (5) ; **** END **** LEA DX, RESULT ; 结果数据区首址 LEA SI, NAME1 ; 结果文件名 MOV CX, L*2/3 ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
问答题请编制程序,其功能是:对经常上下波动的数据采用只记录峰值的数据压缩方法,即每次将采样到的当前值和前一次值比较,如数据变向改变(原变大现变小或原变小现变大),说明已过峰值,这时就将当前值记录下来。例如(下列数据均为无符号数):原数据:23H,45H,89H,67H,5CH,36H,3CH,78H…压缩后:23H,89H,36H…内存中从SOURCE开始连续存放着40个八位无符号数,假定相邻两数无相等的情况,编程按上述方法进行压缩,结果保存在RESULT开始的内存单元中。部分程序已给出,请填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成所要求的功能。原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:
问答题函数readDat()的功能是从文件IN22.DAT中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),该函数的功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT22.DAT中。 条件:从字符中间一分为二,左边部分按字符的ASCII值降序排序,排序后,左边部分与右边部分按例子所示进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。 例如, 位置 0 1 2 3 4 5 6 7 8 源字符串 a b c d h g f e 2 3 4 9 8 7 6 5 则处理后字符串 h g f e d c b a 8 7 6 5 9 4 3 2 注意:部分源程序已给出。 请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。 试题程序: #include<stdio. h> #include<string. h> #inc lude<conio, h> char xx[20] [80]; void jsSort() main ( ) readDat ( ); jsSort ( ); writeDat ( ); readDat ( ) FILE *in; int i=0; char *p; in= fopen("IN22.DAT","r"); while(i < 20 if(p) *p = 0; i++; fclose (in); writeDat ( ) FILE *out; int i; clrscr ( ); out = fopen("OUT22.DAT", "w"); for(i = 0; i < 20; i++) printf("%s/n", xx[i]); fprintf(out, "%s/n", xx[i]); fclose(out);
问答题下列程序的功能是:把s字符串中的所有字母改成该字母的下一个字母,字母2改成字母a。要求大写字母仍为大写字母,小写字母仍为小写字母,其他字符不做改变。请编写函数chg(char*s)实现程序要求,最后调用函数readwriteDAT(),读取in36.dat中的字符串,并把结果输出到文件out36.dat中。 例如:s字符串中原有的内容为Mn 123Zxy,则调用该函数后,结果为No 123Ayz。 注意;部分源程序已给出。 请勿改动主函数脚main()和输入输出函数readwriteDAT()的内容。 试题程序: #include<stdio.h> #include<string.h> #include<conio.h> #include<ctype.h> #define N 81 void readwriteDAT(); void chg(char *s) main() char a[N]; clrscr(); printf("Enter a string:"); gets(a); printf("The original string is :"); puts(a); chg(a); printf("The string after modified :"); puts(a); readwriteDAT(); void readwriteDAT() int i; char a[N]; FILE *rf,*wf; rf=fopen("in36.dat","r"); wf=fopen("out36.dat","w"); for(i=0;i<10;i++) fgets(a,81,rf); chg(a); fprintf(wf,"%s",a); fclose(rf); fclose(wf);
问答题请编制程序,其功能是:内存中连续存放着10个用ASCII码表示的十进制个位数,将它们转换成相应的二进制字节数N0,N1,…,N9,然后按序将N0~N9,存入内存中,最后存放它们的和M(M=N0+N1+N9)。M用压缩型(组合型)BCD码表示。 例如: 内存中有:30H('0'),39H('9'),31H('1')… 结果为:00H,09H,01H…(最后为M) 部分程序已给出,其中原始数据由过程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(?) RESULT DB N+1 DUP(0) NAME0 DB 'INPUT1.DAT',0 NAME1 DB 'OUTPUT1.DAT',0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,S S: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**** MOV DI,OFFSET RESULT MOV BX,0 MOV CX,N MOV DL, (1) PRO: MOV AL,SOURCE[BX] (2) AL,3 OH MOV [DI],AL (3) ADD AL,DL (4) MOV DL.AL INC BX (5) JNZ PRO (6) ;****END**** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N+1 ; 字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
问答题请编制程序,其功能为:内存中存放着10个二进制数,需对此数组进行加密。方法为将前一个字节数(两位十六进制数a1a2表示)的低位十六进制数a2与后一个字节数(两位十六进制数b1b2表示)的高位十六进制数b1进行交换:第一个字节数的高位十六进制数与最后一个字节的低位十六进制数进行交换,加密后的结果存入内存。 例如:内存中原始数据为:50H,61H,72H,83H,94H,…,E9H 结果:90H,07H,18H,29H,3AH,…,85H 部分程序已经给出,其中原始数据由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 10 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 128 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 MOV ES, AX LEA DX,SOURCE LEA SI,NAME0 MOV CX,N CALL LOAD ; *** BEGIN *** MOV DI,0 MOV SI,0 MOV CX,N CONT: MOV AL, SOURCE [SI] MOV AH,AL AND AL,0FH AND AH,0F0H INC SI CMP SI,N ____________ MOV SI,0 ONE: MOV BL, SOURCE [SI] MOV BH,BL AND BL,0FH AND BH,0FOH ____________ MOV CX,4 LI: SBR BH, 1 SHL AL,1 LOOP L1 ______,CX OR AH,BH OR AL,BL CMP DI, 0 JNZ STOPE1 MOV SOURCE [SI] ,AL DEC SI MOV SOURCE [SI], AH INC SI JMP NEXT STORE1: CMP DI, N-1 JL STORE2 MOV RESULT [DI], AH MOV DI, 0 MOV RESULT [DI], AL JMP NEXT STORE2: MOV ______, AH MOV ______, AL NEXT: INC DI LOOP CONT ; *** END *** LEA DX, RESULT LEA SI, NAME1 MOV CX, N CALL SAVE RET START ENDP CSEG ENDS END START
问答题读函数readDat()的功能是从文件IN25.DAT中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),该函数的功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组 xx中,最后调用写函数writeDat()把结果xx输出到文件OUT25.DAT中。 条件:从字符串中间一分为二,左边部分按字符的ASCII值升序排序,排序后,左边部分与右边部分按例子所示进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。 例女口:位置 0 1 2 3 4 5 6 7 8 源字符串 d c b a h g f e 4 3 2 1 9 8 7 6 处理后字符串 h g f e a b c d 9 8 7 6 1 2 3 4 注意:部分源程序已给出。 请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。 试题程序: #include <stdio.h> #include <string.h> #include <conio.h> char xx[20] [80]; void jsSort() main ( ) readDat ( ); jsSort ( ); writeDat ( ); readDat ( ) FILE *in; int i=0; char *p; in = fopen("IN25.DAT ", "r "); while(i〈20 if(p) *p = 0; i++; fclose (in); writeDat ( ) FILE *out; int i; clrscr(); out = fopen("OUT25.DAT", "w"); for(i=0; i〈20; i++) printf("%s/n", xx[i]); fprintf(out, "%s/n", xx[i]); fclose(out);
问答题请编制程序,其功能是:内存中连续存放着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
问答题已知在文件IN99.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中,金额=单价×数量可计算得出。函数ReadDa()的功能是读取这100个销售记录并存入数组sell中。请编制函数SortDat(),其功能要求:按金额从小到大进行排列,若金额相同,则按产品代码从小到大进行排列,排列结果仍存入结构数组sell中,最后调用函数Writedat()把结果输出到文件OUT99.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("IN99.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("OUT99.DAT","w"); for(i=0;i<100;i++) fprintf(fp,"%s %s %4d %5d %101d/".sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); fclose(fp)
问答题已知数据文件IN10.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序,最后调用写函数 writeDat()把数组b中的数输出到OUT10.DAT文件。 例如:9123,9-1-2-3>0,则该数满足条件存入数组b,且个数cnt=cnt+1。 9812,9-8-1-2<0,则该数不满足条件,忽略。 注意:部分源程序已给出。程序中已定义数组:a[300],b[300];已定义变量:cnt。请勿改动主函数main()、读函数 readDat()和写函数writeDat()的内容。 [试题程序] #include<stdio.h> int a[300],b[300],cnt=0; jsValue() main() int i; readDat(); jsValue(); writeDat(); for(i=0;i<cnt;i++)prmtf("b[%d]=%d\n",i,b[i]); readDat() FILE *fp; int i; fp=fopen("IN10.DAT","r"); for(i=0;i<300;i++)fscanf(fP,"%d,",i++)fprintf(fp,"%d\n",b[i]); fclose(fp);
问答题请编制程序PROG1.ASM,其功能是:以SOURCE开始的内存区域存放着红外数据通信系统传输的数据信息,其编码形式为:AACCXYXYDDEE,表示传送的数据为压缩BCD码XY。如AACCl212DDEE表示数据12。现要求编程实现解码,如果压缩BCD码不是以AACC开始或者不是以DDEE结束或中间两个BCD码不同,则此数据不解码。解码后的BCD码存入 RESULT开始的内存区域。 例如:原信息为:AAH,CCH,05H,05H,DDH,EEH,AAH,C8H,43H,43H,DDH,0EH,AAH,CCH,87H,87H,DDH,EEH,...... 结果为:05H,87H,…… 部分程序已给出,其中原始数据由过程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 6*N DUP(0) 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,6*N ; 字节数 CALL LOAD ; 从INPUT1.DAT中读取数据 ; **** BEGIN **** LEA SI,SOURCE MOV DI,OFFSET RESULT MOV CX, (1) LPST: MOV DL, 6 MCLP1: MOV AL, (2) MOV BX,SI CMP AL,0AAH JNZ NEXTD INC SI MOV AL,[SI] CMP AL,0CCH (3) INC SI MOV AL,[SI] MOV DH,AL INC SI MOV AL,[SI] (4) JNZ NEXTD INC SI MOV AL,[SI] CMP AL,0DDH JNZ NEXTD INC SI MOV AL,[SI] CMP AL,0EEH JNZ NEXTD INC SI MOV [DI],DH INC DI NEXTD: (5) MOV SI,BX (6) ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名起始地址 MOV CX,N ; 字节数 CALL SAVE ; 保存结果到OUTPUT1.DAT文件中 RET START ENDP CODE ENDS END START
问答题函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS1.DAT中。 替代关系:f(p)=p*11 mod 256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或大于130,则该字符不变,否则将f(p)所对应的字符进行替代。 原始数据文件存放的格式是:每行的宽度均小于80个字符。 部分程序已经给出。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 #include <stdio.h> #include <string.h> #include <conio.h> #include <ctype.h> unsigned char xx[50][80]; int maxline=0; /*文章的总行数*/ int ReadDat(void); void WriteDat(void); void encryptChar() void main() clrscr(); if(ReadDat()) printf("数据文件ENG.IN不能打开!/n/007"); return; encryptChar(); WriteDat(); int ReadDat(void) FILE *fp; int i=0; unsigned char *p; if((fp=fopen("eng.in","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(void) FILE *fp; int i; fp=fopen("ps1.dat","w"); for(i=0;i<maxline;i++) printf("%s/n",xx[i]); fprintf(fp,"%s/n",xx[i]); fclose(fp);
问答题已知在文件IN46.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中,金额=单价×数量。函数ReadDal.()的功能是读取这100个销售记录并存人数组sell中。请编制函数SortDat(),其功能要求:按金额从大到小进行排列,若金额相同,则按产品代码从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用写函数writeDat()把结果输出到文件OUT46.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容 [试题程序] #include<stdio.h> #include<memory.h> #include<string.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() voidmain() memset(sell,0,sizeof(sell)); ReadDat(); SortDat(); WriteDat(); void ReadDat() FILE*fp; char str[80],ch[11]; int i; fp=fopen("IN46.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=(10ng)sell[i].dj*sell[i].sl; fclose(fP); void WriteDat() FILE*fp; int i; fp=fopen("OUT46.DAT","w"); for(i=0;i<100;i++) fprintf(fp,"%s %s %4d %5d%10id/n",sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); fclose(fp);
问答题请编制程序,其功能是:内存中连续存放着16个10位二进制数DB9DB8…DB0,每个二进制数据均用两个字节表示,其存放格式均为:转换结果按原序存放在内存中。例如:内存中有:C048H,4091H,0080H,…结果为:23H,01H,45H,02H,00H,02H…部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。请填空BEGIN和END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGIN和END之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。[试题程序]EXTRNLOAD:FAR,SAVE:FARNEQU16STACSEGMENTSTACKDB128DUP(?)STACENDSDATASEGMENTSOURCEDWNDUP(?)RESULTDBN*2DUP(0)NAME0DB'INPUT1.DAT',0NAME1DB'OUTPUT1.DAT',0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACSTARTPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXLEADX,SOURCE;数据区起始地址LEASI,NAME0;原始数据文件名MOVCX,N*2;字节数CALLLOAD;从"INPUT1.DAT"中读取数据;********BEGIN********MOVDI,OFFSETRESULTMOVBX,0MOVCH,NPRO:MOVAH,BYTEPTRSOURCE[BX]MOVAL,(1)MOVDL,AH;10位无符号二进制数高八位MOVDH,AL;10位无符号二进制数低二位MOVCL,2SHLAX,(2)SHLDX,(3)MOVAL,DHMOV[DI],(4)MOV[DI+I],(5)ADDDI,2ADDBX,2DECCHJNZPRO;********END********LEADX,RESULT;结果数据区首址LEASI,NAME1;结果文件名MOVCX,N*2;结果字节数CALLSAVE;保存结果到文件RETSTARTENDPCODEENDSENDSTART
问答题请编制程序,其功能是:内存中连续存放着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链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:
问答题已知在文件IN8.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc (字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中,金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入数组sell中。请编制函数SortDat(),其功能要求:按金额从小到大进行排列,若金额相同,则按产品代码从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT8.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[11] /*产品名称*/ int dj; /*单价*/ int sl; /*数量*/ long je; /*金额*/ PRO; PRO sell[MAX]; void ReadDat(); void WriteDat(); void SortDat() void main() memset(sell,(),sizeOf(sell)); ReadDat(); SortDat(); WriteDat(); void ReadDat() FILE *fp; chnr str[80],ch[11]; int i; fp=Open("IN8.DAT","r"); for(i=0;i<100;i++) fgets(str,80,fp); memcpy(5ell[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; fclosc(fp); void WriteDat() FILE*fp; Int i; fp=fopen("OUT8.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);
