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