网络技术上机分析
网络技术上机分析
替换字符
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS10.DAT中。替代关系:f(p)=p*11 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果原字符的ASCII值是偶数或计算后f(p)值小于等于32,则该字符不变,否则将f(p)所对应的字符进行替代。部分源程序已给出,原始数据文件存放的格式是:每行的宽度均小于80个字符。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include
#include
unsigned char xx[50][80];int maxline=0;/*文章的总行数*/
int ReadDat(void)void WriteDat(void)
void encryptChar(){
}
void main(){clrscr();if(ReadDat()){printf("数据文件ENG.IN不能打开!\n\007");return;}encryptChar();WriteDat();}
int ReadDat(void){FILE *fp;int i=0;unsigned char *p;
if((fp=fopen("eng.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("ps10.dat","w");for(i=0;i
解法1:void encryptChar(){int i;char *pf;for(i=0;i
解法2:void encryptChar(){int i,j,t;for(i=0;i
二、字符串左右排序和比较函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(第行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。条件:从字符串中间一分为二,左边部分按字符的ASCII值升序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。例如:位置012345678源字符串d c b a h g f e 4 3 2 1 9 8 7 6 5则处理后字符串 h g f e a b c d8 7 6 5 9 1 2 3 4部分源程序已给出。请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 #include
char xx[20][80];
void jsSort(){
}
void main(){readDat();jsSort();writeDat();}
readDat(){FILE *in;int i=0;char *p;
in=fopen("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();int i;clrscr();out=fopen("out.dat","w");for(i=0;i<20;i++){printf(\"%s\n",xx[i]);fprintf(out,"%s\n",xx[i]);}fclose(out);}--------------------------------------------------------------------------------注:先采用冒泡法对左边部分进行升序排序,然后将排序后的左半与右半按对应位进行调换。void jsSort(){int i,strl,half,j,k;char ch;for(i=0;i<20;i++) /*行循环*/{strl=strlen(xx[i]); /*每行长度*/ half=strl/2;for(j=0;j
xx[i][j]=xx[i][k];
xx[i][k]=ch;}for(j=half-1,k=strl-1;j>=0;j--,k--){ch=xx[i][j];xx[i][j]=xx[i][k];xx[i][k]=ch;}}}void jsSort(){int i,j,k,strl;char ch;for(i=0;i<20;i++){strl=strlen(xx[i]);for(j=0;j
二、字符串左右排序和比较函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(第行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。条件:从字符串中间一分为二,左边部分按字符的ASCII值升序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。例如:位置012345678源字符串d c b a h g f e 4 3 2 1 9 8 7 6 5则处理后字符串 h g f e a b c d8 7 6 5 9 1 2 3 4部分源程序已给出。请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 #include
char xx[20][80];
void jsSort(){
}
void main(){readDat();jsSort();writeDat();}
readDat(){FILE *in;int i=0;char *p;
in=fopen("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();int i;clrscr();out=fopen("out.dat","w");for(i=0;i<20;i++){printf(\"%s\n",xx[i]);fprintf(out,"%s\n",xx[i]);}fclose(out);}--------------------------------------------------------------------------------注:先采用冒泡法对左边部分进行升序排序,然后将排序后的左半与右半按对应位进行调换。void jsSort(){int i,strl,half,j,k;char ch;for(i=0;i<20;i++) /*行循环*/{strl=strlen(xx[i]); /*每行长度*/ half=strl/2;for(j=0;j
xx[i][j]=xx[i][k];
xx[i][k]=ch;}for(j=half-1,k=strl-1;j>=0;j--,k--){ch=xx[i][j];xx[i][j]=xx[i][k];xx[i][k]=ch;}}}void jsSort(){int i,j,k,strl;char ch;for(i=0;i<20;i++){strl=strlen(xx[i]);for(j=0;j
三.正整数排序求平均值(包括将数拆散、求最大最小值)。已知数据文件IN.DAT中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加个位数等于百位数上的数加十位数上的数的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及不满足此条件的四位数平均值pjz2,最后调用写函数把结果输出到OUT.DAT文件。例如:6712,6+2=7+1,则该数满足条件计算平均值pjz1,且个数cnt=cnt+1。8129,8+9<>1+2,则该数不满足条件计算平均值pjz2.部分源程序已给出。
程序中已定义数组:a[300],已定义变量:cnt,pjz1,pjz2请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
#include
}
main(){int i;
readDat();jsValue();writeDat();printf("cnt=%d\n满足条件的平均值pzj1=%7.21f\n不满足条件的平均值pjz2=%7.21f\n" ,cnt,pjz1,pjz2);}
readDat(){FILE *fp;int i;fp=fopen(" in.dat" ," r" );for(i=0,i<300;i++)fscanf(fp,"%d" ,&a[i]);fclose(fp);}
writeDat(){FILE *fp;int i;fp=fopen(" out.dat" ," w" );fprintf(fp," %d\n%7.21f\n%7.21f\n" ,cnt,pjz1,pjz2);fclose(fp);} --------------------------------------------------------------------------------注:该题的关键在于会不会取出一个数的个、十、百、千位上的数。a[i]%10对10求余结果为个位数,a[i]%100/10先对100求余得出后两位数然后再除10,由于为整数因此得出上一个后两位数的第一位。依此类推。*/jsvalue(){int i,g,s,b,q,k=0;for(i=0;i<300;i++){g=a[i]%10;s=a[i]%100/10;b=a[i]/100%10;q=a[i]/1000;if((q+g)==(s+b)) {cnt++;pjz1+=a[i];}else {k++;pjz2+=a[i];}}pjz1/=cnt;pjz2/=k;}
四、产品五个因素的比较排列,是结构体操作问题已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)四部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT8.DAT中。部分源程序已给出。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。#include
#define MAX 100typedef 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("IN.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(void){FILE *fp;int i;
fp=fopen("OUT8.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);}--------------------------------------------------------------------------------注:void SortDat(){int i,j;PRO swap;for(i=0;i
五、素数下列程序的功能是:将大于整数m且紧靠m的k个素数存入数组xx。请编写函数num(int m,int k,int xx[])实现程序的要求,最后调用函数readwriteDat()把结果输出到文件out.dat中。例如:若输入17,5,则应输出:19,23,29,31,37。部分源程序已给出。请勿改动主函数main()和输出数据函数writeDat()的内容。 #include
int isP(int m){int i;
for(i=2;i
void num(int m,int k,int xx[]){
}
main(){int m,n,xx[1000];clrscr();printf("\nPlease enter two integers:");scanf(" %d%d" ,&m,&n);num(m,n,xx);for(m=n;m
viod readwriteDAT(){int m,n,xx[1000], i;FILE *rf,*wf;
rf=fopen("in.dat" ," r" );wf=fopen(" out.dat" ," w" );for(i=0;i<10;i++){fscanf(rf," %d%d" ,&m,&n);num(m,n,xx);for(m=n;m
六、数字排序在文件in.dat中有200组数据,每组有3个数,每个数均是三位数。函数ReadDat()读取这200组数据存放到结构数组aa中,请编制函数jsSort(),其函数的功能是:要求在200组数据中找出条件为每组中的第一个数大于第二个数加第三个数的之和,其中满足条件的个数作为函数jsSort() 的返回值,同时把满足条件的数据存入结构数组bb中,再对bb中的数据按照每组数据的第一个数加第三个之和的大小进行升序排列(第一个数加第三个数的和均不相等),排序后的结果仍重新存入结构数组bb中,最后调用函数WriteDat()把结果bb输出到文件out.dat中。部分源程序已给出。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。#include
typedef struct{int x1,x2,x3;}data;
data aa[200],bb[200];
int jsSort(){
}
void main(){int count;
readDat();count=jsSort(); /*返回满足条件的个数*/writeDat(count);}
readDat(int count){FILE *in;int i;
in=fopen("in.dat","r");for(i=0; i<200; i++) fscanf(in,"%d,%d,%d",&aa[i].x1,&aa[i].x2,&aa[i].x3);fclose(in);}
writeDat(){FILE *out;int i;
clrscr();out=fopen("out.dat","w");for(i=0; i<10; i++){printf("%d,%d,%d 第一个数+第三个数=%d\n",bb[i].x1,bb[i].x2,bb[i].x3,bb[i].x1+bb[i].x3); fprintf(out,"%d,%d,%d\n",bb[i].x1,bb[i].x2,bb[i].x3);}fclose(out);}--------------------------------------------------------------------------------注:最后排序采用冒泡法。int jsSort(){int i,j,k=0;DATA swap; /*定义一个结构体变量,作为交换时的临时存放地*/for(i=0;i<200;i++)if(aa[i].x1>(aa[i].x2+aa[i].x3))bb[k++]=aa[i]; /*先将符合第一个数大于第二个数加第三个数的之和的数存入bb数组中*/for(i=0;i
七、其他数学计算请编制函数READDAT()实现从文件IN.DAT中读取1000个十进制整数到数组XX中;再编制函数COMPUTE()分别计算出XX中奇数的个数ODD,偶数的个数EVEN,平均值`AVER以及方差TOTFE的值,最后调用函数WRITEDAT()把结果输出到OUT.DAT文件中.计算方差的公式如下:原始数据文件存放的格式是:每行存放10个数,并用逗号隔开(每个数均大于0且小于等于2000).
#include
int xx[MAX],odd=0,even=0;double aver=0.0,totfc=0.0;
void WriteDat(void) ;
int ReadDat(void){FILE *fp ;
if((fp=fopen("in.dat","r"))==NULL) return 1;
fclose(fp) ;return 0 ;}
void Compute(void){
}
void main(){int i ;for(i=0;i
void WriteDat(void){FILE *fp;int i;
fp=fopen("out.dat", "w") ;fprintf(fp, "%d\n%d\n%lf\n%lf\n",odd,even,aver,totfc);fclose(fp) ;}
/* 注:*/int ReadDat(void){FILE *fp ;int i;
if((fp=fopen("in.dat","r"))==NULL) return 1;for(i=0;i
void Compute(void){int i,yy[1000];for(i=0;i
0;double totpjz=0.0;
int readdat(void);void writedat(void);
void calvalue(void){
}
void main(){int i;clrscr();for(i=0;i
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.dat","w");fprintf(fp,"%d\n%d\n%.2lf\n",totnum,totcnt,totpjz);fclose(fp);}
/* 注:本题用if(!xx[i]) break;来判断xx[i]是否为0,若是则跳出循环。亦是较简单。*/void calvalue(void){int i,data;for(i=0;i
九、学生成绩,结构体问题下列程序的功能是:已知学生的记录由学号和学习成绩构成,N名学生的数据已存入A数组中。找出成绩最高的学生记录(假定最高成绩的记录中唯一的),通过形参返回。请考生编写函数MMM(STU A[],STU *S)实现程序的要求,最后调用函数READWRITEDAT()把结果输出到文件OUT.DAT中.
例如: KS01 87KS09 97KS11 67则调用该函数后,输出THE TOP:KS09,97# include"stdio.h"# include"string.h"# define N 10 void readwritedat();
typedef struct ss{char num[10];int s;}STU;
mmm(STU a[],STU *s){
}
main(){STU a[N]={{"01",81},{"02",89},{"03",66},{"04",87},{"05",77},{"06",90},{"07",79},{"08",61},{"09",80},{"10",71}},m;int i;for(i=0;i
void readwritedat(){FILE *rf,*wf;STU a[N],m;int i;rf=fopen("in.dat","r");wf=fopen("out.dat","w");for(i=0;i<10;i++)fscanf(rf,"%s,%d",a[i].num,&a[i].s);mmm(a,&m);fprintf(wf,"the top: %s,%d\n",m.num,m.s);fclose(rf);fclose(wf);}
/* 注:较简单。*/mmm(STU a[],STU *s){int i;s->s=a[0].s;for(i=1;i
十、字符串(单词)的倒置和删除函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组XX中;请编制函数STROR(),其函数功能是:以行为单位把字符串中的所有小写字母O左边的字符串内容移到该串的右边存放,然后并把小写字母O删除,余下的字符串内容移到已处理字符串的左边存放.最后把已处理的字符串仍按行重新存入字符串数组XX中,最后调用函数WRITEDAT()把结果XX输出到文件OUT5.DAT中.例如:原文:You can create an index on any field.you have the correct record.结果: n any field.You can create an indexrd.yu have the crrect rec原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格.# include"stdio.h"# include"string.h"# include"conio.h"# include"ctype.h"# include"mem.h" unsigned char xx[50][80];int maxline=0;
int readdat(void);void writedat(void);
void StrOR(void){
}
void main(){clrscr();if(readdat()){printf("Can't open the file E
NG.IN!\n");return;}StrOR();writedat();}
int readdat(void){FILE *fp;int i=0;char *p;if((fp=fopen("in.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;fp=fopen("out5.dat","w");for(i=0;i
/* 注:题目要求的字符串中所有小写字母o左边的字符串内容移到该串的右边存放,即将串中“最后”一个字母o左右两侧的内容互换。题中第一个while()特环的作用是让p1指向最后一个字母'o'。第一个ctrcat()函数的作用是将p1以后的字符都放到新串t中,第二个strcat()函数的作用是将p1以前的字符连接到新串t的后面(注意:在些之前要让p1所指的单元成为p1前面字符串的结束位置*p1='\0')。这时完成左右互换。最后一个while()循环的作用是删除新串中的所有小写字母'o',采用的删除方法是不是'o'的字母一律留下,否则不留(即相当于删除。)*/void StrOR(void){int i;char *p1,*p2,t[80];for(i=0;i
十一、选票问题。现有一个10个人100行的选票数据文件IN.DAT,其数据存放的格式是每条记录的长度均为10位,第一位表示第一个的选中情况,第二位表示第二个人的选中情况,依此类推;内容均为字符0和1,1表示此人被选中,0表示此人未被选中,若一张选票人数大于5个人时认为无效的选票.给定函数READDAT()的功能是把选票并把选票数据读入到字符串数组XX中.请编制函数COUNTRS()来统计每个人的选票数把票数依次存入YY[0]到YY[9]中,最后调用函数WRITEDAT()把结果YY输出到OUT.DAT中.
# include"stdio.h" char xx[100][11];int yy[10];
int readdat(void);void writedat(void);
void countrs(void){
}
void main(){int i;for(i=0;i<10;i++)yy[i]=0;if(readdat())return;countrs();writedat();}
int readdat(void){FILE *fp;int i;if((fp=fopen("in.dat","r"))==NULL)return 1;for(i=0;i<100;i++){if(fgets(xx[i],11,fp)==NULL)return 1;xx[i][10]='\0';}fclose (fp);return 0;}
void writedat(void){FILE *fp;int i;fp=fopen("out.dat","w");for(i=0;i<10;i++){fprintf(fp,"%d\n",yy[i]);printf("%d %d\n",i+1,yy[i]);}fclose(fp);}
/* 注:本题要求将那些选了超过5个人的选票视为无效票,在外层for()循环是用来一张一张选票地数。在循环内的第一个for()循环用来数一张选票中共选了几个人,第二个if()用来将选了超过5人的选票去掉。*/void countrs(void){int i,j,count;for(i=0;i<300;i++){count=0;for(j=0;j<10;j++)if(xx[i][j]=='1')count++;if(count>5)continue;for(j=0;j<10;j++)if(xx[i][j]=='1') yy[j]++;}}
十二、出圈问题设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第个m人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,每10人一组,给出这n个人的顺序表。请考生编制函数Josegh()实现此功能并调用函数WriteDat()把结果p输出到文件OUT.DAT中。设n=100,c=1,m=10.(1)将1到n个人的序号存入一维数组p中;(2)若第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置;(3)重复第(2)步直至圈中只剩下p[1]为止。部分源程序已给出。请勿改动主函数main()和输出数据函数writeDat()的内容。 #include
int p[100],n,s,m;void WriteDat(void);
void Josegh(void){
}
void main(){ m=M;n=N;s=S;Josegh();WriteDat();}
void Writ
eDat(void){int i;FILE *fp;
fp=fopen("out.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);}
--------------------------------------------------------------------------------
/* 注:题中第一个for()循环是先对数组p赋初值。在第二个for()中用i来控制没出圈的总人数,s1=(s1+m-1)%i的作用是找出报数后出圈人的下标,其中对i求余的作用是使报数按圈进行(即报到尾后又从头报),该算法在很多题目中都用到。由于求余的作用当报数正好到最后一个时s1为0,故而要进行if(s1==0)的判断。内嵌的for()循环是将出圈以后的人依次往前移。*/void Josegh(void){int i,j,s1,w;s1=s;for(i=1;i<=n;i++)p[i-1]=i;for(i=n;i>=2;i--){s1=(s1+m-1)%i;if(s1==0)s1=i;w=p[s1-1];for(j=s1;j
十三、进制转换请编制函数READDAT()实现从文件IN.DAT中读取100个十六进制数到字符串数组xx中;再编制函数H16TO8(),将xx中的十六进制数转换成八进制数并把已转换的八进制数仍存放在字符串数组XX中,最后调用函数WRITEDAT()把结果输出到OUT.DAT文件中.原始数据文件存放的格式是:每行存放10个数,并用逗号隔开(每个数均大于0且小于等于2000).
#include
char xx[MAX][20];void WriteDat(void) ;
int ReadDat(void){FILE *fp ;
int i,data;char yy[20];
if((fp=fopen("in.dat","r"))==NULL) return 1;
for(i=0;i<100;i++){fscanf(fp,"%x,",&data);itoa(data,yy,16);strcpy(xx[i],yy);
}fclose(fp) ;return 0 ;}
void H16to8(void){int i,data;char yy[20];for(i=0;i<100;i++){data=strtol(xx[i],NULL,16);itoa(data,yy,8);strcpy(xx[i],yy);}
}
void main(){int i ;for(i=0;i
void WriteDat(void){FILE *fp;int i;
fp=fopen("out.dat", "w") ;for(i=0;i
/* 注:本题中用到函数itoa()来实现从整型变成字符型。*/int ReadDat(void){FILE *fp ;int i,data;char yy[20];
if((fp=fopen("in.dat","r"))==NULL) return 1;for(i=0;i<100;i++){fscanf(fp,"%x,",&data);itoa(data,yy,16);strcpy(xx[i],yy);}fclose(fp) ;return 0 ;}
void H16to8(void){int i,data;char yy[20];for(i=0;i<100;i++){data=strtol(xx[i],NULL,16);itoa(data,yy,8);strcpy(xx[i],yy);}}
网络技术上机分析.doc