- 相關(guān)推薦
2004年全國計算機(jī)等級考試三級C語言全真上機(jī)試題解析
第1題: 函數(shù)ReadDat()實(shí)現(xiàn)從文件ENG.IN中讀取一篇英文文章,存入到字符串?dāng)?shù)組xx中;請編制函數(shù)encryptChar(),按給定的替代關(guān)系對數(shù)組xx中的所有字符進(jìn)行替代,仍存入數(shù)組xx的對應(yīng)的位置上,最后調(diào)用函數(shù)WriteDat()把結(jié)果xx輸出到文件PS10.DAT中。替代關(guān)系:f(p)=p*11 mod 256 (p是數(shù)組中某一個字符的ASCII值,f(p)是計算后新字符的ASCII值),如果原字符的ASCII值是偶數(shù)或計算后f(p)值小于等于32,則該字符不變,否則將f(p)所對應(yīng)的字符進(jìn)行替代。
??void encryptChar()
??{int i;
??char *pf;
??for(i=0;i??{pf=xx[i];
??while(*pf!=0)
??{if(*pf==*pf/2*2||*pf*11%256<32)
??{pf++;continue;}
??*pf=*pf*11%256;
??pf++;}}}
??注:在ReadDat()函數(shù)中由于fgets()函數(shù)讀入數(shù)據(jù)時沒有讀入字符串結(jié)束符#39;0#39;,因而用while()循環(huán)在xx數(shù)組每一行未尾將換行符#39;n#39;替換成結(jié)束符#39;0#39;。編寫的函數(shù)如下:該函數(shù)的基本算法是——讓字符指針pf指向每一行的開頭然后逐一往后移動,在移動過程中按要求進(jìn)行轉(zhuǎn)換。*pf=*pf/2*2用于判斷是否為偶數(shù)。if()條件語句用于控制不替代字符。
??
??第2題:
??函數(shù)ReadDat()實(shí)現(xiàn)從文件in.dat中讀取20行數(shù)據(jù)存放到字符串?dāng)?shù)組xx中(第行字符串長度均小于80)。請編制函數(shù)jsSort(),其函數(shù)的功能是:以行為單位對字符串按給定的條件進(jìn)行排序,排序后的結(jié)果仍按行重新存入字符串?dāng)?shù)組xx中,最后調(diào)用函數(shù)WriteDat()把結(jié)果xx輸出到文件out.dat中。
?? 條件:從字符串中間一分為二,左邊部分按字符的ASCII值升序排序,排序后左邊部分與右邊部分進(jìn)行交換。如果原字符串長度為奇數(shù),則最中間的字符不參加處理,字符仍放在原位置上。
??例如:字符串 d c b a h g f e 則處理后字符串 h g f e a b c d
??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??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=half-1,k=strl-1;j>=0;j--,k--)
??{ch=xx[i][j];
??xx[i][j]=xx[i][k];
??xx[i][k]=ch;}}
??注:先采用冒泡法對左邊部分進(jìn)行升序排序,然后將排序后的左半與右半按對應(yīng)位進(jìn)行調(diào)換。
??
??第3題:
??已知數(shù)據(jù)文件IN.DAT中存有300個四位數(shù),并已調(diào)用讀函數(shù)ReadDat()把這些數(shù)存入數(shù)組a中,請編制一函數(shù)jsValue(),其功能是:求出千位數(shù)上的數(shù)加百位數(shù)等于十位數(shù)上的數(shù)加個位數(shù)上的數(shù)的個數(shù)cnt,再求出所有滿足此條件的四位數(shù)平均值pjz1,以及不滿足此條件的四位數(shù)平均值pjz2,最后調(diào)用寫函數(shù)writeDat()把結(jié)果輸出到OUT.DAT文件。例如:7153,7+1=5+3,則該數(shù)滿足條件計算平均值pjz1,且個數(shù)cnt=cnt+1。8129,8+1<>2+9,則該數(shù)不滿足條件計算平均值pjz2.
??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;}
??注:該題的關(guān)鍵在于取出一個數(shù)的個、十、百、千位上的數(shù)。a[i]%10結(jié)果為個位數(shù),a[i]%100/10先對100求余得出后兩位數(shù)然后再除10,由于為整數(shù)因此得出上一個后兩位數(shù)的第一位。依此類推
??第4題:
??下列程序的功能是:先出5000以下符合條件的自然數(shù)。條件是:千位數(shù)字與百位數(shù)字之和等于十位數(shù)字與個位數(shù)字之和,且千位數(shù)字與百位數(shù)字之和等于個位數(shù)字與千位數(shù)字之差的確10倍。計算并輸出這些四位自然數(shù)的個數(shù)cnt以及這些數(shù)的和sum。請編寫函數(shù)countvalue
??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;}}
??注:該題的關(guān)鍵亦是如何取出各位數(shù)字
??
??第5題:
??已知在文件IN.DAT中存有100個產(chǎn)品銷售記錄,每個產(chǎn)品銷售記錄由產(chǎn)品代碼dm(字符型4位),產(chǎn)品名稱mc(字符型10位),單價dj(整型),數(shù)量sl(整型),金額je(長整型)四部分組成。其中:金額=單價*數(shù)量計算得出。函數(shù)ReadDat()是讀取這100個銷售記錄并存入結(jié)構(gòu)數(shù)組sell中。請編制函數(shù)SortDat(),其功能要求:按產(chǎn)品代碼從大到小進(jìn)行排列,若產(chǎn)品代碼相同,則按金額從大到小進(jìn)行排列,最終排列結(jié)果仍存入結(jié)構(gòu)數(shù)組sell中,最后調(diào)用函數(shù)WriteDat()把結(jié)果輸出到文件OUT10.DAT中。
??void SortDat()
??{int i,j;
??PRO swap;
??for(i=0;i??for(j=0;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??{swap=sell[j];
??sell[j]=sell[j+1];
??sell[j+1]=swap;
??}}}
??注:這時也是采用冒泡法進(jìn)行排序。與前面的冒泡法在寫法上有所不同請注意區(qū)分。同時注意結(jié)構(gòu)體變量的引用格式。
??
??第6題:
??下列程序的功能是:選取出100以上1000以內(nèi)所有個位數(shù)字與十位數(shù)字之和被10除所得余數(shù)恰是百位數(shù)字的素數(shù)(如293)。計算并輸出上述這些素數(shù)的個數(shù)CNT以及這些素數(shù)值的和SUM。請編寫函數(shù)COUNTVALUE()實(shí)現(xiàn)程序要求
??void countvalue()
??{int i,j;
??for(i=100;i<1000;i++)
??{for(j=2;j??if(i%j==0) break;
??if(j==i&&((i%10+i/10%10)%10==i/100))
??{cnt++;
??sum+=i;}}}
?? 注:內(nèi)嵌的for()循環(huán)用來判斷i以前的數(shù)有否能整除i的數(shù)若能則提前終止循環(huán),第二個if()中j= =i的作用是配合前面的for()判斷i是否是素數(shù)。
??
??第7題:
??下列程序的功能是:在三位整數(shù)(100至999)中尋找符合條件的整數(shù)并依次從小到大存入數(shù)組中;它既是完全平方數(shù),又是兩位數(shù)字相同,例如144、676等。
??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;}
??}
??注:注意在i==(int)sqrt(i)*(int)sqrt(i)中只有當(dāng)i是完全平方數(shù)時開平方后再取整才不會丟失任何數(shù)據(jù)。
??
??第8題:
??函數(shù)ReadDat()實(shí)現(xiàn)從文件IN.DAT中讀取一篇英文文章存 入到字符串?dāng)?shù)組xx中,請編制函數(shù)CharConvA(),其函數(shù)的功能是:以行為單位把字符串中的最后一個字符的ASCII值右移4位后加最后第二個字符的ASCII值,得到最后一個新的字符,最后第二個字符的ASCII值右移4位后加最后第三個字符的ASCII值,得到最后第二個新的字符,依此類推一直處理到第二個字符,第一個字符的ASCII值加原最后一個字符的ASCII值,得到第一個新的字符,得到的新字符分別存放在原字符串對應(yīng)的位置上。最后已處理的字符串仍按行重新存入字符串?dāng)?shù)組xx中。
??void CharConvA(void)
??{int i,j,strl;
??char ch;
??for(i=0;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;}}
??注:在該題中主要是控制好每一個字符的走動,由于最后要用到原來的最后一個字符故先將其存入一個字符變量中。
??
??第9題:
??現(xiàn)有一個10個人100行的選票數(shù)據(jù)文件IN.DAT,其數(shù)據(jù)存放的格式是每條記錄的長度均為10位,第一位表示第一個人的選中情況,第二位表示第二個人的選中情況,依此類推 :內(nèi)容均為字符0和1,1表示此人被選中,0表示此人未被選中,若一張選票人數(shù)小于等于5個人時被認(rèn)為無效的選票。給定函數(shù)ReadDat()的功能是把選票數(shù)據(jù)讀入到字符串?dāng)?shù)組xx中。請編制函數(shù)CountRs()來統(tǒng)計每個人的選票數(shù)并把得票數(shù)依次存入yy[0]到y(tǒng)y[9]中。
??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]==#39;1#39;)
??count++;
??if(count<=5)
??continue;
??for(j=0;xx[i][j];j++)
??if(xx[i][j]==#39;1#39;) yy[j]++;}}
??注:題目要求將那些選了不超過5人的選票視為無效票,即一張選票中如果‘1’不超過5個則為無效選票。該題先用for()循環(huán)對100行選票進(jìn)行循環(huán),在循環(huán)內(nèi)先進(jìn)行用for()循環(huán)數(shù)出這張選票中選中的人數(shù)(count)再用if()判斷,如果選中人數(shù)小于等于5則continue即判斷下一張選票,否則用內(nèi)嵌的for()對行內(nèi)的數(shù)據(jù)進(jìn)行判斷,注意如果數(shù)據(jù)為‘1’時才對對應(yīng)的人增加1。
??
??第10題:設(shè)有n個人圍坐一圈并按順時針方向從1到n編號,從第s個人開始進(jìn)行1到m的報數(shù),報數(shù)到第個m人,此人出圈,再從他的下一個人重新開始1到m的報數(shù),如此進(jìn)行下去直到所有的人都出圈為止。現(xiàn)要求按出圈次序,每10人一組,給出這n個人的順序表。請考生編制函數(shù)Josegh()實(shí)現(xiàn)此功能并調(diào)用函數(shù)WriteDat()把結(jié)果p輸出到文件OUT.DAT中。設(shè)n=100,c=1,m=10.
??(1)將1到n個人的序號存入一維數(shù)組p中;
??(2)若第i個人報數(shù)后出圈,則將p[i]置于數(shù)組的倒數(shù)第i個位置上,而原來第i+1個至倒數(shù)第i個元素依次向前移動一個位置;
??(3)重復(fù)第(2)步直至圈中只剩下p[1]為止。
??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??p[j-1]=p[j];
??p[i-1]=w;}}
??題中第一個for()循環(huán)是先對數(shù)組p賦初值。在第二個for()中用i來控制沒出圈的總?cè)藬?shù),s1=(s1+m-1)%i的作用是找出報數(shù)后出圈人的下標(biāo),其中對i求余的作用是使報
??數(shù)按圈進(jìn)行(即報到尾后又從頭報),該算法在很多題目中都用到。由于求余的作用當(dāng)報數(shù)正好到最后一個時s1為0,故而要進(jìn)行if(s1==0)的判斷。內(nèi)嵌的for()循環(huán)是將出圈以后的人依次往前移。http://www.dgxbdz.com/
【全國計算機(jī)等級考試三級C語言全真上機(jī)試題解析】相關(guān)文章:
計算機(jī)等級考試三級(C語言)上機(jī)考試試題總結(jié)08-10
全國計算機(jī)等級考試一級WPSOFFICE上機(jī)全真試題07-23
07年4月全國計算機(jī)等級考試三級PC上機(jī)試題07-23
計算機(jī)等級考試三級網(wǎng)絡(luò)技術(shù)上機(jī)模擬試題08-02
2006年9月全國計算機(jī)等級考試三級PC技術(shù)上機(jī)試題07-23
2007年4月全國計算機(jī)等級考試三級PC技術(shù)上機(jī)試題07-23