本系列資料由"韜略宏智" 授權(quán)發(fā)布,任何網(wǎng)站不得轉(zhuǎn)載,否則追究法律責(zé)任。
第9題:
已知在文件in9.dat中存在若干個(<200)四位數(shù)字的正整數(shù),函數(shù)readDat()讀取這若干個正整數(shù)并存入數(shù)組xx中。請編制函數(shù)CalValue(),其功能要求:(1)求出這個文件中共有多少個正整數(shù)totNum;(2)求這些數(shù)右移1位后,產(chǎn)生的新數(shù)是偶數(shù)的數(shù)的個數(shù)totCnt,以及滿足此條件的這些數(shù)(右移前的值)的算術(shù)平均值totPjz,最后調(diào)用函數(shù)writeDat()把所求的結(jié)果輸出到文件out9.dat中。
部分程序已經(jīng)給出。
請勿改動主函數(shù)main()、讀函數(shù)readDat()和寫函數(shù)writeDat()的內(nèi)容。
#include
#include
#define MAXNUM 200
int xx[MAXNUM];
int totNum=0;
int totCnt=0;
double totPjz=0.0;
int readDat(void);
void writeDat(void);
void CalValue(void)
{
}
void main()
{
int i;
clrscr();
for(i=0;iif(readDat())
{
printf("數(shù)據(jù)文件in9.dat不能打開!\007\n");
return;
}
CalValue();
printf("文件in9.dat中共有正整數(shù)=%d個
【答案】
void Compute(void)
{
int i,yy[MAX];
for(i=0;i<1000;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;
}
【解析】
考點:(1)在給定的數(shù)據(jù)范圍內(nèi),統(tǒng)計偶數(shù)和奇數(shù)的平均值;
(2)求方差。
本題的解題思路是:逐個判斷數(shù)組xx中的元素的奇偶性,并分別統(tǒng)計出個數(shù)且累加到不同的變量中,從而求出平均值。判斷奇偶性可以通過判斷xx[i]%2的值來實現(xiàn),若為1則是奇數(shù),若為0則為偶數(shù)。統(tǒng)計個數(shù)可以通過設(shè)置一個記錄變量,每當條件成立時變量值加1來實現(xiàn)。方差的公式已經(jīng)給出只需轉(zhuǎn)換相應(yīng)的C語言表達式即可。
程序的流程是:首先調(diào)用ReadDat()函數(shù)將數(shù)據(jù)讀入xx數(shù)據(jù)中,然后通過Compute()函數(shù)對數(shù)據(jù)進行處理后,由WriteDat()函數(shù)將數(shù)據(jù)寫回文件中去,本題要求寫出ReadDat()函數(shù),考生可以不把此函數(shù)作為重點,在三級的上機考試當中,大多數(shù)的程序流程是:先從系統(tǒng)中讀取一個文件,并存放在指定一個位置,然后要求考生編寫程序處理這些數(shù)據(jù),由于我們不知道系統(tǒng)中文件的內(nèi)容和格式,故多數(shù)情況下不要求考生編寫。對此感興趣的考生可以分析一下ReadDat()函數(shù),其中feof()函數(shù)的功能是判斷文件指示器是否已達到了文件的結(jié)尾。
在Compute()函數(shù)中,首先進入一個for循環(huán)(i=1000結(jié)束),其內(nèi)嵌if語句的功能是判斷a[i]的奇偶性,如果xx數(shù)組中的元素不能夠被2整除,即為奇數(shù)時,odd加1,且把xx[i]累加到avel中,如果數(shù)組中的元素能夠被2整除,即為偶數(shù)時,even加1,且把xx[i]累加到ave2中,并把xx[i]順序存入數(shù)組yy中,然后通過“/=”將得出奇數(shù)的平均值avel和偶數(shù)的平均值ave2。最后一個for循環(huán)的功能是求方差totfc,關(guān)于求方差的公式在題目中已經(jīng)給出,這里只需轉(zhuǎn)換成相應(yīng)的C語言表達式而已,函數(shù)結(jié)束。