问答题函数ReadDat()的功能是实现从文件IN74.DAT中读取一篇英文文章存入到字符串数组xx中。请编制函数StrCharJL(),该函数的功能是:以行为单位把字符串中的所有字符的ASCⅡ值左移4位,如果左移后,其字符的ASCⅡ值小于等于32或大于100,则原字符保持不变,否则就把左移后的字符ASCⅡ值再加上原字符的ASCⅡ值,得到的新字符仍存入到原字符串对应的位置。最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数Wiltedat()把结果xx输出到文件OUT74.DAT中。 注意:部分源程序已给出。 原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。 请勿改动主函数main()、读函数ReadDat()和写函数Wiltedat()的内容。 试题程序:#include<stdio. h># inc lude<st ring. h>#include<conio. h>char xx[50] [80];int maxline=0;int ReadDat (void);void WriteDat (void);void StrCharJL (void)void main ( ) clrscr ( ); if (ReadDat ()) printf ( "数据文件IN74.DAT 不能打开/n/007"); return; StrCharJL ( ); WriteDat ( );int ReadDat (void) FILE *fp; int i=0; char *p; if ( (fp=fopen( "IN74.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 (void FILE *fp; int i; clrscr ( ); fp=fopen ( "OUT74.DAT", "w" ); for (i=0; i<maxline; i++) printf ("%s/n" ,xx[i] ); fprintf (fp, "%s/n" ,xx[i] ); fclose (fp);
问答题请编制程序PROG1.ASM,其功能是;从SOURCE开始存放的21个8位有符号数(补码),相邻数的差距不超过-8~7,可采用差分压缩,其方法如下:第一个数据不变,其后数据取与前一数据之差值并用4位二进制补码表示,两个差值拼成一个字节,前一个差值放在高4位,后一个差值放在低4位。 例如: 原数据为:X[n]: 23H, 27H, 2AH, 29H, 22H... 压缩后为:Y[n]:23H, 43H, F9H... 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 填空BEGIN和END之间已给出的一段源程序使其完整(空白己用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处,请加以修改。 试题程序: EXTRN LOAD: FAR, SAVE: FAR N EQU 20 DSEG SEGMENT L DW ? 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 LEA DX,L ; 数据区起始地址 LEA SI,NAME0 ; 输入文件名首址送SI MOV CX,2+N ; 输入字节数送CX CALL LOAD ; 从INPUT1.DAT中读取数据 ;****BEGIN**** LEA SI,SOURCE LEA DI,RESULT CLD MOVSB ;Y[0]=X[0] XOR BX, BX ; FLAG=0 MOV DX,N*2 ; 计数 ZTE: LODSB SUB (1) ; X [n]-X [n-1] (2) ; FLAG=NOT FLAG J (3) SWIM MOV 4, CL MOV AH, AL JMP NEXT SWIM: (4) OR AL, AH STOSB NEXT: (5) JNE ZTE ; ****END**** LEA DX, RESULT ; 结果数据区首址送DX LEA SI, NAME1 ; 结果文件名首址送SI MOV CX, N ; 结果字节数送CX CALL SAVE ; 保存结果到文件OUTPUT1.DAT RET START ENDP CSEG ENDS END START
问答题已知在文件IN94.DAT中存有若干个(个数<200)4位数字的正整数,函数ReadDat()的功能是读取这若干个正整数并存入数组xx中。请编制函数CalValue(),其功能要求:(1)求出该文件中共有多少个正整数totNum;(2)求m这些数中的各位数字之和是偶数的数的个数totCnt,以及满足此条件的这些数的算术平均值totPjz,最后调用函数WriteDat()把所求的结果输出到文件OUT94.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 试题程序: #include <stdio.h> #include <stdlib.h> #define MAXNUM 200 int xx[MAXNUM]; int totNum=0;/*文件IN94.DAT中共有多少个正整数*/ int totCnt=0;/*符合条件的正整数的个数*/ double totPjz=0.0;/*平均值*/ int ReadDat(void); void Writedat(void); void CalValue() void main() int i; system("CLS"); for(i=0;i<MAXNUM;i + +) xx[i]=0; if(Readdat()) printf("数据文件IN94.DAT不能打开!/007/n"); return; CalValue(); printf("文件IN94.DAT中共有正整数=% d个/n",totNum); printf("符合条件的正整数的个数=% d个/n",totCnt); printf("平均值=% .21f/n",totPjz); Writedat(); int Readdat(void) FILE * fp; int i=0; if((fp=fopen("IN94.DAT","r"))==NULL) return 1; while(! feof(fp)) fscanf(fp,"% d,",&xx[i + +]); fclose(fp); return 0; void Writedat(void) FILE * fp; fp=fopen("OUT94.DAT","w"); fprintf(fp,"% d/n% d/n% .21f/n",totNum,totCnt,totPjz); fclose(fp);
问答题函数readDat()是从文件in77.dat中读取20行数据并存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),其功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中。最后调用函数writeDat()把结果xx输出到文件out77.dat中。 条件:从字符串中间一分为二,左边部分按字符的ASCII值降序排序,右边部分按字符的ASCII值升序排序。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上。 注意:部分源程序已给出。 请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。 试题程序: #include <stdio.h> #include <string.h> #include <stdlib.h> char xx[20][80]; void readDat(); void writeDat(); void jsSort() void main() readDat(); jsSort(); writeDat(); void readDat() FILE * in; int i=0; char * p; in=fopen("in77.dat","r"); while(i<20 && fgets(xx[i],80,in)!=NULL) p=strchr(xx[i],'/n'); if(p) *p=0; i + +; fclose(in); void writeDat() FILE * out; int i; system("CLS"); out=fopen("out77.dat","w"); for(i=0;i<20;i + +) printf("% s/n",xx[i]); fprintf(out,"% s/n",xx[i]); fclose(out);
问答题请编制程序,其功能是:将一个字符串中连续相同的字符仅用一个字符代替,生成一个新的字符串。字符串以00H结束,长度不超过20个字节。 例如: 原字符串为:41H,41H,41H,42H,31H,31H,...,00H('AAAB11') 新字符串为:41H,42H,31H,...,00H('AB1') 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 请填空BEGIN和END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGIN和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 [试题程序] EXTRN LOAD:FAR,SAVE:FAR LEN EQU 20 DSEG SEGMENT SOURCE DB LEN DUP(?) RESULT DB LEN DUP(0) NAME0 DB 'INPUT1.DAT',0 NAME1 DB 'OUTPUT1.DAT',0 DSEG ENDS SSEG SEGMENT STACK DW 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 LEA DX,SOURCE LEA SI,NAME0 MOV CX,LEN CALL LOAD ;LOAD STRING FROM FILE ; ******BEGIN****** ;在BEGIN和END之间补充代码 ; ******END****** LEA DX,RESULT LEA SI,NAME1 CALL SAVE ;SAVE RESULT TO FILE RET START ENDP CSEG ENDS END START
问答题请编制程序,其功能是:以SOURCE开始的内存区域存放着若干字节的数据,以'#'作为数据的结束标志。将其中的空格滤除,对每个非空格数据的最高位清0后依次存放到RESULT指示的区域,其后存放一个空格符(20),然后存放原来的空格个数,最后仍以'#'结束。例如:内存中有45H,20H,87H,20H,A5H,32H,20H,20H,20H,23H结果为45H,07H,25H,32H,20H,05H,23H部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,转换结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。请填空BEGIN和END之间已经给出的一段源程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:
问答题请编制程序,要求:将文件IN94.DAT中的200个整数读入数组xx中,求出数组xx中奇数的个数cnt1和偶数的个数cnt2,以及数组xx下标为奇数的元素值的算术平均值pj(保留两位小数),结果cnt1,cnt2,pj输出到OUT94.DAT中。 部分程序、读函数read_dat(int xx[200))及输出格式已给出。 试题程序: #include<conio:h> #include<stdio.h> #define N 200 void read_dar (int xx [N] ) int i,j; FILE *fp; fp=fopen("IN94.DAT","r"); for(i=0;i<20;i++) for(j=0;j<10;j++) fscanf(fp,"%d,#, printf("%d",xx[i*10+j]); printf("/n"); fclose(fp); void main() int cnt1,cnt2,xx[N]; float pj; FILE *fw; clrscr(); fw=fopen("out94.dat","w"); read_dat(xx); printf("/n/ncnt1=%d, cnt2=%d,pj=%6.2f/n",cnt1,cnt2,pj); fprintf(fw,"%d/n%d/n%6.2f/n",cnt1,cnt2,pj); fclose(fw);
问答题下列程序的功能是:找出所有100以内(含100)满足I、I+4、I+10都是素数的整数I(I+10也是在100以内)的个数cnt,以及这些I之和sum。请编制函数countValue()实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件out91.dat中(数值1不是素数)。 注意:部分源程序已给出。 请勿改动主函数main()和输出数据函数writeDAT()的内容。 试题程序: #include <stdio.h> int cnt,sum; void writeDAT(); int isPrime(int number) int i,tag=1; if(number==1) return 0; for(i=2;tag && i<=number/2;i + +) if(number%i==0)tag=0; return tag; void countValue() void main() cnt=sum=0; countValue(); printf("满足条件的整数的个数=% d/n",cnt); printf("满足条件的整数的和值=% d/n",sum); writeDAT(); void writeDAT() FILE * fp; fp=fopen("out91.dat","w"); fprintf(fp,"% d/n% d/n",cnt,sum); fclose(fp);
问答题请编制程序PROG1.ASM,其功能是:以SOURCE开始的内存区域中存放着N个字节的有符号数。现找出最大的数,结果存放到RESULT指示的单元,其后存放原N个数逻辑取反后的值。 例如: 数据为:09H,7EH,89H,F3H,17H,……,67H(N个数据) 结果为:7EH(最大数),F6H,81H,76H,0CH,E8H,……,98H(原来N个数的逻辑反) 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件 OUTPUT1.DAT中。 填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处,请加以修改。 试题程序: EXTRN LOAD:FAR, SAVE:FAR N EQU 19 STAC SEGMENT STACK DB 128 DUP (?) STAC ENDS DATA SEGMENT SOURCE DB N DUP(0) 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,ES: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 **** (1) SI,SOURCE MOV BX,OFFSET SOURCE LEA DI,RESULT MAXD1: MOV CX,N MOV DX,CX MOV AL, (2) MAXD2: INC BX (3) AL,[BX] (4) MOV AL, [BX] MAXD3: DEC DX JNZ (5) MOV [DI], AL INC DI CLD MREP: LODSB NOT AL (6) LOOP MREP ; **** END **** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名起始地址 MOV CX,N+1 ; 字节数 CALL SAVE ; 保存结果到OUTPUT1.DAT文件中 RET START ENDP CODE ENDS END START
问答题下列程序的功能是:计算出自然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NINE+NINE的个数cnt,以及满足此条件的所有SIX与NINE的和sum。请编写函数countValue()实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件 OUT51.DAT中。其中的S,I,X,N,I,N,E各代表一个十进制数。 注意:部分源程序已给出。 请勿改动主函数main()和写函数writeDAT()的内容。 #include<stdio. h> int cnt, sum; void countValue () void main () cnt=sum=0; countValue (); printf ( "满足条件的个数=%d/n", cnt); printf ("满足条件所有的SIX与NINE的和=%d/n", sum); writeDAT (); writeDAT () FILE *fp; fiD=foDen ("OUT51. DAT", "w" ); fprintf (fp, "%d/n%d/n", cnt, sum); fclose (fp);
问答题请编制程序,其功能是:内存中连续存放着20个ASCⅡ字符,如果是小写字母a~z之间的字符(包括字母a和z),请把它们转换成相应的大写字母所对应的ASCⅡ字符;若为其他字符,不作转换。 例如: 内存中有:61H('a'),62H('b'),31H('1'),41H('A'),42H('B')… 结果为: 41H('A'),42H('B'),31H,41H,42H… 部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 请填空BEGIN和END之间已给出的源程序使其完整,空白处已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ连接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序存在错误之处,请加以修改。 【试题程序】 EXTRN LOAD:FAR,SAVE:FARN EQU 20STAC SEGMENT STACK DB 128 DUP (?)STAC ENDSDATA SEGMENTSOURCE DB N 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 ; 字节数 CALL LOAD ; 从"INPUT.DAT"中读取数据; ******** BEGIN ******** LEA SI, SOURCE LEA DI, RESULT MOV CX, NNEXT: MOV AL,[SI] CMP AL,'a' JB (1) CMP AL, (2) J (3) UPPER2 SUB AL, (4) UPPER2: HOV [DI], (5) INC (6) INC (7) (8) NEXT; ******** END ******** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N ; 结果字节数 CALL SAVE ; 保存结果到文件 RETSTART ENDPCODE ENDS END START
问答题试题要求如图10.4所示。#include<stdio.h>#include<string.h>charxx[20][80];voidjsSort()voidmain()readDat();jsSort();writeDat();readDat()FILE*in;inti=0;char*p;in=fopen("K://k06//35010004//in.dat","r");while(i<20&&fgets(xx[i],80,in)!=NULL)p=strchr(xx[i],'/n');if(p)*p=0;i++;fclose(in);writeDat()FILE*out;inti;out=fopen("K://k06//35010004//out.dat","w");for(i=0;i<20;i++)printf("%s/n",xx[i]);fprintf(out,"%s/n",xx[i]);fclose(out);
问答题请编制程序,其功能是:内存中连续存放着16个二进制字节数,在原16个数的第4和第5个数之间插入00H,在原16个数的第8和第9个数之间插入55H,在原16个数的第12和第13个数之间插入AAH,在原16个数的最后加入FFH。将按上述方法插入4个字节数后得到的20个字节数存入内存中。 例如: 内存中有:10H,20H,30H,40H,50H…,8FH(共16个字节) 结果为:10H,20H,30H,40H,OOH,50H,…,8FH,FFH(共20个字节) 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.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 SOURCE DB N DUP(?) INDATA DB 0FFH,OAAH,55H,00H RESULT DB N+4 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,NAMEO ;原始数据文件名 MOV CX,N ;字节数 CALL LOAD ;从'INPUT1.DAT'中读取数据 ; ****** BEGIN ****** ______ MOV DI,O MOV CX,4 MOV BX,4 CHAN: ______ MOV RESULT[DI],AH ______ INC DI DEC CX JZ INSERl JMP CHAN INSER1: PUSH SI MOV SI,BX MOV AX,WORD PTR INDATA[SI-2] MOV RESULT[DI],______ DEC BX JZ ______ MOV CX,04H ______ INC DI JMP ______ EXIT: POP SI ; ****** END****** LEA DX,RESULT ;结果数据区首址 LEA SI,NAME1 ;结果文件名 MOV CX,N+4 ;结果字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START
问答题下列程序的功能是:将大于整数m且紧靠m的k个素数存入数组xx。请编写函数num(int m,int k,int xx[])实现程序的要求,最后调用函数readwriteDAT()把结果输出到out92.dat文件中。 注意:部分源程序已给出。 请勿改动主函数main()和输入输出函数readwriteDAT()的内容。 试题程序: #include <stdlib.h> #include <stdio.h> void readwriteDAT(); void num(int m,int k,int xx[]) void main() int m,n,xx[1000]; system("CLS"); printf("/nPlease enter two integets:"); scanf("% d,% d",&m,&n); num(m,n,xx); for(m=0;m<n;m + +) printf("% d",xx[m]); printf("/n"); readwriteDAT(); void readwriteDAT() int m,n,xx[1000],i; FILE * rf,* wf; rf=fopen("in92.dat","r"); wf=fopen("out92.dat","w"); for(i=0;i<10;i + +) fscanf(rf,"% d % d",&m,&n); mum(m,n,xx); for(m=0;m<n;m + +) fprintf(wf,"% d",xx[m]); fprintf(wf,"/n"); fclose(rf); fclose(wf);
问答题已知文件IN42.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从小到大进行排列,若产品代码相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件0UT42.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数WfiteDat()的内容。 [试题程序] #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 S1;/*数量*/ 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("IN42.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("OUT42.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);
问答题已知数据文件IN27.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足此条件的4位数依次存入数组b中,然后对数组b的4位数从大到小进行排序,最后调用写函数writeDat()把数组b中的数输出到OUT27.DAT文件。 例如:7153,7+1=5+3,则该数满足条件,存入数组b中,且个数cnt=cnt+1。 8129,8+1≠2+9,则该数不满足条件,忽略。 注意:部分源程序已给出。 程序中已定义数组;a[300],b[300],已定义变量:cnt。 请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。 试题程序: #include〈stdio.h> int a[300], b[300], cnt=0; void 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("IN27.DAT", "r"); for(i = 0; i〈300; i++) fscanf(fp, "%d,", fclose (fp); writeDat ( ) FILE *fp; int i; fp = fopen("OUT27.DAT", "w"); fprintf (fp, "%d/n",cnt); for(i = 0; i〈cnt; i++) fprintf(fp, "%d,/n", b[i]); fclose (fp);
问答题函数ReadDat()的功能是实现从文件ENG62.IN中读取一篇英文文章,存入到字符串数组xx中。请编制函数encryChar(),按给定的替代关系对数组xx中所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数Wiltedat()把结果xx输出到文件PS62.DAT中。 替代关系:f(p)=p*13mod256(p是数组xx中某一个字符的ASCⅡ值,f(p)是计算后新字符的ASCH值),如果计算后f(p)的值小于等于32或其ASCII值是偶数,则该字符不变,否则将f(p)所对应的字符进行替代。 注意:部分源程序已给出。 原始数据文件的存放格式是每行的宽度均小于80个字符。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 试题程序: # inc lude<conio, h> #include<stdio. h> #include<string. h> # inc lude<ctype, h> unsigned char xx[50] [80]; int maxline=0; int ReadDat (void); void WriteDat (void); void encryChar ( ) void main ( ) clrscr ( ); if (ReadDat ( ) ) printf ("数据文件ENG62. IN不能打开! /n/007" ); return; encryChar ( ); WriteDat (); int ReadDat (void) FILE *fp; int i=0; unsigned char *p; if ( (fp=fopen ( "ENG62. IN", "r" ) ) ==NULL) return 1; while (fgets (xx [i], 80, fp) !=NULL) p=strchr (xx [i] , ' /n' ); if (p) *p=0; i++; maxl ine=i; fclose (fp); return 0; void WriteDat ( ) FILE *fp; int i; fp= fopen("ps62.dat", "w"); for (i=0; i<maxline; i++) printf ("%s/n" ,xx[i] ); fprintf (fp, "%s/n" ,xx[i] ); fclose (fp);
问答题请编制程序,其功能为:将内存中存放的连续的30个二进制数(0到100之间),按数值大小分别进行统计,0~59为D,60~74为C,75~84为B,85~100为A,统计出A、B、C、 D的个数,并按A、B、C、D次序存放在内存中。 例如:内存中原始数据为:21H,3CH,4DH,31H,4FH,51H,56H 统计结果:1,3,1,2 部分程序已经给出,其中原始数据由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 30 DSEG SEGMENT SOURCE DB N DUP (?) RESULT DB 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 CX,N LEA SI,SOURCE CONT: MOV AL,[SI] _____________ JB LB INC RESULT JMP OK LB: CMP AL, 75 JB LC INC ______ JMP OK LC: CMP AL,60 JB LD ____________ JMP OK LD: ____________ OK: INC SI LOOP CONT ; *** END *** LEA DX,RESULT LEA SI,NAME1 MOV CX,4 CALL SAVE RET START ENDP CSEG ENDS END START
问答题请编制程序,其功能是:内存中连续存放着16个二进制字节数,在原16个数的第4和第5个数之间插入00H,在原16个数的第8和第9个数之间插入55H,在原16个数的第12和第13个数之间插入AAH,在原16个数的最后加入FFH。将按上述方法插入4个字节数后得到的20个字节数存入内存中。 例如: 内存中有:10H,20H,30H,40H,50H,…,8FH(共16个字节) 结果为: 10H,20H,30H,40H,00H,50H,…,8FH,FFH(共20个字节) 部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放,由过程SAVE保存到文件OUTPUT1.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 SOURCE DB N DUP (?) INDATA DB 0FFH,0AAH,55H,00H RESULT DB N+4 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 EA DX,SOURCE ; 数据区起始地址 OV CX,N ; 字节数 ALL LOAD ; 从'INPUT1.DAT'中读取数据 ******** BEGIN ******** (1) OV DI,0 OV CX,4 OV BX,4 CHAN: (2) OV RESULT[DI],AH (3) NC DI EC CX Z INSER1 MP CHAN INSER1: PUSH SI MOV SI,BX MOV AX,WORD PTR INDATA[SI-2] MOV RESULT [DI], (4) DEC BX JZ (5) MOV CX,04H (6) INC (7) JMP CHAN EXIT: POP SI ; ******** END ******** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N+4 ; 结果字节数 CALL SAVE ; 保存结果到文件 RET START ENDP CODE ENDS END START
问答题已知数据文件IN13.DAT中存有200个4位数,并已调用读函数readDat()把这些数存人数组a中,请编制一函数jsVal(),其功能是:如果4位数各位上的数字均是0或2或4或6或8,则统计出满足此条件的数的个数cnt,并把这些4位数按从大到小的顺序存入数组b中,最后调用写函数writeDat()把结果cnt及数组b中符合条件的4位数输出到OUT13.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("IN13,DAT","r"); for(i=0;i<MAX;i++) fscanf(fp,"%d", fclose(fp); voidmain() int i; readDat(); jVal(); 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("OUT13.DAT","w"); fprintf(fp,:% d/n",cnt); for(i=0;i<cnt;i++)fprintf(fp,"% d/n",b[i]); fclose(fp);
