2010年計(jì)算機(jī)等級(jí)考試二級(jí)C:上機(jī)習(xí)題12套(3)

字號(hào):

2010年計(jì)算機(jī)等級(jí)考試二級(jí)C:上機(jī)習(xí)題12套(3)

    一、改錯(cuò)題
    【知識(shí)點(diǎn)】選擇法排序、指針與字符串、程序的調(diào)試
    【解析】程序中的錯(cuò)誤一般可以分為兩類,一類是語(yǔ)法錯(cuò)誤,即程序中有拼寫錯(cuò)誤,書寫不符合C語(yǔ)言的規(guī)定等,此類錯(cuò)誤可通過(guò)調(diào)試(按F9鍵),根據(jù)提示進(jìn)行改正。另一類是邏輯錯(cuò)誤,程序調(diào)試已通過(guò)(報(bào)success),但運(yùn)行結(jié)果不正確,此類錯(cuò)誤的修改必須要理解程序后方能改正。
    本題要求“從鍵盤上接受一個(gè)含有空格的字符串”,scanf是做不到的,它遇到第一個(gè)空格即認(rèn)為讀入完畢,故應(yīng)替換成gets函數(shù);程序中使用了strcpy函數(shù),就必須在程序開頭加上文件包含#include "string.h";根據(jù)選擇法升序排序要領(lǐng),每次找到一個(gè)“更小的字符”由r指著,直到指向最小的為止,而不是修改r所指字符的值,故if(*r>*q)*r=*q;應(yīng)改為if(*r>*q) r=q;;當(dāng)r與p所指不同時(shí),交換二者所指字符的值,即使得p所指字符為每次的最小,故應(yīng)將if(r/=p)改為if(r!=p)。
    【答案】①在程序開頭加上文件包含#include "string.h"
    ②將原第五行的scanf("%s",str);改為gets(str);
    ③將原第八行的*r=*q; 改為r=q;
    ④將原第九行的if(r/=p)改為if(r!=p)
    二、編程題
    【知識(shí)點(diǎn)】二維數(shù)組的應(yīng)用、數(shù)據(jù)文件的使用
    【解析】 關(guān)于“二維數(shù)組應(yīng)用”的題目,一般都要仔細(xì)觀察,找出規(guī)律后再編程。本題中原數(shù)組的任意一個(gè)元素a[i][j]旋轉(zhuǎn)后,位置處于b中第3-j行i列。注意,按要求必須調(diào)用函數(shù),且使用數(shù)據(jù)文件完成輸出。使用數(shù)據(jù)文件有5大步驟:①#include ,②用FILE *定義指針,③用fopen("A:\\myf2.out","w")打開文件并賦值給指針,④用fprintf輸出結(jié)果,⑤用fclose關(guān)閉文件。
    【注意】fopen("A:\\myf2.out","w")中盤符A:后要加雙斜杠表示根目錄,因?yàn)镃語(yǔ)言用轉(zhuǎn)義字符'\\'才能表達(dá)字符\;另外,文件的命名一定要嚴(yán)格按照規(guī)定處理,千萬(wàn)不要隨便命名。
    【參考答案】
    #include "stdio.h"
    int rotate(int a[4][4],int b[4][4]);
    main()
    {FILE *fp;
    int i,j,x[4][4],y[4][4],s;
    fp=fopen("A:\\myf2.out","w");
    if(fp= =NULL){printf("Can't create file myf2.out!");
    exit(1);}
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    scanf("%d",&x[i][j]);
    s=rotate(x,y);
    for(i=0;i<4;i++)
    {for(j=0;j<4;j++)
    fprintf(fp,"%d ",y[i][j]);
    fprintf(fp,"\n");
    }
    fprintf(fp,"sum=%d\n",s);
    fclose(fp);
    }
    int rotate(int a[4][4],int b[4][4])
    {int i,j,s=0;
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    b[3-j][i]=a[i][j];
    for(i=0;i<4;i++) s+=b[i][i];
    return s; }