编辑: 过于眷恋 | 2019-12-25 |
11 页) 全国计算机技术与软件专业技术资格 全国计算机技术与软件专业技术资格 全国计算机技术与软件专业技术资格 全国计算机技术与软件专业技术资格( ( ( (水平 水平 水平 水平) ) ) )考试 考试 考试 考试
200 200
200 2007
7 7
7 年上半年 年上半年 年上半年 年上半年 程序员 程序员 程序员 程序员 下午试卷 下午试卷 下午试卷 下午试卷 (考试时间 14:00~16:30 共150 分钟) 请按下述要求正确填写答题纸 请按下述要求正确填写答题纸 请按下述要求正确填写答题纸 请按下述要求正确填写答题纸 1.
在答题纸的指定位置填写你所在的省、自治区、直辖市、计划单列市的名称. 2. 在答题纸的指定位置填写准考证号、出生年月日和姓名. 3. 答题纸上除填写上述内容外只能写解答. 4. 本试卷共
8 道题,试题一至试题三是必答题,试题四至试题五选答
1 道, 试题六至试题八选答
1 道.每题
15 分,满分
75 分. 试题号 一~三四~五六~八 选择方法 必答题 选答
1 题 选答
1 题5. 解答时字迹务必清楚,字迹不清时,将不评分. 6. 仿照下面例题,将解答写在答题纸的对应栏内. 例题 例题 例题 例题
2007 年上半年全国计算机技术与软件专业技术资格(水平)考试日期是(1) 月(2)日. 因为正确的解答是
5 月26 日 ,故在答题纸的对应栏内写上
5 和
26 (参看下表) . 例题 解答栏 (1)
5 (2)
26 2007 年上半年 程序员 下午试卷 第2页(共
11 页) 试题一 试题一 试题一 试题一( ( ( (共共共共15 分分分分) ) ) ) 阅读以下说明和流程图,回答问题1 和问题2,将解答填入答题纸的对应栏内. [ [ [ [说明 说明 说明 说明] ] ] ] 为便于管理,每本正式出版的图书都印有国际标准书号.标准书号由 ISBN 和10 个数字组成,其格式为:ISBN 组号-出版者号-书名号-校验码.其中,校验码是根据 前面
9 个数字计算得到的,用于计算机自动校验.假设标准书号的
10 个数字依次是 a(1),a(2),…,a(10),则校验码 a(10)的设置应使 S=10*a(1)+9*a(2)+8*a(3)+…+1*a(10)能被
11 整除.如果校验码 a(10)应设置成 10,则规定以 X 表示之.例如,信息处理技术 员考试大纲的标准书号为:ISBN 7-302-11191-X.第1段上的数字
7 是国际 ISBN 中心分配给中国ISBN 中心管理的组号.第2 段上的
302 表示清华大学出版社.标准 书号的校验过程如图1-1 所示,计算校验码的过程如图1-2 所示,其中,Mod(S,11)表示 S 除以11 得到的余数. [ [ [ [流程图 流程图 流程图 流程图] ] ] ] a(10)='
X'
?
10 →a(10)
0 →S 循环开始 I = 1,10 S + (
1 ) →S 循环结束 Mod(S,11)=0? 校验正确 书号有错 图1-1 校验过程 图1-2 计算校验码的过程
0 →S 循环开始 I = 1, (
2 ) - (
3 ) - 循环结束 a(10) = 10? Mod(S,11) →R (
4 ) →a(10) '
X'
→a(10) [ [ [ [问题 问题 问题 问题1] 1] 1] 1]请填补流程图中的空缺(1)~(4) . [ [ [ [问题 问题 问题 问题2] 2] 2] 2]设 程序员考试大纲 标准书号前9 个数字为7-302-08493,请写出其校验码. Y N Y N Y N
2007 年上半年 程序员 下午试卷 第3页(共
11 页) 试题二 试题二 试题二 试题二( ( ( (共共共共15
15 15 15分分分分) ) ) ) 阅读以下说明和C语言函数,将解答填入答题纸的对应栏内. [ [ [ [说明 说明 说明 说明] ] ] ] 下面待修改的C 程序完成的功能是:对于给定的一个长正整数,从其个位数开始, 每隔一位取一个数字(即取其个位、百位、万位等数字) ,形成一个新的整数并输出. 例如,将该程序修改正确后,运行时若输入
14251382 ,则输出的整数为
4532 . 下面给出的C 程序代码中有五个错误,请指出所有的错误. [C [C [C [C程序代码 程序代码 程序代码 程序代码] ] ] ] 行号 行号 行号 行号 代码 代码 代码 代码
01 02
03 04
05 06
07 08
09 10
11 12
13 14
15 16
17 18
19 20
21 22 #include int main() { long n, num;
int i;
do { printf( 请输入一个正整数: );
scanf( %ld ,n);
}while(n = 0;
i++) { if (i %
2 = 1) { num = num + (n % 10) * k;
k = k * 10;
} n = n / 10;
} printf( 新数据为:%d n ,num);
return 0;
}
2007 年上半年 程序员 下午试卷 第4页(共
11 页) 试题三 试题三 试题三 试题三( ( ( (共共共共15
15 15 15分分分分) ) ) ) 阅读以下说明和C语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内. [ [ [ [说明 说明 说明 说明] ] ] ] 函数count_ months(DATE start, DATE end)的功能是:计算两个给定日期之间所 包含的完整月份数. 该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数. 规定两个相邻年份的同月同日之间的间隔为
1 年.例如,2007.5.30~2008.5.30 的间隔为
1 年.若相邻两年中前一年是闰年,并且日期是
2 月29 日,则到下一年的
2 月28日为1年,即2008.2.29~2009.2.28的间隔为1年. 规定两个相邻月份的相同日之间的间隔为1个月, 但需要特别考虑月末的特殊情况. 例如,2007.1.29~2007.2.28 的间隔为
1 个月,同理, 2007.1.30
30 30 30~2007.2.
28、 2007.1.31
31 31 31~2007.2.28的间隔都是1个月. 计算起止日期间隔不足一年的完整月份数时,分两种情况: 1)起止日期不跨年度.先用终止日期的月号减去起始日期的月号得到月份数,然 后再根据情况进行修正.例如,起止日期为2008.3.31~2008.9.20,通过月号算出月份 数为6.修正时,通过调用函数makevalid将2008.9.31改为2008.9.30,与终止日期 2008.9.20比较后,将月份数修正为5. 2)起止日期跨年度.计算方法如下例所示:对于起止日期2008.7.25~2009.3.31, 先计算2008.7.25~2008.12.25的月份数为5,再算出2008.12.25~2009.3.25的月份 数为3,因此2008.7.25~2009.3.31之间的完整月份数为8. 日期数据类型定义如下: typedef struct { int year;
int month;
int day;
/*日期的年号(4位) 、月和日号*/ }DATE;
程序中使用的函数cmp_date()、isLeapYear()和makevalid()说明如下: 函数名 参数 返回值 说明 cmp_date DATE start, DATE end -1:startend 比较两个日期的大小,例如: 2007.1.31 小于 2007.5.15, 2008.11.23 等于 2008.11.23, 2008.1.31 大于 2007.5.15 isLeapYear int year 1:year 表示的年号是闰年 0:year 表示的年号不是闰年 判断给定年号是否为闰年 makevalid DATE *r 无 若日期*r 是非法的,即*r 不是 闰年时其日期为
2 月29 日,或 者其
4、
6、
8、10 等月份出现了
31 日, 则将其日期改为当月最后 一天的日期.
2007 年上半年 程序员 下午试卷 第5页(共
11 页) [C [C [C [C语言函数 语言函数 语言函数 语言函数] ] ] ] int count_months(DATE start, DATE end) { int years = 0, months = 0;
DATE r;
if (cmp_date(start,end) >
0) { r = start;
start = end;
end = r;
} years = end.year - start.year;
/*计算年数*/ r = start;
r.year = end.year;
if (cmp_date(r,end) >
0) { /*修正年数*/ (1) ;
r.year--;
} if (r.year <
end.ye........