网站首页
分类导航
试题中心
下载中心
英语学习
缤纷校园
考试论坛
网站留言
客服中心
 计算机等级考试三级编程解析
【字体:
计算机等级考试三级编程解析
http://www.exam8.com 来源:考试吧(Exam8.com) 点击: 更新:2005-3-24

一、替换字符
 函数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
#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;iprintf("%s\n",xx[i]);
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:在ReadDat()函数中由于fgets()函数读入数据时没有读入字符串结束符'\0',因
而用while()循环在xx数组每一行未尾将换行符'\n'替换成结束符'\0'。
编写的函数如下:该函数的基本算法是——让字符指针pf指向每一行的开头然后逐一往
后移动,在移动过程中按要求进行转换。*pf%2==0用于判断是否为偶数。if()条件语
句用于控制不替代字符。
 解法1:
void encryptChar()
{
int i;
char *pf;
for(i=0;i{pf=xx[i]; /*每行字符个数*/
while(*pf!=0)
{if(*pf%2==0||*pf*11%256<32)
{pf++;continue;}
*pf=*pf*11%256;
pf++;
}
}
}
解法2:
void encryptChar()
{
int i,j,t;
for(i=0;i{
for(j=0;j{
t=xx[i][j]*11%256;
if(t<=32 || xx[i][j]%2==0) continue;
xx[i][j]=t;
}
}
}


二、字符串左右排序和比较
函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(第行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。
  条件:从字符串中间一分为二,左边部分按字符的ASCII值升序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。
  例如:位置   0 1 2 3 4 5 6 7 8
     源字符串 d c b a h g f e
4 3 2 1 9 8 7 6 5
则处理后字符串 h g f e a b c d
8 7 6 5 9 1 2 3 4
  部分源程序已给出。
  请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。
#include
#include
#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;jfor(k=j+1;kif(xx[i][j]>xx[i][k])
{ch=xx[i][j]; /*每次将最小数赋给xx[i][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;jfor(k=j+1;kif(xx[i][j]>xx[i][k])
{
ch=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=ch;
}
for(j=0;j{
ch=xx[i][j];
xx[i][j]=xx[i][(strl+1)/2+j];
xx[i][(strl+1)/2+j]=ch;
}
}
}


三.正整数排序求平均值(包括将数拆散、求最大最小值)
 已知数据文件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
int a[300],cnt=0;
double pjz1=0.0,pjz2=0.0;
jsValue()
{

}

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
#include
#include
#include
#include

#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("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;ifor(j=i+1;j{
if(strcmp(sell[i].mc,sell[j].mc)<0)
{
swap=sell[i];
sell[i]=sell[j];
sell[j]=swap;
}
if(strcmp(sell[i].mc,sell[j].mc)==0&&sell[i].je{
swap=sell[i];
sell[i]=sell[j];
sell[j]=swap;
}
}
}


五、素数
 下列程序的功能是:将大于整数m且紧靠m的k个素数存入数组xx。请编写函数num(int m,int k,int xx[])实现程序的要求,最后调用函数readwriteDat()把结果输出到文件out.dat中。
例如:若输入17,5,则应输出:19,23,29,31,37。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。 #include
#include
void readwriteDAT();

int isP(int m)
{
int i;

for(i=2;iif(m % i==0)return 0;
return 1;
}

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;mprintf(" %d" ,xx[m]);
printf("\n" );
readwriteDAT();
}

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;mfprintf(wf,"\n" );
}
fclose(rf);
fclose(wf);
}
--------------------------------------------------------------------------------
注:太简单。
void num(int m,int k,int xx[])
{
int i,j=0;
i=m+1;
while(j{if(isp(i)) xx[j++]=i;
i++;
}
}


六、数字排序
 在文件in.dat中有200组数据,每组有3个数,每个数均是三位数。函数ReadDat()读取这200组数据存放到结构数组aa中,请编制函数jsSort(),其函数的功能是:要求在200组数据中找出条件为每组中的第一个数大于第二个数加第三个数的之和,其中满足条件的个数作为函数jsSort() 的返回值,同时把满足条件的数据存入结构数组bb中,再对bb中的数据按照每组数据的第一个数加第三个之和的大小进行升序排列(第一个数加第三个数的和均不相等),排序后的结果仍重新存入结构数组bb中,最后调用函数WriteDat()把结果bb输出到文件out.dat中。
部分源程序已给出。
  请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include
#include
#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;ifor(j=i+1;jif((bb[i].x1+bb[i].x3)>(bb[j].x1+bb[j].x3))
{
swap=bb[i];
bb[i]=bb[j];
bb[j]=swap; /*在BB数组中进行排序(从小到大)*/
}
return k;
}


七、其他数学计算
 请编制函数READDAT()实现从文件IN.DAT中读取1000个十进制整数到数组XX中;再
编制函数COMPUTE()分别计算出XX中奇数的个数ODD,偶数的个数EVEN,平均值`AVER以及方
差TOTFE的值,最后调用函数WRITEDAT()把结果输出到OUT.DAT文件中.
计算方差的公式如下:
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开(每个数均大于0且小于等于
2000).
#include
#include
#include
#define MAX 1000

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;ixx[i]=0;
if(ReadDat())
{printf("Can't open the data file in.dat!\007\n") ;
return;
}
Compute();
printf("ODD=%d\nEVEN=%d\nAVER=%lf\nTOTFC=%lf\n", odd,even,aver,t
otfc);
WriteDat();
}

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{fscanf(fp,"%d,",&xx[i]);
if(feof(fp)) break;
}
fclose(fp) ;
return 0 ;
}

void Compute(void)
{
int i,yy[1000];
for(i=0;i{aver+=xx[i];
if(xx[i]%2)
odd++;
else
even++;
}
aver/=(odd+even);
for(i=0;itotfc+=(xx[i]-aver)*(xx[i]-aver)/(odd+even);
}


八、数字或字符移位后的计算
已知在文件in.dat中存有若干个(个数<200)四位数字的正整数,函数readdat
()读取这若干个正整数并存入数组xx中。请编制函数calvalue(),其功能要求:1、求出
这文件中共有多少个正整数totnum;2、求这些数右移1位后,产生的新数是偶数的数的
个数totcnt,以及满足此条件的这些数(右移前的值)的算术平均值totpjz,最后调用
函数writedat()把所求的结果输出到文件out.dat中。
部分源程序已给出。
请勿改动主函数main()、读数据函数readdat()和输出数据函数writedat()的内容。
#include
#include
#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;
clrscr();
for(i=0;iif(readdat())
{printf("Can't open the data file in.dat!\007\n");
return;
}
calvalue();
printf("totnum=%d\n",totnum);
printf("totcnt=%d\n",totcnt);
printf("totpjz=%.2lf\n",totpjz);
writedat();
}

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{if(!xx[i]) break;
if(xx[i]>0) totnum++;
data=xx[i]>>1;
if(data%2==0)
{totcnt++;
totpjz+=xx[i];
}
}
totpjz/=totcnt;
}


九、学生成绩,结构体问题
下列程序的功能是:已知学生的记录由学号和学习成绩构成,N名学生的数据已存入
A数组中。找出成绩最高的学生记录(假定最高成绩的记录中唯一的),通过形参返回。
请考生编写函数MMM(STU A[],STU *S)实现程序的要求,最后调用函数READWRITEDAT
()把结果输出到文件OUT.DAT中.
例如: KS01 87
KS09 97
KS11 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},{&quo
t;04",87},{"05",77},
{"06",90},{"07",79},{"08",61},{"09&qu
ot;,80},{"10",71}},m;
int i;
for(i=0;iprintf("No=%s Mark=%d\n",a[i].num,a[i].s);
mmm(a,&m);
printf("the highest: %s,%d\n",m.num,m.s);
readwritedat();
}

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;iif(a[i].s>s->s)
*s=a[i];
}


十、字符串(单词)的倒置和删除
函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组XX中;请
编制函数STROR(),其函数功能是:以行为单位把字符串中的所有小写字母O左边的字符串
内容移到该串的右边存放,然后并把小写字母O删除,余下的字符串内容移到已处理字符串
的左边存放.最后把已处理的字符串仍按行重新存入字符串数组XX中,最后调用函数WRIT
EDAT()把结果XX输出到文件OUT5.DAT中.
例如:原文:You can create an index on any field.
you have the correct record.
结果: n any field.You can create an index
rd.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 ENG.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{printf("%s\n",xx[i]);
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}

/* 注:题目要求的字符串中所有小写字母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{t[0]='\0';
p2=xx[i];
while(*p2)
{if(*p2=='o') p1=p2;
p2++;
}
strcat(t,p1+1);
*p1='\0';
strcat(t,xx[i]);
p1=xx[i];
p2=t;
while(*p2)
{if(*p2!='o') *p1++=*p2;
p2++;
}
*p1='\0';
}
}
--------------------------------------------------------------------------------


十一、选票问题
现有一个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()循环用来数一张选票中共选了几个人,第二个i
f()用来将选了超过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
#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("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;jp[j-1]=p[j];
p[i-1]=w;
}
}


十三、进制转换
请编制函数READDAT()实现从文件IN.DAT中读取100个十六进制数到字符串数组xx
中;再编制函数H16TO8(),将xx中的十六进制数转换成八进制数并把已转换的八进制数仍
存放在字符串数组XX中,最后调用函数WRITEDAT()把结果输出到OUT.DAT文件中.
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开(每个数均大于0且小于等于
2000).
#include
#include
#include
#include
#define MAX 100

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;iif(ReadDat())
{printf("Can't open the data file in.dat!\007\n") ;
return;
}
H16to8();
WriteDat();
}

void WriteDat(void)
{
FILE *fp;
int i;

fp=fopen("out.dat", "w") ;
for(i=0;ifclose(fp) ;
}

/* 注:本题中用到函数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);
}
}

文章录入:xihuyu2000    责任编辑:ak47  
 版权声明
   如果本网站所转载内容不慎侵犯了您的权益,请与我们联系,我们将会及时处理。如转载本网内容,请注明出处。
 发表评论
关于本站 网站声明 广告服务  联系方式  付款方式  站内导航  客服中心  友情链接   
Copyright © 2004-2006 考试吧 (Exam8.com) All Rights Reserved 
中国科学院研究生院中关村园区(北京市海淀区)