欢迎广大考生登录大学公共计算机资源共享网站!
   
计算机二级考试试题
 

等级考试二级 C语言模拟题及答案9

一、选择题 (1)~(10)每小题2分,(11)-(50)每小题1分,共60分)
     下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。

   (1)数据结构中,与所使用的计算机无关的是数据的________。
   A)存储结构   B)物理结构      C)逻辑结构     D)物理和存储结构
   答案:C
   评析:数据结构概念一般包括3个方面的内容,数据的逻辑结构、存储结构及数据上的运算集合。数据的逻辑结构只抽象的反映数据元素之间的逻辑关系,而不管它在计算机中的存储表示形式。

   (2)栈底至栈顶依次存放元素A、B、C、D,在第五个元素E入栈前,栈中元素可以出栈,
   则出栈序列可能是________。
   A)ABCED     B)DBCEA       C)CDABE       D)DCBEA
   答案:D
   评析:栈操作原则上"后进先出",栈底至栈顶依次存放元素A、B、c、D,则表明这4个元素中D是最后进栈,B、c处于中间,A最早进栈。所以出栈时一定是先出D,再出c,最后出A。

   (3)线性表的顺序存储结构和线性表的链式存储结构分别是________。
   A)顺序存取的存储结构、随机存取的存储结构
   B)随机存取的存储结构、顺序存取的存储结构
   C)随机存取的存储结构、随机存取的存储结构
   D)任意存取的存储结构、任意存取的存储结构
   答案:B
   评析:顺序存储结构中,数据元素存放在一组地址连续的存储单元中,每个数据元素地址可通过公式LOC(ai)。LOC(a1)+(i-1)L计算得到,从而实现了随机存取。对于链式存储结构,要对某结点进行存取,都得从链的头指针指向的结点开始,这是一种顺序存取的存储结构。

   (4)在单链表中,增加头结点的目的是________。
   A)方便运算的实现          B)使单链表至少有一个结点
   C)标识表结点中首结点的位置     D)说明单链表是线性表的链式存储实现
   答案:A
   评析:头结点不仅标识了表中首结点的位置,而且根据单链表(包含头结点)的结构,只要掌握了表头,就能够访问整个链表,因此增加头结点目的是为了便于运算的实现。

   (5)软件设计包括软件的结构、数据接口和过程设计,其中软件的过程设计是指________。
   A)模块间的关系            B)系统结构部件转换成软件的过程描述
   C)软件层次结构            D)软件开发过程
   答案:B
   评析:软件设计包括软件结构设计、数据设计、接口设计和过程设计。其中结构设计是定义软件系统各主要部件之间的关系;数据设计是将分析时创建的模型转化为数据结构的定义;接口设计是描述软件内部、软件和操作系统之间及软件与人之间如何通信;过程设计则是把系统结构部件转换成软件的过程性描述。

   (6)为了避免流程图在描述程序逻辑时的灵活性,提出了用方框图来代替传统的程序流程  图,通常也把这种图称为________。
   A)PAD图    B)N-S图       C)结构图       D)数据流图
   答案:B
   评析:常见的过程设计工具有:程序流程图、N-S图、PAD图和HIPO图。其中,为了避免流程图在描述程序逻辑时的灵活性,提出了用方框图来代替传统的程序流程图,通常也把这种图称为N-S图。

   (7)数据处理的最小单位是________。
   A)数据     B)数据元素      C)数据项      D)数据结构
   答案:C
   评析:数据处理的最小单位是数据项;由若干数据项组成数据元素;而数据是指能够被计算机识别、存储和加工处理的信息载体;数据结构是指数据之间的相互关系和数据运算。

   (8)下列有关数据库的描述,正确的是________。
   A)数据库是一个DBF文件       B)数据库是一个关系
   C)数据库是一个结构化的数据集合   D)数据库是一组文件
   答案:C
   评析:数据库(Database,简称DB)是数据的集合,它具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序所共享。数据库中的数据具有"集成"、"共享"之特点。

   (9)单个用户使用的数据视图的描述称为 ______ 。
   A)外模式    B)概念模式     C)内模式      D)逻辑模式
   答案:A
   评析:外模式是用户的数据视图,也就是用户所见到的数据模式;全局数据视图的描述称为概念模式,即数据库中全部数据的整体逻辑结构的描述;物理存储数据视图的描述称为内模式,即数据库在物理存储方面的描述;存储模式即为内模式。

   (10)需求分析阶段的任务是确定______。
   A)软件开发方法  B)软件开发工具  C)软件开发费用    D)软件系统功能
   答案:D
   评析:需求分析是软件定义时期的最后一个阶段,它的基本任务就是详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统的工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。

   (11)若变量a是int类型,并执行了语句:a='A'+1.6;,则正确叙述是______。
   A)a的值是字符C           B)a的值是浮点型
   C)不允许字符型和浮点型相加     D)a的值是字符'A'的ASCII值加上l
   答案:D
   评析:在赋值表达式中,赋值符右边的值的类型会自动转换成赋值符左边的变量的类型。在本题中,先用"A"的ASCII码值加上1.46得到66.46,然后将它强制转换成int型,转换后,实数的小数部分全部

   (12)若以下选项中变量已正确定义,则正确的赋值语句是______。
   A)x1=26.8%3;  B)1+2=x2;   C)x3=0x12;     D)x4=1+2=3;
   答案:C
   评析:赋值符号"="就是赋值运算符,它的作用是将一个数据赋给一个变量。如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换,所以选项A错误。在赋值表达式中,赋值运算符的左侧必须是一个变量,所以选项B、D错误。选项C是将一个十六进制数赋值给变量x3。

   (13)以下程序段的输出结果是______。
   int a=1234;
   printf("%2d\n",a);
   A)12       B)34        C)1234       D)提示出错、无结果
   答案:C
   评析:本题主要考查对primf函数域宽描述符的理解,在这里我们要特别注意:输出数据的实际精度并不主要决定于格式项中的域宽与精度,也不决定于输入的数据精度,而主要决定于数据在机器内的存储精度。

   (14)以下选项中不属于C语言的类型的是______。
   A)signed short int         B)unsigned char
   C)signed long            D)long short
   答案:D
   评析:c语言中归纳起来,基本类型数据有以下几种:
   [signed]char;unsigned char;[signed]short[int];unsigned short[int];[signed]long[int];unsigned long[int];float;double.

   (15)设有定义:int a,*pa=&a;以下scanf语句能正确为变量a读入数据的是______。
   A)scanf("%d",B);         B)scanf("%d",a);
   C)scanf("%d",&pa);        D)scanf("%d",*pa);
   答案:C
   评析:scanf函数要求其中的输入项必须是地址形式,比如:普通变量的地址、数组名、指针变量等。对于普通变量,地址形式为:&变量名;当一个普通变量的地址赋予了一个指针变量名,scanf函数的输入项处就可以直接写这个指针变量名。

   (16)以下程序的输出结果是______。
   main()
   {int a=5,b=4,c=6,d;
   printf("%d\n",d=a>c?(a>c?a:C):(b));
   }
   A)5       B)4         C)6        D)不确定
   答案:B
   评析:本题最重要的分析d=a>c?(a>c?a:C):(b)),首先运算括号内的式子a>c?a:c,它的值是c的值6,即式子化成d=a>c?6:4。显然a=c,所以将4赋给d。

   (17)以下程序中,while循环的循环次数是______ 。
   main()
   { int i=0:
   while(i<10)
   {if(i<1)continue;
   if(i==5)break;
   i++:
   }
   ……
   }
   A)1       B)10        C)6        D)死循环,不能确定次数
   答案:D
   评析:进入循环后,先执行一个条件语句,如果i的值小于l,那么直接进入下一轮循环,因为i的初始值是0,小于l,故直接进入下一轮循环,又因为i的值始终没有改变,所以这个循环成了死循环。

   (18)有以下程序:
   main()
   {
   char k;int i;
   for(i=1;i<3;i++)
   {
   scanf("%c",&k);
   switch(k)
   {
   case'0':printf["another\n"];
   case'1':printf["number\n");
   }
   }
   }
   程序运行时,从键盘输入:0l<回车>,程序执行后输出结果是______。
   A)another   B)another      C)another      D)number
   number      number        number       number
   another       number
   答案:C
   评析:switch语句是多分支选择语句,执行完一个case后面的语句后,流程控制转移到下一个case继续执行。"case常量表达式"只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。

   (19)以下程序的输出结果是______。
   main()
   {Int a=O,i;
   for(i=1;i<5;i++)
   {switch(i)
   { case 0:
   case 3:a+=2:
   case l:
   case 2:a+=3:
   default:a+=5;
   }
   }
   printf("%d\n",a)
   }
   A)3l       B)13        C)10         D)20
   答案:A
   评析:switch结构的执行过程同上题。

   (20)己定义c为字符型常量,则下列语句中正确的是______。
   A)C='97'    B)c="97"     C)c=97        D)c="a"
   答案:C
   评析:字符变量占内存一个字节,只能放一个字符;字符常量为单引号括起的单个字符;字符串常量为双引号括起的一串字符(可以0个字符,即"",称为空串)。选项c为字符ASCII码的整数形式。

   (21)以下程序的输出结果是_________。
   main()
   f int a=4,b=5,c=0,d;
   d=!a&&!b||!c;
   printf("%d\n",d);
   }
   A)l       B)0         C)非0的数     D)-1
   答案:A
   评析:!a值为0,故!a&&!b的值为0,!c的值为l,而0IIl的值应该是l。所以答案是A。

   (22)以下程序的输出结果是_________。
   #include<stdio.h>
   main()
   {int i=0,a=0;
   while(i<20)
   {for(;;)
   {if((i%10)==0)break;
   else  I--:
   }
   i+=ll;a+=i;
   }
   printf("%d\n",a);
   }
   A)21      B)32        C)33        D)11
   答案:B
   评析:本题中,有两个循环语句。首先,i=0,进入while循环,for语句中对循环没有任何条件,故直接进入for循环,因为0%10结果还是O,所以跳出for循环,执行i+:11,i的值变为11,执行a+=i,a的值变为11:接着进入下一轮while循环,在for循环中,因为i的值是11,对10取余结果为l,所以执行i自减,i的值变成10,进入又一轮for循环,因为10%10==0,所以跳出for循环,执行i+=1l,i的值变成21,执行a+=i,也就是将21+1 1的和赋给a,a=32,因为此时i的值不再小于20,所以结束循环,
   故输出结果是32。

   (23)有以下程序:
   int n(int x,int y)
   {retum x>y?x:y;}
   Int f2(int x,int y)
   {return x>y?y:x;)
   main()
   { int a=4,b=3,c=5,d,e,f;
   d=f1(a,b);d=fl(d,C);
   e=f2(a,b);e=f2(e,C);
   f=a+b+C-d-e;
   printf("%d,%d,%d\n",d,e,f);
   }
   程序运行后的输出结果是_________ 。
   A)3,4,5    B)5,3,4      C)5,4,3       D)3,5,4
   答案:B
   评析:函数n是一个求两个整数中最大值的函数,函数f2是一个求两个整数中最小值的函数。在main函数中两次调用函数n,求得变量a、b、、c中的最大值赋值给d;两次调用函数f2,求得变量a、b、c中的最小值赋值给e;表达式a+b+c-d-e得到中间值,输出5,3,4。

   (24)以下程序的输出结果是_________。
   int f()
   {static int i=0;
   int s=1:
   s+=i;i++;
   return s;
   }
   main()
   {inti,a=0;
   for(i=0;i<5;j++)a+=f();
   printf("%d\n",a);
   }
   A)20      B)24        C)25         D)15
   答案:D
   评析:静态变量,在编译时就为其分配了存储空间,程序一开始执行便被建立,直到该程序执行结束都存在,而不像动态变量只存在于函数或分程序被调用期间。在函数多次被调用的过程中静态局部变量的值具有可继承性。

   (25)已定义以下函数:
   fun(int *p)
   {retum *p;}
   该函数的返回值是______ 。
   A)不确定的值 B)形参p中存放的值 C)形参p所指存储单元中的值 D)形参p的地址值
   答案:C.
   评析:函数首部fun(int*p)中+p表示这是一个指针变量,指向整型数据,用来从主调函数接收地址;而语句return *p;中的*p代表p所指向存储单元中的值。

   (26)若有以下程序
   #include<stdio.h>
   Void f(int n);
   main()
   {void f(int n);
   f(5);
   }
   Void f(int n)
   {print("%d\n",n);}
   则以下叙述中不正确的是______ 。
   A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f
   B)若在主函数前对函数f进行说明,则在主函数和其后的其它函数中都可以正确调用函数f
   C)对于以上函数程序,编译时系统会提示出错信息;提示对f函数重复说明
   D)函数f无返回值,所以可用void将其类型定义为无值型
   答案:C
   评析:一个函数在一个文件中的定义只能有一次,但对它的声明却可以有很多个。一个函数可以正确调用在当前函数之前声明的函数。

