初级程序员2007上半年下午试题 原版文件

  • 格式:doc
  • 大小:213.50 KB
  • 文档页数:13
(4)MOD(11-R,11)
[问题2]9
试题一[分析]
制订标准书号的目的是实现图书的国际统一编码,以便于实现计算机化的图书管理信息系统,使出版社内的图书管理、书库中的图书管理以及书店的图书销售管理具有更高的工作效率和管理水平。
标准书号采用分段编码,总长度是统一的,而段的长度是不统一的。例如,中国的出版者号规定为2~7位数字。对较大的出版社分配比较短的码,留出较长的书名号为较多的书进行编码。
{
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;
r.year = end.year; r.month = end.month;
makevalid ((3)); /*将日期r修正为有效日期*/
if (cmp_date(r,end)>0) /*修正月份数*/
(4);
months +=(5); /*计算总月份数*/
return months;
}
参考答案
if (cmp_date(r, end)>0) { /*修正年数*/
(1);
r.year--;
}
if (r.year<end.year) { /*跨年度时,先计算到12月的月份数*/
months =(2);
r.month = 12;
}
months += (end.month + 12 - r.month) % 12;
(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。
日期数据类型定义如下:
显然,上式算出的年份数可能产生误差(多算一年,即end的月号和日期要小于start的日期),因此可能需将years减去1后进行修正。因此,空(1)处应填入“years--”。
接下来计算月份数。由题目中的说明,计算起止日期间隔不足一年的完整月份数时,分如下两种情况。
(1)起止日期跨年度。计算方法如下例所示:对于起止日期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。以下代码处理该情况:
14 if (i % 2 = 1) {
15 num= num+ (n % 10) * k;
16 k = k * 10;
17 }
18 n = n / 10;
19 }
20 printf("新数据为: %d \n",num);
21 return 0;
22 }
参考答案
错误1:变量k没有声明(或定义)。
错误2:变量num没有初始化,或者num应初始化为0。
在本题的程序中,使用变量num的语句为“num=num+(n%10)*k;”。由于变量num没有赋初值,该语句运行的结果导致num的值是不确定的。
在本题给出的程序中,出现了如下错误。
(1)使用的变量k没有定义(语法错误,编译程序报告:k是未定义的标识符)。
(2)变量num没有赋初始值就直接使用(动态语义错误),应将其初始值设为0。由于num是局部变量,使用变量num的语句为“num=num+(n%10)*k”,系统不保证对其进行初始化,导致程序的运行结果不确定。
第2章程序员下午试题分析与解答
试题一
阅读以下说明和流程图,回答问题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得到的余数。
计算出S的值后,还应判断S除以11的余数是否为0。若余数为0,说明S能够被11整除,表示校验结果正确:若余数非0,则说明输入的标准书号有错(可能是校验码输入有错,也可能是前面的数字输入有错)。这时计算机会输出错误信息,请操作人员仔细校对改正。
试题二
阅读以下说明和C语言函数,将解答填入对应栏内。
【说明】
接着再计算该S值除以11的余数R。显然0 R 10。由于R与校验码之和应能被11整除,因此,校验码应等于MOD(11-R,11)(填11-R者没有考虑R=0的情况)。从而(4)处应填MOD(11-R,11)。在校验码等于10的情况,还应以符号X表示之。
对标准书号的校验过程中,首先要将校验码为x的情况转换成数据10,以便于后续计算。为了计算S=10*a(1)+9*a(2)+8*a(3)+…+1*a(10),需要采用循环。在循环前,应设置初始值S=0,对循环变量I从1到10(步长默认为1),执行语句S+(10-I+1)*a(I)→S或S+I*a(11-I)→S,因此,(1)处填(11-I)*a(I)或I*a(11-I)。
01 #include<stdio.h>
02
03 int main()
04 {
05 long n, num;
06 int i;
07
08 do {
09 printf("请输入一个正整数:");
10 scanf("%ld"k = 1;
13 for (i = 1; n>= 0; i++) {
(1)years--,或其等价形式
(2)12 - r.month,或其等价形式
(3)&r
(4)months--,或其等价形式
(5)years * 12
试题三[分析]
本题考查编程能力。
根据题目的说明,函数count_months(DATE start,DATE end)的功能是计算两个给定日期之间所包含的完整月份数。
下面待修改的C程序完成的功能是:对于给定的一个长正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如,将该程序修改正确后,运行时若输入“14251382”,则输出的整数为“4532”。
下面给出的C程序代码中有五个错误,请指出所有的错误。
【C程序代码】
【流程图】
【问题1】
请填补流程图中的空缺(1)~(4)。
【问题2】
设“程序员考试大纲”标准书号前9个数字为7-302-08493,请写出其校验码。
参考答案
[问题1] (1)(11-I)*a[I](或I*a(11-I))
(2)9
(3)S+(11-I)*a[I]→S(或S+(I+1)*a(10-I)→S)
【说明】
函数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年。
程序错误一般分成语法错误和语义错误两种类型,其中语法错误是形式上的错误,语义错误是含义上的错误,编译程序能够发现程序中的所有语法错误。
语义错误又可分为静态语义错误和动态语义错误,静态语义错误编译时检查,而动态语义错误在程序运行时表现。
C程序中,常见的错误有:使用的变量没有定义、变量没有赋值初就直接使用、输入输出的数据类型与所用格式说明符不一致、超出数据范围、输入时数据的组织方式与要求不符、误把“=”作为关系运算符“等于”、语句的分号缺少或放置错误、缺少“{}”、符号引用错误,“(、)、[、]”括号不配对、引用数组元素超界等。
计算月份数时,可以从起始日期开始,到终止日期结束,逐月计算;也可以先算出完整年份数,再计算剩余的完整月份数,最后用完整年份数乘以12再加上剩余的完整月份数。题目中采用后者。
先用end的年号减去start的年号,得到一个年份值,如下所示:
years = end.year - start.year; /*计算年数*/
错误3:第10行scanf函数参数错,或者“scanf("%1d",n);”中的n应该为“&n”;或者n之前应加取地址符号。
错误4:第13行循环条件错,或改为“n>0”。
错误5:第14行if语句条件错,将“=”改为“==”;或者将“1%2=1”改为“i% 2==1”
试题二[分析]
本题考查程序检错和排错能力。
(3)第14行,误把“=”作为关系运算符“等于”(语法错误),
(4)第10行,输入变量时忘记使用地址符号(动态语义错误),运行时变量n不能正确接收输入的数据。