1、程序员-C 语言试题及答案解析(总分:150.00,做题时间:90 分钟)一、B试题一/B(总题数:2,分数:15.00)1.【函数 1.1 说明】 函数 strcpy(char * destination,char * source)将字符串 source 复制到字符串destination。 【函数 1.1】 void strcpy (char * destination,char*source) whileU (1) /U;(分数:3.00)_【函数 1.2 说明】函数 merge(int a,int n,int b,int m,int *c)是将两个从小到大有序数组 a 和 b 复制合
2、并出一个有序整数序列 c,其中形参 n 和 m 分别是数组 a 和 b 的元素个数。【函数 1.2】void merge(int a ,int n,int b ,int m,int *c) int i,j;for(i=j:0;in & jm;)*c+ =ai bj? ai+:bj+;while(in) U(2) /U;while(jm) U(3) /U;(分数:12.00)(1).(分数:3.00)_(2).(分数:3.00)_(3).(分数:3.00)_(4).(分数:3.00)_二、B试题二/B(总题数:1,分数:15.00)阅读下列函数说明和 C 代码,把应填入其中 n 处的字句写在答卷
3、的对应栏内。【函数 2 说明】本题中的函数 encode()和 decode()分别实现对字符串的变换和复原。变换函数 encode()顺序考察已知字符串的字符,按以下规则逐组生成新字符串:1若已知字符串的当前字符不是数字字符,则复制该字符于新字符串中。2若已知字符串的当前字符是一个数字字符,且它之后没有后继字符,则简单地将它自己复制到新字符串中。3若已知字符串的当前字符是一个数字字符,并且还有后继字符,设该数字字符的面值为 n,则将它的后续字符(包括后续字符是一个数字字符)重复复制 n+1 次到新字符串中。4以上述一次变换为一组,在不同组之间另插入一个下划线字符“-”用于分隔。例如。enco
4、de()函数对字符串 26a3t2 的变换结果为 666_a_tttt_2复原函数 decode()做变换函数 encode()的相反的工作。即复制不连续相同的单个字符,而将一组连续相同的字符(不超过 10 个)变换成一个用于表示重复次数的数字字符和一个重复出现的字符,并在复原过程中掠过变换函数为不同组之间添加的一个下划线字符。假定调用变换函数 encode()时的已知字符串中不包含下划线字符。【函数 2】int encode(char*instr,char * outstr)char*ip,*op,c;int k,n;ip=instr;opoutstr;while(*ip)ifU (1) /
5、U&*(ip+1)n= *ip -0+ 1;c= *+ip;for(k0;kn;k+)U (2) /U;elseU (3) /U;*op+ -;ip+;if(opoutstr) U(4) /U;*op=/0;return op-outstr;int decode(char * instr,char * outstr)char*ip,*op,c;int n;ipinstr;opoutstr;while(*ip)c= *ip;n0;while(*ip=c & n=10)ip+;n+;ifU (5) /U*op+=0+n-1;*op+c;if(* ip=_,) U(6) /U;* op=/0;ret
6、urn op-outstr;(分数:15.00)(1).(分数:2.50)_(2).(分数:2.50)_(3).(分数:2.50)_(4).(分数:2.50)_(5).(分数:2.50)_(6).(分数:2.50)_三、B试题三/B(总题数:1,分数:15.00)阅读下列程序说明和 C 代码,把应填入其中 n 处的字句写在答卷的对应栏内。【说明】程序利用选择排序算法对数组 a 中的 N 个整数按照从小到大的顺序排列,并将排序结果显示出来。【程序】#define N 10main()void U(1) /U;int i,aN;for(i=0;i10,i+) /*输入*/scanf(“%d”,&a
7、i);U (2) /U;for(i=0;iN,i+) /*输出*/printf(“%3d”,ai);void selectSon(int x,int n)int i,j,k,t;for(int i=0;U (3) /U;i+)k=i;for(j=i+1;jn;j+)ifU (4) /Uk=j;ifU (5) /Ut=xi;xi=xk;xk =t;(分数:15.00)(1).(分数:3.00)_(2).(分数:3.00)_(3).(分数:3.00)_(4).(分数:3.00)_(5).(分数:3.00)_四、B试题四/B(总题数:1,分数:15.00)阅读下列程序说明和 C 代码,把应填入其中
8、n 处的字句写在答卷的对应栏内。1 说明】函数 create 能够建立具有任意行和任意列的动态二维整数数组。【函数 4.1 程序】#include“stdioh”int * * create(int row, int col ) int * * x,i;x=(int * *)U (1) /U;for(U (2) /U)xi=(int *)malloc(col * sizeof(int);U(3) /U;【函数 4.2 说明】函数 main()能够判断输入年是否为闰年。【函数 4.2 程序】main()int year,n;scanf(“input year %d”,&year);n=(U (4
9、) /U | U(5) /U);if(n=1)printf(“%d is a leap year/n”,year);else printf(“%d is not a leap year/n”,year);(分数:15.00)(1).(分数:3.00)_(2).(分数:3.00)_(3).(分数:3.00)_(4).(分数:3.00)_(5).(分数:3.00)_五、B试题五/B(总题数:1,分数:15.00)阅读下列程序说明和 C 代码,把应填入其中 n 处的字句写在对应栏内。【说明】下面的程序能够计算不同图形的面积。程序中把每个图形的数据定义成结构类型,利用共同体类型描述 2种图形的数据。程
10、序根据输入参数代表的图形类型,求出图形的面积并输出。【程序】struct Circlefloat x,y; /*圆心位置*/float r; /*圆半径*/;struct Rectanglefloat width; /*矩形宽*/float length; /*矩形长*/;union shapestruct Circle circle;/*圆数据结构*/struct Rectangle rectangle;/*矩形数据结构*/;main()union shape a;float area;int i;printf(“input number: 1circle,2rectangle,3 end/
11、n”);scanf(“%d“,&i);whileU (1) /U /*循环接收输入,并计算输出*/switch(i)case 1:printf(“input radius:/n”);scanf(“%f”,U (2) /U;/*共同体类型变量接收输入*/area=3.1415926*U (3) /U;printf(“the area of circle=%f/n”,area);break;case 2:printf(“input width and length :/n”);seanf(“%f,%f”,U (4) /U;/*共同体类型变量接收输入*/。area=U (5) /U;printf(“
12、the area of rectangle=%f/n”,area);break;printf(“input number:1 circle,2 rectangle,3 end/n”);scanf(“%d”,&i);(分数:15.00)(1).(分数:3.00)_(2).(分数:3.00)_(3).(分数:3.00)_(4).(分数:3.00)_(5).(分数:3.00)_六、B试题六/B(总题数:1,分数:15.00)阅读下列程序说明和 C 程序,把应填入其中(n)处的字句,写在对应栏内。【程序说明】对角线下元素全为 0 的矩阵称为上三角矩阵,设对于一个 nn 的上三角矩阵 a,为节约存贮,只
13、将它的上三角元素按行主序连续存放在数组 b 中。下面的函数 trans 在不引入工作数组的情况下,实现将 a 改为按列主序连续存放在数组 b 中。设 n=5,(分数:15.00)(1).(分数:3.00)_(2).(分数:3.00)_(3).(分数:3.00)_(4).(分数:3.00)_(5).(分数:3.00)_七、B试题七/B(总题数:1,分数:15.00)阅读以下程序说明和 C 程序,将应填入(n)处的字句,写在对应栏内。【程序说明】某网络由 n 个端点组成,这些端点被物理地分成若干个分离的端点组。同一组内的两件端点 i 和 j,它们或直接相连,或间接相连(端点 i 和端点 j 间接相
14、连是指在这两件端点之间有一个端点相连序列,其中端点 i 和 j 分别与这相连序列中的某个端点直接相连)。网络的 n 个端点被统一编号为 0,1,n-1。本程序输入所有直接相连的端点号对,分别求出系统各分离端点组中的端点号并输出。程序根据输入的直接相连的两件端点号,建立 n 个链表,其中第 i 个链表的首指针为 si,其结点是与端点 i 直接相连的所有端点号。程序依次处理各链表。在处理 si链表中,用 top 工作链表重新构造 si链表,使 si链表对应系统中的一个端点组,其中结点按端点号从小到大连接。【程序】#inelude#define N 100typeef struct nodeint
15、data;struct node *link;NODE;NODE * sN;int i,j,n,t;NODE *q,*p,*x,*y,*top;main()printf(“Enter namber of components”);scanf(“%d”,&n);for(i=0;in;i+) printf(“Enter pairs/n”);while(scanf(“%d%d”,&i,&j)=2) /*输入相连端点对,生成相连端点结点链表*/p=(NODE*)malloc(sizeof(NODE);pdata=j;plink=si;si=p;p=(NODE*)malloc(sizeof(NODE);
16、pdata=i;plink=sj;sj=p;for(i=0;in;i+) /*顺序处理各链表*/for(top=si,U (1) /U;top! =NULL;) /*将第 i 链表移入 top 工作链表,并顺序处理工作链表的各结点*/q=top;U (2) /U;if(sj=qdata!=NULL) /将 j 链表也移入工作链表*/for(p=sj;plink! =NULL;p= plink);plink= top;top=sj;U(3) /U;/*在重新生成的第 i 链表中寻找当前结点的插入点*/for(y=si;U (4) /U;x=y,y=ylink);if(y!=NULL & ydat
17、a=qdata)free(q); /*因重新生成的第 i 链表已有当前结点,当前结点删除*/elseU(5) /U;if(y =si)si=q;else xlink=q;for(i =0;i n;i+)/*输出结果*/if(si=NULL)continue;for(p=si;p!=NULL;)printf(“/t%d”,pdata);q=plink;free(p);p=q;printf(“/n”);(分数:15.00)(1).(分数:3.00)_(2).(分数:3.00)_(3).(分数:3.00)_(4).(分数:3.00)_(5).(分数:3.00)_八、B试题八/B(总题数:1,分数:1
18、5.00)阅读下列程序说明和 C 程序,把应填入其中(n)处的字句,写在对应栏内。【程序说明】已知某二叉树的前序遍历和中序遍历序列,可以得到该二叉树的结构。本程序实现了根据这两个遍历序列生成一棵链接表示的二叉树。构造二叉树的算法要点是:由前序遍历序列,该序列的第一个元素是根结点元素。该元素将中序遍历序列分成左、右两部分,那些位于该元素之前的元素是它的左子树上的元素,位于该元素之后的元素是它的右子树上的元素。对于左、右子树,由它们的前序遍历序列的第一个元素可确定左、右子树的根结点,参照中序遍历序列又可进一步确定子树的左、右子树元素。如此递归地参照两个遍历序列,最终构造出二叉树。两个遍历序列作为主
19、函数 main()的参数。为简单起见,程序假定两个遍历序列是相容的。主函数调用函数 restore()建立二叉树。函数 restore()以树(子树)的前序遍历和中序遍历两序列及序列长为参数,采用递归方法建立树(子树)。函数 postorder()实现二叉树的后序遍历序列输出,用来验证函数 restore()建立的二叉树。【程序】#include(stdioh#includestdlibh#define MAX 100typedef struct nodechar data;struet node * llink,*rlink;TNODE;charpredMAX,inodMAX;TNODE *
20、 restore (Char*,char*,int);main(int argc,Char* *argv)TNODE * root;if(argc3)exit(0);strcpy(pred,argv1);strcpy(inod,argv2);root=restore(pred,inod,strlen(pred)postorder(root);printf(“/n/n“);TNODE * restore(Char * ppos,char * ipos,int n) /*参数包括前序遍历序列数组和中序遍历数组*/TNODE * ptr;Char * rpos;int k;if(n =0)retur
21、n NULL;ptr= (TNODE *)malloc(sizeof(TNODE);ptrdata=U (1) /U;forU (2) /Urpos=ipos;rpos ipos+n;rpos+ )if(*rpos= * ppos)break;k =U (3) /U;ptrllink = restore(ppos+1,U (4) /U,k);ptrrlink = restoreU (5) /U+ k,rpos + 1,n-1-k);return ptr;postorder(TNODE *ptr) if(ptr=NULL)return;postorder(ptrllink);postorder(
22、ptrrlink);prinft(“%c“,ptrdata);(分数:15.00)(1).(分数:3.00)_(2).(分数:3.00)_(3).(分数:3.00)_(4).(分数:3.00)_(5).(分数:3.00)_九、B试题九/B(总题数:1,分数:15.00)阅读以下说明和 C 代码,将应填入(n)处的字句写在对应栏内。【说明】在一图像处理系统中,开发者定义了一个图像结构 ImageCon,其中定义了图像应该具有的属性。当图像件的内容或状态发生变化时,与之相关联的 ImageView 结构的值都需要发生改变。一个 ImageCon 结构能够关联一组 ImageView 结构。当 Im
23、ageCon 结构的内容或状态发生变化时,所有与之相关联的 ImageView结构都将被更新,这种应用被称为观察者模式。以下代码采用 C 语言实现,能够正确编译通过。【C 代码】#include stdio.h#define OBS_MAXNUM 20/*一个 ImageCon 变量最多能够关联的 ImageView 变量的个数*/typedef void U(1) /U (struc ImageCon *,struct ImageView *);struct ImageViewfunc update; /*ImageView 结构采用的更新函数*/*其他的结构字段省略*/;struct Im
24、ageConU (2) /UmyObsOBS_MAXNUM;/*存储所有与 ImageCon 相关联的 ImageView 结构指针*/intindex; /*与 ImageCon 结构变量相关联的 ImageView 结构变量的个数*/;void attach(struct ImageCon *IMG,struct ImageView *ob)/*关联 Obersver 结构 ob 与 ImageCon 结构 IMG*/int loop=0;if(IMGindex=OBS_MAXNUM|ob=NULL)return;for(loop=0;loopIMGindex;loop+)if(IMGmy
25、Obs loop= =ob)return;IMGmyObsIMGindex=ob;IMGindex+;void detach(struct ImageCon *IMG,struct ImageView *ob)/*解除 IMG 结构与 ob 结构间的关系*/int loop;if(ob= =NULL)return;for(loop=0;loopIMGindex;loop+)if(IMGmyObsloop= =ob)if(loop=IMGindex-2)IMGmyObsloop=IMGmyObsU (3) /U;IMGmyObsIMGindex-1=NULL;IMGindex- -;breack
26、;void updatel(struct ImageCon *IMG,struct ImageView *ob)/*更新 ob 结构的值,更新代码省略*/void update2(struct ImageCon *IMG,struct ImageView *ob)/*更新 ob 结构的值,更新代码省略*/ void notifyObs(struct ImageCon *IMG)/*当 IMG 结构的值发生变化时,通知与之关联的所有 ImageView 结构变量*/int loop;for(loop=0;loopIMGindex;loop+)(IMGmyObsloop)updateU (4) /
27、U;void main()struct ImageCon IMG;/*定义一 ImageCon 变量*/struct ImageView explorer1,explorer2;/*定义两个 ImageView 变量*/*初始化与 ImageCon 变量相关的 ImageView 变量个数为 0*/IMG.index=0;explorer1.update=updatel;/*设置 explorerl 变量的更新函数*/explorer2.update=update2;/*设置 explorer2 变量的更新函数*/attach(&IMG,&explorer1);/*关联 explorer1 与
28、 IMG 对象*/attach(&IMG,&explorer1);/*关联 explorer1 与 IMG 对象*/*其他代码省略*/U (5) /U;return;(分数:15.00)(1).(分数:3.00)_(2).(分数:3.00)_(3).(分数:3.00)_(4).(分数:3.00)_(5).(分数:3.00)_十、B试题十/B(总题数:1,分数:15.00)阅读以下说明和 C 程序,将应填入(n)处的字句写在对应栏内。【说明】并行计算中需要将 N 个作业分配给 N 个处理器同时去完成,每个处理器都能承担这 N 个作业,但耗时不同。下面的程序用回溯法计算总耗时最小的一种作业分配方案
29、,在该方案中为每个处理器分配 1 个不同的作业。程序中,N 个作业从 0 开始依次编号,N 个处理器也从 0 开始依次编号,主要的变量说明如下:cij:将作业 i 分配给处理器 j 的耗时;jobi:值为 0 表示作业 i 未分配,值为 j 表示作业 i 分配给处理器 j;processork:值为 0 表示处理器 k 未分配作业,值为 1 表示处理器 k 已分配作业;mincost:最小总耗时。【C 程序】#includestdioh#define N 8/*N 表示作业数和处理器数*/int cNN;unsigned int mincost=65535/*设置 min 的初始值,大于可能的
30、总耗时*/int jobN,tempN,processorN;void Assign(int k,unsigned int cost)int i;ifU (1) /U& costmincost)mincost = costfor(i=0;iN;i+)tempi=jobi;else for(i=0;iN;i+)/*分配作业 k*/ifU (2) /U& cost+ckimincost)processori=1;jobk= U(3) /U;AssignU (4) /U,cost+cki);U (5) /U;jobk=0;/ * if * / *Assign * /void main()int i,
31、j;for(i=0;iN;i+)/*设置每个作业由不同处理器承担时耗时及全局数组的初值*/processori=0;jobi=0;tempi=0;for(j=0;jN;j+)scanf(“%d“,&cij);Assign(0,0);/*从作业 0 开始分配*/printf(“/n 最小耗时=%d/n“,mincost);for(i=0;iN;i+)printf(“Job%d is assigned to Processor%d/n“,i,tempi);/*main*/(分数:15.00)(1).(分数:3.00)_(2).(分数:3.00)_(3).(分数:3.00)_(4).(分数:3.00)_(5).(分数:3.00)_程序员-C 语言试题答案解析(总分:150.00,做题时间:90 分钟)一、B试题一/B(总题数:2,分数:15.00)1.【函数 1.1 说明】 函数 strcpy(char * destination,char * source)将字符串 source 复制到字符串destination。 【函数 1.1】 void strcpy (char * destination,char*source) whileU (1) /U;(分数:3.00)_