2011年 选拔赛 c 高职
考生须知:
考试时间为4小时。
本试卷包含两种题型:“代码填空”与“程序设计”。总计100分。
其中代码填空:3+3+3+5+7+9+12 = 42 分
程序设计:14+17+27 = 58分
填空题要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。所填写的代码不超过一条语句(即不能出现分号)。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
编程题要求选手设计的程序对于给定的输入能给出正确的输出结果。考生的程序只有能运行出
正确结果的时候才有机会得分。注意:在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。
对每个题目,要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
1.代码填空 (满分3分)
利息计算
小李年初在银行存款1千元(一年定期)。他计划每年年底取出100元救助失学儿童。假设银行的存款利率不变,年利率为3%,年底利息自动计入本金。下面的代码计算5年后,该账户上有多少存款。试填写缺失的代码。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
    double money = 1000;
    int n = 5;
    int i;
    for(i=0; i<n; i++)
    {
        money = ___money*(1+0.03) __________;
        money -= 100;
    }
    printf("%.2f\n", money);
2.代码填空 (满分3分)
开平方
如果没有计算器,我们如何求2的平方根?
可以先猜测一个数,比如1.5,然后用2除以这个数字。如果我们猜对了,则除法的结果必然与我们猜测的数字相同。我们猜测的越准确,除法的结果与猜测的数字就越接近。
根据这个原理,只要我们每次取猜测数和试除反馈数的中间值作为新的猜测数,肯定更接近答案!这种计算方法叫做“迭代法”。
下面的代码模拟了如何用手工的方法求2的平方根的过程。请填写缺少的代码。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
    double n = 2;
    double a = 0;
    double b = n;
    while(fabs(a-b)>1E-15)
    {
        a = (a+b)/2;
        b = ___n/a_______;
    }
    printf("%f\n", a);
3.代码填空 (满分3分)
最小公倍数
求两个数字的最小公倍数是很常见的运算。比如,3和5的最小公倍是15。6和8的最小公倍数是24。
下面的代码对给定的两个正整数求它的最小公倍数。请填写缺少的代码,使程序尽量高效地运行。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
int f(int a, int b)
{
    int i;
    for(i=a;;_ i=i+a_____)
    {
        if(i%b==0) return i;
    }
}
4.代码填空 (满分5分)
人类历史上出现了很多种历法。现行的公历即格里历由儒略历改革而来。它是目前较为精确和规则简明的一种历法,约3300年误差一日。因为闰年问题以及每个月的长度不等,仍然使得某些计算较为麻烦。比如:求两个日期间差多少天。
下面的代码实现了求两个由公历表示的日期间差多少天的功能。
其计算原理是先求出每个日期距离1年1月1日的天数差值,再进一步做差即可。
请研读代码,填写缺失的部分。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
struct MyDate
{
    int year;
    int month;
    int day;
};
int GetAbsDays(MyDate x)
{
    int i;
    int month_day[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int year = x.year-1;  // 因为欲求距离1年1月1日的距离
    int days = year * 365 + year/4 - year/100 + year/400;
    ar%4==0 && x.year%100!=0 || x.year%400==0) month_day[1]++;
    for(i=0; i<___x.month+1___________; i++)
        days += month_day[i];
    days += x.day-1;
    return days;
}
int GetDiffDays(MyDate a, MyDate b)
{
    return GetAbsDays(b) - GetAbsDays(a);
isnumber函数的使用方法及实例}
int main(int argc, char* argv[])
{
    MyDate a = {1842,5,18};
    MyDate b = {2000,3,13};
    int n = GetDiffDays(a,b);
    printf("%d\n", n);
}
5.代码填空 (满分7分)
轮换
串“abcd”每个字符都向右移位,最右的移动到第一个字符的位置,就变为“dabc”。这称为对串进行位移=1的轮换。同理,“abcd”变为:“cdab”则称为位移=2的轮换。
下面的代码实现了对串s进行位移为n的轮换。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
void shift(char* s, int n)
{
    char* p;
    char* q;
    int len = strlen(s);
    if(len==0) return;
    if(n<=0 || n>=len) return;
    char* s2 = (char*)malloc(___len+1______);
    p = s;
    q = s2 + n % len;
    while(*p)
    {   
        *q++ = *p++;