阅读新闻

2006版三级C语言100集

[日期:2006-12-21] 来源:www.ncre100.com  作者:admin [字体: ]

2006版三级C语言100集

1题 函数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<MAXLINE;I++){
printf(\"%s\\n\",xx[i]);
fprintf(fp,\"%s\\n\",xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:在ReadDat()函数中由于fgets()函数读入数据时没有读入字符串结束符'\0',因
而用while()循环在xx数组每一行未尾将换行符'\n'替换成结束符'\0'。
编写的函数如下:该函数的基本算法是——让字符指针pf指向每一行的开头然后逐一往
后移动,在移动过程中按要求进行转换。*pf=*pf/2*2用于判断是否为偶数。if()条件语
句用于控制不替代字符。
void encryptChar()
{
int i;
char *pf;
for(i=0;i<MAXLINE;I++)
{pf=xx[i];
while(*pf!=0)
{if(*pf==*pf/2*2||*pf*11%256<32)
{pf++;continue;}
*pf=*pf*11%256;
pf++;
}
}
}
void encryptChar()
{
int i,j,t;
for(i=0;i<MAXLINE;I++)
{
for(j=0;j<STRLEN(XX[I]);J++)
{
t=xx[i][j]*11%256;
if(t<=32 || xx[i][j]%2==0) continue;
xx[i][j]=t;
}
}
}
2题 函数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;j<HALF-1;J++)
for(k=j+1;k<HALF;K++)
if(xx[i][j]>xx[i][k])
{ch=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
for(k=j+1;k
if(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;
}
}
}
3题 函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS8.DAT中。
  替代关系:f(p)=p*11 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的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(\"ps8.dat\",\"w\");
for(i=0;i<MAXLINE;I++){
printf(\"%s\\n\",xx[i]);
fprintf(fp,\"%s\\n\",xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:与题1相似。
void encryptchar()
{
int i;
char *pf;
for(i=0;i<MAXLINE;I++)
{pf=xx[i];
while(*pf!=0)
{if(*pf>='a'&&*pf<='z'||*pf*11%256<32)
{pf++;continue;}
*pf=*pf*11%256;
pf++;
}
}
}
void encryptChar()
{
int i,j,t;
for(i=0;i<MAXLINE;I++)
{
for(j=0;j<STRLEN(XX[I]);J++)
{
t=xx[i][j]*11%256;
if(t<=32 || xx[i][j]>='a' && xx[i][j]<='z') continue;
xx[i][j]=t;
}
}
}
4题 函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(第行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。
  条件:从字符串中间一分为二,左边部分按字符的ASCII值降序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。
  例如:位置   0 1 2 3 4 5 6 7 8
     源字符串 a b c d h g f e
1 2 3 4 9 8 7 6 5
则处理后字符串 h g f e d c b a
8 7 6 5 9 4 3 2 1
  部分源程序已给出。
  请勿改动主函数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);
}
--------------------------------------------------------------------------------
注:该题采用插入法实行降序排序,其它与题2相似。
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=1;j<HALF;J++)
{ch=x[i][j];
k=j-1;
while((k>=0)&&(ch>xx[i][k]))
{xx[i][k+1]=xx[i][k];
k--;
}
xx[i][k+1]=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
for(k=j+1;k
if(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;
}
}
}
5题 函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS6.DAT中。
  替代关系:f(p)=p*11 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或f(p)对应的字符是数字0至9,则该字符不变,否则将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(\"ps6.dat\",\"w\");
for(i=0;i<MAXLINE;I++){
printf(\"%s\\n\",xx[i]);
fprintf(fp,\"%s\\n\",xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:与题1相似。只是它要求对f(p)进行判断。
void encryptchar()
{
int i;
char *pf;
for(i=0;i<MAXLINE;I++)
{pf=xx[i];
while(*pf!=0)
{if(*pf*11%256>='0'&&*pf*11%256<='9'||*pf*11%256<32)
{pf++;continue;}
*pf=*pf*11%256;
pf++;
}
}
}
_________________________________
本人只是为了上机能通过,不追求什么算法速度,答案仅供大家参考,我9号长春上机。(tonggu)
void encryptChar()
{
int i,j,strl;
int t;
for (i=0;i<MAXLINE;I++)
{
strl=strlen(xx[i]);
for(j=0;j<STRL;J++)
{
t=xx[i][j]*11%256;
if (t<=32 || t>='0' && t<= '9')
continue;
xx[i][j]=t;
}
}
}
6题 函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(第行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。
  条件:从字符串中间一分为二,左边部分按字符的ASCII值降序排序,右边部分按字符的ASCII值升序排序。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上。
  例如:位置   0 1 2 3 4 5 6 7 8
     源字符串 a b c d h g f e
1 2 3 4 9 8 7 6 5
则处理后字符串 d c b a e f g h
4 3 2 1 9 5 6 7 8
  部分源程序已给出。
  请勿改动主函数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);
}
--------------------------------------------------------------------------------
注:要注意当要进行右半部分排序时,一定要判断原字符串个数是否为奇数,若是则要
half加1,本题对右半部分采用选择法对其进行升序排序。
void jsSort()
{
int i,strl,half,j,k,p;
char ch;
for(i=0;i<20;i++)
{strl=strlen(xx[i]);
half=strl/2;
for(j=0;j<HALF-1;J++)
for(k=j+1;k<HALF;K++)
if(xx[i][j]<XX[I][K])
{ch=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=ch;
}
if(strl%2) half++; /* Must to note the order line! */
for(j=half;j<STRL;J++)
{p=j;
for(k=j;k<STR;K++)
if(xx[i][k]<XX[I][P])
p=k;
ch=xx[i][j];xx[i][j]=xx[i][p];xx[i][p]=ch;
}
}
void jsSort()
{
int i,j,k,strl;
char ch;
for(i=0;i<20;i++)
{
strl=strlen(xx[i]);
for(j=0;j
for(k=j+1;k
if(xx[i][j]<XX[I][K])
{
ch=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=ch;
}
for(j=(strl+1)/2;j<STRL;J++)
for(k=j+1;k<STRL;K++)
if(xx[i][j]>xx[i][k])
{
ch=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=ch;
}
}
}
7题 函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS4.DAT中。
  替代关系:f(p)=p*11 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或f(p)对应的字符是大写字母,则该字符不变,否则将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(\"ps4.dat\",\"w\");
for(i=0;i<MAXLINE;I++){
printf(\"%s\\n\",xx[i]);
fprintf(fp,\"%s\\n\",xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:下题1相似,只是它要求对f(p)进行判断。
void encryptchar()
{
int i;
char *pf;
for(i=0;i<MAXLINE;I++)
{pf=xx[i];
while(*pf!=0)
{if(*pf*11%256>='A'&&*pf*11%256<='Z'||*pf*11%256<32)
{pf++;continue;}
*pf=*pf*11%256;
pf++;
}
}
}
void encryptChar()
{
int i,j,t;
for(i=0;i<MAXLINE;I++)
{
for(j=0;j<STRLEN(XX[I]);J++)
{
t=xx[i][j]*11%256;
if(t<=32 || t>='A' && t<='Z') continue;
xx[i][j]=t;
}
}
}
8题 在文件中有200个正整数,且每个数均在1000至9999之间。函数ReadDat()读取这200个数存放到数组aa中。请编制函数jsSort(),其函数的功能是:要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数依次存入数组b中,如果后三位的数值相等,则按原先的数值进行降序排列。最后调用函数WriteDat()把结果bb输出到文件out.dat中。
例:处理前 6012 5099 9012 7025 8088
处理后 9012 6012 7025 8088 5099
部分源程序已给出。
  请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include
#include
#include
int aa[200],bb[10];
void jsSort()
{
}
void main()
{
readDat();
jsSort();
writeDat();
}
readDat()
{
FILE *in;
int i;
in=fopen(\"in.dat\",\"r\");
for(i=0; i<200; i++) fscanf(in,\"%d\",&aa[i]);
fclose(in);
}
writeDat()
{
FILE *out;
int i;
clrscr();
out=fopen(\"out.dat\",\"w\");
for(i=0; i<10; i++){
printf(\"i=%d,%d\\n\",i+1,bb[i]);
fprintf(out,\"%d\\n\",bb[i]);
}
fclose(out);
}
--------------------------------------------------------------------------------
注:每个元素对1000求余得到后三位的数,然后用冒泡法进行排序。
void jsSort()
{
int i,j,data;
for(i=0;i<199;i++)
for(j=i+1;j<200;j++)
{if(aa[i]%1000>aa[j]%1000)
{data=aa[i];
aa[i]=aa[j];
aa[j]=data;
}
else
if(aa[i]%1000==aa[j]%1000)
if(aa[i]<AA[J])
{data=aa[i];
aa[i]=aa[j];
aa[j]=data;
}
}
for(i=0;i<10;i++)
bb[i]=aa[i];
}
9题 函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS2.DAT中。
  替代关系:f(p)=p*13 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或其ASCII值是偶数,则该字符不变,否则将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(\"ps2.dat\",\"w\");
for(i=0;i<MAXLINE;I++){
printf(\"%s\\n\",xx[i]);
fprintf(fp,\"%s\\n\",xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:与题1相似。
void encryptchar()
{
int i;
char *pf;
for(i=0;i<MAXLINE;I++)
{pf=xx[i];
while(*pf!=0)
{if(*pf%2==0||*pf*13%256<32)
{pf++;continue;}
*pf=*pf*11%256;
pf++;
}
}
}
void encryptChar()
{
int i,j,t;
for(i=0;i<MAXLINE;I++)
{
for(j=0;j<STRLEN(XX[I]);J++)
{
t=xx[i][j]*13%256;
if(t<=32 || t%2==0) continue;
xx[i][j]=t;
}
}
}
10题 在文件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];
for(i=0;i<K-1;I++)
for(j=i+1;j<K;J++)
if((bb[i].x1+bb[i].x3)<(bb[j].x1+bb[j].x3))
{
swap=bb[i];
bb[i]=bb[j];
bb[j]=swap;
}
return k;
}
11题 已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)四部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT10.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(\"OUT10.DAT\",\"w\");
for(i=0;i<100;i++){
fprintf(fp,\"%s %s %4d %5d %101d\\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<MAX-1;I++)
for(j=0;j<MAX-1-I;J++)
{ if(strcmp(sell[j].dm,sell[j+1].dm)<0)
{swap=sell[j];
sell[j]=sell[j+1];
sell[j+1]=swap;
}
if(strcmp(sell[j].dm,sell[j+1].dm)==0&&sell[j].je<SELL[J+1]
.je)
{
swap=sell[j];
sell[j]=sell[j+1];
sell[j+1]=swap;
}
}
}
12题 函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(第行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串变量的下标为奇数的字符按其ASCII值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。
  例如:位置   0 1 2 3 4 5 6 7 
     源字符串 h g f e d c b a
则处理后字符串 h a f c d e b g
  部分源程序已给出。
  请勿改动主函数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;
out=fopen(\"out.dat\",\"w\");
clrscr();
for(i=0;i<20;i++){
printf(\"%s\\n\",xx[i]);
fprintf(out,\"%s\\n\",xx[i]);
}
fclose(out);
}
--------------------------------------------------------------------------------
注:该题亦是采用冒泡法,但在写法上与11题不同。
void jsSort()
{
int i,j,k,strl;
char temp;
for(i=0;i<20;i++)
{
strl=strlen(xx[i]);
for(k=1;k
for(j=k+2;j
if(xx[i][k]>xx[i][j])
{
temp=xx[i][k];
xx[i][k]=xx[i][j];
xx[i][j]=temp;
}
}
}
void jsSort()
{
int i,j,k,strl;
char ch;
for(i=0;i<20;i++)
{
strl=strlen(xx[i]);
for(j=1;j
for(k=j+2;k
if(xx[i][j]>xx[i][k])
{
ch=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=ch;
}
}
}
13题
已知在文件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 %101d\\n\", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:该题的冒泡法与11题不同。
void SortDat()
{
int i,j;
PRO swap;
for(i=0;i<MAX-1;I++)
for(j=i+1;j<MAX;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<SELL[J].JE)
{
swap=sell[i];
sell[i]=sell[j];
sell[j]=swap;
}
}
}
14题
请编写一个函数jsValue(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入数组xx传回。
最后调用函数writeDat()读取10组数据,分别得出结果且把结果输出到文件out.dat中。
例如:若输入17,5,则应输出:19,23,29,31,37。
请勿改动主函数main()和写函数writeDat()的内容。
#include
void jsValue(int m,int k,int xx[])
{
}
main()
{
int m,n,zz[100];
printr(\"\\n请输入两个整数:\");
scanf(\"%d%d\",&m,&n);
jsValue(m,n,zz);
for(m=0;m<N;M++)PRINTF(\"%D\",ZZ[M]);
printf(\"\\n\");
writeDat();
}
wtiteDat()
{
int m,n,zz[100],i;
FILE *.in,*out;
in=fopen(\"in.dat\",\"r\");
out=fopen(\"out.dat\",\"w\");
for(i=0;i<10;i++){
fscanf(in,\"%d%d\"&m,&n);
jsValue(m,n,zz);
for(m=0;m<N;M++)FPRINTF(OUT,\"%D\",ZZ[M]);
fprintf(out,\"\\n\");
}
fclose(in);
fclose(out);
}
--------------------------------------------------------------------------------
注:该题主要是对要素数方法的理解。
void jsvalue(int m,int k,int xx[])
{
int i,j,s=0;
for(i=m+1;k>0;i++)
{for(j=2;j<I;J++)
if(i%j==0) break;
if(i==j)
{xx[s++]=i;k--;}
}
}
15题
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)四部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT6.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(\"OUT6.DAT\",\"w\");
for(i=0;i<100;i++){
fprintf(fp,\"%s %s %4d %5d %101d\\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<MAX-1;I++)
for(j=i+1;j<MAX;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<SELL[J].JE)
{
swap=sell[i];
sell[i]=sell[j];
sell[j]=swap;
}
}
}
16题
下列程序的功能是:在三位整数(100至999)中寻找符合条件的整数并依次从小到大存入数组中;它既是完全平方数,又是两位数字相同,例如144、676等。
请编制函数实现此功能,满足该条件的整数的个数通过所编制的函数返回。
最后调用函数writeDat()把结果输出到文件out.dat中。
请勿改动主函数main()和写函数writeDat()的内容。
#include
int jsValue(int bb[])
{
}
main
{
int b[20],num;
num=jsValue(b);
writeDat(num,b);
}
writeDat(int num,int b[])
{
FILE *out;
int i;
out=fopen(\"out.dat\",\"w\");
fprintf(out,\"%d\\n\",num);
for(i=0;i<NUM;I++)PRINTF(OUT,\"%D\\N\",B[I]);
fclose(out);
}
--------------------------------------------------------------------------------
注:注意在i==(int)sqrt(i)*(int)sqrt(i)中只有当i是完全平方数时开平方后再取整才
不会丢失任何数据。
int jsvalue(int bb[])
{
int i,j,k=0,g,s,b;
for(i=100;i<=999;i++)
{
g=i%10;
s=i/10%10;
b=i/100;
if((i==(int)sqrt(i)*(int)sqrt(i))&&(g==s//s==b//b==g))
bb[k++]=i;
}
return k;
}
17题
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)四部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按金额从大到小进行排列,若金额相同,则按产品代码从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT4.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(\"OUT4.DAT\",\"w\");
for(i=0;i<100;i++){
fprintf(fp,\"%s %s %4d %5d %101d\\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<MAX-1;I++)
for(j=i+1;j<MAX;J++)
{
if(sell[i].je<SELL[J].JE)
{
swap=sell[i];
sell[i]=sell[j];
sell[j]=swap;
}
if(strcmp(sell[i].dm,sell[j].dm)<0&&sell[i].je==sell[j].je)
{
swap=sell[i];
sell[i]=sell[j];
sell[j]=swap;
}
}
}
18题 下列程序的功能是:将一正整数序列{K1,K2,...,K9}重新排列成一个新的序列。新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面)。要求编写函数jsValue()实现此功能,最后调用writeDat()函数所新序列输出到文件out.dat中。
说明:在程序中已给出了10个序列,每个序列有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。
例:序列{6,8,9,1,2,5,4,7,3}
经重排后成为{3,4,5,2,1,6,8,9,7}
部分源程序已给出。
请勿改动主函数main()和写函数writeDat()的内容。
#include
jsValue(int a[10][9])
{
}
main()
{
int a[10][9]={{6,8,9,1,2,5,4,7,3}
{3,5,8,9,1,2,6,4,7}
{8,2,1,9,3,5,4,6,7}
{3,5,1,2,9,8,6,7,4}
{4,7,8,9,1,2,5,3,6}
{4,7,3,5,1,2,6,8,9}
{9,1,3,5,8,6,2,4,7}
{2,6,1,9,8,3,5,7,4}
{5,3,7,9,1,8,2,6,4}
{7,1,3,2,5,8,9,4,6}
};
int i,j;
jsValue(a);
for(i=0;i<10;i++){
for(j=0;j<9;j++) {
printf(\"%d\",a[i][j]);
if(j<=7)printf(\",\");
}
printf(\"\\n\");
}
writeDat(a);
}
writeDat(int a[10][9])
{
FILE *fp;
int i,j;
fp=fopen(\"out.dat\",\"w\");
for(i=0;i<10;i++){
for(j=0;j<9;j++){
fprintf(fp,\"%d\",a[i][j]);
if(j<=7)fprintf(fp,\",\");
}
fprintf(fp,\"\\n\");
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:该题的算法是:从数列的最后一个数开始往前逐一移动直到完,在移动过程中与K1
进行比较,如有大小或等于K1的则进行调换。调换的方式是,第一次调换的数与原最后
一个数换,第二次调换的数与原倒数第二个数换,依次类推。
jsvalue(int a[10][9])
{
int value,i,j,k;
for(i=0;i<10;i++)
for(j=8,k=8;j>=0;j--)
if(a[i][j]>=a[i][0])
{value=a[i][k];
a[i][k--]=a[i][j];
a[i][j]=value;
}
}
19题 已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)四部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按金额从小到大进行排列,若金额相同,则按产品代码从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT2.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(\"OUT2.DAT\",\"w\");
for(i=0;i<100;i++){
fprintf(fp,\"%s %s %4d %5d %101d\\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<MAX-1;I++)
for(j=i+1;j<MAX;J++)
{
if(sell[i].je>sell[j].je)
{
swap=sell[i];
sell[i]=sell[j];
sell[j]=swap;
}
if(strcmp(sell[i].dm,sell[j].dm)<0&&sell[i].je==sell[j].je)
{
swap=sell[i];
sell[i]=sell[j];
sell[j]=swap;
}
}
}
20题 某级数的前两项A1=1,A2=1,以后各项具有如下关系:
An=An-2+2An-1
下列程序的功能是:要求依次对于整数M=100,1000和10000求出对应的n值,使其满足:Sn=M,这里
  Sn=A1+A2+...+An,
并依次把n值存入数组单元b[0],b[1]和b[2]中,请编制jsValue()函数来实现此功能, 最后调用函数writeDat()把数组b[]中的值输出到out.dat文件中。
请勿改动主函数main()和写函数writeDat()的内容。
#include
int b[3]
jsValue()
{
}
main()
{
jsValue();
printf(\"M=100,n=%d\\nM=1000,n=%d\\nM=10000,n=%d\\n\",b[0],b[1],b[2]);
writeDat()
}
writeDat()
{
FILE *fp;
fp=fopen(\"out.dat\",\"w\");
fprintf(fp,\"%d\\n%d\\n%d\\n\",b[0],b[1],b[2]);
fclose(fp);
}
--------------------------------------------------------------------------------
注:在该题中主要就是要正确简捷的表示出各项的关系
jsvalue()
{
int a1=1,a2=1,a12,sn,k=2;
sn=a1+a2;
while(1)
{a12=a1+2*a2;
if(sn<100&&sn+a12>=100) b[0]=k;
if(sn<1000&&sn+a12>=1000) b[1]=k;
if(sn<10000&&sn+a12>=10000) {b[2]=k;break;}
sn=sn+a12;
a1=a2;
a2=a12;
k++;
}
}
21题
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存 入到字符串数组xx中,请编制函数CharConvA(),其函数的功能是:以行为单位把字符串中的最后一个字符的ASCII值右移4位后加最后第二个字符的ASCII值,得到最后一个新的字符,最后第二个字符的ASCII值右移4位后加最后第三个字符的ASCII值,得到最后第二个新的字符,依此类推一直处理到第二个字符,第一个字符的ASCII值加原最后一个字符的ASCII值,得到第一个新的字符,得到的新字符分别存放在原字符串对应的位置上。最后已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT10.DAT中。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序已给出。
请勿改动主函数main()和写函数writeDat()的内容。
#include
#include
#include
char xx[50][80];
int maxline=0;/*文章的总行数*/
int ReadDat(void)
void WriteDat(void)
void CharConvA()
{
}
void main()
{
clrscr();
if(ReadDat()){
printf(\ 数据文件ENG.IN不能打开!\\n\\007\ );
return;
}
CharConvA();
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(\ OUT10.DAT\ ,\ w\ );
for(i=0;i<MAXLINE;I++){
printf(\ %s\\n\ ,xx[i]);
fprintf(fp,\ %s\\n\ ,xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:在该题中主要是控制好每一个字符的走动,由于最后要用到原来的最后一个字符故
先将其存入一个字符变量中。
void CharConvA(void)
{
int i,j,strl;
char ch;
for(i=0;i<MAXLINE;I++)
{strl=strlen(xx[i]);
ch=xx[i][strl-1];
for(j=strl-1;j>0;j--)
{xx[i][j]>>=4;
xx[i][j]+=xx[i][j-1];
}
xx[i][0]+=ch;
}
}
22题 下列程序的功能是:找出所有100以内(含100)满足I,I+4,I+10都是素数的整数I(I+10也在100以内)的个数cnt以及这些I之和sum。请编写函数countValue()实现程序要求,最后调用函数writeDat()把结果cnt和sum输出到文件out.dat中。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include
int cnt,sum;
int isPrime(int number)
{
int i,tag=1;
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();
}
writeDat()
{
FILE *fp;
fp=fopen(\ out.dat\ ,\ w\ );
fprintf(fp,\ %d\\n%d\\n\ ,cnt,sum);
fclose(fp);
}
--------------------------------------------------------------------------------
注:该题是较简单的编程题之一,只要注意在for()循环中i不能大于90(由于要求I+10
也要100内)即可。
void countvalue()
{
int i,j;
for(i=1;i<=90;i++)
if(isprime(i)&&isprime(i+4)&&isprime(i+10))
{cnt++;
sum+=i;
}
}
23题 函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrCharJR(),其函数的功能是:以行为单位把字符串中所有字符的ASCII值右移4位,然后把右移后的字符ASCII值再加上原字符的ASCII值,得到新的字符仍存入原字符串对应的位置上。最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT8.DAT中。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。 #include
#include
#include
char xx[50][80];
int maxline=0;/*文章的总行数*/
int ReadDat(void)
void WriteDat(void)
void StrCharJR()
{
}
void main()
{
clrscr();
if(ReadDat()){
printf(\ 数据文件ENG.IN不能打开!\\n\\007\ );
return;
}
StrCharJR();
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(\ OUT8.DAT\ ,\ w\ );
for(i=0;i<MAXLINE;I++){
printf(\ %s\\n\ ,xx[i]);
fprintf(fp,\ %s\\n\ ,xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:这个编程题比二级考得还简单。
void StrCharJR(void)
{
int i,j;
for(i=0;i<MAXLINE;I++)
for(j=0;xx[i][j]!='\0';j++)
xx[i][j]+=xx[i][j]>>4;
}
24题 下列程序的功能是:已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a数组中。找出成绩最低的学生记录(假定最低成绩的记录是唯一的),通过形参返回。请编写函数mm(STU a[],STU *s)实现程序要求,最后调用函数reawriteDAT()把结果输出到文件out.dat中。
例如: KS01 87
KS09 67
KS11 97
则调用该函数后,输出The lowest:KS19,67
请勿改动主函数main()和输出数据函数readwriteDAT()的内容。 #include
#include
#include
#define N 10
void readwriteDAT();
typedef struct ss
{char num[10]; int s;}STU;
mmm(STU a[],STU *s)
{
}
main()
{
STU a[N]={ {\ A01\ ,81}{\ A02\ ,89}{\ A03\ ,66}{\ A04\ ,87}{\ A05\ ,77}
{\ A06\ ,90}{\ A07\ ,79}{\ A08\ ,61}{\ A9\ ,80}{\ A10\ ,71}},m;
int i;
clrscr();
printf(\ ***** The original data *****\\n\ );
for(i=0;i
mmm(a,&m);
printf(\ ***** THE RESULT *****\\n\ );
printf(\ The lowest:%s,%d\\n\ ,m.num,m.s);
readwriteDAT();
}
viod 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);
mm(a,&m);
fprintf(wf,\ The lowest:%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<N;I++)
if(a[i].ss)
*s=a[i];
}
25题 函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrOL(),其函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT6.DAT中。
例如:原文:You He Me
I am a student.
     结果:Me He You
student a am I
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。 #include
#include
#include
#include
char xx[50][80];
int maxline=0;/*文章的总行数*/
int ReadDat(void)
void WriteDat(void)
void StrOL(void)
{
}
void main()
{
clrscr();
if(ReadDat()){
printf(\ 数据文件ENG.IN不能打开!\\n\\007\ );
return;
}
StrOL();
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;
clrscr();
fp=fopen(\ OUT6.DAT\ ,\ w\ );
for(i=0;i<MAXLINE;I++){
printf(\ %s\\n\ ,xx[i]);
fprintf(fp,\ %s\\n\ ,xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:该题的主要算法是先让两字符指针都指向串尾,然后使一指针(p1)往前移动,当
出现不是字母时则表示在p1+1与p2之间是一个单词,并将该单词存入一变量(t1),最后
将t1连接到新串中(t);接着再往前找第二个单词,依次类推直到字符串头。由此可知
新串就是原串中各单词的倒排。
void Str0L(void)
{
int i,k;
char *p1,*p2;
char t[80],t1[80];
for(i=0;i<MAXLINE;I++)
{p2=p1=strchr(xx[i],'\0')-'\0';
t[0]=t1[0]='\0';
k=1;
while(k)
{
while(isalpha(*p1)==0&&p1!=xx[i]) {p1--;p2=p1;}
while(isalpha(*p1)&&p1>=xx[i]) p1--;
memcpy(t1,p1+1,p2-p1);
t1[p2-p1]=0;
strcat(t,t1);
strcat(t," ");
if(p1 }
strcpy(xx[i],t);
}
}
26题 下列程序的功能是:求出ss字符串中指定字符c的个数,并返回此值。请编写函数int num(*char ss,char c)实现程序要求,最后调用函数readwriteDat()把结果输出到文件out.dat中。
(注:大小写字母有区别)
例如,若输入字符串ss=\ 123412132\ ,c='1',则输出3。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。 #include
#include
#define M 81
void readwriteDAT();
int num(char *ss,char c)
{
}
main()
{
char a[M],ch;
clrscr();
printf(\ \\nPlease enter a string:\ );gets(a);
printf(\ \\nPlease enter a char;\ );ch=getchar();
printf(\ \\nThe number of the char is:%d\\n\ ,num(a,ch));
readwriteDAT();
}
viod readwriteDAT()
{
int i;
FILE *rf,*wf;
char a[M],b[M],ch;
rf=fopen(\ in.dat\ ,\ r\ );
wf=fopen(\ out.dat\ ,\ w\ );
for(i=0;i<10;i++){
fscanf(rf,\ %s\ ,a);
fscanf(rf,\ %s\ ,b);
ch=*b;
fprintf(wf,\ %c=%d\\n\ ,ch,num(a,ch));
}
fclose(rf);
fclose(wf);
}
--------------------------------------------------------------------------------
注:太简单了。
int num(char *ss,char c)
{
int i=0;
while(*ss!=0)
if(*ss++==c) i++;
return i;
}
27题 函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数ConverCharD(),其函数的功能是:以行为单位把字符串中的所有小写字母改写成该字母的上一个字母,如果是字母a,则改写成字母z。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT4.DAT中。
例:原文:Adb.Bcdza
abck.LLhj
结果:Aca.Bbcyz
zabj.LLgi
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。 #include
#include
#include
char xx[50][80];
int maxline=0;/*文章的总行数*/
int ReadDat(void)
void WriteDat(void)
void ConverCharD(void)
{
}
void main()
{
clrscr();
if(ReadDat()){
printf(\ 数据文件ENG.IN不能打开!\\n\\007\ );
return;
}
ConverCharD();
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(\ OUT4.DAT\ ,\ w\ );
for(i=0;i<MAXLINE;I++){
printf(\ %s\\n\ ,xx[i]);
fprintf(fp,\ %s\\n\ ,xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:*(p-1)=(*(p-1)-'a'+26-1)%26+'a' 该表达式是求出小写字母*(p-1)的前一个
字母的算法。如果是求大写字母则将'a'改成'A'即可,如果是求前4个字母(a换成
w等)则将-1改成-4,如果是求后面的字母则将减号改成加号即可。在该题中由于while
(*p++)判断完后p向后移动一个字符,因而在if()中要用*(p-1)转换前一个字符。
void convertchard(void)
{
char *p;
int i;
for(i=0;i<MAXLINE;I++)
{p=xx[i];
while(*p++)
if(islower(*(p-1))) *(p-1)=(*(p-1)-'a'+26-1)%26+'a';
}
}
28题 下列程序的功能是:将大于整数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<M;I++)
if(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;m<N;M++)
printf(\ %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;m
fprintf(wf,\ \\n\ );
}
fclose(rf);
fclose(wf);
}
--------------------------------------------------------------------------------
注:太简单。
void num(int m,int k,int xx[])
{
int i=0;
for(m=m+1;k>0;m++)
if(isp(m))
{xx[i++]=m;
k--;
}
}
29题 函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数SortCharD(),其函数的功能是:以行为单位对字符按从大到小的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT2.DAT中。
例:原文:dAe,BfC.
CCbbAA
结果:fedCBA.
bbCCAA
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。 #include
#include
#include
char xx[50][80];
int maxline=0;/*文章的总行数*/
int ReadDat(void)
void WriteDat(void)
void SortCharD(void)
{
}
void main()
{
clrscr();
if(ReadDat()){
printf(\ 数据文件ENG.IN不能打开!\\n\\007\ );
return;
}
SortCharD();
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(\ OUT2.DAT\ ,\ w\ );
for(i=0;i<MAXLINE;I++){
printf(\ %s\\n\ ,xx[i]);
fprintf(fp,\ %s\\n\ ,xx[i]);
}
fclose(fp);
}
--------------------------------------------------------------------------------
注:该题采用的是起(冒)泡法进行排序。
void sortchard(void)
{
int i,j,k,strl;
char ch;
for(i=0;i<MAXLINE;I++)
{strl=strlen(xx[i]);
for(j=0;j<STRL-1;J++)
for(k=0;k<STRL-1-I;K++)
if(xx[i][k]<XX[I][K+1])
{ch=xx[i][k];
xx[i][k]=xx[i][k+1];
xx[i][k+1]=ch;
}
}
}
30题 下列程序的功能是:把s字符串中的所有字母改写成该字母的下一个字符,字母z改写成字母a。要求大写字母仍为大写字母,小写字母仍为小写字母,其他字符不做改变。请编写函数chg(char *s)实现程序的要求,最后调用函数readwriteDat()把结果输出到文件out.dat中。
例如:s字符串中原有的内容为:Mn.123Zxy,则调用该函数后,结果为No.123Ayz。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。 #include
#include
#include
#include
#define N 81
void readwriteDAT();
void chg(char *s)
{
}
main()
{
char a[N];
clrscr();
printf(\ Enter a string:\ );gets(a);
printf(\ The original string is;\ );puts(a);
chg(a);
printf)(\ The string after modified:\ );
puts(a);
readwriteDAT();
}
viod readwriteDAT()
{
int i;
char a[N];
FILE *rf,*wf;
rf=fopen(\ in.dat\ ,\ r\ );
wf=fopen(\ out.dat\ ,\ w\ );
for(i=0;i<10;i++){
fscanf(rf,\ %s\ ,a);
chg(a);
fprintf(wf,\ %s\\n\ ,a);
}
fclose(rf);
fclose(wf);
}
--------------------------------------------------------------------------------
注:该题的思路比较明显,先判断是否是'z'或'Z',若是则转成相应的'a'或'A
',否则再判断是不是字母(已除'z'或'Z')。
void chg(char *s)
{
int i,j,k;
k=strlen(s);
for(i=0;i<K;I++)
{if(s[i]=='z'//s[i]=='Z' )
s[i]-=25;
else
if(isalpha(s[i]))
s[i]+=1;
}
}
31题 已知数据文件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;
}
32题 现有一个10个人100行的选票数据文件IN.DAT,其数据存放的格式是每条记录的长度均为10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,依此类推 :内容均为字符0和1,1表示此人被选中,0表示此人未被选中,若一张选票人数小于等于5个人时被认为无效的选票。给定函数ReadDat()的功能是把选票数据读入到字符串数组xx中。请编制函数CountRs()来统计每个人的选票数并把得票数依次存入yy[0]到yy[9]中。把结果yy输出到文件OUT.DAT中。
部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。 #include
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()){
printf(\ 选票数据文件IN.DAT不能打开!\\n\\007\ );
return;
}
CountRs();
WriteDat();
}
int ReadDat(void)
{
FILE *fp;
int i;
if((fp=fopen(\ IN.DAT\ ,\ r\ ))==NULL) return 1;
for(i=0;i<10;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人的选票视为无效票,即一张选票中如果‘1’不超
过5个则为无效选票。该题先用for()循环对100行选票进行循环,在循环内先进行用for
()循环数出这张选票中选中的人数(count)再用if()判断,如果选中人数小于等于5则c
ontinue即判断下一张选票,否则用内嵌的for()对行内的数据进行判断,注意如果数据
为‘1’时才对对应的人增加1。*/
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;xx[i][j];j++)
if(xx[i][j]=='1') yy[j]++;
}
}
33题 已知数据文件IN.DAT中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加百位数等于十位数上的数加个位数上的数的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及不满足此条件的四位数平均值pjz2,最后调用写函数writeDat()把结果输出到OUT.DAT文件。
例如:7153,7+1=5+3,则该数满足条件计算平均值pjz1,且个数cnt=cnt+1。8129,8+1<>2+9,则该数不满足条件计算平均值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);
}
--------------------------------------------------------------------------------
/* 注:与题31相似。*/
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+b)==(s+g)) {cnt++;pjz1+=a[i];}
else {k++;pjz2+=a[i];}
}
pjz1/=cnt;
pjz2/=k;
}
34题 设有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;j<I;J++)
p[j-1]=p[j];
p[i-1]=w;
}
}
35题 已知数据文件IN.DAT中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数减百位数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及不满足此条件的四位数平均值pjz2,最后调用写函数writeDat()把结果输出到OUT.DAT文件。
例如:9123,9-1-2-3>0,则该数满足条件计算平均值pjz1,且个数cnt=cnt+1。9812,9-8-1-2<0,则该数不满足条件计算平均值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);
}
--------------------------------------------------------------------------------
/* 注:参考题31。*/
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-b-s-g>0) {cnt++;pjz1+=a[i];}
else {k++;pjz2+=a[i];}
}
pjz1/=cnt;
pjz2/=k;
}
36题 请编制函数ReadDat()实现从文件IN.DAT中读取1000个十进制整数到数组xx中;请编制函数Compute()分别计算出xx中奇数的个数odd,奇数的平均值ave1,偶数的平均值ave2以及所有奇数的方差totfc的值,最后调用函数WriteDat()把结果输出到OUT.DAT文件中。
计算方差的公式如下:
N 2
totfc=1/N∑(xx[i]-ave1)
i=1
设N为奇数的个数,xx[i]为奇数,ave1为奇数的平均值。
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开。(每个数均大于0且小于等于2000)
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。 #include
#include
#include
#define MAX 1000
int xx[MAX], odd=0,even=0;
double ave1=0.0,ave2=0.0,totfc=0.0;
void WriteDat(void);
int ReadDat(viod)
{
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(\ 数据文件IN.DAT不能打开!\\007\\n\ );
return;
}
Compute()
printf(\ ODD=%d\\nOVEN=%d\\nAVER=%1f\\nTOTFC=%lf\\n\ ,odd,ave1,ave2,totfc);
writeDat();
}
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen(\ OUT.DAT\ ,\ w\ );
fprintf(fp,\ %d\\n%lf\\n%lf\\n%lf\\n\ ,odd,ave1,ave2,totfc);
fclose(fp);
}
--------------------------------------------------------------------------------
/* 注:注意该题还要编制读函数readdat(),在读函数中格式输入符的一定要加逗号。
在compute()函数中算方差的方式也要注意哦!*/
int ReadDat(void)
{
FILE *fp ;
int i;
if((fp=fopen("in.dat","r"))==NULL) return 1;
for(i=0;i<MAX;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<MAX;I++)
if(xx[i]%2)
{odd++;
ave1+=xx[i];
yy[odd-1]=xx[i];
}
else
{even++;
ave2+=xx[i];
}
ave1/=odd;
ave2/=even;
for(i=0;i<ODD;I++)
totfc+=(yy[i]-ave1)*(yy[i]-ave1)/odd;
}
37题 已知数据文件IN.DAT中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序,最后调用写函数writeDat()把结果输出到OUT.DAT文件。
例如:5591是素数,则该数满足条件存入数组b中,且个数cnt=cnt+1。
9812是非素数,则该数不满足条件忽略。
部分源程序已给出。
程序中已定义数组:a[300],b[300],已定义变量:cnt
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。 #include
int a[300],b[300],cnt=0;
int isP(int m){
int i;
for(i=2;i<M;I++)
if(m%i==0)return 0;
return 1;
}
jsValue()
{
}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf(\ cnt=%d\\n\ ,cnt);
for(i=0;i
}
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\ ,cnt);
for(i=0,i
fclose(fp);
}
--------------------------------------------------------------------------------
/*注:由于原题中已给出判断素数的函数isP()故可直接使用它,本题中对数组b的排序
采用插入法。*/
jsvalue()
{
int i,j,temp;
for(i=0;i<300;i++)
if(isP(a[i])) b[cnt++]=a[i];
for(i=1;i<CNT;I++)
{temp=b[i];
j=i-1;
while(j>=0&&temp<B[J])
b[j+1]=b[j--];
b[j+1]=temp;
}
}
38、请编制函数readdat()实现从文件in.dat中读取100个十六进制数到字符串数组xx中
;再编制函数h16to2(),将xx中的十六进制数转换成二进制数并把已转换的二进制数仍
存放在字符串数组xx,最后调用函数writedat()把结果输出到out.dat文件中。
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开。(每个数均大于0且小于
等于2000)
部分源程序已给出。
请勿改动主函数main()和输出数据函数writedat()的内容。
#include
#include
#include
#include
#define MAX 100
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 H16to2(void)
{
}
void main()
{
int i ;
for(i=0;i
if(ReadDat())
{printf("Can't open the data file in.dat!\007\n") ;
return;
}
H16to2();
WriteDat();
}
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen("out.dat", "w") ;
for(i=0;i
fclose(fp) ;
}
--------------------------------------------------------------------------------
/*注:注意该题要编写readdat()函数,其中函数itoa(data,yy,16)的作用是将整数dat
a转换成十六进制型式的字符串存入yy中,若要转成二进制型式的字符串则用itoa(data
,yy,2)。函数strtol(xx[i],NULL,16)的作用是将字符型转换成整型。*/
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 H16to2(void)
{
int i,data;
char yy[20];
for(i=0;i<100;i++)
{data=strtol(xx[i],NULL,16);
itoa(data,yy,2);
strcpy(xx[i],yy);
}
}
39题 已知数据文件IN.DAT中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出个位数上的数减千位数上的数减百位数上的数减十位数上的数大于零的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从大到小的顺序进行排序,最后调用写函数writeDat()把结果输出到OUT.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
int a[300],b[300],cnt=0;
jsValue()
{
}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf(\ cnt=%d\\n\ ,cnt);
for(i=0;i
}
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\ ,cnt);
for(i=0,i
fclose(fp);
}
--------------------------------------------------------------------------------
/* 注:该题与题37相似。*/
jsvalue()
{
int q,b,s,g,i,j,data;
for(i=0;i<300;i++)
{q=a[i]/1000;
b=a[i]/100%10;
s=a[i]/10%10;
g=a[i]%10;
if(g-q-b-s>0)
bb[cnt++]=a[i];
}
for(i=0;i<CNT-1;I++)
for(j=i+1;j<CNT;J++)
if(bb[i]<BB[J])
{data=bb[i];
bb[i]=bb[j];
bb[j]=data;
}
}
040题 请编制函数ReadDat()实现从文件IN.DAT中读取100个十六进制整数到数组xx中;请编制函数H16To10().将xx中的十六进制数转换成十进制数并把已转换的十进制数仍存放在字符串数组xx,最后调用函数WriteDat()把结果输出到OUT.DAT文件中。
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开。(每个数均大于0且小于等于2000)
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。 #include
#include
#include
#include
#define MAX 100
char xx[MAX][20]
void WriteDat(void)
int ReadDat(viod)
{
FILE *fp;
if((fp=fopen(\ IN.DAT\ ,\ r)==NULL) return 1;
fclose(fp);
return 0;
}
void H16To10(void)
{
}
void main()
{
int i;
for(i=0;i<MAX;I++)MEMSET(XX[I],0,20);
if(ReadDat()){
printf(\ 数据文件IN.DAT不能打开!\\007\\n\ );
return;
}
H16To10()
WriteDat()
}
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen(\ OUT.DAT\ ,\ w\ );
for(i=0;i
fclose(fp);
}
--------------------------------------------------------------------------------
/* 注:该题与题39相似,只是改变函数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 H16to10(void)
{
int i,data;
char yy[20];
for(i=0;i<100;i++)
{data=strtol(xx[i],NULL,16);
itoa(data,yy,10);
strcpy(xx[i],yy);
}
}
41、已知在文件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 if(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<MAXNUM;I++)
{if(!xx[i]) break;
if(xx[i]>0) totnum++;
data=xx[i]>>1;
if(data%2==0)
{totcnt++;
totpjz+=xx[i];
}
}
totpjz/=totcnt;
}
42、请编制程序,从文件in.dat中读取200个整数至数组xx中,不计数组xx中值最大和最
小的数(若有重复值,则都不计),再求出最大数max及最大数的个数cnt1、最小数min
及最小数的个数cnt2和所剩下200-cnt1-cnt2个数的算求平均值pj (保留2位小数)。
结果max,cnt1,min,cnt2,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
#include
#include
#define N 200
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp=fopen("in.dat","r");
for(i=0;i<20;i++)
{for(j=0;j<10;j++)
{fscanf(fp,"%d,",&xx[i*10+j]);
printf("%d ",xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
int cnt1,cnt2,xx[N],max,min;
float pj;
FILE *fw;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
printf("\n\nmax=%d,cnt1=%d,min=%d,cnt2=%d,pj=%6.2f\n",
max,cnt1,min,cnt2,pj);
fprintf(fw,"%d\n%d\n%d\n%d\n%6.2f\n",max,cnt1,min,cnt2,pj);
fclose(fw);
}
/* 注:该题是要在主函数中加程序行,注意本题要求去除最大和最小数后再求出去掉后
的最大数max和最小数min及相应的个数。因此程序中出现的max0和min0,用来标识所有
数中的最大数和最小数,后而求出次大数和次小数。在求max0和min0时一定要给max和m
in赋一个与max0和min0不同的数(该题用esle max=min=xx[i]),否则会出错。对于一个
浮点数要对其保留2位小数时,要将其乘100后转换成整数,最后再将其转换成浮点数然
后除100即可。*/
void main()
{
int cnt1,cnt2,xx[N],max,min;
float pj;
FILE *fw;
int i,max0,min0;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
max0=min0=xx[0];
pj=0;
cnt1=cnt2=0;
for(i=1;i<N;I++)
{if(max0 else if(min0>xx[i]) min0=xx[i];
else max=min=xx[i];
}
for(i=0;i<N;I++)
{if(max<XX[I]&&XX[I] if(min>xx[i]&&xx[i]>min0) min=xx[i];
}
for(i=0;i<N;I++)
if(xx[i]==max) cnt1++;
else if(xx[i]==min) cnt2++;
else pj+=xx[i];
pj=(float)((int)pj*100/(200-cnt1-cnt2))/100;
printf("\n\nmax=%d,cnt1=%d,min=%d,cnt2=%d,pj=%6.2f\n",
max,cnt1,min,cnt2,pj);
fprintf(fw,"%d\n%d\n%d\n%d\n%6.2f\n",max,cnt1,min,cnt2,pj);
fclose(fw);
}
43、请编写函数countvalue(),它的功能是:求n以内(不包括n)同时能被3和7整数的
所有自然数之和的平方根s,并作为函数值返回,最后结果s输出到文件out.dat中。
例如若n为1000时,函数值应为:s=153.909064。
部分源程序已给出。
请勿改动主函数main()和输入输出数据函数progreadwrite()的内容。
#include
#include
#include
double countvalue(int n)
{
}
main()
{
clrscr();
printf("s=%f\n",countvalue(1000));
progreadwrite();
}
progreadwrite()
{
FILE *fp,*wf;
int i,n;
float s;
fp=fopen("in.dat","r");
if(fp==NULL)
{printf("Can't open the data file in.dat\007\n");
return;
}
wf=fopen("out.dat","w");
for(i=0;i<10;i++)
{fscanf(fp,"%d",&n);
s=countvalue(n);
fprintf(wf,"%f\n",s);
}
fclose(fp);
fclose(wf);
}
/* 注:由于能同时被3和7整除的自然数最小的是21,而它们之间的间隔应是21(由最小
公倍数可得)。因而在for()循环可定成如下形式。*/
double countvalue(int n)
{
int i;
float s=0.0;
for(i=21;i
s+=i;
s=sqrt(s);
return s;
}
44、请编制程序,从文件in.dat中读取200个整数至数组xx中,不计数组xx绝对值最大的
数(若有重复值,则都不计),再求出绝对值最大数max及绝对值最大数的个数cnt和所
剩下200-cnt个数的算求平均值pj (保留2位小数)。
结果max,cnt1,min,cnt2,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
#include
#include
#define N 200
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp=fopen("in.dat","r");
for(i=0;i<20;i++)
{for(j=0;j<10;j++)
{fscanf(fp,"%d,",&xx[i*10+j]);
printf("%d ",xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
int cnt,xx[N],max;
float pj;
FILE *fw;
clrscr();
fw=fopen("out.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);
}
/* 注:该题的编程方法与题42相似。*/
void main()
{
int cnt,xx[N],max;
float pj;
FILE *fw;
int i,max0;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
max0=abs(xx[0]);
pj=0;
cnt=0;
for(i=1;i<N;I++)
if(max0 else max=abs(xx[i]);
for(i=0;i<N;I++)
if(abs(xx[i])<MAX0&&ABS(XX[I])>max) max=abs(xx[i]);
for(i=0;i<N;I++)
if(abs(xx[i])==max) cnt++;
else pj+=xx[i];
pj=(float)((int)pj*100/(200-cnt))/100;
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);
}
45、已知在文件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)
{
}
totpjz/=totcnt;
}
void main()
{
int i;
clrscr();
for(i=0;i if(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);
}
/* 注:该题与题41相似。*/
void calvalue(void)
{
int i,data;
for(i=0;i<MAXNUM;I++)
{if(!xx[i]) break;
if(xx[i]>0) totnum++;
data=xx[i]>>1;
if(data%2)
{totcnt++;
totpjz+=xx[i];
}
}
totpjz/=totcnt;
}
46、请编制程序,从文件in.dat中读取200个整数至数组xx中,求出奇数的个数cnt1和偶
数的个数cnt2以及数级xx下标为奇数的元素值的算术平均值pj(保留2位小数)。
结果cnt1,cnt2,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
#include
#include
#define N 200
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp=fopen("in.dat","r");
for(i=0;i<20;i++)
{for(j=0;j<10;j++)
{fscanf(fp,"%d,",&xx[i*10+j]);
printf("%d ",xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
int cnt1,cnt2,xx[N];
float pj;
FILE *fw;
clrscr();
fw=fopen("out.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);
}
/* 注:
void main()
{
int cnt1,cnt2,xx[N];
float pj;
FILE *fw;
int i,j=0;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
pj=0;
cnt1=cnt2=0;
for(i=0;i<N;I++)
{if(xx%2) cnt1++;
else cnt2++;
if(i%2) pj+=xx[i],j++;
}
pj=(float)((int)pj*100/j)/100;
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);
}
47、已知在文件in.dat中存有若干个(个数<200)四位数字的正整数,函数readdat
()读取这若干个正整数并存入数组xx中。请编制函数calvalue(),其功能要求:1、求出
这文件中共有多少个正整数totnum;2、求出这些数中的各位数字之和是偶数的数的个数
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 if(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);
}
/* 注:该题的关键在于会不会取出一个数的个、十、百、千位上的数。a[i]%10对10求
余结果为个位数,a[i]%100/10先对100求余得出后两位数然后再除10,由于为整数因此
得出上一个后两位数的第一位。依此类推。*/
void calvalue(void)
{
int i;
for(i=0;i<MAXNUM;I++)
{if(!xx[i]) break;
if(xx[i]>0) totnum++;
if((xx[i]/1000+xx[i]/100%10+xx[i]/10%10+xx[i]%10)/2==0)
{totcnt++;
totpjz+=xx[i];
}
}
totpjz/=totcnt;
}
48、请编制程序,从文件in.dat中读取200个整数至数组xx中,求出奇数的个数cnt1和偶
数的个数cnt2以及数级xx值为奇数的元素值的算术平均值pj(保留2位小数)。
结果cnt1,cnt2,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
#include
#include
#define N 200
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp=fopen("in.dat","r");
for(i=0;i<20;i++)
{for(j=0;j<10;j++)
{fscanf(fp,"%d,",&xx[i*10+j]);
printf("%d ",xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
int cnt1,cnt2,xx[N];
float pj;
FILE *fw;
clrscr();
fw=fopen("out.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);
}
/* 注:
void main()
{
int cnt1,cnt2,xx[N];
float pj;
FILE *fw;
int i;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
pj=0;
cnt1=cnt2=0;
for(i=0;i<N;I++)
if(xx[i]%2) {cnt1++;pj+=xx[i];}
else cnt2++;
pj=(float)((int)pj*100/cnt1)/100;
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);
}
49、已知在文件in.dat中存有若干个(个数<200)四位数字的正整数,函数readdat
()读取这若干个正整数并存入数组xx中。请编制函数calvalue(),其功能要求:1、求出
这文件中共有多少个正整数totnum;2、求出这些数中的各位数字之和是奇数的数的个数
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 if(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);
}
/* 注:与47题相似。*/
void calvalue(void)
{
int i;
for(i=0;i<MAXNUM;I++)
{if(!xx[i]) break;
if(xx[i]>0) totnum++;
if((xx[i]/1000+xx[i]/100%10+xx[i]/10%10+xx[i]%10)/2==1)
{totcnt++;
totpjz+=xx[i];
}
}
totpjz/=totcnt;
}
50、请编制程序,从文件in.dat中读取200个整数至数组xx中,不计数组xx最大的数(若
有重复值,则都不计),再求出最大数max及最大数的个数cnt和所剩下200-cnt个数的算
求平均值pj (保留2位小数)。
结果max,cnt1,min,cnt2,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
#include
#include
#define N 200
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp=fopen("in.dat","r");
for(i=0;i<20;i++)
{for(j=0;j<10;j++)
{fscanf(fp,"%d,",&xx[i*10+j]);
printf("%d ",xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
int cnt,xx[N],max;
float pj;
FILE *fw;
int i,max0;
clrscr();
fw=fopen("out.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);
}
/* 注:本题要注意先去掉最大数然后最求出次大数max及个数cnt。要在求max0时给ma
x任意赋一个不能等于max0的数,只有这样才能保证求次大数max时不会出错。*/
void main()
{
int cnt,xx[N],max;
float pj;
FILE *fw;
int i,max0;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
max0=xx[0];
pj=0;
cnt=0;
for(i=1;i<N;I++)
if(max0 else max=xx[i];
for(i=0;i<N;I++)
if(max0>xx[i]&&max for(i=0;i<N;I++)
if(xx[i]==max) cnt++;
else pj+=xx[i];
pj=(float)((int)pj*100/(200-cnt))/100;
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);
}
51、下列程序的功能是:计算500-800区间内素数的个数cnt,并按所求素数的值从大到
小的顺序,再计算其间隔加、减之各,即第1个素数-第2个素数+第3个素数-第4个素数+
第5个素数……的值sum。请编写函数countvalue()实现程序的要求,最后调用函数writ
edat()把结果cnt和sum,输出到文件out11.dat中。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writedat()的内容。
#include
int cnt,sum;
void countValue()
{
}
void main()
{
cnt=sum=0;
countValue();
printf("cnt=%d\n",cnt);
printf("sum=%d\n",sum);
writeDAT();
}
writeDAT()
{
FILE *fp;
fp=fopen("OUT11.DAT","w");
fprintf(fp, "%d\n%d\n",cnt,sum);
fclose(fp);
}
/* 注:本题要求从大到小的顺序进行加减运算,因此这里采用从800开始循环到500这样
就能保证出来的素数就是从大到小,内嵌的for()再加上if()是用来判断是否为素数。其
中k用来控制加减运算。*/
void countValue()
{
int i,j,k=1;
for(i=800;i>=500;i--)
{for(j=2;j<I;J++)
if(i%j==0) break;
if(j>=i)
{cnt++;
sum+=k*i;
k=-1*k;
}
}
}
52、请编制程序,从文件in.dat中读取200个整数至数组xx中,不计数组xx最小的数(若
有重复值,则都不计),再求出最小数min及最小数cnt和所剩下200-cnt个数的算求平均
值pj (保留2位小数)。
结果min,cnt,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
#include
#include
#define N 200
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp=fopen("in.dat","r");
for(i=0;i<20;i++)
{for(j=0;j<10;j++)
{fscanf(fp,"%d,",&xx[i*10+j]);
printf("%d ",xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
int cnt,xx[N],min;
float pj;
FILE *fw;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
printf("\n\nmin=%d,cnt=%d,pj=%6.2f\n",min,cnt,pj);
fprintf(fw,"%d\n%d\n%6.2f\n",min,cnt,pj);
fclose(fw);
}
/* 注:与50相似。*/
void main()
{
int cnt,xx[N],min;
float pj;
FILE *fw;
int i,min0;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
min0=xx[0];
pj=0;
cnt=0;
for(i=1;i<N;I++)
if(min0>xx) min0=xx[i];
else min=xx[i];
for(i=0;i<N;I++)
if(min0<XX[I]&&MIN>xx[i]) min=xx[i];
for(i=0;i<N;I++)
if(xx[i]==min) cnt++;
else pj+=xx[i];
pj=(float)((int)pj*100/(200-cnt))/100;
printf("\n\nmin=%d,cnt=%d,pj=%6.2f\n",min,cnt,pj);
fprintf(fw,"%d\n%d\n%6.2f\n",min,cnt,pj);
fclose(fw);
}
53、下列程序的功能是:先出5000以下符合条件的自然数。条件是:千位数字与百位数
字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位
数字之差的确10倍。计算并输出这些四位自然数的个数cnt以及这些数的和sum。请编写
函数countvalue(0实现程序的要求,最后调用小孩子数writedat()把结果cnt和sum,输
出到文件out13.dat中。
#include
int cnt,sum;
void countValue()
{
}
void main()
{
cnt=sum=0;
countValue();
printf("cnt=%d\n",cnt);
printf("sum=%d\n",sum);
writeDAT();
}
writeDAT()
{
FILE *fp;
fp=fopen("OUT13.DAT","w");
fprintf(fp, "%d\n%d\n",cnt,sum);
fclose(fp);
}
/* 注:该题的关键亦是如何取出各位数字。*/
void countValue()
{
int i;
for(i=1000;i<5000;i++)
if((i/1000+i/100%10)==(i/10%10+i%10))
if((i/1000+i/100%10)==(i%10-i/1000)*10)
{cnt++;
sum+=i;
}
}
54、请编制程序,从文件in.dat中读取200个整数至数组xx中,求出奇数的个数cnt1和偶
数的个数cnt2以及数级xx值为偶数的元素值的算术平均值pj(保留2位小数)。
结果cnt1,cnt2,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
#include
#include
#define N 200
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp=fopen("in.dat","r");
for(i=0;i<20;i++)
{for(j=0;j<10;j++)
{fscanf(fp,"%d,",&xx[i*10+j]);
printf("%d ",xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
int cnt1,cnt2,xx[N];
float pj;
FILE *fw;
clrscr();
fw=fopen("out.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);
}
/* 注:已是很简单了吧!*/
void main()
{
int cnt1,cnt2,xx[N];
float pj;
FILE *fw;
int i;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
cnt1=cnt2=0;
pj=0.0;
for(i=0;i<N;I++)
if(xx[i]%2) cnt1++;
else {cnt2++;pj+=xx[i];}
pj=(float)((long)(pj*100/cnt2))/100;
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);
}
55、下列程序的功能是:计算出自然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NIN
E+NINE的个数cnt,以及满足此条件所有的SIX与NINE的和SUM。请编写函数countvalue(
)实现程序的要求,最后调用函数writedat()把结果cnt和sum,输出到文件out15.dat中

其中S,I,X,N,E各代表一个十进制数字。
#include
long cnt,sum;
void countValue()
{
}
void main()
{
cnt=sum=0;
countValue();
printf("cnt=%d\n",cnt);
printf("sum=%ld\n",sum);
writeDAT();
}
writeDAT()
{
FILE *fp;
fp=fopen("OUT11.DAT","w");
fprintf(fp, "%d\n%d\n",cnt,sum);
fclose(fp);
}
/* 注:由于有SIX+SIX+SIX=NINE+NINE可看出SIX的3倍必须大于等于2000(右边是一个
四位数字的数可知),因此从666开始循环,再由三个数的和是个偶数(右边为一个数的
2倍可知)可循环时步长为2。再由SIX和NINE中有一个共同数字I所以得出第一个if()判
断,还有NINE中有一共同数字N所以得出第二个if()判断。*/
void countValue()
{ int i;
printf("\n");
for(i=666;i<=999;i=i+2)
if(i/10%10==(3*i/2)/100%10)
{cnt++;
sum+=i+3*i/2;
}
}
_________________________________
本人只是为了上机能通过,不追求什么算法速度,答案仅供大家参考,我9号长春上机。(tonggu)
void countValue()
{
int i;
cnt=0;
sum=0;
for(i=1000;i<1500;i++)
if(i/1000==i/10%10 && i/3*3==i)
{
cnt++;
sum+=i*4;
}
}
056题 请编制程序,从文件IN.DAT中读取200个整数至数组xx中,求出奇数的个数cnt1和偶数的个数cnt2以及数组xx下标为偶数的元素值的算术平均值pj(保留2位小数)。
结果cnt1,cnt2,pj输出到OUT.DAT中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。 #include
#include
#define N 200
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp=fopen(\ in.dat\ ,\ r\ );
for(i=0;i<20;i++){
for(j=0;j<20;j++){
fscanf(fp,\ %d,\ &xx[i*10+j]);
printf(\ %d\ ,xx[i*10+j]);
}
printf(\ \\n\ );
}
fclose(fp);
}
void main()
{
int cnt1,cnt2,xx[N];
flot pj;
FILE *fw;
clrscr();
fw=fopen(\ out.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);
}
57、下列程序的功能是:利用发下所示的简单迭代方法求方程:
cos(x)-x=0的一个实根。
xn+1=cos(xn)
迭代步骤如下:
(1)取X1初值为0.0;
(2)X0=X1,把X1的值赋给X0;
(3)X1=COS(X0),求出一个新的X1;
(4)若X0-X1绝对值小0.000001,执行步骤(5),否则执行步骤(2);
(5)所求X1就是方程cos(X)-X=0的一个实根,作为函数值返回。
请编写函数countValue()实现程序的要求,最后调用函数WRITEDAT()把结果输出到
文件OUT17.DAT中。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDAT()的内容。
#include
#include
#include
float countValue()
{
}
main()
{
clrscr();
printf("A=%f\n",countValue());
printf("%f\n",cos(countValue())-countValue());
writeDAT();
}
writeDAT()
{
FILE *wf;
wf=fopen("out17.dat","w");
fprintf(wf,"%f\n",countValue());
fclose(wf);
}
/* 注:该迭代法的基本算法是:反复赋值直到x0-x1的绝对值小于0.00001。故而可用d
o-while循环。这是一个典型的算法。*/
float countValue()
{
float x0,x1=0.0;
do
{x0=x1;
x1=cos(x0);
}while(fabs(x0-x1)>=0.000001);
return x1;
}
58、请编制程序,从文件in.dat中读取200个整数至数组xx中,不计数组xx绝对值最小的
数(若有重复值,则都不计),再求出绝对值最小数max及绝对值最小数的个数cnt和所
剩下200-cnt个数的算求平均值pj (保留2位小数)。
结果min,cnt,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
#include
#include
#define N 200
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp=fopen("in.dat","r");
for(i=0;i<20;i++)
{for(j=0;j<10;j++)
{fscanf(fp,"%d,",&xx[i*10+j]);
printf("%d ",xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
int cnt,xx[N],min;
float pj;
FILE *fw;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
printf("\n\nmin=%d,cnt=%d,pj=%6.2f\n",min,cnt,pj);
fprintf(fw,"%d\n%d\n%6.2f\n",min,cnt,pj);
fclose(fw);
}
/* 注:记住是求次最小数。*/
void main()
{
int cnt,xx[N],min;
float pj;
FILE *fw;
int i,min0;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
min0=abs(xx[0]);
pj=0;
cnt=0;
for(i=1;i<N;I++)
if(min0>abs(xx)) min0=abs(xx[i]);
else min=abs(xx[i]);
for(i=0;i<N;I++)
if(abs(xx[i])>min0&&abs(xx[i]) for(i=0;i<N;I++)
if(abs(xx[i])==min) cnt++;
else pj+=xx[i];
pj=(float)((int)pj*100/(200-cnt))/100;
printf("\n\nmin=%d,cnt=%d,pj=%6.2f\n",min,cnt,pj);
fprintf(fw,"%d\n%d\n%6.2f\n",min,cnt,pj);
fclose(fw);
}
59、请编写函数void countvalue(int *a, int *n),它的功能是:求出1到1000之内能
被7或11整除但不能同时被7和11整除的所有整数放在数组a中,并通过n返回这些数的个
数。
#include
#include
void countValue(int *a,int *n)
{
}
main()
{
int aa[1000],n,k;
clrscr();
countValue(aa,&n);
for(k=0;k<N;K++)
if((k+1)%10==0) printf("\n");
else printf("%5d",aa[k]);
writeDAT();
}
writeDAT()
{
int aa[1000],n,k;
FILE *fp;
fp=fopen("out19.dat","w");
countValue(aa,&n);
for (k=0;k<N;K++)
if((k+1)%10==0) fprintf(fp,"\n");
else fprintf(fp,"%5d",aa[k]);
fclose(fp);
}
/* 注:由于7和11的最小公倍数为77故而可用i%77!=0来表示不能同时被7和11整除。在
a[(*n)++]=i,中必须有小括号,这是由于*与++的运算优先级别相同,而它们的结合方
向是自右向左,如不用括号则变成n所指的地址向前移一位,但本题要的是n所指的变量
的值增加1。*/
void countValue(int *a,int *n)
{
int i;
*n=0;
for(i=7;i<1000;i++)
if((i%7==0//i%11==0)&&i%77!=0)
a[(*n)++]=i;
}
60、请编制程序,从文件in.dat中读取200个整数至数线xx中,求出最大数max及最大数
的个数cnt和数组xx中值能被3整除或能被7整除的算求增均值pj(保留2位小数)。
#include
#include
#include
#define N 200
void read_dat(int xx[N])
{
int i,j;
FILE *fp;
fp=fopen("in.dat","r");
for(i=0;i<20;i++)
{for(j=0;j<10;j++)
{fscanf(fp,"%d,",&xx[i*10+j]);
printf("%d ",xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
int cnt,xx[N],max;
float pj;
FILE *fw;
clrscr();
fw=fopen("out.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);
}
/* 注:注意本题要直接求出所有数中的最大数,而不象前面题目中的求次最大数。*/
void main()
{
int cnt,xx[N],max;
float pj;
FILE *fw;
int i,k=0;
clrscr();
fw=fopen("out.dat","w");
read_dat(xx);
max=xx[0];
pj=0;
cnt=0;
for(i=1;i<N;I++)
if(max for(i=0;i<N;I++)
{if(xx[i]==max) cnt++;
if(xx[i]%3==0//xx[i]%7==0)
{pj=xx[i];k++;}
}
pj=(float)((int)pj*100/k)/100;
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);
}
61、已知数据文件IN.DAT中存有300个四位数,并已调用读函数READDAT()把这些数存入数
组a中,请编制一函数JSVALUE(),其功能是:求出千位数上的数减百位数上的数减十位数上
的数减个位数上的数大于零的个数CNT,再把所有满足此条件的四位数依次存入数组bb中
,然后对数组bb的四位数按小到大的顺序进行排序,最后调用写函数WRITEDAT()把数组B中
的数输出到OUT.DAT文件.
例如:9123,9-1-2-3>0,则该数满足条件存入数组bb中,且个数CNT=CNT+1.
9812,9-8-1-2<0,则该数不满足条件忽略.
#include
int a[300],bb[300],cnt=0;
jsValue()
{
}
main()
{
int i;
readDat();
jsValue();
wrteDat();
for (i=0;i }
readDat()
{
FILE *fp;
int i;
fp=fopen("in.dat","r");
printf("cnt=%d\n",cnt);
for (i=0;i<300;i++) fscanf(fp, "%d,",&a[i]);
fclose(fp);
}
wrteDat()
{
FILE *fp;
int i;
fp=fopen("out.dat","w");
fprintf(fp, "%d\n",cnt);
for (i=0;i
fclose(fp);
}
/* 注:对bb的排序本题采用了冒泡法。*/
jsValue()
{
int q,b,s,g,i,j;
for(i=0;i<300;i++)
{q=a[i]/1000;
b=a[i]/100%10;
s=a[i]/10%10;
g=a[i]%10;
if(q-b-s-g>0)
bb[cnt++]=a[i];
}
for(i=0;i<CNT-1;I++)
for(j=i+1;j<CNT;J++)
if(bb[i]>bb[j])
{q=bb[i];
bb[i]=bb[j];
bb[j]=q;
}
}
62、请编制函数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 ;
if((fp=fopen("in.dat","r"))==NULL) return 1;
fclose(fp) ;
return 0 ;
}
void H16to8(void)
{
}
void main()
{
int i ;
for(i=0;i
if(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;i
fclose(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);
}
}
63、已知数据文件IN.DAT中存有300个四位数,并已调用读函数READDAT()把这些存入数组
a中,请编制一函数JSVALUE()其功能是:求出千位数上的数加百位数上的数等于十位数上
的数加个位数上的数的个数CNT,再把所有满足条件的四位数依次存入数组B中,然后对数
组bb的四位数按从大到小的顺序进行排序,最后调用写函数WRITEDAT()把数组bb中的数输
出到OUT.DAT文件.
例如:7153,7+1=5+3,则该数满足条件存入数组bb中,且个数CNT=CNT+1.
8129,8+1<>2+9,则该数不满足条件忽略.
#include
int a[300],bb[300],cnt=0;
jsValue()
{
}
main()
{
int i;
readDat();
jsValue();
wrteDat();
for (i=0;i }
readDat()
{
FILE *fp;
int i;
fp=fopen("in.dat","r");
printf("cnt=%d\n",cnt);
for (i=0;i<300;i++) fscanf(fp, "%d,",&a[i]);
fclose(fp);
}
wrteDat()
{
FILE *fp;
int i;
fp=fopen("out.dat","w");
fprintf(fp, "%d\n",cnt);
for (i=0;i
fclose(fp);
}
/* 注:
jsValue()
{
int q,b,s,g,i,j;
for(i=0;i<300;i++)
{q=a[i]/1000;
b=a[i]/100%10;
s=a[i]/10%10;
g=a[i]%10;
if(q+b==s+g)
bb[cnt++]=a[i];
}
for(i=0;i<CNT-1;I++)
for(j=i+1;j<CNT;J++)
if(bb[i]<BB[J])
{q=bb[i];
bb[i]=bb[j];
bb[j]=q;
}
}
64、请编制函数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<MAX;I++)
xx[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<MAX;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<MAX;I++)
{aver+=xx[i];
if(xx[i]%2)
odd++;
else
even++;
}
aver/=(odd+even);
for(i=0;i<MAX;I++)
totfc+=(xx[i]-aver)*(xx[i]-aver)/(odd+even);
}
65、已知数据文件IN.DAT中存有300个四位数,并已调用读函数READDAT()把这些数存入数
组A中.请编制一函数JSVALUE(),其功能是:求出千位数上的数加个位数上的数等于百位数
上的数加十位数上的数的个数CNT,再把所有满足条件的四位数依次存入数组bb中,然后对
数组bb的四位数按从小到大的顺序进行排序,最后调用写函数WRITEDAT()把数组bb中的数
输出到OUT.DAT文件.
例如:6712,6+2=7+1,则该数满足条件存入数组bb中,且个数CNT=CNT+1.
8129,8+1<>2+9,则该数不满足条件忽略.
#include
int a[300],bb[300],cnt=0;
jsValue()
{
}
main()
{
int i;
readDat();
jsValue();
wrteDat();
for (i=0;i }
readDat()
{
FILE *fp;
int i;
fp=fopen("in.dat","r");
printf("cnt=%d\n",cnt);
for (i=0;i<300;i++) fscanf(fp, "%d,",&a[i]);
fclose(fp);
}
wrteDat()
{
FILE *fp;
int i;
fp=fopen("out.dat","w");
fprintf(fp, "%d\n",cnt);
for (i=0;i
fclose(fp);
}
/* 注:
jsValue()
{
int q,b,s,g,i,j;
for(i=0;i<300;i++)
{q=a[i]/1000;
b=a[i]/100%10;
s=a[i]/10%10;
g=a[i]%10;
if(q+g==b+s)
bb[cnt++]=a[i];
}
for(i=0;i<CNT-1;I++)
for(j=i+1;j<CNT;J++)
if(bb[i]> bb[j])
{q=bb[i];
bb[i]=bb[j];
bb[j]=q;
}
}
66、请编制函数READDAT()实现从文件IN.DAT中读取1000个十进制整数到数组XX中;再
编制函数COMPUTE()分别计算出XX中偶数的个数EVEN,奇数的平均值`AVE1,偶数的平均值
AVE2以所有偶数的方差TOTFC的值,最后调用函数WRITEDAT()把结果输出到OUT.DAT文件中
.
计算方差的公式如下:
设N为偶数的个数,XX[I]为偶数,AVE2为偶数的平均值.
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开(每个数均大于0且小于等于
2000).
#include
#include
#include
#define MAX 1000
int xx[MAX],odd=0,even=0;
double ave1=0.0,ave2=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<MAX;I++)
xx[i]=0;
if(ReadDat())
{printf("Can't open the data file in.dat!\007\n") ;
return;
}
Compute();
printf("EVEN=%d\nAVE1=%lf\nAVE2=%lf\nTOTFC=%lf\n", even,ave1,ave
2,totfc);
WriteDat();
}
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen("out.dat", "w") ;
fprintf(fp, "%d\n%lf\n%lf\n%lf\n",even,ave1,ave2,totfc);
fclose(fp) ;
}
/* 注:
int ReadDat(void)
{
FILE *fp ;
int i;
if((fp=fopen("in.dat","r"))==NULL) return 1;
for(i=0;i<MAX;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<MAX;I++)
if(xx[i]%2)
{odd++;
ave1+=xx[i];
}
else
{even++;
ave2+=xx[i];
yy[even-1]=xx[i];
}
ave1/=odd;
ave2/=even;
for(i=0;i<EVEN;I++)
totfc+=(yy[i]-ave2)*(yy[i]-ave2)/even;
}
67、已知数据文件IN.DAT中存有300个四位数,并已调用读函数READDAT()把这些数存入数
组A中,请编制一函数JSVALUE(),其功能是:求出个位数上的数减千位数上的数减百位数上
的数减十位数上的数大于零的个数CNT,再把所有懑足此条件的四位数平均值PJZ1,以及不
满足条此条件的四位数平均值PJZ2,最后调用写函数WRITEDAT()把结果CNT,PJZ,PJZ2输
出到OUT.DAT文件.
例如:1239,9-1-2-3>0,则该数满足条件计算平均值PJZ1,且个数CNT=CNT+1.
8129,9-8-1-2<0,则该数不满足条件计算平均值PJZ2。
#include
int a[300],cnt=0;
double pjz1=0.0,pjz2=0.0;
jsValue()
{
}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf("cnt=%d\npzj1=%7.2lf\npzj2=%7.2lf\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.1lf\n%7.2lf\n",cnt,pjz1,pjz2);
fclose(fp);
}
/* 注:
jsValue()
{
int i,q,b,s,g,cnt1=0;
for(i=0;i<300;i++)
{q=a[i]/1000;
b=a[i]/100%10;
s=a[i]/10%10;
g=a[i]%10;
if(g-q-b-s>0)
{pjz1+=a[i];
cnt++;
}
else
{pjz2+=a[i];
cnt1++;
}
}
pjz1/=cnt;
pjz2/=cnt1;
}
68、现有一个10个人100行的选票数据文件IN.DAT,其数据存放的格式是每条记录的长度
均为10位,第一位表示第一个的选中情况,第二位表示第二个人的选中情况,依此类推;内
容均为字符0和1,1表示此人被选中,0表示此人未被选中,全选或不选均为无效的选票.给
定函数READDAT()的功能是把选票数据读入到字符串数组XX中.请编制函数COUNTRS()来统
计每个人的选票数并把票数依次存入YY[0]到YY[9]中,最后调用函数WRITEDAT()把结果Y
Y输出到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);
}
/* 注:本题要求将那些全选取或不先的选票均视为无效,全选即为“1111111111”不选
即为“0000000000”,只要xx[i]为上述两种情况即视为无效。本题对这两种情况的判断
采用strcmp()函数,注意字符串的比较不能直接进行即不能用:xx[i]==“1111111111”
的方式。*/
void countrs(void)
{
int i,j;
for(i=0;i<300;i++)
{if(strcmp(xx[i],"1111111111")==0//strcmp(xx[i],"000000000
0")==0)
continue;
for(j=0;xx[i][j];j++)
if(xx[i][j]=='1') yy[j]++;
}
}
69、已知数据文件IN.DAT中存有300个四位数,并已调用读函数READDAT()把这些数存入数
组A中,请编制一函数JSVALUE(),其功能是:求出所有这些四位数是素数的个数CNT,再求出
所有满足此条件的四位数平均值PJZ1,以及不满足条件的四位数平均值PJZ2,最后调用写
函数WRITEDAT()把结果CNT,PJZ1,PJZ2输出 到OUT.DAT文件.
例如:5591是素数,则该数满足条件计算平均值PJZ1,且个数CNT=CNT+1.
9812是非素数,则该数不满足条件计算平均值PJZ2。
#include
int a[300],cnt=0;
double pjz1=0.0,pjz2=0.0;
int isP(int m)
{
int i;
for(i=2;i<M;I++)
if(m%i==0) return 0;
return 1;
}
jsValue()
{
}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf("cnt=%d\npzj1=%7.2lf\npzj2=%7.2lf\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.1lf\n%7.2lf\n",cnt,pjz1,pjz2);
fclose(fp);
}
/* 注:这里利用了已有的判断素数函数isP()来直接对某个数进行判断。*/
jsValue()
{
int i,cnt1=0;
for(i=0;i<300;i++)
if(isP(a[i]))
{cnt++;
pjz1+=a[i];
}
else
{cnt1++;
pjz2+=a[i];
}
pjz1/=cnt;
pjz2/=cnt1;
}
70、现有一个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;xx[i][j];j++)
if(xx[i][j]=='1') yy[j]++;
}
}
71、函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组XX中;请
编制函数SORTCHARA(),其函数功能是:以行为单位对字符按从小到大的顺序进行排序,排
序后的结果仍按行重新存入字符串数组XX中,最后调用函数WRITEDAT()把结果XX输出到文
件OUT.DATK .
例:原文:dAe,BfC.
CCbbAA
结果:,.ABCdef
AACCbb
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格.
# include"stdio.h"
# include"string.h"
# include"conio.h"
char xx[50][80];
int maxline=0;
int readdat(void);
void writedat(void);
void sortcharA(void)
{
}
void main()
{
clrscr();
if(readdat())
{printf("Can't open the file ENG.IN!\n");
return;
}
sortcharA();
writedat();
}
int readdat(void)
{
FILE *fp;
int i=0;
char *p;
if((fp=fopen("in.dat","r"))==NULL)
return 1;
while(fgets(xx,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("out1.dat","w");
for(i=0;i<MAXLINE;I++)
{printf("%s\n",xx[i]);
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}
/* 注:本题采用冒泡法进行排序。*/
void sortcharA(void)
{
int i,j,k,strl;
char ch;
for(i=0;i<MAXLINE;I++)
{strl=strlen(xx[i]);
for(j=0;j<STRL-1;J++)
for(k=j+1;k<STRL;K++)
if(xx[i][j]>xx[i][k])
{ch=xx[i][k];
xx[i][k]=xx[i][j];
xx[i][j]=ch;
}
}
}
72、下列程序的功能是:把S字符串中的所有字符左移一个位置,串中的第一个字符移到最
后.请编写函数CHG(CHAR *S)实现程序要求,最后调用函数READWRITEDAT()把结果输出到
OUT.DAT文件中.
例如:S字符串中原有内容为:MN.123XYZ,则调用函数后,结果为:N.123XYZM.
# include"string.h"
# include"stdio.h"
# include"ctype.h"
# define N 81
void readwritedat();
void chg(char *s)
{
}
main()
{
char a[N];
printf("enter a string :");
gets(a);
printf("the original string is :");
puts(a);
chg(a);
printf("the string after modified:");
puts(a);
readwritedat();
}
void readwritedat()
{
int i;
char a[N];
FILE *rf,*wf;
rf=fopen("in.dat","r");
wf=fopen("out.dat","w");
for(i=0;i<10;i++)
{fscanf(rf,"%s",a);
chg(a);
fprintf(wf,"%s\n",a);
}
fclose(rf);
fclose(wf);
}
/* 注:strcpy(s,s+1)的作用是将第二个字符及以后的字符前移一位,注意这时最后一
个字符还不是原来的第一个字符,用*(s+i-1)=c;来将原第一个字符存入串尾,最后还
要赋一个新的串结束符。*/
void chg(char *s)
{
int i=strlen(s);
char c=*s;
strcpy(s,s+1);
*(s+i-1)=c;
*(s+i)='\0';
}
73、函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组XX中;请
编制函数CONVERTCHARA(),其函数功能是:以行为单位把字符串中的所有小写字母改写成
该字母的下一个字母,如果是字母Z,则改写成字母A.大写字母仍为大写字母,小写字母仍
为小写字母,其他字符不变.把已处理的字符串仍按行重新存入字符串数组XX中,最后调用
函数WRITEDAT()把结果XX输出到文件OUT.DAT中.
例:原文:Adb.Bcdza
abck.LLhj
结果:Aec.Bdeab
bcdl.LLik
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格.
# include"stdio.h"
# include"string.h"
# include"conio.h"
char xx[50][80];
int maxline=0;
int readdat(void);
void writedat(void);
void convertcharA(void)
{
}
void main()
{
clrscr();
if(readdat())
{printf("Can't open the file ENG.IN!\n");
return;
}
convertcharA();
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("out3.dat","w");
for(i=0;i<MAXLINE;I++)
{printf("%s\n",xx[i]);
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}
/* 注:注意本题中不能将第一个if()的else去掉,若不用else则经过第一个if()后原来
字符'z'变成了'a',当再经过第二个if()时又将已变成'a'的字符改成了'b',
即实际上字母'z'变成了字母'b',这是不行的。*/
void convertcharA(void)
{
char *p;
int i;
for(i=0;i<MAXLINE;I++)
{p=xx[i];
while(*p)
{if(*p=='z') *p='a';
else if(*p>='a'&&*p<'z') *p=*p+1;
p++;
}
}
}
74、下列程序的功能是:统计在TT字符串中'A'到'Z'26个字母各自现的次数,并存入
PP数组.请编写函数CNT(CHAR *TT,INT PP[])实现程序的要求,最后调用函数READWRITED
AT()把结果输出到文件OUT.DAT中.(仅统计小写字母.)
例如:当输入字符串:abcdefgabcdeabc后,输出的结果应该是:
3 3 3 2 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#include
#include
void readwritedat();
void cnt(char *tt, int pp[])
{
}
main()
{
char tt[1000];
int pp[26], k, n;
clrscr() ;
printf("\nplease enter a char string:") ; scanf("%s",t
t);
cnt(tt,pp);
for(k = 0; k<26; k++) printf ("%d ",pp[k]);
printf("\n");
readwritedat();
}
void readwritedat()
{
char tt[1000];
int pp[26], k, n, i;
FILE *rf, *wf;
rf = fopen("in.dat","r");
wf = fopen("out.dat","w");
for(i = 0; i<10;i++)
{
fscanf(rf,"%s",tt);
cnt(tt,pp);
for(k = 0;k<26; k++) fprintf(wf,"%d",pp[k]);
fprintf(wf,"\n");
}
fclose(rf);
fclose(wf);
}
/* 注:题中必须先对数组pp赋初值。pp[*tt-'a']++的作用是将对应的元素增加1,即
当*tt为'a'时应对pp[0]加1,而pp[*tt-'a']即相当于pp[0],依此类推。*/
void cnt(char *tt, int pp[])
{
int i;
for(i=0;i<26;i++)
pp[i]=0;
while(*tt)
{if(*tt>='a'&&*tt<='z')
pp[*tt-'a']++;
tt++;
}
}
75、函数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<MAXLINE;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<MAXLINE;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';