A. *(p1+1)=1 B. p1[1][1]=1 C. *(*(p2+1)+1)=1 D. p2[1][1]=1答案:答案:B B[填填 空空 题题 ] 若若 有有 声声 明明 “char s[10]=”remind“;”,, 执执 行行“puts(s+2);”后的输出结果是后的输出结果是 答案答案: mind[单选题单选题] 已知有声明:已知有声明:“char a[ ]="It is mine", *p="It is mine";”,,下列叙述中错误的是下列叙述中错误的是 A. strcpy(a,“yes”)和和strcpy(p,“yes”) 都是正确的都是正确的 B. a=“yes”和和p=“yes”都是正确的都是正确的 C. *a 等于等于*p D. sizeof(a)不等于不等于sizeof(p) 答案:答案:B B47[全国完善程序全国完善程序] 以下程序的功能是:借助指针变量找出数组以下程序的功能是:借助指针变量找出数组元素中的最大值所在数组元素的下标值。
元素中的最大值所在数组元素的下标值includemain(){ int a[10],*p,*s; for(p=a;p-a<10;p++) scanf(“%d”,p); for(p=a,s=a;p-a<10;p++) if(*p>*s) s=__________; printf(“index=%d\n”,s-a);}答案:答案:p48(3) 结构类型变量、数组的指针操作结构类型变量、数组的指针操作 ①① 结构变量地址、结构数组元素地址的获取与保存结构变量地址、结构数组元素地址的获取与保存 指向结构变量指针变量的声明、初始化与赋值指向结构变量指针变量的声明、初始化与赋值 ②② 引用指针指向的结构类型变量(结构类型数组元素)的基引用指针指向的结构类型变量(结构类型数组元素)的基本类型成员本类型成员③③结构变量成员的地址、结构数组元素成员的地址获取与保结构变量成员的地址、结构数组元素成员的地址获取与保存指向结构变量成员的指针变量声明、初始化与赋值指向结构变量成员的指针变量声明、初始化与赋值 【【考题解析考题解析】】 49[单选题单选题] 已知有结构定义和变量声明如下:已知有结构定义和变量声明如下: struct student { char name[20]; int score; struct student *h; }stu,*p; int *q;以下选项中错误的是以下选项中错误的是 。
A..p=&stu; B..q=&stu.score; C..scanf("%s%d",&stu); D..stu.h=p; 答案答案: : C C 50[阅阅读读程程序序] 以以下下程程序序运运行行时时输输出出结结果果的的第第一一行行是是 ((1)) ,,第第二行是二行是 ((2)) #include struct s{ int x,*y;}*p;int d[5]={10,20,30,40,50};struct s a[5]={100,&d[0],200,&d[1],300,&d[2],400,&d[3],500,&d[4]};void main( ){ p=a; printf("%5d",p->x++); printf("%5d\n",p->x); printf("%5d",*p->y); printf("%5d\n",*++p->y);} 答案答案: (1) 100 101 (2) 10 20 51[单选题单选题] 设有结构定义及变量声明如下:设有结构定义及变量声明如下: struct product{ char code[5]; float price;}y[4]={"100",100};以下表达式中错误的是以下表达式中错误的是 。
A. (*y).code[0]='2'; B. y[0].code[0]='2'; C. y->price=10; D. (*y)->price=10;答案:答案: D D 52 (4) 指针类型数组的声明和使用指针类型数组的声明和使用【【考题解析考题解析】】[全国单选题全国单选题] 有以下程序有以下程序#includemain(){ char *a[ ]={"abcd","ef","gh","ijk"}; int i; for(i=0;i<4;i++) printf("%c",*a[i]);}程序运行后输出的结果是程序运行后输出的结果是A))aegi B))dfhk C))abcd D))abcdefghijk答案:答案:A[全国单选题全国单选题] 若有定义语句:若有定义语句:int a[4][10],*p,*q[4];且且0<=i<4,则错误的赋值是()则错误的赋值是()A) p=a B) q=a c) q[0]=a D)p=&a[2][1]答案:答案:B53[全国填空题全国填空题] 有以下程序有以下程序#includemain(){ int a[]={1,2,3,4,5,6},*k[3],i=0; while(i<3) { k[i]=&a[2*i]; printf("%d",*k[i]); i++; }}程序运行后的输出的结果是程序运行后的输出的结果是___________ 答案:答案:13554 5. 函数函数 ⑴⑴ 函数定义、函数声明、函数调用函数定义、函数声明、函数调用 (2) 函数调用时函数调用时基本类型基本类型实参的传递与使用。
实参与形参的实参的传递与使用实参与形参的类型兼容性要求实参类型的自动转换类型兼容性要求实参类型的自动转换【【考题解析考题解析】】[单选题单选题] 以下函数定义中正确的是以下函数定义中正确的是 ((25)) A. double fun(double x,double y){ } B. double fun(double x;double y){ }C. double fun(double x,double y);{ } D. double fun(double x,y){ } 答案:答案:A A55[单选题单选题] 以下选项均为以下选项均为fun函数定义的头部,其中错误的是函数定义的头部,其中错误的是 A. int fun(int x,int y[ ]) B. int fun(int x,int y[x])C. int fun(int x,int y[3]) D. int fun(int x,int *y)答案:答案:B[学校单选题学校单选题] 已知函数已知函数fun定义的头部为定义的头部为“void fun(int x, int y[])”,以下,以下fun函数声明中正确的是函数声明中正确的是 。
A.void fun(int x,int y[ ]); B. void fun(int x, int *y);C.void fun(int ,int); D. void fun(int ,int * );答案:答案:C[单选题单选题] 若有声明若有声明“long fun(int *x,int n,long *s);int a[4]={1,2,3,4}; long b,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);答案:答案:D56[单选题单选题] 若函数调用时的实参为变量,则以下关于函数形参若函数调用时的实参为变量,则以下关于函数形参和实参的叙述中正确的是和实参的叙述中正确的是 A. 实参和其对应的形参占用同一存储单元实参和其对应的形参占用同一存储单元B. 形参不占用存储单元形参不占用存储单元C. 同名的实参和形参占用同一存储单元同名的实参和形参占用同一存储单元D. 形参和实参占用不同的存储单元形参和实参占用不同的存储单元答案:答案:D [全国选择题全国选择题] 函数调用语句函数调用语句func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8))); 中中func函数的实函数的实参个数是()。
参个数是() A)3 B)4 C)5 D)8答案:答案:A57[阅读程序阅读程序] 以下程序运行时输出结果是以下程序运行时输出结果是 #include void func(int b){ int a; a=b; b=10; }void main(){ int a=10,b=20; func(b); printf("%d,%d",a,b);} 答案答案: 10, 20 58[阅读程序阅读程序] 以下程序运行时输出到屏幕的结果是以下程序运行时输出到屏幕的结果是 #include void swap(int a,int b) { int t; if(a>b)t=a,a=b,b=t; } void main() { int x=13, y=11, z=12; if(x>y) swap(x,y); if(x>z) swap(x,z); if(y>z) swap(y,z); printf("%d\t%d\t%d\n", x,y,z); }答案:答案:8.. 13 11 1259[阅读程序阅读程序] 以下程序运行时输出结果是以下程序运行时输出结果是 。
#includeint f(int x, int y){ return x+y; }void main(){ double a=5.5, b=2.5; printf("%d",f(a,b));} 答案:答案: 7 760[阅读程序阅读程序] 以下程序运行后的输出结果是以下程序运行后的输出结果是 include int fun(int w1 , int w2){ return w2-w1; }main( ){ int w=1,k ; k=fun(fun(w+1,w),w) ; printf("%d\n",k) ;}答案:答案:261[全国选择题全国选择题] 有以下程序有以下程序#includevoid fun(int a , int b){ int t; t=a; a=b; b=t;} main() { int c[10]={1,2,3,4,5,6,7,8,9,0},i ; for(i=0;i<10;i+=2) fun(c[i],c[i+1]); for(i=0;i<10;i++) printf(“%d,”,c[i]); printf(“\n”); } 程序的运行结果是()程序的运行结果是() A) 1,2,3,4,5,6,7,8,9,0, B) 2,1,4,3,6,5,8,7,0,9, C) 0,9,8,7,6,5,4,3,2,1, D) 0,1,2,3,4,5,6,7,8,9,答案:答案:A62(3) 函数调用时结构函数调用时结构类型类型实参的传递与使用实参的传递与使用[阅读程序阅读程序] 以下程序运行时输出到屏幕的结果第一行是以下程序运行时输出到屏幕的结果第一行是 (1) ,第二行是,第二行是 (2) 。
include typedef struct { int x,y; }direction;int visible(direction s,direction A,direction B,direction C){ direction p1,p2; int d; p1.x=B.x-A.x; p1.y=B.y-A.y; p2.x=C.x-A.x; p2.y=C.y-A.y; d = s.x*p1.x*p2.x + s.y*p1.y*p2.y; printf("%4d\n", d); return d>0;}void main( ){ char *ss[]={"invisible","visible"}; direction s={1,1},T={1,1},A={0,0},B={2,1}; puts(ss[visible(s,T,A,B)]);}答案:答案: (1) -1 (2) invisible63(4) 函数调用时指针函数调用时指针类型类型实参的传递与使用实参的传递与使用【【考题解析考题解析】】[单单选选题题] 若若需需要要通通过过调调用用f函函数数得得到到一一个个数数的的平平方方值值,,以以下下f函函数定义中不能实现该功能的是数定义中不能实现该功能的是 。
A. void f(double *a){ *a=(*a)*(*a);} B. void f(double a,double *b){ *b=a*a; } C. void f(double a,double b){ b=a*a;} D. double f(double a){ return a*a; } 答案:答案: C C64[全国全国选择题选择题] 有以下程序有以下程序#include void fun(( int *a,int *b)){ int *c; c=a; a=b; b=c;}main()(){ int x=3,y=5,*P=&x,*q=&y; fun((p,q)); printf((”%d,%d,”,*p,*q)); fun((&x,&y)); printf((”%d,%d\n”,*p,*q));}程序运行后的输出结果是程序运行后的输出结果是A))3,5,5,3 B))3,5,3,5 C))5,3,3,5 D))5,3,5,3 、、答案:答案:B65[阅读程序阅读程序] 以下程序运行时输出结果是以下程序运行时输出结果是 。
#include void change(int x, int y, int *z){ int t; t=x; x=y; y=*z; *z=t;}void main( ){ int x=18,y=27,z=63; change(x,y,&z); printf("x=%d,y=%d,z=%d\n",x,y,z); } 答案:答案: x=18, y=27, z=18x=18, y=27, z=1866[全国选择题全国选择题] 有以下程序有以下程序#include void fun(int a[], int n) { int i,t; for(i=0;ivoid fun(int x,int p[],int *n){ int i,j=0; for(i=1;i<=x/2;i++) if(x%i==0) p[j++]=i; *n=j;}void main(){ int x,a[10],n,i; fun(27,a,&n); /* 调调用用fun函函数数将将27的的所所有有因因子子保保存存到到a数数组组,,因因子子个个数数保存到保存到n*/ for(i=0;iint fun(char *a,char *b){ int m=0,n=0; while(*(a+m)!='\0')m++; while(b[n]) { *(a+m)=b[n];m++;n++; } *(a+m)='\0'; return m;}void main(){ char s1[20]="yes",s2[5]="no"; printf("%d\n",fun(s1,s2)); puts(s1);} 答案:答案:(1) 5 ((1) 5 (2) yesno 2) yesno 69[阅读程序阅读程序] 以下程序运行时输出到屏幕的结果第一行是以下程序运行时输出到屏幕的结果第一行是 (1) ,第二行是,第二行是 (2) 。
include void fun(char *p1,char *p2);void main(){ int i; char a[]="54321"; puts(a+2); fun(a,a+4); puts(a);}void fun(char *p1,char *p2){ char t; while(p1 int fsum(int *array,int n){ int i,s=0; for(i=0; ((1)) ; i++) s+=array[i]; return(s); } void main(void){ int a[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; int sumh,sumt; sumh=fsum(a,4); sumt= ((2)) ; printf(“%d %d\n”,sumh,sumt);} 答案答案: (1) i
答案答案: 4 [全国选择题全国选择题] 以下叙述中错误的是()以下叙述中错误的是()A)用户定义的函数中可以没有用户定义的函数中可以没有return语句语句B)用户定义的函数中可以有多个用户定义的函数中可以有多个return语句,以便可以调语句,以便可以调用一次返回多个函数值用一次返回多个函数值C)用户定义的函数中若没有用户定义的函数中若没有return语句,则应当定义函数语句,则应当定义函数为为void类型类型D)函数的函数的return语句中可以没有表达式语句中可以没有表达式答案:答案:B72[全国选择题全国选择题] 以下关于以下关于return语句的叙述中正确的是()语句的叙述中正确的是() A)一个自定义函数中必须有一条)一个自定义函数中必须有一条return语句语句 B)一个自定义函数中可以根据不同的情况设置多条)一个自定义函数中可以根据不同的情况设置多条return语句语句 C)定义成)定义成void类型的函数中可以有带返回值的类型的函数中可以有带返回值的return语句语句 D) 没有没有return语句的自定义函数在执行结束语句时不能返语句的自定义函数在执行结束语句时不能返回到调用处回到调用处 答案:答案:B73(6) 全局变量、局部变量与形式参数的作用域全局变量、局部变量与形式参数的作用域 【【考题解析考题解析】】 [阅读程序阅读程序] 以下程序运行时输出结果是以下程序运行时输出结果是 。
#include int t;int sub(int *s){ *s+=1; t+=*s; return t;}main(){ int i; for(i=1;i<4;i++) printf("%4d",sub(&i));}答案:答案: 2 674(7) 局部变量、形式参数的存储类型和生存期局部变量、形式参数的存储类型和生存期【【考题解析考题解析】】 [单选题单选题] 已知在函数已知在函数f中声明了局部变量中声明了局部变量x,如果希望,如果希望f函数第函数第一次被调用返回后变量一次被调用返回后变量x中存储的数据保持到下次中存储的数据保持到下次f函数被函数被调用时仍可以使用,则在声明调用时仍可以使用,则在声明x时必须指定其存储类型为时必须指定其存储类型为 ((30)) A. auto B. register C. static D. extern答案:答案:C[填空题填空题] 声明局部变量时若缺省存储类别,该变量的存储类声明局部变量时若缺省存储类别,该变量的存储类别是别是 。
答案:答案:auto[填空题填空题] 可以改变局部变量的生存期、但不能改变它的作用可以改变局部变量的生存期、但不能改变它的作用域的存储类别是域的存储类别是 答案:答案:static75[阅阅读读程程序序] 以以下下程程序序运运行行时时输输出出结结果果的的第第一一行行是是 (1) ,,第第二二行是行是 (2) #includeint f1( ){ static int i=0,f=1; return f*=++i; }int f2( ) { int i=0,f=1; return f*=++i; }void main( ) { printf("%d\n",f1( )+f1( )); printf("%d\n",f2( )+f2( )); }答案答案: (1) 3 (2) 2 76[阅读程序阅读程序] 以下程序运行时输出到屏幕的结果第一行是以下程序运行时输出到屏幕的结果第一行是 (1) ,第二行是,第二行是 (2) ,第三行是,第三行是 (3) 。
include int g(int x,int y){ return x+y ; }int f(int x,int y){ { static int x=2; if(y>2) { x=x*x; y=x } else y=x+1; } return x+y;}void main( ){ int a=3; printf("%d\n",g(a,2)); printf("%d\n",f(a,3)); printf("%d\n",f(a,2));}答案:答案:(1) 5 (2) 7 (3) 877 6. 函数高级应用函数高级应用 (1) 递递归函数执行过程归函数执行过程 【【考题解析考题解析】】 [阅读程序阅读程序] 以下程序运行时输出结果是以下程序运行时输出结果是 ((8)) #includevoid f(long x){ if(x<100) printf("%d", x/10); else { f(x/100); printf("%d", x%100/10); }}main(){ f(123456); } 答案:答案: 13578[阅读程序阅读程序] 以下程序运行后的输出结果第一行是以下程序运行后的输出结果第一行是 (13) 。
include void print(int n);void print_n(int n);main(){ print(4); }void print(int n){ if (n==0) return; print_n(n); if (n>0) print(n-1); }void print_n(int n){ if(n==0)return; printf("%d",n); if(n>1) print_n(n-1); else printf("\n");}答案:答案:4321 79[阅读程序阅读程序] 以下程序运行时输出结果是以下程序运行时输出结果是 . #include#includevoid sf(char *s1,char *s2){ if(*s1=*s2) sf(s1+1,s2+1); }void main( ){ char a[20]= "ABC",b[20]="xyz"; sf(a+strlen(a),b); puts(a); } 答案答案: ABCxyz 80[阅读程序阅读程序] 以下程序运行时输出结果是以下程序运行时输出结果是 . #include #include int count(char s[]){ int i=0; if(s[i]=='\0') return 0; while(isalpha(s[i])) i++; while(!isalpha(s[i])&&s[i]!='\0') i++; return 1+count(&s[i]); /* 递归调用递归调用 */}void main(){ char line[]="one world,one dream."; printf("%d",count(line));} 答案:答案: 4 4 81[阅读程序阅读程序] 以下程序运行时输出到屏幕的结果是以下程序运行时输出到屏幕的结果是 。
include void fun(int m,int n){ if(m>=n) printf("%d",m); else fun(m+1,n); printf("%d",m);}void main( ){ fun(1,2); }答案:答案:22182 (2) 函数的指针操作函数的指针操作 ①① 函数地址的获得及保存指向函数的指针变量声明、初函数地址的获得及保存指向函数的指针变量声明、初始化、赋值始化、赋值 ② ② 调用指针变量指向的函数调用指针变量指向的函数 【【考题解析考题解析】】[全国填空题全国填空题] 请将以下程序中的函数声明语句补充完整请将以下程序中的函数声明语句补充完整#include int _________________;main( ){ int x,y,(*p)(); p=max; printf(“&d\n”,(*p)(x,y));}int max(int a,int b){ return (a>b/a:b); } 答案答案 ::max(int a,int b) 或或 max(int ,int )83[全国选择题全国选择题] 设有以下函数:设有以下函数:void fun(int n,char *s) {…….}则下面对函数指针的定义和赋值均正确的是则下面对函数指针的定义和赋值均正确的是A) void (*pf)(); pf=fun;B) void *pf(); pf=fun;C) void *pf(); *pf=fun;D) void (*pf)(int,char *); pf=fun;答案答案 ::D[学校单选题学校单选题] 若已有如下程序:若已有如下程序: #includedouble g(double a,double (*p)(double)){ return p(a)*p(a); } main(){ double x=2,y; /* g函数调用语句位置函数调用语句位置 */ }现需要在现需要在main函数中调用函数中调用g函数,以下选项中正确的函数,以下选项中正确的g函数函数调用语句是调用语句是 。
A.. y=g(x,exp); B.. y=g(x,exp(x)); C.. y=g(x,exp()); D.. y=g(double x, double exp);答案:答案:A 84((3)) 返回指针类型值的函数返回指针类型值的函数 以下程序运行结果是()以下程序运行结果是()include#includeint * fun(int n){ int *p; p=(int *)malloc(sizeof(int)); *p=n+10; return p;}main(){ int *p; p=fun(10); printf(“%d\n”,*p);} 答案:答案:20857. 单向链表单向链表 ⑴⑴ 结点数据类型定义结点数据类型定义 ⑵⑵ 使用使用malloc()函数函数,free()函数动态申请、释放结点存储区函数动态申请、释放结点存储区 ⑶⑶ 基本操作:建立链表、遍历链表、查找结点、插入新结点、基本操作:建立链表、遍历链表、查找结点、插入新结点、删除结点、数据统计、链表倒序删除结点、数据统计、链表倒序86•建立链表关键操作建立链表关键操作 需声明指针变量:需声明指针变量:head(指向链表首结点),(指向链表首结点),p1(指向新申(指向新申请结点),请结点),p2((指向链表末结点)指向链表末结点) while(仍有数据需保存到链表仍有数据需保存到链表){ p1=(struct node *)malloc(sizeof(struct node)); p1->成员名成员名=数据数据; if(head==0) head=p2=p1; else { p2->next=p1; p2=p1; }}p2->next=NULL; return head;87•遍历链表遍历链表(输出结点数据,统计结点数据输出结点数据,统计结点数据)关键操作关键操作 需声明指针变量需声明指针变量p或直接用形参或直接用形参 p=head;(指向链表首结点)(指向链表首结点)while(p!=NULL){ 查找结点数据、输出结点数据、统计结点数据查找结点数据、输出结点数据、统计结点数据 p=p->next;} 88•插入结点到链表关键操作插入结点到链表关键操作 需声明指针变量:需声明指针变量:p(指向待插入新结点),(指向待插入新结点),head(指向链(指向链表首结点)表首结点),p1(指向插入位置之前结点),(指向插入位置之前结点),p2(指向插入(指向插入位置之后结点)位置之后结点) ① ① 申请新结点并保存数据到结点申请新结点并保存数据到结点p=(struct node *)malloc(sizeof(struct node));p->成员成员=数据数据; p->next=NULL; ② ② 若要求将新结点插入链表第一个结点前若要求将新结点插入链表第一个结点前if(head==NULL)head=pelse { p->next=head; head=p; }return head;89③ ③ 若要求将新结点插入有序链表中若要求将新结点插入有序链表中 if(新结点应插入到链表首结点之前)(新结点应插入到链表首结点之前){ p->next=head; head=p; return head; } else{ p1=head; p1指向链表第一个结点指向链表第一个结点 p2=head->next; p2指向链表第二个结点指向链表第二个结点 while((p2!=NULL)) { if ( 新结点应插入到新结点应插入到p2指向结点之前指向结点之前) 立即终止循环立即终止循环 else { p1=p2;p2=p2->next; } } if(p2==NULL)p1->next=p; 新结点添加到末结点之后新结点添加到末结点之后 else {p->next=p2; p1->next=p;} 新结点插入新结点插入p2指向结点之前指向结点之前} return head;90•从链表中删除结点关键操作从链表中删除结点关键操作 需声明指针变量:需声明指针变量:head(指向链表首结点),(指向链表首结点),p1(指向需(指向需删除结点之前结点),删除结点之前结点),p2(指向需删除结点)(指向需删除结点) if(首结点需要删除,即首结点需要删除,即head->成员成员=给定值给定值){ p=head; head=head->next; 或或head=p->next; free(p); } else{ p1=head; p1指向链表第一个结点指向链表第一个结点 p2=head->next; p2指向链表第二个结点指向链表第二个结点 while(p2!=NULL)) { if(p2指向结点需删除指向结点需删除)立即终止循环立即终止循环 else { p1=p2; p2=p2->next; } } if p2==NULL) { puts(“not found”); } 未找到结点未找到结点 else { p1->next=p2->next; free(p2); } 删除删除p2指向结点指向结点 } return head; 91【【考题解析考题解析】】 •插入新结点插入新结点 [完完 善善 程程 序序 ] 以以 下下 程程 序序 的的 功功 能能 是是 :: 函函 数数 struct node * insert(struct node *head, struct node *p)将将p指指向向的的结结点点作作为为首首结结点点插插入入head指指向向的的链链表表中中。
main函函数数接接收收从从键键盘盘输输入入的的一一行行字字符符,,每每接接收收一一个个字字符符后后,,申申请请一一个个新新结结点点保保存存该该字字符符,,并并调调用用insert函函数数将将新新结结点点插插入入链链表表中中最最后后从从表表头头开开始始依依次次输输出出该该链链表表各各结结点点成成员员c的的值值试试完完善善程程序序以以达达到要求的功能到要求的功能 #include #include struct node{ char c; struct node *next;}; 92void main( ){ struct node *insert(struct node *head, struct node *p); char ch; struct node *head,*p; head=NULL; while((ch=getchar( ))!='\n') { p=(struct node *)malloc(sizeof(struct node)); ((1)) =ch; p->next=NULL; ((2)) ; } p=head; while(p!=NULL) { printf("%c",p->c); ((3)) ; }}struct node * insert(struct node *head, struct node *p){ if(head==NULL) head=p; else { ((4)) ; head=p; } return head; }答案答案: (1)p->c (2)head=insert(head,p) (3)p=p->next; (4)p-next=head 93•数据统计数据统计[完完善善程程序序] 以以下下程程序序创创建建一一个个链链表表并并实实现现数数据据统统计计功功能能。
函函数数WORD *create(char a[][20],int n)创创建建一一个个包包含含n个个结结点点的的单单向向链链表表,,结结点点数数据据来来自自a指指向向的的数数组组中中存存储储的的n个个单单词词((字字符符串串))函函数数void count(WORD *h)统统计计h指指向向的的单单向向链链表表中中不不同同单单词词各各自自出出现现的的次次数数,,将将统统计计结结果果保保存存到到局局部部数组数组c中并输出中并输出 ((2009春)春) 程序运行时输出结果为程序运行时输出结果为 “red:1 green:2 blue:3” #include "stdio.h"#include "stdlib.h"#include "string.h"typedef struct w{ char word[20]; struct w *next;}WORD;94 WORD *create(char a[][20],int n){ WORD *p1,*p2,*h=0; int i; for(i=0;inext=p1; p2=p1; } } p2->next= (2) ; return h;} 答案:答案: (1) p1->word (2) 0或或NULL 95void count(WORD *h){ struct { char word[20]; int num; }c[6]={0}; int m=0,i; while(h) { if(m==0) { strcpy(c[0].word,h->word); c[0].num=1; m++; } else { for(i=0;iword)==0) { (3) ; break; } if(i>=m) { strcpy(c[m].word,h->word); c[m++].num=1; } } (4) ; } for(i=0;inext 96void main(){ char words[6][20]={"red","green","blue","blue", "green","blue"}; WORD *head=0; head=create(words,6); count(head); } 97•查找、删除结点查找、删除结点[完善程序完善程序] 设设h1和和h2分别为两个单链表的头指针,链表中结分别为两个单链表的头指针,链表中结点的数据结构为:点的数据结构为:typedef struct node { int data; struct node *next; }NODE;sea_del函数的功能是:删除函数的功能是:删除h1指向的链表中首次出现的与指向的链表中首次出现的与h2指向的链表中数据完全匹配的若干个连续结点指向的链表中数据完全匹配的若干个连续结点,函数返回函数返回h1指向链表的头指针。
指向链表的头指针例如,初态下,例如,初态下,h1指向链表和指向链表和h2指向链表如下图所示:指向链表如下图所示:124790h12470h2调用调用sea_del函数后函数后h1指向链表为:指向链表为:1h19098NODE *sea_del(NODE *h1,NODE *h2){ NODE *p,*ph,*q,*s; ph=NULL; p=q=h1; s=h2; if(h1==NULL|| (1) ) return h1; while(p!=NULL&&s!=NULL) { while(q->data==s->data&&q&&s) { q=q->next; s= (2) ; } if(s!=NULL) /*失配时失配时,h1起始结点后移起始结点后移, h2从首结点开始从首结点开始*/ { ph=p; p=q=p->next; s= (3) ; } else if(ph==NULL) h1=q; else ph->next=q; } (4) ; } 答案:答案: (1) h2==NULL或或 h2==0 (2) s->next (3) h2 (4) return h199•查找、删除、插入结点查找、删除、插入结点[完善程序完善程序] 设一个单向链表结点的数据类型定义为:设一个单向链表结点的数据类型定义为:struct node{ int x; struct node *next; }; fun函数从函数从h指向的链表第二个结点开始遍历所有结点,当遇指向的链表第二个结点开始遍历所有结点,当遇到到x值为奇数的结点时,将该结点移到值为奇数的结点时,将该结点移到h链表第一个结点之前,链表第一个结点之前,函数返回链表首结点地址。
函数返回链表首结点地址print函数输出函数输出p指向的链表中所指向的链表中所有结点的有结点的x值程序运行后的输出结果是值程序运行后的输出结果是“1 3 4 2”100 #include#define N 4struct node{ int x; struct node *next; };void print(struct node *p){ while( (1) ) { printf("%4d", (2) ); p=p->next;} printf("\n");}答案:答案: (1) p (2) p->x 101 struct node *fun(struct node *h){ struct node *p1,*p2,*p3; p1=h; p2=p1->next; while(p2) { if(p2->x%2) { p3=p2; p1->next= (3) ; p2=p1->next; p3->next=h; (4) ; } else { p1=p2; p2=p2->next; } } return h;}main(){ struct node a[N]={{4},{3},{2},{1}},*head=a; int i,num; for(i=0;inext 或或 p3->next (4) h=p3102•链表倒序链表倒序设某单向链表结点的数据结构定义为设某单向链表结点的数据结构定义为:typedef struct node{ char ch; struct node *next ;} linklist ; 以下程序首先建立一个单向链表以下程序首先建立一个单向链表head(如图(如图1所示),该链所示),该链表每个结点中保存表每个结点中保存x数组的一个元素值数组的一个元素值; 输出输出head链表中每链表中每个结点的值个结点的值;再将再将head链表变换为倒序链表(如图所示),链表变换为倒序链表(如图所示),输出倒序后输出倒序后head链表中每个结点的值。
链表中每个结点的值 headD 0图图1C BAheadA 0图图2B CD103#include typedef struct node{ char ch; struct node *next;}linklist ;linklist *create( char x[]){ int i; linklist *pt,*pr,*p=NULL; for(i=0;x[i]!='\0';i++) { pt=(linklist*)malloc(sizeof(linklist)); pt->ch=x[i];pt->next=NULL; if(p==NULL) { (1) ; pr=pt;} else { pr->next=pt; (2) ;} } return p;}答案:答案:(1) p=pt (2) pr=pr->next 104 linklist *revlist( linklist *head){ linklist *hp,*p=NULL; hp=head; head= (29) ; while(hp) { p=hp; hp=hp->next; p->next=head; (30) ; } return head;}void print( linklist *phead){ while(phead) { printf("%c ",phead->ch); phead=phead->next; } printf("\n");}main(){ linklist *head; char x[]="ABCD"; head=create(x); print(head); head=revlist(head); print(head);} 答案:答案:(3) NULL或或 0 (4) head=phead链表倒序算法提示:链表倒序算法提示:(1)使使hp指向指向head链表,置链表,置head为为0((head链表为空链表)。
链表为空链表)2)从从hp指向的链表第一个结点开指向的链表第一个结点开始,依次从始,依次从hp链表中删除每个结点,将所删除的结点再依次链表中删除每个结点,将所删除的结点再依次插入到插入到head链表第一个结点之前,直到链表第一个结点之前,直到hp链表为空时结束链表为空时结束1058. 枚举类型数据枚举类型数据 ⑴⑴ 枚举类型定义枚举类型定义 ⑵⑵ 枚举变量的命名、声明枚举变量的命名、声明 ⑶⑶ 枚举常量的使用枚举常量的使用 ⑷⑷ 枚举变量的赋值及使用枚举变量的赋值及使用【【考题解析考题解析】】 [填空题填空题]若已有定义若已有定义“enum TP{A,B,C};”,,则执行语句则执行语句“printf(”%d\n“,A+1);”后输出结果是后输出结果是 (3) 答案答案: 1 [单选题单选题].若有枚举类型定义若有枚举类型定义“enum list1{x1,x2,x3,x4=6,x5,x6};”,则枚举常量,则枚举常量x2和和x6代表的代表的值分别是值分别是 A. 1,,6 B. 1,,8C. 2,,6 D. 2,,8答案答案: B 1069. 预处理命令预处理命令 ⑴⑴ #define命令命令 (2) #include命令命令【【考题解析考题解析】】[填空题填空题] C语言有效的预处理命令总是以语言有效的预处理命令总是以 (4) 开头。
开头答案:答案: # #[填填空空题题]执执行行以以下下程程序序段段中中的的语语句句“k=M*M+1;”后后k的的值值是是 (4) define N 2#define M N+1 k=M*M+1; 答案:答案: 6 6 107[阅读程序阅读程序] 以下程序运行后的输出结果是以下程序运行后的输出结果是 include #define Count(n) ++nmain ( ){ int x=-3 ,n=8; while(Count(x)) n--; printf("%d\n",n);}答案:答案: 6108[阅读程序阅读程序] 以下程序运行时输出到屏幕的结果为以下程序运行时输出到屏幕的结果为 include#define MAX(A,B) A>B ? 2*A : 2*Bvoid main(){ int a=1,b=2,c=3,d=4,t; t=MAX(a+b,c+d); printf("%d\n",t);} 答案:答案:10[阅读程序阅读程序] 以下程序运行时输出结果是以下程序运行时输出结果是 (5) 。
#define EVEN(x) x%2==0?1:0main(){ if(EVEN(5+1)) printf("Even"); else printf("Odd");}答案:答案: Odd109[全国选择题全国选择题] 以下叙述中错误的是以下叙述中错误的是( ) A)在程序中凡是以在程序中凡是以“#”开始的语句行都是预处理命令行开始的语句行都是预处理命令行B)预处理命令行的最后不能以分号表示结束预处理命令行的最后不能以分号表示结束C)#define MAX是合法的宏定义命令行是合法的宏定义命令行D)C程序对预处理命令行的处理是在程序执行的过程中进程序对预处理命令行的处理是在程序执行的过程中进行的行的答案:答案:D11010. 文件操作文件操作 ⑴⑴ 文件指针变量的声明(重点掌握)文件指针变量的声明(重点掌握) ⑵⑵ 缓冲文件系统常用操作函数的使用:缓冲文件系统常用操作函数的使用: fopen(),fclose(),,fprintf(),fscanf(),fgetc(),fputc(),fgets(),fputs(), feof (),rewind(), fread(),fwrite(),,fseek() 【【考题解析考题解析】】 [填填空空题题] 已已知知某某程程序序中中有有预预处处理理命命令令“#include”,,为为使使语语句句“zx=fopen(”c:\\a.txt“,”r“);”能能正正常常执行,在该语句之前必须有声明执行,在该语句之前必须有声明 。
答案答案: FILE *zx;[填填空空题题] 若若需需要要打打开开D盘盘上上user子子目目录录下下已已经经存存在在的的名名为为abc.txt的的文文本本文文件件,先先读读出出文文件件中中数数据据,,后后追追加加写写入入新新数数据据,,则正确的函数调用语句是:则正确的函数调用语句是:“fp=fopen("D:\\user\\abc.txt", ); ”答案答案: "a+“111[单选题单选题] 已知已知A盘根目录下有文本文件盘根目录下有文本文件“data.txt”且程序中且程序中已有声明已有声明“FILE *fp;”,若程序需要先从,若程序需要先从“data.txt”文件文件中读出数据,修改后再写入中读出数据,修改后再写入“data.txt”文件中,则调用文件中,则调用fopen函数的正确形式是函数的正确形式是 (28) 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"); 答案答案: C [单选题单选题] 下列叙述中,正确的是下列叙述中,正确的是 。
A..C语言中的文件是流式文件语言中的文件是流式文件, 只能顺序存取文件中数据只能顺序存取文件中数据B.调用.调用fopen函数时若用函数时若用“r”或或“r+”模式打开一个文件,模式打开一个文件,该文件必须在指定存储位置或默认存储位置处存在该文件必须在指定存储位置或默认存储位置处存在C.当对文件进行了写操作后,必须先关闭该文件然后再打.当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到该文件中的第开,才能读到该文件中的第1个数据D.无论以何种模式打开一个已存在的文件,在进行了写操.无论以何种模式打开一个已存在的文件,在进行了写操作后,原有文件中的全部数据必定被覆盖作后,原有文件中的全部数据必定被覆盖答案答案: B 112[全国选择题全国选择题] 有以下程序有以下程序 #include main() { FILE *fp;;int a[l0]={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); fp=fopen("d1.dat","r"); fscanf(fp,"%d",&n); fclose(fp); printf("%d\n",n); } 程序的运行结果是程序的运行结果是( )。
A)12300 B)123 C)1 D)321答案:答案:B113[阅读程序阅读程序] 以下程序运行时输出结果是以下程序运行时输出结果是 . . #include void main(){ double x[3]={1.1,2.2,3.3},y; FILE *fp=fopen("d:\\a.out","wb+"); fwrite(x, sizeof(double),3,fp); fseek(fp, 2L*sizeof(double), SEEK_SET); fread(&y,sizeof(double),1,fp); printf("%.1f",y); fclose(fp);} 答案:答案: 3.3 3.3 11411. 综综合合[单选题单选题] 在下列在下列C语言源程序的错误中,通常不能在编译时发语言源程序的错误中,通常不能在编译时发现的是现的是 ((21)) A. 括号不匹配括号不匹配 B. 非法标识符非法标识符 C. 数组元素下标值越界数组元素下标值越界 D. 程序结构不完整程序结构不完整答案:答案: C C[单选题单选题] 以下定义和声明中,语法均有错误的是以下定义和声明中,语法均有错误的是 ((21)) 。
①① int _f(int x){ } ②② int f(int f){ } ③③ int 2x=1; ④④ struct for{int x;};A.②③②③ B. ③④③④ C. ①④①④ D. ①②③④①②③④答案:答案: B B115[单选题单选题] 若程序中已有相应的声明,下列语句中错误的是若程序中已有相应的声明,下列语句中错误的是 A.A.printf(i==4 ? "%6d\n" : "%6d" , i );B.B.i==4 ? printf("%6d\n",i ) : printf("%6d" , i ) ;C.C.for (i=10 ; ; i--) if(i==1) break;D.D.for (i=10 ; ; ) if(i--); break; 答案:答案: D 116[全国填空题全国填空题] 以下程序的输出结果是以下程序的输出结果是_______#includemain(){ int j,a[]={1,3,5,7,9,11,13,15},*p=a+5; for(j=3; j; j--) { switch(j) { case 1: case 2: printf(“%d ”,*p++); break; case 3: printf(“%d ”,*(--p)); } }}答案:答案:9 9 11117[阅读程序阅读程序]以下程序运行时输出结果中第一行是以下程序运行时输出结果中第一行是 ((1)) ,,第二行是第二行是 ((2)) ,第三行是,第三行是 ((3)) 。
includemain(){ int i,j,a[3][3]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) switch(i-j+2) { case 0: case 1: a[i][j]=1;break; case 2: a[i][j]=2;break; case 3: a[i][j]=3;break; case 4: a[i][j]=5;break; } for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%4d",a[i][j]); printf("\n"); }} 答案:答案: (1) 2 1 1 (2) 3 2 1 (3) 5 3 2118算法考试要求及考题解析算法考试要求及考题解析((2007秋秋~2010春)春) 1. 基本操作:交换,累加,累乘基本操作:交换,累加,累乘 【【考题解析考题解析】】 交换数据交换数据[阅读程序阅读程序] 以下程序运行时输出到屏幕的结果是以下程序运行时输出到屏幕的结果是 (7) 。
#include void main( ){ int a=1,b=2; a+=b; b=a-b; a-=b; printf("%d,%d\n",a,b);}答案:答案: 2,11192. 数值计算算法数值计算算法 (1) 求若干整数的最大公约数求若干整数的最大公约数 (2) 求一个十进制表示整数的反序数求一个十进制表示整数的反序数 (3) 一元非线性方程求根(牛顿迭代法,半分区间法)一元非线性方程求根(牛顿迭代法,半分区间法) (4) 定积分计算(梯形法,矩形法)定积分计算(梯形法,矩形法) (5) 级数计算(递推法)级数计算(递推法) (6) 矩阵转置,矩阵转置, 矩阵乘法矩阵乘法 【【考题解析考题解析】】 120•求最大公约数求最大公约数[完善程序完善程序] 以下程序求一组整数的最大公约数以下程序求一组整数的最大公约数includeint gcd(int a,int b){ int r; while( (1) ) { r=a%b; a=b; (2) ; } return a;}void main(){ int x,i,a[6]={12,56,48,32,16,24}; x= (3) ; for(i=1;i<6;i++) x=gcd( (4) ,a[i]); printf("(%d,",a[0]); for(i=1;i<5;i++) printf("%d,",a[i]); printf("%d)=%d\n",a[5],x);} 答案答案: (1) b!=0 (2) b=r (3) a[0] (4) x121•求一个十进制字符串表示整数的反序数求一个十进制字符串表示整数的反序数[阅读程序阅读程序] 以下程序运行后的输出结果是以下程序运行后的输出结果是 (10) 。
include main ( ){ char a[ ]="369",*p=a; int s=0,t=1; while(*++p) t*=10; p--; while (t) { s+=(*p-'0')*t; p--; t/=10; } printf ("%d\n",s);}答案:答案:963122•一元非线性方程求根(牛顿迭代法)一元非线性方程求根(牛顿迭代法)[阅读程序阅读程序] 用牛顿迭代法求方程用牛顿迭代法求方程3x3-3x2+x-1=0在在2.0附近的一附近的一个实根,精度要求为个实根,精度要求为10-5函数F求求f(x)的值,函数的值,函数F1求求f(x)的一阶导数值的一阶导数值 牛顿迭代公式如下:牛顿迭代公式如下:123 #include#includefloat F(float x){ return x*(3*x*(x-1)+1)-1; }float F1(float x){ return 9*x*x-6*x+1; }float newtoon(float x){ float f,f1,x0; do { (1) ; f=F(x0); f1=F1(x0); x= (2) ; }while(fabs(x-x0)>1e-5); return x;} main(){ float x0; scanf("%f",&x0); printf("The result =%.2f\n", newtoon(x0));}答案:答案:(1) x0=x (2) x0-f/f1 或或 x0-F(x0)/F1(x0)124•级数计算(递推法)级数计算(递推法)[完善程序完善程序] 以下程序通过给出的公式计算的近似值,计算过以下程序通过给出的公式计算的近似值,计算过程在所加项的值小于程在所加项的值小于10-10时终止。
时终止 #include main(){ double sum=0.5,t,t1,t2,t3; int odd=1, even=2 ; t=t1=t2=1.0; t3=0.5; while (t>1e-10) { t1= (1) ; odd+=2; even+=2; t2=1.0/odd ; t3= (2) ; t=t1*t2*t3; sum+=t; } printf ("\nPI=%.8lf", (3) ); } 答案:答案:(1) t1*odd/even (2) t3*0.5*0.5 (3) sum*61253. 非数值计算算法非数值计算算法 (1) 穷举法找数穷举法找数 (2) 排序(冒泡法,插入法排序(冒泡法,插入法 ,选择法),选择法) (3) 在数组中查找数据(线性法,折半法)在数组中查找数据(线性法,折半法) (4) 将一个数据插入有序数组中将一个数据插入有序数组中 (5) 删除数组中数据删除数组中数据 (6) 多个数组数据合并多个数组数据合并 (7) 数据统计数据统计 (8) 其他(素数判断,回文数判断,回文判断,约瑟夫问题)其他(素数判断,回文数判断,回文判断,约瑟夫问题) (9) 生成矩阵(杨辉三角形,生成矩阵(杨辉三角形,…) (10) 模拟十进制长整数算术运算模拟十进制长整数算术运算 (11)字符串处理(子串替换,加密字符串处理(子串替换,加密, ,……)) 【【考题解析考题解析】】 126•穷举法找数穷举法找数[阅读程序阅读程序] 寻找具有下列特性的四位正整数,其百位数为寻找具有下列特性的四位正整数,其百位数为0,,去掉百位数去掉百位数0可得到一个三位正整数,而该三位正整数乘以可得到一个三位正整数,而该三位正整数乘以9等于原四位正整数。
例如,等于原四位正整数例如,6075==675×9,所以,所以6075是具是具有上述特性的正整数有上述特性的正整数includeint fun(int n){ int a[4],i,k; k=n; for(i=0;k>0;i++) { a[i]= (1) ; k/=10; } if( (2) &&(a[3]*100+a[1]*10+a[0])*9==n ) return 1; else return 0;}main(){ int i, n=0; for(i=1000;i<10000;i++) if(fun(i)) printf("%4d\t",i); printf("\n");} 答案答案(1) k%10 (2) a[2]==0 或或 !a[2]127•穷举法找数穷举法找数[完善程序完善程序] 某餐厅用苹果、桔子、香蕉、菠萝、梨五种水果制某餐厅用苹果、桔子、香蕉、菠萝、梨五种水果制作水果拼盘,要求每个拼盘中恰有三种不同水果。
以下程序作水果拼盘,要求每个拼盘中恰有三种不同水果以下程序的功能就是计算可以制作出多少种这样的水果拼盘并列出组的功能就是计算可以制作出多少种这样的水果拼盘并列出组合方式include typedef enum { apple,orange,banana,pineapple,pear } Fruit;main(){ (1) fruits[ ]={"apple","orange","banana","pineapple","pear"}; Fruit x,y,z,p; int k=0,i; for (x= (2) ;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) char * (2) apple或或0128•排序:排序: 下标为奇数的数组元素排序,选择法下标为奇数的数组元素排序,选择法 [阅读程序阅读程序] 以下程序运行时输出结果是以下程序运行时输出结果是 . #include void sort(int a[],int n) { int i,j,p; int t; for(i=1;ia[p]) p=j; if(p!=i) { t=a[i]; a[i]=a[p]; a[p]=t; } } } void main( ){ int s[ ]={8,1,4,3},n=4,k; sort(s,n); for(k=0;k
试完善程序以达到要求的功能试完善程序以达到要求的功能 130 #include #define N 5void fun(int x[][N],int n){ int i,j,t,arr,col; for(i=0;i=arr) { arr=x[i][j]; (1) ; } t=x[i][i]; (2) ; x[i][col]=t; } for(i=0;ix[j][j] 131•结构数组排序:按成员结构数组排序:按成员x值升序,值升序,x值相同的按成员值相同的按成员y值升序值升序 [阅阅读读程程序序] 以以下下程程序序运运行行时时输输出出结结果果中中第第一一行行是是 (1) ,,第第二二行行是是 (2) 第三行是第三行是 (3) . #includetypedef struct { int x;int y; }S;void fun(S pp[],int n){ int i,j,k; S t; for(i=0;i
include void sot( int a[3][3]){ int i,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;} } }133 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(){ int b[3][3]={{3,2,1},{6,5,4},{9,8,7}}; sot(b);}答案:答案: (1) 7 8 9 (2) 4 5 6 (3) 1 2 3134•排序排序[完善程序完善程序]下列程序的功能是对下列程序的功能是对a数组数组a[0]~~a[n-1]中存储的中存储的n个整数从小到大排序。
排序算法是:第一趟通过比较将个整数从小到大排序排序算法是:第一趟通过比较将n个个整数中的最小值放在整数中的最小值放在a[0]中,最大值放在中,最大值放在a[n-1]中;第二趟中;第二趟通过比较将通过比较将n个整数中的次小值放在个整数中的次小值放在a[1]中,次大值放在中,次大值放在a[n-2]中;中;……,依次类推,直到待排序序列为递增序列依次类推,直到待排序序列为递增序列试完善程序以达到要求的功能试完善程序以达到要求的功能135#include #define N 7void sort(int a[], int n){ int i,j,min,max,t; for(i=0;i< (1) ;i++) { (2) ; for(j=i+1;ja[max])max=j; if(min!=i) { t=a[min];a[min]=a[i];a[i]=t; } if(max!=n-i-1) if(max==i) { t=a[min];a[min]=a[n-i-1];a[n-i-1]=t; } else { t=a[max];a[max]=a[n-i-1];a[n-i-1]=t; } }} 答案:答案:(1) n/2 或或 n-i 或或 n-i-1 (2)min=max=i136void main( ){ int a[N]={8,4,9,3,2,1,5},i; sort(a,N); printf("sorted:\n"); for(i=0;i
include#includevoid fun(char str[][20],int n){ int i,j,k; char s[20]; for(i=0;i
(删除数组中所有偶数)(删除数组中所有偶数)#include int fun(int *x,int n){ int i,j; for(i=j=0;i#define N 10int merge(int a[],int b[],int c[],int m[][N+1]){ int i=0,j,k; while((k=m[0][i])!=2) { j=m[1][i]; if(k==0) c[i]=a[j]; else c[i]=b[j]; i++; } return i;}140main( ){ int a[N]={1,3,5},b[N]={2,4,6},c[2*N],i,n; int m[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,则,则输出是输出是 (1) ;若在键盘上输入;若在键盘上输入i,则输出是,则输出是 (2) 。
#include #include int strch( char *s,char ch){ int i; for(i=strlen(s);i>=0;i--) if(s[i-1]==ch) return i; if(i<0)return 0;}main(){ char ch,s1[]="as123d2nfghjkm"; int k; printf("input ch:"); ch=getchar(); k=strch(s1,ch); if(k!=0) printf("k=%d \n",k); else printf("not found\n");} 答案:答案: (1) k=7 (2) not found142•约约瑟瑟夫夫问问题题::n个个人人报报数数,,报报到到3的的人人出出列列,,剩剩下下人人继继续续报报数数,,直到所有人出列为止直到所有人出列为止 ,显示依次出列人编号,显示依次出列人编号 [阅阅读读程程序序] 以以下下程程序序运运行行时时若若输输入入8,,则则输输出出结结果果中中第第一一行行是是 ((1)) ,第二行是,第二行是 (2) ,第三行是,第三行是 ((3)) 。
#include void main( ){ int k,i,m,n,num[20]; scanf("%d",&n); for(i=0;i
#include #define N 6void main(){ int i, j, a[N+1][N+1]; for(i=1;i<=N;i++) { a[i][i]=1;a[i][1]=1; } for (i=3; i<=N; i++) for(j=2;j
mainmain函函数数中中p1p1和和p2p2数数组组分分别别存存放放被被加加数数字字符符串串和和加加数数字字符符串串,,p3p3数数组组存存放放运运算算结结果果字字符符串串若若p1p1中中的的字字符符串串为为"1000000001""1000000001"、、p2p2中中的的字字符符串串为为"9000000009""9000000009",,调调用用addadd函函数数后后p3p3得得到到的的是是以以字字符符串串表表示示的的这这两两个个整整数数相相加加的的结结果果"10000000010""10000000010"试试完善程序以达到要求的功能完善程序以达到要求的功能 145 #include "stdio.h"#include "string.h"void add(char a[],char b[],char c[], (1) ) { int i,k; c[n]='\0'; k=0; for(i=n-1;i>=0;i--) { c[i]=(a[i]-'0')+(b[i]-'0')+k; k= (2) ; c[i]=c[i]%10+'0'; } if(k) { for(i=n+1;i>0;i--) c[i]= (3) ; c[i]=k+'0'; }} 答案答案: (1) int n (2) c[i]/10 (3) c[i-1] 146 void main(){ char p1[80]="1000000001",p2[80]="9000000009",p3[80]; int i,x=strlen(p1),y=strlen(p2); if(x=0;i--) { p1[i+y-x]=p1[i]; p1[i]='0'; } (4) ; } if(x>y) for(i=y;i>=0;i--) { p2[i+x-y]=p2[i]; p2[i]='0'; } add(p1,p2,p3,x); puts(p3);} 答案答案: (4) x=y147•字符串处理:加密字符串处理:加密[完完善善程程序序] 以以下下程程序序中中函函数数replace的的功功能能是是::将将字字符符串串s中中所所有有属属于于字字符符串串s1中中的的字字符符都都用用s2中中的的对对应应位位置置的的字字符符替替换换。
假假如如s为为“ABCBA”,,s1为为“AC”,,s2为为“ac”,,则则调调用用replace函函数数后后,,字字符符串串s的的内内容容将将变变换换为为“aBcBa”试试完完善程序以达到要求的功能善程序以达到要求的功能 148 #include #define MAX 20void replace(char *s, char *s1, char *s2){ char *p; for(; *s; s++) { p=s1; while(*p&& ((1)) ) p++; if(*p) *s= ((2)) ; }}void main( ){ char s[MAX]="ABCBA",s1[MAX]="AC", s2[MAX]= "ac"; ((3)) ; printf("The string of s is:"); printf("%s\n", s);} 答案答案: (1) *p!=*s (2) *(s2+p-s1) (3) replace(s, s1, s2) 149•字符串处理:数据统计字符串处理:数据统计[完善程序完善程序] 统计一个字符串中数字字符统计一个字符串中数字字符“0”到到“9”各自出现的次各自出现的次数,统计结果保存在数组数,统计结果保存在数组count中。
例如,如果字符串为中例如,如果字符串为“1enterschar4543123564879ffgh”,则统计结果为,则统计结果为: 1:2 2:1 3:2 4:3 5:2 6:1 7:1 8:1 9:1include void fun(char *t,int count[]){ char *p=t; while( (1) ) { if(*p>='0'&&*p<='9') count[ (2) ]++; p++; }}void main(){ char s[80]="1enterschar4543123564879ffgh"; int count[10]={0},i; fun(s,count); for(i=0;i<10;i++) if(count[i]) printf("%d:%d ",i,count[i]);} 答案:答案: (1) *p 或或 *p!=‘\0’ 或或 p[0]!=‘\0‘ (2) *p-'0'或或 p[0]-'0'150•数据统计数据统计[完善程序完善程序] 程序功能:选票统计。
二维数组程序功能:选票统计二维数组s中保存了投票后中保存了投票后10张有效选票上所填写的候选人姓名,结构数组张有效选票上所填写的候选人姓名,结构数组stat中保存中保存统计结果程序运行后的输出结果是统计结果程序运行后的输出结果是“liu:2 wang:5 zhao:3”include#includetypedef struct{ char name[20]; /* 候选人姓名候选人姓名 */int count; /* 候选人得票数候选人得票数 */}COUNT;151int count(char x[][20],int n, (1) ) { int i,j,k=0; for(i=0; (2) ;i++) { for(j=0;j=k) { (4) ; st[k].count++; k++; } } return k;}main(){ char s[10][20]={"liu","wang","zhao","zhao","wang","liu","wang","zhao","wang","wang"}; COUNT stat[5]={0}; int i,n; n=count(s,10,stat); for(i=0;i
若字符串若s1字符串中没有出现字符串中没有出现s2字符字符串,则不做替换并使函数返回串,则不做替换并使函数返回0,否则函数返回,否则函数返回1试完善程序以达到要求的功能程序以达到要求的功能include #include int find_replace(char s1[],char s2[],char s3[]){ int i,j,k,t=0; char temp[80]; if(s1[0]=='\0'||s2[0]=='\0') return t; for(i=0;s1[i]!='\0';i++) { k=0; j=i; while(s1[j]==s2[k]&&s2[k]!='\0') { j++; (1) ; }答案:答案: (1) k++ 153 if(s2[k]=='\0') { strcpy(temp,&s1[j]); (2) ; i=i+strlen(s3); (3) ; t=1; } } return t;}void main(){ char line[80]="This is a test program and a test data."; char substr1[10]="test",substr2[10]="actual"; int k; k=find_replace(line,substr1,substr2); if( (4) ) puts(line); else printf("not found\n");} 答案:答案: (2) strcpy(&s1[i],s3) 或或strcpy(s1+i,s3) (3) strcpy(&s1[i],temp) 或或strcpy(s1+i,temp) (4) k 或或 k==1 或或 k!=0 或或 k>0154•字符串处理:数字字符串转换为整数字符串处理:数字字符串转换为整数[完善程序完善程序] 以下程序中函数以下程序中函数long fun(char *str)的功能是:自的功能是:自左至右取出非空字符串左至右取出非空字符串str中的所有数字字符,将这些数字中的所有数字字符,将这些数字字符组成一个不超过字符组成一个不超过8位的十进制整数并输出。
例如,字符位的十进制整数并输出例如,字符串串str为为“efg32gh76.jbejing08t5y4u2”,程序输出:,程序输出:32760854 #include long fun(char *str){ int i=0; long k=0; char *p=str; while(*p!='\0'&& (1) ) { if(*p>='0'&&*p<='9') { k= (2) +*p-'0'; ++i; } (3) ; } return k;}void main( ){ char x[]="efg32gh76.jbejing08t5y4u2"; printf("%ld\n", fun(x));} 答案:答案:(1) i<8 (2) k*10 (3) p++155•补充:回文数判断补充:回文数判断[完善程序完善程序] 以下程序输出以下程序输出6位整数中的所有回文数。
若一个整位整数中的所有回文数若一个整数等于它自身的反序数,则称该整数为回文数例如,数等于它自身的反序数,则称该整数为回文数例如,123321是回文数是回文数include int main(){ long x,y=0,i; for(i=100000;i<=999999;i++){ x=i; (1) ; while(x>0) { y=y*10+x%10; (2) ; } if(i==y)printf("\t %ld",i); } return 0;} 答案答案: (1) y=0 (2) x=x/10 。