问答题已知在文件in.dat中存有若干个(小于200)的4位数字的正整数,函数ReadDat()读取若干个正整数并存人数组xx中。请编制函数CalValue(),其功能要求:(1)求出这文件中共有多少个正整数totNum;(2)求这些数中的各位数字之和是奇数的数的个数totCnt,以及满足此条件的这些数的算术平均值totPjz,最后调用函数writeDat(),把所求的结果输出到文件out.dat中。 注意:部分源程序已经给出。 请勿改动主函数main()、读函数ReadDat()和写函数writeDAq、()的内容。 [试题源程序] #include<stdio.h> #include<conio.h> #define MAXNUM 200 int xx[MASNUM]; int totNum=0; int totCnt=0; double totPjz=0.0: int ReadDat(void): void writeDat(void); void CalValue(void) void main() int i; system("cls"); for(i=0;i<MAXNUM;i++)xx[i]=0; if(ReadDat()) printf("数据文件IN.DAT不能打开!/007/n"); return; CalValue(); printf("文件IN.DAT中共有正整数=%d个/n",totNum); printf("符合条件的正整数的个数=%d个/n",totCnt); printf("平均值:%2f/n",totPjz); writeDat(); int ReadDat(void) FILE*fp; int i=0; if((fp=fopen("IN.DAT","r")==NULL)return 1; while(!feof(fp)) fscanf(fp,"%d,",&xx[i++]); fclose(fp); return 0; void writeDat(void) FILE*fp; fp=fopen("OUT.DAY","w"); fprintf(fp,"%d/n%d/n%6.2f/n",totNum,totCnt,totPjz); felose(fp);
问答题入数组a中,请编制一函数jsVal(),其功能是:如果一个4位数的千位数字大于等于百位数字,百位数字大于等于十位数字,以及十位数字大于等于个位数字,并且此4位数是奇数,则统计出满足此条件的数的个数ent并把这些4位数按从小到大的顺序存人数组b中,最后调用写函数writeDat()把结果cnt及数组b中符合条件的4位数输出到OUT21.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("IN21.DAT","r"); for(i=0;i<MAX;i++) fscanf(fp,"%d", fclose(fp); voidmain() int i; readDat(); jsVal(); printf("满足条件的数=% d/n",cnt); for(i=0;i<cnt;i++) printf("%d",b[i]); printf("/n"); writeDat(); void writeDat() FILE*fp; int i; fp=fopen("OUT21.DAT","w"); fprintf(fp,"% d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp,"% d/n",b[i]); fclose(fp);
问答题函数ReadDat()的功能是实现从文件ENG49.IN中读取一篇英文文章,存入到字符串数组xx中。请编制函数encryptChar(),按给定的替代关系对数组xx中所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS49.DAT中。 替代关系;f(p)=p*11 mod 256 (p是数组xx中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果原字符是大写字母或计算后f(p)的值小于等于32,则该字符不变,否则将f(p)所对应的字符进行替代。 注意:部分源程序已给出。 原始数据文件的存放格式是:每行的宽度均小于80个字符。 请勿改动主函数main()、读函数ReadDat()和写函数WtiteDat()的内容。 试题程序: #include<conio.h> #include<stdio.h> #include<string.h> #include<ctype.h> unsigned char xx[50] [80]; int maxline=0; int ReadDat(void); void writeDat(void); void encryChar() void main() clrscr(); if(ReadDat()) print f ( "数据文件ENG49.IN 不能打开! /n/007" ); return; encryChar(); WriteDat(); int ReadDat(void) FILE *fP; int i=0; unsigned char *p; if((fp=fopen("ENG49.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() FILE *fp; int i; fp=fopen("ps49.dat","w"); for(i=0;i<maxline;i++) printf("%s/n",xx[i]); fprintf(fp,"%s/n",xx[i]); fclose(fp);
问答题编写一个函数find Str(),该函数统计一个长度为2的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为"asd asasdfg asd as zx67 asd mklo",子字符串为“as”,函数返回值是6。 函数ReadWrite()的功能是实现从文件in40.dat中读取两个字符串,并调用函数findStr(),最后把结果输出到文件out40.dat中。 注意:部分源程序已给出。 请勿改动主函数main()和其他函数中的任何内容,仅在函数findStr()的花括号中填入你所编写的若干语句。 试题程序: #include<stdio.h> #include<string.h> #include<conio.h> int findStr(char *str,char *substr) main() char str[81],substr[3]; int n; clrscr(); printf ("输入原字符串:"); gets(str); printf("输入子字符串:"); gets(substr); puts(str); puts(substr); n=findstr(str,substr); printf("n=%d/n",n); ReadWrite(); ReadWrite() char ch,str[81],substr[3]; int n, len, i=0; FILE *rf,*wf; rf=fopen ("in40.dat","r"); wf=fopen ("out40.dar","w"); while (i<5) fgets(str,80,rf); fgets(substr,10,rf); len=strlen(substr)-1; ch=substr[len]; if(ch=='/n'||ch==0x1a) substr[len]=0; n=findStr(str, substr); fprintf(wf,"%d/n",n); i++; fclose(rf); fclose(wf);
问答题请编制程序,其功能是:内存中连续存放着20个十进制数字的ASCⅡ字符,把它们转换成10个字节的压缩型(组合型) BCD码。 例如: 内存中有:31H('1'),32H('2'),33H('3'),34H('4')…(共20个字节) 结果为: 21H,43H,…(共10个字节) 部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 请填空BEGIN和END之间已给出的源程序使其完整,空白处已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ连接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序存在错误之处,请加以修改。 【试题程序】 EXTRN LOAD:FAR, SAVE:FARN EQU 10STAC SEGMENT STACK DB 128 DUP (?)STAC ENDSDATA SEGMENTSOURCE DB N*2 DUP(?)RESULT DB N DUP(0)NAME0 DB 'INPUT1.DAT',0NAME1 DB 'OUTPUT1.DAT',0DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STACSTART PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA DX,SOURCE ; 数据区起始地址 LEA SI,NAME0 ; 原始数据文件名 MOV CX, N*2 ; 字节数 CALL LOAD ; 从"INPUT1.DAT"中读取数据; ******* BEGIN ******** LEA SI,SOURCE LEA DI,RESULT MOV CX,NNEXT: MOV (1) ,[SI] (2) AND AL, (3) MOV BL,AL (4) ADD SI,2 PUSH (5) MOV CL, (6) SAL AL,CL POP (7) ADD AL, (8) MOV (9) ,AL (10) LOOP NEXT; ******** END ******** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 CALL SAVE ; 保存结果到文件 RETSTART ENDPCODE ENDS END START
问答题已知数据文件IN23.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中。请编制函数jsVal(),其功能是:依次从数组a中取出一个4位数,如果4位数连续大于该4位数以前的5个数且该数是奇数,该数必须能被7整除,则统计出满足此条件的数的个数cnt,并把这些4位数按从大到小的顺序存入数组b中,最后调用写函数writeDat()把结果cnt及数组b中符合条件的4位数输出到OUT23.DAT文件中。 注意:部分源程序已给出。 程序中已定义数组:a[200],b[200],已定义变量:cnt。 请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。 试题程序: #include 〈stdio.h> #define MAX 200 int a[MAX], b[MAX], cnt = 0; void jsVal() void readDat ( ) int i; FILE *fp; fp = fopen("IN23.DAT","r"); for(i=0; i〈MAX; i++) fscanf(fp, "%d", fclose (fp); main ( ) int i; readDat ( ); jsVal ( ); printf("满足条件的数=%d/n", cnt); for(i=0; i〈cnt; i++) print f ( "%d", b[i]); print f ( "/n" ); writeDat (); writeDat () FILE *fp; int i; fp = fopen("OUT23.DAT", "w"); fprintf(fp, "%d/n", cnt); for(i=0; i〈cnt; i++) fprintf(fp, "%d/n", b[i] ); fclose (fp);
问答题请编制程序,其功能是:内存中存放着由20个16位有符号整数组成的序列,求出该序列中的最小值和最大值。结果存放形式为,先按原顺序存放20个需处理的有符号整数,后跟该序列中的最小值和最大值(最小值在前,最大值在后)。 例如: 内存中有:8100H,0002H,0300H… 结果为: 8100H,0002H,0300H… (由20个16位有符号整数组成的原序列),结果的后面跟该序列中的最小值和最大值(最小值在前,最大值在后)。 部分程序已给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入SOURCE开始的内存单元中,运算结果要求从 RESULT开始存放,由过程SAVE保存到文件OUTPUT.DAT中。 请填空BEGIN和END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGIN和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 【试题程序】 XTRN LOAD:FAR,SAVE:FARN EQU 20STAC EGMENT STACK B 128 DUP(?)STAC NDSDATA SEGMENTSOURCE DW N DUP(?)RESULT DW (N+2)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 MOV AX,DATA MOV DS,AX LEA DX,SOURCE ; 数据区起始地址 LEA SI,NAME0 ; 原始数据文件名 MOV CX,N*2 ; 字节数 CALL LOAD ; 从'INPUT.DAT'中读取数据; ******** BEGIN ******** LEA SI,SOURCE LEA DI,RESULT MOV BX, [SI] ; 第一个整数既为最大值 (1) ; 又为最小值 MOV [DI],BX ADD SI,2 ADD DI,2 (2) NEXT: MOV AX,[SI] CMP AX,BX JLE (3) MOV; BX,AX JMP ENDLMIN: CMP AX,DX (4) ENDL MOV DX, AXENDL: MOV [DI], AX ADD SI,2 ADD DI,2 LOOP NEXT (5) ADD DI,2 (6) ; ******** END ******** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 NOV CX,(2+N)*2 ; 结果字节数 CALL SAVE ; 保存结果到文件 RETSTART ENDPCODE ENDS END START
问答题请编制程序ex11.ASM,其功能是:统计20个学生成绩中得分在90~100、80~89、70~79、60~69和低于60分的人数,并计算20个学生的平均成绩(取整数),结果依次存放在指定的区域内。 例如: 内存中有5个分数:50H,40H,5EH,64H,48H 结果为:02H,01H,01H,01H,00H,52H(平均成绩) 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算的结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。补充BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序进行汇编,并与IO.OBJ链接产生执行文件,最终运行程序产生结果。调试中发现整个程序中存在错误之处,请加以修改。 [试题程序] EXTRN LOAD:FAR,SAVE:FAR N EQU 20 L EQU 5 DATA SEGMENT SOURCE DB N DUP(?) RESULT DB N+IDUP(0) NAME0 DB 'INPUT1.DAT',0 NAME1 DB 'OUTPUT1.DAT',0 DATA ENDS SSEG SEGMENT STACK DB 256DLIP(?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,SS:SSEG,DS:DATA START PROC FAR PUSH DS XOR AX,AX PUSH AX NOV 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 XOR BX,BX (1) MOV CX,N GOON:LODSB (2) ADD BX,AX (3) JAE A1 CMP AL,80 JAE A2 CMP AL,70 JAE A3 CMP AL,60 JAE A4 INC (4) (5) A4: INC BYTE PTR[DI+3] JMP NEXT A3: INC BYTE PTR[DI+2] JMP NEXT A2: INC BYTE PTR[DI+1] JMP NEXT A1: INC BYTE PTR[DI] NEXT:LOOP GOON MOV AX, (6) MOV DL, (7) DIV DL MOV [DI+5],AL ; **** END **** LEA DX,RESULT ;结果数据区首址 LEA SI,NAME1 ;结果文件名 MOV CX,L+1 ;结果字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START
问答题请编制程序PROG1.ASM,其功能是:以SOURCE开始的内存区域存放着多个字节的数据,其中有压缩BCD码和其他数据。现按下列编码规则进行编码:在每个压缩BCD码前面加两个字节前缀代码BEH和CCH,并在其后加两个字节后缀代码DDH和EDH;如果不是压缩BCD码,则该数据前后均加两个代码0DH和0EH。编码后的数据存放到RESULT指示的内存区域。 例如: 原信息为:12H,D9H,86H,54H,…… 结果为:BEH,CCH,12H,DDH,EDH,0DH,0EH,D9H,0DH,0EH,BEH,CCH,86H,DDH,EDH,BEH,CCH,86H,DDH,EDH,…… 部分程序已给出,其中原始数据由过程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(0) RESULT DB 5*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.DAT中读取数据 ;**** BEGIN **** LEA SI, SOURCE MOV DI,OFFSET RESULT MOV CX,N CLP1: MOV AL, [SI] MOV BL,AL MOV AH,AL (1) AND AL,0FOH (2) MOV CL,4 (3) POP CX CMP (4) JA CLP2 CMP AH,9 JA CLP2 MOV (5) INC DI MOV BYTE PTR[DI],0CCH INC DI MOV BYTE PTR[DI],BL INC DI MOV BYTE PTR[DI],0DDH INC DI MOV BYTE PTR[DI],0EDH JMP CLP3 CLP2: MOV BYTE PTR[DI],0DH INC DI MOV BYTE PTR[DI],0EH INC DI MOV BYTE PTR[DI],BL INC DI MOV BYTE PTR[DI],0DH INC DI MOV BYTE PTR[DI],0EH CLP3: INC SI INC DI (6) ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名起始地址 MOV CX,5*N ; 字节数 CALL SAVE ; 保存结果到OUTPUT1.DAT RET START ENDP CODE ENDS END START
问答题请编制程序ex12.ASM,其功能是:内存中连续存放着30个无符号字节数,求它们的和。和值形式按字存放,此前按顺序存放参加运算的30个字节。 例如: 内存中有01H,02H,03H,…… 结果为01H,02H,03H,……(30个参加运算的字节),后跟一个字(为前面各30个字节的和)。 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算的结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。补充BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序进行汇编,并与IO.OBJ链接产生执行文件,最终运行程序产生结果。调试中发现整个程序中存在错误之处,请加以修改。 [试题程序] EXTRN LOAD:FAR,SAVE:FAR N EQU 30 STAC SEGMENT STACK DB 128 DUP(?) STAC ENDS DATA SEGMENT SOURCE DB N DUP(?) RESULT DB N+2DUP(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,N MOV BX,0 NEXT: MOV AL,[SI] (1) (2) MOV [DI], (3) (4) (5) LOOP NEXT MOV [DI], (6) ; ****END**** LEA DX,RESULT ;结果数据区首址 LEA SI,NAMEI ;结果文件名 MOV CX,N+2 ;结果字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START
问答题请编制程序PROG1.ASM,其功能是:将一数据采集系统中采集的80个字节无符号数(已存于SOURCE开始的内存区域)按算术平均数字滤波方法进行数字滤波,每8个数求一个平均值(舍去余数)。将10个平均值依次写入RESULT指示的内存区域内。 例如: 原采集数据:1EH,31H,31H,33H,58H,75H,38H,34H,49H,A2H,98H,DFH,99H,64H,64H,B7H…… 结果为:3DH,CCH…… 部分程序已给出,其中原始数据由过程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 8*N DUP(0) RESULT DB N DUP(0) NAME0 DB 'INPUT1.DAT',0 NAME 1 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,8*N ; 字节数 CALL LOAD ; 从INPUT1.DAT中读取数据 ; **** BEGIN **** LEA SI,SOURCE MOV (1) MOV DX,N MAGN1: XOR AX,AX XOR BX,BX MOV CX, (2) MAGN2: MOV AL,[SI] ; 取数并求和放BX中 ADD BX, (3) INC SI (4) MOV AX,BX (5) (6) (7) (8) DEC DX (9) MAGN1 ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名起始地址 MOV CX,N ; 字节数 CALL SAVE ; 保存结果到OUTPUT1.DAT文件中 RET START ENDP CODE ENDS END START
问答题函数ReadDat()的功能是实现从文件IN73.DAT中读取一篇英文文章存入到字符串数组xx中。请编制函数CovertCharD(),该函数的功能是:以行为单位把字符串中的所有小写字母改成该字母的上一个字母,如果是字母a,则改成字母z。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数 WriteDat()把结果xx输出到文件OUT73.DAT中。 例如:原文Adb Bcdza abck LLhj 结果Aca Bbcyz, zabj LLgi 原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。 注意:部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数Wiltedat()的内容。 试题程序: #include<stdio. h> #include<string. h> #include<conio. h> char xx[50] [80]; int maxline=0; int ReadDat (void); void WriteDat (void); void CovertCharD ( ) void main ( ) clrscr ( ); if (ReadDat ( ) ) printf ( "数据文件IN73 .DAT 不能打开/n/007"); return; CovertCharD ( ); WriteDat (); int ReadDat () FILE *fp; int i=0; char *p; if ( ( fp= fopen ( "IN73. DAT", "r" ) ) = =NULL) return 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; clrscr ( ); fp=fopen("OUT73 .DAT", "w"); for (i=0; i<maxline; i++) printf ( "%s/n" ,xx [i] ); fprintf (fp, "%s/n" ,xx[i] ); fclose (fp);
问答题请编制程序,其功能是:内存中连续存放的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
