问答题已知在文件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);
问答题根据16位逻辑变量L的内容对内存单元中连续存放的十六个字符的数组SOURCE作如下处理: (1)若L的第i位为1,将SOURCE[i]的最高位置加偶校验位 (2)若L的第i位为0,SOURCE[i]不变 例如:L=0005 转换之前:67H,61H,4EH,38H…… 转换之后:E7H,61H,4EH,38H…… 部分程序已经在PROG1.ASM中给出,请填空BEGIN到END之间已经给出的源程序,使其完整(空白已经用横线标出,每行空白一般只需要一条指令,但功能相当的多条指令亦可)或删除BEGIN与END之间的原有代码并自行编写程序片段完成所需的功能。 原有数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,结果要求从RESULT开始存放,由SAVE保存到OUTPUT1.DAT文件。 对程序必须进行汇编,并与IO.OBJ连接产生PROG1.EXE执行文件,最终产生运行结果(无结果或结果不正确均不得分)。 部分源程序如下: EXTRN LOAD:FAR,SAVE:FAR N EQU 16 STAC SEGMENT STACK DB 128 DUP (?) STAC ENDS DATA SEGMENT L DW ? 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 LEA DX,L ; 数据区起始地址 LEA SI, NAME0 ; 原始数据文件名 MOV CX,2 + N ; 字节数 CALL LOAD ; 从"INPUT1.DAT"中读取数据 **** BEGIN **** LEA SI, SOURCE LEA DI, RESULT MOV CX,N MOV DX, (1) LO: MOV AL, [SI] (2) L,DX JZ STORE AND AL,AL (3) STORE (4) STORE: MOV [DI],AL INC SI INC DI (5) LOOP LO ***** END ***** LEA DX,RESULT ; 结果数据区首地址 LEA SI, NAME1 ; 结果文件名 MOV CX,N ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START 相关知识: ●测试指令 指令格式:TEST R,R或TEST R,M或TEST M,R或TEST R,I或TEST M,R(其中R为寄存器,M为内存变量,I为立即数)。 测试指令将两个操作数进行逻辑乘操作,但并不把结果写回目的操作数,我们若需要知道某个寄存器中第i位是否为1,可以与一个立即数(这个立即数的第i位为1,其他位为0)进行TEST运算,结果为0,则被测试位为0,否则被测试位为1。 ●测试寄存器中1的个数的奇偶性。 可以将这个寄存器进行不改变其内容的逻辑乘运算,然后查看一下奇偶标志位即可。 ●对寄存器的内容进行位操作 利用“AND”、“OR”运算可对寄存器或某个内存单元中相应的清0或置1。 编程思路: 第一步:分析本程序要求完成的功能。 本程序要求完成以下功能: (1)从数据文件INPUT1.DAT中读取16个字符存放在SOURCE开始的内存单元中。 (2)将SOURCE开始的16个字符按逻辑尺L的内容决定是否在字符的最高位置1,然后依次放在RESULT开始的内存单元中。 (1)将处理之后的字符串存入到OUTPUT1.DAT。 第二步:用相应程序汇编实现其功能。 (1)数据的读取和存入题目中已经给出,只要完成16个字符的最高位置1操作即可。 (2)对于一个数组的排序操作可按下面的方法进行。从0到15依次取得逻辑尺L的第i位的值,若为0,则不对SOURCE[i]作操作;否则,计算SOURCE[i]中1的个数,若为奇数则在SOURCE[i]的最高位置1,否则不作操作,然后将其存放在RESULT开始的内存单元中。 这里我们仍然采用填空,而不重新编写程序,采用填空的方式解题对于我们阅读程序的能力会有所帮助。通过阅读程序我们发现程序是采用循环的方式测试一个数的第i位是否为1(要么将被测试数进行移位操作,然后与1进行TEST运算,要么将1进行移位操作,与被测试数进行TEST运算均可获得结果),然后根据第i位是否为1加偶校验位。
问答题己知数据文件IN57.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数不清jsValue(),其功能是:求出个位数上的数减千位数上数减百位数上的数减十位数上的数大于零的个数cnt,再把所有满足此条件的4位数依次存入数组b中,然后对数组b的4位数按从大到小的顺序进行排序,最后调用函数writeDat()把数组b中的数输出到OUT57.DAT文件中。 例如:1239,9-1-2-3>0,则该数满足条件,存入数组b中,且个数cnt=cnt+1。 8129,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(); printf("cnt=%d/n",cnt); for(i=0;i<cnt;i++) printf("b[%d]=%d/n",i,b[i]); readDat ( ) FILE *fp; int i; fp=fopen("IN57.DAT","r"); for(i=0;i<300;i++) fscanf(fp,"%d,", fclose(fp); writeDat() FILE *fp; int i; fp=fopen("OUT57.DAT","w"); fprintf(fp,"%d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp, "%d/n",b[i]); fclose(fp);
问答题函数ReadDat()的功能是实现从文件ENG51.IN中读取一篇英文文章,并存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组XX中的所有字符进行替代,结果仍存人数组xx的对应的位置上,最后调用函数WriteDat()把结果XX输出到文件PS51.DAT中。 替代关系:f(P)=P*11 mod 256(P是数组xx中某一个字符的ASCⅡ值,f(P)是计算后新字符的ASCⅡ值),如果计算后f(P)的值小于等于32或f(P)对应的字符是数字0至9,则该字符不变,否则将f(P)所对应的字符进行替代。 注意:部分源程序已给出。 原始数据文件存放的格式是:每行的宽度均小于80个字符。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 [试题程序] #include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> unsigned char xx[50][80]; int maxline=0;/*文章的总行数*/ int ReadDat(void); void WriteDat(void); void encryptchar() voidmain() system("CLS"); if(ReadDat()) printf("数据文件ENG51.IN不能打开!/n/007"); return; encryptchar(); WriteDat(); int ReadDat(void) FILE*fp; int i=0; unsigned char * p; if((fp=fopen("ENG51.IN","r"))==NULL) return 1; while(fgets(xx[i],80,fp)!=NULL) P=strchr(XX[i],'in'); if(P)*P=0; i++; maxline=i; fclose(fp); return 0; void WriteDat(void) FILE*fp; int i; fp=fopen("PS51.DAT","W"); for(i=0;i<maxline;i++) printf("%s/n",xx[i]); fprintf(fp,"%s/n",xx[i]); fclose(fp);
问答题请编制程序,其功能是:内存中连续存放的20个8位无符号数是一个自动抄表仪抄录的 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从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件 OUTPUT1.DAT中。 填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处,请加以修改。 试题程序: EXTRN LOAD:FAR, SAVE:FAR N EQU 20 RATE1 EQU 70 RATE2 EQU 120 DELTA EQU 10 STAC SEGMENT STACK DB 128 DUP(?) STAC ENDS DATA SEGMENT SOURCE DB N DUP(?) RESULT DW N DUP(0) NAME0 DB 'INPUT 1.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 CLD MOV CX,N MOV BL,RATE1 MOV BH,RATE2 AGAIN: (1) CMP AL,DELTA J (2) GREAT MUL BL JMP NEXT GREAT: (3) MUL BH (4) NEXT: (5) (6) INC SI LOOP AGAIN ;****END**** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N*2 ; 字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
问答题请编制程序,其功能是:内存中连续存放着20个十进制数的ASCII字符,把它们转换成压缩型(组保型)BCD码。 例如: 内存中有:31H('1'),32H('2'),33H('3'),34H('4')...(共20个字节) 结果为:21H,43H,...(共十个字节) 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 请填空BEGIN和END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGIN和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 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*2 ;字节数 CALL LOAD ;从'INPUT1.DAT'中读取数据 ; ******BEGIN****** LEA SI,SOURCE LEA DI,RESULT MOV CX,N CLD NEXT: LODS ______ AND AL,______ MOV BL,AL LODS ______ PUSH ______ MOV CL,______ SAL AL,CL POP ______ ADD AL,______ MOV [DI],AL INC DI LOOP NEXT ; ******END****** LEA DX,RESULT ;结果数据区首址 LEA SI,NAME1 ;结果文件名 MOV CX,N ;结果字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START
问答题已知数据文件IN37.DAT中存有200个4位数,并已调用读函数readDat()把这些数存人数组a中,请编制一函数jsVal(),其功能是:依次从数组a中取出一个4位数,如果该4位数连续大于该4位数以前的5个数且该数是偶数(该4位数以前不满5个数,则不统计),则统计出满足此条件的数个数cnt,并把这些4位数按从大到小的顺序存人数组b中,最后调用写函数writeDat()把结果cnt及数组b中符合条件的4位数输出到文件OUT37.DAT中。 注意:部分源程序已给出。 程序中已定义数组:a[200],b[200],已定义变量:cnt。 请勿改动主函数main()、读函数readDat()和写函数wnteDat()的内容。 [试题程序] #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("in37.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("out37.dat","w"); fprintf(fp,"%d/n",cnt); for(i=0;i<cnt;i++) fprintf(fP,"%d/n",b[i]); fclose(fp);
问答题已知数据文件IN89.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中。请编制一函数jsVal(),其功能是,如果一个4位数的千位数字上的值加个位数字上的值恰好等于百位数字上的值加上十位数字上的值,并且此4位数是奇数,则统计出满足此条件的数的个数cnt并把这些4位数按从小到大的顺序存入数组b中,最后调用写函数writeDat()把结果cnt以及数组b中符合条件的4位数输出到OUT89.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("IN89.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++) printf("%d",b[i]); printf("/n"); writeDat(); writeDat() FILE *fp; int i; fp=fopen("OUT89.DAT","w"); fprintf(fp,"%d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp, "%d/n",b[i]); fclose(fp);
问答题请编制程序,其功能为:设由20个8位有符号数构成一个数组,试依次去掉其中负的奇数,生成一个新的数组(顺序不变)。结果存放在RESULT开始的内存单元中。 部分程序已经给出,其中原始数据由LOAD过程从文件INPUT1.DAT中读入从SOURCE开始的内存单元,运算结果要求从RESULT开始存放,由SAVE过程保存到OUTPUT1.DAT文件中。请在BEGIN和END之间补充使其完整。 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终产生运行结果。 部分程序如下: ; PROG1.ASM EXTRN LOAD:FAR,SAVE:FAR LEN 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 MOV ES, AX LEA DX, SOURCE LEA SI,NAME0 MOV CX,N CALL LOAD ; *** BEGIN *** ………… ………… ………… ; *** END *** LEA DX, RESULT LEA SI,NAME1 MOV CX,N CALL SAVE RET START ENDP CSEG ENDS END START
