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