国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1(共186题)_第1页
国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1(共186题)_第2页
国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1(共186题)_第3页
国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1(共186题)_第4页
国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1(共186题)_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷1(共5套)(共186题)国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷第1套一、选择题(本题共42题,每题1.0分,共42分。)1、以下叙述中错误的是A、可以用typedef将已存在的类型用一个新的名字来代表B、可以通过typedef增加新的类型C、用typedef定义新的类型名后,原有类型名仍有效D、用typedef可以为各种类型起别名,但不能为变量起别名标准答案:B知识点解析:C语言允许用typedef说明一种新类型名,说明新类型名的语句一般形式为:typedef类型名标识符;在此,“类型名”必须是在此语句之前己有定义的类型标识符。“标误符”是一个用户定义标识符,用作新的类型名。typedef’语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。2、以下结构体类型说明和变量定义中正确的是A、typedefstruct{intn;charc;}REC;RECtl,t2;B、structREC;{intn;charc;);RECt1,t2;C、typedefstructREC;{intn=0;charc=’A’;}tl,t2;D、struct{intn;charc;}REC;RECtl,t2;标准答案:A知识点解析:定义结构体类型的一般形式为:struct结构体名{成员列表};struct结构体名后不能加“:”号,所以选项B、C错误,选项D中定义无名称的结构体类型同时定义结构体变量形式应为structt1,t2:选项A为用户自定义类型,其为正确的定义形式。3、若有定义typedefint*T;Ta[10];则a的定义与下面哪个语句等价A、int*a[10];B、int(*a)[10];C、int*a;D、inta[10];标准答案:A知识点解析:typedef的主要功能是为存在的类型命名,后面的代码中可以利用该新定义的类型名定义变量,题目中定义了整型指针类型T,而后利用T定义了整型指针数组a,含有10个元素,选项A中定义了整型指针数组a,选项B定义了一个指向一维数组的指针a,选项C定义指针变量,而选项D为定义整型数组最常用的形式,数组a中可以存放10个数据元素。4、下结构体说明和变量定义中,正确的是A、typedefstructabc{intn;doublem;}abc;abcx,y;B、structabc{intn;doublem);structabcx,y;C、structabc{intn;doublem;}structabcx,y;D、structabc{intn;doublem;};abcx,y;标准答案:A知识点解析:选项B中结构体定义中每个成员后面的分号都不能省略,doublem后没分号,因此错误。选项C结构体类型定义完毕后,}外没加分号。选项D中定义变量要加上关键字struct。5、以下叙述中错误的是A、typedef的作用是用一个新的标识符来代表已存在的类型名B、typedef说明的新类型名必须使用大写字*,否则会出编译错误C、可以用typedef说明的新类型名来定义变量D、用typedef可以说明一种新的类型名标准答案:B知识点解析:typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原来类型名依然有效。为了便于识别,一般习惯将新的类型名用人写字*表示。6、下面结构体的定义语句中,错误的是A、structord{intx;inty;intz;);structorda;B、structord{intx;inty;intz;}structorda;C、structord{intx;inty;intz;)a;D、struct{intx;inty;intz;}a;标准答案:B知识点解析:在选项B中,由于在定义完结构体后缺少分号“;”,所以这是一条不完整的语句,因而是错误的。7、有以下程序structS{inta,b;}data[2]={10,100,20,200};main(){structSp=data[1];printf(”%dkn”,++(p.a));}程序运行后的输出结果是A、11B、20C、21D、10标准答案:C知识点解析:在题目中定义了结构体s类型的数组变量data,并对其赋初值。在程序中定义了指向结构体s类型的变量p,并把数组data的第二个元素data[1]的值赋给它,所以此时成员变量p.a的值等于20,在输出时分别加1,所以输入结果为选项A。8、有以下程序structS{intn;inta[20];);voidf(structS*p){inti,j,t;for(i=0;i<p->n-1;i++)for(j=i+1.j<p->n.j++)if(p->a[i]>p->a[j]){t=P->a[i];p->a[i]=p->a[j];p->a[j]=t;}}main(){inti;structSs={10,{2,3,l,6,8,7,5,4,10,9));f(&s);for(i=0;i<s-n;i++)printf(’’%d,’’,s.a[i]);}A、10,9,8,7,6,5,4,3,2,1,B、2,3,1,6,8,7,5,4,10,9,C、10,9,8,7,6,1,2,3,4,5,D、l,2,3,4,5,6,7,8,9,10标准答案:D知识点解析:voidf(structS*p)函数的功能使用了结构体指针变量实现对一维数组的元素从小到火排序。用关系表达式p->a[i]>p->a[j]实现一维数组中相邻元素两两比较,大的元素向后移,小的元素向前移。在主函数中语句f(&s);的功能实现对结构体变量s中一维数组的元素从小到大的排序,所以循环语句的输出结果为1,2,3,4,5,6,7,8,9,10。9、程序中已构成如下图所示的不带头结点的单向链表结构,指针变量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、删除尾结点标准答案:B知识点解析:分析程序可知,程序段首先让q指向链表的首结点,s指向链表的第二结点,p此时指向链表的第二个结点。然后在while循环中,当p的后继结点非空时,让p指向链表的最后一个结点,退出循环。然后让尾结点指向首结点,并使首结点的后继结点为NULL。所以最终实现链表的首结点成为尾结点。10、若有以下语句typedefstructS{intg;charh;}T;以下叙述中正确的是A、可用S定义结构体变量B、S是struct类型的变量C、T是structS类型的变量D、可用T定义结构体变量标准答案:D知识点解析:本题考查typedef,T是structS的新名称,因此可用T定义结构体变量,但是T并不是变量,只是scructS的新名称。11、设有以下语句typedefstructTT{charc;inta[4];}CIN;则下面叙述中正确的是A、TT是struct类型的变量B、可以用TT定义结构体变量C、CIN是structTT类型的变量D、可以用CIN定义结构体变量标准答案:D知识点解析:C语言允许用typedef说明一种新的类型名,说明新类型名的语句为一般形式为:typedef类型名标识符在此,“类型名”必须是此语句之前已有定义的类型标识符。“标识符”是一个用户定义标识符,用作新的类型名。typedef语句的作用仪仪是用“标识符”来代表已存在的“类型名”,并朱产生新的数据类型,原有类型名依然有效。存本题中用typedef定义CIN为TT的一种新的类型名,因而可以用它定义一个结构体变量。12、有以下程序段structst{intx;int*y;)*pt;inta[]={1,2),b[]={3,4);structstc[2]={10,a,20,b);pt=c;以下选项中表达式的值为11的是A、pt->xB、*pt->yC、++pt->xD、(pt++)->x标准答案:C知识点解析:由题目的已知条件可知,pt指向结构体数组c[2]的第一元素c[0],所以pt->x=10,执行白加运算后为11。13、有下列程序:#include<stdio.h>#include<string.h>typedefstruct{charname[9];charsex;floatscore[2];}STU;STUf(STUa){STUb={’’Zhao’’,’m’,85.0,90.0);inti;strcpy(a.name,b.name);a.sex=b.sex;for(i=0;i<2;i++)a.score[i]=b.score[i];returna;}main(){STUc={“Qian’’,’f,95.0,92.0},d;d=f(c);printf(”%s,%c,%2.0f,%2.0fW’,d.neme,d.sex,d.score[0],d.score[1]);}程序的运行结果是A、Qian,m,85,90B、Zhao,f,95,92C、Zhao,m,85,90D、Qian,f,95,92标准答案:D知识点解析:f()函数的功能是对形参a的各个成员用结构体变量b的各个成员进行赋值后,然后返回变量a。在主函数中调用f(C函数时,将sTu类型的结构体变量c的值传递给形参a,函数f()在对a的各个成员进行重新赋值后,再将返回变量a的值传给d,最后输出结构变量d的各个成员的值。14、有以下程序#include<stdio.h>#include<string_h>structA{inta;charb[10];doublec;);voidf(structAt);main(){structAa={1001,’’ZhangDa”,1098.0};f(a);printf(”%d,%s,%6.1f\n”,a.a,a.b,a.c);}voidf(structAt){t.a=1002;strcpy(t_b,”ChangRong”);t.c=1202.0;}程序运行后的输出结果是A、1002,ChangRong,1202.0B、1001,ChangRong,1098.0C、1001,ZhangDa,1098.0D、1002,ZhangDa,1202.0标准答案:C知识点解析:本题主要考查是的函数调用时参数之间的传递问题。在C语言中参数之间的传递是传值,也就是把实参的值复制一份传递给形参,而实参的值不发生变化。所以对于本题来说,在主函数中执行f(a),把结构体变量a的值复制一份传递给形参变量t,而实参变量a的值保持不变。15、有以下程序#include<stdio.h>structtt{intx;structtt*y;)*p;structtta[4]={20,a+l,15,a+2,30,a+3,17,a};main(){inti;p=a;for(i=l;i<=2;i++){printf(’’%d,”,p->x);p=p>y;)}程序的运行结果是A、20,15,B、30,17C、15,30,D、20,30标准答案:A知识点解析:程序定义了结构体类型tt,其成员包括一个整型数据x和指向其自身结构的指针变量v。程序在定义结构体数组a的同时对其进行了初始化。其元素a[0]的成员y被赋值为元素a[1]的地址,a[1].y被赋值为a[2]的地址,a[2].y被赋予a[3]的地址,a[3].y被赋予a[0]的地址。这就形成了一个单向的循环链表,每个元素的指针成员都指向下一个元素的地址。在主函数L11,通过一个for循环语句,输出该链表前2个节点数值成员的值,即a[0].x和a[1].x。16、设有定义:struct{charmark[12];intnuml;doublenum2;}tl,t2;若变量均已正确赋初值,则以下语句中错误的是A、t2.numl=t1.numl:B、t2.mark=t1.mark;C、tl=t2;D、t2.num2=t1.num2;标准答案:B知识点解析:这个题目主要涉及到结构体的定义与赋值操作。根据题意结构体变量t1,t2的成员变量mark是字符数组,对于字符数组之间的赋值操作应该使用循环语句对每个字符进行赋值,而选项A是用数组名实现字符数组之间的赋值操作,是错误的。17、若有以下程序structstu{char*name,gender;intscore;);main(){structstua={NULL,’m’,290},b;a.name=(char*)malloc(10);strcpy(a.name,’’Zhao’’);b=a;b.gender=’f;b.score=350;strcpy(b.name,“Qian”);printf(”%s,%c,%d,”,a.name,a.gender,a.score);printf(”%s,%c,%d\n”,b.name,b.gender,b.score);)则程序的输出结果是A、Zhao,m,290,Qian,f,350B、Qian,f,350,Qian,f,350C、Zhao,m,290,Zhao,f,350D、Qian,m,290,Qian,f,350标准答案:D知识点解析:主函数中定义结构体类型stmctstu,有三个成员,第一个成员为字符指针变量。主函数中为stu类型变量a赋值,首先为a_name成员分配存储空间,存入数据。b=a;语句执行完毕以后,a和b的各个成员值相同,需要注意的是b.name和a.name成员都保存了同一段内存的地址,因此当为变量b赋值的时候,同样更改了a的name成员,而其他成员由于有单独的存储空间而不会发生改变。18、若有以下程序typedefstructstu{charname[10],gender;intscore;)STU;voidf(STUa,STUb){b=a:printf(”%s,%c,%d,”,b.name,b.gender,b.score);}main(){STUa={’’Zhao’’,’m’,290},b={’’Qian’’,’f’,350};f(a,b);printf(”%s,%c,%dha”,b.name,b.gender,b.score);}则程序的输出结果是A、Zhao,m,290,Zhao,m,290B、Zhao,m,290,Qian,f,350C、Qian,f,350,Qian,f,350D、Zhao,m,290,Zhao,f,350标准答案:B知识点解析:函数f(STua,sTub)的主要功能是为把结构体变量a的值存放到b中,然后输出b中各个成员的值。主函数中调用函数f(a,b),输出赋值以后b的数据,实际为a{’’zhao’’,’m’,290}的数据,函数调用结束,形参a和b撤销,流程到主函数输出b{’’Qian’’,’f,350}的数据。19、为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是指向结点的指针域),则在【】处应填入的选项是Structlink{chardata;【】}node;A、structlink*next;B、linknext;C、link*next;D、structlinknext;标准答案:A知识点解析:单链表为动态分配的存储空间,在分配时,每个结点之间可以是不连续的(结点内是连续的)。结点之间的联系用指针实现,即在结点结构叶1定义一个成员项目来存放下。结点的首地址,这个用于存放地址的成员,常把它称为指针域,该指针为了保持链表中结点的地址,因此其基类型和结点的类型相同,选项为A。20、以下叙述中正确的是A、结构体类型中的成分只能是C语言中预先定义的基本数据类型B、在定义结构体类型时,编译程序就为它分配了内存空间C、结构体类型中各个成分的类型必须是一致的D、一个结构体类型可以由多个称为成员(或域)的成分组成标准答案:D知识点解析:结构体类型,它是由若干”成员”组成,每一个成员可以是一个基本数据类型或者是一个构造类型。在说明和使用之前必须先定义它,也就是构造它。定义一个结构的一般形式为:straact结构名{成员列表};成员列表由若T个成员组成,对每个成员也必须作类型说明,其形式为:类犁说明符成员名:可以说明类型不同的各个成员。21、以下叙述中正确的是A、函数的返回值不能是结构体类型B、函数的返回值不能是结构体指针类型C、在调用函数时,可以将结构体变量作为实参传给函数D、结构体数组不能作为参数传给函数标准答案:C知识点解析:和普通变量相似,结构体变量也可以作为函数实参或者形参,函数的返同值也可以是结构体类型。22、设有如下的说明和定义struct{inta;char*s;)x,*p=&x;x.a=4;x.S=’’hello’’;则以下叙述中正确的是A、语句++p->a;的效果是使P增1B、(p++)->a与p++->a都是合语法的表达式,但二者不等价C、语句*p->s++;等价于(*p)->s++;D、语句++p->a;的效果是使成员a增1标准答案:D知识点解析:p->a得到p指向的结构体变量中的成员a的值。p->a++得到p指向的结构体变量中的成员a的值,用完该值后使p-a加1。++p->a得到p指向的结构体变量中的成员a的值使之加1(先加)。由此可见指向运算符->优先级高于++,因此*p->s++相当于*(p->s)++,结合性自右至左,因此p++->a。和(p++)->a等价。23、若已建立以下链表结构,指针P、S分别指向如图所示结点则不能将S所指节点插入到链表末尾的语句组是A、S->next=’\0’;p:P->next;P->next=s;B、p=p->next;S->next=p;p->next=s;C、p=P->next;S->next=p->next;P->next=s;D、p:(*p).next;(*S).next=(*p).next;(*p).next=s;标准答案:B知识点解析:选项A中首先p后移,s的后继指针指向p,p的后继指向s,在s和最后结点之间形成了圆圈,无法完成题中的操作。24、以下叙述中错误的是A、函数的返回值类型不能是结构体类型,只能是简单类型B、只要类型相同,结构体变量之间可以整体赋值C、可以通过指针变量来访问结构体变量的任何成员D、函数可以返回指向结构体变量的指针标准答案:A知识点解析:函数的返回值类型可以是结构体类型。结构体变量之间可以相互复制。25、有以下程序main(){unsignedchara=8,c;C=a>>3:printf(”%dkn”,c);}程序运行后的输出结果是A、16B、32C、1D、0标准答案:C知识点解析:在程序中对无符号字符变量a的值执行右移3位运算后,相当于a/8,其值等于1,再赋绐变量c。26、下面选项中关于位运算的叙述正确的是A、位运算符都需要两个操作数B、左移运算的结果总是原操作数据2倍C、右移运算时,高位总是补0D、位运算的对象只能是整型或字符型数据标准答案:D知识点解析:位运算则是以位(bit)一级进行的运算,位运算符中除”~”以外,均为二元运算符,即要求两侧各有一个运算量,运算量只能是整型或字符型的数据,不能为实型数据。其中右移时,右端(低位)移出的二进制数舍弃,左端(高位)移入的二进制数分两种情况:对于无符号整数和正整数,高位补0;对于负整数,高位补1。而左移运算在没有溢出的前提下每移动~位,相当于原数据的2倍。27、若有以下程序段intr=8;printf(’’%d\n’’,r>>1);输出结果是A、8B、4C、16D、2标准答案:B知识点解析:定义了整型变量r,其值等于8,在输出语句中,把变量r的值向右移动一位,在C语言中把变量向右移动一位,相当于其值除以2,所以在题中把变量r的值8除2,得到其值等于4。28、有以下程序#include<stdio.h>main(){inta=2,b;b=a<<2;printf(”%d\n”,b);}A、4B、6C、8D、2标准答案:C知识点解析:表达式a<<2,把a向左移动2位,相当于扩大4倍。29、有以下程序#include<stdio.h>main(){inta=5,b=1,t;t=(a<<2)Ib;printf(’’%d\n’’,t);}A、11B、6C、21D、1标准答案:C知识点解析:本题考查位操作运算符。‘<<’是左移运算符,左移一位相当于乘2,‘|’是按位或运算符。5左移两位相当于乘4,得到20,20的二进制数是00010100,和00000001进行按位或操作得到00010101,即十进制的21。30、若有以下程序main(){intc;c=10^5;printf(’’%dkn’’,c);)则程序的输出结果是A、15B、10000C、5D、105标准答案:A知识点解析:按位异或(^)的运算规则是:参与运算的两个运算数中相对应的二进制位上,若数相同,则该位的结果为0;若数不同,该位的结果为1。整数10和5的二进制编码分别为1010和0101,异或结果为1111,其十进制数据位15。31、有以下程序main(){inti=0;i=-i;printf(’’%d\n’’,i);)程序运行后的输出结果是A、0B、1C、8D、0.1标准答案:D知识点解析:运算符(~)是位运算符中唯一的一个单目运算符,运算对象应置于运算符的右边,其运算功能是把运算对象的内容按位取反(使每一位上的0变1,1变0)。i的初值为0,二进制位00000000,因此取反后结果为11111111,最高位为符号位,为-1的补码形式,因此输出结果为-1。32、下面关于位运算符的叙述,正确的是A、#}表示’’按位异或’’的运算B、Il表示’’按位或’’的运算C、~表示’’按位异或’’的运算D、&表示’’按位与’’的运算标准答案:D知识点解析:C语言提供了6种位运算符,各种位运算符的含义见下表:各种位运算符及其含义33、以下叙述中正确的是A、打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖B、在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第1个数据C、C语言中的文件是流式文件,因此只能顺序存取数据D、当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失标准答案:D知识点解析:在C语言中,有两种对文件的存取方式:顺序存取和直接存取;如果以”a”的方式对一个已打开的文件进行写操作后,则原有文件中内容将保存,新的数据写在原有内容之后。如果以”a+”的方式为读和写而打开一个文件,则既可以对文件进行读,也可以对文件进行写,而且,在读和写操作之间不必关闭文件,可以从头开始读。当对文件的读(写)操作完成之后,必须将它关闭。34、下面选项中关于’’文件指针’’概念的叙述正确的是A、文件指针就是文件位置指针,表示当前读写数据的位置B、文件指针指向文件在计算机中的存储位置C、文件指针是程序中用FILE定义的指针变量D、把文件指针传给fscanf函数,就可以向文本文件中写入任意的字符标准答案:C知识点解析:文件指针实际上是指向一个结构体类型的指针,这个结构体中包含如缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是”读”或”写”、是否出错、是否已经遇到文件结束标志等信息。一般称文件指针结构体类型名为FILE,可以用此类型名来定义文件指针。【格式】FILE*指针变量名【说明】FILE是一个存储文件信息的结构体类型的变量。注意不要和文件位置指针混淆,在文件内部有一个位置指针,用以指示文件内部的当前读写位置。使用fgetc函数,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。而文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。fscanf函数可以向文本文件和二进制文件输入数据。35、设文件指针fp已定义,执行语句fp=fopen(’’file’’,’’w’’);后,以下针对文本文件file操作叙述的选项中正确的是A、写操作结束后可以从头开始读B、可以在原有内容后追加写C、可以随意读和写D、只能写不能读标准答案:D知识点解析:在题目中函数fopen以”只写”方式打开文件fiIe。36、有以下程序#include<stdio.h>main(){FILE*fp;inti,a[6]={1,2,3,4,5,6};fp=fopen(’’d2.dat’’,’’w+’’);for(i=0;i<6;i++)fprintf(fp,’’%d\n”,a[i]);rewind(fp);for(i=0;i<6;i++)fscanf(fp,’’%d”,&a[5-i]);fclose(fp);for(i=0;i<6;i++)printf(”%d”,a[i]);}A、1,2,3,4,5,6B、6,5,4,3,2,1,C、4,5,6,1,2,3,D、1,2,3,3,2,1标准答案:B知识点解析:在程序中定义了一个整型数组a[6],并对它赋初值,并以写入的方式打开了文件d2.dat=然后利用一个for循环把数组a中的元素数据写入文件d2.dat中,调用函数rewind把将文件内部的位置指针。重新指向一个文件的开头,再利用for循环语句把文件中的数据依次写入到倒序排列的数组a中,最后输出数组a中的数组元素。37、读取二进制文件的函数调用形式为:fread(buffer,size,count,fp);其中buffer代表的是A、一个整型变量,代表待读取的数据的字节数B、一个内存块的首地址,代表读入数据存放的地址C、一个文件指针,指向待读取的文件D、一个内存块的字节数标准答案:B知识点解析:buffer是数据块的指针,对fread来说,它是内存块的首地址,输入的数据存入此内存块中;38、以下叙述中错误的是A、gets函数用于从终端读入字符串B、getchar函数用于从磁盘文件读入字符C、fputs函数用于把字符串输出到文件D、fwrite函数用于以二进制形式输出数据到文件标准答案:B知识点解析:本题考查的是输入输出函数的使用,gets和getchar函数用于从标准输入设备终端读入字符串和字符,并非从磁盘文件读入,fputs用于把字符串输出到文件,fwrite用于以二进制形式输出数据到文件。39、有下列程序:#include<stdio.h>main(){FILE*fp;intk,n,a[6]={1,2,3,4,5,6);rp=fopen(’’d2.dat’’,’’w’’);fprintf(fp,’’%d%d%d\n’’,a[0],a[1],a[2]);fprintf(fp,’’%d%d%d\n’’,a[3],a[4],a[5]);fclose(fp);fp=fopen(’’d2.dat’’,’’r’’);fscanf(fp,’’%d%d’’,&k,&n);printf(’’%d%d\n’’,k,n);fclose(fp);}程序运行后的输出结果是A、14B、123456C、1234D、12标准答案:B知识点解析:用文件函数fopen打开d2.dat文件并把数组a[6]中的元素分两行写入到d2.dat文件中,关闭文件。然后再次打开文件d2.dat,用。fscanff)函数读取文件d2.dat中的数据,因为每行没有分隔符,所以每一行会被认为是一个完整的数,并存入到变量k和n中,输出变量k和n的值为123456。40、设fp为指向某二进制文件的指针,且已读到此文件末尾,则函数feof(fp)的返回值为A、\0tB、0C、NULLD、非0值标准答案:D知识点解析:ANSIC提供的feof。函数的功能是判断fp所指的文件的位置是否已达到文件尾,如果达到文件尾,则feof函数的值为1,否则为0,表示文件尚未结束。41、以下程序依次把从终端输入的字符存放到fSc件中,用#作为结束输入的标志,则在横线处应填入的选项是#include<stdio.h>main(){FILE*fp;charch;fp=fopen(’’fname’’,’’w’’);while((ch=getchar0)!=’#’)fputc(________);fclose(fp);}A、fp.chB、chC、ch,’’fname’’D、ch,fp标准答案:D知识点解析:fputc(。)是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。使用格式为fputc(ch,fp);其中ch是待输出的某个字符,它可以足一个字符常量,也可以是一个字符变量;fp是文件指针。fputc(ch,fip)的功能是将字符ch写到文件指针fp所指的文件中。如果输出成功,fputc函数返回所输出的字符:如果输出失败,则返回一个EOF值。EOF是在stdio.h库函数文件中定义的符号常量,其值等于-1。42、下面关于’’EOF’’的叙述,正确的是A、EOF的值等于0B、文本文件和二进制文件都可以用EOF作为文件结束标志C、EOF是在库函数文件中定义的符号常量D、对于文本文件,fgetc函数读入最后一个字符时,返回值是EOF标准答案:C知识点解析:EOF是在stdio_h库函数文件中定义的符号常量,其值等于-1。EOF用作文件结束标志,在二进制或者文本文件内部有一个位置指针,用以指示文件内部的当前读写位置。使用fgetc函数,每读写一次,该指针均向后移动,国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷第2套一、选择题(本题共39题,每题1.0分,共39分。)1、以下叙述中错误的是A、可以用typedef将已存在的类型用一个新的名字来代表B、可以通过typedef增加新的类型C、用typedef定义新的类型名后,原有类型名仍有效D、用typedef可以为各种类型起别名,但不能为变量起别名标准答案:B知识点解析:C语言允许用typedef说明一种新类型名,说明新类型名的语句一般形式为:typedef类型名标识符;在此,“类型名”必须是在此语句之前已有定义的类型标识符。“标误符”是一个用户定义标识符,用作新的类型名。typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。2、以下结构体类型说明和变量定义中正确的是A、typedefstruct{intn;charc;)REC;RECt1,t2;B、structREC;{intn;charc;);RECt1,t2;C、typedefstructREC;{intn=0;charc=’A’;)t1,t2;D、struct{intn;charc;)REC;RECt1,t2;标准答案:A知识点解析:定义结构体类型的一般形式为:struct结构体名f成员列表,:struct结构体名后不能加“;”号,所以选项B)、C)错误,选项D)中定义无名称的结构体类型同时定义结构体变量形式应为structt1,t2;选项A)为用户自定义类型,其为正确的定义形式。3、若有定义typedefint*T;Ta[10];则a的定义与下面哪个语句等价A、int*a[10];B、int(*a)[10];C、int*a;D、inta[10];标准答案:A知识点解析:typedef的主要功能是为存在的类型命名,后面的代码中可以利用该新定义的类型名定义变量,题目中定义了整型指针类型T,而后利用T定义了整型指针数组a,含有10个元素,选项A)中定义了整型指针数组a,选项B)定义了一个指向一维数组的指针a,选项C)定义指针变量,而选项D)为定义整型数组最常用的形式,数组a中可以存放10个数据元素。4、以下结构体说明和变量定义中,正确的是A、typedefstructabc{intn;doublem;)ABC;ABCx,y;B、structabc{intn;doublem);structabcx,y;C、structABC{intn;doublem;)structABCx,y;D、structabc{intn;doublem;);abcx,y;标准答案:A知识点解析:选项B)中结构体定义中每个成员后面的分号都不能省略,doublem后没分号,因此错误。选项C)结构体类型定义完毕后,}外没加分号。选项D)中定义变量要加上关键字struct。5、以下叙述中错误的是A、typedef的作用是用一个新的标识符来代表已存在的类型名B、typedef说明的新类型名必须使用大写字母,否则会出编译错误C、可以用typedef说明的新类型名来定义变量D、用typedef可以说明一种新的类型名标准答案:B知识点解析:typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原来类型名依然有效。为了便于识别,一般习惯将新的类型名用大写字母表示。6、有以下程序#includetypedefstruct{intb,p;)A;voidf(Ac)/*注意:c是结构变量名*/{intj;c.b+=1;c.p+=2;}main(){i;Aa={1,2);f(a);printf("%d,%d\n",a.b,a.p);)程序运行后的输出结果是A、2,4B、1,2C、1,4D、2,3标准答案:B知识点解析:在C语言中,数据只能从实参单向传递给形参,称为“按值”传递。也就是说,当简单变量作为实参时,用户不可能在函数中改变对应实参的值。所以本题中在main()函数坟a)语句中结构体实参a作为值,传递给函数f(Ac)中的形参c;这种值传递的方式不会对实参a产生任何影响,所以结构体实参a的值不会发生变化。7、设有定义:structcomplex{intreal,unreal;)datal={1,8),data2;则以下赋值语句中错误的是A、data2=(2,6);B、data2=datal;C、data2.real=data1.real;D、data2.real=data1.unreal;标准答案:A知识点解析:本题主要考查结构体变量的定义与初始化。题目中定义了complex类型的结构体变量data1和data2,并对data1进行了初始化。可以用一个结构体变量对另一个结构体变量赋值,用一个结构体变量的成员对另一个结构体变量的成员赋值。8、有以下程序#include#includetypedefstruct{charname[9];charsex;intscore[2];}STU;STUf(STUa){STUb={"Zhao",’m’,85,90};inti;strcpy(a.name,b.name);a.sex=b.sex;for(i=0;i<2;i++)a.score[i]=b.score[i];retuma;}main(){STUc={"Qian",’f’,95,92),d;d=f(c);printf("%s,%c,%d,%d,",d.name,d.sex,d.score[0],d.score[1]);printf("%s,%c,%d,%d,",c.name,c.sex,c.score[0],c.score[1]);}A、Zhao,m,85,90,Zhao,m,85,90B、Qian,f,95,92,Qian,f,95,92C、Zhao,m,85,90,Qian,f,95,92D、Qian,f,95,92,Zhao,m,85,90标准答案:C知识点解析:在C语言中,函数实参与形参之间数据的传递是传值,也就是说在用实参调用形参时,是把实参的值拷贝一份给形参,而实参的值并不变化,仍是原来的值。所以对于本题来说,在主函数中调f(e)后,实参e的值并不会变化,仍是原值。在函数f中把局部变量b的值依次返回给变量d。9、有以下结构体说明、变量定义和赋值语句structSTD{charname[10];intage;charsex;}s[5],*ps;ps=&s[0];则以下scanf函数调用语句有错误的是A、scanf("%d",&s[0].age);B、scanf("%c",&(ps->sex));C、scanf("%s",s[0].name);D、scanf("%d"ps->age);标准答案:D知识点解析:程序段定义了结构体变量数组s[5]和指针变量ps,然后ps指向数组s[5]中的第一个元素,因而ps->age引用s[0].age。因为在输入scanf()函数中,第2个参数应该表示为地址变量,而选项A)表示的值,而不是一个地址值。10、有以下程序,#include<stdio.h>#include<string.h>StmctA{inta;charb[10];doublec;};structAf(structAt);main(){structAa={1001,"ZhangDa",1098.0);a=f(a);printf("%d,%s,%6.1f\n",a.a,a.b,a.c);}structAf(StructAt){t.a=1002;strcpy(t.b,"ChangRong");t.c=1202.0;returnt;}程序运行后的输出结果是A、1002,ZhangDa,1202.0B、1002,ChangRong,1202.0C、1001,ChangRong,1098.0D、1001,ZhangDa,1098.0标准答案:B知识点解析:在主函数中定义结构体A的变量a,并对其赋初值,再调用函数f(a),在函数f(a)中对结构体变量a的各个成员重新进行了赋值操作,并把其值返回在屏幕上输出。11、有以下程序#includestructord{intx,y;)dt[2]={1,2,3,4);main(){structord*p=dt;printf("%d,",++(p->x));printf("%d\n",++(p->y));}程序运行后的输出结果是A、4,1B、2,3C、3,4D、1,2标准答案:B知识点解析:在题目中定义了结构体ord类型的数组变量dt,并对其赋初值。在程序中定义了指向结构体ord类型的指针变量p,并且它指向变量数组dt的第一个元素dt[0],所以此时成员变量p->x的值等于1,成员变量p->y的值等于2,在输出时分别加1,所以输出结果为选项B)。12、有下列程序:structS{intn;inta[20];};voidflint*a,intn){inti;for(i=0;i<n-1;i++)a[i]+=i;}main(){inti;structSs={10,{2,3,1,6,8,7,5,4,10,9));f(s.a,s.n);for(i=0;i<s.n;i++)printf("%d,",s.a[i]);}程序运行后的输出结果是A、3,4,2,7,9,8,6,5,11,10,B、2,3,1,6,8,7,5,4,10,9,C、2,4,3,9,12,12,11,11,18,9,D、1,2,3,6,8,7,5,4,10,9,标准答案:C知识点解析:voidf(int*a,intn)函数的功能是对数组a[]的每一个元素加上其下标的值。所以在main()函数中f(s.a,s.n)语句会调用f(int*a,intn)函数,此时指针a指向数组s.a={2,3,1,6,8,7,5,4,10,9),n=10;然后执行for(i=0;i<n-1;i++)a[i]+=i;语句,也就是从0开始到8对数组s.a={2,3,1,6,8,7,5,4,10,9)中的每一个元素加上其下标值。13、假定已建立以下链表结构,且指针p和q已指向如图所示的节点:则以下选项中可将q所指节点从链表中删除并释放该节点的语句组是A、p=q->next;free(q);B、p=q;free(q);C、(*p).next=(*q).next;free(p);D、p->next=q->next;free(q);标准答案:D知识点解析:本题考查了在线性链表删除一个节点的方法,要删除q所指向的节点,只需要把q所指向的节点的前一个节点中的后继指针指向q所指向的节点的下一个节点即可,即p->next=q->next。再释放q所指向的节点,即f-ree(q)。14、有以下定义和语句:structworkers{intnum;charname[20];charc;struct{intday;intmonth;intyear;)s;);structworkersw,*pw;pw=&w:能给w中year成员赋1980的语句是A、w.year=1980;B、pw->year=1980;C、w.s.year=1980;D、*pw.year=1980;标准答案:C知识点解析:本题主要考查的是结构体变量的嵌套定义,也就是说一个结构体变量也可以是一个结构体。在本题中works这个结构体中包含了结构体s。所以对结构体变量w中year成员的引用是w.s.year。15、有以下程序#include#include"string.h"typedefstruct{charname[9];charsex;floatscore[2];}STU;voidf(STUa){STUb={"Zhao",’m’,85.0,90.0);inti;strcpy(a.name,b.name);a.sex=b.sex;for(i=0;i<2;i++)a.score[i]=b.score[i];}程序的运行结果是A、Qian,m,85,90B、Zhao,m,85,90C、Zhao,f,95,92D、Qian,f,95,92标准答案:B知识点解析:本题考查在结构体中函数的实参和形参的传递,调用f(c)后,实参传向形参,进行f()函数功能的实现,但程序中没有返回语句,故形参不能将值传回实参,它们值的传递具有不可逆性,所与printf输出的还是c中实参的值。16、有以下程序structAfinta;charb[10];doublec;};voidf(structAt);main(){structAa={1001,"ZhangDa",1098.0};f(a);printf("%d,%s,%6.1f\n",a.a,a.b,a.c);}voidffstructAt){t.a=1002;strcpy(t.b,"ChangRong");t.c=1202.0;}程序运行后的输出结果是A、1002,ChangRong,1202.0B、1001,ZhangDa,1098.0C、1001,ChangRong,1098.0D、1002,ZhangDa,1202.0标准答案:B知识点解析:在主函数中定义结构体A的变量a,并对其赋初值,再调用函数f(a),形参t接收实参的数据,在函数f(t)中对结构体变量t的各个成员进行了赋值操作,需要注意的,形参和实参之间是数据传递,因此对形参的操作对实参不产生影响,因此在主函数输出仍然输出变量a的数据17、若有以下程序typedefstructstu{char*name,gender;intscore;}STU;voidf(char*p){p=(char*)malloc(10);strcpy(p,"Qian");}main(){STUa={NULL,’m’,290},b;a.name=(char*)malloc(10);strcpy(a.name,"Zhao");b=a;f(b.name);b.gender=’f:b.score=350;printf("%s,%c,%(1,",a.name,a.gender,a.score);printf("%s,%c,%d\n",b.name,b.gender,b.score);}则程序的输出结果是A、Zhao,m,290,Qian,f,350B、Qian,C350,Qian,f,350C、Qian,m,290,Qian,f,350D、Zhao,m,290,Zhao,f,350标准答案:D知识点解析:函数f(char*p)的主要功能申请字符串的存储空间,然后存入字符串"Qian",但当程序调用结束以后,形参指针变量p撤销,存储的字符串地址丢失,而不能更改实参指针的值。主函数中结构体变量定义同时赋初值,初始情况其name指针成员存储空,而后语句为其分配存储空间,存入字符串"Zhao"。执行b=a;语句后,b的数据和a的数据相同,调用函数f以后,b的name成员的值没变。18、若有以下程序typedefstructstu{charname[10],gender;intscore;}STU;voidf(char*P){strcpy(p,"Qian");}main(){STUa={"Zhao",’m’,290},b;b=a;f(b.name);b.gender=’f:b.score=350;printf("%s,%c,%d,",a.name,a.gender,a.score);printf("%s,%c,%d\n",b.name,b.gender,b.score);}则程序的输出结果是A、Zhao,m,290,Zhao,m,290B、Qian,f,350,Qian,f,350C、Zhao,m,290,Qianf,350D、Zhao,m,290,Zhao,f,350标准答案:C知识点解析:主函数中结构体变量定义同时赋初值。执行b=a;语句后,b的数据和a的数据相同,调用函数f(b.name),形参指针p接收实参b.name的地址,此时p和b.name指向同一个存储空间,流程转到f执行,p指向的存储空间存放字符串"Qiao",流程结束返回主函数。主函数中变量b的其他成员存放数据。因此a的数据{"Zhao",’m’,290},b的数据为{"Qian",’f’,350)。注意本题结构体STU类型变量a和b中的name成员为数组,不是指针,它具有自己的存储空间。19、若有以下程序段structst{intn;structst*next;);structsta[3]={5,&a[1],7,&a[2],9,’\0’),*p;p=&a[0];则以下选项中值为6的表达式是A、++(p->n)B、(*p).nC、p->n++D、p->n标准答案:A知识点解析:选项A)中表达式++(p->n)为前缀自加表达式,p->n和a[0].n等价,其值为5,前缀自加后值为6。选项B)中表达式(*p).n和选项D)的表达式p->n含义相同,表示取结构指针p所指向的成员,因此值为5。选项C)中表达式p->n++为后缀自加表达式,相当于(p->)++,表达式值为5。20、以下叙述中正确的是A、结构体类型中的各个成分均不能是数组或指针B、结构体类型的变量,不能在声明结构体类型组成时一起定义C、使用typedef定义新类型名后,新类型名与原类型名实际上是等价的D、元素为结构体类型的数组,只能在声明过结构体类型之后,单独进行定义标准答案:C知识点解析:C语言允许用typedef说明一种新类型名,typedef语句的作用仅仅是用“标识符”来代表己存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。结构体变量定义有下面三种形式:(1)先定义结构,再说明结构变量。(2)在定义结构类型的同时说明结构变量。(3)直接说明结构变量。21、以下叙述中正确的是A、结构体变量的地址不能作为实参传给函数B、结构体数组名不能作为实参传给函数C、即使是同类型的结构体变量,也不能进行整体赋值D、结构体中可以含有指向本结构体的指针成员标准答案:D知识点解析:一个结构体变量包含若干成员,这些成员可以是数值类型、字符类型、数组类型,也可以是指针类型,甚至可以是正在定义的结构体类型指针。用结构体变量作实参时,采取的是“值传递”的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。结构体数组作为参数时,采取了“地址传递”的方式,形参须为同类型的结构指针或者形参结构数组。22、有以下程序structS{inta;intb;);main(){structSa,*p=&a;a.a=99;pfintf("%d\n",_________);)程序要求输出结构体中成员a的数据,以下不能填入横线处的内容是A、a.aB、*p.aC、p->aD、(*p).a标准答案:B知识点解析:如果p指向结构体,那么下面三种形式都可以访问结构体的成员:结构体变量.成员名、(*p).成员名、p->成员名。23、有以下程序#includestructSTU{charname[9];charsex;intscore[2];};voidf(structSTUa[]){structSTUb={"zhao",’m’,85,90);a[1]=b;}main(){structSTUc[2]={{"Qian",’f’,95,92},{"Sun",’m’,98,99}};f(c);printf("%s,%c,%d,%d,",c[0].name,c[0].sex,c[0].score[0],c[0].score[1]);printf("%s,%c,%d,%d\n",",c[1].name,c[1].sex,c[1].score[0],c[1].score[1]);}程序运行后输出结果是A、Qian,f,95,92,Sun,m,98,99B、Zhao,m,85,90,Sun,m,98,99C、Qian,f,95,92,Zhao,m,85,90D、Zhao,m,85,90,Qian,f,95,92标准答案:C知识点解析:在主函数中,定义了结构体STU数组c[2],并对其赋初始值。执行f(c)时,在函数f()中,把结构体变量b的值赋给了c[1]。24、有以下程序main(){unsignedchara=8,c;c=a>>3;printf("%d\n",c);}程序运行后的输出结果是A、16B、32C、1D、0标准答案:C知识点解析:在程序中对无符号字符变量a的值执行右移3位运算后,相当于a/8,其值等于1,再赋给变量c。25、下面选项中关于位运算的叙述正确的是A、位运算符都需要两个操作数B、左移运算的结果总是原操作数据2倍C、右移运算时,高位总是补0D、位运算的对象只能是整型或字符型数据标准答案:D知识点解析:位运算则是以位(bit)一级进行的运算,位运算符中除“~”以外,均为二元运算符,即要求两侧各有一个运算量,运算量只能是整型或字符型的数据,不能为实型数据。其中右移时,右端(低位)移出的二进制数舍弃,左端(高位)移入的二进制数分两种情况:对于无符号整数和正整数,高位补0;对于负整数,高位补1。而左移运算在没有溢出的前提下每移动一位,相当于原数据的2倍。26、有以下程序main(){inta=1,b=2,c=3,x;x=(a^b)&c;printf("%d\n",x);}程序的运行结果是A、1B、2C、3D、O标准答案:C知识点解析:1、2、3的二进制形式分别为00000001、00000010、00000011。首先计算1与2的或运算,即1^2=(00000001)^(00000010)=00000011,再将其与3进行“与”运算,结果为(00000011)&(00000011)=00000011,即十进制数3。27、有以下程序#includemain(){chara=4;printf("%d\n",a=a<<1);}A、8B、16C、40D、4标准答案:A知识点解析:本题主要考查按位右移运算。a=4的二进制为00000100,a<<1后为00001000,其值为十进制数值8。28、若变量已正确定义,则以下语句的输出结果是s=32;s^=32;printf("%d",s);A、-1B、1C、32D、0标准答案:D知识点解析:“按位异或”运算的规则是:参与运算的两个运算数中相对应的二制位上,若数相同,则该位的结果为0;若数不同,则该位的结果为1。因为语句s=32;s^=32;相当于s与自身做按位异或运算,所以其结果等于0。29、若有以下程序main(){intc:C=13|5:prinff("%d\n",c);}则程序的输出结果是A、15B、18C、13D、5标准答案:C知识点解析:按位或(|)的运算规则是:参加运算的两个运算数中,只要两个相应的二进制位中一个为l,则该位的运算结果即为1;只有当两个相应位的数都为0时,该位的运算结果才为0。13的二进制位1101,5的二进制位0101,或运算的结果为1101,因此值为13。30、有以下程序main(){inti=1;i=i^i;printf("%d\n",i);}程序运行后的输出结果是A、-1B、0C、1D、7标准答案:B知识点解析:按位异或(^)的运算规则是:参与运算的两个运算数中相对应的二进制位上,若数相同,则该位的结果为0;若数不同,该位的结果为1。本题中表达式i^i的值必为0,因为i的各个位置的二进制值相同。31、以下叙述中正确的是A、打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖B、在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第1个数据C、C语言中的文件是流式文件,因此只能顺序存取数据D、当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失标准答案:D知识点解析:在C语言中,有两种对文件的存取方式;顺序存取和直接存取;如果以“a”的方式对一个已打开的文件进行写操作后,则原有文件中内容将保存,新的数据写在原有内容之后。如果以“a+”的方式为读和写而打开一个文件,则既可以对文件进行读,也可以对文件进行写,而且在读和写操作之间不必关闭文件,可以从头开始读。当对文件的读(写)操作完成之后,必须将它关闭。32、下面选项中关于“文件指针”概念的叙述正确的是A、文件指针就是文件位置指针,表示当前读写数据的位置B、文件指针指向文件在计算机中的存储位置C、文件指针是程序中用FILE定义的指针变量D、把文件指针传给fscanf函数,就可以向文本文件中写入任意的字符标准答案:C知识点解析:文件指针实际上是指向一个结构体类型的指针,这个结构体中包含如缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是“读”或“写”、是否出错、是否已经遇到文件结束标志等信息。一般称文件指针结构体类型名为FILE,可以用此类型名来定义文件指针。【格式】FILE*指针变量名【说明】FILE是一个存储文件信息的结构体类型的变量。注意不要和文件位置指针混淆,在文件内部有一个位置指针,用以指示文件内部的当前读写位置。使用fetc函数,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。而文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。fscanf函数可以向文本文件和二进制文件输入数据。33、有以下程序#includemain(){FILE*f;f=fopen("filea.txt","w");fprintf(f,"abc");fclose(f);)若文本文件filea.txt中原有内容为:hello,则运行以上程序后,文件filea.txt中的内容为A、abcloB、abcC、helloabcD、abchello标准答案:B知识点解析:本题考查文件打开方式。格式:文件指针名fopen(文件名,使用文件方式)需要注意的是:用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。34、读取二进制文件的函数调用形式为:fread(buffer,size,count,fp);其中buffer代表的是A、一个整型变量,代表待读取的数据的字节数B、一个内存块的首地址,代表读入数据存放的地址C、一个文件指针,指向待读取的文件D、一个内存块的字节数标准答案:B知识点解析:buffer是数据块的指针,对fread来说,它是内存块的首地址,输入的数据存入此内存块中;35、以下叙述中错误的是A、gets函数用于从终端读入字符串B、getchar函数用于从磁盘文件读入字符C、fputs函数用于把字符串输出到文件D、fwrite函数用于以二进制形式输出数据到文件标准答案:B知识点解析:本题考查的是输入输出函数的使用,gets和getchar函数用于从标准输入设备终端读入字符串和字符,并非从磁盘文件读入,fputs用于把字符串输出到文件,fwrite用于以二进制形式输出数据到文件。36、有下列程序:#includemain(){FILE*fp;intk,n,a[6]={1,2,3,4,5,6};fp=fopen("d2.dat","w");fprintf(fp,"%d%d%d\n",a[0],a[1],a[2]);fprintf(fp,"%d%d%d\n",a[3],a[4],a[5]);fclose(fp);fp=fopen("d2.dat","r");fscanf(fp,"%d%d",&k,&n);printf("%d%d\n",k,n);fclose(fp);}程序运行后的输出结果是A、14B、123456C、1234D、12标准答案:B知识点解析:用文件函数fopen打开d2.dat文件并把数组a[6]中的元素分两行写入到d2.dat文件中,关闭文件。然后再次打开文件d2.dat,用fscanf()函数读取文件d2.dat中的数据,因为每行没有分隔符,所以每一行会被认为是一个完整的数,并存入到变量k和n中,输出变量k和n的值为123456。37、设fp为指向某二进制文件的指针,且已读到此文件末尾,则函数feof(fp)的返回值为A、’\0’B、0C、NULLD、非0值标准答案:D知识点解析:ANSIC提供的feof函数的功能是判断邱所指的文件的位置是否已达到文件尾,如果达到文件尾,则feof函数的值为1,否则为0,表示文件尚未结束。38、以下程序依次把从终端输入的字符存放到f文件中,用#作为结束输入的标志,则在横线处应填入的选项是#includemain(){FILE*fp;charch;fp=fopen("fname","w");while((ch=getchar())!=’#’)fputc(_________);fclose(fp);)A、fp,chB、chC、ch,"fname"D、ch,fp标准答案:D知识点解析:fputc()是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。使用格式为fputc(ch,fp);其中cb是待输出的某个字符,它可以是一个字符常量,也可以是一个字符变量;fp是文件指针。fputc(ch,fp)的功能是将字符ch写到文件指针fp所指的文件中。如果输出成功,fputc函数返回所输出的字符:如果输出失败,则返回一个EOF值。EOF是在stdio.h库函数文件中定义的符号常量,其值等于-1。39、下面关于"EOF"的叙述,正确的是A、EOF的值等于0B、文本文件和二进制文件都可以用EOF作为文件结束标志C、EOF是在库函数文件中定义的符号常量D、对于文本文件,fgetc函数读入最后一个字符时,返回值是EOF标准答案:C知识点解析:EOF是在stdio.h库函数文件中定义的符号常量,其值等于-1。EOF用作文件结束标志,在二进制或者文本文件内部有一个位置指针,用以指示文件内部的当前读写位置。使用fgetc函数,每读写一次,该指针均向后移动,国家二级C语言机试(结构体、共用体、位运算及文件操作)模拟试卷第3套一、选择题(本题共39题,每题1.0分,共39分。)1、以下关于typedef的叙述错误的是A、typedef只是将已存在的类型用一个新的名字来代表B、用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名C、用typedef可以增加新类型D、用typedef为类型说明一个新名,通常可以增加程序的可读性标准答案:C知识点解析:C语言允许用typedef说明一种新的类型名,其一般形式为:typedef类型名标识符;在此“类型名”必须是在此语句之前已有定义的类型标识符。“标识符”是一个用户定义标识符,用作新的类型名。Typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原来的类型名依然有效,这样可以增加程序的可读性。2、以下叙述中错误的是A、可以用typedef将已存在的类型用一个新的名字来代表B、可以通过typedef增加新的类型C、用typedef定义新的类型名后,原有类型名仍有效D、用typedef可以为各种类型起别名,但不能为变量起别名标准答案:B知识点解析:C语言允许用typedef说明一种新类型名。typedef类型名标识符:其中“类型名”必须是在此语句之前已定义的类型标识符:“标识符”是一个用户定义标识符,用作新的类型名;typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。3、若有定义typedefcharT[10];T*a;上述定义中a的类型与下面选项中完全相同的是A、char(*a)[10];B、char*a;C、chara[10];D、char*a[10];标准答案:D知识点解析:题目中利用typedef定义了字符数组类型T,而后定义了该类型的指针a,因此a为指针数组。4、以下叙述中正确的是A、使用typedef说明新类型名时,其格式是:typedef新类型名原类型名;B、使用typedef说明新类型名时,后面不能加分号C、在程序中,允许用typedef来说明一种新的类型名D、在使用typedef改变原类型的名称后,只能使用新的类型名标准答案:C知识点解析:C语言允许用typedef说明一种新类型名。定义形式如下:typedef类型名标识符:其中“类型名”必须是在此语句之前已定义的类型标识符;“标识符”是一个用户定义标识符,用作新的类型名;typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。5、下面结构体的定义语句中,错误的是A、structord{intx;inty;intz;};structorda;B、structord{intx;inty;intz;}structorda;C、structord{intx;inty;intz;}a;D、struct{intx;inty;intz;}a;标准答案:B知识点解析:在选项B)中,由于在定义完结构体后缺少分号“;”,所以这是一条不完整的语句,因而是错误的。6、有以下程序structS{inta,b;)data[2]={10,100,20,200};main(){structSp=data[1];printf("%d\n",++(p.a));)程序运行后的输出结果是A、11B、20C、21D、10标准答案:C知识点解析:在题目中定义了结构体S类型的数组变量data,并对其赋初值。在程序中定义了指向结构体S类型的变量p,并把数组data的第二个元素data[1]的值赋给它,所以此时成员变量p.a的值等于20,在输出时分别加1,所以输入结果为选项A)。7、有以下程序structS{intn;inta[20];);voidf(structS*p){intij,t;for(i=0;i<p->n-1;i++)for(j=i+l;j<p->n;j++)if(p->a[i]>p->a[j]){t=p->a[i];p->a[i]=p->a[j];p->a[j]--t;}}main(){inti;structSs={10,{2,3,1,6,8,7,5,4,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论