计算机类
公务员类
工程类
语言类
金融会计类
计算机类
医学类
研究生类
专业技术资格
职业技能资格
学历类
党建思政类
计算机等级考试(NCRE)
全国计算机应用水平考试(NIT)
计算机软件水平考试
计算机等级考试(NCRE)
全国高校计算机等级考试CCT
行业认证
信息素养
计算机等级考试三级
计算机等级考试一级
网络工程师(计算机等级考试四级)
计算机等级考试二级
数据库工程师(计算机等级考试四级)
计算机等级考试三级
信息安全工程师(计算机等级考试四级)
嵌入式系统开发工程师(计算机等级考试四级)
软件测试工程师(计算机等级考试四级)
问答题读函数ReadDat()实现从文件ENG28.IN中读取一篇英文文章,存入到字符串数组xx中。请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用写函数WriteDat()把结果xx输出到文件 PS28.DAT中。 替代关系:f(p)=p*11 mod 256(p是数组xx中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)的值小于等于32或f(p)对应的字符是小写字母,则该字符不变,否则将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() main ( ) clrscr(); if(ReadDat()) print f ("数据文件 ENG28.IN 不能打开 ! /n /007" ); return; encryptChar(); WriteDat(); int ReadDat (void) FILE *fp; int i = 0; unsigned char *p; if((fp = fopen("ENG28.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("PS28.DAT","w"); for (i = 0; i〈maxline; i++) printf("%s/n", xx[i]); fprintf(fp, "%s/n", xx[i]); fclose(fp);
进入题库练习
问答题请编制程序PROG1.ASM,其功能是:内存中连续存放着二个有符号字节序列Ak和Bk,求序列Ck(Ck=Ak+Bk)。例如: 源数Ak:01H,02H,02H,02H,04H,05H… 源数Bk:01H,02H,02H,02H,04H,05H… 结果Ck:02H,04H,04H,04H,08H,0AH… 部分程序已经给出,其中原始数据由过程LOAD从文件INPUTl.DAT中读入SOURCE开始的内存元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 请在BEGIN和END之间补充一段源程序,完成要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 PROG1.ASM文件内容如下: EXTRN LOAD: FAR, SAVE: FAR N EQU 10 ;每个序列的长度 STAC SEGMENT STACK DB 128 UP(?) STAC ENDS DATA SEGMENT SOURCE DB N * 2DUP(?) ;顺序存放AO, ..., A9 ,BO,.. ,B9 RESULT DW N DUP(0) ;顺序存放CO,...,C9 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*2 ;字节数 CALL LOAD ;从INPUT1.DAT文件中读取数据 ; * * * * BEGIN * * * * MOV DI,OFFSET RESULT ;结果从RESULT开始存放 MOV BX,0 MOV CX,N PRO: MOV AH ,0 MOV AL,_____ ;序列Bk中的一个字节 MOV DL, AL ; 暂存Bk _____ AL, SOURCE [BX] ; Ck = Bk + Ak JNO STAY ; 无溢出转STAY JUMP1: MOV AH ,00 ; 有溢出 ADD DL,O JNS JUMP ; Bk是正数(为一个正数加上 ; 一个正数,结果为负数的溢出 ; 情况)转JUMP(AH已为OOH) MOV AH,_____ ; Bk是负数(为一个负数加上 ; 一个负数,结果为正数的溢出 ; 情况)将结果变为有符号字的 ; 形式(为负) JMP _____ STAY: _____ ; AL中数的符号扩展到AH, ; 符号字节变成无符号字,有符 ; 号字节变成有符号字 JUMP: MOV [DI], AX ADD DI,2 INC BX DEC CX JNZ PRO ;* * * * END * * * * LEA DX, RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N * 2 ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
进入题库练习
问答题已知在文件IN11.DAT中存有若干个(个数 注意:部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数WfiteDat()的内容。 [试题程序] #include<stdio.h> #include<stdlib.h> #define MAXNUM 200 int xx[MAXNUM]; int totNum=0;/*文件IN11.DAT中共有多少个正整数*/ int totCnt=0;/*符合条件的正整数的个数*/ double totPjz=0.0;/*平均值*/ int ReadDat(void); void WriteDat(void); void CalValue(void) voidmain() int i; system("CLS"); for(i=0;i<MAXNUM;i++) xx[i]=0; if(ReadDat()) printf("数据文件IN11.DAT不能打开!/007/n"); return; CalValue(); printf("文件IN11.DAT中共有正整数=%d个/n",totNum); printf("符合条件的正整数的个数=%d个/n",totCnt); printf("平均值=% .21f/n",totpjz); WriteDat(); int ReadDat(void) FILE*fp; int i=0; if((fp=fopen("IN11.DAT","r"))==NULL) return 1; while(! feof(fp)) fscanf(fp,"% d,", fclose(fp); return 0; void WriteDat(void) FILE*fp: fp=fopen("OUT11.DAT","w"); fprintf(fP,"% d/n% d/n% .21f/n",totNum,totCnt,totPjz); fclose(fP);
进入题库练习
问答题已知数据文件IN39.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出这些4位数是素数的个数ent,再把所有满足此条件的4位数依次存人数组b中,然后对数组b中的4位数按从小到大的顺序进行排序,最后调用函数writeDat()把数组b中的数输出到OUT39.DAT文件中。 例如:5591是素数,则该数满足条件,存人数组b中,且个数cnt=cnt+1。9812是非素数,则该数不满足条件,忽略。 注意:部分源程序已给出。 程序中已定义数组:a[300],b[300],已定义变量:cnt。 请勿改动主函数main()、读函数readDat()和写函数wfiteDat()的内容。 [试题程序] #include<stdio.h> int a[300],b[300],cnt=0; void readDat(); void writeDat(); int isP(int m) int i; for(i=2;i<m;i++) if(m%i==0)return 0; return i; void jsValue() void main() int i; readDat(); jsValue(); writeDat(); printf("cnt=%d/n",cnt); for(i=0;i<cnt;i++) printf("b[%d]=%d/n",i,b[i]); void readDat() FILE*fp; int i; fp=fopen("IN39.DAT","r"); for(i=0;i<300;i++) fscanf(fp,"%d,", fclose(fp); void writeDat() FILE*fp; int i; fp=fopen("OUT39.DAT","w"); fprintf(fp,"%d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp,"%d/n",b[i]); fclose(fp);
进入题库练习
问答题编制一个程序,使其实现如下功能:将内存中连续存放的10个十六位二进制无符号数按照从小到大的顺序排列。 例如: 内存中有:3456H,2345H,5643H,…(假设后面的7个数都大于5643H) 结果为: 2345H,3456H,5643H,…(后面跟7个字,按照从小到大的顺序排列)。 部分程序已经给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入以SOURCE开始的内存单元中。运算结果要求从RESULT开始的内存单元存放,由过程SAVE保存到文件OUTPUTDAT中。 请填空BEGIN和END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令亦可,考生也可以删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 [试题程序] EXTRN LOAD:FAR,SAVE:FAR N EOU 10 SSEG SEGMENT STACK DB 256 DUP (?) SSEG ENDS DSEG SEGMENT SOURCE DW N DUP (?) RESULT DW 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*2 CALL LOAD ; ******** BEGIN ******** MOV SI,OFFSET SOURCE MOV DI, (1) MOV CX,N AGAIN0: MOV AX,[SI] MOV [DI],AX ADD SI,2 ADD DI,2 LOOP AGAIN0 CLD MOV BX,N-1 AGAIN1: MOV SI,OFFSET RESULT MOV CX,BX AGAIN2: LODSW CMP [SI], (2) JAE NEXT (3) MOV [SI-2],AX NEXT: LOOP (4) DEC BX JNZ (5) ; ******** END ******** LEA DX,RESULT LEA SI,NAME1 MOV CX,N*2 CALL SAVE RET START ENDP CSEG ENDS END START
进入题库练习
问答题下列程序的功能是:选出1000至5000范围内(包括1000、5000)符合条件的自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的10倍。计算并输出这些4位自然数的个数cnt及这些数的和sum。请编写函数countValue()实现程序的要求,最后调用函数writeDAT()把结果cnt和sum输出到文件OUT18.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()和写函数writeDAT()的内容。 [试题程序] #include<stdio.h> int cnt,sum; void writeDat(); void countValue() void main() cnt=sum=0; countValue(); printf("满足条件的自然数的个数=% d/n",cnt); printf("满足条件的自然数的值的和=%d/n",sum); writeDAT(); void writeDAT() FILE*fp; fp=fopen("OUT18.DAT","W") fprintf(fp,"% d/n% d/n",cnt,sum); fclose(fp);
进入题库练习
问答题已知数据文件IN38.DAT中存有200个4位数,并已调用读函数readDat()把这些数存人数组a中。请编制函数jsVal(),其功能是:依次从数组a中取出一个4位数,如果4位数连续大于该4位数以前的5个数且该数是奇数(该4位数以前不满5个数,则不统计),该数必须能被7整除,则统计出满足此条件的数的个数cnt,并把这些4位数按从大到小的顺序存人数组b中,最后调用写函数wfiteDat()把结果cnt及数组b中符合条件的4位数输出到OUT38.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("IN38.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("OUT38.DAT","W"); fprintf(fp,"%d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp,"%d/n",b[i]); fclose(fp);
进入题库练习
问答题请编制程序PROG1.ASM,其功能是:对内存中连续存放着20个补码表示的无符号整数进行从大到小的排序,结果存放在RESULT开始的内存单元中。 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。请在BEGIN和END之间补充一段源程序,完成要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。 试题程序: 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 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,NAMEO ; 原始数据文件名 MOV CX.N ; 字节数 CALL LOAD ; 从'INPUT1.DAT'中读取数据 ;****BEGIN**** …… …… …… ;****END**** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CSEG ENDS END START
进入题库练习
问答题请编制程序PROG1.ASM,其功能是:将连续20个字节的ASCII码(30~39之间)顺序转换成10个压缩BCD码。 例如:原始数据 31H,33H,35H,38H……(后面依次有16个ASCII码) 转换后为 13H,58H,……(后面依次有8个压缩BCD码) 部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果(要求从RESULT开始存入)由SAVE过程保存到OUTPUT. DAT中。请在BEGIN和END之间补充一段源程序,完成要求的功能。 原有数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,结果要求从RESULT开始存放,由SAVE保存到OUTPUT1.DAT文件 对程序必须进行汇编,并与IO.OBJ连接产生PROG1.EXE执行文件,最终产生运行结果(无结果或结果不正确均不得分)。 部分程序如下: EXTRN LOAD:FAR,SAVE:FAR N EQU 20 STAC SEGMENT STACK DB 128 DUP(?) STAC ENDS DATA SEGMENT SOURCE DB 31H,32H,33H,34H,35H,36H,37H,38H 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,RESULT ; 结果数据区首地址 LEA SI, NAME1 ; 结果文件名 MOV CX,N ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START 相关知识: ●BCD码和压缩BCD码 BCD码就是以二进制数表示十进制数,以4位二进制数表示1位十进制数,0000~1001表示0~9,1010~1111六个状态无意义。非压缩BCD码以一个字节表示一位BCD码,压缩BCD码一个字节表示两位BCD码。 ●ASCII码与压缩BCD码之间的转换 0~9的ASCH码为30H~39H,从数字的ASCII码求数字本身,只要用他的ASCII码减去30H即可。由两位非压缩BCD码构成一个字节的压缩BCD码可将高位的BCD码移到高四位,然后与低位的BCD码进行逻辑或(OR)操作即可完成。 编程思路: 第一步:分析本程序要求完成的功能。 本程序要求完成以下功能: (1)从数据文件INPUT1.DAT中读取20个字节的ASCII码存放在SOURCE开始的内存单元中。 (2)将SOURCE开始的20个ASCII码求出其对应的数值,然后转换成压缩的BCD码,依次放在RESULT开始的内存单元中。 (3)将处理之后的字符串存入到OUTPUT1.DAT。 第二步:用相应汇编程序来实现其功能。 (1)数据的读取和存入题目中已经给出,只要完成20个ASCII码到压缩BCD的转换即可。 (2)由ASCII码到压缩BCD码的转换过程如下: 由于20位ASCII码正好转换成10个字节压缩BCD码,不存在某个字节的BCD码只有一位。因此依次从SOURCE开始的内存单元取两个ASCII码,前一个转换成压缩BCD码的高位,后一个转换成压缩BCD码的低位来构成压缩BCD码;每两个ASCII码转换成一个字节的压缩BCD码,直至转换完毕。
进入题库练习
问答题已知数据文件INl9.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsVal(),其功能是:把一个4位数的千位数字减百位数字再减十位数字最后减个位数字,如果得出的值大于等于零且此4位数是奇数,则统计出满足此条件的数的个数cnt并把这些4位数存入数组b中,然后对数组b中的4位数按从小到大的顺序进行排序,最后调用函数wnteDat()把结果cnt及数组b中符合条件的4位数输出到out19.dat文件中。 注意:部分源程序已给出。 程序中已定义数组:a[200],b[200],已定义变量:cnt。 请勿改动主函数main()、读函数readDat()和写函数wfiteDat()的内容。 [试题程序] #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("IN19.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(); void writeDat() FILE*fp; int i; fp=fopen("out19.dat","W"); fprintf(fp,"%d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp,"%d/n",b[i]); fclose(fp);
进入题库练习
问答题已知在文件IN49.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中,金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入数组sell中。请编制函数SortDat(),其功能要求:按金额从小到大进行排列,若金额相同,则按产品代码从小到大进行排列,排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT49.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("IN49.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("OUT49.DAT","w"): for(i:0;i<100;i++) fprintf(fp,"%s %s %4d %5d%10ld/n",sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); fclose(fp);
进入题库练习
问答题已知数据文件in.dat中存有200个4位数,并已调用读函数ReadDat()把这些数存入数组a中,请考生编制一函数jsval(),其功能是:如果4位数各位上的数均是奇数,则统计出满足此条件的个数cnt并把这些4位数按从大到小的顺序存入数组b中。最后main()函数训用写函数writeDat()把结果cnt及数组b中符合条件的4位数输出到out.dat文件中。 注意:部分源程序已经给出。 程序中已定义数组a[200],b[200],已定义变量:cnt。 请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。 [试题源程序] #include<stdio.h> #define MAX 200 int a[MAX],KMAX],cnt=0; void writeDat(); void JsVal() void teadDat() int i; FILE*fp; fp=fopen("in.dat","r"): for(i=0;i<MAX;i++)fscanf(fp,"%cr,&a[i]); 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(); void writeDat() FILE*fp; int i; fp=fopen("out.dat","w"): fprintf(fp,"%d/n",cnt); for(i=0;i<cnt;i++)fprintf(fp,"%d/n",b[i]); fclose(fp);
进入题库练习
问答题已知在文件in96.dat中存有若干个(个数<200)4位数字的正整数,函数ReadDat()读取这若干个正整数并存入数组xx中。请编制函数CalValue(),其功能要求是:(1)求出这个文件中共有多少个正整数totNum;(2)求这些数右移一位后,产生的新数是奇数的数的个数totCnt,以及满足此条件的这些数(右移前的值)的算术平均值totPjz。最后调用函数WriteDat()把所有结果输出到文件out96.dat中。 注意:部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 试题程序: #include <stdio.h> #include <stdlib.h> #define MAXNUM 200 int xx[MAXNUM]; 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("数据文件IN96.DAT不能打开! /007/n"); return; CalValue(); printf("文件IN96.DAT中共有正整数=% d个/n",totNum); printf("符合条件的正整数的个数=% d个/n",totCnt); printf("平均值=% .21f/n",totPjz); WriteDat(); int ReadDat(void) FILE * fp; int i=0; if((fp=fopen("IN96.DAT","r"))==NULL) return 1; while(! feof(fp)) fscanf(fp,"% d",&xx[i + +]); fclose(fp); return 0; void WriteDat(void) FILE * fp; fp=fopen("OUT96.DAT","w"); fprintf(fp,"% d/n% d/n% .21f/n" .totNum,totCnt,totPjz); fclose(fp);
进入题库练习
问答题请编制程序,将内存中连续存放着的10个无符号16位二进制数,采用近似计算法求此10个数的近似平方根。方法为:令某个数X依次减去1,3,5,7,9……等奇数,一直减到差值刚刚小于等于0为止。计算出所做的减法的次数Y,即为该数的近似平方根。把得到结果并依次存放到内存当中。 例如:内存中:0010H,0100H,0200H…… 近似方根:0004H,0010H,0016H…… 部分程序已经在PROG1中给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入,存放在SOURCE开始的内存单元中,转换结果存放在RESULT开始的内存单元中,并由过程SAVE保存到文件OUTPUT1.DAT文件中。 对BEGIN和END之间已经给出的源程序填空,使其完整,填空处已经用横线标出,每个空白一般只需填一条指令或指令的一部分;考生也可填入功能相当的多条指令,或删去 BEGIN和END之间原有的代码自行编制程序完成相应的要求。 对程序必须进行汇编并与IO.OBJ连接产生可执行文件,最终运行程序产生结果(无结果和结果不正确均不得分)。 部分源程序如下: EXTRN LOAD:FAR,SAVE:FAR N EQU 10 STACK SEGMENT DB 128 DUP(?) STACK 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 : STACK START PROC FAR PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS; AX LEA DX, SOURCE LEA SI, NAMFO MOV CX, N * 2 CALL LOAD **********BEGIN************** LEA DI, RESULT LEA SI, SOURCE MOV CX, N LOOP0: MOV AX, [SI] MOV BX, 0 LOOP1: (1) SUB AX, BX (2) , STORE0 (3) IMP LOOP1 STOREO: INC BX (4) MOV [DI], BX INC DI (5) INC SI (6) , LOOP LOOP0 ***************END************* LEA DX, RESULT LEA SI, NAME1 MOV CX, N * 2 CALL SAVE RET START ENDP CODE ENDS END START 相关知识: ●循环程序设计 利用重复控制指令可以实现重复操作,能简化程序、节约存储空间。循环程序分为三部分:初始化部分为循环做准备;循环控制部分判断循环条件是否满足,是否继续循环操作;循环体部分完成要循环操作的具体工作。对于复杂问题,单重循环程序往往不能满足要求,循环中常常还需要有其他循环程序。值得注意的是内层循环和外层循环之间应有各自的控制条件,当从外层循环进入到内层循环时,内层循环的初始条件应该重新设置。 (1)无条件循环指令 格式:LOOP DST 该指令的功能是,程序执行到此处,CX的内容减1,若CX的内容不为0,则转到目标地址处继续执行指令,否则执行该指令的下一条指令。 (2)条件循环指令 (I)格式:LOOPZ/LOOPE DST 该指令执行后,如果零标志位为1,且CX内容减1后不等于0,则转移到目标地址处继续执行指令,否则执行循环指令后的一条指令,即零标志位为0或CX内容为0时退出循环。 (ii)格式:LOOPNZ/LOOPNE DST 该指令执行时,CX内容减1,然后根据零标志位和CX内容决定是否循环。若零标志位为1,或CX内容为0时退出循环,否则零标志位等0且CX内容不等于0,则转移到转移指令的目标地址处继续执行。 编程思路: 第一步:分析程序要求的功能。 本程序需要完成以下功能: (1)从数据文件INPUT1.DAT中读取10个16位无符号整数存放在SOURCE开始的内存单元中。 (2)将SOURCE开始的10个字单元中的无符号整数,利用减奇数的方法求近似方根,并将结果存放在RESULT开始的内存单元中。 (3)将方根结果存放在OUTPUT1.DAT中。 第二步:用相应的汇编程序来实现其功能。 (1)数据的读取和存入文件的实现,题目中已经给出。 (2)对于一个数的方根近似求解,题目中叙述了具体的实现方法,VCB依次减1,3,5……直至差小于等于0,求差次数即为方根。 通过阅读题目中的汇编源代码,我们可以看出,将内存中的数读入AX,然后循环减 BX中的内容。这样我们可判断出减数1,3,5……是存放在BX中的,BX的初始值为1,每执行完一次减操作,BX的内容就应该加2。我们始终没有发现哪一个寄存器是用来计数进行减操作次数的,可实际上BX的内容与减操作的次数是有关的,减操作的次数为((BX)+1)/2。观察出这些特征后,我们就可容易填出空格处的答案了。
进入题库练习
问答题已知文件IN41.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品名称从大到小进行排列,若产品名称相同,则按金额从大到小进行排列,最终排列结果仍存人结构数组sell中,最后调用函数WfiteDat()把结果输出到文件OUT41.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[ii]; int i; fp=fopen("IN41.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("OUT41.DAT","w"); for(i=0;i<i00;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);
进入题库练习
问答题请编制程序,其功能是:内存中连续存放着两个无符号字节数序列Ak和Bk (k=0,1,…,9),求序列Ck,Ck=Ak÷Bk (运算结果按序以字的形式连续存放,其中低字节为商,高字节为余数)。 例如: 序列Ak为:01H,7FH, 80H,FFH… 序列Bk为:PFH,80H,7FH,01H… 结果Ck为:0100H(00H为商、01H为余数),7F00H,0101H,00FFH… 部分程序已给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入SOURCE开始的内存单元中,运算结果要求从 RESULT开始存放,由过程SAVE保存到文件OUTPUT.DAT中。 请填空BEGIN和END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGm和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 [试题程序] EXTRN LOAD:FAR,SAVE:FAR N EQU 10 STAC SEGMENT STACK DB 128 DUP(?) STAC ENDS DATA SEGMENT SOURCE DB N*2 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,SOURCE ;数据区起始地址 LEA SI,NAME0 ;原始数据文件名 MOV CX,N*2 ;字节数 CALL LOAD ;从 'INPUT.DAT' 中读取数据 ; ******** BEGIN ******** MOV DI,OFFSET RESULT MOV BX,0 (1) PRO: MOV (2) (3) ,SOURCE[BX] CBW DIV (4) MOV [DI], (5) ADD DI,2 (6) DEC CX (7) PRO ; ******** END ******** LEA DX,RESULT ;结果数据区首址 LEA SI,NAME1 ;结果文件名 MOV CX,2*N ;结果字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START
进入题库练习
问答题已知数据文件IN30.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsVal(),其功能是:把个位数字和千位数字重新组合成一个新的2位数ab(新2位数的十位数字是原4位数的个位数字,新2位数的个位数字是原4位数的千位数字),以及把百位数字和十位数字组成另一个新的2位数cd(新2位数的十位数字是原4位数的百位数字,新2位数的个位数字是原4位数的十位数字),如果新组成的两个2位数必须是一个奇数,另一个为偶数且两个2位数中至少有一个数能被17整除,同时两个新2位数的十位数字均不为0,则将满足此条件的4位数按从大到小的顺序存人数组b中,并要计算满足上述条件的4位数的个数cnt,最后调用写函数wfiteDat()把结果cnt及数组b中符合条件的4位数输出到OUT30.DAT文件中。 注意:部分源程序已给出。 程序中已定义数组:a[200],b[200],已定义变量:cnt。 请勿改动主函数main()、读函数readDat()和写函数wrheDat()的内容。 [试题程序] #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("IN30.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("OUT30.DAT","W"); fprintf(fp,"%d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp,"%d/n",b[i]); fclose(fp);
进入题库练习
问答题函数ReadDat()的功能是实现从文件IN64.DAT中读取一篇英文文章并存入到字符串数组XX中。请编制函数CharConvA(),该函数的功能是:以行为单位把字符串的最后一个字符的ASCⅡ值右移4位后加最后第二个字符的ASCⅡ值,得到最后一个新的字符,最后第二个字符的ASCⅡ值右移4位后加最后第三个字符的ASCⅡ值,得到最后第二个新的字符,以此类推一直处理到第二个字符,第一个字符的ASCII值加最后一个字符的ASCII值,得到第一个新的字符,得到的新字符分别存放在原字符串对应的位置上,把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件OUT64.DAT中。 注意:部分源程序已给出。 原始文件存放的格式是:每行的宽度小于80个字符,含标点符号和空格。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 [试题程序] #include<stdio.h> #include<string.h> #include<stdlib.h> char XX[50][80]; int maxline=0; int ReadDat(); void WriteDat(); void CharConvA(void) voidmain() system("CLS"); if(ReadDat()) printf("数据文件IN64.DAT不能打开!/n/007"); return; CharConvA(); WriteDat(); int ReadDat(void) FILE*fp; int i=0; char*p; if((fP=fopen("IN64.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; system("CLS"); fp=fopen("OUT64.DAT","w"); for(i=0;i<maxline;i++) printf("%s/n",xx[i]); fprintf(fp,"%s/n",xx[i]); fclose(fp);
进入题库练习
问答题请编制程序,其功能为:从SOURCE开始的内存区域存放着N个字节的有符号数。现找出最大的数,结果存放到RESULT 指示的,其后存放原N个数逻辑取反后的值。 例如: 数据为:09H,7EH,89H,F6H,17H……67H(N个数据) 结果为:7EH (最大数),F6H,81H,76H,0CH,E8H……98H(原N个数的逻辑反) 部分程序已经给出,其中原始数据由LOAD过程从文件INPUT1.DAT 中读入从SOURCE开始的内存单元,运算结果要求从RESIULT开始存放,由SAVE 过程保存到OUTPUT1.DAT 文件中。请在BEGIN和END 之间补充使其完整,完成要求的功能。或删除BEGIN和END 之间原有的代码井自行编程来完成要求的功能。 对程序必须进行汇编,并与IO. OBJ 链接产生PROG1. EXE 执行文件,最终产生运行结果。 部分程序如下; ;PROG1. ASM EXTRN LOAD: FAR,SAVE:FAR N EQU 30 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 *** ______ SI,SOURCE MOV BX,OFFSET SOURCE LEA DI,RESULT L1: MOV CX,N MOV DX,CX DEC DX MOV AL,______ L2: INC BX ______ AL,[BX] ______________ MOV AL,[BX] L3: DEC DX JNZ______ MOV [DI],AL INC DI CLD MAX: LODSB NOT AL ______________ LOOP MAX ; *** END *** LEA DX,RESULT LEA SI,NAME1 MOV CX,N CALL SAVE RET START ENDP CSEG ENDS END START
进入题库练习
问答题请编制程序,其功能是:在递增的有序字节数组中插入一个正整数,并按指定的数组个数存入内存区中。假设数组元素均为正数。例如,将02H插入下面的数组中:01H,03H,04H,05H…结果为01H,02H,03H,04H,05H…部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,转换结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。请填空BEGIN和END之间已经给出的一段源程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),考生也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:
进入题库练习