[NextPage]
    (27)有以下程序段:
   int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;
   b=p[5];
   b中的值是______。
   A)5       B)6         C)8         D)9
   答案:D
   评析:数组a各元素a[O]~a[9]的值依次为1~10;在程序的说明部分,指针变量p初始化为&a[3](即a+3),则p[5]相当于·(p+5),相当于a[8],所以执行语句b=p[5];后,b的值为9。

   (28)在C语言中,形参的缺省存储类是______。
   A)auto     B)register      C)static      D)extern
   答案:A
   评析:程序进行编译时,并不为形式参数分配存储穿间。只有在被调用时,形式参数才临时地占有存储空间。形式参数用关键字auto作存储类别的声明时,关键字"auto"可以省略,auto不写则隐含确定为"自动存储类别",它属于动态存储方式。

   (29)有以下定义:
   #include<stdio.h>
   char a[10],*b=a;
   不能给数组a输入字符串的语句是______。
   A)gets(a);  B)gets(a[0]);  C)gets(&a[0]); D)gets(b);
   答案:B
   评析:函数gets的格式为:gets(字符数组名)
   c语言中,字符数组名代表数组的首元素地址,即&a[O],字符指针变量lb值也为数组a的首地址,选项A、c、D均能给数组a输入字符串。选项B中a[O]为数组元素,是一个数据变量。

   (30)若指针p已正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是 ______.
   A)p=2*(int*)malloc(sizeof(int));  B)p=(int*)malloc(2*sizeof(int))
   C)p=(int*)malloc(2*2)        D)p=(int*)calloc(2,sizeof(int))
   答案:A
   评析:malloe函数的作用是在内存开辟指定大小的存储空问,并将此存储空间的地址作为函数值带回,它的原型为void。malloe(unsigned int size),函数值为指针,这个指针是指向void类型。如果要将此返回地址赋给一个指向特定类型的指针变量,则应进行强制类型转换。
   calloc函数的模型是:void*calloc(unsigned int num,unsigned int size)作用是分配num个大小为size字节的空间。

   (31)下面程序段的输出结果是______ 。
   main()
   {
   char strl [10]={'s','t','u','d','e','n','t'};
   printf("%d\n",strlen(strl));
   }
   A)7       B)8         C)10        D)存在语法错误
   答案:A
   评析:strlen()函数得到字符串的长度,返回值为数值型。字符数组初始化,若提供的初值个数大于数组长度,则按语法错误处理。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定义为空字符。

   (32)以下程序的输出结果是______。
   main()
   {int x=040;
   printf("%o\n",x<<1);
   }
   A)100      B)80        C)64         D)32
   答案:A
   评析:040用二进制表示就是00100000,左移一位,得到的值应该是01000000,化成八进制应该是0100。

   (33)下面程序运行后的输出结果是______。
   main()
   {
   char arr[2][4];
   strcpy(arr[0],"you");strcpy(arr[1],"me");
   arr[0][3]='&';
   print"%s\n",arr[0]);
   }
   A)you&me    B)you        C)me         D)err
   答案:A
   评析:在主函数中定义了一个2*4的二维字符数组,执行strcpy(arr[O]"fIyou");后,arr[0]={'y''o','u','\0'},执行strcpy(arr[1],"me");后arr[1]={ 'm', 'e','\0',不定},当执行完arr[O][3];'&';从arr[O]开始的存储空间中的字符依次是'y','o','u','&','m','e','\0',故执行printf("%s\n",arr[O]);后的输出结果为"you&me",选A。

   (34)若要打开A盘上的user子目录下名为abc.txt的文本文件进行读、写操作,下面符合  此要求的函数调用是______。
   A)fopen("A:\user\abc.txt","r")   B)fopen("A:\\user\\abc.txt","r+")
   C)fopen("A:\user\abc.txt","rb")   D)fopen("A:\\user\\abc.txt","w")
   答案:B
   评析:本题考查点是fopen函数中文件使用方式的指定。
   文件使用方式"r",表示以"只读"方式打开一个字符文件。
   文件使用方式"r+",表示以"读写"方式打开一个字符文件。
   文件使用方式""rb",表示以"只读"方式打开一个二进制文件。
   文件使用方式"w",表示以"只写"方式打开一个字符文件。

   (35)以下不能正确进行字符串赋初值的语句为______。
   A)char str[5]= "good! "     B)char str[]="good! "
   C)char *str="good! "       D)char str[5]={'g','0','o','d'}
   答案:A
   评析:用字符串作初值为字符数组赋值时,系统总会自动在字符串的末尾补上一个"\O",如选项A中定义的话,把第6个字符也就是"\0"赋给str数组,但此数组只含5个元素,而放到了s仃数组之后的存储单元中,这就可能会破坏其它数据区或程序本身。

   (36)有以下程序:
   #include<string.h>
   main(int argc,char*argv[])
   {
   int i,len=O;
   for(i=1;i<argc;i+=2)len+=strlen(argv[i]);
   Print("%d\n",len);
   }
   经编译连接后生成可执行文件ex.exe,若运行时输入以下带参数的命令行
   ex abcd efg h3 k44
   运行后输出结果是______。
   A)14      B)12         C)8         D)6
   答案:C
   评析:main函数的第一个参数argc是int型变量,用来统计命令行中的字符串个数,本题输入带参数的命令行"ex abed efg h3 k44<回车>",argc的值是5;第二个参数是字符型指针数组,长度由argc的值决定,每个数组元素存放一个指向字符串数据的指针。for语句将命令行中两个字符串abed和h3的长度进行累加,放在变量len中。

   (37)若有下面的说明和定义:
   struct test
   { int ml;char m2;float m3;
   union uu{char ul[5];int u2[2];}ua;
   }myaa;
   则sizeof(stuct test)的值是______。
   A)12      B)16          C)14       D)9
   答案:A
   评析:在定义了结构体变量后,系统会为之分配内存单元,在内存中一个整型占2个字节,一个字符占1个字节,一个数组元素占1个字节,一个浮点型占4个字节。结构体变量所占内存长度是各成员占的内存长度之和;而共用体变量所占的内存长度等于最长的成员的长度。所以test在内存中占12个字节(2+l+4+5=12)。

   (38)若有定义:int aa[8];,则以下誊达式中不能代表数组元素aa[1]的地址的是______。
   A)&aa[0]+l   B)&aa[1]      C)aa[0]++    D)aa+1
   答案:C
   评析:答案A中&aa[0]表示aa[0]的地址,加上1就是aa[1]的地址。同样aa[1]的地址也可以直接用&aa[1]或aa+l表示。

   (39)下面叙述中正确的是______。
   A)全局变量的作用域一定比局部变量的作用域范围大
   B)静态类别变量的生存期贯穿于整个程序的运行期间
   C)函数的形参都属于全局变量
   D)未在定义语句中赋值的auto变量和static变量的初值都是随机值
   答案:B
   评析:c语言中,全局变量的作用范围是从定义处到程序结束,因此全局变量的定义点直接影响其作用范围,因此选项A错误。静态(statiC)存储类别变量是在程序编译时分配存储空间,该类别变量在整个程序运行期间占据着固定的存储单元,当多次调用其所在的函数时,该类别变量的值为上一次调用的值,直至整个程序结束运行后才释放该变量所占存储单元。因此选项B正确,选项D错误。c语言规定:函数的形参是auto型局部变量,因此选项c错误。

   (40)以下程序的输出结果是______ 。
   f(int b[],int m,int n)
   {jnt i,s=0;
   for(i=m;i<n;i=i+2)s=s+b[i];
   return s;
   )
   main()
   {int x,a[]:{1,2,3,4,5,6,7,8,9};
   x=f(a,3,7);
   printf("%d\n",x);
   )
   A)10      B)18         C)8         D)15
   答案:A
   评析:本题中,主函数调用f函数,在f函数中执行了两次循环,第一次i=3,s=0+b[i]:4,然后i的值被修改成5,仍然满足循环条件,进入第二轮循环,s=4+b[5]=4+6=10,随后,i的值被修改成7,不再满足循环条件,退出循环,返回s的值。所以最后输出结果是10。

   (41)若有以下定义和语句:
   int s[4][5],(*ps)[5];
   ps=s;
   则对s数组元素的正确引用形式是______ 。
   A)ps+l       B)*(ps+3)     C)ps[0][2]    D)*(ps+1)+3
   答案:C
   评析:选项A得到的是s数组第一行的地址,选项B得到的是s数组第三行第零列元素的地址,而选项D得到的是s数组第一行第三列元素的地址。只有选项c正确引用了ps数组第零行第二列的元素。

   (42)以下程序的输出结果是______。
   main()
   {int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;
   for(i=0;i<3;i++)
   fbr(j=I;J<=I;J++)t=t+b[i][b[j][j]];
   printf("%d\n",t);
   }
   A)3       B)4          C)l         D)9
   答案:B
   评析:`两个循环语句嵌套使用,在第一次外循环中,i=0,执行内循环时,将j赋值为i的值O,执行一次t=t+b[i][b[j][j]],得到t=1,退出内循环,接着进入第二次外循环,在第二次外循环结束时t=2,然后执行第三次外循环,得到t=4,退出循环,输出t的值。

   (43)有以下程序:
   #definef (x)X*X
   main()
   {
   int i:
   i=f(4+4)/f(2+2);
   printf("%d\n",i);
   }
   程序运行后的输出结果是______。
   A)28      B)22         C)16        D)4
   答案:A
   评析:主函数中f(4+4)/f(2+2)可按带参宏定义展开为4+4*4+4/2+2*2+2(千万不要随意地添加括号),求得结果为28。

   (44)以下程序的输出结果是______。
   #inclue<stdio.h>
   #inclue<string.h>
   main()
   {char b1[8]="goddwer",b2[8],*pb=bl+3;
   while(--pb>=b1) strcpy(b2,pb);
   print("%dha",strlen(b2));
   )
   A)8      B)3         C)l         D)7
   答案:D
   评析:每次执行循环,都是将pb指针指向的内容复制到b2中,第一次循环中,将b1[2]~b1[7]六个字符复制到b2中,第二次循环,将b[1]~b[7]七个字符复制到b2中,第三次循环,将b1数组的全部内容复制到b2中。而后一次复制会覆盖前面的复制,最后b2的实际长度应该是八,而strlen()函数测出的是一个字符串中"\O"之前的全部字符的个数,所以最后输出的值是70

   (45)在说明语句:int *f();中,标识符f代表的是______。
   A)一个用于指向整型数据的指针变量
   B)一个用于指向一维数组的行指针
   C)一个用于指向函数的指针变量
   D)一个返回值为指针型的函数名
   答案:D
   评析:一个函数在编译时被分配给一个入口地址,这个入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。Int*f()表示f是一个函数,它带回一个指针值,这个指针是指向一个整型数据的。

   (46)下面函数中,可以把整数以二进制形式存放到文件中的函数是______。
   A)fprintf函数  B)fread函数   C)fwrite函数   D)fputc函数
   答案:C
   评析:ANSI c标准提出设置两个函数(fread和fwrite),用来读写一个数据块。它们的一般调用形式为:
   fread(buffer,size,count,fp);
   fwrite(buffer,size,count,fp);
   其中:buffer是一个指针;size是要读写的字节数;count是要进行读写多少个size字节的数据项;
   fb是指文件型指针。如果文件以二进制形式打开,用fread和fwrite函数就可以读写任何类型的信息。

   (47)不合法的main函数命令行参数表示形式是______。
   A)main(int a,char*c[])       B)main(int arc,char **arv)
   C)main(int argc,char *argv)    D)main(int argv,char *arge[])
   答案:C
   评析:本题主要考查了对main函数参数的了解,main函数可以有两个形参,一般形式是:main(int argc,char*argv[]),也就是说,它的第一个形参是一个整型变量,第二个形参是一个指针数组,其元素指向字符型数据。

   (48)以下程序的输出结果是______.
   int x=3;
   main()
   {int i;
   for(i=l;i<x;i++)incre();
   }
   incre()
   { static int x=l;
   X*=x+l:
   printf("%Di",x);
   }
   A)3 3     B)2 2       C)2 6       D)2 5
   答案:C
   评析:incre()中定义一个静态局部变量x,它的作用范围仅限于本函数中,而不会影响main()函数中的x值。

   (49)有以下结构体说明和变量的定义,且如图所示指针p指向变量a,指针q指向变量b。则不能把结点b连接到结点a之后的语句是________。

   struct node
   { char data;
   struct node *next;
   }a,b,*p=&a,*q=&b;
   A)a.next=q; B)p.next=&b;    C)p->next=&b;   D)(*p).next=q;
   答案:B
   评析:由于p是一个指向struct node型的指针变量,要访问该指针变量指向的结构体成员,必须使用->运算符或"(*p).成员"的形式,故选项B是错误的。

   (50)若有以下定义:
   struct link
   { int data;
   struct link*next;
   }a,b,c,*p,*q;
   且变量a和b之间已有如图所示的链表结构:

   指针p指向变量a,q指向变量c。则能够把c插入到a和b之间并形成新的链表的语句组是______。
   A)a.next=c;c.next=b;       B)p.next=q;q.next=p.next;
   C)p->next=&c;q->next=p->next;   D)(*p).next=q;(*q).next=&b;
   答案:D
   评析:本题考的是指针的运用。即先将元素a的指针指向q指针所指向的元素即c,然后将c的指针指向b元素,采取的是直接取元素地址的方式。

二、填空题 (每空2分,共40分)

   请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。

   (1)算法的基本特征是可行性、确定性、 【1】  和拥有足够的情报。
   答案:【1】有穷性
   评析:算法是指解题方案的准确而完整的描述。它有4个基本特征,分别是可行性、确定性、有穷性和拥有足够的情报。

   (2)顺序存储方法是把逻辑上相邻的结点存储在物理位置  【2】  的存储单元中。
   答案:【2】相邻
   评析:常用的存储表示方法有4种,顺序存储、链式存储、索引存储、散列存储。其中,顺序存储方法是把逻辑上相邻的结点存储在物理位置也相邻的存储单元中。

   (3)Jackson结构化程序设计方法是英国的M.Jackson提出的,它是一种面向  【3】  的设计方法。
   答案:【3】数据结构
   评析:结构化分析方法主要包括:面向数据流的结构化分析方法(SA-Structured analysis),面向数据结构的Jackson方法(JSD-Jackson system development method)和面向数据结构的结构化数据系统开发方法(DSSD-Data structured system development method)。

   (4)数据库设计分为以下6个设计阶段:需求分析阶段、 【4】  、逻辑设计阶段、物理  设计阶段、实施阶段、运行和维护阶段。
   答案:【4】概念设计阶段或数据库概念设计阶段
   评析:数据库设计分为以下6个设计阶段:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段、实施阶段及数据库运行和维护阶段。

   (5)数据库保护分为:安全性控制、 【5】  、并发性控制和数据的恢复。
   答案:【5】完全性控制
   评析:考查考生对数据库基本知识的了解。
   安全性控制:防止未经授权的用户有意或无意存取数据库中的数据,以免数据被泄露、更改或破坏;完整性控制:保证数据库中数据及语义的正确性和有效性,防止任何对数据造成错误的操作;并发性控制:正确处理好多用户、多任务环境下的并发操作,防止错误发生;数据的恢复:当数据库被破坏或数据不正确时,使数据库能恢复到正确的状态。

   (6)设有int x=ll;,则表达式(x++ *1/3)的值为 【6】  。
   答案:【6】3
   评析:白增自减运算符的作用是使变量的值增1或减1,如:
   ++i,--i (在使用i之前,先使i的值加(减)1)
   i++,i-- (在使用i之后,使i的值加(减)1)
   所以表达式(x++*1/3)的值即11/3的值:3。

   (7)若从键盘输入58,则以下程序的输出结果是 【7】  。
   main()
   { int a;
   Scanf("%d",&a);
   If(a>50)printf("%d",a);
   If(a>40)printf("%d",a);
   if(a>30)printf("%d",a);
   }
   答案:【7】585858
   评析:本题首先为a输入一个值58,然后执行三个判断语句,在每一个判断中,如果满足判断条件的话,就输出a,因为三次判断,条件都满足,所以三次输出a。

   (8)下列程序运行的结果是 【8】  。
   #include<stdio.h>
   main()
   {
   int x=l,i=l:
   fOr(;x<50;i++)
   {if(x>=10)break;
   if(x%2!=1)
   {x+=3;continue;}
   x-=1;
   }
   printf("x=%d,i=%d\n",x,i);
   }
   答案:【8】x=11,i=11
   评析:本题程序段通过for循环语句实现当x的值为奇数时,x自减1:当x为偶数时自加3的功能。程序共执行了11次循环,当x=11时退出循环。

   (9)以下程序的输出结果是 【9】  。
   main()
   fint a=177;
   printf("%o\n",a);
   }
   答案:【9】261
   评析:本题考点是printf函数的格式字符。"%0"表示以八进制整数形式输出。

   (10)以下程序的输出结果是【10】   。
   main()
   {int a:O;
   a+=(a=8);
   printf("%d\n",a);
   }
   答案:【10】16
   评析:本题主要考的是运算符的优先级。
   A+=(a=8)可以写成a:=a+(a=8)的形式,括号的优先级高于"+",而"+"的优先级又高于"=",所以先执行括号内的运算,将a赋值为8,然后再执行+运算。

   (11)以下定义的结构体类型拟包含两个成员,其中成员变量info用来存放整型数据;成  员变量link是指向自身结构的指针。请将定义补充完整。
   struct node
   {int info;
   【11】  link;
   };
   答案:【11】struct node*
   评析:本题考的是如何定义一个指向结构体变量的指针。
   一个结构体变量指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。

   (12)以下程序的输出结果是 【12】  。
   main()
   {int s,i;
   for(s=O,i=O;i<3;i++,s+=i);
   printf("%d\n",s);
   }
   答案:【12】6
   评析:在逗号表达式内按自左至右顺序求解,因此本题共执行三次循环,具体情形如下:
   第一次当i=O时,执行i++,s+=i,则i=l,s=l:
   第二次当i=l时,执行i++,s+=i,则i=2,s=3;
   第三次当i=2时,执行i++,s+=i,则i=3,s=6。
   当i=3后退出循环。

   (13)以下程序的输出结果是  【13】   。
   main()
   {char *p="abcdefgh",*r;
   1ong *q;
   q=(1ong*)p;
   q++;
   r=(char*)q;
   printf("%s\n",r);
   }
   答案:【13】efgh
   评析:指针变量p,r指向字符型数据,而指针变量q指向长整型数据。首先通过类型转换将指针p的值赋给q,然后执行q自加,因为q是定义为指向长整型数据的变量,而长整型数据一般占4个字节的空间,所以实际上,q的值增加了4,当再将q的值经过强行类型转换赋给r的时候,实际上这时候r是指向了字符e,所以最后打印字符串时,得到的结果是"efgh"。

   (14)以下程序的输出结果是  【14】   。
   main()
   {int x=0;
   sub(&x,8,1);
   printf("%d\n",x);
   }
   sub(int *a,int n,int k、
   {if(k<=n) sub(a,n/2,2*k);
   *a+:k:
   }
   答案:【14】7
   评析:本题是一个递归调用。
   主函数中调用sub函数流程如下:
   sub(*x,8,1)-sub(*x,4,2)-sub(*x,2,4)-x=x+k=4
   ︱        ︱
   x=x+k=7     x=x+k=6

   (15)以下程序可以将从键盘输入的十进制数(1ong型)以二到十六进制数的形式输出,请填空。
   #include<stdio.h>
   main()
   {char b[16]={'O','l','2','3','4','5','6','7','8',
   '9','A','B',C','D','E','F'};
   int c[64],d,i=0,base;
   long n:
   print("Enter a number:\n");scanlf["%1d',&n);
   print("Enter new base:\n");scanf("%ld",&base);
   do
   {
   C[i]=  【15】
   i++;n=n/base;
   }while [n!=0);
   pdntf("'Transmite new base:\n");
   f0"--i;i>=O;--i)
   { d=c[I];
   printf("%c",b  【16】  ;
   }
   }
   答案:【15】n%base
   【16】[d]
   评析:进制转换的除余取整法。在循环中,是先对数n整除以base取余作为转换后的base进制数的第i位存放到数组元素c[i】中,然后对n整除以base的商作同样的操作,直到商为O为止,故第一空为n%base。
   由于存入到数组c中的各个元素为对应数制在十进制上表示的各位的权值,在输出时必须将其转换成对应的字符输出,而在数组b中对应存放了各个数对应的字符,故第二空应填[d]。

   (16)设有如下宏定义
   #define MYSWAP(z,x,y) {z=x;x=f;y=z;}
   以下程序段通过宏调用实现变量a,b内容的交换,请填空。
   float a=5,b=16,c;
   MYSWAPI(  【17】   ,a,b);
   答案:【17】c
   评析:本题最重要的是理解宏MYSWAP(z,x,y)的作用:通过z实现x,y的内容交换。所以MYSWAP(c,a,b)可以通过c实现a,b内容的交换。

   (17)以下程序用来统计文件字符的个数,请填空。
   #include "stdio.h"
   main ()
   {FILE *fp;long num=0;
   if((fp=fopen("fname.dat","r"))==NULl)
   {printf("Open error\n");,exit,(O);}
   while(  【18】  )
   {num++;}
   Printf["num=%ld\n",num];
   Fclose(fp);
   )
   答案:【18】fgetc(fp)!=EOF或!feof(fp)
   评析:本程序考的是龟etc函数。
   此函数的功能是从指针变量印所指向的文件中读入一个字符,如果执行龟etc函数时遇到文件结束符,则函数返回文件结束符EOF。

   (18)以下程序用来输出结构体变量ex所占存储单元的字节数,请填空。
   struct st
   {char *name;double score;};
   main()
   { struct st ex;
   print("ex size:%d\n",sizeof( 【19】  ));
   }
   答案:【19】ex
   评析:sizeof函数计算已知类型所占的字节数。sizeof(ex)即计算结构体变量ex在内存中所占的字节数。

   (19)以下程序中,select函数的功能是:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标,请填空。
   #define  N  3
   #define  M  3
   select(int a[N][M],int *n)
   {int i,j,row=O,colum=O;
   for(i=0;i<N;i++)
   for(j=0;j<M;j++)
   if(a[i][j]>a[row][colum]){row=i;colum=j;}
   *n=row;
   retum( 【20】   );
   }
   main()
   {int a[N][M]={9,11,23,6,l,15,9,17,20),max,n;
   max=select(a,&n);
   printf("max=%d,line=%d\n",max,n);
   }
   答案:【20】a[row][colum]
   评析:本题通过判断语句,将较大值的行下标赋给row,列下标赋给colum,循环结束后,a[row][colum]中是数组元素的最大值,所以应该把它的行下标赋给*n,将a[row][colum]的值返回。

 
 
   
版权所有:西北师范大学数学与信息科学学院