C语言程序设计习题集(3).doc
指针一 单项选择题(每题2分,共40分)1 以下叙述中错误的是B。A 在程序中凡是以“#”开始的语句行都是预处理命令行B 预处理命令行的最后不能以分号表示结束C #define MAX是合法的宏定义命令行D C程序对预处理命令行的处理是在程序执行的过程中进行的2 若程序中有宏定义行:#define N 100 ,则以下叙述中正确的是B。A 宏定义行中定义了标识符N的值为整数100B 在编译程序对C源程序进行预处理时用100替换标识符NC 对C源程序进行编译时用100替换标识符ND 在运行时用100替换标识符3 若有如下宏定义:#define N 2#define y(n) (N+1)*n)则执行下列语句:z=4*(N+y(5);后的结果是B。A 语句有错误 B z值为68 C z值为60 D z值为1804 以下程序运行后的输出结果是A。#define F(X,Y) (X)*(Y)main() int a=3,b=4;printf("%dn",F(a+,b+);A 12 B 15 C 16 D 205 以下程序运行后的输出结果是C。#define f(x) (x*x)main() int i1,i2;i1=f(8)/f(4); i2=f(4+4)/f(2+2);printf("%d,%dn",i1,i2);A 64,28 B 4,4 C 4,3 D 64,646 若已定义a为int型变量,则D是对指针变量p的正确说明和初始化。A int p=&a; B int *p=a; C int *p=*a; D int *p=&a;7 已知下列说明语句:static int a=2,4,6,8static int *p=a,a+1,a+2,a+3;int *q;q=p;则表达式*(q+2)的值是A。A 6 B 2 C 4 D 88 下面是一个初始化指针的语句:int *px=&a;,其中指针变量的名字应该C。A *px B a C px D &a9 若指针px为空指针,则B。A px指向不定 B px的值为零 C px的目标为零 D px的地址为零10 对下语句int *px10;,下面正确的说法是B。A px是一个指针,指向一个数组,数组的元素是整数型。B px是一个数组,其数组的每一个元素是指向整数的指针。C A和B均错,但它是C语言的正确语句。D C语言不允许这样的语句。11 具有相同基类型的指针变量p和数组y,下列写法中不合法的是D。A p=y B *p=yi C p=&yi D p=&y12 已知static int a=5,4,3,2,1,*p=a+3,a+2,a+1,a,*q=p; ,则表达式 *(p0+1)+*(q+2) 的值是A。A 5 B 4 C 6 D 713 说明语句int *(*p)();的含义为D。A p是一个指向int型数组的指针B p是指针变量,它构成了指针数组C p是一个指向函数的指针,该函数的返回值是一个整型D p是一个指向函数的指针,该函数的返回值是一个指向整型的指针14 设有如下程序段char s20="Beijing",*p; p=s;则执行p=s;语句后,以下叙述正确的是A。A 可以用*p表示s0B s数组中元素个数和p所指字符串长度相等C s和p都是指针变量D 数组s中的内容和指针变量p中的内容相同15 设int型变量i、n均已定义,指针变量s1、s2各指向一个字符串。在for(i=0;i<n;i+)循环中,下列语句用以实现将s2所指字符串中前n个字符复制到s1所指字符串中,其中代码正确的是A。A *s1+=*s2+; B s1n-1=s2n-1;C *(s1+n-1)=*(s2+n-1); D *(+s1)=*(+s2);16 给出下列程序的运行结果B。#include <stdio.h>void main() static char a="language",b="program"char *ptr1=a,*ptr2=b;int k;for(k=0;k<7;k+)if(*(ptr1+k)=*(ptr2+k) printf("%c",*(ptr1+k);A gae B ga C language D 有语法错误17 以下程序执行后的输出结果是A。void fun1(char *p) char *q;q=p;while(*q!='0') (*q)+; q+; main() char a="Program",*p;p=&a3; fun1(p); printf("%sn",a);A Prohsbn B Prphsbn C Progsbn D Program18 以下程序执行后的输出结果是C。void swap(char *x,char *y) char t;t=*x; *x=*y; *y=t;main() char *s1="abc",*s2="123"swap(s1,s2); printf("%s,%sn",s1,s2);A 123,abc B abc,123 C 1bc,a23 D 321,cba19 以下程序执行后的输出结果是C。main() char *p="3697","2584"int i,j; long num=0;for(i=0;i<2;i+) j=0;while(pij!='0') if(pij-'0')%2) num=10*num+pij-'0'j+=2;printf("%dn",num);A 35 B 37 C 39 D 397520 下列程序运行后的输出结果是A。void main() char str="The_Microsoft" int n=4;sub(str,0,n-1);sub(str,0,strlen(str)-1);printf("%sn",str);sub(str,n1,n2)char *str;int n1,n2; char c,*p;p=str+n2;str=str+n1;while(str<p) c=*str; *str=*p; *p=c;str+; p-;A tfosorciMThe_ B. ehT_Microsoft C tfosorciM_ehT D. Microsoft_The二 填空题(每空3分,共30分)1 以下程序的定义语句中,x1的初值是 2 ,程序运行后输出的内容是 2468 。main() int x=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,*p4,i;for(i=0; i<4; i+) pi=&x2*i+1; printf("%d", pi0); printf("n");2 以下程序的输出结果是 2 5 。void swap(int *a, int *b) int *t;t=a; a=b; b=t;main() int i=2,j=5,*p=&i,*q=&j;swap(p,q); printf("%d %dn",*p,*q)3 以下程序的输出结果是 4 。main() int a5=2,4,6,8,10, *p;p=a; p+;printf("%d", *p);4 以下程序的输出结果是_55_。#define M 5#define N M+Mmain() int k;k=N*N*5; printf("%dn",k);5 若有定义语句:int a4=0,1,2,3,*p;p=&a1;则+(*p)的值是 2 。6 若有定义:int a23=2,4,6,8,10,12;则*(&a00+2*2+1)的值是 12 ,*(a1+2)的值是 12 。7 若有程序段:int *p3,a6,i;for(i=0;i<3;i+) pi=&a2*i ;则*p0引用的是a数组元素 a0 ,*(p1+1)引用的是a数组元素 a3 。三 程序填空题(每空3分,共30分)1 下面函数的功能是从输入的十个字符串中找出最长的那个串,请填空使程序完整。void fun(char str1081,char *sp) int i;*sp = 【1】str0 ;for(i=1;i<10; i+)if(strlen(*sp)<strlen(stri) 【2】*sp=stri ;2 下面函数的功能是将一个整数字符串转换为一个整数,例如:"1234"转换为1234,请填空使程序完整。int chnum(char *p) int num=0,k,len,j;len=strlen(p);for( ; 【3】*p ; p+) k= 【4】*p-'0' ; j=(-len);while( 【5】j- ) k=k*10;num=num+k;return (num);3 下面函数的功能使统计子串substr在母串str中出现的次数,请填空使程序完整。int count(char *str, char *substr) int i,j,k,num=0;for(i=0; 【6】stri ;i+)for( 【7】j=i ,k=0;substrk=strj;k+,j+)if(substr 【8】k+1 =0) num+ ; break ; return (num);4 下面函数的功能是用递归法将一个整数存放到一个字符数组中,存放时按逆序存放,如483存放成“384”,请填空使程序完整。void convert(char *a, int n) int i;if(i=n/10)!=0) convert( 【9】a+1 ,i);else *(a+1)=0;*a= 【10】n%10+'0 ;结构体 文件单项选择题(18题每题5分,918题每题6分,共100分)1 有以下说明语句,对结构变量中成员age的正确引用是A。struct student int age; int sex; stud1,*p;A p->age B student.age C *p.age D stud1.student.age2 说明语句如下,则正确的叙述是D。union data int x; char y; float z; a;A data和a均是共用体类型变量B a所占内存长度等于其成员x、y、z各在内存所占长度之和C 任何情况下,均不能对a作整体赋值D a的地址和它的各成员地址都是同一地址3 共用体成员的数据类型B。A 相同 B 可以不同也可以相同C 长度一样 D 是结构体变量4 由系统分配和控制的标准输出文件为D。A 键盘 B 磁盘 C 打印机 D 显示器5 下列关于C语言数据文件的叙述中正确的是 C 。A C语言只能读写文本文件B C语言只能读写二进制文件C 文件由字符序列组成,可按数据的存放形式分为二进制文件和文本文件D 文件由二进制数据序列组成6 若要用fopen函数建一个新的二进制文件,该文件要既能读也能写,则文件方式字符串应该为B。A "ab+" B "wb+" C "rb+" D "ab"7 下列程序运行后的输出结果是A。struct s int n; char *c; *p;char d='a','b','c','d','e'struct s a=10,&d0,20,&d1,30,&d2,40,&d3,50,&d4;#include <stdio.h>main() p=a;printf("%dn",+p->n);printf("%dn",(+p)->n);printf("%cn",+(*p->c);A 11 B 11 C 10 D 1020 20 20 20c b c b8 已知struct student char *name; int student_no; char grade; ;struct student temp,*p=&temp;temp.name="chou"则下面不正确的是B。表达式 值A p->name chouB (*p)->name+2 hC *p->name+2 eD *(p->name+2) o9 下面程序运行后,其输出结果是B。#include<stdio.h>struct tree int x; char *s; t;func(struct tree t) t.x=10; t.s="computer" return 0; main() t.x=1; t.s="minicomputer" func(t); printf("%d,%sn",t.x,t.s);A 10,computer B 1,minicomputer C 1,computer D 10,minicomputer10 下列程序的输出结果是B。#include<stdio.h>main() union int i2;long k;char c4; t,*s=&t;s->i0=0x39;s->i1=0x38;printf("%lx ",s->k);printf("%cn",s->c0);A 390038 39 B 380039 9 C 3938 38 D 3839 811 若已定义了如下的共用体类型变量x,则x所占用的内存字节数为C。union data int i; char cha; double f; x;A 7 B 11 C 8 D 1012 如下说明语句:enum A A0=1,A1=3,A2,A3,A4,A5;enum A B;执行 B=A3; printf("%dn",B); 输出是A。A 5 B 3 C 2 D 编译时出错13 有以下说明语句,则结构变量s的成员num的不正确引用是B。struct student int num;int age;s,*p;A s.num B *p.num C p->num D (*p).num14 以下各选项试图说明一种新的类型名,其中正确的是 C 。A typedef integer int; B typedef integer=int;C typedef int integer; D typedef int=integer;15 运行下面程序,其输出结果是C。#include <stdio.h>struct sample int a,b; char *ch; ;main() struct sample arg;arg.a=1000;arg.b=100;arg.ch="abcd"f1(arg);f1(struct sample param) param.a+=param.b;param.ch2='x'printf("%dn",param.a);printf("%sn",param.ch);A 1000 B 1100 C 1100 D 100abcd abcd abxd abcd16 fwrite函数的一般调用形式是D。A fwrite(buffer,count,size,fp); B fwrite(fp,size,count,buffer);C fwrite(fp,count,size,buffer); D fwrite(buffer,size,count,fp);17 C语言文件操作函数fread(buffer,size,n,fp)的功能是B。A 从文件fp中读n个字节存入bufferB 从文件fp中读n个大小为size字节的数据项存入buffer中C 从文件fp中读入n个字节放入大小为size字节的缓冲区buffer中D 从文件fp中读入n个字符数据放入buffer中18 若有如下定义:struct data int i; char ch; float f; b;则结构体变量b占用内存的字节数是 A 。A 7 B 4 C 1 D 2指针一 单项选择题(每题2分,共40分)DACBBBBBAC1-5 6-10BACCADADAA11-15 16-20二 填空题(每空3分,共30分)12521246861222 5612347a04557a3三 程序填空题(每空3分,共30分)【1】 str0 【6】 stri【2】 *sp=stri 【7】 j=i【3】 *p 【8】 k+1【4】 *p-'0' 【9】 a+1【5】 j- 【10】n%10+'0'结构体 文件单项选择题(18题每题5分,918题每题6分,共100分)BABBBADBDC1-5 6-10DBACABCC11-15 16-188 - 文 体0'0 -+【 '*+ = * 分 ,空空序 0 分 分每空 - 是的占 体 ; 义下若 据字入 文 缓节 为入个读 存的字 小个 文 字 件 能的 , ( 数件语) , , ;) , ) ,( 式调的数 0 0 ) % ). % '' =. ) """ =. 0 ( , < 果输序面 = 的中名类一图各 - * 用正 变结语以出译 出;," ,0 句明下 ; 为字用 型类下义定 0 )0,"% )> " = ( 果输程列 ,). , % " = ; ( ; " = 0 ( * . 果输后运面 + -( + > 不" " . &, ;* 已 0 ) (" " ) )+ )>+, " =( , ,0 ''' ' * 是出行程 + 为符字则能能要该件的个函 组序制二文本件进式放的,组字件文文写言语文文读语 确中件数 关示 打 盘 件输准制分变构是 一相可不可 型数体地一址员它地赋体作均下之长存各 于等占变类共 述确,如 . . , ; 确 员变对句下分0共 每择文 00% 0=+ ), 】 )/= ( 整序空, 成存如,按放组符到存一归是的面) = + += 0, = (+ ; (00 , , 整序空填次中 串 计统功函) + 0* -【( ) ;''】 =+ ;) , , 整序空, 换 如,一为字整将能面 =*【) )*( + ( 】= * ( 整序空请个最中字个输能函分 共 ( 素数是引 * 0素组的0 &) ; 段序 的+* 是 *; = 义 的*+ ; 0 定) " ; ( + _ _结的程),% + , ( 结序下 ,* " ;, &,=, , ( * * * 出序) ( ;0 ( * + =( , , , , , ( 是内后行程 值的 中语程分 分每空 _ - + * ; + , * , ) ( ) ,0 )-, ( = ( 出后运 ) , % ''- + 0 )0-( '0! 0=+ <0 0 ; " (果出后序以 , ) " " ),(" = "= ( *; * 果出后程 ) ; " = ( ; +)()0=( * 输行执错语 ) ("% )+ ) + <= = * * " " ( < 结运序出) (= * = - ; = 的正中串指 到个前字所现以列中循+ 0 串个向各 变义已、量 相相 变容内变指 相长字所和中组0 以 的述以句 ;*" 0 序下设指的指是返函该数指是整一是数函的向一数指构量针指组 个 义的) 句说 值的 *)0(式 *, = , , 知&= = * = 是不写,数量指的相句的许言句确的是,错针指向素个每,数是型型素数数个针一法确面;0* 句为址 零标 零为 定 。则指空 & 该的针指; :指化个 是 +* * + ,= 句句下 & * ;= ; 化初和的量针 则, 定 , ,) )+(/( ; , ( ) 果结行运 ) +(" = ( * ( 是出后运 值 0值 值 误句果后)(*句列 )+()( 义宏下识标0用符识替用编序 符识0用处进程序编0数值 标中定确下以0 定中程行中程序是理命预序令义的合 结表分能行理处令理处行始”是凡 中叙分0共每题指 每0中始理理能 合的命是程中 以定中0序用0序用0识义 + *)句 0 出是 "+) 运果 ( ; ( , 量化 ; 句 , *+ 个 指 &指。 为 标址 ;确一个型是每指错确许相指写是 = 知 , , 式)值 说 的个组量数一是是数是指序 以的0和相变变相 变向 0中以前 中 = *()结 = ; + ) 错 ()+ ( " 出 ;* =( ) 以后( 0<+ ( +- , 后 (-0 )(), + * _ 空 程的值内是 , , 0 序 * (,&, ,结 ,+%)的 +( " * ;是* 段 ;) 的素 数素 分输中请整 】 * 面字, 换整 , ; = (-0 功 串次整 , ( (=0 = 的是到按存 序 =) 】)0 文择 共句员确 . , 共占于存下均它员体型 可不 是分输 件 文言文组放进本序 件要则 是 * ' , , + " ; > - 后 =" %,) 程 >%,) 0 定下 为 句 "出 以变 正 * 各类的 序果 = " = ' .% ) 数的 ( ) , ; 数 ,能 个小的 读节 文据 义 ; 占 - 分 空 * + ' 8