2015軟考程序員考前最后沖刺題及答案解析

字號(hào):

1.struct stu
    { int num;char name[10];int age};
    void py(struct stu *p)
    { printf("%s\n",(*p).name);}
    main()
    { struct stu student[3]={{1001,"Sun",25},
    {1002,"Ling",23},
    {1003,"Shen",22};
    py(student+2);
    }
    【解析】本程序是由3段組成的。第1段是結(jié)構(gòu)型stn的定義;第2段是函數(shù)py()的定義;第3段是主函數(shù)。
    我們先分析主函數(shù)。首先定義了結(jié)構(gòu)型stu的數(shù)組student[3],并且給3個(gè)元素的所有成員都賦了初值。接著調(diào)用了函數(shù)py,對(duì)應(yīng)的實(shí)參是結(jié)構(gòu)型數(shù)組元素student[2]的地址。注意,“數(shù)組名+k”是數(shù)組元素“數(shù)組名[k]”的地址。
    再來分析函數(shù)調(diào)用"py(student+2);"。調(diào)用時(shí),首先把實(shí)參傳遞給形參,即把結(jié)構(gòu)型stu的數(shù)組元素student[2」的地址"student+2"傳遞給形式參數(shù)“結(jié)構(gòu)型stu的指針變量p”。
    然后執(zhí)行函數(shù)體,輸出表達(dá)式是"(*p).name",這是結(jié)構(gòu)型stu的指針變量p指向的結(jié)構(gòu)型stu數(shù)據(jù)(即結(jié)構(gòu)型stu的數(shù)組元素student[2〕)的成員name,其值是字符串"Shen"。這就是本題的答案。
    【參考答案】Shen
    2.# include"stdio.h"
    main()
    { char c;
    while((c=getchar())!=’\n’)
    switch(c)
    {case ’0’:
    case’1’: putchar(c);
    case’2’:putchar(c);break;
    case’3’:putchar(c);
    default:putchar(c+1);break;
    }
    printf("\n");
    }
    假定本程序執(zhí)行時(shí)輸入:1357/(其中的/代表回車換行符)。
    【解析】本題也可以采用記錄的方法。
    執(zhí)行 while循環(huán)。
    輸入第1個(gè)字符'1',不是'\n',執(zhí)行switch語句的"case'1'"后的輸出語句,輸出字符'1';由于其后沒有“break”語句,則繼續(xù)執(zhí)行"case'2'"后的語句,輸出字符'1'。輸入第2個(gè)字符'3',不是'\n',執(zhí)行switch語句的"case'3'"后的輸出語句,輸出字符'3';由于其后沒有“break”語句,則繼續(xù)執(zhí)行"default"后的語句,輸出字符'4'。
    繼續(xù)while循環(huán)。
    輸入第3個(gè)字符'5',不是'\n',執(zhí)行switch語句的"default"后的語句,輸出字符'6'。
    繼續(xù)while循環(huán)。
    輸入第4個(gè)字符呼'7',不是'\n',執(zhí)行switch語句的"default"后的語句,輸出字符'8'。
    繼續(xù)While循環(huán)。
    輸入第 5個(gè)字符'\n',是'\n',退出while循環(huán),輸出“回車換行符”。
    注意switch語句的執(zhí)行過程是:在每個(gè)“case”分支之后,可以有多個(gè)語句,程序?qū)⒁来螆?zhí)行這些語句,直到遇見“break”語句或者switch語句的右花括號(hào)“}”。如果某個(gè)“case”分支的后面沒有“break”語句,它在執(zhí)行完本分支后的所有語句之后,將繼續(xù)執(zhí)行下一個(gè)分支中的語句,直到出現(xiàn)“break”語句或者switch語句的右花括號(hào)“}”后才中止本分支的執(zhí)行。
    【參考答案】113468
    程序設(shè)計(jì)題
    3.編函數(shù)計(jì)算并返回m行6列整型數(shù)組a周邊元素之和(即第1行、第m行、第1列、第6列上元素之和,但是重復(fù)元素只參加1次求和)。數(shù)組名a和m、n作為函數(shù)參數(shù)。
    【解析】先用單重循環(huán)求第1行和第m行上元素之和,控制循環(huán)的變量i對(duì)應(yīng)列下標(biāo),依次等于0、1、…、5,參與求和的數(shù)組元素是a[0][i]和a[m-1][i]。
    再用單重循環(huán)求第1列和第6列上元素之和(注意排除第1行和第m行),控制循環(huán)的變量1對(duì)應(yīng)行下標(biāo),依次等于1、…、m-2,參與求和的數(shù)組元素是a[i][0]和a[i][5]。
    【參考答案】int fun(a,m)
    int a[][6];
    { int i,s=0;
    for(i=0;i<6;i++)
    s+=a[0][i]+a[m一1][i];
    for(i=1;i
    s+=a[i][0]+a[i][5];
    return(S);
    }
    4.編程序從鍵盤上輸入一個(gè)字符串(長(zhǎng)度小于或等于80),分別統(tǒng)計(jì)其中的字母、數(shù)字和其他字符的數(shù)目。本題要求用指向數(shù)組首地址的指針變量來處理字符率中的字符。
    【解析】定義字符型數(shù)組和指向數(shù)組首地址的指針變量。利用系統(tǒng)函數(shù)輸入一個(gè)字符串,存入字符型數(shù)組。利用單重循環(huán)依次處理字符串中的單個(gè)字符,直到當(dāng)前字符是字符率結(jié)束標(biāo)記符為止。在循環(huán)體中利用if-else組成的嵌套雙分支結(jié)構(gòu)處理3個(gè)分支:是字母的,則在對(duì)應(yīng)計(jì)數(shù)變量c1且中加1;是數(shù)字的,則在對(duì)應(yīng)計(jì)數(shù)變量c2中加1;其他情況,則在對(duì)應(yīng)計(jì)數(shù)變量c3中加1。注意,這3個(gè)計(jì)數(shù)變量在循環(huán)前必須清0。
    【參考答案】main()
    { char s[81],*p=s;
    int c1,c2,c3;
    c1=c2=c3=0;
    scanf("%s",s);
    while(*p!='\0')
    { if((*p>='a')&&(*p<='z'))
    c1++;
    else if((*p>='A')&&(*p<='Z'))
    c1++;
    else if((*p>+'0')&&(*p<='9'))
    c2++;
    else
    c3++;
    p++;
    }
    printf("c1=%d c2=%d c3=%d\n", c1,c2,c3);
    }
    5.編寫一個(gè)模擬簡(jiǎn)單計(jì)算器的程序,計(jì)算表達(dá)式:a1 op a2的值,要求 a1、op、a2從盤輸入。其中a1、a2(作除數(shù)時(shí)不能為0)為數(shù)值,op為運(yùn)算符+、-、*、/。
    【解析】本程序首先要定義相關(guān)的變量,a1和a2為單精度實(shí)型,op為字符型。接著要輸入兩個(gè)運(yùn)算數(shù)和運(yùn)算符。后要按照運(yùn)算符進(jìn)行分支處理,由于分支的條件是運(yùn)算符op等于不同的值,所以可以選取swtch語句來完成。其中當(dāng)op為'\'時(shí),要注意區(qū)分出除數(shù)a2為0的異常情況。
    【參考答案】#include "math.h"
    main()
    { float a1,a2;
    char op;
    scanf("%f,%c,%f",&a1,&op,&a2);
    switch(op)
    { case'+':printf("a1+a2=%f\n",a1+a2);break;
    case'-':printf("a1-a2=%f\n",a1-a2); break;
    case'*':printf("a1*a2=%f\n", a1*a2);break;
    case'/':if(fabs(a2)<1e-4)
    printf("division by zero.\n");
    else
    printf("a1/a2=%f\n",a1/a2);
    break;
    default:printf("unknown operator.\n");
    }
    }
    6.編寫一程序,從鍵盤輸入10個(gè)實(shí)數(shù),計(jì)算并輸出算術(shù)平均值。
    【解析】相關(guān)的變量和數(shù)組:用來存放算術(shù)平均值的變量(例如用ave)、存放10個(gè)實(shí)數(shù)的一準(zhǔn)數(shù)組(例如用a[10」)。因?yàn)閍ve要求和,所以事先要賦初值0.0。第1個(gè)次數(shù)為10的循環(huán)用于輸入10個(gè)實(shí)數(shù)存入數(shù)組a,可以使用for循環(huán),利用下標(biāo)變量i來控制循環(huán)。第2個(gè)次數(shù)為10的循環(huán)用于求10個(gè)數(shù)組元素之和存入變量刪,可以使用for循環(huán),利用下標(biāo)變量i來控制循環(huán)。后是輸出結(jié)果,要注意變量ave中存放的是和,必須除10后才是平均值。
    【參考答案】 main()
    { int i;
    float ave=0.0,a[10];
    for(i=0;i<10;i++)
    scanf("%f",&a[i]);
    for(i=0;i<10;i++)
    ave+=a[i];
    printf(".4f\n",ave/10.0);.
    }
    7.編程序輸入50個(gè)學(xué)生的學(xué)號(hào)、姓名、3門課程的成績(jī)存入一個(gè)結(jié)構(gòu)型的數(shù)組。統(tǒng)計(jì)每個(gè)學(xué)生的總分并輸出學(xué)生的學(xué)號(hào)、姓名、總分。
    【解析】首先要設(shè)計(jì)一個(gè)結(jié)構(gòu)型,其成員包括學(xué)號(hào)(長(zhǎng)整型)、姓名(字符數(shù)組)、3個(gè)成績(jī)(實(shí)型或?qū)嵭蛿?shù)組)、總分(實(shí)型)。定義長(zhǎng)度為50的這種結(jié)構(gòu)型數(shù)組。用單重50次的次數(shù)型循環(huán)輸出50個(gè)學(xué)生的信息。再用次數(shù)為50的單重循環(huán)依次求出每個(gè)學(xué)生的總分(等于3科成績(jī)之和)存入成員總分中。后仍然用50次的單重循環(huán)輸出50個(gè)學(xué)生的學(xué)號(hào)、姓名和總分。
    【參考答案】main()
    { struct{ long num;
    char name[20];
    float score1;
    float score2;
    float score3;
    float total;
    }stu[50」;
    int i;
    float x1,x2,x3
    for(i=0;i<50;i++)
    { scanf(",%s",&stu[i].num,stu[i].name);
    scanf("%f,%f,%f",&x1,&x2,&x3);
    stu[i].score=x1,stu[i].score2=x2,stu[i].score3=x3;
    }
    for (i=0;i<50;i++)
    stu[i].total=stu[i].scorel+stu[i].score2+stu[i].score3;
    for(i=0;i<50;i++)
    printf("%name%f\n:", stu[i].num,stu[i].total);
    }
    8.編寫一程序,輸出如下圖形。
    *****
    *****
    *****
    *****
    【解析】分析題目中給出的圖形,可以看出需要使用二重循環(huán)結(jié)構(gòu)。外層循環(huán)控制行,這是次數(shù)為4的次數(shù)型循環(huán)結(jié)構(gòu),可以使用for語句,其控制循環(huán)的變量i依次等于1、2.3、4,循環(huán)體中的工作有兩項(xiàng):一項(xiàng)是輸出前面的空格,第二項(xiàng)是輸出該行上的符號(hào)串”*****”。由此得出外層循環(huán)結(jié)構(gòu)如下:
    for(i=1;i<=4;i++)
    { 輸出前面的空格;
    輸出符號(hào)串”*****”;
    輸出前面的空格需要使用循環(huán)。我們來看題目中給出的圖形,第1行上要輸出的空格數(shù)目是0,即“1-1”。第2行上要輸出的空格數(shù)目是1,即“2-1”,…。顯然,第i行上要輸出的空格數(shù)目是“i一1”。由此可以得出這個(gè)循環(huán)也是次數(shù)型循環(huán),控制循環(huán)的變量j依次等于 1、2、…、 i-1。其中的i是行數(shù)。由此可以得出這個(gè)內(nèi)層循環(huán)的結(jié)構(gòu)如下:
    for(j=1;i<=i-1;j++)
    輸出1個(gè)空格;
    外層循環(huán)體中的第二項(xiàng)是輸出本行上的符號(hào)串”*****”。這項(xiàng)工作比較簡(jiǎn)單,用一條輸出語句“printf(“*****\n”);”即可。
    依據(jù)上述分析,可以很容易寫出程序清單。
    【參考答案】 main()
    { int i,j;
    for(i=1;i<=4;i++)
    { for(j=1;j<=i-1;j++)
    printf("");
    printf(”*****\n”);
    }
    }