【解析】一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性。软件详细设计生产的图如下:该图是()【解析】N-S图提出了用方框图来代替传统的程序流程图,所以A)不对。PAD图是问题分析图,它是继承程序流程图和方框图之后提出的又一种主要用于描述软件详细设计的图形表示工具,所以B)不对。E-R图是数据库中的用于表示E-R模型的图示工具,所以D)不对。根据图中所示表示方法是进行软件详细设计时使用的程序流程图。在E-R图中,用来表示实体联系的图形是()。A)椭圆形B)矩形C)菱形D)三角形【解析】在E-R图中实体集用矩形,属性用椭圆,联系用菱形。以下选项中能表示合法常量的是A)1,200B)1.5E2.0C)'\'D)\007【解析】A选项中整型常量应表示为1200,不能包含,?B选项中E后面的指数必须为整数?C选项中转义字符以\开始,若要表示字符\,应写为\\?若变量x、y已正确定义并赋值,以下符合C语言语法的表达式是A)x+1=yB)++x,y=x--C)x=x+10=x+yD)double(x)/10【解析】A选项中不能将变量y赋给表达式,C选项中错误与A选项一样,D选项中强制类型转换表达式应写成(double)x/10。若a是数值类型,则逻辑表达式(a==1)||(a!=1)的值是A)1B)0C)2D)不知道a的值,不能确定【解析】逻辑或||要求只要两边的运算对象有一个非零,结果就为真,虽然不知道a的值,但是若a为1,则左边运算对象为1,若a的值不是1,则右边运算对象的值为1,所以总能保证一边非零,所以结果为真,即1。设有定义:inta=1,b=2,c=3;以下语句中执行效果与其它三个不同的是A)if(ab)c=a,a=b,b=c;B)if(ab){c=a,a=b,b=c;}C)if(ab)c=a;a=b;b=c;D)if(ab){c=a;a=b;b=c;}【解析】由于a不小于b,所以所有选项中的条件都为假,c选项中实际执行了a=b;b=c;两个操作。而B,C,D选项由于条件不成立,所以什么也没有做,所以选择C选项。有以下程序#includestdio.hmain(){inty=10;while(y--);printf(y=%d\n,y);}程序执行后的输出结果是A)y=0B)y=-1C)y=1D)while构成无限循环【解析】执行y--直到值为0,由于y--是先用再减,所以退出循环时,y的值为-1。有以下程序#includestdio.hmain(){inti,j;for(i=1;i4;i++){for(j=i;j4;j++)printf(%d*%d=%d,i,j,i*j);printf(\n);}}程序运行后的输出结果是A)1*1=11*2=21*3=32*2=42*3=63*3=9B)1*1=11*2=21*3=32*1=22*2=43*1=3C)1*1=11*2=22*2=41*3=32*3=63*3=9D)1*1=12*1=22*2=43*1=33*2=63*3=9【解析】外循环第一次i的值为1,内循环第一次j的初值为1,打印1*1=1,内循环第二次j的值为2,打印1*2=2,内循环第三次j的值为3,打印1*3=3,打印回车换行,退出内循环。外循环第二次i的值为2,内循环第一次j的初值为2,打印2*2=4,内循环第二次j的值为3,打印2*3=6,打印回车换行,退出内循环。外循环第3次,i的值为3,内循环第一次j的初值为3,打印3*3=9,打印回车换行,退出内循环。有以下程序#includestdio.hmain(){inti=5;do{if(i%3==1)if(i%5==2){printf(*%d,i);break;}i++;}while(i!=0);printf(\n);}程序的运行结果是A)*2*6B)*3*5C)*5D)*7【解析】do...while语句是先执行后判断,所以第一次先执行循环体,判断i%3==1的条件,由于i为5所以余数为2,条件不成立,执行i++,i的值为6,判断while条件为真,第二次执行循环体,同第一次循环体的执行过程一样,i的值变为7,判断while条件为真,第三次执行循环体,此时i%3==1条件成立,判断i%5==2也成立,打印*与i的值,即*7,然后执行break语句,跳出循环。所以选择D选项。若有以下函数首部intfun(doublex[10],int*n)则下面针对此函数的函数声明语句中正确的是A)intfun(double,int);B)intfun(double*,int*);C)intfun(double*x,intn);D)intfun(doublex,int*n);【解析】函数声明的一般形式为:类型说明符被调函数名(类型形参,类型形参…);或为:类型说明符被调函数名(类型,类型…);由于函数首部为intfun(doublex[10],int*n),因此B选项正确。有以下程序#includestdio.hmain(){intm=1,n=2,*p=&m,*q=&n,*r;r=p;p=q;q=r;printf(%d,%d,%d,%d\n,m,n,*p,*q);}程序运行后的输出结果是A)2,1,1,2B)1,2,1,2C)2,1,2,1D)1,2,2,1【解析】intm=1,n=2,*p=&m,*q=&n,*r;即指针变量p指向m,指针变量q指向n,r=p;p=q;q=r;即通过指针变量r,将指针p和指针q指向交换。因此最后输出1,2,2,1。若有以下定义intx[10],*pt=x;则对x数组元素的正确引用是A)pt+3B)*&x[10]C)*(pt+10)D)*(x+3)【解析】没有A选项的引用形式。*与&放在一起作用抵消,所以B选项错误,最大只能引用到x[9]。*(pt+i)表示引用指针pt所指元素后的第i个元素,所以C选项错误,最大只能为*(pt+9)。因此D选项正确。有以下程序#includestdio.hmain(){inti,s=0,t[]={1,2,3,4,5,6,7,8,9};for(i=0;i9;i+=2)s+=*(t+i);printf(%d\n,s);}程序执行后的输出结果是A)20B)25C)45D)36【解析】统计1~9九个数中的奇数和,此题考察指向数组的指针。C语言规定数组名代表数组的首地址,也就是第一个元素的地址。因此*(t+i)代表数组的第i+1个元素。程序运行的结果是1+2+3+4+5+6+7+8+9=25。设有定义:char*c;以下选项中能够使c正确指向一个字符串的是A)charstr[]=string;c=str;B)scanf(%s,c);C)c=getchar();D)*c=string;【解析】A选项为正确用法,先将字符串存于字符数组中,然后将数组名赋给字符指针。(数组名代表数组首地址,定义数组时为其分配确定地址)。C选项错误,getchar()函数输入个字符给字符型变量,而不是字符指针。B选项和D选项有类似的错误,两个选项并无语法错误,但运行时可能会出现问题。因为在B选项和D选项中,字符指针没有被赋值,是个不确定的值,指向一个不确定的内存区域,这个区域可能存放有用的指令或数据。在这个不确定的区域重新存放字符串,可能会发生无法预知的错误。因此A选项正确。有以下程序#includestdio.h#includestring.hmain(){charp[20]={'a','b','c','d'},q[]=abc,r[]=abcde;strcat(p,r);strcpy(p+strlen(q),q);printf(%d\n,strlen(p));}程序运行后的输出结果是A)11B)9C)6D)7【解析】strcpy:字符串拷贝函数;strlen:求字符串长度函数(注意:不包含字符串结束标记字符'\0');strcat:字符串连接函数。执行完语句strcat(p,r);后,p数组中存储的元素为a,b,c,d,a,b,c,d,e;执行语句strcpy(p+strlen(q),q);得到的结果是将q所指向的字符串拷贝至p+strlen(q)开始的存储位置,因为strlen的值为3,即p+3开始存储q中的元素。所以执行完strcpy(p+strlen(q),q)语句后,字符数组p[20]的存储元素为a,b,c,a,b,c;所以strlen(p)的结果为6。因此C选项正确。有以下程序#includestdio.hintfun(){staticintx=1;x+=1;returnx;}main(){inti,s=1;for(i=1;i=5;i++)s+=fun();printf(%d\n,s);}程序运行后的输出结果是A)120B)11C)6D)21【解析】fun函数中的变量x为静态局部变量,占用固定的内存单元,下一次调用时仍可以保留上次调用时的值。也就是说,如果多次调用fun函数,x的定义只在第一个调用时有效,从第二次调用开始,x的定义相当于不存在,直接使用上次x的值。fun函数被调用了5次,每次调用后的返回值累加到s上。5次调用后,x的值为6,s的值为21。因此D选项正确。以下关于typedef的叙述错误的是A)用typedef可以增加新类型B)typedef只是将已存在的类型用一个新的名字来代表C)用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名D)用typedef为类型说明一个新名,通常可以增加程序的可读性【解析】typedef并不是增加了新类型,而是用一个新名字替代已存在的类型,不能为变量说明一个新名,使用typedef可以增强移植性。所以A选项错误。程序中已构成如下图所示的不带头结点的单向链表结构,指针变量s、p、q均已正确定义,并用于指向链表结点,指针变量s总是作为指针指向链表的第一个结点。若有以下程序段q=s;s=s-next;p=s;while(p-next)p=p-next;p-next=q;q-next=NULL;该程序段实现的功能是A)删除尾结点B)尾结点成为首结点C)删除首结点D)首结点成为尾结点【解析】本题考查链表的操作,本题中首先是s指向了它的下个节点,题目中说明了s总是指向链表的第一个节点,然后while循环找到链表的最后一个元素,然后最后一个元素指向了之前链表的头节点,之前头节点指向了空节点,所以本题实现的效果是使首节点成为尾节点。选项D正确。有以下程序#includestdio.h#defineS(x)4*(x)*x+1main(){intk=5,j=2;printf(%d\n,S(k+j));}程序运行后的输出结果是A)33B)197C)143D)28【解析】本题考查带参数的宏定义,S为带参数的宏定义,运行S(k+j)为4*(k+j)*k+j+1=143,选项C正确。以下叙述中错误的是A)gets函数用于从终端读入字符串B)getchar函数用于从磁盘文件读入字符C)fputs函数用于把字符串输出到文件D)fwrite函数用于以二进制形式输出数据到文件【解析】本题考查字符处理函数和文件做操函数,属于基础知识,其中B选项getchar是用于从终端读入字符。有以下程序#includestdio.hmain(){FILE*pf;char*s1=China,*s2=Beijing;pf=fopen(abc.dat,wb+);fwrite(s2,7,1,pf);rewind(pf);/*文件位置指针回到文件开头*/fwrite(s1,5,1,pf);fclose(pf);}以上程序执行后abc.dat文件的内容是A)ChinaB)ChinangC)ChinaBeijingD)BeijingChina【解析】本题考查文件操作函数,fwrite和rewind函数,题目中先是将s2字符串写入adc.dat中,然后将写指针回到文件开头,然后写入s1字符串,那