21题
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存 入到字符串数组xx中,请编制函数CharConvA(),其函数的功能是:以行为单位把字符串中的最后一个字符的ASCII值右移4位后加最后第二个字符的ASCII值,得到最后一个新的字符,最后第二个字符的ASCII值右移4位后加最后第三个字符的ASCII值,得到最后第二个新的字符,依此类推一直处理到第二个字符,第一个字符的ASCII值加原最后一个字符的ASCII值,得到第一个新的字符,得到的新字符分别存放在原字符串对应的位置上。最后已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT10.DAT中。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序已给出。
请勿改动主函数main()和写函数writeDat()的内容。
#include<stdio.h>
#include<string.h>
#include<conio.h>
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<stdio.h>
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<stdio.h>
#include<string.h>
#include<conio.h>
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 <stdio.h>
#include <string.h>
#include <conio.h>
#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<N;i++)printf("No=%s Mark=%\n" ,a[i].num,a[i],s);
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].s<s->s)
*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<stdio.h>
#include<string.h>
#include<conio.h>
#include<ctype.h>
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<xx[i]) k=0;
}
strcpy(xx[i],t);
}
}
26题 下列程序的功能是:求出ss字符串中指定字符c的个数,并返回此值。请编写函数int num(*char ss,char c)实现程序要求,最后调用函数readwriteDat()把结果输出到文件out.dat中。
(注:大小写字母有区别)
例如,若输入字符串ss="123412132" ,c='1',则输出3。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。 #include <conio.h>
#include <stdio.h>
#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<stdio.h>
#include<string.h>
#include<conio.h>
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';
}
}
/*如果嫌上面的公式繁的话,可以写成这样:*/
void convertchard(void)
{ int i,n,j;
for(i=0;i<maxline;i++)
{ n=strlen(xx[i]);
for(j=0;j<n;j++)
if(islower(xx[i][j])
{if(xx[i][j]>'a') xx[i][j]-=1;
else xx[i][j]='z'; }
}
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 <conio.h>
#include <stdio.h>
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<n;m++)fprintf(wf," %d" ,xx[m]);
fprintf(wf,"\n" );
}
fclose(rf);
fclose(wf);
}
________________________________________
注:太简单。
void num(int m,int k,int xx[])
{
int i,j=0;
i=m+1;
while(j<k)
{if(isp(i)) xx[j++]=i;
i++;
}
}
29题 函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数SortCharD(),其函数的功能是:以行为单位对字符按从大到小的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT2.DAT中。
例:原文:dAe,BfC.
CCbbAA
结果:fedCBA.
bbCCAA
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。 #include<stdio.h>
#include<string.h>
#include<conio.h>
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=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;
}
}
}
30题 下列程序的功能是:把s字符串中的所有字母改写成该字母的下一个字符,字母z改写成字母a。要求大写字母仍为大写字母,小写字母仍为小写字母,其他字符不做改变。请编写函数chg(char *s)实现程序的要求,最后调用函数readwriteDat()把结果输出到文件out.dat中。
例如:s字符串中原有的内容为:Mn.123Zxy,则调用该函数后,结果为No.123Ayz。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。 #include <conio.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#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 <stdio.h>
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<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()){
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<100;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]++;
}
}
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 <stdio.h>
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 <stdio.h>
#define N 100
#define S 1
#define M 10
int p[100],n,s,m;
void WriteDat(void);
void Josegh(void)
{
}
void main()
{
m=M;
n=N;
s=S;
Josegh();
WriteDat();
}
void WriteDat(void)
{
int i;
FILE *fp;
fp=fopen("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 <stdio.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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<MAX;i++)xx[i]=0;
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 <stdio.h>
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<cnt;i++) printf(" b[%d]=%d\n" ,i,b[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<cnt;i++)fprintf(fp,"%d\n" ,b[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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<ctype.h>
#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<MAX;i++) memset(xx,0,20);
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<MAX;i++) fprintf(fp,"%s\n",xx[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 <stdio.h>
int a[300],b[300],cnt=0;
jsValue()
{
}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf(" cnt=%d\n" ,cnt);
for(i=0;i<cnt;i++) printf(" b[%d]=%d\n" ,i,b[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<cnt;i++)fprintf(fp," %d\n" ,b[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 <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#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<MAX;i++)fprintf(fp," %s\n" ,xx[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);
}
}