【计算机类职业资格】程序员-C语言程序设计(三)及答案解析.doc
《【计算机类职业资格】程序员-C语言程序设计(三)及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】程序员-C语言程序设计(三)及答案解析.doc(10页珍藏版)》请在麦多课文档分享上搜索。
1、程序员-C 语言程序设计(三)及答案解析(总分:100.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)阅读以下说明和 C 函数,填充函数中的空缺。说明函数 GetDateId(DATE date)的功能是计算并返回指定合法日期 date 是其所在年份的第几天。例如,date表示 2008 年 1 月 25 曰时,函数的返回值为 25,date 表示 2008 年 3 月 3 日时,函数返回值为 63。函数 Kday_Date(int theyear,int k)的功能是计算并返回指定合法年份 theyear(theyear1900)的第天(1k365)所对应的日期。例如
2、,2008 年的第 60 天是 2008 年 2 月 29 日,2009 年的第 60 天是 2009 年3 月 1 日。函数 isLeapYear(int y)的功能是判断 y 代表的年份是否为闰年,是则返回 1,否则返回 0。DATE 类型定义如下:typedef structint year,month,day;DATE;C 函数 1int GetDateId(DATE date)Const int days_month13=(0,31,28,31,30,31,30,31,31,30,31,30,31);int i,date_id=date.day;for(i=0;i_;i+)date_
3、id+=days_monthi;if(_isLeapYear(date.year)date_id+;return date_id;C 函数 2_Kday_Date(int theyear,int k)int i;DATE date;int days_month13=(0,31,28,31,30,31,30,31,31,30,31,30,31);assert(k=1k=365theyear=1900); /*不满足断言时程序终止*/date.year=_;if(isLeapYear(date.year)days_month2+;for(i=1;)k=k-davs_monthi+;if(k=0)(
4、date.day=k+_;date.month=i-1;break;return date;(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_二、试题二(总题数:1,分数:15.00)阅读以下说明和 C 程序,填充程序中的空缺。说明埃拉托斯特尼筛法求不超过自然数 N 的所有素数的做法是:先把 N 个自然数按次序排列起来,1 不是素数,也不是合数,要划去;2 是素数,取出 2(输出),然后将 2 的倍数都划去;剩下的数中最小者为 3,3 是素数,取出 3(输出),再把 3 的倍数都划去;剩下的数中最小者为 5,5 是素数(输出),再把 5 的倍数都划去。这
5、样一直做下去,就会把不超过 N 的全部合数都筛掉,每次从序列中取出的最小数构成的序列就是不超过 N 的全部质数。下面的程序实现埃拉托斯特尼筛法求素数,其中,数组元素 sievei(i0)的下标 i 对应自然数i,sievei的值为 1/0 分别表示 i 在/不在序列中,也就是将 i 划去(去掉)时,就将 sievei设置为 0。C 程序#include stdio.h#define N 10000int main()char sieveN+1=(0);int i=0,k;/*初始时 2N 都放入 sieve 数组*/for(i=2;_;i+)sievei=1;for(k=2;)/*找出剩下的数
6、中最小者并用 K 表示*/for(;kN+1sievek=0;_);if(_) break;print(“%d/t“,k); /*输出素数*/*从 sieve 中去掉 k 及其倍数*/for(i=k;iN+1;i=_)_;return 0;/*end of main*/(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_三、试题三(总题数:1,分数:15.00)阅读以下说明和 C 程序,填充函数中的空缺。说明N 个游戏者围成一圈,从 1N 顺序编号,游戏方式如下;从第一个人开始报数(从 1 到 3 报数),凡报到3 的人退出圈子,直到剩余一个游戏者为止,该
7、游戏者即为获胜者。下面的函数 playing(Linklist head)模拟上述游戏过程并返回获胜者的编号。其中,N 个人围成的圈用一个包含 N 个结点的单循环链表来表示,如图 1 所示,游戏者的编号放在结点的数据域中。在函数中,以删除结点来模拟游戏者退出圈子的处理。整型变量 c(初值为 1)用于计数,指针变量 p 的初始值为 head(如图 1 所示)。游戏时,从 p 所指向的结点开始计数,p 沿链表中的指针方向遍历结点,c 的值随 p 的移动相应地递增。当 c 计数到 2 时,就删除 p 所指结点的下一个结点(因下一个结点就表示报数到 3 的游戏者),如图 2 所示,然后将 c 设置为
8、0 后继续游戏过程。(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_四、试题四(总题数:1,分数:15.00)阅读以下说明和 C 函数,将应填入_处的语句或语句成分写在对应栏内。说明 1函数 deldigit(char*s)的功能是将字符串 s 中的数字字符去掉,使剩余字符按原次序构成个新串,并保存在原串空间中。其思路是:先申请一个与 s 等长的临时字符串空间并令 t 指向它,将非数字字符按次序暂存入该空间,最后再复制给 s。C 函数void deldigit(char*s)char*t=(char*)malloc(_); /*申请串空间*/int i
9、,k=0;if(!t) return;for(i=0;istrlen(s);i+=if(!(*(s+i)=0*(s+i)=9)tk+=_;_=/0 /*设置串结束标志*/strcpy(s,t);free(t);说明 2函数 reverse(char*s,int len)的功能是用递归方式逆置长度为 len 的字符串 s。例如,若串 s 的内容为“abcd”,则逆置后其内容变为“dcba”。C 函数void reverse(char*s,int len)char ch;if(_)ch=*s;*s=*(s+len-1);*(s+len-1)=ch;reverse(_);(分数:15.00)填空项
10、1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_五、试题五(总题数:1,分数:20.00)阅读以下说明和 C 代码,回答下面问题,将解答写在对应栏内。说明 1下面代码的设计意图是:将保存在文本文件 data.txt 中的一系列整数(不超过 100 个)读取出来存入数组arr,然后调用函数 sort()对数组 arr 的元素进行排序,最后在显示屏输出数组 arr 的内容。C 代码(分数:20.00)(1).以上 C 代码中有三处错误(省略部分的代码除外),请指出这些错误所在的代码行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行。说明 2下面是用 C 语言书写
11、的函数 get_str 的两种定义方式以及两种调用方式。*(分数:10.00)_(2).若分别采用函数定义方式 1、2 和调用方式 1、2,请分析程序的运行情况,填充下面的空。若采用定义方式 1 和调用方式 1,则输出为“00000000”。若采用定义方式 1 和调用方式 2,则_。若采用定义方式 2 和调用方式 1,则_。若采用定义方式 2 和调用方式 2,则_。(分数:10.00)_六、试题六(总题数:1,分数:20.00)阅读以下说明和 C 函数,将应填入_处的语句或语句成分写在对应栏内。说明已知单链表 L 含有头节点,且节点中的元素值以递增的方式排列。下面的函数 DeleteList
12、在 L 中查找所有值大于 minK 且小于 maxK 的元素,若找到,则逐个删除,同时释放被删节点的空间。若链表中不存在满足条件的元素,则返回-1,否则返回 0。例如,某单链表如图 1 所示。若令 minK 为 20,maxK 为 50,则删除后的链表如图 2 所示。(分数:20.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_程序员-C 语言程序设计(三)答案解析(总分:100.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)阅读以下说明和 C 函数,填充函数中的空缺。说明函数 GetDateId(DATE date)的功能是计算并返回指定合
13、法日期 date 是其所在年份的第几天。例如,date表示 2008 年 1 月 25 曰时,函数的返回值为 25,date 表示 2008 年 3 月 3 日时,函数返回值为 63。函数 Kday_Date(int theyear,int k)的功能是计算并返回指定合法年份 theyear(theyear1900)的第天(1k365)所对应的日期。例如,2008 年的第 60 天是 2008 年 2 月 29 日,2009 年的第 60 天是 2009 年3 月 1 日。函数 isLeapYear(int y)的功能是判断 y 代表的年份是否为闰年,是则返回 1,否则返回 0。DATE 类型
14、定义如下:typedef structint year,month,day;DATE;C 函数 1int GetDateId(DATE date)Const int days_month13=(0,31,28,31,30,31,30,31,31,30,31,30,31);int i,date_id=date.day;for(i=0;i_;i+)date_id+=days_monthi;if(_isLeapYear(date.year)date_id+;return date_id;C 函数 2_Kday_Date(int theyear,int k)int i;DATE date;int da
15、ys_month13=(0,31,28,31,30,31,30,31,31,30,31,30,31);assert(k=1k=365theyear=1900); /*不满足断言时程序终止*/date.year=_;if(isLeapYear(date.year)days_month2+;for(i=1;)k=k-davs_monthi+;if(k=0)(date.day=k+_;date.month=i-1;break;return date;(分数:15.00)填空项 1:_ (正确答案:date.month)解析:填空项 1:_ (正确答案:date.month2 或其等价形式)解析:填空
16、项 1:_ (正确答案:DATE)解析:填空项 1:_ (正确答案:theyear)解析:填空项 1:_ (正确答案:days_monthi-1或其等价形式)解析:本题考查的知识点是填写程序,本题的程序的功能是计算出某个日期为该年的第几天和某年的第几天是该年的几月几号。函数 1 是填写 GetDateId 这个函数,其中的 for 循环函数的功能是计算该日期是该年的第几天,所以第一空应填 date.month,但是是在普通年份下计算的,接下来的 if 条件语句是判断该年份是否为闰年,若为闰年且超过 2 月份,则需要在原来的基础上再加一天,若不是闰年或者没超过 2 月份则不用加一天,所以第二空应
17、填 date.month2。函数 2 是某年的第 k 天对应的日期,首先要定义下Kday_Date 函数,该函数符合 DATE 类型,所以用 DATE 定义该函数,第三空应填 DATE,第四空是将date.year 赋值为 theyear,所以应该填 theyear,接下来 k=k-days_monthi+是计算日期,如果k0,则 k=k-days_monthi+,若 k=0,则 date.day=days_monthi-1,故第五空应该填days_monthi-1。二、试题二(总题数:1,分数:15.00)阅读以下说明和 C 程序,填充程序中的空缺。说明埃拉托斯特尼筛法求不超过自然数 N 的
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 程序员 语言程序设计 答案 解析 DOC
