省C真题解析算法归纳_第1页
省C真题解析算法归纳_第2页
省C真题解析算法归纳_第3页
省C真题解析算法归纳_第4页
省C真题解析算法归纳_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

江苏省二级C语言考试题解、辅导与算法归纳计算机学院基础部二ОО九年九月目录TOC\o"1-2"\h\z\u部分重要考点疑难精解1一、数据类型(常量与变量)1二、数组与指针、字符串处理2三、函数4四、共用体、结构体与单向链表52007年春~2009年春笔试真题原题、答案及解析82007年春季真题82007年秋季真题142008年春季真题212008年秋季真题282009年春季真题342007年春季真题参考答案412007年秋季真题参考答案412008年春季真题参考答案412008年秋季真题解析422009年春季真题解析462009年春季上机真题及参考答案502009年春第一套502009年春第二套522009年春第三套532009年春第四套542009年春第五套562009年春第一套参考答案582009年春第二套参考答案592009年春第三套参考答案612009年春第四套参考答案622009年春第五套参考答案64C语言常考算法归纳66应当掌握的一般算法66详细讲解66部分重要考点疑难精解一、数据类型(常量与变量)1.字符常量字符常量是用两个单引号前后括住的单个字符来表示。其中转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。转义字符主要用来表示那些用一般字符不便于表示的控制代码(用其ASCII码值的八进制或十六进制表示)。因为ASCII码表中字符的最大码值为127或255,而127=(177)8=(7F)16,255=(377)8=(FF)16,所以八进制形式最多要用3位、十六进制形式最多要用2位就够表示了。其中'\ddd'即表示是1~3位8进制数对应的符号,'\xhh'是1~2位16进制数对应的符号,比如:'\101',(101)8即(65)10,是字符'A'的ASCII码值,故'\101'表示字符'A';'\x41',(41)16即(65)10,也表示字符'A'。由于在内存中,字符数据以ASCII码存储,它的存储形式就与整数的存储形式类似,于是,一个字符数据既可以以字符形式处理、输出,也可以以整数形式处理、输出。但容易出现溢出问题(C语言编译不报错),例如:(07秋)24.若有程序段“charc=256;inta=c;”,则执行该程序段后a的值是______。A.256B.65536C.0D.-1由于8个二进制位所能表示的最大无符号整数是(11111111)2,即(255)10,而(256)10=(28)10=(100000000)2,最高位1溢出被舍弃,故本题结果为0。2.符号常量及宏定义符号常量的定义实际是“宏”定义的特例。所谓“宏”定义就是在程序的开始将一个“标识符”定义成“一串符号”,这个“标识符”称为宏名;在源程序中可以出现这个宏,称为“宏引用”或“宏调用”;在源程序编译前,将程序清单中每个“宏名”都原样替换成对应的“一串符号”,称为“宏替换”或“宏扩展”。为了区别于一般的变量名等,宏名通常用大写字母组成。宏定义是以“#define”开头的编译预处理命令,分为无参宏和带参宏两种。NULL、EOF是系统提供的符号常量,分别与0、-1等值,使用前必须在程序开头加上“#include"stdio.h"或#include<stdio.h>”编译预处理命令。NULL一般用来表示空地址值,与0、'\0'可等值互换使用;EOF为一些系统函数的返回值。3.指针变量及其运算指针是一种数据类型。所谓指针,就是指存放数据的内存地址。指针变量中存放的数据就是地址值。指针变量的定义形式是:数据类型名*指针变量名;注意:①定义时指针变量名前的*仅仅是一个标志,不具备“取内容符”的含义;②指针变量必须在获得合法空间的地址值之后,方能进行各种运算、处理;③指针变量可以与整数进行加减运算,例如,有下列程序段:inta,*p;p=&a;若p中值为FFDE(十六进制),则p+1的值为FFE0,即前者加上2的结果,含义是p+1为p所指数据空间的下一个数据空间的地址值,int型数据占据的空间字节数为2;④两个同样类型的指针变量可以进行减法运算,运算结果为整数,值为两个指针变量所指空间地址之间的空间个数值(有正、负之分)。二者不能进行加法运算。例如,有下列程序段:inta,b,*p,*q;p=&a;q=&b;若p值为FFDE,q值为FFE0,则p-q的值为-1,q-p的值为1。注意,int型数据占据的一个空间字节数为2。⑤两个同样类型的指针变量可以进行关系运算,上例中,p<q是成立的。二、数组与指针、字符串处理1.字符串、字符数组与指针由于在C语言中字符串只有常量形式,没有变量形式,故而用字符数组、字符指针来灵活处理字符串。1)用字符数组存放字符串字符串可以存放在字符数组中,但字符数组中存放的未必是字符串。例如:chara[]={'H','i','\0'};charb[]={'B','y','e'};charc[]="Go";字符数组a、b、c的长度均为3,但a、c中存放的是字符串,b中存放的不是字符串。一定要注意'\0'是字符串的结束标志;还要注意在定义的同时可以将字符串用“=”赋值给字符数组,定义之后必须借助strcpy函数才能将字符串赋值给字符数组,千万不能用“=”赋值。2)用字符指针指向字符串字符串指针变量的定义说明与指向字符变量的指针变量的说明是相同的。只能按对指针变量的赋值不同来区别。如果字符串已经存放在某个字符数组中,可以用赋值方式将指针变量指向该字符数组,以后可以用指针变量来处理字符数组中存放的字符串,也可以使用指针变量来处理其中的单个字符,处理方法类似于一维数组。C语言允许直接使用字符串常量,并不一定要求字符串存放在字符数组中。这样的字符串常量可以用字符型指针变量指向它。将指针变量指向字符串常量的方法有两种:[法一]char*p="Hello";[法二]char*p;p="Hello";上述两种方法的含义均是:先让字符串常量占据连续空间,再将该空间的首地址赋值给指针变量。以后就可以使用该指针变量来处理字符串或字符串中的单个字符了。3)使用字符指针和字符数组处理字符串的区别先看以下几组对比程序段:(1)char*p;chara[10];strcpy(p,"Hello");×strcpy(a,"Hello");√前者错,因为p未指向任何合法空间,就用strcpy函数给p所指空间赋值是危险的。后者是正确的,但要注意,在定义时要使数组具有足够的存储空间。(2)char*p;chara[10];p="Hello";√a="Hello";×后者错,因为a是数组名,是数组首地址,是常量,不可以出现在赋值号左边。前者是正确的,先让字符串常量占据合法的连续空间,再将该空间的首地址赋值给指针变量。(3)char*p,a[10];chara[10];p=a;strcpy(a,"Hello");√strcpy(p,"Hello");√二者都正确,完全等价,都是将字符串常量赋值给数组a对应的空间,前者只是先让p指向数组a对应的空间。(4)char*p,a[10];chara[10];p=a;strcpy(a,"Hello");√p="Hello";√虽然二者都正确,但后者是将字符串常量赋值给数组a对应的空间,前者只是先让p指向数组a对应的空间,然后让字符串常量占据另外合法的连续空间,再将该合法空间的首地址赋值给p,此时p已不指向数组a了。2.二维数组及指针1)二维数组的含义一个二维数组可以看成若干个一维数组。例如,有定义:inta[2][3];,可以看成是2个长度为3的一维数组,这2个一维数组的名字分别为a[0]、a[1]。其中名为a[0]的一维数组元素有a[0][0]、a[0][1]、a[0][2];名为a[1]的一维数组元素有a[1][0]、a[1][1]、a[1][2]。2)指向二维数组的指针设有如下定义和赋值:inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};int*p,(*q)[3];p=&a[0][0];q=a;则有下列存储关系:pp+1q地址101103105123456789101112q+3由于C语言允许将一个二维数组分解为多个一维数组来处理。因此数组a可分解为四个一维数组,即a[0]、a[1]、a[2]、a[3],每一个一维数组又含有三个元素,因此,a[0]、a[1]、a[2]、a[3]是一维数组的名字,是对应一维数组的首地址。而C语言规定,数组名就是数组的首地址,因此,a是二维数组的首地址。&a[0][0]即p显然也是二维数组的首地址,那么与a有什么区别呢?二者的值相等,根据上图的假设,地址值均为101,但p+1指向下一个元素a[0][1],值为103,而a+1指向下一行,值为107。由此,我们通常将p称为列指针(同指向变量的指针),a称为行指针。但是a是数组名,是常量,于是,可以按如下格式定义一个二维数组对应的行指针变量:类型说明符(*指针变量名)[所指二维数组的第二维长度值];例如,上例中的q就是一个可以指向a的行指针变量。3)二维数组元素的引用设有上例的定义和赋值,则二维数组元素的引用如下:下标法列指针表示行指针表示a[0][0]*p或p[0]**q或*(*(q+0)+0)或q[0][0]a[0][1]*(p+1)或p[1]*(*(q+0)+1)或q[0][1]a[0][2]*(p+2)或p[2]*(*(q+0)+2)或q[0][2]………………a[i][j]*(p+i*3+j)或p[i*3+j]*(*(q+i)+j)或q[i][j]………………a[3][2]*(p+11)或p[11]*(*(q+3)+2)或q[3][2]【识别技巧】由上图可以发现:行指针加上一个*或一个[]即为列指针,列指针加上一个*或一个[]即为二维数组的一个元素。反之,二维数组的元素去掉一个*或去掉一个[]或加上一个&即为列指针,列指针去掉一个*或去掉一个[]或加上一个&即为行指针。例如:(07秋)26.若有声明“inta[3][4],*p=a[0],(*q)[4]=a;”,则下列叙述中错误的是__________。A.a[2][3]与q[2][3]等价B.a[2][3]与p[2][3]等价C.a[2][3]与*(p+11)等价D.a[2][3]与p=p+11,*p等价显然只有B是错误的,因为p是列指针,不可以加两个[],有了上述技巧,本题一眼就能看穿。三、函数1.参数处理顺序所有函数的参数处理顺序都是从右至左的,输出时仍按各参数原有次序显示在屏幕上。例1:有如下程序段:inta=3;printf("%d,%d\n",a,++a);显示结果为:4,4(而不是3,4)。例2:(2001春填空题第7题)func(inta,intb){returna+b;}main(){intx=6,y=7,z;z=func(func(x++,y++),func(--x,--y));printf("%d",z);}以上程序输出结果是22(所用编译系统传递函数参数的顺序为自右向左)。2.库函数根据考试大纲,必须掌握或熟悉的库函数有:1)数学函数(头文件math.h):abs()、fabs()、sin()、cos()、tan()、asin()、acos()、atan()、exp()、sqrt()、pow()、fmod()、log()、log10()。2)字符串处理函数(头文件string.h):strcmp()、strcpy()、strcat()、strlen()。3)字符处理函数(头文件ctype.h):isalpha()、isdigit()、islower()、isupper()、isspace()。4)输入输出函数(头文件stdio.h):getchar()、putchar()、gets()、puts()、fopen()、fclose()、fprintf()、fscanf()、fgetc()、fputc()、fgets()、fputs()、feof()、rewind()、fread()、fwrite()、fseek()。5)动态存储分配函数(头文件stdlib.h):malloc()、free()。以上库函数的功能请参看教科书,并请注意常用库函数的返回值。【注意】上机考试的改错题允许添加编译预处理命令,题目中会出现“使用了某个库函数,但没加相应的头文件”的错误,此时若忘记该库函数对应的头文件,可将光标放在库函数出现的位置,再按“Ctrl+F1”组合键即会出现头文件名提示。然后按“Esc”键回到编辑状态。参见下面的“2009年春季上机试题第5套”。3.有参函数的定义类型说明符函数名(形式参数表列)[形式参数说明序列]{说明定义部分可执行语句部分}其中[形式参数说明序列]通常省去,而是将“形式参数说明”放在第一行函数头的()中,此时,各参数即使类型相同,之前都必须分别加上类型说明符,之间用逗号分隔。另外,在形式参数中以数组形式说明的量,会被转化成等效的指针变量。例如:(07春)27.以下程序段中,有语法错误的是______。A.fun(charaa[10])B.fun(char*aa){while(*aa)printf(“%c”,*aa++);}{while(aa[0])printf(“%c”,*aa++);}C.main()D.main(){char*aa=”Hello!”;{charaa[10]=”Hello!”;while(*aa)printf(“%c”,*aa++);while(*aa)printf(“%c”,*aa++);}}【解析】答案是D。因为aa是数组名,是地址常量,不可以进行++运算。而A选项中,虽然aa也以数组形式加以说明,但它是形式参数,立即被转化成“char*aa”而被当作指针变量使用。四、共用体、结构体与单向链表1.共用体变量、数组的定义有三种方法可以定义共用体变量、数组:先定义共用体类型,然后定义变量、数组;同时定义共用体类型和变量、数组;定义无名称的共用体类型的同时定义变量、数组。例如:①unionGYT{chara[2];intb;};GYTx,y[5];②unionGYT{chara[2];intb;}x,y[5];③union{chara[2];intb;}x,y[5];上述三种方法完全等价。【注意】(1)共用体变量所占内存单元数目等于占用单元数目最多的那个成员的单元数目。(2)共用体变量各成员占据相同的起始地址,每一瞬时只有一个成员起作用,成员的引用方式是:共用体变量名.成员名。例如,有如下定义和赋值:unionGYT{chara[2];intb;}x;x.a[0]='\x41';x.a[1]='\x22';其中字符'\x41'的ASCII码值为41H,二进制值为1000001B(书写时从高位到低位);字符'\x21'的ASCII码值为22H,二进制值为100010B。占据内存情况如下(不足8位,高字节补0):低字节x.a[0]x.a[1]高字节1000001001000100x.b所以当执行printf("%d\n",x.b);时,输出8769,因为x.b中存放着(0010001001000001)2,十进制值为即为8769。(3)共用体变量不能初始化,不能被整体引用,只能引用共用体变量中的成员。2.指针与结构体1)指向结构体变量的指针变量的定义、初始化、赋值及使用结构指针变量的定义形式:struct结构体类型名*结构指针变量名;例如有:structJGT{charname[10];intage;}x,*p=&x;则,结构体变量x的成员引用有如下三种等价形式:x.age(*p).agep->age其中,第二种的()不能省,因为成员运算符“.”的优先级比“*”高。“->”为指向成员运算符,优先级也是最高的。3.单向链表的逆向建立(先产生表上最后一个结点,再产生倒数第二个……直到产生第一个结点)假设想创建如下链表:1011012000411304101200419600^200410450304200405530.5411200401550200419600^200410450304200405530.54112004015502000head#include"stdio.h"#include"stdlib.h"structSTU{longnum;/*学号*/floatscore;/*成绩*/structSTU*next;};intn;/*全局变量,结点个数*/structSTU*nxcreate()/*逆向建表函数,比顺次建表的算法容易*/{structSTU*head,*p;n=0;head=NULL;p=(structSTU*)malloc(sizeof(structSTU));printf("\nInputthenode'snumber,numis0stop\n");/*读入学号,为0结束*/scanf("%ld%f",&p->num,&p->score);while(p->num!=0)/*用学号来控制结点个数,为0则终止建表*/{n=n+1;p->next=head;head=p;/*每产生一个前面的结点,就要修改头指针*/p=(structSTU*)malloc(sizeof(structSTU));scanf("%ld%f",&p->num,&p->score);}return(head);}2007年春~2009年春笔试真题原题、答案及解析2007年春季真题一、选择题21.以下关于C语言源程序的叙述中,错误的是______。A.一个C源程序由若干个函数组成,其中必有且仅有一个名为main的函数定义B.函数定义由函数头部和函数体两部分组成C.在一个函数定义的函数体中允许定义另一个函数D.在一个函数定义的函数体中允许调用另一个函数或函数自身22.以下表示中,不能用作C语言常量的是______。A.0ULB.(long)123C.1e0D.’\x2a’23.以下标识符中,不能用作变量名或自定义函数名的是______。A.mainB.scanfC._floatD.sizeof24.以下表示数学式:“a<b<c”的逻辑表达式中,错误的是______。A.a<b<cB.a<b&&b<cC.!(a>=b)&&!(b>=c)D.!(a>=b||b>=c)25.以下程序运行后的输出结果是______。A.22B.72C.75D.62main(){chara[7]="a0\0a0\0";inti,j;i=sizeof(a);j=strlen(a);printf("%d%d",i,j);}26.下面关于循环语句for、while、do_while的叙述中,正确的是______。A.三种循环语句的循环体都必须放入一对花括号中B.三种循环语句中都可以缺省循环终止条件表达式C.三种循环语句的循环体都至少无条件执行一次D.三种循环语句都可能出现无穷循环27.以下程序段中,有语法错误的是______。A.fun(charaa[10])B.fun(char*aa){while(*aa)printf(“%c”,*aa++);}{while(aa[0])printf(“%c”,*aa++);}C.main()D.main(){char*aa=”Hello!”;{charaa[10]=”Hello!”;while(*aa)printf(“%c”,*aa++);while(*aa)printf(“%c”,*aa++);}}28.若有声明“inta[]={1,2,3,4},*p,i;”,则以下程序段中不能输出13的是______。A.for(i=0;i<4;i+=2)printf(“%d”,a[i]);B.for(p=0;p<4;p+=2)printf(“%d”,a[p]);C.for(p=a;p<a+4;p+=2)printf(“%d”,*p);D.for(p=a,i=0;i<4;i+=2)printf(“%d”,p[i]);29.若有如下的类型定义和变量声明,则在给出选项中值不为7的表达式是______。A.ptr->aB.(++ptr)->aC.x[1].aD.x[0].b->astructss{inta;structss*b;}x[3]={{5,&x[1]},{7,&x[2]},{9,0}},*ptr=&x[0];30.若需要对一个数据文件abc.txt中的数据做加密处理并且限定只作一次打开文件操作,则在“fp=fopen(“abc.txt”,模式字符串);”中,模式字符串应当是______。A."w+"B."r+"C."a+"D."r"二、填空题基本概念1.在声明局部变量时,不能使用的存储类别标识符是_________。2.与整型数学算式等价的C语言表达式是_________。3.在以下程序的main函数中,语句“fun(x,10);”内的实参x表示数组x的_________。voidfun(inta[10],intn){inti;for(i=0;i<=n;i++)a[i]++;}main(){intx[10]={0};fun(x,10);}4.已知程序中有声明“inta;longb;”若需要接收从键盘输入的电话号码字符串(010)64782656(其中010是区号,64782656是电话号码)并将其中的区号、电话号码分别存储到变量a、b中,则实现该功能的输入语句应为“scanf(“__________“,&a,&b);”。5.若要使表达式p="jiangsu"无任何错误(包括语法错误和警告错误),p的声明形式应为_________。阅读程序6.以下程序运行后输出结果为_________。#include"stdio.h"inta;intm(inta){staticints;return(++s)+(--a);}voidmain(){inta=2;printf("%d",m(m(a)));}7.以下程序运行后输出结果是_________。#include"stdio.h"enumdays{mon=1,tue,wed,thu,fri,sat,sun}today=tue;voidmain(){printf("%d",(today+2)%7);}8.以下程序运行后输出结果为_________。#include"stdio.h"intmystery(inta,intb){if(b==1)returna;elsereturna+mystery(a,b-1);}voidmain(){intx=5,y=3;printf("%d\n",mystery(x,y));}9.以下程序运行后输出结果第一行为_________,第二行为_________。#include"stdio.h"voidmain(){inti=5;do{switch(i%2){case0:i--;break;case1:i--;continue;}i--;printf("%d\n",i);}while(i>0);}10.以下程序运行后输出结果中第一行为_________,第二行为_________。#include<stdio.h>intfun(inta[],intn,intb[]){inti=0,j,m=0,c,x;for(i=0;i<n;i++){x=a[i];c=1;for(j=i+1;j<n;j++)if(a[j]==x)c++;else{i=j-1;break;}if(j>=n)i=j;if(c==1)b[m++]=x;else{b[m++]=-c;b[m++]=x;}}returnm;}voidmain(){intx[]={4,4,4,4,4,4,4,4,1,2},y[10],i,j,n=10;n=fun(x,n,y);for(i=0;i<n;i++){if(i%2==0)printf("\n");printf("%5d",y[i]);}}11.以下程序运行后输出结果第一行为_________,第二行为_________,第三行为_________。#include"stdio.h"#defineN3main(){inta[N][N],b[N*N]={1,1},i,j;for(i=2;i<N*N;i++)b[i]=b[i-1]+b[i-2];for(i=0;i<N;i++)for(j=0;j<N;j++)a[j][i]=b[i*N+j];for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%5d",a[i][j]);printf("\n");}}12.以下程序运行后输出结果第一行为_________,第二行为_________,第三行为_________。#include"stdio.h"#include"stdlib.h"structnode{chardata;structnode*next;};structnode*insert(structnode*h,charc){structnode*p1,*p2,*p;p=(structnode*)malloc(sizeof(structnode));p->data=c;p->next=NULL;if(h==NULL)h=p;else{p1=p2=h;while(c>p1->data&&p1->next!=NULL){p2=p1;p1=p1->next;}if(c<=p1->data)if(p1==h){p->next=h;h=p;}else{p2->next=p;p->next=p1;}else{p1->next=p;}}returnh;}structnode*del(structnode*h){structnode*p=h;while(p!=NULL){if(p->data%2==0)p->next=p->next->next;p=p->next;}returnh;}voidprint(structnode*h){structnode*p=h;while(p!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}voidmain(){structnode*head=NULL;char*item="32659",*p=item;puts(item);while(*p)head=insert(head,*p++);print(head);del(head);print(head);}完善程序题13.以下程序的功能是:用简单迭代法求方程cos(x)-x=0在区间(0,1)上的一个近似实根。迭代公式为:Xn+1=cos(Xn),(n=0,1,2……),当|Xn+1-Xn|<10-6时,Xn+1即是方程cos(x)-x=0在X0附近的一个误差小于10-6的近似实根(此根的近似值是0.7391)。#include<stdio.h>#include<math.h>floatroot(floatx0){floatx1;_________;do{x0=x1;x1=cos(x0);}while(_________);returnx1;}voidmain(){floatx;x=_________;printf("x=%f,cos(%f)-%f=%f",x,x,x,cos(x)-x);}14.以下程序功能是找到具有这样特性的正整数A:若将A的个位数p移到首位,所得到的数为原数的p倍。例如,将102564的个位数4移到首位得到410256,而410256=102564×4,因此数102564具有此特性。对于p=2,3,4,5,6,7,8,9均存在具有此特性的整数,但除本例外,其余数的位数均超过12,不能用普通整型数表示,但可用类似手算的方法找到它们。函数intsearch(intp)的功能是:找到末位数是p且具有上述特性的正整数A,以十进制形式将A保存到数组a中,每个数组元素保存A的一位数(个位数p保存在a[0]中,十位数保存在a[1]中,百位数保存在a[2]中,其他位依次类推)。算法提示:(1)将p保存到a[0],将a[0]向a[1]的进位值置为0;(2)对于i=1,2,3,……,计算“a[i-1]×p+a[i-1]向a[i]的进位值”得到t,若t=p则A已找到,否则将t的个位数保存到a[i],t的十位数作为a[i]向a[i+1]的进位值。#include<stdio.h>#defineN60inta[N];intsearch(intp){inti,t,c=0;a[0]=_________;for(i=1;;i++){t=_________;if(t==p)break;a[i]=t%10;c=t/10;}returni;}voidmain(){intp,i,n;scanf("%d",&p);n=search(p);printf("p=%d,a=",p);for(i=_________;i>=0;i--)printf("%d",a[i]);}15.以下程序的功能是:main函数通过调用fun1函数将数组S的4个元素中大小等于平均值的那些数保存到a数组,小于平均值的那些数保存到b数组,变量n、m分别保存a数组和b数组中数据的个数。输出数组S中数据的平均值和a、b数组中的数据。#include"stdio.h"#defineN4doublefun1(int*x,int*y,int*z,int*n,int*m){inti;doubleav=0;_________;for(i=0;i<N;i++)_________;av/=N;for(i=0;i<N;i++)if(_________){y[*n]=x[i];(*n)++;}else{z[*m]=x[i];(*m)++;}returnav;}voidmain(){intS[N]={60,80,50,90},a[N]={0},b[N]={0},t,i,j,m,n;doubleave;ave=fun1(S,a,b,&n,&m);printf("%f\n",ave);for(i=0;i<n;+i++)printf("%3d",a[i]);printf("\n");for(i=0;i<m;i++)printf("%3d",b[i]);}16.以下程序的功能是:在不改变a数组中数据存储位置的前提下,按a数组第一列元素的值从大到小依此输出a数组的各行元素。实现算法:将a数组每行第一个元素的值和地址依次保存到index结构数组相应元素的成员x和y中,对index数组按成员x的值从大到小排序,依次输出index数组每个元素的成员y指向的a数组中一行的全部元素的值。a数组中元素的值:程序输出结果:204030606030301020405030405030301020606030204030#include<stdio.h>structlink{intx,*y;};voidmain(){inta[][3]={{20,40,30},{30,10,20},{40,50,30},{60,60,30}},i,j,k,*p;structlinkindex[4]={0},tmp;for(i=0;i<4;i++){index[i].y=_________;index[i].x=a[i][0];}for(i=0;i<3;i++){k=i;for(j=i+1;j<4;j++)if(_________)k=j;if(k!=i){tmp=index[i];index[i]=index[k];index[k]=tmp;}}for(i=0;i<4;i++){p=index[i].y;printf("\n");for(j=0;j<3;j++)printf("%3d",_________);}}2007年秋季真题一、选择题21.在下列C语言源程序的错误中,通常不能在编译时发现的是_____。A.括号不匹配B.非法标识符C.数组元素下标值越界D.程序结构不完整22.在以下各组标识符中,均可以用作变量名的一组是__________。A.a01,IntB.table_1,a*.1C.0_a,W12D.for,point23.若有声明“longa,b;”且变量a和b都需要通过键盘输入获得初值,则下列语句中正确的是_____。A.scanf("%ld%ld,&a,&b");B.scanf("%d%d",a,b);C.scanf("%d%d",&a,&b);D.scanf("%ld%ld",&a,&b);24.若有程序段“charc=256;inta=c;”,则执行该程序段后a的值是______。A.256B.65536C.0D.-125.若在一个C语言源程序中“el”和“e3”是表达式,“s;”是语句,则下列选项中与语句“for(el;;e3)s;”功能等同的语句是_________。A.el;while(10)s;e3;B.el;while(10){s;e3;}C.el;while(10){e3;s;}D.while(10){el;s;e3}26.若有声明“inta[3][4],*p=a[0],(*q)[4]=a;”,则下列叙述中错误的是__________。A.a[2][3]与q[2][3]等价B.a[2][3]与p[2][3]等价C.a[2][3]与*(p+11)等价D.a[2][3]与p=p+11,*p等价27.若有结构类型定义“typedefstructtest{intx,y[2];}TEST;”,则以下声明中正确的是_________。A.structtestx:B.structx;C.testx;D.structTESTx;28.若有声明“longfun(int*x,intn,long*s);inta[4]={1,2,3,4};longb,c;”,则以下函数调用形式中正确的是___________。A.c=fun(a,4,b);B.c=fun(a[],4,&b);C.c=fun(a[4],4,b);D.c=fun(a,4,&b);29.若有枚举类型定义“enumlistl{xl,x2,x3,x4=6,x5,x6};”,则枚举常量x2和x6代表的值分别是__________________。A.1,6B.1,8C.2,6D.2,830.已知在函数f中声明了局部变量x,如果希望f函数第一次被调用返回后变量x中存储的数据保持到下次f函数被调用时仍可以使用,则在声明x时必须指定其存储类型为____________。A.autoB.registerC.staticD.extern二、填空题●基本概念1.若有声明“inta=5,b=2;”,则表达式“b+=(float)(a+b)/2”运算后b的值为(1)。2.若有声明“chars[l0]="remind";”,执行“puts(s+2);”后的输出结果是(2)。3.若有声明“doublex=10,y=5;”,则计算xy的库函数调用形式是(3)。4.已知某程序中有预处理命令“#include<stdio.h>”,为使语句“zx=fopen("c:\\a.txt","r");”能正常执行,在该语句之前必须有声明(4)。●阅读程序5.以下程序运行时输出结果是(5)。#defineEVEN(x)x%2==0?1:0main(){if(EVEN(5+1))printf("Even");elseprintf("Odd");}6.以下程序运行时输出结果是(6)。#include<stdio.h>main(){ints=1,n=235;do{s*=n%10;n/=10;}while(n);printf("%d\n",s);}7.以下程序运行时输出结果是(7)。#include<stdio.h>intt;intsub(int*s){*s+=1;t+=*s;returnt;}main(){inti;for(i=1;i<4;i++)printf("%4d",sub(&i));}8.以下程序运行时输出结果是(8)。#include<stdio.h>voidf(longx){if(x<100)printf("%d",x/10);else{f(x/100);printf("%d",x%100/10);}}main(){f(123456);}9.以下程序运行时输出结果的第一行是(9);第二行是(10)。#include<stdio.h>intfun(int*x,intn){inti,j;for(i=j=0;i<n;i++)if(*(x+i)%2)*(x+j++)=*(x+i);returnj;}main(){inta[10]={1,5,2,3,8,3,9,7,4,10},n,i;n=fun(a,10);for(i=0;i<n;i++){printf("%5d",a[i]);if((i+1)%3==0)printf("\n");}}10.以下程序运行时输出结果中第一行是(11),第二行是(12),第三行是(13)。#include<stdio.h>main(){inti,j,a[3][3]={0};for(i=0;i<3;i++)for(j=0;j<3;j++)switch(i-j+2){case0:case1:a[i][j]=1;break;case2:a[i][j]=2;break;case3:a[i][j]=3;break;case4:a[i][j]=5;break;}for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%4d",a[i][j]);printf("\n");}}11.以下程序运行时输出结果中第一行是(14),第二行是(15)。#include<stdio.h>#include<string.h>voidfun(charstr[][20],intn){inti,j,k;chars[20];for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++) if(strcmp(str[j],str[k])<0)k=j;strcpy(s,str[i]);strcpy(str[i],str[k]);strcpy(str[k],s);}}main(){charstr[6][20]={"PASCAL","BASIC","FORTRAN","C","COBOL","Smalltalk"};inti;fun(str,6);for(i=0;i<6;i++)printf("%s\n",str[i]);}12.以下程序运行时输出结果的第一行是(16);第二行是(17);第三行是(18)。#include<stdio.h>#defineN10intmerge(inta[],intb[],intc[],intm[][N+1]){inti=0,j,k;while((k=m[0][i])!=2){j=m[1][i];if(k==0)c[i]=a[j];elsec[i]=b[j];i++;}returni;}main(){inta[N]={1,3,5},b[N]={2,4,6},c[2*N],i,n;intm[2][N+1]={{0,1,0,1,0,1,2},{0,0,1,2,2,1,-1}};n=merge(a,b,c,m);printf("%d\n",n);for(i=0;i<n;i++){printf("%d",c[i]);if((i+1)%3==0)printf("\n");}}●完善程序13.程序功能:寻找具有下列特性的四位正整数,其百位数为0,去掉百位数0可得到一个三位正整数,而该三位正整数乘以9等于原四位正整数。例如,6075=675×9,所以6075是具有上述特性的正整数。#include<stdio.h>intfun(intn){inta[4],i,k;k=n;for(i=0;k>0;i++){a[i]=______(19)_______;k/=10;}if(______(20)_______&&(a[3]*100+a[1]*10+a[0])*9==n)return1;elsereturn0;}main(){inti,n=0;for(i=1000;i<10000;i++)if(fun(i))printf("%4d\t",i);printf("\n");}14.程序功能:用牛顿迭代法求方程3x3-3x2+x-1=0在2.0附近的一个实根,精度要求为10-5。函数F求f(x)的值,函数F1求f(x)的一阶导数值。牛顿迭代公式如下:x=x0-f(x0)/f’(x0)#include<stdio.h>#include<math.h>floatF(floatx){returnx*(3*x*(x-1)+1)-1;}floatF1(floatx){return9*x*x-6*x+1;}floatnewtoon(floatx){floatf,f1,x0;do{_____(21)_____;f=F(x0);f1=F1(x0); x=_____(22)_____;}while(fabs(x-x0)>1e-5);returnx;}main(){floatx0;scanf("%f",&x0);printf("Theresult=%.2f\n",newtoon(x0));}15.程序功能:选票统计。二维数组s中保存了投票后10张有效选票上所填写的候选人姓名,结构数组stat中保存统计结果。程序运行后的输出结果是“liu:2wang:5zhao:3”。#include<stdio.h>#include<string.h>typedefstruct{charname[20];/*候选人姓名*/intcount;/*候选人得票数*/}COUNT;intcount(charx[][20],intn,____(23)____){inti,j,k=0;for(i=0;____(24)____;i++){for(j=0;j<k;j++)if(strcmp(st[j].name,x[i])==0){____(25)____;break;}if(j>=k){____(26)____;st[k].count++;k++;}}returnk;}main(){chars[10][20]={"liu","wang","zhao","zhao","wang","liu","wang","zhao","wang","wang"};COUNTstat[5]={0};inti,n;n=count(s,10,stat);for(i=0;i<n;i++)printf("%s:%d\t",stat[i].name,stat[i].count);}16.设一个单向链表结点的数据类型定义为:structnode{intx;structnode*next;};fun函数从h指向的链表第二个结点开始遍历所有结点,当遇到x值为奇数的结点时,将该结点移到h链表第一个结点之前,函数返回链表首结点地址。print函数输出p指向的链表中所有结点的x值。程序运行后的输出结果是“1342”。#include<stdio.h>#defineN4structnode{intx;structnode*next;};voidprint(structnode*p){while(____(27)____){printf("%4d",____(28)____);p=p->next;}printf("\n");}structnode*fun(structnode*h){structnode*pl,*p2,*p3;pl=h;p2=pl->next;while(p2){if(p2->x%2){p3=p2;pl->next=____(29)____;p2=pl->next;p3->next=h;____(30)____;}else{pl=p2;p2=p2->next;}}returnh;}main(){structnodea[N]={{4},{3},{2},{1}},*head=a;inti,num;for(i=0;i<N-1;i++)a[i].next=&a[i+1];a[i].next=0;head=fun(head);print(head);}2008年春季真题一、选择题21.下列叙述中正确的是__________。A.main函数必须出现在其他函数之前B.main函数中至少必须有一条语句C.C程序总是从main函数的第一条语句开始执行D.C程序总是在执行完main函数的最后一条语句后结束22.以下常量表示中正确的是__________。A.\xffB.5LC.aEbD.3.14U23.若程序中已有相应的声明,下列语句中错误的是__________。A.printf(i==4?"%6d\n":"%6d",i);B.i==4?printf("%6d\n",i):printf("%6d",i);C.for(i=10;;i--)if(i==1)break;D.for(i=10;;)if(i--);break;24.若有声明“floatf=123.45678;”,则执行语句“printf("%.3f",f)”后,输出结果是__________。A.1.23e+02B.123.457C.123.456780D.1.234e+0225.若有声明“intx=2,y=1,z=0;”,则下列关系表达式中有语法错误的是__________。A.x>y=2B.z>y>xC.x>y==1D.x==(x=0,y=1,z=2)26.若有声明“intx[10]={0,1,2,3,4,5,6,7,8,9},*p;”,则值不为4的表达式是__________。A.p=x,*(p+4)B.p=x+4,*p++C.p=x+3,*(p++)D.p=x+3,*++p27.若有声明“inti,k=1;unsignedj;”,则下列语句执行时会出现无限循环的语句是________。A.for(j=15;j>0;j-=2)k++;B.for(j=0;j<15;j+=2)k++;C.for(i=0;i<15;i+=2)k++;D.for(i=15;i>0;i-=2)k++;28.已知A盘根目录下有文本文件“data.txt”且程序中已有声明“FILE*fp”,若程序需要先从“data.txt”文件中读出数据,修改后再写入“data.txt”文件中,则调用fopen函数的正确形式是__________。A.fp=fopen("A:\\data.txt","rw");B.fp=fopen("A:\\data.txt","w+");C.fp=fopen("A:\\data.txt","r+");D.fp=fopen("A:\\data.txt","r");29.以下选项均为fun函数定义的头部,其中错误的是__________。A.intfun(intx,inty[])B.intfun(intx,inty[x])C.intfun(intx,inty[3])D.intfun(intx,int*y)30.以下结构变量stu1的声明形式中,错误的是__________。A.typedefstructstu{charname[10];floatscore;}STU;STUstu1;B.#defineSTUstructstuSTU{charname[10];floatscore;}stu1;C.structstu{charname[10];floatscore;}stu1;D.structstu{charname[10];floatscore;}STU;STUstu1;二、填空题(30分)基本概念1.在C语言源程序中,不带任何修饰符的浮点数直接量(例如:3.14)都是按__________类型数据存储的。2.若有声明“chars1[10]="ABCDE",s2[10]="A\\0";”,则语句“printf("%d",strlen(strcpy(s1,s2)));”的输出结果是__________。3.可以改变局部变量的生存期、但不能改变它的作用域的存储类别是__________。4.C语言有效的预处理命令总是以__________开头。5.若有声明“inta=15,b=20,c=25,e;”,则执行语句“e=a>b?--c:++c;”后变量e的值是__________。阅读程序6.以下程序运行后的输出结果是__________。#include<stdio.h>#defineCount(n)++nmain(){intx=-3,n=8;while(Count(x))n--;printf("%d\n",n);}7.以下程序运行后的输出结果是__________。#include<stdio.h>intfun(intw1,intw2){returnw2-w1;}main(){intw=1,k;k=fun(fun(w+1,w),w);printf("%d\n",k);}8.以下程序运行后的输出结果第一行是__________;第二行是__________。#include<stdio.h>main(){inti,a=0,c=2;for(i=0;i<2;i++)switch(++a,a*c){case1:printf("1");case2:printf("2");case3:printf("3\n");break;default:printf("other\n");}}9.以下程序运行后的输出结果是__________。#include<stdio.h>main(){chara[]="369",*p=a;ints=0,t=1;while(*++p)t*=10;p--;while(t){s+=(*p-'0')*t;p--;t/=10;}printf("%d\n",s);}10.以下程序运行后的输出结果第一行是__________;第二行是__________。#include<stdio.h>structnum{intx,y;}st[]={{1,10},{2,20},{3,30},{4,40},{-1,-1}},s1[2],s2[2];main(){inti=0,j=0,k;for(k=0;st[k].x!=-1;k++){if(st[k].x%2)s1[i++]=st[k];elses2[j++]=st[k];}printf("%d\n%d\n",s1[0].y,s2[0].y);}11.以下程序运行后的输出结果第一行是__________。#include<stdio.h>voidprint(intn);voidprint_n(intn);main(){print(4);}voidprint(intn){if(n==0)return;print_n(n);if(n>0)print(n-1);}voidprint_n(intn){if(n==0)return;printf("%d",n);if(n>1)print_n(n-1);elseprintf("\n");}12.以下程序运行后的输出结果第一行是__________;第二行是__________;第三行是__________。#include<stdio.h>voidsot(inta[3][3]){inti,j,i0,j1,min,max,temp;min=max=a[0][0];for(i=0;i<3;i++){for(j=0;j<3;j++){if(a[i][j]<=min){min=a[i][j];i0=i;}if(a[i][j]>=max){max=a[i][j];j1=j;}}}for(j=0;j<3;j++){temp=a[i0][j];a[i0][j]=a[2][j];a[2][j]=temp;}for(i=0;i<3;i++){temp=a[i][j1];a[i][j1]=a[i][2];a[i][2]=temp;}for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%d",a[i][j]);printf("\n");}}main(){intb[3][3]={{3,2,1},{6,5,4},{9,8,7}};sot(b);}13.以下程序运行时,若在键盘上输入2<Enter>,则输出是__________;若在键盘上输入i<Enter>,则输出是__________。#include<stdio.h>#include<string.h>intstrch(char*s,charch){inti;for(i=strlen(s);i>=0;i--)if(s[i-1]==ch)returni;if(i<0)return0;}main(){charch,s1[]="as123d2nfghhjkm";intk;printf("inputch:");ch=getchar();k=strch(s1,ch);if(k!=0)printf("k=%d\n",k);elseprintf("notfount\n");}完善程序14.某餐厅用苹果、桔子、香蕉、菠萝、梨五种水果制作水果拼盘,要求每个拼盘中恰有三种不同水果。以下程序的功能就是计算可以制作出多少种这样的水果拼盘并列出组合方式。#include<stdio.h>typedefenum{apple,orange,banana,pineapple,pear}Fruit;main(){____________fruits[]={"apple","orange","banana","pineapple","pear"};Fruitx,y,z,p;intk=0,i;for(x=____________;x<=pear;x++)for(y=x+1;y<=pear;y++)for(z=y+1;z<=pear;z++)printf("\n%d%s%s%s",++k,fruits[x],fruits[y],fruits[z]);

温馨提示

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

评论

0/150

提交评论