1、初级程序员下午试题-24 及答案解析(总分:120.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)1.说明下面的流程图用于计算一个英文句子中最长单词的长度(即单词中字母个数)MAX。假设该英文句子中只含字母、空格和句点“.”,其中句点表示结尾,空格之间连续的字母串称为单词。流程图(分数:15.00)_二、试题二(总题数:1,分数:15.00)2.说明下面的程序利用递归算法计算 x 和 y 的最大公约数。函数 2.1main ( )int x,y,k,t;scanf(“ % d% d“ , if(xy) t=x;x=y; y=t;(1) ;while(k! =0)y=x;
2、(2) ;k=y%x;prinff( “% d“ ,x); 函数 2.2 说明函数 fun(char *str,char *substr 的功能是计算子串 sugbstr 在串 str 中出现的次数。函数 2.2fun(ehar * str, char * substr)int x,y,z;(3) ;for(x=0;str x ! = /O;x + + )for(y=x,z=0;sabstrz = =stry; (4) ,y+ +)if( (5) = =/0) num + +;break;return(num);(分数:15.00)_三、试题三(总题数:1,分数:15.00)3.说明用链式存储
3、结构实现的栈称为链栈。若链栈元素的数据类型为 datatype,以 LinkStack 记链栈结构,其类型定义为:typedef struct nodedatatype data;stmct node * next;StackNode, * LinkStack;由于栈的主要操作都是在栈顶进行的,因此我们把链表的头部作为栈顶。设 top 为栈顶指针,即:LinkStack top。下面各函数的功能说明如下:(1)LinkStack Init_LinkStack():建立并返回空的链栈;(2)int Empty_LinkStack(LinkStack top):判断 top 所指链栈是否空;(3)
4、LinkStack Push_LinkStack(LinkStacktop,datatypex):将数据 x 压人 top 所指链栈的栈顶,返回新栈指针;(4)LinkStack Pop_LinkStack (LinkStacktop, datatype*x):弹出 top 所指链栈的栈顶元素 x,返回新栈指针。函数LinkStaek Init_LinkStack( )returnNULL;int Empty_LinkStack ( LinkStaek top)if(top = = NULL) return 1;else return 0;LinkStaek Push_LinkStaek( L
5、inkStaektop, datatype X)StaekNode *s;s=malloc (sizeof(StaekNode) );(1) = x;(2) = top;(3) ;return top;LinkStaek Pop_LinkStack (LinkStacktop, datatype * x)StaekNode *p;if(top = = NULL) return NULL;else* x = (4) ;p = top;(5) ;free (p);return top;(分数:15.00)_四、试题四(总题数:1,分数:15.00)4.说明若矩阵 Amn中存在某个元素 aij满足:
6、a ij是第 i 行中最小值且是第 j 列中的最大值,则称该元素为矩阵A 的一个鞍点。下面程序的功能是输出 A 中所有鞍点,其中参数 A 使用二维数组表示,m 和 n 分别是矩阵A 的行列数。程序void saddle (int A , int m, int n)int i,j,min;for (i=0;i m;i + + )min: (1) ;for (j=1; jn; j+ +)if(Aijmin) (2) ;for (j=0; jn; j+ +)if ( (3) )p=0;while (pmif (p = m)printf (“%d,%d,%d/n“,i,j,min);问题 1 将函数代
7、码中的(1)(4)处补充完整问题 2在上述代码的执行过程中,若 A 为矩阵 (分数:15.00)_五、试题五(总题数:1,分数:15.00)5.说明我国现行使用的公民身份证号码有两种,分别遵循两个国家标准:GB 11643-1989和GB 11643-1999。CB 11643-1989中规定的是 15 位身份证号码,排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。GB 11643 -1999中规定的是18 位身份证号码,是特征组合码,它由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三
8、位数字顺序码和一位校验码。其中,校验码 C 由本体码按如下过程求得:(1)计算校验码和 S=a18W18+a17W17+a2w2,其中 i 表示 18 位身份证号,码每一位的序号,从右至左,最左侧为 18,最右侧为 1;ai表示身份证号码第 i 位上的号码;w i表示第 i 位上的权值,其值为 2i-1 模11 的结果;(2)计算校验码值 R,其值为校验和模 11 的结果;(3)根据下面对应关系找出校验码 C:R 0 1 2 3 4 5 6 7 8 9 10C 1 0 X 9 8 7 6 5 4 3 2由上述计算过程可以看出,18 位身份证号码中可能包含非数字的字母 X(代表数字 10)。下面
9、的应用程序基于这一算法实现了身份证号码的升位查询:(分数:15.00)_六、试题六(总题数:1,分数:15.00)6.说明本程序使用类来管理员工的通讯地址信息。已知程序的输出为:输出记录:5姓名:王丽华街道地址:中华路 15 号市:襄樊市省;湖北省邮政编码:430070C+程序#include iostream, h #include string, h class employee.protected:char name10;char street 20 ;char city10;char (1) 10;char post7;int no;(2) :(3) (char ,char ,char
10、 ,char ,char ,int);void changename ( char n ) strcpy ( name, n); void changestreet( char s ) strcpy(street,s) ;void changecity ( char c ) strcpy ( city, c ); void changeprov( char p ) strcpy(prov,p); void changeno(int nnm) (4) ;void display( );employee: (3) (char n ,char s ,char c ,char p1 ,char p2
11、,int nam)strcpy(name,n);strcpy ( street, s);strcpy ( city, c);strcpy ( prov, p1 );strcpy ( post, p2 );no = nam; void employee: display( ) cont “输出记录: “ no endl;cout “姓名: “ name endl;coot “街道地址: “ street endl;cout “市: “ city endl;cout “省: “ prov endl;cout “邮政编码: “ post endl;void main( ) employee cmp(
12、“王华“ ,“中华路 15 号“ ,“武汉市“,“湖北省“,“430070“, 1 );emp. changename( “五丽华“ );emp. changecity ( “襄樊市“ );emp. changeno(5);(5) ;(分数:15.00)_七、试题七(总题数:1,分数:15.00)7.说明设某单位 Acess 数据库中有一张员工信息表,其中记录了员工编号、姓名、性别等基本信息。下面的应用程序利用数据控件(Data)实现了对这张表中记录的增加、删除和修改操作。其运行界面如下:(分数:15.00)_八、试题八(总题数:1,分数:15.00)8.说明本程序的功能是给公司的员工 Tom
13、,Jack,Green 增加薪水。三人的职位分别是 programmer, Manager,CEO。程序由 6 个类组成:WorkerTest 是主类,programmer,Manager,CEO 三个类,薪水增加的规则是 programmer 的涨幅是 5%;Manager 的是 10%;CEO 也是 Manager,但是它除了有 Manager 的涨幅,还有1000 元的 bonus。接口 SalaryRaise 提供了一个增加薪水的方法 raise()。java 程序public class WorkerTest public WorkerTest( ) public static vo
14、id main( String args) Programmer programmer = new Programmer( “Tom“ ,3000);Manager manager = new Manager( “Jack“ ,4000);CEO ceo = new CEO( “Green“ ,4000);Worker worker = new Worker3;programmer, raise( );manager, raise( );ceo. raise( );worker0 = programmer;worker 1 = manager;worker2 = ceo;for ( int i
15、 = 0 ;i worker, length; i + + ) System. out. prinfln (“ Name:“ + worker i. getName ( ) +“ / tSalary:“ + worker i. getSalary ();public interface SalaryRaise void raise( ); public class Worker public String name;public double (1) ;public Worker( ) public String getName( ) return name;public void setNa
16、me( String name) this. name = name;public double getSalary( ) return salary;public void setSalary(double salary) this. salary = salary; public class Programmer extends Worker implements (2) public Programmer( ) public void raise( ) double pets=0.05;double sala = this. getSalary( ) * (1 + pers);this.
17、 setSalary (sala);public Programmer( Siring name, double salary) tthis. name = name;this. salary = salary;public class Manager extends (3) implements SalaryRaise public Manager( ) public Manager(String name, double salary) this. name = name;this. salary = salary;public void raise( ) double pets = 0.
18、1;double sala = this. getSalary() * (1 + pers);this. setSalary(sala);public class CEO extends Manager implements SalaryRaise public CEO() public CEO( String name,double salary) this. name = name;this. salary = salary;public void raise( ) double bonus = 1000;(4) ;double sala = this. getSalary( );(5)
19、;this. setSalary(sala);(分数:15.00)_初级程序员下午试题-24 答案解析(总分:120.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)1.说明下面的流程图用于计算一个英文句子中最长单词的长度(即单词中字母个数)MAX。假设该英文句子中只含字母、空格和句点“.”,其中句点表示结尾,空格之间连续的字母串称为单词。流程图(分数:15.00)_正确答案:(1)MAX0 (2)L+1 (3)MAXL (4) (5)L0)解析:解析本题用到的三个变量及其作用分别为:A,存放输入的一个字符;MAX,存放当前为止最长单词的长度;L,存放当前单同的长度。(1
20、)使用变量 MAX 应先赋予初值,由上下文知其初值为 0;(2)读取当前单词时,每读人一个字母,单词长度值 L 应增 1;(3)当前单词长度 L 比 MAX 时,应更新 MAX 的值;(4)若当前字符不是句点,应当继续读取字符;(5)读取下一个单词前,应当重置 L 的值。二、试题二(总题数:1,分数:15.00)2.说明下面的程序利用递归算法计算 x 和 y 的最大公约数。函数 2.1main ( )int x,y,k,t;scanf(“ % d% d“ , if(xy) t=x;x=y; y=t;(1) ;while(k! =0)y=x;(2) ;k=y%x;prinff( “% d“ ,x
21、); 函数 2.2 说明函数 fun(char *str,char *substr 的功能是计算子串 sugbstr 在串 str 中出现的次数。函数 2.2fun(ehar * str, char * substr)int x,y,z;(3) ;for(x=0;str x ! = /O;x + + )for(y=x,z=0;sabstrz = =stry; (4) ,y+ +)if( (5) = =/0) num + +;break;return(num);(分数:15.00)_正确答案:(k=yx (2)x=k (3)int num=0 (4)z+ (5)substrz+1)解析:(1)(
22、2)使用递归算法计算 x 和 y 的最大公约数时,不妨令 yx,如果 y 除 x 余数得。则 x 即为所求;否则令 yx,x余数,继续上述判断。(3)此处应声明变量 num 并初始化;(4)次循环的功能是从 str 的第 y 个位置起与 substr 做比较,循环过程中 y 和 z 应同时增 1;(5)若上面的循环重复执行,直到到达 substr 结束,则表示 substr 在 str 中出现一次。三、试题三(总题数:1,分数:15.00)3.说明用链式存储结构实现的栈称为链栈。若链栈元素的数据类型为 datatype,以 LinkStack 记链栈结构,其类型定义为:typedef stru
23、ct nodedatatype data;stmct node * next;StackNode, * LinkStack;由于栈的主要操作都是在栈顶进行的,因此我们把链表的头部作为栈顶。设 top 为栈顶指针,即:LinkStack top。下面各函数的功能说明如下:(1)LinkStack Init_LinkStack():建立并返回空的链栈;(2)int Empty_LinkStack(LinkStack top):判断 top 所指链栈是否空;(3)LinkStack Push_LinkStack(LinkStacktop,datatypex):将数据 x 压人 top 所指链栈的栈顶
24、,返回新栈指针;(4)LinkStack Pop_LinkStack (LinkStacktop, datatype*x):弹出 top 所指链栈的栈顶元素 x,返回新栈指针。函数LinkStaek Init_LinkStack( )returnNULL;int Empty_LinkStack ( LinkStaek top)if(top = = NULL) return 1;else return 0;LinkStaek Push_LinkStaek( LinkStaektop, datatype X)StaekNode *s;s=malloc (sizeof(StaekNode) );(1
25、) = x;(2) = top;(3) ;return top;LinkStaek Pop_LinkStack (LinkStacktop, datatype * x)StaekNode *p;if(top = = NULL) return NULL;else* x = (4) ;p = top;(5) ;free (p);return top;(分数:15.00)_正确答案:(1)s-data (2)s-next (3)top=s (4)top-data (5)top=top-next)解析:(1)(3):LinkStack Push_LinkStack(Link- Stacktop,dat
26、mype x)函数的功能是将 x 压入栈顶,因此首先为其创建一个节点 s,使 s-data 等于 x,使 s- next 指向原来的栈顶 top,最后将,作为新栈的栈顶并返回。(4)(5):LinkStack Pop_LinkStaek(LinkStacktop, datatype*x)的功能是弹出原栈顶元素,返回这个元素以及新栈的指针。当原链栈不空时,取出栈顶元素 top -data 赋给参量*x 作为返回值,将 top-next 更新为新栈的栈顶,并且释放原来 top 节点的空间。四、试题四(总题数:1,分数:15.00)4.说明若矩阵 Amn中存在某个元素 aij满足:a ij是第 i
27、行中最小值且是第 j 列中的最大值,则称该元素为矩阵A 的一个鞍点。下面程序的功能是输出 A 中所有鞍点,其中参数 A 使用二维数组表示,m 和 n 分别是矩阵A 的行列数。程序void saddle (int A , int m, int n)int i,j,min;for (i=0;i m;i + + )min: (1) ;for (j=1; jn; j+ +)if(Aijmin) (2) ;for (j=0; jn; j+ +)if ( (3) )p=0;while (pmif (p = m)printf (“%d,%d,%d/n“,i,j,min);问题 1 将函数代码中的(1)(4)
28、处补充完整问题 2在上述代码的执行过程中,若 A 为矩阵 (分数:15.00)_正确答案:(问题 1(1)Ai0 (2)min=Aij (3)Ai j=min (4)Apj=min 或 min=AP j问题 2(5)1,2,11)解析:解析本算法的基本思想是:对矩阵 A 逐行处理,求出每一行的最小值,对于这一行上等于最小值的那些元素,逐个判断该元素是否是所在列的最大元,如果是则打印输出。(1)由上下文可知 min 代表第 i 行的最小值,此处应对其赋初值:本行第一个元素;(2)遍历第 i 行后面的元素,若有元素比 miu 小,则应更新 min 的值;(3)此处应挑出本行中取最小值的元素进行判断
29、;(4)此循环用于判断 min 是否是本列的最大元。(5)所给矩阵中只有一个鞍点 11,若行列号从。开始计,它位于第 l 行第 2 列。五、试题五(总题数:1,分数:15.00)5.说明我国现行使用的公民身份证号码有两种,分别遵循两个国家标准:GB 11643-1989和GB 11643-1999。CB 11643-1989中规定的是 15 位身份证号码,排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。GB 11643 -1999中规定的是18 位身份证号码,是特征组合码,它由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:
30、六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其中,校验码 C 由本体码按如下过程求得:(1)计算校验码和 S=a18W18+a17W17+a2w2,其中 i 表示 18 位身份证号,码每一位的序号,从右至左,最左侧为 18,最右侧为 1;ai表示身份证号码第 i 位上的号码;w i表示第 i 位上的权值,其值为 2i-1 模11 的结果;(2)计算校验码值 R,其值为校验和模 11 的结果;(3)根据下面对应关系找出校验码 C:R 0 1 2 3 4 5 6 7 8 9 10C 1 0 X 9 8 7 6 5 4 3 2由上述计算过程可以看出,18 位身份证号码中可能包含非
31、数字的字母 X(代表数字 10)。下面的应用程序基于这一算法实现了身份证号码的升位查询:(分数:15.00)_正确答案:(1)Exit Sub(2)Right(3)Mid(code,19-i,1) (4)S=S Mod 11 (5)12-S)解析:解析(1)输入错误时,应即刻退出过程;(2)注意到“19”是夹在 15 位身份证号码左端 6 位与右端 9 位之间的,按照参数调用格式可以推断此处函数是 Right;(3)此处应填入身份证号码中第 i 位(从左端起、序号自 18 递减)上的号码,它位于字符串 code 的第 19-i位(从左端起、序号自 1 递增),因此可用 Mid(code, 19
32、-i,1)来获取;(4)略;(5)从校验码值与校验码的转换关系可知:当校验码值大于等于 3 时,校验码值与校验码之和为 12。六、试题六(总题数:1,分数:15.00)6.说明本程序使用类来管理员工的通讯地址信息。已知程序的输出为:输出记录:5姓名:王丽华街道地址:中华路 15 号市:襄樊市省;湖北省邮政编码:430070C+程序#include iostream, h #include string, h class employee.protected:char name10;char street 20 ;char city10;char (1) 10;char post7;int no
33、;(2) :(3) (char ,char ,char ,char ,char ,int);void changename ( char n ) strcpy ( name, n); void changestreet( char s ) strcpy(street,s) ;void changecity ( char c ) strcpy ( city, c ); void changeprov( char p ) strcpy(prov,p); void changeno(int nnm) (4) ;void display( );employee: (3) (char n ,char s
34、 ,char c ,char p1 ,char p2 ,int nam)strcpy(name,n);strcpy ( street, s);strcpy ( city, c);strcpy ( prov, p1 );strcpy ( post, p2 );no = nam; void employee: display( ) cont “输出记录: “ no endl;cout “姓名: “ name endl;coot “街道地址: “ street endl;cout “市: “ city endl;cout “省: “ prov endl;cout “邮政编码: “ post endl
35、;void main( ) employee cmp(“王华“ ,“中华路 15 号“ ,“武汉市“,“湖北省“,“430070“, 1 );emp. changename( “五丽华“ );emp. changecity ( “襄樊市“ );emp. changeno(5);(5) ;(分数:15.00)_正确答案:(1)prov (2)public (3)employee (4)no=num(5)emp.display()解析:解析本程序创建一个 employee 类,包括姓名、街道地址、市、省和邮政编码和记录号等信息以及若干函数:构造函数 employee()初始化每个成员;changn
36、ame ()、changeno()等用于更改类中各属性的值;dis- play()函数用于打印数据。其中的数据成员是保护的,函数是公共的。七、试题七(总题数:1,分数:15.00)7.说明设某单位 Acess 数据库中有一张员工信息表,其中记录了员工编号、姓名、性别等基本信息。下面的应用程序利用数据控件(Data)实现了对这张表中记录的增加、删除和修改操作。其运行界面如下:(分数:15.00)_正确答案:(Addhem(2)Delete(3)False(4)Update(5) ret=vbYes)解析:解析(1)组合列表框中的列表项是在窗体加载时添加的,其方法是调用组合框控件对象的 Addhe
37、m 方法;(2)从数据集中删除记录应使用 Delete 方法;(3)若数据控件的 ReadOnly(只读)属性为真,则数据记录不可更改,因此此处取假值;(4)数据集的 Edit 方法用于对可更新的当前记录进行编辑修改。Update 方法则用于将修改的记录内容保存到数据库中。(5)询问窗口返回两种值,一是单击按钮“是(Y)”返回的 vbYes,二是单击按钮“否(N)”按钮返回的vbNo。选择前者将结束程序。八、试题八(总题数:1,分数:15.00)8.说明本程序的功能是给公司的员工 Tom,Jack,Green 增加薪水。三人的职位分别是 programmer, Manager,CEO。程序由
38、6 个类组成:WorkerTest 是主类,programmer,Manager,CEO 三个类,薪水增加的规则是 programmer 的涨幅是 5%;Manager 的是 10%;CEO 也是 Manager,但是它除了有 Manager 的涨幅,还有1000 元的 bonus。接口 SalaryRaise 提供了一个增加薪水的方法 raise()。java 程序public class WorkerTest public WorkerTest( ) public static void main( String args) Programmer programmer = new Prog
39、rammer( “Tom“ ,3000);Manager manager = new Manager( “Jack“ ,4000);CEO ceo = new CEO( “Green“ ,4000);Worker worker = new Worker3;programmer, raise( );manager, raise( );ceo. raise( );worker0 = programmer;worker 1 = manager;worker2 = ceo;for ( int i = 0 ;i worker, length; i + + ) System. out. prinfln (
40、“ Name:“ + worker i. getName ( ) +“ / tSalary:“ + worker i. getSalary ();public interface SalaryRaise void raise( ); public class Worker public String name;public double (1) ;public Worker( ) public String getName( ) return name;public void setName( String name) this. name = name;public double getSa
41、lary( ) return salary;public void setSalary(double salary) this. salary = salary; public class Programmer extends Worker implements (2) public Programmer( ) public void raise( ) double pets=0.05;double sala = this. getSalary( ) * (1 + pers);this. setSalary (sala);public Programmer( Siring name, doub
42、le salary) tthis. name = name;this. salary = salary;public class Manager extends (3) implements SalaryRaise public Manager( ) public Manager(String name, double salary) this. name = name;this. salary = salary;public void raise( ) double pets = 0.1;double sala = this. getSalary() * (1 + pers);this. s
43、etSalary(sala);public class CEO extends Manager implements SalaryRaise public CEO() public CEO( String name,double salary) this. name = name;this. salary = salary;public void raise( ) double bonus = 1000;(4) ;double sala = this. getSalary( );(5) ;this. setSalary(sala);(分数:15.00)_正确答案:(1)salary (2)SalaryRalse (3)Worker (4) super. raise() (5)sala+=bonus 及其等效形式)解析:(1)从 Worker 这个类的结构来看,它有两个属性 ufinle 和 salary,因此这里应该填 salary;(2)(3):很显然 Programmer 类和 Manager 类继承于 Worker 类和 SalaryRaise 接口。