2015軟考程序員考試最后沖刺題及答案

字號:


    1.設有定義語句“int a[]={2, 4,6,8,10},*p=s;”,則值為8的表達式是( )
    A.*p+3
    B.*p+4
    C.*(p+4)
    D.*(s+3)
    【解析】分析四個備選答案,可以看出是用指針法來引用數組a的元素。當指針變量p已經指向數組。的首地址后(正如本題那樣),*(p+i)和*(s+i)都是數組元素a[i]。對于備選答案A:*p就是數組元素。a[0],其值為2,再加3結果為5,不符合題意。同樣道理,備選答案B中的*p十4的值為6,也不符合題意。對于備選答案C:*(p+4)代表數組元素a[4],其值為10,也不符合題意。顯然本題答案應選D。因為*(s+3)就是數組元素s[3],其值為8。
    【參考答案】 D
    2.下列數據類型中不屬于構造類型的是 ( )
    A.數組型
    B.結構型
    C.共用型
    D.枚舉型
    【解析】教材中明確指出:構造類型只包括:數組型、結構型。共用型三種,所以本題答案應選D。
    【參考答案】D
    3.函數fopen()的返回值不能是( )
    A.NULL
    B.0
    C.1
    D.某個內存地址
    【解析】函數fope()的返回值有兩種可能:一是正確打開了文件,將返回某個地址,程序中一般是用文件型指針變量來接受的;二是打開文件時出現錯誤,此時返回值是符號常量“NULL”,其值為0。所以本題答案應選C。
    【參考答案】C
    4.以只寫方式打開一個二進制文件,應選擇的文件操作方式是( )
    A."a+"
    B."w+"
    C."rb"
    D."Wb"
    【解析】打開文件時,如果是“只寫方式”,則只能選用字符“ w”;如果要打開的文件是二進制文件,則需要選用字符“b”,所以本題答案應選 D。
    【參考答案】 D
    5.設有定義語句“char ch='\77';”,則下列說法中正確的是( )
    A.ch中含有1個字符
    B.ch中含有2個字符
    C.ch中含有3個字符
    D.語法出錯
    【解析】從定義語句中可以看出,變量ch是字符型變量,顯然只能存放單個字符,所以備選答案B和C是錯誤的說法。再分析賦予的初值,'\77'是在“\”符號的后面跟有2位的人進制數,所以'\77'是轉義字符,轉義字符是單個字符,所以本題答案應選A。
    【參考答案】 A
    6.設有函數調用語句“f(x1,x1+x2,(x1,x2));”,正確的說法是( )
    A.調用的實際參數是2個
    B.調用的實際參數是3個
    C.調用的實際參數是4個
    D.調用時會出現語法錯誤。
    【解析】對函數調用來說,實際參數一般都是表達式,而表達式之間必須用逗號來分隔,所以只要區(qū)分調用時的表達式數目,即是實妹參數的數目。對本題來說,第1個表達式是“x1”、第2個表達式是“x1+x2”、第3個表達式是一個逗號表達式“x1,x2”,所以本題的函數調用時,表達式的數目為3,當然實際參數的數目就是3,所以本題答案應選B。
    【參考答案】B
    7.計算平方數時不可能引起二義性的宏定義是( )
    A.#define SOR(x)x*x
    B.#define SQR(x)(x)*(x)
    C.# define SQR(x)(x*x)
    D.# define SQR(x)((x)*(x))
    【解析】分析備選答案A:如果宏引用是“SQR(2+3)”,則宏替換后的結果是“2+3*2+3”,結果是錯誤的,因此這個答案可能引起二義性。分析備選答案B:如果宏引用是“ 3/SQR(2+3)”,則宏替換后的結果是“3/(2+3)*(2+3)”,結果也是錯誤的,因此這個答案可能引起二義性。分析備選答案C:如果宏引用是“SQR(2+3)”,則宏替換后的結果是“(2+3*2+3)”,結果也是錯誤的,因此這個答案可能引起二義性。只有備選答案D不會引起二義性。所以本題答案應選D。
    【參考答案】D
    8.執(zhí)行下列程序段后,x的位是( )
    int a=8,b=7,c=6,x=1;
    if(a>6)if(b>7)if(c>8)x=2;else x=3;
    A.0
    B.1
    C.2
    D.3
    【解析】按照"else"只和前面最近的"if"配對的原則,上述程序段可以寫成下列更為清晰的程序清單:
    int a=8,b=7,c=6,x=1;
    if(a>6)
    if(b>7)
    if(c>8)
    x= 2:
    else
    x=3:
    依據a、b、c的值,很容易看出第1個“if語句”的條件“a>6”是成立的,接著執(zhí)行第2個“if語句”,該語句的條件“b>7”,是不成立的,所以下面的“if-esle”語句不執(zhí)行,因此x的值不變,仍為1。所以本題答案應選B。
    【參考答案】B
    9.執(zhí)行下列程序段后,變量y的值為( )
    int x[]={1,2,3,4},y,*p=&x[1];
    y=(*--P)++;
    A.1
    B.2
    C.3
    D.4
    【解析】從數據定義語句中可以得出下列結論:指針變量P指向的數組元素是x[1]。再來分析賦值句的右邊表達式“(*--p)++”,其中的“--”優(yōu)先于“*”先計算“--p”,使得p指向數組元素x[0];所以“(*--p)”就是數組元素a[0],再計算其后的“++”,由于“++”是后綴,所以表達式的值就是數組元素x[0]的值,為1,然后再對數組元素x[0]加1。因此變量y的值是1。本題答案應選A。
    【參考答案】A
    10.能正確表達邏輯關系“-1
    A.(-1
    B.(-1
    C.((-1
    D.(-1
    【解析】注意數學中的“-1
    【參考答案】 D
    11.函數調用時,下列說法中不正確的是 ( )
    A.若用值傳遞方式,則形式參數不予分配內存
    B.實際參數和形式參數可以同名
    C.主調函數和被調用函數可以不在同一個文件中
    D.函數間傳送數據可以使用外部全局變量
    【解析】分析備選答案A:值傳遞時,先給形參分配內存,然后把實參值傳給形參分配的內存,所以該說法是錯誤的,本題答案應選A。至于備選答案B:形參和實參是可以同名的,因為它們的作用域不重復。備選答案C:只要被調函數定義時的存儲類型選取“extern”,就可以被其他文件中的函數調用。備選答案D:函數間傳遞數據的方法有4種,其中的一種就是利用外部全局變量來傳遞的。
    【參考答案】 A
    12.下列關于結構型變量的定義語句中,錯誤的是( )
    A. typedef struct CCC
    B. #define GGG struct
    { char name[20];GGG CCC { char name[20];
    int age; int age;
    }GGG;          ?。?
    GGG abc ; GGG CCC abc;
    C.struct
    D.struct
    { char name[20]; { char name[20];
    int age; int age;
    }ccc;        }abc;
    CCC abc;
    【解析】分析備選答案 A:利用“typedef”定義了用戶自定義的數據類型符“GGG”,這個用戶自定義的數據類型符是含有兩個成員的結構型 CCC,所以語句“GGG abc”是定義結構型CCC的變量abc,語法沒有錯誤。分析備選答案B:利用“#define”定義了宏名“GGG”,這個宏名第一次出現是定義結構型CCC,第二次是定義了結構型CCC的變量allc,所以語法上沒有錯誤。分析備選答案C:這是定義一個沒有名稱的結構型,同時定義了這種結構型的變量CCC,接著的語句“CCC abc;”顯然是錯誤的,因為CCC是變量名,不是數據類型符,該答案符合題意。至于備選答案D:這是標準的通過定義沒有名稱的結構型來定義該結構型的變量abc,語法上沒有錯誤。
    【參考答案】C
    二、程序分析
    1.main()
    { char str[]="1234567";
    int i;
    for(j=0;i<7;i十=3)
    printf("%s\n",str+i);
    }
    【解析】分析份循環(huán)語句可知,控制變量 i的值只能依次等于0、3、6。再分析輸出語句中的輸出格式,這是字符串格式,要求輸出表達式是存放字符串的首地址。而輸出表達式是“str+i”。我們針對i不同值來-一分析:i=0,str+0就是str,其中存放的字符串是“1234567”,所以第1行上的輸出就是:1234567。當 i=3時,str+3,代表了數組元素str[3]的地址,從這兒開始的字符率串是“4567”,所以第2行輸出的是:4567。同樣道理,i=6時, str+6是元素str[6]的地址,從該地址存放的字符率是"7",所以第3行輸出的是:7。
    【參考答案】 1234567
    4567
    7
    2.struct a{ char name[10];
    int age;
    }aa[3]={{"abc",20},{"def",21},{"ghi",22}};
    main()
    { struct a *paa=aa;
    printf("%c%c%c",(*(paa+1)).name[0]
    (*paa++).name[1]
    (*(paa+1)).name[2]);
    }
    【解析】本程序并不復雜,關鍵在于如何使用指向結構型數組的指針變量來引用該數組元素,以及如何引用結構型成員是數組的數組元素。
    首先看結構型a及對應數組aa的定義和賦予的初值。
    結構型a共有兩個成員,一個是字符型數組name,另一個是整型age。
    結構型數組aa有3個元素,所賦予的初值如下:
    aa[0].name="abc" aa[0].age=20
    aa[1].name="def" aa[1].age=21
    aa[2].name="ghi" aa[2].age=22
    主函數中的第1個語句是定義結構型指針變量paa,并且使它指向結構型數組aa的首地址。注意,此后的*paa就是aa[0],*(paa+i)就是aa[i]。
    現在可以分析輸出語句了。輸出格式是3個字符格式,按照printf()函數的規(guī)定,表達式表中表達式計算順序是自右向左進行的,下面依次討論這3個字符格式對應的輸出表達式。
    第3個輸出表達式是“(*(paa十1)).name[2]",其中的“*(paa+1)”代表“aa[1]”,所以該表達式就是“aa[1].name[2]”,對應的字符是'f'。
    第 2個輸出表達式是"(*paa++).name[1]”,其中“*ppa++”的“*”和“++”是同級運算符,結合性是自右向左的,所以“++”先計算,由于是后綴,所以要先計算“*paa”,它代表“aa[0]”,所以該表達式就是“aa[0].name[1]”,對應的字符是'b'。注意,最后要對paa進行“++”運算,使其指向aa[1]。
    第 1個輸出表達式是“(*(paa+1)).name[0]”,注意現在的paa以及指向aa[1]了,所以其中的“*(paa+1)”代表“aa[2]”,所以該表達式就是“aa[2].name[0]”,對應的字符是'g'。
    現在可以得出結論:程序的輸出是 3個字符:gbf
    【參考答案】gbf
    3.main()
    { int x1,x2,x3,x4;
    x1=x2=x3=x4=1;
    switch(x1)
    { case 1:switch(x2)
    { case 0:x3++;break;
    case 1:x4--;
    }
    case 2:x3++,x4--;
    }
    printf("%d%d",x3,x4);
    }
    【解析】本題的關鍵是嵌套的多分支語句switch。注意在執(zhí)行switch語句前,變量x1、x2、x3、x4已經賦值,他們的值均為1。執(zhí)行外層switch語句時,用于控制分支選擇的變量x1的值為1,所以要執(zhí)行的是“case 1”的分支。該分支又是一個switch語句,用于控制分支選擇的變量x2的值為1,所以需要執(zhí)行的是“case 1”的分支。該分支執(zhí)行的語句是“x4--”,使得x4的值變?yōu)?。接著退出該分支,即退出內層的switch語句。由于外層的switch語句的“case 1”分支中沒有“break”語句,所以將繼續(xù)執(zhí)行其后的“case 2”分支,即執(zhí)行“x3++,x4--;”,結果x3等于2, x4等于-1。再退出外層switch語句,執(zhí)行輸出語句,此時,變量x3的值為2;變量x4的值為-1。所以輸出結果是2-1。
    【參考答案】2-1。
    4.conv(b)
    int b;
    { if(b>=2)conv(b/2);
    printf("%d",b%2);
    return;
    }
    main()
    { int d;
    scanf("%d",&d);
    conv(d);
    }
    說明:本程序執(zhí)行時從鍵盤上輸入:22后跟回車鍵。
    【解析】主函數中輸入整數22存入變量d中,然后調用函數。conv()。此時將把實參d中的22傳遞給形參b。然后再執(zhí)行函數體,函數體中前面一條語句是單分支語句,當b>=2時再用“b/2”調用自己,顯然這是一個遞歸調用的函數。下面我們來詳細分析遞歸調用的過程:
    第1次調用函數(b=22),滿足條件,引起第2次調用自己(b/2=11)
    第2次調用函數(b=11),滿足條件,引起第3次調用自己(b/2=5)
    第3次調用函數(b=5),滿足條件,引起第4次調用自己(b/2=2)
    第4次調用函數(b=2),滿足條件,引起第2次調用自己(b/2=1)
    第5次調用函數(b=1),不滿足條件,執(zhí)行輸出語句,輸出結果為 b%2=1%2=1
    執(zhí)行第5次調用的返回,執(zhí)行第今次調用時的輸出語句,輸出結果為b%2=2%2=0
    執(zhí)行第4次調用的返回,執(zhí)行第3次調用時的輸出語句,輸出結果為b%2=5%2=1
    執(zhí)行第3次調用的返回,執(zhí)行第2次調用時的輸出語句,輸出結果為b%2=11%2=1
    執(zhí)行第2次調用的返回,執(zhí)行第1次調用時的輸出語句,輸出結果為b%2=22%2=0
    執(zhí)行第1次調用的返回,將返回主函數,結束程序的運行。
    所以程序運行的輸出結果是:10110。
    【參考答案】10110。
    5.void f(p1,p2)
    int *p1,*p2;
    { int i,j;
    *p2=0;
    for(i=0;i<3;i++)
    for(j=i;j<3;j++)
    *p2+=*(pl+i*3+j);
    return;
    }
    main()
    { int a[3][3]={{1,2},{3,4},{5,6}};
    int s;
    f(a,&s);
    printf("%d",s);
    }
    【解析】本程序是由一個無返回值的函數f()和主函數組成的。先看主函數,定義了一個3行3列的二維數組a,并且給a賦了初值,初值如下:
    a[0][0]=1 a[0][1]=2 a[0][2]=0
    a[1][0]=3 a[1][1]=4 a[1][2]=0
    a[2][0]=5 a[2][1]=6 a[2][2]=0
    接著調用無返回值的函數f(),然后輸出變量s中的值,顯然這個s中的值是在函數f()中獲得的。
    接下來分析函數f()。該函數有兩個形參,第1個形參是指針變量p1,對應的實際參數是數組a的首地址,即調用該函數后,指針變量p1是指向二維數組a的首地址。第2個形參也是指針變量p2,對應的實參是變量s的地址,即函數調用后指針變量p2是指向變量s的。再來分析函數體。前面定義了兩個變量i和j,從后面的循環(huán)語句中看出是二重循環(huán)的控制變量。接著,通過“*p2=0”,給變量s賦值0。二重for循環(huán)的循環(huán)體是“*p2+=*(p1+i*3+j)”,其中的“*p2”是代表變量s的,“*(p1+i*3+j)”是代表數組元素a[i][j],這個賦值語句是把a[i][j]加到變量s中(即求數組元素的和)?,F在只要分析清楚二重循環(huán)是對哪些數組元素進行求和的就可以得出變量s的值了。
    下面是對二重循環(huán)的執(zhí)行記錄:
    i=0 j=0 對應a[0][0],其值為1
    j=1 對應a[0][1],其值為2
    j=2 對應a[0][2],其值為0
    i=1 j=1 對應a[1][1],其值為4
    j=2 對應a[1][2],其值為0
    i=2 j=2 對應a[2][2],其值為0
    所以,s=a[0][0]+a[0][l]+a[0][2]+a[1][1]+a[2][2]+a[2][2]= 1+2+0+4+0+0=7。
    【參考答案】7
    6. main()
    { int i,a[5];
    for(i=0;i<<5;i++)
    a[i]=9*(i-2+4*(i>2))%5;
    for(i=4;i>=0;i--)
    printf("=",a[i]);
    }
    【分析】我們可以按照程序中語句執(zhí)行的順序,記錄各個變量及數組元素值的方法來解決這種閱讀程序寫運行結果的問題。首先執(zhí)行第1個for循環(huán)。
    i=0, i<5的條件成立,執(zhí)行循環(huán)體。
    a[0]=9*(0-2+4*(0>2))%5=9*(-2)%5=-18%5=-3
    i=1,1<5的條件成立,執(zhí)行循環(huán)體。
    a[1]=9*(1-2十4*(1>2))%5=9*(-1)%5=-9%5=-4
    1=2,i<5的條件成立,執(zhí)行循環(huán)體。
    a[2]=9*(2-2十4*(2>2))%5=9*(0)%5=0%5=0
    i=3,i<5的條件成立,執(zhí)行循環(huán)體。
    a[3]=9*(3-2+4*(3>2))%5=9*(5)%5=45%5=0
    1=4,1<5的條件成立,執(zhí)行循環(huán)體。
    a[4]=9*(4-2+4*(4>2))%5=9*(6)%5=54%5=4
    i=5,1<5的條件不成立,退出第1個for循環(huán)。
    注意,計算中的“i>2”是關系運算,結果只能為1或0;“x%5”是模運算,結果是x除5的余數,且余數的符號和x符號相同。
    再執(zhí)行第2個for循環(huán)。
    i=4,i>=0的條件成立,執(zhí)行循環(huán)體。輸出數組元素a[4]的值,等于4
    i=3,i>=0的條件成立,執(zhí)行循環(huán)體。輸出數組元素a[3」的值,等于0
    i=2,1>=0的條件成立,執(zhí)行循環(huán)體。輸出數組元素a[2」的位,等于0
    i=1,i>=0的條件成立,執(zhí)行循環(huán)體。輸出數組元素a[1]的值,等于-4
    i=0,1>=0的條件成立,執(zhí)行循環(huán)體。輸出數組元素a[0]的值,等于-3
    i=-1,i>=0的條件不成立,退出第2個for循環(huán)。
    【參考答案】 4 0 0 -4 -3
    7.main()
    { char s[][6]={”1234”,”56789”},*p[2];
    int i,sum=0;
    p[0]=s[0],p[1]=s[1];
    for(i=0;p[0][i」!=’\0’;i++,i++)
    sum=10*sum+p[0][i]-’0’;
    for(i=1;p[1]「i」!=’\0’;i++,i++)
    sum=10*sum+p[1][i]-’0’;
    printf("%d",sum);
    }
    【解析】本程序的第1條語句是定義2行5列的二維字符型數組s,并且賦了初值如下:
    s[0][0]='1's[0][1]='2's[0][2]='3's[0][3]='4's[0][4]='\0'
    s[1][0]='5's[1][1]='6's[1][2]='7's[1][3]='8's[1][4]='9'S[1][5]='\0'
    此外還定義了字符型指針數組p,利用第3條語句賦了值,結果如下:
    p[0]指向以“s[0][i]”為數組名的一維數組首地址,即p[0][i]就相當于s[0][i]
    p[1]指向以“s[1][i]”為數組名的一維數組首地址,即p[1][i]就相當于s[1][i]
    第2條語句定義了整型變量i(用于單重循環(huán)的控制變量)和sum,并對sum清0。
    第4條語句是for循環(huán),控制變量i初值為0,每次加2,控制循環(huán)的條件是“p[0」[i]!='\
    0',注意其中的“p[0][i]”就是“s[0][i]”,這個控制循環(huán)的條件可以理解為“二維字符型數組元素s[0][i]不是字符串的結束標記則繼續(xù)循環(huán)”。從控制變量i的取位來看,二維字符型數組元素只能取s[0][0]、s[0][2],因為下一個數組元素是s[0][4],該元素值是'\0'。再分析循環(huán)體中的語句,其中“ p[0][i]-'0'”是將數組元素s[0][i]中存放的數組字符減去'0',結果將是該數字字符對應的一位整數,整個語句是將sum變量中的原值乘以10以后再加上當前的數字。循環(huán)結束后的sum值就是s[0」[0」和s[0][2]中的兩個數字組成的2位十進制數,結果為13。
    按照同樣的道理,可以分析出第2個for循環(huán)作用是完全相同的,它是把s[1」[1」、s[1][3]中的兩個數字(前者為6,后者為8)拼接到sum的原值中,結果sum中值為十進制整數1368。程序的最后一個語句就是輸出變量sum中的整數值。
    【參考答案】 1368
    8.int p(m,n)
    int m,n;
    { int i,pp;
    for(i=pp=1;i
    PP*= m;
    return(pp);
    }
    main()
    { printf("%d"、 p(3,4));
    }
    【解析】主函數中只有一條輸出語句,輸出結果是函數調用“p(3,4)”的返回值。所以本題的關鍵是函數p的功能。
    分析函數p(),有兩個參數m、n。函數體中關鍵的是for循環(huán)語句。分析這個循環(huán)語句可以看出,控制變量是i,初值為1;,終值為n,每次循環(huán)i加1。所以是標準的次數型循環(huán),共計循環(huán)n次。循環(huán)體中是將參數m的值乘到變量pp中,變量pp在開始循環(huán)時已經設置初值為1,所以整個循環(huán)是將n個m乘到pp中。顯然循環(huán)語句的功能是計算m”。而函數的返回值正是這個變量pp中的值。
    由此分析可知,函數調用“p(3,4)”的返回值就是34。結果為 81,也就是本程序的輸
    出結果。
    【參考答案】81