計算機等級考試三級網(wǎng)絡(luò)復(fù)習資料總錄

字號:

設(shè)有n個人圍坐一圈并按順時針方向從1到n編號,從第s個人開始進行1到m的報數(shù),報數(shù)到第個m人,此人出圈,再從他的下一個人重新開始1到m的報數(shù),如此進行下去直到所有的人都出圈為止。現(xiàn)要求按出圈次序,每10人一組,給出這n個人的順序表。請考生編制函數(shù)josegh()實現(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]為止。
    部分源程序已給出。
    請勿改動主函數(shù)main()和輸出數(shù)據(jù)函數(shù)writedat()的內(nèi)容。 #include
    #define n 100
    #define s 1
    #define m 10
    int p[100],n,s,m;
    void writedat(void);
    void josegh(void)
    {
    }
    void main()
    {
    m=m;
    n=n;
    s=s;
    josegh();
    writedat();
    }
    void writedat(void)
    {
    int i;
    file *fp;
    fp=fopen("out.dat" ," w" );
    for(i=n-1;i>=0;i--){
    printf(" M" ,p[i]);
    fprintf(fp," M" ,p[i]);
    if(i % 10==0){
    printf("\n" );
    fprintf(fp, "\n" );
    }
    }
    fclose(fp);
    }
    解法:
    這是南開題中的,其實個人認為這個題目是的要求很低,只是要你把題目中描述的算法用代碼實現(xiàn)出來。
    題目中已經(jīng)給出了算法過程,我們下面就看看怎么用代碼實現(xiàn):
    (1)將1到n個人的序號存入一維數(shù)組p中;
    這個我想大家應(yīng)該都沒有問題的了:很簡單的一句循環(huán)賦值。
    for(i=1;i<=n;i++)p[i-1]=i;
    (2)若第i個人報數(shù)后出圈,則將p[i]置于數(shù)組的倒數(shù)第i個位置上,而原來第i+1個至倒數(shù)第i個元素依次向前移動一個位置;
    (3)重復(fù)第(2)步直至圈中只剩下p[1]為止。
    難點就在這后面兩步,首先可以看出是要做一個循環(huán),而且循環(huán)的條件是遞減
    馬上可以先寫出一個循環(huán)遞減的框架
    for(i=n;n>1;n--){}
    接下來就是該怎么寫循環(huán)體的內(nèi)容了:我們可以發(fā)現(xiàn),題目的算法過程2描述的很清楚,具體如下:
    s=(s+m-1)%i;首先,求出出圈人的位置,這里用一個求余是為了實現(xiàn)圈循環(huán)(也就是將隊列頭尾相連),這里i是圈中剩余的人數(shù)(除去出圈后的人)。 當然,我們稍微注意一下,那就是沒有第0位的出圈人存在,所以這里如果s=0是不對的,
    其實這種情況是出圈人是隊尾的那一個人,所以這里加上一個判斷:
    if(s==0)s=i;
    好了,我們?nèi)〉搅顺鋈θ说奈恢昧?,那我們就要?BR>    "則將p[i]置于數(shù)組的倒數(shù)第i個位置上,而原來第i+1個至倒數(shù)第i個元素依次向前移動一個位置"
    實現(xiàn)這一句的算法過程的代碼,可以看出也是一個循環(huán):
    w=p[s-1]; 首先,把出圈人的號碼暫時放起來(因為此時倒數(shù)第i個位置還有人占據(jù),不能替換掉)
    接著我們要把倒數(shù)第i個位置騰空出來,
    而這個算法的實現(xiàn)就是“第i+1個至倒數(shù)第i個元素依次向前移動一個位置”
    明白了這句話的意思后,馬上可以寫出下面的一個循環(huán)代碼來實現(xiàn)
    for(j=s;j