sum=sum+xx[I];
}
aver=sum/MAXNUM;
}
题目33:请编制函数ReadDat()实现从文件IN.DAT中读取1000个十进制整数到数组xx中;请编制函数Compute()分别计算出xx中奇数的个数odd,奇数的平均值ave1,偶数的平均值ave2以及所有奇数的方差totfc的值,最后调用函数WriteDat()把结果输出到OUT.DAT文件中。计算方差的公式如下:totfc=1/N∑(xx[i]-ave1)2
设N为奇数的个数,xx[i]为奇数,ave1为奇数的平均值。
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开(这个有关系么?)。(每个数均大于0且小于等于2000)
注意:部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。
-----------------------------
void Compute(void)
{ int i;
for(i=0;i<MAX;i++)
if(xx[i]%2) { odd++; ave1+=xx[i]; }
else { even++; ave2+=xx[i]; }
ave1/=odd; ave2/=even;
for(i=0;i<MAX;i++)
if(xx[i]%2==0) totfc+=(xx[i]-ave2)*(xx[i]-ave2);
totfc/=even;
}
终于了解方差的含义了噢:
∑(X[i]-X的平均值)的平方/N
题目46:已知数据文件IN.DAT中存有200个四位数, 并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是: 依次从数组a中取出一个四位数,如果该数连续大于该四位数以前的5个数且该数是奇数,但该数必须能被7整除。 则统计出满足此条件的个数cnt, 并把这些四位数按从大到小的顺序存入数组b中。 并要计算满足上述条件的四位数的个数cnt。最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意: 部分源程序存在文件PROG1.C文件中。
程序中已定义数组: a[200], b[200], 已定义变量: cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
-------------------------
void jsVal() /*标准答案*/
{int I,j,flag=0;
for(I=5;I<MAX-5;I++)
{for(j=I-5;j<I;j++)/*有五个数,就可以循环了*/
{if(a[I]>a[j])
flag=1;
else {flag=0;break;}}
if (flag==1&&a[I]%2==1&&a[I]%7==0) {b[cnt]=a[I];cnt++;}
}
for(I=0;I<cnt-1;I++)
for(j=I+1;j<cnt;j++)
if(b[I]<b[j])
{flag=b[I];b[I]=b[j];b[j]=flag;}
}
借用一个flag==1表达一个比较复杂的条件
类型六 千位数 百位数 十位数 个位数
题目86:已知数据文件IN.DAT中存有200个四位数, 并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是: 把千位数字和十位数字重新组成一个新的十位数ab(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字), 以及把个位数字和百位数字组成另一个新的十位数cd (新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字), 如果新组成的两个十位数ab>cd, ab必须是偶数且能被5整除, cd必须是奇数,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中, 并要计算满足上述条件的四位数的个数cnt。最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意: 部分源程序存在文件PROG1.C文件中。
程序中已定义数组: a[200], b[200], 已定义变量: cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
-------------------------
void jsVal() /*标准答案*/
{int I,thou,hun,ten,data,j;
int ab,cd;/*注意把变量都定义好了*/
for(I=0;I<200;I++)
{thou=a[I]/1000; hun=a[I]%1000/100;
ten=a[I]%100/10; data=a[I]%10;
ab=10*thou+ten; cd=10*data+hun;
if((ab-cd)>0&&(ab%2!=1&&ab%5==0)&&cd%2==1&&ab!=0&&cd!=0)
{b[cnt]=a[I];cnt++;}
}
for(I=0;I<cnt-1;I++) 按从大到小排序
for(j=I+1;j<cnt;j++)
if(b[I]<b[j])
{data=b[I];b[I]=b[j];b[j]=data;}
有一个四位数i
表达千位、百位、个位、十位数字的办法
定义为整型:int thou,hun,ten,data;
thou=i/1000;
hun=i%1000/100;
ten=i%100/10;
data=i%10
题目87:已知数据文件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
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
---------------------
void jsValue() /*标准答案*/
{int I,n=0,thou,hun,ten,data;
for(I=0;I<300;I++)
{thou=a[I]/1000; hun=a[I]%1000/100;
ten=a[I]%100/10; data=a[I]%10;
if (thou+data==hun+ten)
{cnt++;pjz1+=a[I];}
else {n++;pjz2+=a[I];}
}
pjz1/=cnt; pjz2/=n;
}
自己写程序时存在的问题:
1.Pjz1+=a[i]表达还不熟练
2.这样可以减少变量,从求和开始,久直接用pjz
题目77:已知数据文件IN.DAT中存有200个四位数, 并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:若一个四位数的千位数字上的值加上十位数字上的值等于百位数字上的值加上个位数字上的值,并且此四位数是偶数,则统计出满足此条件的个数cnt, 并把这些四位数按从小到大的顺序存入数组b中。最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意: 部分源程序存在文件PROG1.C文件中。
程序中已定义数组: a[200], b[200], 已定义变量: cnt
请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
-------------------------
void jsVal() /*标准答案*/
{int I,thou,hun,ten,data,j;
for(I=0;I<MAX;I++)
{thou=a[I]/1000; hun=a[I]%1000/100;
ten=a[I]%100/10; data=a[I]%10;
if ((thou+ten==hun+data)&&a[I]%2!=1)
{b[cnt]=a[I];cnt++;}
}
for(I=0;I<cnt-1;I++)
for(j=I+1;j<cnt;j++)
if(b[I]>b[j])
{data=b[I];b[I]=b[j];b[j]=data;}
}
题目72:已知数据文件IN.DAT中存有200个四位数, 并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是: 把千位数字和个位数字重新组成一个新的十位数(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的个位数字), 以及把十位数字和百位数字组成另一个新的十位数 (新十位数的十位数字是原四位数的百位数字,新十位数的个位数字是原四位数的十位数字), 如果新组成的两个十位数均是偶数并且两个十位数中至少有一个能被9整除,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中, 并要计算满足上述条件的四位数的个数cnt。最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意: 部分源程序存在文件PROG1.C文件中。
程序中已定义数组: a[200], b[200], 已定义变量: cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
-------------------------
void jsVal() /*标准答案*/
{int I,thou,hun,ten,data,j;
int ab,cd;
for(I=0;I<MAX;I++)
{thou=a[I]/1000; hun=a[I]%1000/100;
ten=a[I]%100/10; data=a[I]%10;
ab=10*data+thou; cd=10*hun+ten;
if ((ab%9==0||cd%9==0)&&ab%2!=1&&cd%2!=1&&ab!=0&&cd!=0)
{b[cnt]=a[I];cnt++;}
}
for(I=0;I<cnt-1;I++)
for(j=I+1;j<cnt;j++)
if(b[I]<b[j])
{data=b[I];b[I]=b[j];b[j]=data;}
}
题目67:下列程序的功能是:先出5000以下符合条件的自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的确10倍。计算并输出这些四位自然数的个数cnt以及这些数的和sum。请编写函数countvalue()实现程序的要求,最后调用函数writedat()把结果cnt和sum,输出到文件out13.dat中。
注意:部分源程序已给出。
请勿改动主函数main()和输入输出数据函数writeDAT()的内容。
----------------------------
void countValue() /*标准答案*/
{int I,thou,hun,ten,data;
for(I=5000;I>=1000;I--)
{thou=I/1000;
hun=I%1000/100;
ten=I%100/10;
data=I%10;
if (thou+hun==ten+data&&thou+hun==(data-thou)*10)
{cnt++;sum+=I;}
}
}
类型七 有关素数的计算
题目82:已知数据文件IN.DAT中存有300个四位数,并已调用读函数READDAT()把这些数存入数组A中.请编制一函数SVALUE(),其功能是:求出所有这些四位数是素数的个数CNT,再求出所有满足此条件的四位数平均值PJZ1,以及不满足条件的四位数平均值PJZ2,最后调用写函数WRITEDAT()把结果CNT,PJZ1,PJZ2输出 到OUT.DAT文件.
例如:5591是素数,则该数满足条件计算平均值PJZ1,且个数CNT=CNT+1.
9812是非素数,则该数不满足条件计算平均值PJZ2。
注意:部分源程序已给出。
程序中已定义数组:a[300],已定义变量:cnt,pjz1,pjz2.
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
---------------------
void jsValue() /*标准答案*/
{int I;
for (I=0;I<300;I++)
if (isP(a[I])) {pjz1+=a[I];cnt++;}
else pjz2+=a[I];
pjz1=pjz1/cnt;
pjz2=pjz2/(300-cnt);
}
题目34:下列程序的功能是:选取出100以上1000以内所有个位数字与十位数字之和被10除所得余数恰是百位数字的素数(如293)。计算并输出上述这些素数的个数CNT以及这些素数值的和SUM。请编写函数COUNTvalue()实现程序要求,最后调用函数WRITEDAT()把结果CNT和SUM输出到文件OUT.DAT中.
注意:部分源程序已给出。
请勿改动主函数main()和函数readwriteDAT()的内容。
--------------
类型:素数。
void countValue() /*标准答案*/
{int I,j,half,hun,ten,data;
for(I=101;I<1000;I++)
{hun=I/100;
ten=I%100/10;
data=I%10;
if(hun==(ten+data)%10)
{half=I/2;
for(j=2;j<half;j++)/*j不需要超过一半*/
if(I%j==0) break;/*一旦可出,就跳出循环,此时i不是素数*/
if(j>=half)/*如果最后j>=half,则表示是素数了*/
{cnt++;sum+=I;} } }
题目55:已知数据文件IN.DAT中存有300个四位数,并已调用读函数READDAT()把这些数存入数组A中.请编制一函数SVALUE(),其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序,最后调用写函数writeDat()把结果输出到OUT.DAT文件。
例如:5591是素数,则该数满足条件存入数组b中,且个数cnt=cnt+1。
9812是非素数,则该数不满足条件忽略。
注意:部分源程序已给出。
程序中已定义数组:a[300],b[300],已定义变量:cnt
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
---------------------
void jsValue() /*标准答案*/
{int j,I,value;
for(I=0;I<300;I++)
if(isP(a[I])) {b[cnt]=a[I];cnt++;}
for(I=0;I<cnt-1;I++)
for(j=I+1;j<cnt;j++)
if(b[I]>b[j])
{value=b[I]; b[I]=b[j]; b[j]=value;}
}
题目1:下列程序的功能是:将大于整数m且紧靠m的k个素数存入数组xx。请编写函数num(int m,int k,int xx[])实现函数的要求 ,最后调用函数readwriteDAT()把结果输出到文件out.dat中。
例如:若输入17,5,则应输出:19,23,29,31,37。
注意:部分源程序已给出。
请勿改动主函数main()和函数readwriteDAT()的内容。
--------------
void num(int m,int k,int xx[])
{int i,j,s=0;
for(i=m+1;k>0;i++)/*i从m+1开始表明i>m,*/
{for(j=2;j<i;j++)素数的证明方法中较为简单的一种
if(i%j==0) break;
if(i==j)
{xx[s++]=i;k--;}这里涉及到s++的用法,注意了
} }
题目64:下列程序的功能是:找出所有100以内(含100)满足I,I+4,I+10都是素数的整数I(I+10也在100以内)的个数cnt以及这些I之和sum。请编写函数countvalue()实现程序要求,最后调用函数writeDat()把结果cnt和sum输出到文件out.dat中。
注意:部分源程序已给出。
请勿改动主函数main()和函数writeDAT()的内容。
--------------
void countvalue()
{ int a,b,i;
for(i=3;i<90;i++)
{ if(isPrime(i))
{ a=i+4;
if(isPrime(a))
{ b=i+10;
if(isPrime(b))
{ cnt++;
sum+=i; } } } }
}
题目66:下列程序的功能是:计算500-800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,再计算其间隔加、减之各,即第1个素数-第2个素数+第3个素数-第4个素数+第5个素数……的值sum。请编写函数countvalue()实现程序的要求,最后调用函数writedat()把结果cnt和sum,输出到文件out11.dat中。
注意:部分源程序已给出。
请勿改动主函数main()和输出数据函数writedat()的内容。
--------------------------
本题要求从大到小的顺序进行加减运算,因此这里采用从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;}这么简单就解决问题了噢+,-号的更替
}
}
类型八 选举
题目84:对10个候选人进行选举,现有一个100条记录的选票数据文件IN.DAT,其数据存放的格式是每条记录的长度均为10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,依此类推 :内容均为字符0和1,1表示此人被选中,0表示此人未被选中,若一张选票人数大于5个人时认为无效的选票.给定函数ReadDat()的功能是把选票数据读入到字符串数组xx中。请编制函数CountRs()来统计每个人的选票数并把得票数依次存入yy[0]到yy[9]中。把结果yy输出到文件OUT.DAT中。
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
----------------------
类型:选票问题。
void CountRs(void)
{ int i,j,k;
for(i=0;i<10;i++)
{ k=0;
for(j=0;j<10;j++)
if(xx[i][j]=='1') k++;/*注意一定要用引号,不太明白啊!*/
if(k>5) continue;
for(j=0;j<10;j++)
if(xx[i][j]=='1') yy[j]++; }是谁的选票就加到谁的头上
}
其它代表性题目
题目41:下列程序的功能是:计算出自然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NINE+NINE的个数cnt,以及满足此条件所有的SIX与NINE的和SUM。请编写函数countvalue()实现程序的要求,最后调用函数writedat()把结果cnt和sum,输出到文件out15.dat中.其中S,I,X,N,E各代表一个十进制数字。
注意:部分源程序已给出。
请勿改动主函数main()的内容。
--------------------
注:由于有SIX+SIX+SIX=NINE+NINE可看出SIX的3倍必须大于等于2000(右边是一个四位数字的数可知),因此从666开始循环,再由三个数的和是个偶数(右边为一个数的2倍可知)可循环时步长为2。再由SIX和NINE中有一个共同数字I所以得出第一个if()判断,还有NINE中有一共同数字N所以得出第二个if()判断。*/
void countValue()
{ int i;
for(i=666;i<=999;i=i+2)
if((i/10%10==(3*i/2)/100%10)&&((3*i/2)/1000==(3*i/2)%100/10)) /*以I为准*/
{cnt++;sum+=i+3*i/2;}
}
题目4:函数ReadDat( )实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中; 请编制函数StrOL( ), 其函数的功能是: 以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排,同时去除标点符号,之后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中。最后main()函数调用函数WriteDat()把结果xx输出到文件OUT6.DAT中。
例如: 原文: You He Me
I am a student.
结果: Me He You
student a am I
原始数据文件存放的格式是: 每行的宽度均小于80个字符, 含标点符号和空格。
-----------------
类型:字符串(单词)的倒置和删除。
void StrOL(void)
{ int i,j,k,m,n,ll;
char yy[80];/*定义到可能的最大值*/
for(i=0; i < maxline; i++)
{ ll=strlen(xx[i]); k=n=0;
for(j=ll-1; j>=0; j--)
{ if(isalpha(xx[i][j])) k++;
else
{ for(m=1; m<=k; m++)
yy[n++]=xx[i][j+m]; k=0; }
if(xx[i][j]==' ') yy[n++]=' ';}
for(m=1; m<=k; m++) yy[n++]=xx[i][j+m];
yy[n]=0; strcpy(xx[i],yy);
}
}
题目24:在三位整数(100至999)中寻找符合条件的整数并依次从小到大存入数组中;它既是完全平方数,又是两位数字相同,例如144、676等。请编制函数实现此功能,满足该条件的整数的个数通过所编制的函数返回。最后调用函数writeDat()把结果输出到文件out.dat中。
注意:部分源程序已给出。
请勿改动主函数main()和写函数writeDat()的内容。
--------------------
jsValue(int a[10][9]) /*表示*/
{int I,j,k=0;
int hun,ten,data;
for(I=100;I<=999;I++) 这个如何能表达是完全平方数呢?
{j=10;
while(j*j<=I)
{if (I==j*j)
{hun=I/100;data=I-hun*100;
ten=data/10;data=data-ten*10;
if(hun==ten||hun==data||ten==data)
{bb[k]=I;k++;}
}
j++;} }
return k;
}
题目25:下列程序的功能是:寻找并输出11至999之间的数m,它满足m,m2和m3均为回文数。所谓回文数是指其各位数字左右对称的整数,例如121,676,94249等。满足上述条件的数如m=11,m2=121,m3=1331皆为回文数。请编制函数int svalue(long m)实现此功能,如果是回文数,则函数返回1,反之则返回0。最后把结果输出到文件out.dat中。
注意:部分源程序已给出。
请勿改动主函数main()的内容。
-------------------
int jsvalue(long n)
{int i,aa[10],j=0,b=1;
while(n)
{ aa[j++]=n%10;计算数字的位数
n=n/10; }
for(i=0;i<j/2;i++)
if(aa[i]!=aa[j-i-1])判断是否是回文数
b=0;
return b; }
题目75:在文件in.dat中有200组数据,每组有3个数,每个数均是三位数。函数ReadDat()读取这200组数据存放到结构数组aa中,请编制函数jsSort(),其函数的功能是:要求在200组数据中找出条件为每组中的第一个数大于第二个数加第三个数的之和,其中满足条件的个数作为函数jsSort() 的返回值,同时把满足条件的数据存入结构数组bb中,再对bb中的数据按照每组数据的第一个数加第三个之和的大小进行升序排列(第一个数加第三个数的和均不相等),排序后的结果仍重新存入结构数组bb中,最后调用函数WriteDat()把结果bb输出到文件out.dat中。
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
-----------------------------------
int jsSort() /*标准答案*/
{int I,j,count=0;
Data val;/*数组的定义方法*/
for(I=0;I<200;I++)
if(aa[I].x1>aa[I].x2+aa[I].x3) 注意数组中某个数据的表达
{bb[count].x1=aa[I].x1; 将一组数据放入另外一组数据
bb[count].x2=aa[I].x2; 必须一个一个来
bb[count].x3=aa[I].x3;
count++;}
for(I=0;I<count-1;I++)
for(j=I+1;j<count;j++)
if (bb[I].x1+bb[I].x3<bb[j].x1+bb[j].x3)
{val=bb[I]; bb[I]=bb[j]; bb[j]=val;}
return count; 返回值的表达
}
题目70:已知在文件in.dat中存有若干个(个数<200)四位数字的正整数,函数readdat()读取这若干个正整数并存入数组xx中。请编制函数calvalue(),其功能要求:1、求出这文件中共有多少个正整数totnum;2、求这些数右移1位后,产生的新数是奇数的数的个数totcnt,以及满足此条件的这些数(右移前的值)的算术平均值totpjz,最后调用函数writedat()把所求的结果输出到文件out.dat中。
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数readdat()和输出数据函数writedat()的内容。
----------------------------
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;
}
题目20:编写函数jsvalue,它的功能是:求Fibonacci数列中大于t的最小的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为:
F(0)=0,F(1)=1
F(n)=F(n-1)+F(n-2)
最后调用函数writeDat()读取10个数据t,分别得出结果且把结果输出到文件out.dat中。
例如:当t=1000时,函数值为:1597。
注意:部分源程序已给出。
请勿改动主函数main()和写函数writeDat()的内容。
-----------------------
int jsValue(int t) /*标准答案*/
{ int f1=0,f2=1,fn;
fn=f1+f2;跟题目叙述不符合啊
while(fn<=t)
{f1=f2;
f2=fn;
fn=f1+f2;}
return fn;
}
完全不对啊!
题目35:某级数的前两项A1=1,A2=1,以后各项具有如下关系:An=An-2+2An-1.
下列程序的功能是:要求依次对于整数M=100,1000和10000求出对应的n值,使其满足:Sn<M且Sn+1>=M,这里Sn=A1+A2+...+An,
并依次把n值存入数组单元b[0],b[1]和b[2]中,请编制jsvalue()函数来实现此功能, 最后调用函数writeDat()把数组b[]中的值输出到out.dat文件中。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main()和写函数writeDat()的内容。
-------------------------
jsvalue()
{int a1=1,a2=1,a12,sn,k=2;
sn=a1+a2;
while(1) 其中的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;