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

下载本文档

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

文档简介

国家二级C语言(结构体、共用体、位运算及文件操作)机试模拟试卷1(共9套)(共237题)国家二级C语言(结构体、共用体、位运算及文件操作)机试模拟试卷第1套一、选择题(本题共26题,每题1.0分,共26分。)1、有以下程序#includemain(){chara=4;printf("%d\n",a=a<<1);}A、8B、16C、40D、4标准答案:A知识点解析:本题主要考查按位右移运算。a=4的二进制为00000100,a<2、有以下程序#includemain(){inta=5,b=1,t;t=(a<<2)|b;printf("%d\n",t);}A、11B、6C、21D、1标准答案:C知识点解析:本题考查位操作运算符。‘<<’是左移运算符,左移一位相当于乘2,‘|’是按位或运算符。5左移两位相当于乘4,得到20,20的二进制数是00010100,和0000000l进行按位或操作得到00010101,即十进制的21。3、若变量已正确定义,则以下语句的输出结果是s=32;s^=32;printf("%d",s);A、-1B、1C、32D、0标准答案:D知识点解析:“按位异或”运算的规则是:参与运算的两个运算数中相对应的二制位上,若数相同,则该位的结果为0;若数不同,则该位的结果为1。因为语句s=32;s^=32:相当于s与自身做按位异或运算,所以其结果等于0。4、若有以下程序main(){intc;c=10^5;printf("%dkn",c);}则程序的输出结果是A、15B、10000C、5D、105标准答案:A知识点解析:按位异或(^)的运算规则是:参与运算的两个运算数中相对应的二进制位上,若数相同,则该位的结果为0;若数不同,该位的结果为1。整数10和5的二进制编码分别为1010和0101,异或结果为1111,其十进制数据位15。5、若有以下程序main(){intc;C=1315;printf("%d\n",c);}则程序的输出结果是A、15B、18C、13D、5标准答案:C知识点解析:按位或(1)的运算规则是:参加运算的两个运算数中,只要两个相应的二进制位中一个为1,则该位的运算结果即为1;只有当两个相应位的数都为0时,该位的运算结果才为0。13的二进制位1101,5的二进制位0101,或运算的结果为1101,因此值为13。6、有以下程序main(){inti=0;i=~i;printf("%d\n",i);}程序运行后的输出结果是A、0B、1C、8D、-1标准答案:D知识点解析:运算符(~)是位运算符中唯一的一个单目运算符,运算对象应置于运算符的右边,其运算功能是把运算对象的内容按位取反(使每一位上的0变1,1变0)。i的初值为0,二进制位00000000,因此取反后结果为11111111,最高位为符号位,为-1的补码形式,因此输出结果为-1.7、有以下程序main(){inti=1;i=i^iprintf("%d\n",i);}程序运行后的输出结果是A、-1B、0C、1D、7标准答案:B知识点解析:按位异或(^)的运算规则是:参与运算的两个运算数中相对应的二进制位上,若数相同,则该位的结果为0;若数不同,该位的结果为1。本题中表达式i^i的值必为0,因为i的各个位置的二进制值相同。8、下面关于位运算符的叙述,正确的是A、#表示“按位异或”的运算B、‖表示“按位或”的运算C、~表示“按位异或"的运算D、&表示“按位与”的运算标准答案:D知识点解析:C语言提供了6种位运算符,各种位运算符的含义见下表:各种位运算符及其含义9、以下叙述中正确的是A、打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖B、在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第个数据C、C语言中的文件是流式文件,因此只能顺序存取数据D、当对文件的读(写)操作完成之后,、必须将它关闭,否则可能导致数据丢失标准答案:D知识点解析:在C语言中,有两种对文件的存取方式;顺序存取和直接存取;如果以“a”的方式对一个已打开的文件进行写操作后,则原有文件中内容将保存,新的数据写在原有内容之后。如果以“a+”的方式为读和写而打开一个文件,则既可以对文件进行读,也可以对文件进行写,而且在读和写操作之间不必关闭文件,可以从头开始读。当对文件的读(写)操作完成之后,必须将它关闭。10、下列关于C语言文件的叙述中正确的是A、文件由结构序列组成,可以构成二进制文件或文本文件B、文件由一系列数据依次排列组成,只能构成二进制文件C、文件由数据序列组成,可以构成二进制文件或文本文件D、文件由字符序列组成,其类型只能是文本文件标准答案:C知识点解析:在C语言中,对输入、输出的数据都按“数据流”的形式进行处理。数据可以按文本形式或二进制形式存放在介质上,因此文件可以按数据的存放形式分为文本文件和二进制文件。11、下面选项中关于“文件指针”概念的叙述正确的是A、文件指针就是文件位置指针,表示当前读写数据的位置B、文件指针指向文件在计算机中的存储位置C、文件指针是程序中用FILE定义的指针变量D、把文件指针传给fscanf函数,就可以向文本文件中写入任意的字符标准答案:C知识点解析:文件指针实际上是指向一个结构体类型的指针,这个结构体中包含如缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是“读”或“写”、是否出错、是否已经遇到文件结束标志等信息。一般称文件指针结构体类型名为FILE,可以用此类型名来定义文件指针。[格式]FILE+指针变量名[说明]FILE是一个存储文件信息的结构体类型的变量。注意不要和文件位置指针混淆,在文件内部有一个位置指针,佣以指示文件内部的当前读写位置。使用fgetc函数,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。而文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。fscanf函数可以向文本文件和二进制文件输入数据。12、设文件指针fp已定义,执行语句fp=fopen("file","W");后,以下针对文本文件file操作叙述的选项中正确的是A、写操作结束后可以从头开始读B、可以在原有内容后追加写C、可以随意读和写D、只能写不能读标准答案:D知识点解析:在题目中函数fopen以“只写”方式打开文件file。13、有以下程序#includemain(){FILE*f=f=fopen("filea.txt","W");fprintf(f,"abc");fclose(f);}若文本文件filea.txt中原有内容为:hello,则运行以上程序后,文件filea.txt中的内容为A、abc!oB、abcC、helloabcD、abchello标准答案:B知识点解析:本题考查文件打开方式。格式:文件指针名=fopen(文件名,使用文件方式)需要注意的是:用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。14、有以下程序#inchldemain(){FILE*fp;inti,a[6]={1,2,3,4,5,6};fp=fopen("d2.dat","w+t");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中的数组元素。15、读取二进制文件的函数调用形式为:fread(buffer,size,count,fp);其中buffer代表的是A、一个整型变量,代表待读取的数据的字节数B、一个内存块的首地址,代表读入数据存放的地址C、一个文件指针,指向待读取的文件D、一个内存块的字节数标准答案:B知识点解析:buffer是数据块的指针,对舶ad来说,它是内存块的首地址,输入的数据存入此内存块中。16、有下列程序:#includemain(){FILE*fp;inta[10]={1,2,3),i,n;fp=fopen("d1.dat","w");for(i=0;i<3;i++)fprintf(fp,"%d",a[i]);fprintf(fp,"\n");fclose(fp);f-p=open("d1.dat","r");fscanf(fp,"%d",&n);fclose(fp);printf("%d\n",n);}程序的运行结果是A、12300B、123C、1D、321标准答案:B知识点解析:本题考查以读和写的方式打开文件对文件内容操作的不同,fp=fopen("d1.dat","w");以可写的方式为输出建立新文本文件,调用printf,输出“123”,fp=fopen("d1,dat","r");以只读的方式打开文本文件,不能对文件内容进行操作。17、以下叙述中错误的是A、gets函数用于从终端读入字符串B、getchar函数用于从磁盘文件读入字符C、fputs函数用于把字符串输出到文件D、fwrite函数用于以二进制形式输出数据到文件标准答案:B知识点解析:本题考查的是输入输出函数的使用,gets和getchar函数用于从标准输入设备终端读入字符串和字符,并非从磁盘文件读入,fputs用于把字符串输出到文件,fwrite用于以二进制形式输出数据到文件。18、有以下程序#includemain(){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、ChinangB、ChinaC、ChinaBeijingD、BeijingChina标准答案:A知识点解析:本题主考查函数fwrite的使用。函数fwrite的调用形式为:Intfwrite(chat*pt,unsignedsize,unsignedn,FILE*fp);其功能是把pt所指向的n*size个字节输出到fp所指文件中。在本题中fwrite(s2,7,1,pf);的功能是把字符串“Beijing”输入到文件abc.dat中.然后调用rewind(pf),把文件位置指针回到文件开头,再调用fwrite(s1,5,1,pf)把字符串“China”写入到文件abc.dat中,所以此时文件abc.dat的内容为Chinang。19、有下列程序:#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[31,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知识点解析:用文件函数fopcn打开d2.dat文件并把数组a[6]中的元素分两行写入到d2.dat文件中,关闭文件。然后再次打开文件d2.dat,用fscanf()函数读取文件d2.dat中的数据,因为每行没有分隔符,所以每一行会被认为是一个完整的数,并存入到变量k和n中,输出变量k和n的值为123.456。20、有下列程序:#includemain(){FILE*fp;inta[10]={1,2,3,0,0),i;fp=fopen("d2.dat","wb");fwtite(a,sizeof(int),5,f1));fwrite(a,sizeof(int),5,f1));fclose(fp);fp=fopen("d2.dat","rb");fread(a,sizeof(int),10,f(p);fclose(fp);for(i=0;i<10;i++)printf("%d",a[i]);}程序的运行结果是A、1,2,3,1,2,3,0,0,0,0,B、1,2,3,0,0,1,2,3,00,C、123,0,0,0,0,123,0,0,0,0,D、1,2,3,0,0,0,0,0,0,0,标准答案:B知识点解析:首先用函数fopen()以“wb”的方式开打文件“d2.dat”,然后调用两次fwrile函数将数组a的5个元素,依次输出到文件fp中,共10个字节,关闭文件。再次打开文件,使用文件指针指向文件的开头,调用fread函数从文件fp中读取这10个字节的数据到数组a中,此时数组a的内容就变为{1,2,3,0,0,1,2,3,0,0},最后的输蹬结果为“1,2,3,0,0,1,2,3,0,0”。21、设fp为指向某二进制文件的指针,且已读到此文件末尾,则函数feof(f1))的返回值为A、’\0’B、0C、NULLD、非0值标准答案:D知识点解析:ANSIC提供的feof函数的功能是判断fb所指的文件的位置是否已达到文件尾,如果达到文件尾,则feof函数的值为1,否则为0,表示文件尚未结束。22、有以下程序#includemain(){FILE*fp;charstr[10];fp=fopen("myfile.dat","w");fputs("abc",fp);fclose(fp);fp=fopen("myfile.dat","a+");fprintf(fp,"%d",28);rewind(fp);fscanf(fp,"%s".str);puts(str);fclose(fp);}程序运行后的输出结果是A、28cB、abe28C、abcD、因类型不一致而出错标准答案:B知识点解析:在程序中首先把字符串abe写入到文件myfile.dat中,然后再把整数28追加到字符串abc的后面.最后把文件myfile.dat的内容读入到字符串str中,井把其内容输出。23、以下程序依次把从终端输入的字符存放到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);其中ch是待输出的某个字符,它可以是一个字符常量,也可以是一个字符变量;fb是文件指针。fputc(ch,fp)的功能是将字符ch写到文件指针fp所指的文件中。如果输出成功,fputc函数返回所输出的字符;如果输出失败,则返回一个EOF值。EOF是在stdio.h库函数文件中定义的符号常量,其值等于-1。24、以下程序用来统计文件中字符的个数(函数feof用以检查文件是否结束,结束时返回非零)#includemain(){FILE*fp;longnum=O:fp=fopen(“fname.dat","r”);while(_________){fgetc(fp);num++;)printf("num=%d\n",num);fclose(fp);}下面选项中,填入横线处不能得到正确结果的是A、feof(fp)B、feof(fp)=NULLC、!feof(fp)D、feof(fp)=0标准答案:C知识点解析:feof函数用来判断文件是否结束。如果遇到文件结束,函数feof(fb)的值为1,否则为0。题目横线用于判断文件不结束,读出字符。文件不结束feof值为0,若执行循环则应用表达式!feof(fp)。25、下面关于“EOF”的叙述,正确的是A、EOF的值等于0B、文本文件和二进制文件都可以用EOF作为文件结束标志C、EOF是在库函数文件中定义的符号常量D、对于文本文件,龟etc函数读入最后一个字符时,返回值是EOF标准答案:C知识点解析:EOF是在stdio.h库函数文件中定义的符号常量,其值等于-1。EOF用作文件结束标志,在二进制或者文本文件内部有一个位置指针,用以指示文件内部的当前读写位置。使用fgetc函数,每读写一次,该指针均向后移动,26、若fp已定义为指向某文件的指针,且没有读到该文件的末尾,则C语言函数feof(fp)的函数返回值是A、0B、非0C、-1D、EOF标准答案:A知识点解析:feof用来判断文件是否结束。如果遇到文件结束,函数feof(fb)的值为1,否则为0。国家二级C语言(结构体、共用体、位运算及文件操作)机试模拟试卷第2套一、选择题(本题共26题,每题1.0分,共26分。)1、以下叙述中错误的是A、可以用typedef将已存在的类型用一个新的名字来代表B、可以通过typedef增加新的类型C、用typedef定义新的类型名后,原有类型名仍有效D、用typedef可以为各种类型起别名,但不能为变量起别名标准答案:B知识点解析:C语言允许用typedef说明一种新类型名,说日月新类型名的语句一般形式为:typedef类型名标识符;在此,“类型名”必须是在此语句之前已有定义的类型标识符。“标误符”是一个用户定义标识符,用作新的类型名。tVpedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。2、以下关于typedef的叙述错误的是A、typedef只是将已存在的类型用一个新的名字来代表B、用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名C、用typedef可以增加新类型D、用typedef为类型说明一个新名,通常可以增加程序的可读性标准答案:C知识点解析:C语言允许用typedef说明一种新的类型名,其一般形式为:typedef类型名标识符;在此“类型名”必须是在此语句之前已有定义的类型标识符。“标识符”是一个用户定义标识符,用作新的类型名。Typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原来的类型名依然有效,这样可以增加程序的可读性。3、以下结构体类型说明和变量定义中正确的是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结构体名{成员列:表};struct结构体名后不能加“;”号,所以选项B)、C)错误,选项D)中定义无名称的结构体类型同时定义结构体变量形式应为structt1,t2;选项A)为用户自定义类型,其为正确的定义形式。4、以下叙述中错误的是A、可以用typedef将已存在的类型用一个新的名字来代表B、可以通过typedef增加新的类型C、用typedef定义新的类型名后,原有类型名仍有效D、用typedef可以为各种类型起别名,但不能为变量起别名标准答案:B知识点解析:C语言允许用typedef说明一利新类型名。typedef类型名标识符:其中“类型名”必须是在此语句之前己定义的类型标识符;“标识符”是一个用户定义标识符,用作新的类型名;typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。5、若有定义typedefint*T;Ta[10];则a的定义与下面哪个语句等价A、int*a[10];B、int(*a)[10];C、int*a;D、inta[10];标准答案:A知识点解析:tvpedef的主要功能是为存在的类型命名,后面的代码中可以利用该新定义的类型名定义变量,题目中定义了整型指针类型T,而后利用T定义了整型指针数组a,含有10个元素,选项A)中定义了整型指针数组a,选项B)定义了一个指向一维数组的指针a,选项C)定义指针变量,,而选项D)为定义整型数组最常用的形式,数组a中可以存放10个数据元素。6、若有定义typedefcharT[10];T*a;上述定义中a的类型与下面选项中完全相同的是A、char(*a)[10];B、char*a;C、chara[10];D、char*a[10];标准答案:D知识点解析:题目中利用typedef定义了与字符数组类型T,而后定义了该类型的指针a,因此a为指针数组。7、以下结构体说明和变量定义中,正确的是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。8、以下叙述中正确的是A、使用typedef说明新类型名时,其格式是:typedef新类型名原类型名;B、使用typedef说明新类型名时,后面不能加分号C、在程序中,允许用typedef来说明一种新的类型名D、在使用typedef改变原类型的名称后,只能使用新的类型名标准答案:C知识点解析:C语言允许用typedef说明一种新类型名。定义形式如下:typedef类型名标识符:其中,“类型名”必须是在此语句之前已定义的类型标识符;“标识符”是一个用户定义标识符,用作新的类型名;typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。9、以下叙述中错误的是A、typedef的作用是用一个新的标识符来代表已存在的类型名B、typedef说明的新类型名必须使用大写字母,否则会出编译错误C、可以用typedef说明的新类型名来定义变量D、用typedef可以说明一种新的类型名标准答案:B知识点解析:tvpedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原来类型名依然有效。为了便于识别,一般习惯将新的类型名用大写字母表示。10、下面结构体的定义语句中,错误的是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)中,由于在定义完结构体后缺少分号“;”,所以这是一条不完整的语句,因而是错误的。11、有以下程序#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()函数f(a)语句中结构体实参a作为值,传递给函数f(Ac)中的形参c;这种值传递的方式不会对实参a产生任何影响,所以结构体实参a的值不会发生变化。12、有以下程序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)。13、设有定义:structcomplex{intreal,unreal;}datal={1,8),data2;则以下赋值语句中错误的是A、data2=(2,6);B、data2=datal:C、data2.real=datal.real;D、data2.real=datal.unreal;标准答案:A知识点解析:本题主要考查结构体变量的定义与初始化。题目中定义了complex类型的结构体变量data1和data2,并对data1进行了初始化。可以用一个结构体变量对另一个结构体变量赋值,用一个结构体变量的成她对另一个结构体变量的成员赋值。14、有以下程序structs{intn;inta[20];};voidf(structs*p){inti,j,t;for(i=0;in-1;i++)for(j=i+1;jn;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,10,9}};f(&s);for(i=0;iA、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、1,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。15、有以下程序#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];returna;}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,t,95,92,Zhao,m,85,90标准答案:C知识点解析:在C语言中,函数实参与形参之间数据的传递是传值,也就是说在用实参训用形参时,是把实参的值拷贝一份给形参,而实参的值并不变化,仍是原米的值。所以对十本题来说,在主函数中调f(e)后,实参c的值并不会变化,仍是原值。在函数f中把局部变量b的值依次返回给变量d。16、程序中已构成如下图所示的不带头结点的单向链表结构,指针变量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。所以最终实现链表的首结点成为尾结点。17、有以下结构体说明、变量定义和赋值语句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)表示的值,而不是一个地址值。18、若有以下语句typedefstructS{intg;charh;}T;以下叙述中正确的是A、可用S定义结构体变量B、S是struct类型的变量C、T是structS类型的变量D、可用T定义结构体变量标准答案:D知识点解析:本题考查typedef,T是structS的新名称,因此可用T定义结构体变最,但是T并不是变量,只是structS的新名称。19、有以下程序#include#includeStructA{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的各个成员重新进行了赋位操作,并把其值返回在屏幕上输出。20、设有以下语句typedefstructTT{chalc:inta[4]:}CIN;则下面叙述中正确的是A、TT是struct类型的变量B、可以用TT定义结构体变量C、CIN是structTT类型的变量D、可以用CIN定义结构体变量标准答案:D知识点解析:c语苦允许用typedef说明一种新的类犁名,说明新类型名的语句为一般形式为:typcdef类型名标识符在此,“类型名”必须是此语句之前已有定义的类型标识符。“标识符”是一个用户定义标识符,用作新的类型名。typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型.原有类型名依然有效。在本题中用typedef定义C1N为TT的一种新的类型名,因而可以用它定义一个结构休变量。21、有以下程序#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)。22、有以下程序段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。23、有下列程序:structS{intn;inta[20];};voidf(int*a,intn){inti;for(i=0;iA、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;i24、有下列程序:#include#includetypedefstruct{charname[9];charsex;float:score[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.Of,%2.Of\n",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的各个成员的值。25、假定已建立以下链表结构,且指针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所指向的节点,即free(q)。26、有以下程序#include#includeStructA{inta;charb[10];doublec;);VOidf(StructAt);main(){struerAa={1001,"ZhangDa",1098.0);f(a);printf("%d,%s,%6.1f\n",a.a,a.b,a.c);}voidf(struerAt){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的值保持不变。国家二级C语言(结构体、共用体、位运算及文件操作)机试模拟试卷第3套一、选择题(本题共26题,每题1.0分,共26分。)1、以下叙述中错误的是A、可以用typedef将已存在的类型用一个新的名字来代表B、可以通过typedef增加新的类型C、用typedef定义新的类型名后,原有类型名仍有效D、用typedef可以为各种类型起别名,但不能为变量起别名标准答案:B知识点解析:C语言允许用typedef说明一种新类型名,说明新类型名的语句一般形式为:typedef类型名标识符;在此,“类型名”必须是在此语句之前已有定义的类型标识符。“标误符”是一个用户定义标识符,用作新的类型名。typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。2、以下关于typedef的叙述错误的是A、typedef只是将已存在的类型用一个新的名字来代表B、用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名C、用typedef可以增加新类型D、用typedef为类型说明一个新名,通常可以增加程序的可读性标准答案:C知识点解析:C语言允许用typedef说明一种新的类型名,其一般形式为:typedef类型名标识符;在此“类型名”必须是在此语句之前已有定义的类型标识符。“标识符”是一个用户定义标识符,用作新的类型名。Typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型.原来的类型名依然有效,这样可以增加程序的可读性。3、以下结构体类型说明和变量定义中正确的是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知识点解析:定义结构体类型的一般形式为:struet结构体名{成员列表};struet结构体名后不能加“;”号,所以选项B、C)错误,选项D中定义无名称的结构体类型同时定义结构体变量形式应为struett1,t2;选项A为用户自定义类型,其为正确的定义形式。4、以下叙述中错误的是A、可以用typedef将已存在的类型用一个新的名字来代表B、可以通过typedef增加新的类型C、用typedef定义新的类型名后,原有类型名仍有效D、用typedef可以为各种类型起别名,但不能为变量起别名标准答案:B知识点解析:C语言允许用typedef说明一种新类型名。typedef类型名标识符:其中“类型名”必须是在此语句之前已定义的类型标识符;“标识符”是一个用户定义标识符,用作新的类型名:typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。5、若有定义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个数据元素。6、若有定义typedefcharT[10];T*a;上述定义中a的类型与下面选项中完全相同的是A、char(*a)[10];B、char*a;C、chara[10];D、char*a[10];标准答案:D知识点解析:题目中利用typedef定义了字符数组类型T,而后定义了该类型的指针a,因此a为指针数组。7、以下结构体说明和变量定义中,正确的是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。8、以下叙述中正确的是A、使用typedef说明新类型名时,其格式是:typedef新类型名原类型名;B、使用typedef说明新类型名时,后面不能加分号C、在程序中,允许用typedef来说明一种新的类型名D、在使用typedef改变原类型的名称后,只能使用新的类型名标准答案:C知识点解析:C语言允许用typedef说明一种新类型名。定义形式如下:typedef类型名标识符:其中“类型名”必须是在此语句之前已定义的类型标识符;“标识符”是一个用户定义标识符,用作新的类型名:typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。9、以下叙述中错误的是A、typedef的作用是用一个新的标识符来代表已存在的类型名B、typedef说明的新类型名必须使用大写字母,否则会出编译错误C、可以用typedef说明的新类型名来定义变量D、用typedef可以说明一种新的类型名标准答案:B知识点解析:typedef语句的作用仅仅是用“标识符”来代表己存在的“类型名”,并未产生新的数据类型,原来类型名依然有效。为了便于识别,一般习惯将新的类型名用大写字母表示。10、下面结构体的定义语句中,错误的是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中,由于在定义完结构体后缺少分号“:”,所以这是一条不完整的语句,因而是错误的。11、有以下程序#includetypedefstruct{intb,p;}A;voidf(Ac)/*注意:C是结构变量名*/{intj;c.b+=1;c.p+=2;}main(){i;Aa={1,2);f(a);printf("%d,%dha",a.b,a.p);}程序运行后的输出结果是A、2,4B、1,2C、1,4D、2,3标准答案:B知识点解析:在C语言中,数据只能从实参单向传递给形参,称为“按值”传递。也就是说,当简单变量作为实参时,用户不可能在函数中政变对应实参的值。所以本题中在main()函数f(a)语句中结构体实参a作为值,传递给函数f(Ac)中的形参c:这种值传递的方式不会对实参a产生任何影响,所以结构体实参a的值不会发生变化。12、有以下程序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。13、设有定义:structcomplex{intreal,unreal;)datal={1,8),data2;则以下赋值语句中错误的是A、data2=(2,6);B、data2=data1:C、data2.real=datal.real;D、data2.real=data1.unreal;标准答案:A知识点解析:本题主要考查结构体变量的定义与初始化。题目中定义了complex类型的结构体变量data1和data2,并对data1进行了初始化。可以用一个结构体变量对另一个结构体变量赋值,用一个结构体变量的成员对另一个结构体变量的成员赋值。14、有以下程序structS{intn;inta[201;};voidf(structS*p){intij,t;for(i=0;in一1;i++)for(j=i+1.jnIj++)if(p->a[i]>p->a[j]){t=p->a[i];p->a[i]=p->a[j];p->a[i]=t;}}main(){inti;structSs={10,{2,3,1,6,8,7,5,4,10,9}};f(&s);for(i=0;iA、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,l,2,3,4,5,D、1,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。15、有以下程序#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];returna;}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。16、程序中已构成如下图所示的不带头结点的单向链表结构,指针变量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。所以最终实现链表的首结点成为尾结点。17、有以下结构体说明、变量定义和赋值语句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表示的值.而不是一个地址值。18、若有以下语句typedefstructS{intg;charh;)T;以下叙述中正确的是A、可用S定义结构体变量B、S是struct类型的变量C、T是structS类型的变量D、可用T定义结构体变量标准答案:D知识点解析:本题考查typedef,T是structS的新名称,因此可用T定义结构体变量,但是T并不是变量,只是slructS的新名称。19、有以下程序#include#includeStructA{inta;charb[10];doublec;};structAf(structAt);main(){structAa={1001,"ZhangDa",1098.0};a=fla);printf("%d,%s,%6.1fln",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)qp对结构体变量a的各个成员重新进行了赋值操作,并把其值返回在屏幕上输出。20、设有以下语句typedefstructTT{charc;inta[4];}CIN;则下面叙述中正确的是A、TT是struct类型的变量B、可以用TT定义结构体变量C、CIN是structTT类型的变量D、可以用CIN定义结构体变量标准答案:D知识点解析:C语言允许用typedef说明一种新的类型名,说明新类型名的语句为一般形式为:typedef。类型名标识符在此,“类型名”必须是此语句之前已有定义的类型标识符。“标识符”是一个用户定义标识符,用作新的类型名。typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效。在本题中用typedef定义CIN为TT的一种新的类型名.因而可以用它定义一个结构体变量。21、有以下程序#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,并且它指向变量数组dI的第一个元素dt[0]。所以此时成员变量p->x的值等于1,成员变量p->y的值等于2,在输出时分别加1。所以输出结果为选项B。22、有以下程序段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。23、有下列程序:structS{intn;inta[20];};voidflint*a,intn){inti;for(i=0;iA、3,4,2,7,9,8,6,5,11,10B、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(in*a,intn)函数,此时指针a指向数组s.a={2,3,1,6,8,7,5,4,10,9},n=10:然后执行for(i=0;i24、有下列程序:#include#includetypedefstruct{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.Of\n",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的各个成员的值。25、假定已建立以下链表结构,且指针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所指向的节点,即flree(q)。26、有以下程序#include#includestructA{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的值保持不变。国家二级C语言(结构体、共用体、位运算及文件操作)机试模拟试卷第4套一、选择题(本题共26题,每题1.0分,共26分。)1、有以下定义和语句: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。2、有以下程序#includestrutcttt{intx;structtt*y;)*p;structtta[4]={20,a+1,15,a+2,30,a+3,17,a};main(){inti;p=a;for(i=1;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]的地址。这就形成了一个单向的循环链表,每个元素的指针成员都指向下一个元素的地址。在主函数中,通过一个for循环语句,输出该链表前2个节点数值成员的值,即a[0].x和a[1].x。3、有以下程序#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中实参的值。4、设有定义:struct{charmark[12];intnum1;doublenum2;}t1,t2;若变量均已正确赋初值,则以下语句中错误的是A、t2.num1=t1.numl:B、t2.mark=t1.mark;C、t1=t2;D、t2.num2=t1.num2;标准答案:B知识点解析:这个题目主要涉及到结构体的定义与赋值操作。根据题意结构体变量t1,t2的成员变量mark是字符数组,对于字符数组之间的赋值操作应该使用循环语句对每个字符进行赋值,而选项A)是用数组名实现字符数组之间的赋值操作,是错误的。5、有以下程序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(StELlctAt){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的数据6、若有以下程序struerstu{char*name,qencter;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知识点解析:主函数中定义结构体类型structstu,有三个成员,第一个成员为字符指针变量。主函数中为stu类型变量a赋值,首先为a.name成员分配存储空间,存入数据。b=a;语句执行完毕以后,a和b的各个成员值相同,需要注意的是b.name和a.name成员都

温馨提示

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

评论

0/150

提交评论