一、替換字符
函數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;i
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:在ReadDat()函數中由于fgets()函數讀入數據時沒有讀入字符串結束符'\0',因
而用while()循環(huán)在xx數組每一行未尾將換行符'\n'替換成結束符'\0'。
編寫的函數如下:該函數的基本算法是——讓字符指針pf指向每一行的開頭然后逐一往
后移動,在移動過程中按要求進行轉換。*pf%2==0用于判斷是否為偶數。if()條件語
句用于控制不替代字符。
解法1:
void encryptChar()
{
int i;
char *pf;
for(i=0;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++) /*行循環(huán)*/
{strl=strlen(xx[i]); /*每行長度*/
half=strl/2;
for(j=0;j
{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;j
{
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;i
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;i
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;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;m
}
fclose(rf);
fclose(wf);
}
--------------------------------------------------------------------------------
注:太簡單。
void num(int m,int k,int xx[])
{
int i,j=0;
i=m+1;
while(j
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;i
{
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;i
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
if(feof(fp)) break;
}
fclose(fp) ;
return 0 ;
}
void Compute(void)
{
int i,yy[1000];
for(i=0;i
if(xx[i]%2)
odd++;
else
even++;
}
aver/=(odd+even);
for(i=0;i
}
八、數字或字符移位后的計算
已知在文件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;i
{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,若是則跳出循環(huán)。亦是較簡單。*/
void calvalue(void)
{
int i,data;
for(i=0;i
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;i
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;i
*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
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}
/* 注:題目要求的字符串中所有小寫字母o左邊的字符串內容移到該串的右邊存放,即
將串中“最后”一個字母o左右兩側的內容互換。題中第一個while()特環(huán)的作用是讓p1
指向最后一個字母'o'。第一個ctrcat()函數的作用是將p1以后的字符都放到新串t中
,第二個strcat()函數的作用是將p1以前的字符連接到新串t的后面(注意:在些之前要
讓p1所指的單元成為p1前面字符串的結束位置*p1='\0')。這時完成左右互換。最后
一個while()循環(huán)的作用是刪除新串中的所有小寫字母'o',采用的刪除方法是不是'
o'的字母一律留下,否則不留(即相當于刪除。)*/
void StrOR(void)
{
int i;
char *p1,*p2,t[80];
for(i=0;i
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()來統(tǒng)計每個人的選票數并把票數依次存入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()循環(huán)是用來一張
一張選票地數。在循環(huán)內的第一個for()循環(huán)用來數一張選票中共選了幾個人,第二個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的報數,如此進行下去直到所有的人都出圈為止,F要求按出圈次序,每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()循環(huán)是先對數組p賦初值。在第二個for()中用i來控制沒出圈的
總人數,s1=(s1+m-1)%i的作用是找出報數后出圈人的下標,其中對i求余的作用是使報
數按圈進行(即報到尾后又從頭報),該算法在很多題目中都用到。由于求余的作用當
報數正好到最后一個時s1為0,故而要進行if(s1==0)的判斷。內嵌的for()循環(huán)是將出圈
以后的人依次往前移。*/
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;i
{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;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);
}
}