计算机类
公务员类
工程类
语言类
金融会计类
计算机类
医学类
研究生类
专业技术资格
职业技能资格
学历类
党建思政类
计算机等级考试(NCRE)
全国计算机应用水平考试(NIT)
计算机软件水平考试
计算机等级考试(NCRE)
全国高校计算机等级考试CCT
行业认证
信息素养
计算机等级考试三级
计算机等级考试一级
网络工程师(计算机等级考试四级)
计算机等级考试二级
数据库工程师(计算机等级考试四级)
计算机等级考试三级
信息安全工程师(计算机等级考试四级)
嵌入式系统开发工程师(计算机等级考试四级)
软件测试工程师(计算机等级考试四级)
问答题已知数据文件IN12.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出个位数上的数减千位数上的数减百位数上的数减十位数上的数大于零的个数cnt,再把所有满足此条件的四位数依次存入数组b中.然后对数组b中的四位数按从大到小的顺序进行排序,最后调用写函数 writeDat()把数组b中的数输出到OUT12.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; void jsValue() main() int i; readDat(); jsValue(); writeDat(); for(i=0;i<cnt;i++)printf("b[%d]=%d\n",i,b[i]); readDat() FILE *fp; int i: fp=fopen("IN12.DAT","r"); fori=0;i<300;i++)fscanf(fp,"%d,",&a[i]); fclose(fp); writeDat() FILE *fp; int i; fp=fopen("OUT12.DAT","w"); fprintf(fp,"%d\n",cnt); for(i=0;i<cnt;i++)fprintf(fp,"%d\n",b[i]); fclose(fp);
进入题库练习
问答题请编制程序,要求:将文件IN92.DAT中的200个整数读入数组xx中,求出数组xx中最大数max及最大数的个数cnt和数组xx中值能被3整除或能被7整除的数的算术平均值pj(保留两位小数),结果max,cnt,pj输出到out92.dar中。 部分程序、读函数read_dat(int xx[200])及输出格式已给出。 试题程序: #include<conio.h> #include<stdio.h> #define N 200 void read_dat(int xx[N]) int i,j; FILE *fp; fp=fopen("IN92.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 i,k,cnt,xx[N],max; float pj; FILE *fw; long j=0; clrscr(); fw=fopen("out92.dat","w"); read_dat(xx); printf("/n/nmax=%d,cnt=%d,pj=%6.2f/n",max,cnt,pj); fprintf(fw,"%d/n%d/n%6.2f/n",max,cnt,pj); fclose(fw);
进入题库练习
问答题请编制程序,其功能是:对一个由可打印ASCII字符(ASCII值为20H~7FH)组成的字符串可采用下列方法进行压缩:从串首开始向后扫描,如某字符单独出现则该字符不变,如某字符连续出现n次,则该字符用ESC(1BH),n,<原字符>三个字节来代替(假定n不超过255)。 设内存中从SOURCE开始有一用上述方法压缩的字符串,其以OOH结束,解压后长度不超过100。试编程对其解压缩,结果存入RESULT开始的内存单元。 例如: 原串: 41H,1BH,06H,43H,61H,00H 解压缩后:41H,43H,43H,43H,43H,43H,43H,61H,OOH("ACCCCCCa") 部分程序已给出,原始数据由过程LOAD从文件INPUT.DAT中读入SOURCE开始的内存单元中,结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT.DAT中。 请填空BEGIN和END之间已给出的源程序使其完整,空白己用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGIN和END之间原有的代码并自行编写程序片段来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 【试题程序】 EXTRN LOAD:FAR, SAVE:FAR N EQU 100 ESC_CODE EQU 27 STAC SEGMENT STACK DB 128 DUP(?) STAC ENDS DATA SEGMENT SOURCE DB N DUP(?) RESULT DB 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 MOV ES, AX ;置附加段寄存器 LEA DX, SOURCE ;数据区起始地址 LEA SI, NAME0 ;原始数据文件名起始地址 MOV CX, N ;字节 CALL LOAD ;从"INPUT.DAT" 中读取数据 ******** BEGIN ******** LEA SI, SOURCE LEA DI, RESULT CLD LO: LODSB CMP AL, 0 JE QUIT CMP AL, ESC_CODE J (1) EXPAND (2) JMP L0 EXPAND: (3) ;解压缩 XOR CX, CX (4) (5) (6) (7) JMP LO QUIT: STOSB ;STORE THE '00H' ******** END ******** LEA DX, RESULT ;结果数据区首址 LEA SI, NAME1 ;结果文件名起始地址 MOV CX,N ;字节数 CALL SAVE ;保存结果到"output.dat" 文件 RET START ENDP CODE ENDS END START
进入题库练习
问答题已知数据文件IN44.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数减百位数上数减十位数上的数减个位数上的数大于零的数的个数cnt,再把所有满足此条件的4位数依次存入数组b中,然后对数组b的4位数按从小到大的顺序进行排序,最后调用写函数writeDat()把数组b中的数输出到 OUT44.DAT文件中。 例如:9123,9-1-2-3>0,则该数满足条件,存入数组b中,且个数cnt=cnt+1。 9812,94-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++) printf("b[%d]=%d/n", i, b[i]); readDat ( ) FILE *fp; int i; fp=fopen("IN44.DAT","r"); printf("cnt=%d/n",cnt); for(i=0;i<300;i++) fscanf(fp,"%d,", fclose(fp); writeDat () FILE *fp; int i; fp=fopen("OUT44.DAT","w"); fprintf(fp,"%d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp, "%d/n",b[i]); fclose(fp);
进入题库练习
问答题函数ReadDat()的功能是实现从文件IN100.DAT中读取一篇英文文章存入到字符串数组xx中。请编制函数CharConvA(),该函数的功能是:以行为单位把字符串的最后一个字符ASCII值右移4位后加最后第二个字符的ASCII值,得到最后一个新的字符,最后第二个字符的ASCII值右移4位后加最后第三个字符的ASCII值,得到最后第二个新的字符,以此类推一直处理到第二个字符,第一个字符的ASCII值加最后一个字符的ASCII值,得到第一个新的字符,得到的新字符分别存放在原字符串对应的位置上,把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件OUT100.DAT中。 注意;部分源程序已给出。 原始文件存放的格式是:每行的宽度小于80个字符,含标点符号和空格。 请勿改动主函数main()、读函数ReadDat()和写函数Wnh2Dat()的内容。 试题程序: #include<stdio.h> #include<string.h> #include<conio.h> char xx[50][80]; int maxline=0; int ReadDat(); void WriteDat(); void CharConvA(void) void main() clrscr(); if (ReadDat()) printf("数据文件IN100.DAT不能打开!/n/007"); return; CharConvA( ) WriteDat(); int ReadDat(void) FILE *fp; int i=0; char *P; if((fp=fopen("IN100.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("OUT100.DAT","w"); for(i=0;i<maxline;i++) printf("%s/n",xx[i]); fprintf(fp,"%s/n",xx[i]); fclose(fp);
进入题库练习
问答题对10个候选人进行选举,现有一个100条记录的选票文件IN84.DAT,其数据存放格式是每条记录的长度均为10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,依此类推。每一位候选人的记录内容均为字符0或1,1表示此人被选中,0表示此人未被选中,若一张选票选中人数大于5个人时被认为无效的选票。给定函数ReadDat()的功能是把选票数据读入到字符串数组xx中。请编制函数CoutRs()来统计每个人的选票数并把得票数依次存入yy[0]到yy[9]中,最后调用函数 WriteDat()把结果yy输出到文件OUT84.DAT中。 注意:部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 试题程序: #inolude<stdio.h> char xx[100][11]; int yy[10]; int ReadDat(void); void WriteDat(void); void CoutRs(void) void main() int i; for(i=0;i<10;i++) yy[i]=0; if(ReadDat()) printf("数据文件IN84.DAT不能打开!/n/007"); return; CoutRs(); WriteDat(); int ReadDat(void) FILE *fp; int i; char tt[13]; if((fp=fopen("IN84.DAT","r"))==NULL) return 1; for(i=0;i<100;i++) if(fgets(tt,13,fp)==NULL) return 1; memcpy(xx[i],tt,10); xx[i][10]=0; fclose(fp); return 0; void WriteDat() FILE *fp; int i; fp= fopen("OUT84.DAT","w"); for(i=0;i<10;i++) fprintf(fp,"%d/n",yy[i]); printf("第%d个人的选票数=%d/n", i+1, yy[i]); fclose(fp);
进入题库练习
问答题请编制程序ex4.ASM,其功能是:内存中连续存放着两个有符号字节数序列Ak和Bk(k=0,…,9),求序列Ck,Ck=Ak+Bk(Ck以有符号的形式按C0,…,C9的顺序连续存放)。 例如: 序列Ak:80H,31H,61H,7FH,…; 序列Bk:80H,01H,F1H,7FH,…。 结果Ck为:FF00H,0032H,0052H,00FEH,…。 部分程序已经给出,其中原始数据由过程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 128DUP(?) STAC ENDS DATA SEGMENT SOURCE DB N*2 DUP(?) ;顺序存放A0,…,A9;B0,…,B9 RESULT DW NDUP(0) ;顺序存放C0,…,C9 NAME0 DB 'INPUT1.DAT',0 NAME1 DB 'OUTPUT1.DAT',0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STAC START PROC EAR PUSH DS XORAX,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 MOV BX,0 MOV CX,N PRO: MOV AH,0 MOV AL, ______ MOV DL,AL ______ AL,SOURCE[BX] JNO STAY JUMP1: MOV AH,00 ADD DL,0 JNS JUMP MOV AH, ______ JMP ______ STAY: ______ JUMP: MOV [DI],AX ADDDI,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
进入题库练习
问答题下列程序的功能是:计算出自然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NINE+NINE的个数cnt,以及满足此条件的所有SIX与NINE的和sum。请编写函数countValue()实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件OUT82.DAT中。其中的S、I、X、N、E各代表一个十进制数字。 注意:部分源程序已给出。 请勿改动主函数main()和写函数writeDAT()的内容。 试题程序: #include <stdio.h> int cnt,sum; void writeDAT(); void countValue() void main() cnt=sum=0; countValue(); printf("满足条件的个数=% d/n",cnt); printf("满足条件所有的SIX与NINE的和=% d/n",sum); writeDAT(); void writeDAT() FILE * fp; fP=fopen("OUT82.DAT","w"); fprintf(fp,"% d/n% d/n",cnt,sum); fclose(fp);
进入题库练习
问答题已知数据文件IN17.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出个位数上的数减千位数上数减百位数上的数减十位数上的数大于零的个数cnt,再把所有满足此条件的4位数依次存人数组b中,然后对数组b中的4位数按从大到小的顺序进行排序,最后调用函数wfiteDat()把数组b中的数输出到OUT17.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; void readDat(); void writeDat(); void jsValue() voidmain() 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("IN17.DAT","r"); for(i=0;i<300;i++) fscanf(fp,"%d,", fclose(fp); void writeDat() FILE*fp; int i; fp=fopen("OUT17.DAT","w"); fprintf(fp,"% d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp,"% d/n",b[i]); fclose(fp);
进入题库练习
问答题请编制程序ReadDat()实现从文件in.dat中读取100个十六进制数到字符串数组xx中;再编制函数h16to10(),将xx中的十六进制数转换成十进制数并把已转换的十进制数仍存放在字符串数组xx,最后调用函数WriteDat()把结果输出到out.dat文件巾。原始数据文件存放的格式是:每行存放10个数,并用逗号隔开(每个数均大于0且小于等于2000)。 请勿改动主函数main()、输出数据函数writeDAT()的内容。 [试题源程序] #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #define MAX 10 char xx[MAX][20]; void WriteDat(void); int ReadDat(void) FILE*fp; if((fp=fopen("IN.DAT,"r"))==NULL)return 1: fclose(fp); return 0; void H16tol0(void) void main() int i; for(i=0;i<MAX;i++)memset(xx,0,20); if(ReadDat()) printf("Can’t open the data file in.dat!\007\n"); return; H16to10(); WriteDat(); void WriteDat(void) FILE*fp; int i; fp=fopem("OUT DAT","w"); for(i=0;i<MAX;i++)fprintf(fp,"%s\n",xx[i]); fclose(fp);
进入题库练习
问答题试题要求如图10.3所示。部分源程序内容如下:#include<stdio.h>inta[300],cnt=0;doublepjz1=0.0,pjz2=0.0;jsValue()main()inti;readDat();jsValue();writeDat();printf("cnt=%d/n满足条件的平均值pzj1=%7.2lf/n不满足条件的平均值pzj2=%7.2lfkn",cnt,pjz1,pjz2);readDat()FILE*fp;inti;fp=fopen("K://k06//35010003//in.dat","r");for(i=0;i<300;i++)fscanf(fp,"%d,",&a[i]);fclose(fp);writeDat()FILE*fp;fp=fopen("K://k06//35010003//out.dat","w");fprintf(fp,"%d/n%7.2lf/n%7.2lf/n",cnt,pjz1,pjz2);fclose(fp);
进入题库练习
问答题设有n个人坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始从1到m报数,如此进行下去直到所有的人都出圈为止。先要求按出圈次序,每10个人为一组,给出这n个人的顺序表。请编制函数Josegh()实现此功能并调用函数WriteDat()把编号按照出圈顺序输出到文件OUT59.DAT中。 设n=100,s=1,m=10进行编程。 注意:部分源程序已给出。 请勿改动主函数main()和写函数WriteDat()的内容。 试题程序: #include<stdio.h> #define N 100 #define S 1 #define M 10 int p[100],n,s,m; void WriteDat(void); void Josegh(void) void main() m=M; n=N; s=S; Josegh(); WriteDat(); void WriteDat(void) int i; FILE *fp; fp=fopen("OUT59.DAT","w"); for(i=N-1;i>=0;i--) printf("%4d",p[i]); fprintf(fp,"%4d",p[i]); if (i%10==0) printf ("/n"); fprintf(fp,"/n"); fclose(fp);
进入题库练习
问答题请编制程序,其功能是:内存中连续存放着20个无符号字节数序列,请将它们排成升序(从小到大)。 例如: 内存中有:01H,04H,02H…(假设后17个字节均大于04H) 结果为: 01H,02H,04H…(后跟17个字节,按从小到大的顺序排列) 部分程序已给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放,由过程SAVE保存到文件OUTPUT.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 '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 ; 字节数 CALL LOAD ; 从'INPUT.DAT'中读取数据; ******** BEGIN ******** LEA SI,SOURCE LEA DI,RESULTMOV CX,NNEXT0: MOV AL,[SI] MOV [DI],AL INC SI (1) LOOP (2) CLD MOV BX, (3) NEXT1: LEA SI,RESULT MOV CX,BXNEXT2: LOD (4) CMP [SI],AL JAE (5) XCHG [SI], (6) MOV [SI-1],ALNEXT3: LOOP (7) DEC (8) JNZ (9) ; ******** END ******** LEA DX,RESULT ; 结果数据区首址 LEA SI,NAME1 ; 结果文件名 MOV CX,N ; 结果字节数 CALL SAVE ; 保存结果到文件 RETSTART ENDPCODE ENDS END START
进入题库练习
问答题读函数readDat()的功能是从文件IN76.DAT中读取20行数据并存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),该函数的功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用写函数writeDat()把结果xx输出到文件OUT76.DAT中。 条件:从字符串中间一分为二,左边部分按字符的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("in76.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("out76.dat","w"); for(i=0;i<20;i + +) printf("% s/n",xx[i]); fprintf(out,"% s/n",xx[i]); fclose(out);
进入题库练习
问答题请编制程序ex10.ASM,其功能是:内存中连续放着20个ASCⅡ字符,如果是大写字母A~Z之间的字符,请把它们转换成相应的小写字母;若为其他字符,均转换成ASCⅡ字符'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+1 ;结果字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START
进入题库练习
问答题已知在文件IN3.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价×数量。函数ReadDat()的功能是渎取这100个销售记录并存入结构数组sell中。请编制函数SonDat(),其功能要求:按产品名称从小到大进行排列,若产品名称相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT3.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() void main() memset(sell,0,sizeof(sell)); ReadDat(); SortDat(); WriteDat(); void ReadDat() FILE*fP; char str[80],ch[11]; int i; fp=fopen("IN3.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("OUT3.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);
进入题库练习
问答题请编制程序,其功能是:将内存中由SOURCE指示的40个字节有符号数组成的数组分成正数和负数两个数组,并求这两个数组的数据个数,结果存放在RESULT指示的内存区域。存放形式为正数个数在前,其后跟正数数组元素,然后是负数个数及负数数组元素。 例如: 部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,转换结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 请填空BEGIN和END之间已经给出的一段原程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。 对程序必须进行汇编,并与IO.OBJ连接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 [试题程序] EXTRN LOAD:FAR,SAVE:FAR N EQU 40 STAC SEGMENT STACK DB 128 DUP (?) STAC ENDS DATA SEGMENT SOURCE DB N DUP(0) RESULT DB N+2 DUP(0) NAME0 DB 'INPUT1.DAT',0 NAME1 DB 'OUTPUT1.DAT',0 NDATA DB N DUP(0) PDATA DB N DUP(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,NANE0 ;原始数据文件名 MOV CX,N ;字节数 CALL LOAD ;从'INPUT1.DAT'中读取数据 **********BEGIN********** LEA SI,RESULT (1) DI,OFFSET PDATA ;PDATA为正数数组存放缓冲区首址 NOV BX,OFFSET NDATA ;NDATA为负数数组存放缓冲区首址 XOR DX,DX MOV CX,N CLD MAIN1: LODSB TEST AL, (2) Z MAIN2 NC DH OV [BX],AL NC BX (3) MAIN2: INC DL OV [DI],AL NC DI NAIN3: (4) NAIN1 EA SI,PDATA A DI,RESULT OV [DI],DL NC DI OR CX,CX OV CL,DL NAIN4: MOV AL, (5) MOV [DI],AL INC DI INC SI LOOP (6) MOV [DI],DH INC DI XOR CX,CX MOV CL,DH MOV BX,OFFSET NDATA MAIN5: MOV AL,[BX] MOV [DI],AL INC DI (7) LOOP MAIN5 ; ******** END ********* LEA DX,SOURCE ;结果数据区首址 LEA SI,NAME1 ;结果文件名起始地址 MOV CX,N+2 ;字节数 CALL SAVE ;保存结果到,OUTPUT1.DAT'文件 RET START ENDP CODE ENDS END START
进入题库练习
问答题对内存单元中连续存放的20个ASCII字符进行转换,大写的“A—Z”转换成小写,小写的“a-z”转换成大写,其他字符变为00,结果存放在RESULT开始的内存单元中。部分程序已经在PROG1.ASM中给出,请编写BEGIN到END之间代码。 原有数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,结果要求从RESULT开始存放,由SAVE保存到OUTPUT1.DAT文件。 对程序必须进行汇编,并与10.OBJ连接产生PROG1.EXE执行文件,最终产生运行结果(无结果或结果不正确均不得分)。 部分源程序如下: EXTRN LOAD:FAR,SAVE:FAR N EQU 20 STAC SEGMENT STACK DB 128DUP(?) 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,NAMED ;原始数据文件名 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 相关知识: ●定义符号伪指令 指令功能:给一个表达式分配一个符号名或给一个符号分配一个值。 指令格式:(i)符号EQU表达式(不允许符号重定义) (ii)符号=表达式(允许符号重定义) ●数据定义伪指令 指令格式: (i)[名字]DB操作数1[,操作数2[,...]](为每个操作数分配1个字节的空间) (ii)[名字]DW操作数1[,操作数2[,...]](为每个操作数分配2个字节的空间) (iii)[名字]DD操作数1[,操作数2[,...]](为每个操作数分配4个字节的空间) (iv)[名字]DQ操作数1[,操作数2[,...]](为每个操作数分配8个字节的空间) (v)[名字]DT操作数1[,操作数2[,...]](为每个操作数分配10个字节的空间) ●段定义伪指令 指令格式:段名 SEGMENT [定位方式] [联系方式] ['类别') 使用段定义伪指令可以将程序和有关的数据信息定义在相应的段中。 ●循环的实现 通过设置计数器初值,在完成一组操作后,修改计数器中的值,重新执行操作直到计数器中的值为0。 例如:MOV CX,N LI: ┆ LOOP L1(短标号地址) 或:DEC CX JNZ L1(短标号地址) 注意:本书学习要点讲过的内容,本章节不予赘述。 ●字符的ASCII码 十六进制数“0”~“F”是连续的,它们的ASCII码不是连续的,但仍然有规律可循,“0”~“9”的ASCII码为30H~39H,“A”~“F”的ASCII码为41H~46H,“A”~“Z”的ASCII是从41H开始连续的,“a”~“z”的ASCII是从61H开始连续的。 编程方法: 第一步:分析程序要求的功能。 本程序要求完成以下功能: (1)从数据文件INPUT1.DAT中读取20个8位无符号整数存放在SOURCE开始的内存单元中。 (2)将SOURCE开始的20个ASCII码进行判断,处理,并将结果存放在RESULT开始的内存单元中。 (3)将处理结果存放在0UWUT1.DAT文件 第二步:用相应的汇编程序来实现其功能。 (1)数据的读取和存入文件部分的实现,题目中已经给出。 (2)大小写判断转换处理,我们可根据英文大写字母“A~Z”和小写字母“a~z”的 ASCII码是连续的,并且同字母的大小写的ASCII码相差20H,可以直接在其ASCII码上加减20H进行大小写的转换。 处理过程就是,从数组中取来一个元素,先判断它是否是大写,若为大写,则直接减 20H变为小写;否则判断它是否为小写,若为小写,直接减20H变为大写;若大小写均不是,就赋值为0。重复操作所有的元素。
进入题库练习
问答题编写一个函数findStr(),该函数统计一个长度为2的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为"asd asasdfg asd as zx67 asd mklo",子字符串为"as",函数返回值是6。 函数ReadWrite()的功能是实现从文件in68.dat中读取两个字符串,并调用函数findStr(),最后把结果输出到文件out68.dat中。 注意:部分源程序已给出。 请勿改动主函数main()和其他函数中的任何内容,仅在函数findStr()的花括号中填入你所编写的若干语句。 [试题程序] #include <stdio.h> #include <string.h> #include <stdlib.h> void ReadWrite(); int findStr(char * str,char * substr) void main() char str[81],substr[3]; int n; system("CLS"); printf("输入原字符串:"); gets(str); printf("输入子字符串:"); gets(substr); puts(str); puts(substr); n=findStr(str,substr); printf("n=% d/n",n); ReadWrite(); void meadWrite() char ch,str[81],substr[3]; int n,len,i=0; FILE * rf, * wf; rf=fopen("in68.dat","r"); wf=fopen("out68.dat","w"); while(i<5) fgets(str,80,rf); fgets(substr,10,rf); len=strlen(substr)-i; ch=substr[len]; if(ch= ='/n'||ch= =0xla) substr[len]=0; n=findStr(str,substr); fprintf(wf,"% d/n",n); i + +; fclose(rf); fclose(wf);
进入题库练习
问答题已知数据文件in15.dat中存有200个4位数,并已调用读函数readDat()把这些数存人数组a中,请编制一函数jsVal(),其功能是:若一个4位数的千位数字小于等于百位数字,百位数字小于等于十位数字,以及十位数字小于等于个位数字,并且此4位数是偶数,则统计出满足此条件的数的个数ent并把这些4位数按从小大的顺序存人数组b中,最后调用写函数writeDat()把结果cnt及数组b中符合条件的4位数输出到out15.dat文件中。 注意:部分源程序已给出。 程序中已定义数组:a[200],b[200],已定义变量:cnt。 请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。 [试题程序] #include<stdio.h> #define HAX 200 int a[HAX],b[NAX],cnt=0; void writeDat(); voidjsVal() void readDat() int i; FILE*fp; fp=fopen("in15.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/n",b[i]); writeDat(); void writeDat() FILE *fp; int i; fp=fopen("out15.dat","w"); fprintf(fp,"% d/n",cnt); for(i=0;i<cnt;i++) fprintf(fp,"% d/n",b[i]); fclose(fp);
进入题库练习